Skip to content

Commit

Permalink
rework UI in Jetpack Compose
Browse files Browse the repository at this point in the history
  • Loading branch information
TinfoilSubmarine committed Apr 15, 2024
1 parent 75dafea commit 8a63ac6
Show file tree
Hide file tree
Showing 54 changed files with 1,385 additions and 1,740 deletions.
34 changes: 24 additions & 10 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'com.google.devtools.ksp'
}

android {
Expand All @@ -16,17 +16,16 @@ android {

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
}
ksp {
arg("room.schemaLocation", "$projectDir/schemas")
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
}
compileOptions {
Expand All @@ -36,34 +35,49 @@ android {
kotlinOptions {
jvmTarget = '1.8'
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.2"
}

buildFeatures {
viewBinding true
compose true
}
lint {
disable 'MissingTranslation'
}
namespace 'me.lucky.silence'
}

dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.navigation:navigation-compose:2.7.7'
testImplementation 'junit:junit:4.13.2'

androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

// https://issuetracker.google.com/issues/238425626
implementation('androidx.preference:preference-ktx:1.2.1') {
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel'
exclude group: 'androidx.lifecycle', module:'lifecycle-viewmodel-ktx'
}
implementation 'androidx.drawerlayout:drawerlayout:1.2.0'
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.41'
implementation 'com.googlecode.libphonenumber:libphonenumber:8.13.32'
implementation 'info.guardianproject.panic:panic:1.0'

def room_version = "2.6.1"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
ksp "androidx.room:room-compiler:$room_version"

// Compose
def composeBom = platform('androidx.compose:compose-bom:2024.02.02')
implementation(composeBom)
androidTestImplementation(composeBom)
implementation "androidx.compose.runtime:runtime"
implementation "androidx.compose.ui:ui"
implementation "androidx.compose.foundation:foundation"
implementation "androidx.compose.foundation:foundation-layout"
implementation "androidx.compose.material3:material3"
implementation "androidx.compose.ui:ui-tooling"
}
4 changes: 1 addition & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="me.lucky.silence">
xmlns:tools="http://schemas.android.com/tools">

<!-- if you are reading this >> you are awesome! -->
<uses-permission android:name="android.permission.READ_CALL_LOG" />
Expand All @@ -15,7 +14,6 @@
<application
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:name=".Application"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Silence">
Expand Down
11 changes: 0 additions & 11 deletions app/src/main/java/me/lucky/silence/Application.kt

This file was deleted.

84 changes: 21 additions & 63 deletions app/src/main/java/me/lucky/silence/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,75 +1,33 @@
package me.lucky.silence

import android.os.Build
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import me.lucky.silence.databinding.ActivityMainBinding
import me.lucky.silence.fragment.ContactedFragment
import me.lucky.silence.fragment.ExtraFragment
import me.lucky.silence.fragment.GroupsFragment
import me.lucky.silence.fragment.MainFragment
import me.lucky.silence.fragment.MessagesFragment
import me.lucky.silence.fragment.RegexFragment
import me.lucky.silence.fragment.RepeatedFragment
import me.lucky.silence.fragment.SettingsFragment
import me.lucky.silence.fragment.SimFragment
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.navigation.compose.rememberNavController
import me.lucky.silence.ui.App

open class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
init()
setup()
}

private fun init() {
NotificationManager(this).createNotificationChannels()
replaceFragment(MainFragment())
}

private fun setup() = binding.apply {
appBar.setNavigationOnClickListener {
drawer.open()
}
appBar.setOnMenuItemClickListener {
when (it.itemId) {
R.id.top_settings -> {
replaceFragment(when (supportFragmentManager.fragments.last()) {
is SettingsFragment ->
getFragment(navigation.checkedItem?.itemId ?: R.id.nav_main)
else -> SettingsFragment()
})
true
}
else -> false
setContent {
val isAndroid12OrLater = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
val colorScheme = when {
isAndroid12OrLater && isSystemInDarkTheme() -> dynamicDarkColorScheme(this)
isAndroid12OrLater -> dynamicLightColorScheme(this)
isSystemInDarkTheme() -> darkColorScheme()
else -> lightColorScheme()
}
MaterialTheme(colorScheme = colorScheme) {
App(ctx = this, navController = rememberNavController())
}
}
navigation.setNavigationItemSelectedListener {
replaceFragment(getFragment(it.itemId))
it.isChecked = true
drawer.close()
true
}
}

private fun replaceFragment(f: Fragment) =
supportFragmentManager
.beginTransaction()
.replace(binding.fragment.id, f)
.commit()

private fun getFragment(id: Int) = when (id) {
R.id.nav_main -> MainFragment()
R.id.nav_contacted -> ContactedFragment()
R.id.nav_groups -> GroupsFragment()
R.id.nav_repeated -> RepeatedFragment()
R.id.nav_regex -> RegexFragment()
R.id.nav_messages -> MessagesFragment()
R.id.nav_sim -> SimFragment()
R.id.nav_extra -> ExtraFragment()
else -> MainFragment()
}
}
}
60 changes: 31 additions & 29 deletions app/src/main/java/me/lucky/silence/Preferences.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,38 +7,40 @@ import androidx.preference.PreferenceManager
class Preferences(ctx: Context) {
companion object {
const val ENABLED = "enabled"
private const val CONTACTED_CHECKED = "contacted_checked"
private const val REPEATED_CHECKED = "repeated_checked"
private const val MESSAGES_CHECKED = "messages_checked"
private const val GROUPS_CHECKED = "groups_checked"
private const val BLOCK_ENABLED = "block_enabled"

private const val CONTACTED = "contacted"
private const val GROUPS = "groups"
private const val REPEATED_COUNT = "repeated_count"
private const val REPEATED_MINUTES = "repeated_minutes"
private const val REPEATED_BURST_TIMEOUT = "repeated_burst_timeout"
private const val MESSAGES = "messages"
private const val MESSAGES_TEXT_TTL = "messages_text_ttl"
private const val REGEX_PATTERN = "regex_pattern"

private const val RESPONSE_OPTIONS = "call_screening_response_options"
private const val UNKNOWN_NUMBERS_CHECKED = "unknown_numbers_checked"
private const val SHORT_NUMBERS_CHECKED = "short_numbers_checked"
private const val CONTACTS_CHECKED = "contacts_checked"
private const val STIR_CHECKED = "stir_checked"
private const val SIM = "sim"
private const val BLOCK_PLUS_NUMBERS = "block_plus_numbers"

private const val DEFAULT_REPEATED_COUNT = 3
private const val DEFAULT_REPEATED_MINUTES = 5
private const val DEFAULT_MESSAGES_TEXT_TTL = 2 * 24 * 60
const val CONTACTED_CHECKED = "contacted_checked"
const val REPEATED_CHECKED = "repeated_checked"
const val MESSAGES_CHECKED = "messages_checked"
const val GROUPS_CHECKED = "groups_checked"
const val BLOCK_ENABLED = "block_enabled"

const val CONTACTED = "contacted"
const val GROUPS = "groups"
const val REPEATED_COUNT = "repeated_count"
const val REPEATED_MINUTES = "repeated_minutes"
const val REPEATED_BURST_TIMEOUT = "repeated_burst_timeout"
const val MESSAGES = "messages"
const val MESSAGES_TEXT_TTL = "messages_text_ttl"

const val RESPONSE_OPTIONS = "call_screening_response_options"
const val UNKNOWN_NUMBERS_CHECKED = "unknown_numbers_checked"
const val SHORT_NUMBERS_CHECKED = "short_numbers_checked"
const val CONTACTS_CHECKED = "contacts_checked"
const val STIR_CHECKED = "stir_checked"
const val SIM = "sim"
const val BLOCK_PLUS_NUMBERS = "block_plus_numbers"

const val DEFAULT_REPEATED_COUNT = 3
const val DEFAULT_REPEATED_MINUTES = 5
const val DEFAULT_MESSAGES_TEXT_TTL = 2 * 24 * 60

// migration
private const val SERVICE_ENABLED = "service_enabled"
private const val GENERAL_UNKNOWN_NUMBERS_CHECKED = "general_unknown_numbers_checked"
const val SERVICE_ENABLED = "service_enabled"
const val GENERAL_UNKNOWN_NUMBERS_CHECKED = "general_unknown_numbers_checked"

private const val REGEX_PATTERN = "regex_pattern"
}


private val prefs = PreferenceManager.getDefaultSharedPreferences(ctx)

var isEnabled: Boolean
Expand Down Expand Up @@ -162,4 +164,4 @@ enum class ResponseOption(val value: Int) {
enum class Sim(val value: Int) {
SIM_1(1),
SIM_2(1 shl 1),
}
}
21 changes: 20 additions & 1 deletion app/src/main/java/me/lucky/silence/Utils.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,37 @@
package me.lucky.silence

import android.app.ActivityManager
import android.app.role.RoleManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import android.provider.Settings
import android.telephony.TelephonyManager

import me.lucky.silence.text.NotificationListenerService

class Utils {
companion object {
fun setMessagesTextEnabled(ctx: Context, value: Boolean) =
private fun isNotificationListenerRunning(ctx: Context): Boolean {
val manager = ctx.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
@Suppress("deprecation")
val services = manager.getRunningServices(Integer.MAX_VALUE)
for (service in services) {
if (NotificationListenerService::class.java.name == service.service.className) {
return true
}
}
return false
}

fun setMessagesTextEnabled(ctx: Context, value: Boolean) {
setComponentEnabled(ctx, NotificationListenerService::class.java, value)
if (value && !isNotificationListenerRunning(ctx)) {
ctx.startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS))
}
}

fun updateMessagesTextEnabled(ctx: Context) {
val prefs = Preferences(ctx)
Expand Down
53 changes: 0 additions & 53 deletions app/src/main/java/me/lucky/silence/fragment/ContactedFragment.kt

This file was deleted.

Loading

0 comments on commit 8a63ac6

Please sign in to comment.