diff --git a/app/build.gradle.kts b/app/build.gradle.kts index af8639f2e..8807371c9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,20 +7,20 @@ plugins { - kotlin { - compilerOptions { - jvmTarget.set(JvmTarget.JVM_21) - freeCompilerArgs.add("-Xannotation-default-target=param-property") - optIn.addAll( - "androidx.compose.material3.ExperimentalMaterial3Api", - "androidx.compose.material3.ExperimentalMaterial3ExpressiveApi", - "androidx.compose.foundation.ExperimentalFoundationApi", - "androidx.compose.ui.text.ExperimentalTextApi", - "androidx.compose.foundation.ExperimentalFoundationApi", - "androidx.compose.foundation.layout.ExperimentalLayoutApi" - ) - } - } +kotlin { + compilerOptions { + jvmTarget.set(JvmTarget.JVM_21) + freeCompilerArgs.add("-Xannotation-default-target=param-property") + optIn.addAll( + "androidx.compose.material3.ExperimentalMaterial3Api", + "androidx.compose.material3.ExperimentalMaterial3ExpressiveApi", + "androidx.compose.foundation.ExperimentalFoundationApi", + "androidx.compose.ui.text.ExperimentalTextApi", + "androidx.compose.foundation.ExperimentalFoundationApi", + "androidx.compose.foundation.layout.ExperimentalLayoutApi" + ) + } +} android { namespace = "com.sameerasw.essentials" @@ -28,10 +28,58 @@ android { androidResources { localeFilters += listOf( - "en", "ach", "af", "ar", "bn", "bn-rBD", "ca", "cs", "da", "de", "el", "es", "fi", "fil", "fil-rPH", - "fr", "he", "hi", "hi-rIN", "hu", "id", "in", "in-rID", "it", "iw", "ja", "ko", "ml", "ml-rIN", - "ne", "ne-rNP", "nl", "no", "pl", "pt", "pt-rBR", "pt-rPT", "ro", "ru", "si", "sk", "sk-rSK", - "sr", "sv", "ta", "ta-rIN", "tr", "uk", "vi", "zh", "zh-rCN", "zh-rTW" + "en", + "ach", + "af", + "ar", + "bn", + "bn-rBD", + "ca", + "cs", + "da", + "de", + "el", + "es", + "fi", + "fil", + "fil-rPH", + "fr", + "he", + "hi", + "hi-rIN", + "hu", + "id", + "in", + "in-rID", + "it", + "iw", + "ja", + "ko", + "ml", + "ml-rIN", + "ne", + "ne-rNP", + "nl", + "no", + "pl", + "pt", + "pt-rBR", + "pt-rPT", + "ro", + "ru", + "si", + "sk", + "sk-rSK", + "sr", + "sv", + "ta", + "ta-rIN", + "tr", + "uk", + "vi", + "zh", + "zh-rCN", + "zh-rTW" ) } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 550caced9..2dae4c9a9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1185,6 +1185,7 @@ + diff --git a/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt index 70d0e5ec3..52a5d9425 100644 --- a/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt @@ -71,10 +71,10 @@ import com.sameerasw.essentials.ui.composables.configs.LocationReachedSettingsUI import com.sameerasw.essentials.ui.composables.configs.LockScreenClockSettingsUI import com.sameerasw.essentials.ui.composables.configs.MapsPowerSavingSettingsUI import com.sameerasw.essentials.ui.composables.configs.NotificationLightingSettingsUI -import com.sameerasw.essentials.ui.composables.configs.PowerAndBatterySettingsUI +import com.sameerasw.essentials.ui.composables.configs.NotificationSnoozingSettingsUI import com.sameerasw.essentials.ui.composables.configs.OtherCustomizationsSettingsUI - import com.sameerasw.essentials.ui.composables.configs.PocketModeSettingsUI +import com.sameerasw.essentials.ui.composables.configs.PowerAndBatterySettingsUI import com.sameerasw.essentials.ui.composables.configs.QuickSettingsTilesSettingsUI import com.sameerasw.essentials.ui.composables.configs.RefreshRateSettingsUI import com.sameerasw.essentials.ui.composables.configs.RemoteLockSettingsUI @@ -82,7 +82,6 @@ import com.sameerasw.essentials.ui.composables.configs.ScreenLockedSecuritySetti import com.sameerasw.essentials.ui.composables.configs.ScreenOffWidgetSettingsUI import com.sameerasw.essentials.ui.composables.configs.ShutUpSettingsUI import com.sameerasw.essentials.ui.composables.configs.SnoozeNotificationsSettingsUI -import com.sameerasw.essentials.ui.composables.configs.NotificationSnoozingSettingsUI import com.sameerasw.essentials.ui.composables.configs.SoundModeTileSettingsUI import com.sameerasw.essentials.ui.composables.configs.StatusBarIconSettingsUI import com.sameerasw.essentials.ui.composables.configs.TextAnimationsSettingsUI @@ -230,7 +229,12 @@ class FeatureSettingsActivity : AppCompatActivity() { mutableStateOf(prefs.getBoolean("watch_sync_sound_mode_enabled", false)) } var watchSyncLocationReachedEnabled by remember { - mutableStateOf(prefs.getBoolean("watch_sync_location_reached_enabled", true)) + mutableStateOf( + prefs.getBoolean( + "watch_sync_location_reached_enabled", + true + ) + ) } androidx.compose.runtime.DisposableEffect(prefs) { val listener = @@ -553,6 +557,7 @@ class FeatureSettingsActivity : AppCompatActivity() { "Screen refresh rate" -> !com.sameerasw.essentials.utils.ShellUtils.hasPermission( context ) + "Shut-Up!" -> !isWriteSecureSettingsEnabled || !viewModel.isUsageStatsPermissionGranted.value "Power and Battery" -> !isWriteSecureSettingsEnabled "Disable safe volume warning" -> !isWriteSecureSettingsEnabled @@ -636,12 +641,12 @@ class FeatureSettingsActivity : AppCompatActivity() { } "Statusbar icons" -> { - StatusBarIconSettingsUI( - viewModel = statusBarViewModel, - mainViewModel = viewModel, - modifier = Modifier.padding(top = 16.dp), - highlightSetting = highlightSetting - ) + StatusBarIconSettingsUI( + viewModel = statusBarViewModel, + mainViewModel = viewModel, + modifier = Modifier.padding(top = 16.dp), + highlightSetting = highlightSetting + ) } "Caffeinate" -> { diff --git a/app/src/main/java/com/sameerasw/essentials/MainActivity.kt b/app/src/main/java/com/sameerasw/essentials/MainActivity.kt index 5e6d26450..6cfe5c70b 100644 --- a/app/src/main/java/com/sameerasw/essentials/MainActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/MainActivity.kt @@ -2,6 +2,8 @@ package com.sameerasw.essentials import android.animation.ObjectAnimator import android.content.Intent +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter import android.os.Build import android.os.Bundle import android.util.Log @@ -25,25 +27,12 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.statusBars -import androidx.compose.foundation.pager.HorizontalPager -import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.ui.draw.drawWithContent -import androidx.compose.ui.graphics.BlendMode -import android.graphics.PorterDuff -import android.graphics.PorterDuffColorFilter -import androidx.compose.ui.graphics.toArgb -import com.airbnb.lottie.LottieProperty -import com.airbnb.lottie.compose.LottieAnimation -import com.airbnb.lottie.compose.LottieCompositionSpec -import com.airbnb.lottie.compose.LottieConstants -import com.airbnb.lottie.compose.animateLottieCompositionAsState -import com.airbnb.lottie.compose.rememberLottieComposition -import com.airbnb.lottie.compose.rememberLottieDynamicProperties -import com.airbnb.lottie.compose.rememberLottieDynamicProperty +import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.material3.Badge import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon @@ -60,6 +49,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.scale +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource @@ -69,6 +59,14 @@ import androidx.compose.ui.zIndex import androidx.core.animation.doOnEnd import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.WindowCompat +import com.airbnb.lottie.LottieProperty +import com.airbnb.lottie.compose.LottieAnimation +import com.airbnb.lottie.compose.LottieCompositionSpec +import com.airbnb.lottie.compose.LottieConstants +import com.airbnb.lottie.compose.animateLottieCompositionAsState +import com.airbnb.lottie.compose.rememberLottieComposition +import com.airbnb.lottie.compose.rememberLottieDynamicProperties +import com.airbnb.lottie.compose.rememberLottieDynamicProperty import com.sameerasw.essentials.data.repository.SettingsRepository import com.sameerasw.essentials.domain.DIYTabs import com.sameerasw.essentials.domain.registry.initPermissionRegistry @@ -624,22 +622,26 @@ class MainActivity : AppCompatActivity() { containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError ) { - val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(R.raw.update_motion)) + val composition by rememberLottieComposition( + LottieCompositionSpec.RawRes(R.raw.update_motion) + ) val progress by animateLottieCompositionAsState( composition = composition, iterations = LottieConstants.IterateForever ) - val onErrorColor = MaterialTheme.colorScheme.onError - val dynamicProperties = rememberLottieDynamicProperties( - rememberLottieDynamicProperty( - property = LottieProperty.COLOR_FILTER, - value = PorterDuffColorFilter( - onErrorColor.toArgb(), - PorterDuff.Mode.SRC_ATOP - ), - keyPath = arrayOf("**") + val onErrorColor = + MaterialTheme.colorScheme.onError + val dynamicProperties = + rememberLottieDynamicProperties( + rememberLottieDynamicProperty( + property = LottieProperty.COLOR_FILTER, + value = PorterDuffColorFilter( + onErrorColor.toArgb(), + PorterDuff.Mode.SRC_ATOP + ), + keyPath = arrayOf("**") + ) ) - ) LottieAnimation( composition = composition, diff --git a/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt index 0c258fcce..5b7f68a73 100644 --- a/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/SettingsActivity.kt @@ -1,5 +1,6 @@ package com.sameerasw.essentials + import android.Manifest import android.content.ClipData import android.content.ClipboardManager @@ -39,12 +40,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.width -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material3.IconButton -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults @@ -53,6 +50,7 @@ import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton @@ -74,12 +72,17 @@ import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.PasswordVisualTransformation +import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import androidx.core.app.ActivityCompat import com.sameerasw.essentials.domain.DIYTabs import com.sameerasw.essentials.domain.registry.FeatureRegistry import com.sameerasw.essentials.domain.registry.PermissionRegistry +import com.sameerasw.essentials.translation.TranslationManager +import com.sameerasw.essentials.translation.ui.TranslationSessionSheet import com.sameerasw.essentials.ui.components.EssentialsFloatingToolbar import com.sameerasw.essentials.ui.components.MadebySameeraswCard import com.sameerasw.essentials.ui.components.cards.FeatureCard @@ -87,21 +90,14 @@ import com.sameerasw.essentials.ui.components.cards.IconToggleItem import com.sameerasw.essentials.ui.components.cards.PermissionCard import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer import com.sameerasw.essentials.ui.components.dialogs.AboutSection -import com.sameerasw.essentials.translation.TranslationManager -import com.sameerasw.essentials.translation.ui.TranslationBottomSheet -import com.sameerasw.essentials.translation.ui.TranslationSessionSheet import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem -import com.sameerasw.essentials.ui.components.sheets.GitHubAuthSheet - - -import com.sameerasw.essentials.viewmodels.GitHubAuthViewModel import com.sameerasw.essentials.ui.components.pickers.CrashReportingPicker - import com.sameerasw.essentials.ui.components.pickers.DefaultTabPicker import com.sameerasw.essentials.ui.components.pickers.LanguagePicker +import com.sameerasw.essentials.ui.components.sheets.GitHubAuthSheet +import com.sameerasw.essentials.ui.components.sheets.ImportConfigConfirmationSheet import com.sameerasw.essentials.ui.components.sheets.InstructionsBottomSheet import com.sameerasw.essentials.ui.components.sheets.UnsupportedFeaturesConfirmationSheet -import com.sameerasw.essentials.ui.components.sheets.ImportConfigConfirmationSheet import com.sameerasw.essentials.ui.components.sheets.UpdateBottomSheet import com.sameerasw.essentials.ui.modifiers.BlurDirection import com.sameerasw.essentials.ui.modifiers.progressiveBlur @@ -110,6 +106,7 @@ import com.sameerasw.essentials.ui.theme.Shapes import com.sameerasw.essentials.utils.DeviceUtils import com.sameerasw.essentials.utils.HapticUtil import com.sameerasw.essentials.utils.PermissionUtils +import com.sameerasw.essentials.viewmodels.GitHubAuthViewModel import com.sameerasw.essentials.viewmodels.MainViewModel import rikka.shizuku.Shizuku import java.text.SimpleDateFormat @@ -281,7 +278,8 @@ fun SettingsContent( var showGitHubAuthSheet by remember { mutableStateOf(false) } var showTranslationWarningDialog by remember { mutableStateOf(false) } val gitHubAuthViewModel: GitHubAuthViewModel = androidx.lifecycle.viewmodel.compose.viewModel() - val settingsRepo = remember { com.sameerasw.essentials.data.repository.SettingsRepository(context) } + val settingsRepo = + remember { com.sameerasw.essentials.data.repository.SettingsRepository(context) } var currentUser by remember { mutableStateOf(settingsRepo.getGitHubUser()) } @@ -289,8 +287,11 @@ fun SettingsContent( val sessionEditsCount = TranslationManager.session.edits.size - - var openTranslationPRs by remember { mutableStateOf>(emptyList()) } + var openTranslationPRs by remember { + mutableStateOf>( + emptyList() + ) + } val gitHubRepo = remember { com.sameerasw.essentials.data.repository.GitHubRepository() } androidx.compose.runtime.LaunchedEffect(isTranslationModeActive, currentUser) { @@ -310,8 +311,6 @@ fun SettingsContent( } - - val onImportConfig: (Boolean) -> Unit = { keepPrefs -> selectedImportUri?.let { uri -> try { @@ -506,11 +505,15 @@ fun SettingsContent( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp) ) { - val buttonText = if (isUpdateAvailable && !updateInfo?.versionName.isNullOrEmpty()) { - stringResource(R.string.action_update_to_version, updateInfo?.versionName ?: "") - } else { - stringResource(R.string.action_check_for_updates) - } + val buttonText = + if (isUpdateAvailable && !updateInfo?.versionName.isNullOrEmpty()) { + stringResource( + R.string.action_update_to_version, + updateInfo?.versionName ?: "" + ) + } else { + stringResource(R.string.action_check_for_updates) + } val buttonIconRes = R.drawable.rounded_mobile_arrow_down_24 @@ -776,7 +779,9 @@ fun SettingsContent( IconToggleItem( iconRes = R.drawable.rounded_translate_24, title = stringResource(R.string.settings_translate_mode), - description = if (isEnglishApp) "App language is English. Change app language to translate strings" else stringResource(R.string.settings_translate_mode_desc), + description = if (isEnglishApp) "App language is English. Change app language to translate strings" else stringResource( + R.string.settings_translate_mode_desc + ), isChecked = isTranslationModeActive && !isEnglishApp, enabled = !isEnglishApp, onCheckedChange = { enabled -> @@ -799,7 +804,10 @@ fun SettingsContent( if (sessionEditsCount > 0) { FeatureCard( title = R.string.settings_translated_texts, - description = stringResource(R.string.settings_translated_texts_desc, sessionEditsCount), + description = stringResource( + R.string.settings_translated_texts_desc, + sessionEditsCount + ), isEnabled = true, onToggle = {}, onClick = { @@ -819,7 +827,8 @@ fun SettingsContent( } catch (e: Exception) { "" } - val subtitleText = if (dateFormatted.isNotBlank()) "PR #${pr.number} • Updated $dateFormatted" else "PR #${pr.number}" + val subtitleText = + if (dateFormatted.isNotBlank()) "PR #${pr.number} • Updated $dateFormatted" else "PR #${pr.number}" FeatureCard( title = "View existing PR", @@ -828,7 +837,10 @@ fun SettingsContent( onToggle = {}, onClick = { HapticUtil.performUIHaptic(view) - val intent = android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse(pr.htmlUrl)) + val intent = android.content.Intent( + android.content.Intent.ACTION_VIEW, + android.net.Uri.parse(pr.htmlUrl) + ) context.startActivity(intent) }, diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/GitHubRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/GitHubRepository.kt index 2b9335950..2afd7e1ad 100644 --- a/app/src/main/java/com/sameerasw/essentials/data/repository/GitHubRepository.kt +++ b/app/src/main/java/com/sameerasw/essentials/data/repository/GitHubRepository.kt @@ -162,7 +162,10 @@ class GitHubRepository { } else { connection.errorStream?.bufferedReader()?.readText() ?: "" } - Log.d("GitHubRepository", "triggerWorkflowDispatch responseCode: $responseCode, body: $responseText") + Log.d( + "GitHubRepository", + "triggerWorkflowDispatch responseCode: $responseCode, body: $responseText" + ) responseCode == 204 } catch (e: Exception) { @@ -200,7 +203,8 @@ class GitHubRepository { conn1.outputStream.use { os -> os.write(payload1.toByteArray(Charsets.UTF_8)) } val code1 = conn1.responseCode - val text1 = if (code1 in 200..299) conn1.inputStream.bufferedReader().readText() else conn1.errorStream?.bufferedReader()?.readText() ?: "" + val text1 = if (code1 in 200..299) conn1.inputStream.bufferedReader() + .readText() else conn1.errorStream?.bufferedReader()?.readText() ?: "" Log.d("GitHubRepository", "getDiscussionId responseCode: $code1, body: $text1") val jsonObject1 = gson.fromJson(text1, Map::class.java) @@ -235,7 +239,8 @@ class GitHubRepository { conn2.outputStream.use { os -> os.write(payload2.toByteArray(Charsets.UTF_8)) } val code2 = conn2.responseCode - val text2 = if (code2 in 200..299) conn2.inputStream.bufferedReader().readText() else conn2.errorStream?.bufferedReader()?.readText() ?: "" + val text2 = if (code2 in 200..299) conn2.inputStream.bufferedReader() + .readText() else conn2.errorStream?.bufferedReader()?.readText() ?: "" Log.d("GitHubRepository", "addDiscussionComment responseCode: $code2, body: $text2") val jsonObject2 = gson.fromJson(text2, Map::class.java) @@ -256,27 +261,31 @@ class GitHubRepository { repo: String, author: String, token: String? = null - ): List = withContext(Dispatchers.IO) { - try { - val url = URL("https://api.github.com/repos/$owner/$repo/pulls?state=open") - val connection = url.openConnection() as HttpURLConnection - if (token != null) { - connection.setRequestProperty("Authorization", "Bearer $token") - } - connection.setRequestProperty("Accept", "application/vnd.github+json") - if (connection.responseCode == 200) { - val data = connection.inputStream.bufferedReader().readText() - val allPrs = gson.fromJson(data, Array::class.java).toList() - val targetRef = "translations-$author" - allPrs.filter { pr -> - pr.user?.login.equals(author, ignoreCase = true) || - pr.head?.ref?.equals(targetRef, ignoreCase = true) == true + ): List = + withContext(Dispatchers.IO) { + try { + val url = URL("https://api.github.com/repos/$owner/$repo/pulls?state=open") + val connection = url.openConnection() as HttpURLConnection + if (token != null) { + connection.setRequestProperty("Authorization", "Bearer $token") } - } else emptyList() - } catch (e: Exception) { - e.printStackTrace() - emptyList() + connection.setRequestProperty("Accept", "application/vnd.github+json") + if (connection.responseCode == 200) { + val data = connection.inputStream.bufferedReader().readText() + val allPrs = gson.fromJson( + data, + Array::class.java + ).toList() + val targetRef = "translations-$author" + allPrs.filter { pr -> + pr.user?.login.equals(author, ignoreCase = true) || + pr.head?.ref?.equals(targetRef, ignoreCase = true) == true + } + } else emptyList() + } catch (e: Exception) { + e.printStackTrace() + emptyList() + } } - } } diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt index 8fd514c2c..3f239f206 100644 --- a/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt +++ b/app/src/main/java/com/sameerasw/essentials/data/repository/SettingsRepository.kt @@ -125,7 +125,8 @@ class SettingsRepository(private val context: Context) { const val KEY_FLASHLIGHT_PULSE_MAX_INTENSITY = "flashlight_pulse_max_intensity" const val KEY_FLASHLIGHT_PULSE_DISABLE_ON_DND = "flashlight_pulse_disable_on_dnd" const val KEY_FLASHLIGHT_POCKET_TURN_OFF_ENABLED = "flashlight_pocket_turn_off_enabled" - const val KEY_FLASHLIGHT_OVERHEAT_PREVENTION_ENABLED = "flashlight_overheat_prevention_enabled" + const val KEY_FLASHLIGHT_OVERHEAT_PREVENTION_ENABLED = + "flashlight_overheat_prevention_enabled" const val KEY_SCREEN_LOCKED_SECURITY_ENABLED = "screen_locked_security_enabled" const val KEY_HIDE_SYSTEM_ICONS = "hide_system_icons" @@ -298,9 +299,11 @@ class SettingsRepository(private val context: Context) { const val KEY_LOCKDOWN_MODE = "lockdown_mode" } - fun isTranslationModeWarningSuppressed(): Boolean = getBoolean(KEY_TRANSLATION_MODE_DO_NOT_SHOW_WARNING, false) - fun setTranslationModeWarningSuppressed(suppressed: Boolean) = putBoolean(KEY_TRANSLATION_MODE_DO_NOT_SHOW_WARNING, suppressed) + fun isTranslationModeWarningSuppressed(): Boolean = + getBoolean(KEY_TRANSLATION_MODE_DO_NOT_SHOW_WARNING, false) + fun setTranslationModeWarningSuppressed(suppressed: Boolean) = + putBoolean(KEY_TRANSLATION_MODE_DO_NOT_SHOW_WARNING, suppressed) // Observe changes @@ -791,7 +794,7 @@ class SettingsRepository(private val context: Context) { allConfigs.forEach { (fileName, prefWrapper) -> val p = context.getSharedPreferences(fileName, Context.MODE_PRIVATE) - + // Preserve sensitive or volatile local state not present in backups val preservedValues = mutableMapOf() val keysToPreserve = listOf( @@ -811,8 +814,8 @@ class SettingsRepository(private val context: Context) { } p.edit().apply { - if(!keepPrefs) clear() - + if (!keepPrefs) clear() + // Restore preserved values preservedValues.forEach { (key, value) -> if (value != null) { diff --git a/app/src/main/java/com/sameerasw/essentials/data/repository/UpdateRepository.kt b/app/src/main/java/com/sameerasw/essentials/data/repository/UpdateRepository.kt index bfc775757..34b16daf5 100644 --- a/app/src/main/java/com/sameerasw/essentials/data/repository/UpdateRepository.kt +++ b/app/src/main/java/com/sameerasw/essentials/data/repository/UpdateRepository.kt @@ -18,7 +18,8 @@ class UpdateRepository { ): UpdateInfo? = withContext(Dispatchers.IO) { try { val autoUpdateHelper = AutoUpdateManagerHelper(context) - val updateFeatures = autoUpdateHelper.checkForUpdate("https://sameerasw.com/essentials-update.json") + val updateFeatures = + autoUpdateHelper.checkForUpdate("https://sameerasw.com/essentials-update.json") if (updateFeatures != null && updateFeatures.latestversion.isNotEmpty()) { val latestVersion = updateFeatures.latestversion diff --git a/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt b/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt index 43e7f6bb8..77e6be5b3 100644 --- a/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt +++ b/app/src/main/java/com/sameerasw/essentials/domain/registry/FeatureRegistry.kt @@ -572,7 +572,10 @@ object FeatureRegistry { override fun isEnabled(viewModel: MainViewModel) = true override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {} override fun onClick(context: Context, viewModel: MainViewModel) { - val intent = Intent(context, com.sameerasw.essentials.FeatureSettingsActivity::class.java).apply { + val intent = Intent( + context, + com.sameerasw.essentials.FeatureSettingsActivity::class.java + ).apply { putExtra("feature", "Power and Battery") } context.startActivity(intent) @@ -594,7 +597,10 @@ object FeatureRegistry { override fun isEnabled(viewModel: MainViewModel) = true override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {} override fun onClick(context: Context, viewModel: MainViewModel) { - val intent = Intent(context, com.sameerasw.essentials.FeatureSettingsActivity::class.java).apply { + val intent = Intent( + context, + com.sameerasw.essentials.FeatureSettingsActivity::class.java + ).apply { putExtra("feature", "Flashlight") } context.startActivity(intent) @@ -648,7 +654,10 @@ object FeatureRegistry { viewModel.setShowNotificationSnoozeEnabled(context, enabled) override fun onClick(context: Context, viewModel: MainViewModel) { - val intent = Intent(context, com.sameerasw.essentials.FeatureSettingsActivity::class.java).apply { + val intent = Intent( + context, + com.sameerasw.essentials.FeatureSettingsActivity::class.java + ).apply { putExtra("feature", "Notification snoozing") } context.startActivity(intent) diff --git a/app/src/main/java/com/sameerasw/essentials/services/AppUpdateWorker.kt b/app/src/main/java/com/sameerasw/essentials/services/AppUpdateWorker.kt index 68f265c1c..e69fcb9f1 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/AppUpdateWorker.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/AppUpdateWorker.kt @@ -39,7 +39,8 @@ class AppUpdateWorker( false ) - val updateInfo = updateRepository.checkForUpdates(context, isPreReleaseEnabled, currentVersion) + val updateInfo = + updateRepository.checkForUpdates(context, isPreReleaseEnabled, currentVersion) if (updateInfo != null && updateInfo.isUpdateAvailable) { com.sameerasw.essentials.viewmodels.MainViewModel.cachedIsUpdateAvailable = true diff --git a/app/src/main/java/com/sameerasw/essentials/services/DailyWallpaperWorker.kt b/app/src/main/java/com/sameerasw/essentials/services/DailyWallpaperWorker.kt index 1e12b0879..b9bb78b7b 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/DailyWallpaperWorker.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/DailyWallpaperWorker.kt @@ -101,9 +101,13 @@ class DailyWallpaperWorker( } if (!newWallpaperApplied && !force) { - val retryCount = settingsRepository.getInt(SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, 0) + val retryCount = + settingsRepository.getInt(SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, 0) if (retryCount < 2) { - settingsRepository.putInt(SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, retryCount + 1) + settingsRepository.putInt( + SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, + retryCount + 1 + ) val retryWork = androidx.work.OneTimeWorkRequestBuilder() .setInitialDelay(30, java.util.concurrent.TimeUnit.MINUTES) .build() @@ -112,10 +116,16 @@ class DailyWallpaperWorker( androidx.work.ExistingWorkPolicy.REPLACE, retryWork ) - Log.d("DailyWallpaperWorker", "No new wallpaper found. Scheduled retry #${retryCount + 1} in 30 mins") + Log.d( + "DailyWallpaperWorker", + "No new wallpaper found. Scheduled retry #${retryCount + 1} in 30 mins" + ) } else { settingsRepository.putInt(SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, 0) - Log.d("DailyWallpaperWorker", "Reached max retries (3 total checks). Waiting for next daily cycle.") + Log.d( + "DailyWallpaperWorker", + "Reached max retries (3 total checks). Waiting for next daily cycle." + ) } } diff --git a/app/src/main/java/com/sameerasw/essentials/services/DeviceInfoSyncManager.kt b/app/src/main/java/com/sameerasw/essentials/services/DeviceInfoSyncManager.kt index 8de3a1a27..e16d136cd 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/DeviceInfoSyncManager.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/DeviceInfoSyncManager.kt @@ -42,9 +42,10 @@ object DeviceInfoSyncManager { isIntensitySupported = FlashlightUtil.isIntensitySupported(context, cameraId) syncDeviceInfo(context) - val intent = Intent("com.sameerasw.essentials.action.QS_TILES_WIDGET_UPDATE").apply { - setPackage(context.packageName) - } + val intent = + Intent("com.sameerasw.essentials.action.QS_TILES_WIDGET_UPDATE").apply { + setPackage(context.packageName) + } context.sendBroadcast(intent) } } @@ -177,16 +178,27 @@ object DeviceInfoSyncManager { ?: android.os.Build.MODEL val prefs = context.getSharedPreferences("essentials_prefs", Context.MODE_PRIVATE) - val syncLocationReachedEnabled = prefs.getBoolean("watch_sync_location_reached_enabled", true) - - val travelActive = if (syncLocationReachedEnabled) prefs.getBoolean("travel_active", false) else false - val travelName = if (syncLocationReachedEnabled) (prefs.getString("travel_name", "") ?: "") else "" - val travelProgress = if (syncLocationReachedEnabled) prefs.getFloat("travel_progress", 0f) else 0f - val travelRemainingTime = if (syncLocationReachedEnabled) (prefs.getString("travel_remaining_time", "") ?: "") else "" - val travelRemainingDistance = if (syncLocationReachedEnabled) (prefs.getString("travel_remaining_distance", "") ?: "") else "" - val travelIconName = if (syncLocationReachedEnabled) (prefs.getString("travel_icon_name", "") ?: "") else "" - val travelIsPaused = if (syncLocationReachedEnabled) prefs.getBoolean("travel_is_paused", false) else false - val travelArrived = if (syncLocationReachedEnabled) prefs.getBoolean("travel_arrived", false) else false + val syncLocationReachedEnabled = + prefs.getBoolean("watch_sync_location_reached_enabled", true) + + val travelActive = + if (syncLocationReachedEnabled) prefs.getBoolean("travel_active", false) else false + val travelName = + if (syncLocationReachedEnabled) (prefs.getString("travel_name", "") ?: "") else "" + val travelProgress = + if (syncLocationReachedEnabled) prefs.getFloat("travel_progress", 0f) else 0f + val travelRemainingTime = + if (syncLocationReachedEnabled) (prefs.getString("travel_remaining_time", "") + ?: "") else "" + val travelRemainingDistance = + if (syncLocationReachedEnabled) (prefs.getString("travel_remaining_distance", "") + ?: "") else "" + val travelIconName = + if (syncLocationReachedEnabled) (prefs.getString("travel_icon_name", "") ?: "") else "" + val travelIsPaused = + if (syncLocationReachedEnabled) prefs.getBoolean("travel_is_paused", false) else false + val travelArrived = + if (syncLocationReachedEnabled) prefs.getBoolean("travel_arrived", false) else false val flashlightPulseEnabled = prefs.getBoolean("flashlight_pulse_enabled", false) val aodState = when { diff --git a/app/src/main/java/com/sameerasw/essentials/services/EssentialsWearableListenerService.kt b/app/src/main/java/com/sameerasw/essentials/services/EssentialsWearableListenerService.kt index 6e3e3693f..e1c885f71 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/EssentialsWearableListenerService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/EssentialsWearableListenerService.kt @@ -64,7 +64,8 @@ class EssentialsWearableListenerService : WearableListenerService() { SettingsRepository.KEY_REMOTE_LOCK_MODE, 0 ) - val method = if (mode == 1) ScreenOffMethod.DEVICE_ADMIN else ScreenOffMethod.ACCESSIBILITY + val method = + if (mode == 1) ScreenOffMethod.DEVICE_ADMIN else ScreenOffMethod.ACCESSIBILITY DeviceLockUtils.lockDevice(this, method) } diff --git a/app/src/main/java/com/sameerasw/essentials/services/LocationReachedService.kt b/app/src/main/java/com/sameerasw/essentials/services/LocationReachedService.kt index 78d4c7988..62972b138 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/LocationReachedService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/LocationReachedService.kt @@ -13,7 +13,6 @@ import android.os.IBinder import androidx.core.app.NotificationCompat import com.google.android.gms.location.LocationServices import com.google.android.gms.location.Priority -import com.sameerasw.essentials.MainActivity import com.sameerasw.essentials.R import com.sameerasw.essentials.data.repository.LocationReachedRepository import com.sameerasw.essentials.domain.model.LocationAlarm @@ -351,7 +350,8 @@ class LocationReachedService : Service() { PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) - val mainIntent = Intent(this, com.sameerasw.essentials.ui.activities.TravelCompassActivity::class.java) + val mainIntent = + Intent(this, com.sameerasw.essentials.ui.activities.TravelCompassActivity::class.java) val mainPendingIntent = PendingIntent.getActivity( this, 0, diff --git a/app/src/main/java/com/sameerasw/essentials/services/ScreenOffWidgetProvider.kt b/app/src/main/java/com/sameerasw/essentials/services/ScreenOffWidgetProvider.kt index 684f2728e..fb94c0567 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/ScreenOffWidgetProvider.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/ScreenOffWidgetProvider.kt @@ -9,10 +9,7 @@ import android.os.Build import android.os.SystemClock import android.os.Vibrator import android.os.VibratorManager -import android.provider.Settings -import android.view.KeyEvent import android.widget.RemoteViews -import android.widget.Toast import com.sameerasw.essentials.R import com.sameerasw.essentials.domain.HapticFeedbackType import com.sameerasw.essentials.domain.ScreenOffMethod diff --git a/app/src/main/java/com/sameerasw/essentials/services/automation/executors/CombinedActionExecutor.kt b/app/src/main/java/com/sameerasw/essentials/services/automation/executors/CombinedActionExecutor.kt index 29d744951..814ec78f8 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/automation/executors/CombinedActionExecutor.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/automation/executors/CombinedActionExecutor.kt @@ -6,15 +6,12 @@ import android.content.Intent import android.hardware.camera2.CameraManager import android.media.AudioManager import android.os.Build -import android.provider.Settings import android.view.KeyEvent import android.widget.Toast import com.sameerasw.essentials.domain.HapticFeedbackType -import com.sameerasw.essentials.domain.ScreenOffMethod import com.sameerasw.essentials.domain.diy.Action import com.sameerasw.essentials.services.tiles.ScreenOffAccessibilityService import com.sameerasw.essentials.utils.DeviceLockUtils -import com.sameerasw.essentials.utils.ShellUtils import com.sameerasw.essentials.utils.performHapticFeedback import rikka.shizuku.ShizukuBinderWrapper import rikka.shizuku.SystemServiceHelper diff --git a/app/src/main/java/com/sameerasw/essentials/services/automation/modules/BluetoothModule.kt b/app/src/main/java/com/sameerasw/essentials/services/automation/modules/BluetoothModule.kt index 7436a3779..1134a85df 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/automation/modules/BluetoothModule.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/automation/modules/BluetoothModule.kt @@ -25,12 +25,16 @@ class BluetoothModule : AutomationModule { @SuppressLint("MissingPermission") private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { - val device = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { - intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE, BluetoothDevice::class.java) - } else { - @Suppress("DEPRECATION") - intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) - } ?: return + val device = + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { + intent.getParcelableExtra( + BluetoothDevice.EXTRA_DEVICE, + BluetoothDevice::class.java + ) + } else { + @Suppress("DEPRECATION") + intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE) + } ?: return val address = device.address ?: return diff --git a/app/src/main/java/com/sameerasw/essentials/services/automation/modules/WifiModule.kt b/app/src/main/java/com/sameerasw/essentials/services/automation/modules/WifiModule.kt index e846e2113..8e9a45ab8 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/automation/modules/WifiModule.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/automation/modules/WifiModule.kt @@ -32,7 +32,10 @@ class WifiModule : AutomationModule { if (!capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) return val ssid = currentWifiSsid() if (ssid == null) { - Log.d(ID, "Wi-Fi capabilities changed but SSID unavailable (check location permission/services)") + Log.d( + ID, + "Wi-Fi capabilities changed but SSID unavailable (check location permission/services)" + ) return } if (activeNetworkSsids[network] == ssid) return diff --git a/app/src/main/java/com/sameerasw/essentials/services/handlers/ButtonRemapHandler.kt b/app/src/main/java/com/sameerasw/essentials/services/handlers/ButtonRemapHandler.kt index 7938bc40d..db206b08b 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/handlers/ButtonRemapHandler.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/handlers/ButtonRemapHandler.kt @@ -83,13 +83,23 @@ class ButtonRemapHandler( // Flashlight Brightness Control (Volume Keys + Torch On) if (flashlightHandler.isTorchOn && (isAdjustEnabled || isGlobalEnabled) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - val isAlwaysTurnOffEnabled = prefs.getBoolean("flashlight_always_turn_off_enabled", false) + val isAlwaysTurnOffEnabled = + prefs.getBoolean("flashlight_always_turn_off_enabled", false) val isVolUpFlashlight = prefs.getString("button_remap_vol_up_action_off", "None") == "Toggle flashlight" || - prefs.getString("button_remap_vol_up_action_on", "None") == "Toggle flashlight" + prefs.getString( + "button_remap_vol_up_action_on", + "None" + ) == "Toggle flashlight" val isVolDownFlashlight = - prefs.getString("button_remap_vol_down_action_off", "None") == "Toggle flashlight" || - prefs.getString("button_remap_vol_down_action_on", "None") == "Toggle flashlight" + prefs.getString( + "button_remap_vol_down_action_off", + "None" + ) == "Toggle flashlight" || + prefs.getString( + "button_remap_vol_down_action_on", + "None" + ) == "Toggle flashlight" val isFlashlightCapableButton = (keyCode == KeyEvent.KEYCODE_VOLUME_UP && isVolUpFlashlight) || (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN && isVolDownFlashlight) diff --git a/app/src/main/java/com/sameerasw/essentials/services/handlers/FlashlightHandler.kt b/app/src/main/java/com/sameerasw/essentials/services/handlers/FlashlightHandler.kt index a9cc210b5..fc83bc843 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/handlers/FlashlightHandler.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/handlers/FlashlightHandler.kt @@ -669,7 +669,8 @@ class FlashlightHandler( while (isTorchOn) { kotlinx.coroutines.delay(120000L) val prefs = service.getSharedPreferences("essentials_prefs", Context.MODE_PRIVATE) - val isOverheatEnabled = prefs.getBoolean("flashlight_overheat_prevention_enabled", true) + val isOverheatEnabled = + prefs.getBoolean("flashlight_overheat_prevention_enabled", true) if (isOverheatEnabled && FlashlightUtil.isIntensitySupported(service, cameraId)) { val currentLevel = FlashlightUtil.getCurrentLevel(service, cameraId) val maxLevel = FlashlightUtil.getMaxLevel(service, cameraId) diff --git a/app/src/main/java/com/sameerasw/essentials/services/handlers/StatusBarIconHandler.kt b/app/src/main/java/com/sameerasw/essentials/services/handlers/StatusBarIconHandler.kt index ea96d8c4a..a04e4b54e 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/handlers/StatusBarIconHandler.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/handlers/StatusBarIconHandler.kt @@ -190,12 +190,13 @@ class StatusBarIconHandler(private val context: Context) { val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager - val networkType = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { - telephonyManager.dataNetworkType - } else { - @Suppress("DEPRECATION") - telephonyManager.networkType - } + val networkType = + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + telephonyManager.dataNetworkType + } else { + @Suppress("DEPRECATION") + telephonyManager.networkType + } when (networkType) { TelephonyManager.NETWORK_TYPE_NR -> NetworkType.NETWORK_5G diff --git a/app/src/main/java/com/sameerasw/essentials/services/receivers/BatteryAutomationReceiver.kt b/app/src/main/java/com/sameerasw/essentials/services/receivers/BatteryAutomationReceiver.kt index aa28c694d..97052e871 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/receivers/BatteryAutomationReceiver.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/receivers/BatteryAutomationReceiver.kt @@ -13,11 +13,21 @@ class BatteryAutomationReceiver : BroadcastReceiver() { val action = intent.action ?: return val bm = context.getSystemService(Context.BATTERY_SERVICE) as? BatteryManager val level = bm?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) ?: -1 - val isPlugged = action == Intent.ACTION_POWER_CONNECTED || (action == Intent.ACTION_BATTERY_CHANGED && intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0) > 0) + val isPlugged = + action == Intent.ACTION_POWER_CONNECTED || (action == Intent.ACTION_BATTERY_CHANGED && intent.getIntExtra( + BatteryManager.EXTRA_PLUGGED, + 0 + ) > 0) if (level >= 0) { - val force = action == Intent.ACTION_POWER_CONNECTED || action == Intent.ACTION_POWER_DISCONNECTED - com.sameerasw.essentials.utils.BatteryHistoryManager.recordPoint(context, level, isPlugged, forceRecord = force) + val force = + action == Intent.ACTION_POWER_CONNECTED || action == Intent.ACTION_POWER_DISCONNECTED + com.sameerasw.essentials.utils.BatteryHistoryManager.recordPoint( + context, + level, + isPlugged, + forceRecord = force + ) } if (action == Intent.ACTION_POWER_DISCONNECTED) { diff --git a/app/src/main/java/com/sameerasw/essentials/services/receivers/DownloadUpdateReceiver.kt b/app/src/main/java/com/sameerasw/essentials/services/receivers/DownloadUpdateReceiver.kt index 6e9f2f4ed..e39fa3e8f 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/receivers/DownloadUpdateReceiver.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/receivers/DownloadUpdateReceiver.kt @@ -26,7 +26,11 @@ class DownloadUpdateReceiver : BroadcastReceiver() { apkUrl = downloadUrl, apkName = "Essentials_$cleanVersion", onProgressUpdate = { progress -> - UpdateNotificationHelper.showDownloadProgressNotification(context, version, progress) + UpdateNotificationHelper.showDownloadProgressNotification( + context, + version, + progress + ) } ) } catch (e: Exception) { diff --git a/app/src/main/java/com/sameerasw/essentials/services/receivers/QsTileActionRouter.kt b/app/src/main/java/com/sameerasw/essentials/services/receivers/QsTileActionRouter.kt index b47141168..31f33dbe7 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/receivers/QsTileActionRouter.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/receivers/QsTileActionRouter.kt @@ -6,7 +6,9 @@ import android.content.Intent import android.util.Log import com.sameerasw.essentials.MainActivity import com.sameerasw.essentials.domain.controller.CaffeinateController -import com.sameerasw.essentials.services.tiles.* +import com.sameerasw.essentials.services.tiles.BaseTileService +import com.sameerasw.essentials.services.tiles.CaffeinateTileService +import com.sameerasw.essentials.services.tiles.FlashlightTileService import com.sameerasw.essentials.utils.HapticUtil class QsTileActionRouter : BroadcastReceiver() { @@ -29,21 +31,26 @@ class QsTileActionRouter : BroadcastReceiver() { CaffeinateController.toggle(context) } } + FlashlightTileService::class.java.name -> { - val flashlightIntent = Intent(context, FlashlightActionReceiver::class.java).apply { - action = FlashlightActionReceiver.ACTION_TOGGLE - } + val flashlightIntent = + Intent(context, FlashlightActionReceiver::class.java).apply { + action = FlashlightActionReceiver.ACTION_TOGGLE + } context.sendBroadcast(flashlightIntent) } + else -> { val clazz = Class.forName(serviceClassName) if (BaseTileService::class.java.isAssignableFrom(clazz)) { - val tileService = clazz.getDeclaredConstructor().newInstance() as BaseTileService - - val attachBaseContextMethod = android.content.ContextWrapper::class.java.getDeclaredMethod( - "attachBaseContext", - Context::class.java - ) + val tileService = + clazz.getDeclaredConstructor().newInstance() as BaseTileService + + val attachBaseContextMethod = + android.content.ContextWrapper::class.java.getDeclaredMethod( + "attachBaseContext", + Context::class.java + ) attachBaseContextMethod.isAccessible = true attachBaseContextMethod.invoke(tileService, context) diff --git a/app/src/main/java/com/sameerasw/essentials/services/tiles/ChargeQuickTileService.kt b/app/src/main/java/com/sameerasw/essentials/services/tiles/ChargeQuickTileService.kt index eb93c7538..e694d3caa 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/tiles/ChargeQuickTileService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/tiles/ChargeQuickTileService.kt @@ -39,7 +39,7 @@ class ChargeQuickTileService : BaseTileService() { override fun onTileClick() { val adaptiveChargingEnabled = getSecureInt(ADAPTIVE_CHARGING_SETTING, 0) == 1 val chargeOptimizationEnabled = getSecureInt(CHARGE_OPTIMIZATION_MODE, 0) == 1 - + val settingsRepository = com.sameerasw.essentials.data.repository.SettingsRepository(this) val enableAdaptive = settingsRepository.getBoolean("charge_opt_toggle_adaptive", true) val enableLimit = settingsRepository.getBoolean("charge_opt_toggle_limit", true) @@ -73,10 +73,12 @@ class ChargeQuickTileService : BaseTileService() { putSecureInt(CHARGE_OPTIMIZATION_MODE, 0) putSecureInt(ADAPTIVE_CHARGING_SETTING, 0) } + 1 -> { putSecureInt(CHARGE_OPTIMIZATION_MODE, 0) putSecureInt(ADAPTIVE_CHARGING_SETTING, 1) } + 2 -> { putSecureInt(CHARGE_OPTIMIZATION_MODE, 1) putSecureInt(ADAPTIVE_CHARGING_SETTING, 0) diff --git a/app/src/main/java/com/sameerasw/essentials/services/tiles/LockdownTileService.kt b/app/src/main/java/com/sameerasw/essentials/services/tiles/LockdownTileService.kt index bf4ef7ef5..eb3ab7572 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/tiles/LockdownTileService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/tiles/LockdownTileService.kt @@ -28,7 +28,8 @@ class LockdownTileService : BaseTileService() { override fun hasFeaturePermission(): Boolean = true override fun getTileIcon(): Icon { - val iconRes = if (lockdownModeStatus()) R.drawable.rounded_shield_lock_24 else R.drawable.rounded_lock_24 + val iconRes = + if (lockdownModeStatus()) R.drawable.rounded_shield_lock_24 else R.drawable.rounded_lock_24 return Icon.createWithResource(this, iconRes) } diff --git a/app/src/main/java/com/sameerasw/essentials/services/tiles/PrivateDnsTileService.kt b/app/src/main/java/com/sameerasw/essentials/services/tiles/PrivateDnsTileService.kt index 9654abb06..6f71cba97 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/tiles/PrivateDnsTileService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/tiles/PrivateDnsTileService.kt @@ -97,7 +97,11 @@ class PrivateDnsTileService : BaseTileService() { // Turn on with the first preset val firstPreset = presets.first() try { - Settings.Global.putString(contentResolver, PRIVATE_DNS_SPECIFIER, firstPreset.hostname) + Settings.Global.putString( + contentResolver, + PRIVATE_DNS_SPECIFIER, + firstPreset.hostname + ) Settings.Global.putString(contentResolver, PRIVATE_DNS_MODE, MODE_HOSTNAME) } catch (e: Exception) { e.printStackTrace() @@ -116,7 +120,11 @@ class PrivateDnsTileService : BaseTileService() { // Next preset val nextPreset = presets[currentIndex + 1] try { - Settings.Global.putString(contentResolver, PRIVATE_DNS_SPECIFIER, nextPreset.hostname) + Settings.Global.putString( + contentResolver, + PRIVATE_DNS_SPECIFIER, + nextPreset.hostname + ) Settings.Global.putString(contentResolver, PRIVATE_DNS_MODE, MODE_HOSTNAME) } catch (e: Exception) { e.printStackTrace() @@ -131,6 +139,7 @@ class PrivateDnsTileService : BaseTileService() { MODE_AUTO -> { if (getPrivateDnsHostname().isNullOrEmpty()) MODE_OFF else MODE_HOSTNAME } + MODE_HOSTNAME -> MODE_OFF else -> MODE_OFF } @@ -139,9 +148,11 @@ class PrivateDnsTileService : BaseTileService() { MODE_OFF -> { if (getPrivateDnsHostname().isNullOrEmpty()) MODE_OFF else MODE_HOSTNAME } + MODE_AUTO -> { if (getPrivateDnsHostname().isNullOrEmpty()) MODE_OFF else MODE_HOSTNAME } + MODE_HOSTNAME -> MODE_OFF else -> MODE_OFF } diff --git a/app/src/main/java/com/sameerasw/essentials/services/tiles/QsTileRegistry.kt b/app/src/main/java/com/sameerasw/essentials/services/tiles/QsTileRegistry.kt index ea50e6e86..4648aff2b 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/tiles/QsTileRegistry.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/tiles/QsTileRegistry.kt @@ -10,33 +10,137 @@ object QsTileRegistry { ) val ALL_TILES: List = listOf( - QsTileEntry(R.string.tile_ui_blur, R.drawable.rounded_blur_on_24, UiBlurTileService::class.java), - QsTileEntry(R.string.tile_bubbles, R.drawable.rounded_bubble_24, BubblesTileService::class.java), - QsTileEntry(R.string.tile_sensitive_content, R.drawable.rounded_notifications_off_24, PrivateNotificationsTileService::class.java), - QsTileEntry(R.string.tile_tap_to_wake, R.drawable.rounded_touch_app_24, TapToWakeTileService::class.java), - QsTileEntry(R.string.tile_aod, R.drawable.rounded_mobile_text_2_24, AlwaysOnDisplayTileService::class.java), - QsTileEntry(R.string.tile_caffeinate, R.drawable.rounded_coffee_24, CaffeinateTileService::class.java), - QsTileEntry(R.string.tile_sound_mode, R.drawable.rounded_volume_up_24, SoundModeTileService::class.java), - QsTileEntry(R.string.tile_notification_lighting, R.drawable.rounded_blur_linear_24, NotificationLightingTileService::class.java), - QsTileEntry(R.string.tile_dynamic_night_light, R.drawable.rounded_nightlight_24, DynamicNightLightTileService::class.java), - QsTileEntry(R.string.tile_locked_security, R.drawable.rounded_security_24, ScreenLockedSecurityTileService::class.java), - QsTileEntry(R.string.tile_app_lock, R.drawable.rounded_shield_lock_24, AppLockTileService::class.java), - QsTileEntry(R.string.tile_mono_audio, R.drawable.rounded_headphones_24, MonoAudioTileService::class.java), - QsTileEntry(R.string.tile_flashlight, R.drawable.rounded_flashlight_on_24, FlashlightTileService::class.java), - QsTileEntry(R.string.tile_app_freezing, R.drawable.rounded_app_badging_24, AppFreezingTileService::class.java), - QsTileEntry(R.string.tile_flashlight_pulse, R.drawable.outline_backlight_high_24, FlashlightPulseTileService::class.java), - QsTileEntry(R.string.tile_stay_awake, R.drawable.rounded_av_timer_24, StayAwakeTileService::class.java), + QsTileEntry( + R.string.tile_ui_blur, + R.drawable.rounded_blur_on_24, + UiBlurTileService::class.java + ), + QsTileEntry( + R.string.tile_bubbles, + R.drawable.rounded_bubble_24, + BubblesTileService::class.java + ), + QsTileEntry( + R.string.tile_sensitive_content, + R.drawable.rounded_notifications_off_24, + PrivateNotificationsTileService::class.java + ), + QsTileEntry( + R.string.tile_tap_to_wake, + R.drawable.rounded_touch_app_24, + TapToWakeTileService::class.java + ), + QsTileEntry( + R.string.tile_aod, + R.drawable.rounded_mobile_text_2_24, + AlwaysOnDisplayTileService::class.java + ), + QsTileEntry( + R.string.tile_caffeinate, + R.drawable.rounded_coffee_24, + CaffeinateTileService::class.java + ), + QsTileEntry( + R.string.tile_sound_mode, + R.drawable.rounded_volume_up_24, + SoundModeTileService::class.java + ), + QsTileEntry( + R.string.tile_notification_lighting, + R.drawable.rounded_blur_linear_24, + NotificationLightingTileService::class.java + ), + QsTileEntry( + R.string.tile_dynamic_night_light, + R.drawable.rounded_nightlight_24, + DynamicNightLightTileService::class.java + ), + QsTileEntry( + R.string.tile_locked_security, + R.drawable.rounded_security_24, + ScreenLockedSecurityTileService::class.java + ), + QsTileEntry( + R.string.tile_app_lock, + R.drawable.rounded_shield_lock_24, + AppLockTileService::class.java + ), + QsTileEntry( + R.string.tile_mono_audio, + R.drawable.rounded_headphones_24, + MonoAudioTileService::class.java + ), + QsTileEntry( + R.string.tile_flashlight, + R.drawable.rounded_flashlight_on_24, + FlashlightTileService::class.java + ), + QsTileEntry( + R.string.tile_app_freezing, + R.drawable.rounded_app_badging_24, + AppFreezingTileService::class.java + ), + QsTileEntry( + R.string.tile_flashlight_pulse, + R.drawable.outline_backlight_high_24, + FlashlightPulseTileService::class.java + ), + QsTileEntry( + R.string.tile_stay_awake, + R.drawable.rounded_av_timer_24, + StayAwakeTileService::class.java + ), QsTileEntry(R.string.nfc_tile_label, R.drawable.rounded_nfc_24, NfcTileService::class.java), - QsTileEntry(R.string.tile_adaptive_brightness, R.drawable.rounded_brightness_auto_24, AdaptiveBrightnessTileService::class.java), - QsTileEntry(R.string.tile_scale_animations, R.drawable.rounded_front_hand_24, ScaleAnimationsTileService::class.java), - QsTileEntry(R.string.tile_restart_systemui, R.drawable.reopen_window_24px, RestartSystemUiTileService::class.java), - QsTileEntry(R.string.tile_refresh_rate, R.drawable.rounded_shutter_speed_24, RefreshRateTileService::class.java), - QsTileEntry(R.string.feat_maps_power_saving_title, R.drawable.rounded_navigation_24, MapsPowerSavingTileService::class.java), - QsTileEntry(R.string.tile_private_dns, R.drawable.rounded_dns_24, PrivateDnsTileService::class.java), - QsTileEntry(R.string.tile_usb_debugging, R.drawable.rounded_adb_24, UsbDebuggingTileService::class.java), - QsTileEntry(R.string.tile_color_picker, R.drawable.rounded_colorize_24, ColorPickerTileService::class.java), - QsTileEntry(R.string.tile_developer_options, R.drawable.rounded_mobile_code_24, DeveloperOptionsTileService::class.java), - QsTileEntry(R.string.tile_charge_optimization, R.drawable.rounded_battery_android_frame_shield_24, ChargeQuickTileService::class.java) + QsTileEntry( + R.string.tile_adaptive_brightness, + R.drawable.rounded_brightness_auto_24, + AdaptiveBrightnessTileService::class.java + ), + QsTileEntry( + R.string.tile_scale_animations, + R.drawable.rounded_front_hand_24, + ScaleAnimationsTileService::class.java + ), + QsTileEntry( + R.string.tile_restart_systemui, + R.drawable.reopen_window_24px, + RestartSystemUiTileService::class.java + ), + QsTileEntry( + R.string.tile_refresh_rate, + R.drawable.rounded_shutter_speed_24, + RefreshRateTileService::class.java + ), + QsTileEntry( + R.string.feat_maps_power_saving_title, + R.drawable.rounded_navigation_24, + MapsPowerSavingTileService::class.java + ), + QsTileEntry( + R.string.tile_private_dns, + R.drawable.rounded_dns_24, + PrivateDnsTileService::class.java + ), + QsTileEntry( + R.string.tile_usb_debugging, + R.drawable.rounded_adb_24, + UsbDebuggingTileService::class.java + ), + QsTileEntry( + R.string.tile_color_picker, + R.drawable.rounded_colorize_24, + ColorPickerTileService::class.java + ), + QsTileEntry( + R.string.tile_developer_options, + R.drawable.rounded_mobile_code_24, + DeveloperOptionsTileService::class.java + ), + QsTileEntry( + R.string.tile_charge_optimization, + R.drawable.rounded_battery_android_frame_shield_24, + ChargeQuickTileService::class.java + ) ) private val tilesMapByClassName: Map by lazy { @@ -54,36 +158,44 @@ object QsTileRegistry { com.sameerasw.essentials.domain.controller.CaffeinateController.isActive.value || com.sameerasw.essentials.domain.controller.CaffeinateController.isStarting.value } + FlashlightTileService::class.java.name -> { val instance = ScreenOffAccessibilityService.instance if (instance != null) { instance.flashlightHandler.isTorchOn } else { val clazz = Class.forName(className) - val tileService = clazz.getDeclaredConstructor().newInstance() as BaseTileService - val attachBaseContextMethod = android.content.ContextWrapper::class.java.getDeclaredMethod( - "attachBaseContext", - android.content.Context::class.java - ) + val tileService = + clazz.getDeclaredConstructor().newInstance() as BaseTileService + val attachBaseContextMethod = + android.content.ContextWrapper::class.java.getDeclaredMethod( + "attachBaseContext", + android.content.Context::class.java + ) attachBaseContextMethod.isAccessible = true attachBaseContextMethod.invoke(tileService, context) - val getTileStateMethod = BaseTileService::class.java.getDeclaredMethod("getTileState") + val getTileStateMethod = + BaseTileService::class.java.getDeclaredMethod("getTileState") getTileStateMethod.isAccessible = true (getTileStateMethod.invoke(tileService) as Int) == android.service.quicksettings.Tile.STATE_ACTIVE } } + else -> { val clazz = Class.forName(className) if (BaseTileService::class.java.isAssignableFrom(clazz)) { - val tileService = clazz.getDeclaredConstructor().newInstance() as BaseTileService - val attachBaseContextMethod = android.content.ContextWrapper::class.java.getDeclaredMethod( - "attachBaseContext", - android.content.Context::class.java - ) + val tileService = + clazz.getDeclaredConstructor().newInstance() as BaseTileService + val attachBaseContextMethod = + android.content.ContextWrapper::class.java.getDeclaredMethod( + "attachBaseContext", + android.content.Context::class.java + ) attachBaseContextMethod.isAccessible = true attachBaseContextMethod.invoke(tileService, context) - val getTileStateMethod = BaseTileService::class.java.getDeclaredMethod("getTileState") + val getTileStateMethod = + BaseTileService::class.java.getDeclaredMethod("getTileState") getTileStateMethod.isAccessible = true val state = getTileStateMethod.invoke(tileService) as Int state == android.service.quicksettings.Tile.STATE_ACTIVE @@ -105,6 +217,7 @@ object QsTileRegistry { "Starting" } else "Off" } + FlashlightTileService::class.java.name -> { val instance = ScreenOffAccessibilityService.instance val isTorchOn = if (instance != null) { @@ -112,18 +225,22 @@ object QsTileRegistry { } else false if (isTorchOn) "On" else "Off" } + else -> { val clazz = Class.forName(className) if (BaseTileService::class.java.isAssignableFrom(clazz)) { - val tileService = clazz.getDeclaredConstructor().newInstance() as BaseTileService - val attachBaseContextMethod = android.content.ContextWrapper::class.java.getDeclaredMethod( - "attachBaseContext", - android.content.Context::class.java - ) + val tileService = + clazz.getDeclaredConstructor().newInstance() as BaseTileService + val attachBaseContextMethod = + android.content.ContextWrapper::class.java.getDeclaredMethod( + "attachBaseContext", + android.content.Context::class.java + ) attachBaseContextMethod.isAccessible = true attachBaseContextMethod.invoke(tileService, context) - val getTileSubtitleMethod = BaseTileService::class.java.getDeclaredMethod("getTileSubtitle") + val getTileSubtitleMethod = + BaseTileService::class.java.getDeclaredMethod("getTileSubtitle") getTileSubtitleMethod.isAccessible = true (getTileSubtitleMethod.invoke(tileService) as? String) ?: "" } else "" @@ -134,7 +251,11 @@ object QsTileRegistry { } } - fun getTileIcon(context: android.content.Context, className: String, fallbackIconRes: Int): Int { + fun getTileIcon( + context: android.content.Context, + className: String, + fallbackIconRes: Int + ): Int { return try { when (className) { FlashlightTileService::class.java.name -> { @@ -144,20 +265,25 @@ object QsTileRegistry { } else false if (isTorchOn) R.drawable.round_flashlight_on_24 else R.drawable.rounded_flashlight_on_24 } + else -> { val clazz = Class.forName(className) if (BaseTileService::class.java.isAssignableFrom(clazz)) { - val tileService = clazz.getDeclaredConstructor().newInstance() as BaseTileService - val attachBaseContextMethod = android.content.ContextWrapper::class.java.getDeclaredMethod( - "attachBaseContext", - android.content.Context::class.java - ) + val tileService = + clazz.getDeclaredConstructor().newInstance() as BaseTileService + val attachBaseContextMethod = + android.content.ContextWrapper::class.java.getDeclaredMethod( + "attachBaseContext", + android.content.Context::class.java + ) attachBaseContextMethod.isAccessible = true attachBaseContextMethod.invoke(tileService, context) - val getTileIconMethod = BaseTileService::class.java.getDeclaredMethod("getTileIcon") + val getTileIconMethod = + BaseTileService::class.java.getDeclaredMethod("getTileIcon") getTileIconMethod.isAccessible = true - val iconObj = getTileIconMethod.invoke(tileService) as? android.graphics.drawable.Icon + val iconObj = + getTileIconMethod.invoke(tileService) as? android.graphics.drawable.Icon if (iconObj != null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) { val resId = iconObj.resId if (resId != 0) resId else fallbackIconRes diff --git a/app/src/main/java/com/sameerasw/essentials/services/tiles/RestartSystemUiTileService.kt b/app/src/main/java/com/sameerasw/essentials/services/tiles/RestartSystemUiTileService.kt index 0547da8a3..49a4b97dc 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/tiles/RestartSystemUiTileService.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/tiles/RestartSystemUiTileService.kt @@ -7,7 +7,6 @@ import android.service.quicksettings.Tile import androidx.annotation.RequiresApi import com.sameerasw.essentials.FeatureSettingsActivity import com.sameerasw.essentials.R -import com.sameerasw.essentials.utils.PermissionUtils import com.sameerasw.essentials.utils.RootUtils import com.sameerasw.essentials.utils.ShizukuUtils diff --git a/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidget.kt b/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidget.kt index f096a2039..3036732b4 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidget.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidget.kt @@ -52,15 +52,19 @@ class QsTilesWidget : GlanceAppWidget() { override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { GlanceTheme { - val prefs = androidx.glance.currentState() - val KEY_UPDATE = androidx.datastore.preferences.core.longPreferencesKey("qs_widget_last_update") + val prefs = + androidx.glance.currentState() + val KEY_UPDATE = + androidx.datastore.preferences.core.longPreferencesKey("qs_widget_last_update") + @Suppress("UNUSED_VARIABLE") val lastUpdate = prefs[KEY_UPDATE] ?: 0L val repository = SettingsRepository(context) val pinnedClassNames = repository.getPinnedQsTiles() - val pinnedTiles = pinnedClassNames.mapNotNull { QsTileRegistry.getTileByClassName(it) } + val pinnedTiles = + pinnedClassNames.mapNotNull { QsTileRegistry.getTileByClassName(it) } val width = LocalSize.current.width val height = LocalSize.current.height @@ -135,7 +139,7 @@ class QsTilesWidget : GlanceAppWidget() { val pastelColor = ColorUtil.getPastelColorFor( resolvedTitle - ) + ) val vibrantColor = ColorUtil.getVibrantColorFor( resolvedTitle @@ -190,11 +194,12 @@ class QsTilesWidget : GlanceAppWidget() { ) ) - val activeIconRes = QsTileRegistry.getTileIcon( - context, - tile.serviceClass.name, - tile.iconRes - ) + val activeIconRes = + QsTileRegistry.getTileIcon( + context, + tile.serviceClass.name, + tile.iconRes + ) Row( modifier = cardModifier.padding( @@ -236,10 +241,11 @@ class QsTilesWidget : GlanceAppWidget() { ) ) - val subtitle = QsTileRegistry.getTileSubtitle( - context, - tile.serviceClass.name - ) + val subtitle = + QsTileRegistry.getTileSubtitle( + context, + tile.serviceClass.name + ) Column( modifier = GlanceModifier.defaultWeight(), diff --git a/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidgetReceiver.kt b/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidgetReceiver.kt index 140435e2b..205655d5d 100644 --- a/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidgetReceiver.kt +++ b/app/src/main/java/com/sameerasw/essentials/services/widgets/QsTilesWidgetReceiver.kt @@ -28,19 +28,28 @@ class QsTilesWidgetReceiver : GlanceAppWidgetReceiver() { val glanceIds = glanceAppWidgetManager.getGlanceIds(QsTilesWidget::class.java) val timestamp = System.currentTimeMillis() glanceIds.forEach { glanceId -> - androidx.glance.appwidget.state.updateAppWidgetState(context, glanceId) { prefs -> - val KEY_UPDATE = androidx.datastore.preferences.core.longPreferencesKey("qs_widget_last_update") + androidx.glance.appwidget.state.updateAppWidgetState( + context, + glanceId + ) { prefs -> + val KEY_UPDATE = + androidx.datastore.preferences.core.longPreferencesKey("qs_widget_last_update") prefs[KEY_UPDATE] = timestamp } glanceAppWidget.update(context, glanceId) } // delay for qs status - val updatedGlanceIds = glanceAppWidgetManager.getGlanceIds(QsTilesWidget::class.java) + val updatedGlanceIds = + glanceAppWidgetManager.getGlanceIds(QsTilesWidget::class.java) val newTimestamp = System.currentTimeMillis() updatedGlanceIds.forEach { glanceId -> - androidx.glance.appwidget.state.updateAppWidgetState(context, glanceId) { prefs -> - val KEY_UPDATE = androidx.datastore.preferences.core.longPreferencesKey("qs_widget_last_update") + androidx.glance.appwidget.state.updateAppWidgetState( + context, + glanceId + ) { prefs -> + val KEY_UPDATE = + androidx.datastore.preferences.core.longPreferencesKey("qs_widget_last_update") prefs[KEY_UPDATE] = newTimestamp } glanceAppWidget.update(context, glanceId) diff --git a/app/src/main/java/com/sameerasw/essentials/translation/StringLoader.kt b/app/src/main/java/com/sameerasw/essentials/translation/StringLoader.kt index 8ef0ec25c..8cc2b16b4 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/StringLoader.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/StringLoader.kt @@ -1,9 +1,6 @@ package com.sameerasw.essentials.translation import android.content.Context -import com.sameerasw.essentials.translation.model.StringEntry -import org.xmlpull.v1.XmlPullParser -import java.io.InputStream object StringLoader { // Map of key -> Map @@ -119,14 +116,14 @@ object StringLoader { val res = context.resources val localeCode = extractLocaleCode(dirName) val config = android.content.res.Configuration(res.configuration) - + val localeParts = localeCode.split("-") val locale = if (localeParts.size > 1) { java.util.Locale(localeParts[0], localeParts[1]) } else { java.util.Locale(localeParts[0]) } - + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { config.setLocales(android.os.LocaleList(locale)) } else { diff --git a/app/src/main/java/com/sameerasw/essentials/translation/TranslatableText.kt b/app/src/main/java/com/sameerasw/essentials/translation/TranslatableText.kt index 70a399e41..659185c61 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/TranslatableText.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/TranslatableText.kt @@ -44,7 +44,12 @@ fun TranslatableText( val defaultText = stringResource(id = stringResId) val currentLocale = remember { context.resources.configuration.locales[0].language } - val displayText = remember(keyName, currentLocale, defaultText, TranslationManager.liveOverrides[Pair(keyName, currentLocale)]) { + val displayText = remember( + keyName, + currentLocale, + defaultText, + TranslationManager.liveOverrides[Pair(keyName, currentLocale)] + ) { TranslationManager.getOverriddenText(keyName, currentLocale, defaultText) } diff --git a/app/src/main/java/com/sameerasw/essentials/translation/TranslationManager.kt b/app/src/main/java/com/sameerasw/essentials/translation/TranslationManager.kt index 6453e25f6..eaf42171c 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/TranslationManager.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/TranslationManager.kt @@ -54,9 +54,10 @@ object TranslationManager { if (resOrText is String && resOrText.isNotBlank()) { val trimmed = resOrText.trim() - session.edits.firstOrNull { it.newValue.trim() == trimmed || it.originalValue.trim() == trimmed }?.let { - return it.key - } + session.edits.firstOrNull { it.newValue.trim() == trimmed || it.originalValue.trim() == trimmed } + ?.let { + return it.key + } liveOverrides.entries.firstOrNull { it.value.trim() == trimmed }?.let { return it.key.first } @@ -88,7 +89,10 @@ object TranslationManager { all.entries.firstOrNull { (_, map) -> map.values.any { v -> val cleanV = v.replace(Regex("%[0-9]*\\$?[a-zA-Z]"), "").trim() - cleanV.length >= 3 && (trimmed.contains(cleanV, ignoreCase = true) || cleanV.contains(trimmed, ignoreCase = true)) + cleanV.length >= 3 && (trimmed.contains( + cleanV, + ignoreCase = true + ) || cleanV.contains(trimmed, ignoreCase = true)) } }?.let { return it.key } } diff --git a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslatableCardContainer.kt b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslatableCardContainer.kt index 92aea2c62..637faa038 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslatableCardContainer.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslatableCardContainer.kt @@ -22,7 +22,6 @@ import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenu import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem import com.sameerasw.essentials.utils.HapticUtil -import kotlinx.coroutines.withTimeoutOrNull @Composable fun TranslatableCardContainer( diff --git a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationBottomSheet.kt index e1e27698f..5d67dc840 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationBottomSheet.kt @@ -11,9 +11,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem -import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton @@ -25,7 +23,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext @@ -62,7 +59,8 @@ fun TranslationBottomSheet( val sourceEnglish = translations["en"] ?: "" val originalTargetVal = translations[currentLocale] ?: "" - val currentDisplayVal = TranslationManager.getOverriddenText(stringKey, currentLocale, originalTargetVal) + val currentDisplayVal = + TranslationManager.getOverriddenText(stringKey, currentLocale, originalTargetVal) var inputText by remember { mutableStateOf(currentDisplayVal) } @@ -131,7 +129,9 @@ fun TranslationBottomSheet( OutlinedTextField( value = inputText, onValueChange = { inputText = it }, - modifier = Modifier.fillMaxWidth().padding(end = 8.dp), + modifier = Modifier + .fillMaxWidth() + .padding(end = 8.dp), placeholder = { Text("Enter translation in ${currentLocale.uppercase()}…") }, singleLine = false, maxLines = 4, diff --git a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationFocusOutline.kt b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationFocusOutline.kt index c71653c3c..ba7b38286 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationFocusOutline.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationFocusOutline.kt @@ -29,7 +29,9 @@ fun TranslationFocusOutline( modifier = modifier .border( width = borderWidth, - color = if (visible) MaterialTheme.colorScheme.tertiary else MaterialTheme.colorScheme.surface.copy(alpha = 0f), + color = if (visible) MaterialTheme.colorScheme.tertiary else MaterialTheme.colorScheme.surface.copy( + alpha = 0f + ), shape = RoundedCornerShape(8.dp) ) .padding(if (visible) 4.dp else 0.dp) diff --git a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationLongPressMenu.kt b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationLongPressMenu.kt index d898e2924..f5966ba32 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationLongPressMenu.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationLongPressMenu.kt @@ -38,7 +38,9 @@ fun TranslationLongPressMenu( // Info Header Entry with background matching SegmentedDropdownMenuItem SegmentedDropdownMenuItem( text = { - Column(modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp)) { + Column(modifier = Modifier + .fillMaxWidth() + .padding(vertical = 2.dp)) { Text( text = fullText, style = MaterialTheme.typography.bodySmall, diff --git a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationMenuItems.kt b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationMenuItems.kt index 261021423..80ec2f94b 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationMenuItems.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationMenuItems.kt @@ -51,7 +51,12 @@ fun TranslationMenuItems( val keyOpt = remember(option) { TranslationManager.resolveKey(context, option) } val labelOpt = remember(option) { when (option) { - is Int -> try { context.getString(option) } catch (e: Exception) { option.toString() } + is Int -> try { + context.getString(option) + } catch (e: Exception) { + option.toString() + } + is String -> option else -> option.toString() } @@ -70,7 +75,12 @@ fun TranslationMenuItems( } } - val hasAnyKey = keyTitle != null || keyDesc != null || options.any { TranslationManager.resolveKey(context, it) != null } + val hasAnyKey = keyTitle != null || keyDesc != null || options.any { + TranslationManager.resolveKey( + context, + it + ) != null + } if (!hasAnyKey) { SegmentedDropdownMenuItem( text = { Text("No string key found") }, diff --git a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationSessionSheet.kt b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationSessionSheet.kt index b30077ec7..76a8e4dde 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationSessionSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationSessionSheet.kt @@ -18,7 +18,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.ListItem -import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton @@ -64,7 +63,8 @@ fun TranslationSessionSheet( val gitHubRepository = remember { GitHubRepository() } val currentUser = remember { settingsRepository.getGitHubUser() } - val edits = remember { mutableStateListOf().apply { addAll(TranslationManager.session.edits) } } + val edits = + remember { mutableStateListOf().apply { addAll(TranslationManager.session.edits) } } var isSubmitting by remember { mutableStateOf(false) } var errorMessage by remember { mutableStateOf(null) } @@ -134,8 +134,12 @@ fun TranslationSessionSheet( errorMessage = null scope.launch { val jsonPayload = TranslationManager.session.toJsonPayload() - val commentBody = "Automated translation submission from Essentials app.\n\n```json\n$jsonPayload\n```" - Log.d("TranslationSessionSheet", "Posting submission comment for user: ${currentUser.login}") + val commentBody = + "Automated translation submission from Essentials app.\n\n```json\n$jsonPayload\n```" + Log.d( + "TranslationSessionSheet", + "Posting submission comment for user: ${currentUser.login}" + ) val success = gitHubRepository.addDiscussionComment( token = token, owner = "sameerasw", @@ -145,12 +149,19 @@ fun TranslationSessionSheet( ) isSubmitting = false if (success) { - Log.d("TranslationSessionSheet", "Discussion comment posted successfully") + Log.d( + "TranslationSessionSheet", + "Discussion comment posted successfully" + ) successSubmitted = true TranslationManager.discardSession() } else { - Log.e("TranslationSessionSheet", "Posting discussion comment failed") - errorMessage = context.getString(R.string.translation_submit_error) + Log.e( + "TranslationSessionSheet", + "Posting discussion comment failed" + ) + errorMessage = + context.getString(R.string.translation_submit_error) } } }, @@ -158,7 +169,9 @@ fun TranslationSessionSheet( ) { if (isSubmitting) { CircularProgressIndicator( - modifier = Modifier.height(16.dp).width(16.dp), + modifier = Modifier + .height(16.dp) + .width(16.dp), strokeWidth = 2.dp, color = MaterialTheme.colorScheme.onPrimary ) diff --git a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationWarningBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationWarningBottomSheet.kt index c5d2e8e13..78df9c2c7 100644 --- a/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationWarningBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/translation/ui/TranslationWarningBottomSheet.kt @@ -17,7 +17,6 @@ import androidx.compose.material3.Checkbox import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.ListItem -import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton @@ -121,7 +120,7 @@ fun TranslationWarningBottomSheet( ) }, - ) + ) ListItem( modifier = Modifier @@ -150,7 +149,7 @@ fun TranslationWarningBottomSheet( ) }, - ) + ) ListItem( modifier = Modifier @@ -179,7 +178,7 @@ fun TranslationWarningBottomSheet( ) }, - ) + ) } Row( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt index 9f550729a..9ac7f6c74 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/PrivateDnsSettingsActivity.kt @@ -5,7 +5,9 @@ import android.provider.Settings import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.background +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically +import androidx.compose.animation.shrinkVertically import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -47,11 +49,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.animation.AnimatedVisibility -import androidx.compose.animation.expandVertically -import androidx.compose.animation.shrinkVertically -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer import com.sameerasw.essentials.ui.theme.EssentialsTheme diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/TravelCompassActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/TravelCompassActivity.kt index 5087278c9..afc7b729a 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/TravelCompassActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/TravelCompassActivity.kt @@ -1,7 +1,7 @@ package com.sameerasw.essentials.ui.activities -import android.content.res.Configuration import android.content.Intent +import android.content.res.Configuration import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener @@ -565,7 +565,10 @@ private fun CompassScreen( androidx.compose.material3.OutlinedIconButton( onClick = { HapticUtil.performUIHaptic(view) - val intent = Intent(context, com.sameerasw.essentials.FeatureSettingsActivity::class.java).apply { + val intent = Intent( + context, + com.sameerasw.essentials.FeatureSettingsActivity::class.java + ).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP putExtra("feature", "Location reached") } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt index 6bf4a8e8e..37dfc5406 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt @@ -564,7 +564,9 @@ fun YourAndroidContent( horizontalArrangement = Arrangement.spacedBy(12.dp) ) { ImportExportButtons( - modifier = Modifier.wrapContentWidth().weight(1f), + modifier = Modifier + .wrapContentWidth() + .weight(1f), view = view, exportLauncher = exportLauncher, importLauncher = importLauncher, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/DeviceHeroCard.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/DeviceHeroCard.kt index 51e61ef5a..74637da97 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/DeviceHeroCard.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/DeviceHeroCard.kt @@ -315,7 +315,10 @@ fun DeviceHeroCard( val targetSmKey = storageMemoryTranslationKey if (targetSmKey != null) { val resolvedSmKey = remember(targetSmKey) { - com.sameerasw.essentials.translation.TranslationManager.resolveKey(context, targetSmKey) ?: targetSmKey + com.sameerasw.essentials.translation.TranslationManager.resolveKey( + context, + targetSmKey + ) ?: targetSmKey } com.sameerasw.essentials.translation.ui.TranslationBottomSheet( stringKey = resolvedSmKey, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryAppsTabContent.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryAppsTabContent.kt index 2657fc92c..230570984 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryAppsTabContent.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryAppsTabContent.kt @@ -1,32 +1,35 @@ package com.sameerasw.essentials.ui.components.battery +import android.view.View import androidx.compose.animation.AnimatedContent import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.ui.platform.LocalContext +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.asImageBitmap -import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -38,16 +41,8 @@ import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer import com.sameerasw.essentials.ui.theme.Shapes import com.sameerasw.essentials.utils.BatteryUsageApp import com.sameerasw.essentials.utils.HapticUtil -import android.view.View import java.util.Locale -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.layout.Box -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue - @OptIn(ExperimentalFoundationApi::class) @Composable fun BatteryAppsTabContent( @@ -153,9 +148,11 @@ fun BatteryAppsTabContent( val digits = s.replace("-", "").replace(Regex("[^0-9.]"), "") return digits.toDoubleOrNull() } + val oldVal = parseNum(initialState) val newVal = parseNum(targetState) - val isIncreasing = if (oldVal != null && newVal != null) newVal > oldVal else true + val isIncreasing = + if (oldVal != null && newVal != null) newVal > oldVal else true if (isIncreasing) { (slideInVertically { height -> -height } + fadeIn()) @@ -186,10 +183,16 @@ fun BatteryAppsTabContent( onClick = { showMenu = false try { - val intent = android.content.Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = android.net.Uri.fromParts("package", app.packageName, null) - addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK) - } + val intent = + android.content.Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + .apply { + data = android.net.Uri.fromParts( + "package", + app.packageName, + null + ) + addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK) + } context.startActivity(intent) } catch (_: Exception) { } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryCommonComponents.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryCommonComponents.kt index 1d9f1ccc8..f53590f51 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryCommonComponents.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryCommonComponents.kt @@ -7,7 +7,10 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -19,11 +22,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.Image -import androidx.compose.ui.graphics.asImageBitmap -import androidx.core.graphics.drawable.toBitmap import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ButtonGroupDefaults import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon @@ -39,25 +38,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Path -import androidx.compose.ui.graphics.PathEffect -import androidx.compose.ui.graphics.Brush -import androidx.compose.ui.graphics.drawscope.Stroke -import androidx.compose.ui.graphics.StrokeCap -import androidx.compose.foundation.Canvas +import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp +import androidx.core.graphics.drawable.toBitmap import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.theme.Shapes import com.sameerasw.essentials.utils.HapticUtil -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.combinedClickable -import androidx.compose.material3.Card -import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer import java.util.Locale @OptIn(ExperimentalFoundationApi::class) @@ -113,7 +103,10 @@ fun SectionHeaderTitle( val keyForSheet1 = translationSheetKey if (keyForSheet1 != null) { val resolvedKey = remember(keyForSheet1) { - com.sameerasw.essentials.translation.TranslationManager.resolveKey(context, keyForSheet1) ?: keyForSheet1 + com.sameerasw.essentials.translation.TranslationManager.resolveKey( + context, + keyForSheet1 + ) ?: keyForSheet1 } com.sameerasw.essentials.translation.ui.TranslationBottomSheet( stringKey = resolvedKey, @@ -188,9 +181,11 @@ fun InfoDetailRow( val digits = s.replace("-", "").replace(Regex("[^0-9.]"), "") return digits.toDoubleOrNull() } + val oldVal = parseNum(initialState) val newVal = parseNum(targetState) - val isIncreasing = if (oldVal != null && newVal != null) newVal > oldVal else true + val isIncreasing = + if (oldVal != null && newVal != null) newVal > oldVal else true if (isIncreasing) { (slideInVertically { height -> -height } + fadeIn()) @@ -228,7 +223,10 @@ fun InfoDetailRow( val keyForSheet2 = translationSheetKey if (keyForSheet2 != null) { val resolvedKey = remember(keyForSheet2) { - com.sameerasw.essentials.translation.TranslationManager.resolveKey(context, keyForSheet2) ?: keyForSheet2 + com.sameerasw.essentials.translation.TranslationManager.resolveKey( + context, + keyForSheet2 + ) ?: keyForSheet2 } com.sameerasw.essentials.translation.ui.TranslationBottomSheet( stringKey = resolvedKey, @@ -296,7 +294,10 @@ fun TopAppsBreakdownHeader( androidx.compose.runtime.LaunchedEffect(app.packageName) { if (app.packageName != null) { - com.sameerasw.essentials.utils.AppUtil.getAppBrandColor(context, app.packageName) { argb -> + com.sameerasw.essentials.utils.AppUtil.getAppBrandColor( + context, + app.packageName + ) { argb -> if (argb != android.graphics.Color.TRANSPARENT && argb != android.graphics.Color.GRAY) { brandColor = Color(argb) } @@ -322,7 +323,8 @@ fun TopAppsBreakdownHeader( contentAlignment = Alignment.Center ) { if (app.icon != null) { - val bitmap = remember(app.icon) { app.icon.toBitmap(48, 48).asImageBitmap() } + val bitmap = + remember(app.icon) { app.icon.toBitmap(48, 48).asImageBitmap() } Image( bitmap = bitmap, contentDescription = null, @@ -341,7 +343,8 @@ fun TopAppsBreakdownHeader( if (hasOther) { val otherWeight = ((otherMah / totalAllMah) * 100.0).toFloat().coerceAtLeast(1f) - val otherShape = if (majorApps.isEmpty()) CircleShape else ButtonGroupDefaults.connectedTrailingButtonShapes().shape + val otherShape = + if (majorApps.isEmpty()) CircleShape else ButtonGroupDefaults.connectedTrailingButtonShapes().shape Box( modifier = Modifier .weight(otherWeight) @@ -365,13 +368,24 @@ fun BatteryUsageBreakdownHeader( val safeSystem = systemPct.coerceIn(0f, 100f) val safeOther = otherPct.coerceIn(0f, 100f) - val animatedAppsWeight by animateFloatAsState(targetValue = safeApps.coerceAtLeast(1f), label = "apps_weight") - val animatedSystemWeight by animateFloatAsState(targetValue = safeSystem.coerceAtLeast(1f), label = "system_weight") - val animatedOtherWeight by animateFloatAsState(targetValue = safeOther.coerceAtLeast(1f), label = "other_weight") + val animatedAppsWeight by animateFloatAsState( + targetValue = safeApps.coerceAtLeast(1f), + label = "apps_weight" + ) + val animatedSystemWeight by animateFloatAsState( + targetValue = safeSystem.coerceAtLeast(1f), + label = "system_weight" + ) + val animatedOtherWeight by animateFloatAsState( + targetValue = safeOther.coerceAtLeast(1f), + label = "other_weight" + ) // Colors: Only selected tab gets Primary accent color, all unselected sections use outlineVariant - val appsColor = if (activeTab == 1) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outlineVariant - val systemColor = if (activeTab == 2) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outlineVariant + val appsColor = + if (activeTab == 1) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outlineVariant + val systemColor = + if (activeTab == 2) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outlineVariant val otherColor = MaterialTheme.colorScheme.outlineVariant Column( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryInfoTabContent.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryInfoTabContent.kt index bbdcbcb29..92baac24b 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryInfoTabContent.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatteryInfoTabContent.kt @@ -21,6 +21,10 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -31,18 +35,14 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.sameerasw.essentials.R +import com.sameerasw.essentials.data.repository.SettingsRepository +import com.sameerasw.essentials.ui.components.buttons.ListExpandToggleButton import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer +import com.sameerasw.essentials.ui.components.pickers.MultiSegmentedPicker import com.sameerasw.essentials.ui.theme.Shapes import com.sameerasw.essentials.utils.BatteryDetails import com.sameerasw.essentials.utils.BatteryInfoUtil import com.sameerasw.essentials.utils.ThermalInfo -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import com.sameerasw.essentials.data.repository.SettingsRepository -import com.sameerasw.essentials.ui.components.buttons.ListExpandToggleButton -import com.sameerasw.essentials.ui.components.pickers.MultiSegmentedPicker import java.util.Locale @Composable @@ -115,7 +115,11 @@ fun BatteryInfoTabContent( ) InfoDetailRow( title = R.string.label_battery_temperature, - value = String.format(LocalLocale.current.platformLocale, "%.1f °C", batteryDetails.temperature / 10.0f), + value = String.format( + LocalLocale.current.platformLocale, + "%.1f °C", + batteryDetails.temperature / 10.0f + ), iconRes = R.drawable.rounded_device_thermostat_24 ) @@ -300,8 +304,10 @@ fun BatteryInfoTabContent( } // Average Remaining calculation (Current Charge / Average Current) - val chargeCounterMah = batteryDetails.chargeCounter?.let { if (it > 10000) it / 1000 else it } - val avgCurrentMa = batteryDetails.currentAvgMa?.let { kotlin.math.abs(it) }?.takeIf { it > 0 } + val chargeCounterMah = + batteryDetails.chargeCounter?.let { if (it > 10000) it / 1000 else it } + val avgCurrentMa = + batteryDetails.currentAvgMa?.let { kotlin.math.abs(it) }?.takeIf { it > 0 } if (chargeCounterMah != null && chargeCounterMah > 0 && avgCurrentMa != null) { val remainingHours = chargeCounterMah.toDouble() / avgCurrentMa.toDouble() val formattedRemaining = if (remainingHours >= 1.0) { @@ -466,8 +472,14 @@ fun BatteryInfoTabContent( enableAdaptive = newSelection.contains("adaptive") enableLimit = newSelection.contains("limit") - settingsRepository.putBoolean("charge_opt_toggle_deactivated", enableDeactivated) - settingsRepository.putBoolean("charge_opt_toggle_adaptive", enableAdaptive) + settingsRepository.putBoolean( + "charge_opt_toggle_deactivated", + enableDeactivated + ) + settingsRepository.putBoolean( + "charge_opt_toggle_adaptive", + enableAdaptive + ) settingsRepository.putBoolean("charge_opt_toggle_limit", enableLimit) } }, @@ -485,7 +497,10 @@ fun BatteryInfoTabContent( } } - val isShellAvailableForReset = com.sameerasw.essentials.utils.ShellUtils.isAvailable(context) && com.sameerasw.essentials.utils.ShellUtils.hasPermission(context) + val isShellAvailableForReset = + com.sameerasw.essentials.utils.ShellUtils.isAvailable(context) && com.sameerasw.essentials.utils.ShellUtils.hasPermission( + context + ) if (isShellAvailableForReset) { RoundedCardContainer(modifier = Modifier.fillMaxWidth()) { Column( @@ -524,26 +539,29 @@ fun BatteryInfoTabContent( } } - var autoResetEnabled by remember { - mutableStateOf(settingsRepository.getBoolean("auto_reset_battery_stats", false)) - } - com.sameerasw.essentials.ui.components.cards.IconToggleItem( - title = stringResource(R.string.label_auto_reset_battery_stats_title), - description = stringResource(R.string.label_auto_reset_battery_stats_desc), - isChecked = autoResetEnabled, - onCheckedChange = { isChecked -> - autoResetEnabled = isChecked - settingsRepository.putBoolean("auto_reset_battery_stats", isChecked) - }, - iconRes = R.drawable.rounded_cycle_24 - ) + var autoResetEnabled by remember { + mutableStateOf(settingsRepository.getBoolean("auto_reset_battery_stats", false)) + } + com.sameerasw.essentials.ui.components.cards.IconToggleItem( + title = stringResource(R.string.label_auto_reset_battery_stats_title), + description = stringResource(R.string.label_auto_reset_battery_stats_desc), + isChecked = autoResetEnabled, + onCheckedChange = { isChecked -> + autoResetEnabled = isChecked + settingsRepository.putBoolean("auto_reset_battery_stats", isChecked) + }, + iconRes = R.drawable.rounded_cycle_24 + ) } } } // Permission Grant Card at the very bottom if BATTERY_STATS permission is missing AND Shizuku/Root is available & permitted val hasStatsPerm = BatteryInfoUtil.hasBatteryStatsPermission(context) - val isShellAvailable = com.sameerasw.essentials.utils.ShellUtils.isAvailable(context) && com.sameerasw.essentials.utils.ShellUtils.hasPermission(context) + val isShellAvailable = + com.sameerasw.essentials.utils.ShellUtils.isAvailable(context) && com.sameerasw.essentials.utils.ShellUtils.hasPermission( + context + ) if (!hasStatsPerm && batteryDetails.stateOfHealth == null && batteryDetails.cycleCount == null && android.os.Build.VERSION.SDK_INT >= 34 && isShellAvailable) { RoundedCardContainer(modifier = Modifier.fillMaxWidth()) { Column( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatterySystemTabContent.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatterySystemTabContent.kt index 6a32c3619..bc5fad976 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatterySystemTabContent.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/battery/BatterySystemTabContent.kt @@ -1,22 +1,17 @@ package com.sameerasw.essentials.ui.components.battery import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import com.sameerasw.essentials.R -import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer -import com.sameerasw.essentials.utils.CpuWakeupItem - import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.components.buttons.ListExpandToggleButton +import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer +import com.sameerasw.essentials.utils.CpuWakeupItem import java.util.Locale @Composable @@ -37,7 +32,8 @@ fun BatterySystemTabContent( "screen.on", "ambient.on", "audio", "video", "camera.avg", "camera.flashlight", "cpu.active", "cpu.idle", "cpu.suspend" ) - val totalMa = activeKeys.mapNotNull { powerProfile[it]?.toDoubleOrNull() }.sum().coerceAtLeast(0.0001) + val totalMa = activeKeys.mapNotNull { powerProfile[it]?.toDoubleOrNull() }.sum() + .coerceAtLeast(0.0001) fun formatProfileValue(raw: String): String { val num = raw.toDoubleOrNull() ?: return "$raw mA" @@ -51,34 +47,84 @@ fun BatterySystemTabContent( RoundedCardContainer(modifier = Modifier.fillMaxWidth()) { powerProfile["screen.on"]?.let { - InfoDetailRow(title = stringResource(R.string.label_screen_on_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_mobile_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_screen_on_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_mobile_24, + onClick = onToggleUnit + ) } powerProfile["screen.full"]?.let { - InfoDetailRow(title = stringResource(R.string.label_screen_max_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_mobile_charge_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_screen_max_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_mobile_charge_24, + onClick = onToggleUnit + ) } powerProfile["ambient.on"]?.let { - InfoDetailRow(title = stringResource(R.string.label_ambient_aod_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_mobile_screensaver_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_ambient_aod_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_mobile_screensaver_24, + onClick = onToggleUnit + ) } powerProfile["audio"]?.let { - InfoDetailRow(title = stringResource(R.string.label_audio_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_sound_detection_loud_sound_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_audio_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_sound_detection_loud_sound_24, + onClick = onToggleUnit + ) } powerProfile["video"]?.let { - InfoDetailRow(title = stringResource(R.string.label_video_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_slow_motion_video_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_video_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_slow_motion_video_24, + onClick = onToggleUnit + ) } powerProfile["camera.avg"]?.let { - InfoDetailRow(title = stringResource(R.string.label_camera_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_camera_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_camera_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_camera_24, + onClick = onToggleUnit + ) } powerProfile["camera.flashlight"]?.let { - InfoDetailRow(title = stringResource(R.string.label_flashlight_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_flashlight_on_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_flashlight_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_flashlight_on_24, + onClick = onToggleUnit + ) } powerProfile["cpu.active"]?.let { - InfoDetailRow(title = stringResource(R.string.label_cpu_active_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_motion_play_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_cpu_active_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_motion_play_24, + onClick = onToggleUnit + ) } powerProfile["cpu.idle"]?.let { - InfoDetailRow(title = stringResource(R.string.label_cpu_idle_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_motion_photos_paused_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_cpu_idle_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_motion_photos_paused_24, + onClick = onToggleUnit + ) } powerProfile["cpu.suspend"]?.let { - InfoDetailRow(title = stringResource(R.string.label_cpu_suspend_drain), value = formatProfileValue(it), iconRes = R.drawable.rounded_stop_circle_24, onClick = onToggleUnit) + InfoDetailRow( + title = stringResource(R.string.label_cpu_suspend_drain), + value = formatProfileValue(it), + iconRes = R.drawable.rounded_stop_circle_24, + onClick = onToggleUnit + ) } } } diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/buttons/ListExpandToggleButton.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/buttons/ListExpandToggleButton.kt index 4ce7aaa94..e8143e09b 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/buttons/ListExpandToggleButton.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/buttons/ListExpandToggleButton.kt @@ -1,6 +1,9 @@ package com.sameerasw.essentials.ui.components.buttons import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -14,27 +17,22 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.res.stringResource import com.sameerasw.essentials.R -import com.sameerasw.essentials.ui.theme.Shapes -import com.sameerasw.essentials.utils.HapticUtil - -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.layout.Box -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.translation.ui.TranslationBottomSheet import com.sameerasw.essentials.translation.ui.TranslationMenuItems import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenu +import com.sameerasw.essentials.utils.HapticUtil @OptIn(ExperimentalFoundationApi::class) @Composable diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/AppToggleItem.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/AppToggleItem.kt index d6457eaf6..9b99de08d 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/AppToggleItem.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/AppToggleItem.kt @@ -32,7 +32,6 @@ import com.sameerasw.essentials.R import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.translation.ui.TranslationBottomSheet import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenu -import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem import com.sameerasw.essentials.utils.HapticUtil private val GOOGLE_SYSTEM_USER_APPS = setOf( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/BatteryInfoCard.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/BatteryInfoCard.kt index 0aa4d2037..f9b7e46bf 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/BatteryInfoCard.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/BatteryInfoCard.kt @@ -7,7 +7,6 @@ import android.content.IntentFilter import android.os.BatteryManager import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -35,7 +34,6 @@ import androidx.compose.ui.unit.dp import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.components.sheets.BatteryDetailsBottomSheet import com.sameerasw.essentials.ui.theme.Shapes -import com.sameerasw.essentials.utils.BatteryDetails import com.sameerasw.essentials.utils.BatteryInfoUtil import com.sameerasw.essentials.utils.DeviceUtils import com.sameerasw.essentials.utils.HapticUtil @@ -175,7 +173,8 @@ fun BatteryInfoCard( val targetKey = translationSheetKey if (targetKey != null) { val resolvedKey = remember(targetKey) { - com.sameerasw.essentials.translation.TranslationManager.resolveKey(context, targetKey) ?: targetKey + com.sameerasw.essentials.translation.TranslationManager.resolveKey(context, targetKey) + ?: targetKey } com.sameerasw.essentials.translation.ui.TranslationBottomSheet( stringKey = resolvedKey, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/ConfigPickerItem.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/ConfigPickerItem.kt index b03ec4132..a69632b76 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/ConfigPickerItem.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/ConfigPickerItem.kt @@ -26,12 +26,10 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.sameerasw.essentials.R import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.translation.ui.TranslationBottomSheet import com.sameerasw.essentials.ui.components.menus.LocalDropdownMenuDismiss import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenu -import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem import com.sameerasw.essentials.utils.HapticUtil @OptIn(ExperimentalMaterial3ExpressiveApi::class) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/FeatureCard.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/FeatureCard.kt index 9864c7549..f346a50c9 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/FeatureCard.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/FeatureCard.kt @@ -9,7 +9,9 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -30,15 +32,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.blur +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.offset -import androidx.compose.ui.graphics.toArgb import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenu import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem @@ -174,22 +174,25 @@ fun FeatureCard( containerColor = MaterialTheme.colorScheme.error, contentColor = MaterialTheme.colorScheme.onError ) { - val composition by com.airbnb.lottie.compose.rememberLottieComposition(com.airbnb.lottie.compose.LottieCompositionSpec.RawRes(R.raw.update_motion)) + val composition by com.airbnb.lottie.compose.rememberLottieComposition( + com.airbnb.lottie.compose.LottieCompositionSpec.RawRes(R.raw.update_motion) + ) val progress by com.airbnb.lottie.compose.animateLottieCompositionAsState( composition = composition, iterations = com.airbnb.lottie.compose.LottieConstants.IterateForever ) val onErrorColor = MaterialTheme.colorScheme.onError - val dynamicProperties = com.airbnb.lottie.compose.rememberLottieDynamicProperties( - com.airbnb.lottie.compose.rememberLottieDynamicProperty( - property = com.airbnb.lottie.LottieProperty.COLOR_FILTER, - value = android.graphics.PorterDuffColorFilter( - onErrorColor.toArgb(), - android.graphics.PorterDuff.Mode.SRC_ATOP - ), - keyPath = arrayOf("**") + val dynamicProperties = + com.airbnb.lottie.compose.rememberLottieDynamicProperties( + com.airbnb.lottie.compose.rememberLottieDynamicProperty( + property = com.airbnb.lottie.LottieProperty.COLOR_FILTER, + value = android.graphics.PorterDuffColorFilter( + onErrorColor.toArgb(), + android.graphics.PorterDuff.Mode.SRC_ATOP + ), + keyPath = arrayOf("**") + ) ) - ) com.airbnb.lottie.compose.LottieAnimation( composition = composition, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/IconToggleItem.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/IconToggleItem.kt index 274e0bb50..f26a074d6 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/IconToggleItem.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/IconToggleItem.kt @@ -25,11 +25,9 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.sameerasw.essentials.R import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.translation.ui.TranslationBottomSheet import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenu -import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem import com.sameerasw.essentials.utils.HapticUtil @OptIn(ExperimentalMaterial3ExpressiveApi::class) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/PermissionCard.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/PermissionCard.kt index 1e713d861..0df48f878 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/cards/PermissionCard.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/cards/PermissionCard.kt @@ -173,9 +173,20 @@ fun PermissionCard( onDismissRequest = { showMenu = false } ) { val context = LocalContext.current - val keyTitle = remember(title) { TranslationManager.resolveKey(context, title) } - val keyDesc = remember(description) { TranslationManager.resolveKey(context, description) } - val keyInst = remember(instructions) { TranslationManager.resolveKey(context, instructions) } + val keyTitle = + remember(title) { TranslationManager.resolveKey(context, title) } + val keyDesc = remember(description) { + TranslationManager.resolveKey( + context, + description + ) + } + val keyInst = remember(instructions) { + TranslationManager.resolveKey( + context, + instructions + ) + } if (keyTitle != null) { SegmentedDropdownMenuItem( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt index 046dccc12..edefe9363 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/linkActions/LinkPickerAdapter.kt @@ -9,18 +9,20 @@ import android.content.pm.PackageManager import android.net.Uri import android.util.Log import android.widget.Toast -import androidx.compose.animation.core.animateDpAsState -import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.RoundedCornerShape @@ -31,15 +33,10 @@ import androidx.compose.material3.FilledIconButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.NavigationBar -import androidx.compose.material3.NavigationBarDefaults -import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.TextField import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -50,33 +47,22 @@ import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.hapticfeedback.HapticFeedbackType -import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.asPaddingValues -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.statusBars -import androidx.compose.material3.TextField import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import androidx.compose.ui.zIndex import androidx.core.content.edit import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.components.EssentialsFloatingToolbar import com.sameerasw.essentials.ui.components.ToolbarItem import com.sameerasw.essentials.ui.modifiers.BlurDirection import com.sameerasw.essentials.ui.modifiers.progressiveBlur -import com.sameerasw.essentials.ui.components.ReusableTopAppBar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch @@ -167,7 +153,11 @@ fun LinkPickerScreen( val statusBarHeight = WindowInsets.statusBars.asPaddingValues().calculateTopPadding() val density = LocalDensity.current - var cardHeightPx by androidx.compose.runtime.remember { androidx.compose.runtime.mutableStateOf(0) } + var cardHeightPx by androidx.compose.runtime.remember { + androidx.compose.runtime.mutableStateOf( + 0 + ) + } val listTopPadding = with(density) { statusBarHeight + 16.dp + cardHeightPx.toDp() + 16.dp } val topBlurHeightPx = with(density) { (statusBarHeight * 1.15f).toPx() } @@ -244,7 +234,10 @@ fun LinkPickerScreen( modifier = Modifier .align(Alignment.BottomCenter) .fillMaxWidth() - .padding(bottom = WindowInsets.navigationBars.asPaddingValues().calculateBottomPadding() + 84.dp, start = 16.dp, end = 16.dp) + .padding( + bottom = WindowInsets.navigationBars.asPaddingValues() + .calculateBottomPadding() + 84.dp, start = 16.dp, end = 16.dp + ) .onGloballyPositioned { coordinates -> cardHeightPx = coordinates.size.height }, @@ -275,7 +268,11 @@ fun LinkPickerScreen( ) ) Toast - .makeText(context, "Link copied to clipboard", Toast.LENGTH_SHORT) + .makeText( + context, + "Link copied to clipboard", + Toast.LENGTH_SHORT + ) .show() haptic.performHapticFeedback(HapticFeedbackType.LongPress) }, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/DefaultTabPicker.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/DefaultTabPicker.kt index 316e238f4..d4f19e7a3 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/DefaultTabPicker.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/DefaultTabPicker.kt @@ -62,7 +62,8 @@ fun DefaultTabPicker( } } else null - val optionTitleRes = options.map { if (it == DIYTabs.FREEZE) R.string.tab_freeze_title else it.title } + val optionTitleRes = + options.map { if (it == DIYTabs.FREEZE) R.string.tab_freeze_title else it.title } Column( modifier = modifier diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/MultiSegmentedPicker.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/MultiSegmentedPicker.kt index 0264d5b82..3e90b2d87 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/MultiSegmentedPicker.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/pickers/MultiSegmentedPicker.kt @@ -2,9 +2,6 @@ package com.sameerasw.essentials.ui.components.pickers import androidx.compose.foundation.background import androidx.compose.foundation.basicMarquee -import androidx.compose.ui.res.dimensionResource -import androidx.compose.ui.unit.sp -import com.sameerasw.essentials.R import androidx.compose.foundation.gestures.awaitEachGesture import androidx.compose.foundation.gestures.awaitFirstDown import androidx.compose.foundation.layout.Arrangement @@ -28,10 +25,13 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.input.pointer.PointerEventPass import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.role import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.sameerasw.essentials.R import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.translation.ui.TranslationBottomSheet import com.sameerasw.essentials.translation.ui.TranslationMenuItems diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt index 54527c9d0..b530092b9 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AddRepoBottomSheet.kt @@ -21,7 +21,6 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.RadioButton diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AppSelectionSheets.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AppSelectionSheets.kt index 00c503779..e239875e3 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AppSelectionSheets.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/AppSelectionSheets.kt @@ -20,7 +20,6 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Switch diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BatteryDetailsBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BatteryDetailsBottomSheet.kt index 3ef636914..0ebb06363 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BatteryDetailsBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BatteryDetailsBottomSheet.kt @@ -1,10 +1,8 @@ package com.sameerasw.essentials.ui.components.sheets import androidx.compose.animation.animateContentSize -import androidx.compose.foundation.background -import androidx.compose.foundation.basicMarquee +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -13,18 +11,13 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width -import androidx.compose.foundation.ExperimentalFoundationApi -import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.ButtonGroupDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text -import androidx.compose.material3.ToggleButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect @@ -38,32 +31,29 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.Role -import androidx.compose.ui.semantics.role -import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.components.battery.BatteryAppsTabContent import com.sameerasw.essentials.ui.components.battery.BatteryInfoTabContent import com.sameerasw.essentials.ui.components.battery.BatterySystemTabContent import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer -import com.sameerasw.essentials.ui.theme.Shapes import com.sameerasw.essentials.utils.BatteryDetails import com.sameerasw.essentials.utils.BatteryInfoUtil import com.sameerasw.essentials.utils.BatteryStatsUtil import com.sameerasw.essentials.utils.BatteryUsageApp import com.sameerasw.essentials.utils.CpuWakeupItem import com.sameerasw.essentials.utils.DeviceUtils -import com.sameerasw.essentials.utils.HapticUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class, ExperimentalFoundationApi::class) +@OptIn( + ExperimentalMaterial3Api::class, + ExperimentalMaterial3ExpressiveApi::class, + ExperimentalFoundationApi::class +) @Composable fun BatteryDetailsBottomSheet( initialDetails: BatteryDetails, @@ -182,7 +172,8 @@ fun BatteryDetailsBottomSheet( ) { val totalAppsMah = remember(usageApps) { usageApps.sumOf { it.powerMah } } val systemDrainMa = remember(batteryDetails.powerProfile) { - batteryDetails.powerProfile?.values?.mapNotNull { it.toDoubleOrNull() }?.sum() ?: 0.0 + batteryDetails.powerProfile?.values?.mapNotNull { it.toDoubleOrNull() }?.sum() + ?: 0.0 } // Estimate breakdown percentages (Apps vs System vs Other) @@ -214,8 +205,13 @@ fun BatteryDetailsBottomSheet( R.font.google_sans_flex, variationSettings = androidx.compose.ui.text.font.FontVariation.Settings( androidx.compose.ui.text.font.FontVariation.width(150f), - androidx.compose.ui.text.font.FontVariation.weight(FontWeight.Normal.weight), - androidx.compose.ui.text.font.FontVariation.Setting("ROND", 100f) + androidx.compose.ui.text.font.FontVariation.weight( + FontWeight.Normal.weight + ), + androidx.compose.ui.text.font.FontVariation.Setting( + "ROND", + 100f + ) ) ) ) @@ -236,7 +232,7 @@ fun BatteryDetailsBottomSheet( ) } - RoundedCardContainer{ + RoundedCardContainer { com.sameerasw.essentials.ui.components.pickers.SegmentedPicker( items = tabResIds, selectedItem = tabResIds[selectedTab], @@ -249,7 +245,10 @@ fun BatteryDetailsBottomSheet( val targetTabKey = tabTranslationSheetKey if (targetTabKey != null) { val resolvedTabKey = remember(targetTabKey) { - com.sameerasw.essentials.translation.TranslationManager.resolveKey(context, targetTabKey) ?: targetTabKey + com.sameerasw.essentials.translation.TranslationManager.resolveKey( + context, + targetTabKey + ) ?: targetTabKey } com.sameerasw.essentials.translation.ui.TranslationBottomSheet( stringKey = resolvedTabKey, @@ -266,6 +265,7 @@ fun BatteryDetailsBottomSheet( batteryDetails = BatteryInfoUtil.fetchAdvancedDetails(context, freshBasic) } ) + 1 -> BatteryAppsTabContent( isLoadingAdvanced = isLoadingAdvanced, usageApps = usageApps, @@ -279,6 +279,7 @@ fun BatteryDetailsBottomSheet( avgCurrentMa = batteryDetails.currentAvgMa, isPlugged = batteryDetails.plugged > 0 ) + 2 -> BatterySystemTabContent( isLoadingAdvanced = isLoadingAdvanced, powerProfile = batteryDetails.powerProfile, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt index 1984f6abd..542e9d4ed 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/BugReportBottomSheet.kt @@ -20,7 +20,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ColorPickerBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ColorPickerBottomSheet.kt index da79a02af..a7b936d6e 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ColorPickerBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ColorPickerBottomSheet.kt @@ -17,7 +17,6 @@ import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon import androidx.compose.material3.MaterialShapes import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Surface import androidx.compose.material3.Text diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt index f1e906c3f..96a43233c 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DeviceEffectsSettingsSheet.kt @@ -21,7 +21,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt index 57418e135..47ab172f1 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/DimWallpaperSettingsSheet.kt @@ -18,7 +18,6 @@ import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EditWatermarkSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EditWatermarkSheet.kt index ff90a8a8c..70189627e 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EditWatermarkSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EditWatermarkSheet.kt @@ -19,7 +19,6 @@ import androidx.compose.material3.DatePickerDialog import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EssentialsBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EssentialsBottomSheet.kt index f05829c20..632caf617 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EssentialsBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/EssentialsBottomSheet.kt @@ -2,10 +2,13 @@ package com.sameerasw.essentials.ui.components.sheets import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBars -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.layout.windowInsetsBottomHeight +import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet @@ -14,15 +17,6 @@ import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp - -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.windowInsetsBottomHeight - -import androidx.compose.foundation.layout.statusBarsPadding - -import androidx.compose.material3.BottomSheetDefaults @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ExifSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ExifSettingsSheet.kt index a3c107124..78cb94d6f 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ExifSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ExifSettingsSheet.kt @@ -6,7 +6,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt index 24a7b6b6b..b6a390496 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/FeatureHelpBottomSheet.kt @@ -18,7 +18,6 @@ import androidx.compose.material3.AssistChipDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/GitHubAuthSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/GitHubAuthSheet.kt index 327ac5c18..6085a4b4b 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/GitHubAuthSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/GitHubAuthSheet.kt @@ -14,7 +14,6 @@ import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.Icon import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ImportConfigConfirmationSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ImportConfigConfirmationSheet.kt index 0029eae0a..5d83fe0c5 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ImportConfigConfirmationSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ImportConfigConfirmationSheet.kt @@ -8,10 +8,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/InstructionsBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/InstructionsBottomSheet.kt index 5ebcdf9c4..ac4cc8098 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/InstructionsBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/InstructionsBottomSheet.kt @@ -16,7 +16,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/LocationReachedBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/LocationReachedBottomSheet.kt index e97549024..a89dde48e 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/LocationReachedBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/LocationReachedBottomSheet.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi @@ -18,12 +17,10 @@ import androidx.compose.material3.IconButton import androidx.compose.material3.IconButtonDefaults import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Slider import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt index cd632d690..c37d02198 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/NewAutomationSheet.kt @@ -13,11 +13,9 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedIconButton import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PermissionsBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PermissionsBottomSheet.kt index 20eaf1c0d..a8ea74d8e 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PermissionsBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PermissionsBottomSheet.kt @@ -7,7 +7,6 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PrankBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PrankBottomSheet.kt index 839fc090f..e57a987bf 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PrankBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/PrankBottomSheet.kt @@ -11,7 +11,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.SheetState import androidx.compose.material3.Text import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ScreenOffSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ScreenOffSettingsSheet.kt index 685972400..6a3466297 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ScreenOffSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ScreenOffSettingsSheet.kt @@ -15,7 +15,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ShutUpPerAppSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ShutUpPerAppSettingsSheet.kt index 4aa4f729a..73715070d 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ShutUpPerAppSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/ShutUpPerAppSettingsSheet.kt @@ -15,7 +15,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberModalBottomSheetState diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt index 805430df5..dc2ff53e8 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SoundModeSettingsSheet.kt @@ -19,7 +19,6 @@ import androidx.compose.material3.CardDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SweepShapesBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SweepShapesBottomSheet.kt index 68d9d3a6f..1de4f708a 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SweepShapesBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/SweepShapesBottomSheet.kt @@ -17,7 +17,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/TimeSelectionSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/TimeSelectionSheet.kt index 9695182fd..2dc0b4033 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/TimeSelectionSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/TimeSelectionSheet.kt @@ -15,7 +15,6 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TimePicker diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UnsupportedFeaturesConfirmationSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UnsupportedFeaturesConfirmationSheet.kt index a84dc5801..4af5a6eda 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UnsupportedFeaturesConfirmationSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UnsupportedFeaturesConfirmationSheet.kt @@ -8,7 +8,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt index 251eeda1e..1fc4f8b28 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/UpdateBottomSheet.kt @@ -16,19 +16,17 @@ import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.Icon +import androidx.compose.material3.LinearWavyProgressIndicator import androidx.compose.material3.ListItem import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.LoadingIndicator import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.material3.LinearProgressIndicator -import androidx.compose.material3.LinearWavyProgressIndicator import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf @@ -246,7 +244,10 @@ fun UpdateBottomSheet( ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = stringResource(R.string.downloading_update_progress, downloadProgress), + text = stringResource( + R.string.downloading_update_progress, + downloadProgress + ), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -258,7 +259,10 @@ fun UpdateBottomSheet( isDownloading = true val helper = AutoUpdateManagerHelper(context) coroutineScope.launch { - val cleanVersion = updateInfo.versionName.replace(Regex("[^a-zA-Z0-9]"), "_") + val cleanVersion = updateInfo.versionName.replace( + Regex("[^a-zA-Z0-9]"), + "_" + ) helper.downloadAndInstallApk( apkUrl = updateInfo.downloadUrl, apkName = "Essentials_$cleanVersion", diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WatchInstallHelpBottomSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WatchInstallHelpBottomSheet.kt index 61a85982d..c71f9b040 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WatchInstallHelpBottomSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WatchInstallHelpBottomSheet.kt @@ -19,7 +19,6 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WifiNetworkSelectionSheet.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WifiNetworkSelectionSheet.kt index 230922a56..ee3e31432 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WifiNetworkSelectionSheet.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sheets/WifiNetworkSelectionSheet.kt @@ -4,7 +4,6 @@ import android.Manifest import android.content.pm.PackageManager import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -20,8 +19,6 @@ import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon -import androidx.compose.material3.ListItem -import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedButton @@ -35,7 +32,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.painterResource diff --git a/app/src/main/java/com/sameerasw/essentials/ui/components/sliders/ConfigSliderItem.kt b/app/src/main/java/com/sameerasw/essentials/ui/components/sliders/ConfigSliderItem.kt index bfec91624..3adf64cec 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/components/sliders/ConfigSliderItem.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/components/sliders/ConfigSliderItem.kt @@ -30,7 +30,6 @@ import com.sameerasw.essentials.R import com.sameerasw.essentials.translation.TranslationManager import com.sameerasw.essentials.translation.ui.TranslationBottomSheet import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenu -import com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem import com.sameerasw.essentials.utils.HapticUtil import java.math.BigDecimal import java.math.RoundingMode diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt index 3818acefc..044d8f012 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/SetupFeatures.kt @@ -203,7 +203,8 @@ fun SetupFeatures( ) } - val watchViewModel: com.sameerasw.essentials.viewmodels.WatchViewModel = androidx.lifecycle.viewmodel.compose.viewModel() + val watchViewModel: com.sameerasw.essentials.viewmodels.WatchViewModel = + androidx.lifecycle.viewmodel.compose.viewModel() val isWearUpdateRequired = watchViewModel.isWearUpdateRequired.value LaunchedEffect(Unit) { diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/BatteryNotificationSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/BatteryNotificationSettingsUI.kt index 65bb2d1a0..ca43c3d2d 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/BatteryNotificationSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/BatteryNotificationSettingsUI.kt @@ -5,7 +5,6 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/NotificationSnoozingSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/NotificationSnoozingSettingsUI.kt index 89dd8ef76..38d70d30e 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/NotificationSnoozingSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/NotificationSnoozingSettingsUI.kt @@ -12,7 +12,6 @@ import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext @@ -110,7 +109,11 @@ fun NotificationSnoozingSettingsUI( if (index < options.size) { options[index] = newVal.toInt() } - viewModel.saveNotificationSnoozeOptions(context, snoozeDefault, options) + viewModel.saveNotificationSnoozeOptions( + context, + snoozeDefault, + options + ) HapticUtil.performSliderHaptic(view) }, valueRange = 10f..1440f, @@ -130,7 +133,11 @@ fun NotificationSnoozingSettingsUI( onClick = { viewModel.resetNotificationSnoozeOptions(context) HapticUtil.performUIHaptic(view) - Toast.makeText(context, context.getString(R.string.msg_snooze_reset_success), Toast.LENGTH_SHORT).show() + Toast.makeText( + context, + context.getString(R.string.msg_snooze_reset_success), + Toast.LENGTH_SHORT + ).show() }, modifier = Modifier.align(Alignment.CenterHorizontally) ) { diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PowerAndBatterySettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PowerAndBatterySettingsUI.kt index c202ca668..baa10e6b9 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PowerAndBatterySettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/PowerAndBatterySettingsUI.kt @@ -21,7 +21,6 @@ import androidx.compose.ui.unit.dp import com.sameerasw.essentials.R import com.sameerasw.essentials.ui.components.cards.IconToggleItem import com.sameerasw.essentials.ui.components.containers.RoundedCardContainer -import com.sameerasw.essentials.ui.components.pickers.SegmentedPicker import com.sameerasw.essentials.ui.components.sliders.ConfigSliderItem import com.sameerasw.essentials.utils.HapticUtil import com.sameerasw.essentials.viewmodels.MainViewModel @@ -87,7 +86,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_advertise_is_enabled), isChecked = getBool("advertise_is_enabled", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "advertise_is_enabled", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "advertise_is_enabled", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -109,7 +112,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_force_all_apps_standby), isChecked = getBool("force_all_apps_standby", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "force_all_apps_standby", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "force_all_apps_standby", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -120,7 +127,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_force_background_check), isChecked = getBool("force_background_check", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "force_background_check", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "force_background_check", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -142,7 +153,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_enable_brightness_adjustment), isChecked = brightnessAdjust, onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "enable_brightness_adjustment", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "enable_brightness_adjustment", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -158,7 +173,11 @@ fun PowerAndBatterySettingsUI( value = getFloat("adjust_brightness_factor", 0.8f) * 100f, onValueChange = { val factor = it / 100f - viewModel.updateBatterySaverConstant(context, "adjust_brightness_factor", factor.toString()) + viewModel.updateBatterySaverConstant( + context, + "adjust_brightness_factor", + factor.toString() + ) HapticUtil.performSliderHaptic(view) }, valueRange = 10f..100f, @@ -173,7 +192,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_disable_animation), isChecked = getBool("disable_animation", false), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "disable_animation", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "disable_animation", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -195,7 +218,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_enable_night_mode), isChecked = getBool("enable_night_mode", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "enable_night_mode", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "enable_night_mode", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -216,7 +243,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_disable_launch_boost), isChecked = getBool("disable_launch_boost", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "disable_launch_boost", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "disable_launch_boost", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -227,7 +258,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_enable_quick_doze), isChecked = getBool("enable_quick_doze", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "enable_quick_doze", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "enable_quick_doze", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -238,7 +273,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_disable_optional_sensors), isChecked = getBool("disable_optional_sensors", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "disable_optional_sensors", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "disable_optional_sensors", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -270,7 +309,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_defer_full_backup), isChecked = getBool("defer_full_backup", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "defer_full_backup", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "defer_full_backup", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -281,7 +324,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_defer_keyvalue_backup), isChecked = getBool("defer_keyvalue_backup", true), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "defer_keyvalue_backup", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "defer_keyvalue_backup", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -302,7 +349,11 @@ fun PowerAndBatterySettingsUI( description = stringResource(R.string.desc_disable_vibration), isChecked = getBool("disable_vibration", false), onCheckedChange = { - viewModel.updateBatterySaverConstant(context, "disable_vibration", it.toString()) + viewModel.updateBatterySaverConstant( + context, + "disable_vibration", + it.toString() + ) HapticUtil.performUIHaptic(view) }, enabled = isEnabled, @@ -332,7 +383,11 @@ fun PowerAndBatterySettingsUI( com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem( text = { Text(optionLabel) }, onClick = { - viewModel.updateBatterySaverConstant(context, "soundtrigger_mode", option.toString()) + viewModel.updateBatterySaverConstant( + context, + "soundtrigger_mode", + option.toString() + ) HapticUtil.performUIHaptic(view) } ) @@ -375,7 +430,11 @@ fun PowerAndBatterySettingsUI( com.sameerasw.essentials.ui.components.menus.SegmentedDropdownMenuItem( text = { Text(optionLabel) }, onClick = { - viewModel.updateBatterySaverConstant(context, "location_mode", option.toString()) + viewModel.updateBatterySaverConstant( + context, + "location_mode", + option.toString() + ) HapticUtil.performUIHaptic(view) } ) @@ -389,7 +448,11 @@ fun PowerAndBatterySettingsUI( onClick = { viewModel.resetBatterySaverConstants(context) HapticUtil.performUIHaptic(view) - Toast.makeText(context, R.string.msg_battery_saver_reset_success, Toast.LENGTH_SHORT).show() + Toast.makeText( + context, + R.string.msg_battery_saver_reset_success, + Toast.LENGTH_SHORT + ).show() }, enabled = isEnabled, colors = ButtonDefaults.buttonColors( diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt index 7021b3f3d..27413e5ce 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/QuickSettingsTilesSettingsUI.kt @@ -67,8 +67,8 @@ import com.sameerasw.essentials.services.tiles.NotificationLightingTileService import com.sameerasw.essentials.services.tiles.PrivateDnsTileService import com.sameerasw.essentials.services.tiles.PrivateNotificationsTileService import com.sameerasw.essentials.services.tiles.RefreshRateTileService -import com.sameerasw.essentials.services.tiles.ScaleAnimationsTileService import com.sameerasw.essentials.services.tiles.RestartSystemUiTileService +import com.sameerasw.essentials.services.tiles.ScaleAnimationsTileService import com.sameerasw.essentials.services.tiles.ScreenLockedSecurityTileService import com.sameerasw.essentials.services.tiles.SoundModeTileService import com.sameerasw.essentials.services.tiles.StayAwakeTileService diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/RefreshRateSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/RefreshRateSettingsUI.kt index 35a79e30a..1f5ca3fe5 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/RefreshRateSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/RefreshRateSettingsUI.kt @@ -38,7 +38,8 @@ fun RefreshRateSettingsUI( ) { val context = LocalContext.current val view = LocalView.current - val isEnabled = if (viewModel.isRootEnabled.value) viewModel.isRootPermissionGranted.value else viewModel.isShizukuPermissionGranted.value + val isEnabled = + if (viewModel.isRootEnabled.value) viewModel.isRootPermissionGranted.value else viewModel.isShizukuPermissionGranted.value val isFixedMode = viewModel.refreshRateMode.value == RefreshRateUtils.MODE_FIXED val systemLabel = stringResource(R.string.refresh_rate_system_default) diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/StatusBarIconSettingsUI.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/StatusBarIconSettingsUI.kt index c06281a91..71468bc24 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/StatusBarIconSettingsUI.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/configs/StatusBarIconSettingsUI.kt @@ -140,304 +140,312 @@ fun StatusBarIconSettingsUI( if (isMasterEnabled) { // Iterate through categories categories.forEach { categoryRes -> - val iconsInCat = - StatusBarIconRegistry.ALL_ICONS.filter { it.categoryRes == categoryRes } - if (iconsInCat.isNotEmpty()) { - Text( - text = stringResource(categoryRes), - style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp), - color = MaterialTheme.colorScheme.onSurfaceVariant - ) + val iconsInCat = + StatusBarIconRegistry.ALL_ICONS.filter { it.categoryRes == categoryRes } + if (iconsInCat.isNotEmpty()) { + Text( + text = stringResource(categoryRes), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp), + color = MaterialTheme.colorScheme.onSurfaceVariant + ) - RoundedCardContainer( - modifier = Modifier, - spacing = 2.dp, - cornerRadius = 24.dp - ) { - iconsInCat.forEach { icon -> - val isChecked = - viewModel.getIconVisibility(icon.id)?.value ?: icon.defaultVisible - IconToggleItem( - iconRes = icon.iconRes ?: R.drawable.rounded_info_24, - title = stringResource(icon.displayNameRes), - isChecked = isChecked, - onCheckedChange = { checked -> - viewModel.setIconVisibility(icon.id, checked, context) - }, - enabled = isPermissionGranted, - modifier = Modifier.highlight(highlightSetting == context.getString(icon.displayNameRes)) - ) + RoundedCardContainer( + modifier = Modifier, + spacing = 2.dp, + cornerRadius = 24.dp + ) { + iconsInCat.forEach { icon -> + val isChecked = + viewModel.getIconVisibility(icon.id)?.value ?: icon.defaultVisible + IconToggleItem( + iconRes = icon.iconRes ?: R.drawable.rounded_info_24, + title = stringResource(icon.displayNameRes), + isChecked = isChecked, + onCheckedChange = { checked -> + viewModel.setIconVisibility(icon.id, checked, context) + }, + enabled = isPermissionGranted, + modifier = Modifier.highlight( + highlightSetting == context.getString( + icon.displayNameRes + ) + ) + ) + } } } } - } - // Smart Visibility Category - Text( - text = stringResource(R.string.settings_section_smart_visibility), - style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp), - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - - RoundedCardContainer( - modifier = Modifier, - spacing = 2.dp, - cornerRadius = 24.dp - ) { - IconToggleItem( - iconRes = R.drawable.rounded_cell_wifi_24, - title = stringResource(R.string.smart_wifi_title), - description = stringResource(R.string.smart_wifi_desc), - isChecked = viewModel.isSmartWiFiEnabled.value, - onCheckedChange = { isChecked -> - viewModel.setSmartWiFiEnabled(isChecked, context) - }, - enabled = isPermissionGranted && viewModel.isMobileDataVisible.value, - modifier = Modifier.highlight(highlightSetting == "smart_wifi") + // Smart Visibility Category + Text( + text = stringResource(R.string.settings_section_smart_visibility), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp), + color = MaterialTheme.colorScheme.onSurfaceVariant ) - Box( - modifier = Modifier - .highlight(highlightSetting == "smart_data") - .clickable { - HapticUtil.performUIHaptic(view) - val hasPermission = ContextCompat.checkSelfPermission( - context, - Manifest.permission.READ_PHONE_STATE - ) == PackageManager.PERMISSION_GRANTED - - if (!hasPermission) { - showPermissionSheet = true - } - } + RoundedCardContainer( + modifier = Modifier, + spacing = 2.dp, + cornerRadius = 24.dp ) { IconToggleItem( - iconRes = R.drawable.rounded_android_cell_dual_5_bar_alert_24, - title = stringResource(R.string.smart_data_title), - description = stringResource(R.string.smart_data_desc), - isChecked = viewModel.isSmartDataEnabled.value, + iconRes = R.drawable.rounded_cell_wifi_24, + title = stringResource(R.string.smart_wifi_title), + description = stringResource(R.string.smart_wifi_desc), + isChecked = viewModel.isSmartWiFiEnabled.value, onCheckedChange = { isChecked -> - val hasPermission = ContextCompat.checkSelfPermission( - context, - Manifest.permission.READ_PHONE_STATE - ) == PackageManager.PERMISSION_GRANTED + viewModel.setSmartWiFiEnabled(isChecked, context) + }, + enabled = isPermissionGranted && viewModel.isMobileDataVisible.value, + modifier = Modifier.highlight(highlightSetting == "smart_wifi") + ) - if (isChecked && !hasPermission) { - showPermissionSheet = true - } else { - viewModel.setSmartDataEnabled(isChecked, context) + Box( + modifier = Modifier + .highlight(highlightSetting == "smart_data") + .clickable { + HapticUtil.performUIHaptic(view) + val hasPermission = ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_PHONE_STATE + ) == PackageManager.PERMISSION_GRANTED + + if (!hasPermission) { + showPermissionSheet = true + } } - }, - enabled = isPermissionGranted && ContextCompat.checkSelfPermission( - context, - Manifest.permission.READ_PHONE_STATE - ) == PackageManager.PERMISSION_GRANTED && viewModel.isMobileDataVisible.value, - onDisabledClick = { - val hasPermission = ContextCompat.checkSelfPermission( + ) { + IconToggleItem( + iconRes = R.drawable.rounded_android_cell_dual_5_bar_alert_24, + title = stringResource(R.string.smart_data_title), + description = stringResource(R.string.smart_data_desc), + isChecked = viewModel.isSmartDataEnabled.value, + onCheckedChange = { isChecked -> + val hasPermission = ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_PHONE_STATE + ) == PackageManager.PERMISSION_GRANTED + + if (isChecked && !hasPermission) { + showPermissionSheet = true + } else { + viewModel.setSmartDataEnabled(isChecked, context) + } + }, + enabled = isPermissionGranted && ContextCompat.checkSelfPermission( context, Manifest.permission.READ_PHONE_STATE - ) == PackageManager.PERMISSION_GRANTED - - if (!hasPermission) { - showPermissionSheet = true + ) == PackageManager.PERMISSION_GRANTED && viewModel.isMobileDataVisible.value, + onDisabledClick = { + val hasPermission = ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_PHONE_STATE + ) == PackageManager.PERMISSION_GRANTED + + if (!hasPermission) { + showPermissionSheet = true + } } - } - ) - - val isSwitchDisabled = - !(isPermissionGranted && ContextCompat.checkSelfPermission( - context, - Manifest.permission.READ_PHONE_STATE - ) == PackageManager.PERMISSION_GRANTED) + ) - if (isSwitchDisabled) { - Box( - modifier = Modifier - .matchParentSize() - .clickable { - HapticUtil.performUIHaptic(view) - val hasPermission = ContextCompat.checkSelfPermission( - context, - Manifest.permission.READ_PHONE_STATE - ) == PackageManager.PERMISSION_GRANTED - - if (!hasPermission) { - showPermissionSheet = true - } - }) + val isSwitchDisabled = + !(isPermissionGranted && ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_PHONE_STATE + ) == PackageManager.PERMISSION_GRANTED) + + if (isSwitchDisabled) { + Box( + modifier = Modifier + .matchParentSize() + .clickable { + HapticUtil.performUIHaptic(view) + val hasPermission = ContextCompat.checkSelfPermission( + context, + Manifest.permission.READ_PHONE_STATE + ) == PackageManager.PERMISSION_GRANTED + + if (!hasPermission) { + showPermissionSheet = true + } + }) + } } - } - // Network Type Picker (only show when Smart Data is enabled) - if (viewModel.isSmartDataEnabled.value) { - Column { - NetworkTypePicker( - selectedTypes = viewModel.selectedNetworkTypes.value, - onTypesSelected = { selectedTypes -> - viewModel.selectedNetworkTypes.value = selectedTypes - // Save to preferences - val prefs = context.getSharedPreferences( - "essentials_prefs", - Context.MODE_PRIVATE - ) - prefs.edit { - putStringSet( - "selected_network_types", - selectedTypes.map { it.name }.toSet() + // Network Type Picker (only show when Smart Data is enabled) + if (viewModel.isSmartDataEnabled.value) { + Column { + NetworkTypePicker( + selectedTypes = viewModel.selectedNetworkTypes.value, + onTypesSelected = { selectedTypes -> + viewModel.selectedNetworkTypes.value = selectedTypes + // Save to preferences + val prefs = context.getSharedPreferences( + "essentials_prefs", + Context.MODE_PRIVATE ) + prefs.edit { + putStringSet( + "selected_network_types", + selectedTypes.map { it.name }.toSet() + ) + } } - } - ) + ) + } } } - } - - // Advanced Status Bar Settings - Text( - text = stringResource(R.string.status_bar_section_advanced), - style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp), - color = MaterialTheme.colorScheme.onSurfaceVariant - ) - RoundedCardContainer( - modifier = Modifier, - spacing = 2.dp, - cornerRadius = 24.dp - ) { - IconToggleItem( - iconRes = R.drawable.rounded_nest_clock_farsight_analog_24, - title = stringResource(R.string.stb_clock_seconds), - isChecked = viewModel.isClockSecondsEnabled.value, - onCheckedChange = { checked -> - viewModel.setClockSecondsEnabled(checked, context) - }, - enabled = isPermissionGranted, - modifier = Modifier.highlight(highlightSetting == "clock_seconds") + // Advanced Status Bar Settings + Text( + text = stringResource(R.string.status_bar_section_advanced), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(start = 16.dp, top = 24.dp, bottom = 8.dp), + color = MaterialTheme.colorScheme.onSurfaceVariant ) - Column( - modifier = Modifier - .fillMaxWidth() - .background( - color = MaterialTheme.colorScheme.surfaceBright, - shape = androidx.compose.foundation.shape.RoundedCornerShape(MaterialTheme.shapes.extraSmall.bottomEnd) - ) - .highlight(highlightSetting == "clock_position") + RoundedCardContainer( + modifier = Modifier, + spacing = 2.dp, + cornerRadius = 24.dp ) { - Row( + IconToggleItem( + iconRes = R.drawable.rounded_nest_clock_farsight_analog_24, + title = stringResource(R.string.stb_clock_seconds), + isChecked = viewModel.isClockSecondsEnabled.value, + onCheckedChange = { checked -> + viewModel.setClockSecondsEnabled(checked, context) + }, + enabled = isPermissionGranted, + modifier = Modifier.highlight(highlightSetting == "clock_seconds") + ) + + Column( modifier = Modifier .fillMaxWidth() - .padding(top = 16.dp, start = 20.dp, end = 16.dp, bottom = 2.dp), - verticalAlignment = androidx.compose.ui.Alignment.CenterVertically + .background( + color = MaterialTheme.colorScheme.surfaceBright, + shape = androidx.compose.foundation.shape.RoundedCornerShape( + MaterialTheme.shapes.extraSmall.bottomEnd + ) + ) + .highlight(highlightSetting == "clock_position") ) { - Text( - text = stringResource(R.string.stb_clock_position), - style = MaterialTheme.typography.titleSmall, - color = if (isPermissionGranted) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurface.copy( - alpha = 0.38f + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp, start = 20.dp, end = 16.dp, bottom = 2.dp), + verticalAlignment = androidx.compose.ui.Alignment.CenterVertically + ) { + Text( + text = stringResource(R.string.stb_clock_position), + style = MaterialTheme.typography.titleSmall, + color = if (isPermissionGranted) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurface.copy( + alpha = 0.38f + ) ) + } + SegmentedPicker( + items = listOf(1, 2, 3), + selectedItem = viewModel.clockPosition.value, + onItemSelected = { pos -> + viewModel.setClockPosition(pos, context) + }, + labelProvider = { pos -> + when (pos) { + 1 -> context.getString(R.string.stb_clock_position_left) + 2 -> context.getString(R.string.stb_clock_position_center) + 3 -> context.getString(R.string.stb_clock_position_right) + else -> "" + } + }, + modifier = Modifier + .fillMaxWidth() + .then(if (!isPermissionGranted) Modifier.alpha(0.5f) else Modifier), ) } - SegmentedPicker( - items = listOf(1, 2, 3), - selectedItem = viewModel.clockPosition.value, - onItemSelected = { pos -> - viewModel.setClockPosition(pos, context) - }, - labelProvider = { pos -> - when (pos) { - 1 -> context.getString(R.string.stb_clock_position_left) - 2 -> context.getString(R.string.stb_clock_position_center) - 3 -> context.getString(R.string.stb_clock_position_right) - else -> "" - } + + IconToggleItem( + iconRes = R.drawable.rounded_security_24, + title = stringResource(R.string.stb_privacy_chip), + isChecked = viewModel.isPrivacyChipEnabled.value, + onCheckedChange = { checked -> + viewModel.setPrivacyChipEnabled(checked, context) }, - modifier = Modifier - .fillMaxWidth() - .then(if (!isPermissionGranted) Modifier.alpha(0.5f) else Modifier), + enabled = isPermissionGranted, + modifier = Modifier.highlight(highlightSetting == "privacy_chip") ) - } - IconToggleItem( - iconRes = R.drawable.rounded_security_24, - title = stringResource(R.string.stb_privacy_chip), - isChecked = viewModel.isPrivacyChipEnabled.value, - onCheckedChange = { checked -> - viewModel.setPrivacyChipEnabled(checked, context) - }, - enabled = isPermissionGranted, - modifier = Modifier.highlight(highlightSetting == "privacy_chip") - ) - - Column( - modifier = Modifier - .fillMaxWidth() - .background( - color = MaterialTheme.colorScheme.surfaceBright, - shape = androidx.compose.foundation.shape.RoundedCornerShape(MaterialTheme.shapes.extraSmall.bottomEnd) - ) - .highlight(highlightSetting == "battery_percentage") - ) { - Row( + Column( modifier = Modifier .fillMaxWidth() - .padding(top = 16.dp, start = 20.dp, end = 16.dp, bottom = 2.dp), - verticalAlignment = androidx.compose.ui.Alignment.CenterVertically - ) { - Text( - text = stringResource(R.string.stb_battery_percentage), - style = MaterialTheme.typography.titleSmall, - color = if (batteryPermissionGranted) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurface.copy( - alpha = 0.38f + .background( + color = MaterialTheme.colorScheme.surfaceBright, + shape = androidx.compose.foundation.shape.RoundedCornerShape( + MaterialTheme.shapes.extraSmall.bottomEnd + ) ) - ) - if (!viewModel.isShizukuAvailable.value && !viewModel.isRootAvailable.value) { - Spacer(modifier = Modifier.weight(1f)) + .highlight(highlightSetting == "battery_percentage") + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 16.dp, start = 20.dp, end = 16.dp, bottom = 2.dp), + verticalAlignment = androidx.compose.ui.Alignment.CenterVertically + ) { Text( - text = stringResource(R.string.req_shizuku), - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.error + text = stringResource(R.string.stb_battery_percentage), + style = MaterialTheme.typography.titleSmall, + color = if (batteryPermissionGranted) MaterialTheme.colorScheme.onSurface else MaterialTheme.colorScheme.onSurface.copy( + alpha = 0.38f + ) ) + if (!viewModel.isShizukuAvailable.value && !viewModel.isRootAvailable.value) { + Spacer(modifier = Modifier.weight(1f)) + Text( + text = stringResource(R.string.req_shizuku), + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.error + ) + } } + SegmentedPicker( + items = listOf(0, 1, 2), // 0: Never, 1: Always, 2: Charging + selectedItem = viewModel.batteryPercentageMode.value, + onItemSelected = { mode -> + viewModel.setBatteryPercentageMode(mode, context) + }, + labelProvider = { mode -> + when (mode) { + 0 -> context.getString(R.string.stb_battery_percentage_never) + 1 -> context.getString(R.string.stb_battery_percentage_always) + 2 -> context.getString(R.string.stb_battery_percentage_charging) + else -> "" + } + }, + modifier = Modifier + .fillMaxWidth() + .then(if (!batteryPermissionGranted) Modifier.alpha(0.5f) else Modifier), + ) } - SegmentedPicker( - items = listOf(0, 1, 2), // 0: Never, 1: Always, 2: Charging - selectedItem = viewModel.batteryPercentageMode.value, - onItemSelected = { mode -> - viewModel.setBatteryPercentageMode(mode, context) - }, - labelProvider = { mode -> - when (mode) { - 0 -> context.getString(R.string.stb_battery_percentage_never) - 1 -> context.getString(R.string.stb_battery_percentage_always) - 2 -> context.getString(R.string.stb_battery_percentage_charging) - else -> "" - } - }, - modifier = Modifier - .fillMaxWidth() - .then(if (!batteryPermissionGranted) Modifier.alpha(0.5f) else Modifier), - ) } - } - // Reset All Icons Button - Button( - onClick = { - HapticUtil.performVirtualKeyHaptic(view) - viewModel.resetAllIcons(context) - }, - modifier = Modifier - .fillMaxWidth() - .padding(vertical = 16.dp) - .highlight(highlightSetting == "reset_icons"), - enabled = isPermissionGranted - ) { - Text(stringResource(R.string.action_reset_all_icons)) - } + // Reset All Icons Button + Button( + onClick = { + HapticUtil.performVirtualKeyHaptic(view) + viewModel.resetAllIcons(context) + }, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 16.dp) + .highlight(highlightSetting == "reset_icons"), + enabled = isPermissionGranted + ) { + Text(stringResource(R.string.action_reset_all_icons)) + } } // Advanced Status Bar Flags Section diff --git a/app/src/main/java/com/sameerasw/essentials/ui/composables/wallpaper/WallpaperScreen.kt b/app/src/main/java/com/sameerasw/essentials/ui/composables/wallpaper/WallpaperScreen.kt index b222100d1..eb916dd36 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/composables/wallpaper/WallpaperScreen.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/composables/wallpaper/WallpaperScreen.kt @@ -43,8 +43,6 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.pager.HorizontalPager -import kotlinx.coroutines.isActive - import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape @@ -225,17 +223,20 @@ fun WallpaperScreen( LaunchedEffect(dailyWallpaperAutoUpdateTime) { while (true) { if (!dailyWallpaperAutoUpdateTime.isNullOrEmpty()) { - val prevTime = runCatching { LocalDateTime.parse(dailyWallpaperAutoUpdateTime) }.getOrNull() + val prevTime = + runCatching { LocalDateTime.parse(dailyWallpaperAutoUpdateTime) }.getOrNull() if (prevTime != null) { val passedMinutes = Duration.between(prevTime, LocalDateTime.now()).toMinutes() - val retryCount = repository.getInt(SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, 0) + val retryCount = + repository.getInt(SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, 0) if (passedMinutes >= 0) { if (retryCount in 1..2) { val remainingMinutes = (30L - passedMinutes).coerceAtLeast(0L) dailyWallpaperNextAutoUpdateTime = remainingMinutes / 60L } else { val cycleMinutes = passedMinutes % 1440L - val remainingMinutes = if (cycleMinutes == 0L && passedMinutes > 0L) 0L else 1440L - cycleMinutes + val remainingMinutes = + if (cycleMinutes == 0L && passedMinutes > 0L) 0L else 1440L - cycleMinutes dailyWallpaperNextAutoUpdateTime = remainingMinutes / 60L } } else { @@ -515,49 +516,63 @@ fun WallpaperScreen( .padding(16.dp), verticalArrangement = Arrangement.spacedBy(12.dp) ) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Column( + verticalArrangement = Arrangement.spacedBy(2.dp) ) { - Column( - verticalArrangement = Arrangement.spacedBy(2.dp) - ) { - Text( - text = stringResource(R.string.label_wallpaper_auto_update), - style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.Bold), - color = MaterialTheme.colorScheme.onSurface - ) - if (isAutoUpdateEnabled && !dailyWallpaperAutoUpdateTime.isNullOrEmpty()){ - val timeText = if(isDailyWallpaperShowLastTime) { - stringResource(R.string.label_wallpaper_last_checked, dailyWallpaperLastCheckedFormatted) - } else{ - val showTime = if(dailyWallpaperNextAutoUpdateTime > 0L) { - stringResource(R.string.label_wallpaper_hours, dailyWallpaperNextAutoUpdateTime.toInt()) + Text( + text = stringResource(R.string.label_wallpaper_auto_update), + style = MaterialTheme.typography.titleMedium.copy( + fontWeight = FontWeight.Bold + ), + color = MaterialTheme.colorScheme.onSurface + ) + if (isAutoUpdateEnabled && !dailyWallpaperAutoUpdateTime.isNullOrEmpty()) { + val timeText = if (isDailyWallpaperShowLastTime) { + stringResource( + R.string.label_wallpaper_last_checked, + dailyWallpaperLastCheckedFormatted + ) + } else { + val showTime = + if (dailyWallpaperNextAutoUpdateTime > 0L) { + stringResource( + R.string.label_wallpaper_hours, + dailyWallpaperNextAutoUpdateTime.toInt() + ) } else { stringResource(R.string.label_wallpaper_a_few_minutes) } - stringResource(R.string.label_wallpaper_next_check, showTime) - } - Text( - text = timeText, - style = MaterialTheme.typography.labelSmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.clickable(enabled = true, onClick = { + stringResource( + R.string.label_wallpaper_next_check, + showTime + ) + } + Text( + text = timeText, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.clickable( + enabled = true, + onClick = { HapticUtil.performUIHaptic(view) viewModel.setDailyWallpaperShowLastTime() }) - ) - } + ) } - Switch( - checked = isAutoUpdateEnabled, - onCheckedChange = { checked -> - HapticUtil.performUIHaptic(view) - viewModel.setDailyWallpaperAutoUpdate(checked, context) - } - ) } + Switch( + checked = isAutoUpdateEnabled, + onCheckedChange = { checked -> + HapticUtil.performUIHaptic(view) + viewModel.setDailyWallpaperAutoUpdate(checked, context) + } + ) + } Row( modifier = Modifier diff --git a/app/src/main/java/com/sameerasw/essentials/ui/ime/KeyboardInputView.kt b/app/src/main/java/com/sameerasw/essentials/ui/ime/KeyboardInputView.kt index 43b9d26b6..afd5aaf3a 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/ime/KeyboardInputView.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/ime/KeyboardInputView.kt @@ -773,7 +773,8 @@ fun KeyboardInputView( functions.forEach { (iconRes, desc) -> customItem( buttonGroupContent = { - val fnInteraction = remember { MutableInteractionSource() } + val fnInteraction = + remember { MutableInteractionSource() } val isPressed by fnInteraction.collectIsPressedAsState() val animatedRadius by animateDpAsState( targetValue = if (isPressed) 4.dp else keyRoundness, @@ -1083,7 +1084,8 @@ fun KeyboardInputView( val accents = if (isAccentedCharactersEnabled) KeyAccentMap[char] ?: emptyList() else emptyList() - val variants = mutableListOf() + val variants = + mutableListOf() val xRatio = (index + 0.5f) / 10f var startIndex = 0 @@ -1101,12 +1103,20 @@ fun KeyboardInputView( startIndex = variants.size - 1 } else { val half = accents.size / 2 - variants.addAll(accents.take(half)) + variants.addAll( + accents.take( + half + ) + ) if (secondary != null) variants.add( secondary ) startIndex = variants.size - 1 - variants.addAll(accents.drop(half)) + variants.addAll( + accents.drop( + half + ) + ) } @@ -1188,7 +1198,8 @@ fun KeyboardInputView( val accents = if (isAccentedCharactersEnabled) KeyAccentMap[char] ?: emptyList() else emptyList() - val variants = mutableListOf() + val variants = + mutableListOf() val xRatio = (index + 0.5f) / currentRow2.size.toFloat() var startIndex = 0 @@ -1204,24 +1215,37 @@ fun KeyboardInputView( if (secondary != null) variants.add( secondary ) - startIndex = variants.size - 1 + startIndex = + variants.size - 1 } else { val half = accents.size / 2 - variants.addAll(accents.take(half)) + variants.addAll( + accents.take( + half + ) + ) if (secondary != null) variants.add( secondary ) - startIndex = variants.size - 1 - variants.addAll(accents.drop(half)) + startIndex = + variants.size - 1 + variants.addAll( + accents.drop( + half + ) + ) } if (variants.isNotEmpty()) { longPressKey = char longPressVariants = variants - initialAccentIndex = startIndex - selectedAccentIndex = startIndex + initialAccentIndex = + startIndex + selectedAccentIndex = + startIndex longPressXRatio = xRatio - longPressYRatio = 0.4f // Row 2 + longPressYRatio = + 0.4f // Row 2 } } }, @@ -1229,7 +1253,9 @@ fun KeyboardInputView( interactionSource = row2Interaction, containerColor = MaterialTheme.colorScheme.surfaceContainerHighest, contentColor = MaterialTheme.colorScheme.onSurface, - shape = RoundedCornerShape(animatedRadius), + shape = RoundedCornerShape( + animatedRadius + ), modifier = Modifier .weight(1f) .fillMaxHeight() @@ -1264,7 +1290,8 @@ fun KeyboardInputView( // Shift Key customItem( buttonGroupContent = { - val shiftInteraction = remember { MutableInteractionSource() } + val shiftInteraction = + remember { MutableInteractionSource() } val isPressed by shiftInteraction.collectIsPressedAsState() var shiftPressTime by remember { @@ -1310,7 +1337,8 @@ fun KeyboardInputView( performLightHaptic() if (!isSymbols) { shiftPressTime = System.currentTimeMillis() - wasShiftOffAtDown = (shiftState == ShiftState.OFF) + wasShiftOffAtDown = + (shiftState == ShiftState.OFF) isSelectionPerformed = false // Reset selection tracker if (wasShiftOffAtDown) { @@ -1351,7 +1379,9 @@ fun KeyboardInputView( contentDescription = "Shift", modifier = Modifier.size(24.dp), tint = if (isSymbols) { - MaterialTheme.colorScheme.onSurface.copy(alpha = 0.3f) + MaterialTheme.colorScheme.onSurface.copy( + alpha = 0.3f + ) } else if (shiftState != ShiftState.OFF) { MaterialTheme.colorScheme.onPrimary } else { @@ -1392,7 +1422,8 @@ fun KeyboardInputView( val accents = if (isAccentedCharactersEnabled) KeyAccentMap[char] ?: emptyList() else emptyList() - val variants = mutableListOf() + val variants = + mutableListOf() val xRatio = (index + 2.0f) / 10.5f var startIndex = 0 @@ -1410,12 +1441,20 @@ fun KeyboardInputView( startIndex = variants.size - 1 } else { val half = accents.size / 2 - variants.addAll(accents.take(half)) + variants.addAll( + accents.take( + half + ) + ) if (secondary != null) variants.add( secondary ) startIndex = variants.size - 1 - variants.addAll(accents.drop(half)) + variants.addAll( + accents.drop( + half + ) + ) } if (variants.isNotEmpty()) { @@ -1487,14 +1526,18 @@ fun KeyboardInputView( isDraggingDel = true }, onDragEnd = { isDraggingDel = false }, - onDragCancel = { isDraggingDel = false }, + onDragCancel = { + isDraggingDel = false + }, onHorizontalDrag = { change, dragAmount -> change.consume() delAccumulatedDx += dragAmount // Moving left (negative dx) for delete if (delAccumulatedDx <= -delSweepThreshold) { val steps = - (kotlin.math.abs(delAccumulatedDx) / delSweepThreshold).toInt() + (kotlin.math.abs( + delAccumulatedDx + ) / delSweepThreshold).toInt() repeat(steps) { performLightHaptic() handleKeyPress(KeyEvent.KEYCODE_DEL) @@ -1507,7 +1550,8 @@ fun KeyboardInputView( .pointerInput(Unit) { detectTapGestures( onPress = { offset -> - val press = PressInteraction.Press(offset) + val press = + PressInteraction.Press(offset) performLightHaptic() scope.launch { backspaceInteraction.emit( @@ -1660,7 +1704,8 @@ fun KeyboardInputView( // Comma Key customItem( buttonGroupContent = { - val commaInteraction = remember { MutableInteractionSource() } + val commaInteraction = + remember { MutableInteractionSource() } val isPressedComma by commaInteraction.collectIsPressedAsState() val animatedRadiusComma by animateDpAsState( targetValue = if (isPressedComma) 4.dp else keyRoundness, @@ -1691,7 +1736,8 @@ fun KeyboardInputView( // Space customItem( buttonGroupContent = { - val spaceInteraction = remember { MutableInteractionSource() } + val spaceInteraction = + remember { MutableInteractionSource() } val isPressedSpace by spaceInteraction.collectIsPressedAsState() val animatedRadiusSpace by animateDpAsState( targetValue = if (isPressedSpace) 4.dp else keyRoundness, @@ -1717,7 +1763,11 @@ fun KeyboardInputView( awaitFirstDown(requireUnconsumed = false) val press = PressInteraction.Press(down.position) - scope.launch { spaceInteraction.emit(press) } + scope.launch { + spaceInteraction.emit( + press + ) + } performLightHaptic() var isDragStarted = false @@ -1725,9 +1775,11 @@ fun KeyboardInputView( var cursorAccumulator = 0f // Increased slop for spacebar to prevent accidental cursor moves - val customSlop = viewConfig.touchSlop * 2.5f + val customSlop = + viewConfig.touchSlop * 2.5f - var upOrCancel: PointerInputChange? = null + var upOrCancel: PointerInputChange? = + null while (true) { val event = awaitPointerEvent() @@ -1748,7 +1800,10 @@ fun KeyboardInputView( val dxFromOrigin = totalDx if (!isDragStarted) { - if (kotlin.math.abs(dxFromOrigin) > customSlop) { + if (kotlin.math.abs( + dxFromOrigin + ) > customSlop + ) { isDragStarted = true onCursorDrag(true) cursorAccumulator = 0f @@ -1799,7 +1854,9 @@ fun KeyboardInputView( handleType(" ") scope.launch { spaceInteraction.emit( - PressInteraction.Release(press) + PressInteraction.Release( + press + ) ) } } else { @@ -1808,7 +1865,9 @@ fun KeyboardInputView( } scope.launch { spaceInteraction.emit( - PressInteraction.Cancel(press) + PressInteraction.Cancel( + press + ) ) } } @@ -1826,7 +1885,8 @@ fun KeyboardInputView( // Dot Key customItem( buttonGroupContent = { - val dotInteraction = remember { MutableInteractionSource() } + val dotInteraction = + remember { MutableInteractionSource() } val isPressedDot by dotInteraction.collectIsPressedAsState() val animatedRadiusDot by animateDpAsState( targetValue = if (isPressedDot) 4.dp else keyRoundness, @@ -1857,7 +1917,8 @@ fun KeyboardInputView( // Return customItem( buttonGroupContent = { - val returnInteraction = remember { MutableInteractionSource() } + val returnInteraction = + remember { MutableInteractionSource() } val isPressedReturn by returnInteraction.collectIsPressedAsState() val animatedRadiusReturn by animateDpAsState( targetValue = if (isPressedReturn) 4.dp else keyRoundness, diff --git a/app/src/main/java/com/sameerasw/essentials/ui/modifiers/ProgressiveBlurModifier.kt b/app/src/main/java/com/sameerasw/essentials/ui/modifiers/ProgressiveBlurModifier.kt index cbbe7e4a4..8c74c3920 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/modifiers/ProgressiveBlurModifier.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/modifiers/ProgressiveBlurModifier.kt @@ -4,6 +4,7 @@ import android.graphics.RenderEffect import android.graphics.RuntimeShader import android.os.Build import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.composed import androidx.compose.ui.draw.drawWithContent @@ -12,7 +13,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.asComposeRenderEffect import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.platform.LocalContext -import androidx.compose.runtime.remember import org.intellij.lang.annotations.Language enum class BlurDirection { @@ -87,8 +87,10 @@ fun Modifier.progressiveBlur( val overlayColor = MaterialTheme.colorScheme.surfaceContainer.copy(alpha = 0.65f) val context = LocalContext.current - val isPowerSave = remember(context) { com.sameerasw.essentials.utils.DeviceUtils.isPowerSaveMode(context) } - val isSamsungOneUi7OrLess = remember { com.sameerasw.essentials.utils.DeviceUtils.isBlurProblematicDevice() } + val isPowerSave = + remember(context) { com.sameerasw.essentials.utils.DeviceUtils.isPowerSaveMode(context) } + val isSamsungOneUi7OrLess = + remember { com.sameerasw.essentials.utils.DeviceUtils.isBlurProblematicDevice() } val blurModifier = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && blurRadius > 0f && !isPowerSave && !isSamsungOneUi7OrLess) { diff --git a/app/src/main/java/com/sameerasw/essentials/utils/BatteryHistoryManager.kt b/app/src/main/java/com/sameerasw/essentials/utils/BatteryHistoryManager.kt index b57e21e1a..f0b5b57dd 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/BatteryHistoryManager.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/BatteryHistoryManager.kt @@ -36,7 +36,12 @@ object BatteryHistoryManager { return filtered.sortedBy { it.timestamp } } - fun recordPoint(context: Context, level: Int, isPlugged: Boolean, forceRecord: Boolean = false) { + fun recordPoint( + context: Context, + level: Int, + isPlugged: Boolean, + forceRecord: Boolean = false + ) { val repo = SettingsRepository(context) val now = System.currentTimeMillis() val currentHistory = getHistory(context).toMutableList() diff --git a/app/src/main/java/com/sameerasw/essentials/utils/BatteryInfoUtil.kt b/app/src/main/java/com/sameerasw/essentials/utils/BatteryInfoUtil.kt index 2614547d9..8425d64bb 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/BatteryInfoUtil.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/BatteryInfoUtil.kt @@ -65,8 +65,12 @@ object BatteryInfoUtil { val intent = getBatteryIntent(context) val level = intent?.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) ?: -1 val scale = intent?.getIntExtra(BatteryManager.EXTRA_SCALE, 100) ?: 100 - val status = intent?.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN) ?: BatteryManager.BATTERY_STATUS_UNKNOWN - val health = intent?.getIntExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN) ?: BatteryManager.BATTERY_HEALTH_UNKNOWN + val status = + intent?.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN) + ?: BatteryManager.BATTERY_STATUS_UNKNOWN + val health = + intent?.getIntExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN) + ?: BatteryManager.BATTERY_HEALTH_UNKNOWN val plugged = intent?.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1) ?: -1 val voltage = intent?.getIntExtra(BatteryManager.EXTRA_VOLTAGE, 0) ?: 0 val temp = intent?.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, 0) ?: 0 @@ -91,13 +95,16 @@ object BatteryInfoUtil { // BatteryManager Property queries val bm = context.getSystemService(Context.BATTERY_SERVICE) as? BatteryManager - val rawCurrentNow = bm?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW)?.takeIf { it != Int.MIN_VALUE } + val rawCurrentNow = bm?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW) + ?.takeIf { it != Int.MIN_VALUE } val currentNowMa = rawCurrentNow?.let { it / 1000 } - val rawCurrentAvg = bm?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE)?.takeIf { it != Int.MIN_VALUE } + val rawCurrentAvg = bm?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE) + ?.takeIf { it != Int.MIN_VALUE } val currentAvgMa = rawCurrentAvg?.let { it / 1000 } - val rawEnergy = bm?.getLongProperty(BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER)?.takeIf { it != Long.MIN_VALUE } + val rawEnergy = bm?.getLongProperty(BatteryManager.BATTERY_PROPERTY_ENERGY_COUNTER) + ?.takeIf { it != Long.MIN_VALUE } val remainingEnergyMwh = rawEnergy?.let { it / 1_000_000 } // nWh to mWh val isPlugged = plugged > 0 || status == BatteryManager.BATTERY_STATUS_CHARGING @@ -129,7 +136,8 @@ object BatteryInfoUtil { if (firstUse > 0 && firstUse != Long.MIN_VALUE) firstUseDate = firstUse try { - val getStringPropMethod = bm.javaClass.getMethod("getStringProperty", Int::class.javaPrimitiveType) + val getStringPropMethod = + bm.javaClass.getMethod("getStringProperty", Int::class.javaPrimitiveType) serialNum = getStringPropMethod.invoke(bm, 11) as? String } catch (e: Exception) { } @@ -166,23 +174,29 @@ object BatteryInfoUtil { fun fetchAdvancedDetails(context: Context, basic: BatteryDetails): BatteryDetails { if (!ShellUtils.hasPermission(context)) return basic - var chargeFull: Long? = readSysfsLong(context, "/sys/class/power_supply/battery/charge_full") - var chargeFullDesign: Long? = readSysfsLong(context, "/sys/class/power_supply/battery/charge_full_design") - var currentNow: Long? = readSysfsLong(context, "/sys/class/power_supply/battery/current_now") - var voltageNow: Long? = readSysfsLong(context, "/sys/class/power_supply/battery/voltage_now") + var chargeFull: Long? = + readSysfsLong(context, "/sys/class/power_supply/battery/charge_full") + var chargeFullDesign: Long? = + readSysfsLong(context, "/sys/class/power_supply/battery/charge_full_design") + var currentNow: Long? = + readSysfsLong(context, "/sys/class/power_supply/battery/current_now") + var voltageNow: Long? = + readSysfsLong(context, "/sys/class/power_supply/battery/voltage_now") val dumpsysOutput = ShellUtils.runCommandWithOutput(context, "dumpsys battery") val dumpsysMap = parseDumpsysBattery(dumpsysOutput) // SAMSUNG SPECIFIC: mSavedBattery... fields - val samsungCycleCount = (dumpsysMap["mSavedBatteryUsage"]?.cleanNumericValue()?.toIntOrNull() - ?: dumpsysMap["mUsage"]?.cleanNumericValue()?.toIntOrNull())?.let { - if (it > 10000) it / 100 else it // Handle cumulative percentage vs cycles - } ?: dumpsysMap["mSavedBatteryCycle"]?.cleanNumericValue()?.toIntOrNull() + val samsungCycleCount = + (dumpsysMap["mSavedBatteryUsage"]?.cleanNumericValue()?.toIntOrNull() + ?: dumpsysMap["mUsage"]?.cleanNumericValue()?.toIntOrNull())?.let { + if (it > 10000) it / 100 else it // Handle cumulative percentage vs cycles + } ?: dumpsysMap["mSavedBatteryCycle"]?.cleanNumericValue()?.toIntOrNull() ?: dumpsysMap["mCycle"]?.cleanNumericValue()?.toIntOrNull() ?: dumpsysMap["CycleCount"]?.cleanNumericValue()?.toIntOrNull() ?: readSysfsLong(context, "/sys/class/power_supply/battery/cycle_count")?.toInt() - ?: readSysfsLong(context, "/efs/FactoryApp/batt_discharge_level")?.toInt()?.let { if (it > 0) it / 100 else null } + ?: readSysfsLong(context, "/efs/FactoryApp/batt_discharge_level")?.toInt() + ?.let { if (it > 0) it / 100 else null } ?: readSysfsLong(context, "/sys/class/power_supply/battery/battery_cycle")?.toInt() val samsungSoH = dumpsysMap["mSavedBatteryAsoc"]?.cleanNumericValue()?.toIntOrNull() @@ -190,27 +204,36 @@ object BatteryInfoUtil { ?: readSysfsLong(context, "/sys/class/power_supply/battery/fg_asoc")?.toInt() if (chargeFull == null) { - dumpsysMap["mSavedBatteryMax"]?.cleanNumericValue()?.toDoubleOrNull()?.toLong()?.let { chargeFull = it * 1000 } + dumpsysMap["mSavedBatteryMax"]?.cleanNumericValue()?.toDoubleOrNull()?.toLong() + ?.let { chargeFull = it * 1000 } } - val chargeCounter = dumpsysMap["Charge counter"]?.cleanNumericValue()?.toDoubleOrNull()?.toLong() - ?: dumpsysMap["mSavedBattery"]?.cleanNumericValue()?.toDoubleOrNull()?.toLong()?.let { it * 1000 } - ?: readSysfsLong(context, "/sys/class/power_supply/battery/charge_counter") + val chargeCounter = + dumpsysMap["Charge counter"]?.cleanNumericValue()?.toDoubleOrNull()?.toLong() + ?: dumpsysMap["mSavedBattery"]?.cleanNumericValue()?.toDoubleOrNull()?.toLong() + ?.let { it * 1000 } + ?: readSysfsLong(context, "/sys/class/power_supply/battery/charge_counter") - val maxChargingCurrent = dumpsysMap["Max charging current"]?.cleanNumericValue()?.toDoubleOrNull()?.toInt() - val maxChargingVoltage = dumpsysMap["Max charging voltage"]?.cleanNumericValue()?.toDoubleOrNull()?.toInt() + val maxChargingCurrent = + dumpsysMap["Max charging current"]?.cleanNumericValue()?.toDoubleOrNull()?.toInt() + val maxChargingVoltage = + dumpsysMap["Max charging voltage"]?.cleanNumericValue()?.toDoubleOrNull()?.toInt() val chargingState = dumpsysMap["Charging state"]?.cleanNumericValue()?.toIntOrNull() val chargingPolicy = dumpsysMap["Charging policy"]?.cleanNumericValue()?.toIntOrNull() val capacityLevel = dumpsysMap["Capacity level"]?.cleanNumericValue()?.toIntOrNull() - val samsungSerial = dumpsysMap["serial_number"] ?: dumpsysMap["mSerialNumber"] ?: dumpsysMap["Serial number"] - val samsungPartStatus = dumpsysMap["mSavedBatteryEfuse"]?.cleanNumericValue()?.toIntOrNull()?.let { if (it == 0) 1 else 2 } + val samsungSerial = dumpsysMap["serial_number"] ?: dumpsysMap["mSerialNumber"] + ?: dumpsysMap["Serial number"] + val samsungPartStatus = dumpsysMap["mSavedBatteryEfuse"]?.cleanNumericValue()?.toIntOrNull() + ?.let { if (it == 0) 1 else 2 } ?: dumpsysMap["Part status"]?.cleanNumericValue()?.toIntOrNull() - val powerProfileOutput = ShellUtils.runCommandWithOutput(context, "dumpsys batterystats --power-profile") + val powerProfileOutput = + ShellUtils.runCommandWithOutput(context, "dumpsys batterystats --power-profile") val powerProfileMap = parsePowerProfile(powerProfileOutput) - val settingsOutput = ShellUtils.runCommandWithOutput(context, "dumpsys batterystats --settings") + val settingsOutput = + ShellUtils.runCommandWithOutput(context, "dumpsys batterystats --settings") val enforceLevel = parseSettingsEnforceLevel(settingsOutput) return basic.copy( @@ -274,7 +297,8 @@ object BatteryInfoUtil { val map = mutableMapOf() output.lines().forEach { line -> val trimmed = line.trim() - val delimiter = if (trimmed.contains(":")) ":" else if (trimmed.contains("=")) "=" else null + val delimiter = + if (trimmed.contains(":")) ":" else if (trimmed.contains("=")) "=" else null if (delimiter != null) { val parts = trimmed.split(delimiter, limit = 2) if (parts.size == 2) { @@ -298,7 +322,11 @@ object BatteryInfoUtil { return R.drawable.battery_android_frame_alert_24px } val isChargeLimitEnabled = try { - android.provider.Settings.Secure.getInt(context.contentResolver, "charge_optimization_mode", 0) == 1 + android.provider.Settings.Secure.getInt( + context.contentResolver, + "charge_optimization_mode", + 0 + ) == 1 } catch (e: Exception) { false } @@ -393,7 +421,7 @@ object BatteryInfoUtil { val date = java.util.Date(epochSeconds * 1000) val sdf = java.text.SimpleDateFormat("yyyy-MM-dd", java.util.Locale.getDefault()) val formatted = sdf.format(date) - + // Suspicious / sentinel check (e.g. 2020-12-01 default or Unix epoch 1970-01-01) val cal = java.util.Calendar.getInstance().apply { time = date } val year = cal.get(java.util.Calendar.YEAR) diff --git a/app/src/main/java/com/sameerasw/essentials/utils/BatteryStatsUtil.kt b/app/src/main/java/com/sameerasw/essentials/utils/BatteryStatsUtil.kt index bd819e53d..5c6501c95 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/BatteryStatsUtil.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/BatteryStatsUtil.kt @@ -88,7 +88,17 @@ object BatteryStatsUtil { val pkg = pm.getPackagesForUid(uid)?.firstOrNull() val label = getSystemUidLabel(uid, pkg) val drawable = pkg?.let { getAppIcon(pm, it) } - list.add(BatteryUsageApp(uid, pkg, label, currentMah, currentFg, currentBg, drawable)) + list.add( + BatteryUsageApp( + uid, + pkg, + label, + currentMah, + currentFg, + currentBg, + drawable + ) + ) } val parts = trimmed.split(":") currentUid = parts[0].removePrefix("UID ").trim().let { uStr -> @@ -98,7 +108,8 @@ object BatteryStatsUtil { uStr.toIntOrNull() } } - currentMah = parts.getOrNull(1)?.trim()?.split(" ")?.firstOrNull()?.toDoubleOrNull() ?: 0.0 + currentMah = + parts.getOrNull(1)?.trim()?.split(" ")?.firstOrNull()?.toDoubleOrNull() ?: 0.0 currentFg = 0L currentBg = 0L } else if (currentUid != null && trimmed.startsWith("cpu=")) { @@ -111,7 +122,17 @@ object BatteryStatsUtil { val pkg = pm.getPackagesForUid(lastUid)?.firstOrNull() val label = getSystemUidLabel(lastUid, pkg) val drawable = pkg?.let { getAppIcon(pm, it) } - list.add(BatteryUsageApp(lastUid, pkg, label, currentMah, currentFg, currentBg, drawable)) + list.add( + BatteryUsageApp( + lastUid, + pkg, + label, + currentMah, + currentFg, + currentBg, + drawable + ) + ) } return list.sortedByDescending { it.powerMah } diff --git a/app/src/main/java/com/sameerasw/essentials/utils/DeviceLockUtils.kt b/app/src/main/java/com/sameerasw/essentials/utils/DeviceLockUtils.kt index 5885038fa..486654558 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/DeviceLockUtils.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/DeviceLockUtils.kt @@ -15,7 +15,8 @@ import com.sameerasw.essentials.services.tiles.ScreenOffAccessibilityService object DeviceLockUtils { fun performLockdownTileAction(context: Context, isLongPress: Boolean): Boolean { - val isLockdownEnabled = SettingsRepository(context).getBoolean(SettingsRepository.KEY_LOCKDOWN_MODE, false) + val isLockdownEnabled = + SettingsRepository(context).getBoolean(SettingsRepository.KEY_LOCKDOWN_MODE, false) val prefs = context.getSharedPreferences("essentials_prefs", Context.MODE_PRIVATE) val selectedScreenOffMethod = try { @@ -58,9 +59,10 @@ object DeviceLockUtils { if (ScreenOffAccessibilityService.instance != null) { performAccessibilityLock(ScreenOffAccessibilityService.instance!!) } else { - val serviceIntent = Intent(context, ScreenOffAccessibilityService::class.java).apply { - action = "LOCK_SCREEN" - } + val serviceIntent = + Intent(context, ScreenOffAccessibilityService::class.java).apply { + action = "LOCK_SCREEN" + } context.startService(serviceIntent) } true @@ -75,7 +77,8 @@ object DeviceLockUtils { ).show() return false } - val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager + val dpm = + context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager dpm.lockNow() true } diff --git a/app/src/main/java/com/sameerasw/essentials/utils/LanguageUtils.kt b/app/src/main/java/com/sameerasw/essentials/utils/LanguageUtils.kt index 133cf67bb..47edd9229 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/LanguageUtils.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/LanguageUtils.kt @@ -48,12 +48,16 @@ object LanguageUtils { data class Language(val code: String, val name: String, val nativeName: String) fun getLanguage(code: String): Language { - return languages.find { it.code == code || it.code.startsWith(code) || code.startsWith(it.code) } ?: run { - val parts = code.split("-", "_") - val loc = if (parts.size > 1) Locale(parts[0], parts[1].removePrefix("r")) else Locale(parts[0]) - val name = loc.displayLanguage.ifBlank { code } - val nativeName = loc.getDisplayLanguage(loc).ifBlank { name } - Language(code, name, nativeName) - } + return languages.find { it.code == code || it.code.startsWith(code) || code.startsWith(it.code) } + ?: run { + val parts = code.split("-", "_") + val loc = + if (parts.size > 1) Locale(parts[0], parts[1].removePrefix("r")) else Locale( + parts[0] + ) + val name = loc.displayLanguage.ifBlank { code } + val nativeName = loc.getDisplayLanguage(loc).ifBlank { name } + Language(code, name, nativeName) + } } } diff --git a/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt b/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt index 9ece5c314..da40fccce 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/ServiceUtils.kt @@ -3,18 +3,17 @@ package com.sameerasw.essentials.utils import android.content.Context import android.content.Intent import android.os.Build -import com.sameerasw.essentials.data.repository.SettingsRepository -import com.sameerasw.essentials.domain.diy.Automation -import com.sameerasw.essentials.domain.diy.DIYRepository -import com.sameerasw.essentials.services.AppDetectionService -import com.sameerasw.essentials.services.BatteryNotificationService - import androidx.work.Constraints import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.NetworkType import androidx.work.PeriodicWorkRequestBuilder import androidx.work.WorkManager +import com.sameerasw.essentials.data.repository.SettingsRepository +import com.sameerasw.essentials.domain.diy.Automation +import com.sameerasw.essentials.domain.diy.DIYRepository +import com.sameerasw.essentials.services.AppDetectionService import com.sameerasw.essentials.services.AppUpdateWorker +import com.sameerasw.essentials.services.BatteryNotificationService import java.util.concurrent.TimeUnit object ServiceUtils { diff --git a/app/src/main/java/com/sameerasw/essentials/utils/StatusBarIconUtils.kt b/app/src/main/java/com/sameerasw/essentials/utils/StatusBarIconUtils.kt index 8d5f6b101..f5e5abaed 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/StatusBarIconUtils.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/StatusBarIconUtils.kt @@ -16,7 +16,10 @@ fun updateIconBlacklistSetting( blacklistNames: Set ) { val repository = com.sameerasw.essentials.data.repository.SettingsRepository(context) - val isEnabled = repository.getBoolean(com.sameerasw.essentials.data.repository.SettingsRepository.KEY_STATUS_BAR_ICON_CONTROL_ENABLED, false) + val isEnabled = repository.getBoolean( + com.sameerasw.essentials.data.repository.SettingsRepository.KEY_STATUS_BAR_ICON_CONTROL_ENABLED, + false + ) if (!isEnabled) return if (blacklistNames.isEmpty()) { diff --git a/app/src/main/java/com/sameerasw/essentials/utils/ThermalUtil.kt b/app/src/main/java/com/sameerasw/essentials/utils/ThermalUtil.kt index c5ffa255d..c38fe27a0 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/ThermalUtil.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/ThermalUtil.kt @@ -55,7 +55,8 @@ object ThermalUtil { fun getThermalInfo(context: Context): ThermalInfo? { if (!ShellUtils.hasPermission(context)) return null - val output = ShellUtils.runCommandWithOutput(context, "dumpsys thermalservice") ?: return null + val output = + ShellUtils.runCommandWithOutput(context, "dumpsys thermalservice") ?: return null return parseDumpsysThermalService(output) } @@ -65,7 +66,8 @@ object ThermalUtil { // Format in dumpsys thermalservice: // Temperature{mValue=35.2, mType=3, mName=battery, mStatus=0} - val regex = Regex("""Temperature\{mValue=([0-9.]+),\s*mType=([0-9]+),\s*mName=([^,]+),\s*mStatus=([0-9]+)\}""") + val regex = + Regex("""Temperature\{mValue=([0-9.]+),\s*mType=([0-9]+),\s*mName=([^,]+),\s*mStatus=([0-9]+)\}""") output.lines().forEach { line -> regex.find(line)?.let { match -> diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt index 3f153be2c..b2769d165 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/MainViewModel.kt @@ -337,9 +337,6 @@ class MainViewModel : ViewModel() { val notificationSnoozeOptions = mutableStateOf>(listOf(15, 30, 60, 120)) - - - private var lastUpdateCheckTime: Long = 0 lateinit var settingsRepository: SettingsRepository private lateinit var updateRepository: UpdateRepository @@ -989,8 +986,10 @@ class MainViewModel : ViewModel() { schedulePeriodicWallpaperCheck(context) } schedulePeriodicAppUpdateCheck(context) - dailyWallpaperAutoUpdateTime.value = settingsRepository.getString(SettingsRepository.KEY_DAILY_WALLPAPER_AUTO_UPDATE_TIME) - isDailyWallpaperShowLastTime.value = settingsRepository.getBoolean(SettingsRepository.KEY_DAILY_WALLPAPER_SHOW_LAST_TIME) + dailyWallpaperAutoUpdateTime.value = + settingsRepository.getString(SettingsRepository.KEY_DAILY_WALLPAPER_AUTO_UPDATE_TIME) + isDailyWallpaperShowLastTime.value = + settingsRepository.getBoolean(SettingsRepository.KEY_DAILY_WALLPAPER_SHOW_LAST_TIME) if (isHideGestureBarEnabled.value) { applyHideGestureBar(context, true) @@ -1423,7 +1422,10 @@ class MainViewModel : ViewModel() { isFlashlightPocketTurnOffEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_FLASHLIGHT_POCKET_TURN_OFF_ENABLED) isFlashlightOverheatEnabled.value = - settingsRepository.getBoolean(SettingsRepository.KEY_FLASHLIGHT_OVERHEAT_PREVENTION_ENABLED, true) + settingsRepository.getBoolean( + SettingsRepository.KEY_FLASHLIGHT_OVERHEAT_PREVENTION_ENABLED, + true + ) isPitchBlackThemeEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_PITCH_BLACK_THEME_ENABLED) isEnableUnsupportedFeatures.value = settingsRepository.isEnableUnsupportedFeatures() @@ -1609,7 +1611,8 @@ class MainViewModel : ViewModel() { startBatteryNotificationService(context) } - isLockdownModeEnabled.value = settingsRepository.getBoolean(SettingsRepository.KEY_LOCKDOWN_MODE) + isLockdownModeEnabled.value = + settingsRepository.getBoolean(SettingsRepository.KEY_LOCKDOWN_MODE) } private fun startBatteryNotificationService(context: Context) { @@ -1957,7 +1960,11 @@ class MainViewModel : ViewModel() { } ?: "0.0" val updateInfoResult = - updateRepository.checkForUpdates(context, isPreReleaseCheckEnabled.value, currentVersion) + updateRepository.checkForUpdates( + context, + isPreReleaseCheckEnabled.value, + currentVersion + ) if (updateInfoResult != null) { updateInfo.value = updateInfoResult @@ -4079,7 +4086,11 @@ class MainViewModel : ViewModel() { settingsRepository.exportConfigs(outputStream) } - fun importConfigs(context: Context, inputStream: java.io.InputStream, keepPrefs: Boolean): Boolean { + fun importConfigs( + context: Context, + inputStream: java.io.InputStream, + keepPrefs: Boolean + ): Boolean { val success = settingsRepository.importConfigs(inputStream, keepPrefs) if (success) { settingsRepository.syncSystemSettingsWithSaved() @@ -4441,8 +4452,8 @@ class MainViewModel : ViewModel() { androidx.work.PeriodicWorkRequestBuilder( 12, java.util.concurrent.TimeUnit.HOURS ) - .setConstraints(constraints) - .build() + .setConstraints(constraints) + .build() androidx.work.WorkManager.getInstance(context).enqueueUniquePeriodicWork( "app_update_check_work", @@ -4459,10 +4470,13 @@ class MainViewModel : ViewModel() { } private fun updateDailyWallpaperAutoUpdateTime(enabled: Boolean) { - if (enabled){ + if (enabled) { val currentTime = LocalDateTime.now().toString() dailyWallpaperAutoUpdateTime.value = currentTime - settingsRepository.putString(SettingsRepository.KEY_DAILY_WALLPAPER_AUTO_UPDATE_TIME, currentTime) + settingsRepository.putString( + SettingsRepository.KEY_DAILY_WALLPAPER_AUTO_UPDATE_TIME, + currentTime + ) settingsRepository.putInt(SettingsRepository.KEY_DAILY_WALLPAPER_RETRY_COUNT, 0) } else { dailyWallpaperAutoUpdateTime.value = null @@ -4473,7 +4487,8 @@ class MainViewModel : ViewModel() { fun loadBatterySaverConstants(context: Context) { - val constantsStr = Settings.Global.getString(context.contentResolver, "battery_saver_constants") ?: "" + val constantsStr = + Settings.Global.getString(context.contentResolver, "battery_saver_constants") ?: "" val map = mutableMapOf() if (constantsStr.isNotEmpty()) { constantsStr.split(",").forEach { pair -> @@ -4510,7 +4525,11 @@ class MainViewModel : ViewModel() { private fun saveBatterySaverConstants(context: Context, map: Map) { val constantsStr = map.map { "${it.key}=${it.value}" }.joinToString(",") try { - Settings.Global.putString(context.contentResolver, "battery_saver_constants", constantsStr) + Settings.Global.putString( + context.contentResolver, + "battery_saver_constants", + constantsStr + ) batterySaverConstants.value = map } catch (e: Exception) { e.printStackTrace() @@ -4548,13 +4567,18 @@ class MainViewModel : ViewModel() { } fun syncShowNotificationSnooze(context: Context) { - val enabled = Settings.Secure.getInt(context.contentResolver, "show_notification_snooze", 0) == 1 + val enabled = + Settings.Secure.getInt(context.contentResolver, "show_notification_snooze", 0) == 1 isShowNotificationSnoozeEnabled.value = enabled } fun setShowNotificationSnoozeEnabled(context: Context, enabled: Boolean) { try { - Settings.Secure.putInt(context.contentResolver, "show_notification_snooze", if (enabled) 1 else 0) + Settings.Secure.putInt( + context.contentResolver, + "show_notification_snooze", + if (enabled) 1 else 0 + ) isShowNotificationSnoozeEnabled.value = enabled } catch (e: Exception) { e.printStackTrace() @@ -4562,7 +4586,8 @@ class MainViewModel : ViewModel() { } fun loadNotificationSnoozeOptions(context: Context) { - val raw = Settings.Global.getString(context.contentResolver, "notification_snooze_options") ?: "" + val raw = + Settings.Global.getString(context.contentResolver, "notification_snooze_options") ?: "" var def = 60 var opts = listOf(15, 30, 60, 120) if (raw.isNotEmpty()) { @@ -4587,7 +4612,11 @@ class MainViewModel : ViewModel() { fun saveNotificationSnoozeOptions(context: Context, def: Int, opts: List) { val serialized = "default=$def,options_array=${opts.joinToString(":")}" try { - Settings.Global.putString(context.contentResolver, "notification_snooze_options", serialized) + Settings.Global.putString( + context.contentResolver, + "notification_snooze_options", + serialized + ) notificationSnoozeDefault.intValue = def notificationSnoozeOptions.value = opts } catch (e: Exception) { @@ -4612,7 +4641,10 @@ class MainViewModel : ViewModel() { val isLockdownModeEnabled = mutableStateOf(false) fun toggleLockdownMode() { - settingsRepository.putBoolean(SettingsRepository.KEY_LOCKDOWN_MODE, !isLockdownModeEnabled.value) + settingsRepository.putBoolean( + SettingsRepository.KEY_LOCKDOWN_MODE, + !isLockdownModeEnabled.value + ) isLockdownModeEnabled.value = !isLockdownModeEnabled.value } } diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/StatusBarIconViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/StatusBarIconViewModel.kt index 0680c8fa6..5213e02c8 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/StatusBarIconViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/StatusBarIconViewModel.kt @@ -237,16 +237,19 @@ class StatusBarIconViewModel : ViewModel() { private fun updateIconBlacklist(context: Context) { if (!isWriteSecureSettingsEnabled.value) return - val blacklistNames = StatusBarIconRegistry.getBlacklistNames(getIconVisibilities()).toMutableSet() + val blacklistNames = + StatusBarIconRegistry.getBlacklistNames(getIconVisibilities()).toMutableSet() when (clockPosition.value) { - 1 -> { + 1 -> { blacklistNames.add("right_clock_position") blacklistNames.add("middle_clock_position") } - 2 -> { + + 2 -> { blacklistNames.add("left_clock_position") blacklistNames.add("right_clock_position") } + 3 -> { blacklistNames.add("left_clock_position") blacklistNames.add("middle_clock_position") diff --git a/app/src/main/java/com/sameerasw/essentials/viewmodels/WatchViewModel.kt b/app/src/main/java/com/sameerasw/essentials/viewmodels/WatchViewModel.kt index c318e1578..97804b78e 100644 --- a/app/src/main/java/com/sameerasw/essentials/viewmodels/WatchViewModel.kt +++ b/app/src/main/java/com/sameerasw/essentials/viewmodels/WatchViewModel.kt @@ -36,7 +36,8 @@ class WatchViewModel : ViewModel() { connectedWatchName.value = nodes.firstOrNull()?.displayName // Wear app version is lower than required (or not yet reported) - isWearUpdateRequired.value = detected && storedVersion < com.sameerasw.essentials.BuildConfig.REQUIRED_WEAR_VERSION_CODE + isWearUpdateRequired.value = + detected && storedVersion < com.sameerasw.essentials.BuildConfig.REQUIRED_WEAR_VERSION_CODE if (detected) { val messageClient = Wearable.getMessageClient(context) diff --git a/app/src/main/res/drawable/battery_android_0_24px.xml b/app/src/main/res/drawable/battery_android_0_24px.xml index 4d9e3905a..50469e25e 100644 --- a/app/src/main/res/drawable/battery_android_0_24px.xml +++ b/app/src/main/res/drawable/battery_android_0_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_1_24px.xml b/app/src/main/res/drawable/battery_android_frame_1_24px.xml index 88fc5c4ab..c0cbab6d8 100644 --- a/app/src/main/res/drawable/battery_android_frame_1_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_1_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_2_24px.xml b/app/src/main/res/drawable/battery_android_frame_2_24px.xml index bca7bb7af..4fc3d0438 100644 --- a/app/src/main/res/drawable/battery_android_frame_2_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_2_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_3_24px.xml b/app/src/main/res/drawable/battery_android_frame_3_24px.xml index 8f61a8b6e..2e0542761 100644 --- a/app/src/main/res/drawable/battery_android_frame_3_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_3_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_4_24px.xml b/app/src/main/res/drawable/battery_android_frame_4_24px.xml index bbbb154e5..e915c78eb 100644 --- a/app/src/main/res/drawable/battery_android_frame_4_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_4_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_5_24px.xml b/app/src/main/res/drawable/battery_android_frame_5_24px.xml index 22aa08712..6ae5ca54d 100644 --- a/app/src/main/res/drawable/battery_android_frame_5_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_5_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_6_24px.xml b/app/src/main/res/drawable/battery_android_frame_6_24px.xml index cab1c8a98..dda396324 100644 --- a/app/src/main/res/drawable/battery_android_frame_6_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_6_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_alert_24px.xml b/app/src/main/res/drawable/battery_android_frame_alert_24px.xml index e3d679ae1..4e41c4eef 100644 --- a/app/src/main/res/drawable/battery_android_frame_alert_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_alert_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_bolt_24px.xml b/app/src/main/res/drawable/battery_android_frame_bolt_24px.xml index 976e93d8f..7ee402ee0 100644 --- a/app/src/main/res/drawable/battery_android_frame_bolt_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_bolt_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_full_24px.xml b/app/src/main/res/drawable/battery_android_frame_full_24px.xml index 1ebf98dc2..5ac38a49b 100644 --- a/app/src/main/res/drawable/battery_android_frame_full_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_full_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_plus_24px.xml b/app/src/main/res/drawable/battery_android_frame_plus_24px.xml index 5a49aeca9..85497c789 100644 --- a/app/src/main/res/drawable/battery_android_frame_plus_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_plus_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/battery_android_frame_shield_24px.xml b/app/src/main/res/drawable/battery_android_frame_shield_24px.xml index fbac00ae3..27d4449fb 100644 --- a/app/src/main/res/drawable/battery_android_frame_shield_24px.xml +++ b/app/src/main/res/drawable/battery_android_frame_shield_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/reopen_window_24px.xml b/app/src/main/res/drawable/reopen_window_24px.xml index c649ef7a6..d7b251300 100644 --- a/app/src/main/res/drawable/reopen_window_24px.xml +++ b/app/src/main/res/drawable/reopen_window_24px.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/rounded_arrow_upward_24.xml b/app/src/main/res/drawable/rounded_arrow_upward_24.xml index 5f2861edd..2a5b22fd6 100644 --- a/app/src/main/res/drawable/rounded_arrow_upward_24.xml +++ b/app/src/main/res/drawable/rounded_arrow_upward_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_cable_24.xml b/app/src/main/res/drawable/rounded_cable_24.xml index 9112cde9a..ae41aae20 100644 --- a/app/src/main/res/drawable/rounded_cable_24.xml +++ b/app/src/main/res/drawable/rounded_cable_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_cycle_24.xml b/app/src/main/res/drawable/rounded_cycle_24.xml index 22d0b60a2..a1226d58c 100644 --- a/app/src/main/res/drawable/rounded_cycle_24.xml +++ b/app/src/main/res/drawable/rounded_cycle_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_device_thermostat_24.xml b/app/src/main/res/drawable/rounded_device_thermostat_24.xml index 56811cb63..020a17157 100644 --- a/app/src/main/res/drawable/rounded_device_thermostat_24.xml +++ b/app/src/main/res/drawable/rounded_device_thermostat_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_ecg_heart_24.xml b/app/src/main/res/drawable/rounded_ecg_heart_24.xml index b49ef38d4..45adfc076 100644 --- a/app/src/main/res/drawable/rounded_ecg_heart_24.xml +++ b/app/src/main/res/drawable/rounded_ecg_heart_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_flash_on_24.xml b/app/src/main/res/drawable/rounded_flash_on_24.xml index c8f272014..1694e0435 100644 --- a/app/src/main/res/drawable/rounded_flash_on_24.xml +++ b/app/src/main/res/drawable/rounded_flash_on_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_map_24.xml b/app/src/main/res/drawable/rounded_map_24.xml index 2ee8119cc..7b7b0d0d5 100644 --- a/app/src/main/res/drawable/rounded_map_24.xml +++ b/app/src/main/res/drawable/rounded_map_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_mobile_24.xml b/app/src/main/res/drawable/rounded_mobile_24.xml index 361046957..0506e42d8 100644 --- a/app/src/main/res/drawable/rounded_mobile_24.xml +++ b/app/src/main/res/drawable/rounded_mobile_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_mobile_charge_24.xml b/app/src/main/res/drawable/rounded_mobile_charge_24.xml index 0af9cce6a..5e64ceaba 100644 --- a/app/src/main/res/drawable/rounded_mobile_charge_24.xml +++ b/app/src/main/res/drawable/rounded_mobile_charge_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_motion_photos_paused_24.xml b/app/src/main/res/drawable/rounded_motion_photos_paused_24.xml index 017fa1a1d..fdd9c38fc 100644 --- a/app/src/main/res/drawable/rounded_motion_photos_paused_24.xml +++ b/app/src/main/res/drawable/rounded_motion_photos_paused_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_motion_play_24.xml b/app/src/main/res/drawable/rounded_motion_play_24.xml index 409d1cdd0..a5bba127d 100644 --- a/app/src/main/res/drawable/rounded_motion_play_24.xml +++ b/app/src/main/res/drawable/rounded_motion_play_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_notifications_paused_24.xml b/app/src/main/res/drawable/rounded_notifications_paused_24.xml index d114c346f..7ba04e1b5 100644 --- a/app/src/main/res/drawable/rounded_notifications_paused_24.xml +++ b/app/src/main/res/drawable/rounded_notifications_paused_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_power_input_24.xml b/app/src/main/res/drawable/rounded_power_input_24.xml index 4bcc2d25f..efd56cfab 100644 --- a/app/src/main/res/drawable/rounded_power_input_24.xml +++ b/app/src/main/res/drawable/rounded_power_input_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_shield_lock_24.xml b/app/src/main/res/drawable/rounded_shield_lock_24.xml index 4f937f72e..32c2c9b20 100644 --- a/app/src/main/res/drawable/rounded_shield_lock_24.xml +++ b/app/src/main/res/drawable/rounded_shield_lock_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_sound_detection_loud_sound_24.xml b/app/src/main/res/drawable/rounded_sound_detection_loud_sound_24.xml index 121f634a1..d86f52b62 100644 --- a/app/src/main/res/drawable/rounded_sound_detection_loud_sound_24.xml +++ b/app/src/main/res/drawable/rounded_sound_detection_loud_sound_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_stop_circle_24.xml b/app/src/main/res/drawable/rounded_stop_circle_24.xml index 1e9b988c3..7e0bfa753 100644 --- a/app/src/main/res/drawable/rounded_stop_circle_24.xml +++ b/app/src/main/res/drawable/rounded_stop_circle_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_thermometer_alert_24.xml b/app/src/main/res/drawable/rounded_thermometer_alert_24.xml index e4783a634..f353d0688 100644 --- a/app/src/main/res/drawable/rounded_thermometer_alert_24.xml +++ b/app/src/main/res/drawable/rounded_thermometer_alert_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_translate_24.xml b/app/src/main/res/drawable/rounded_translate_24.xml index b2ea3a466..770dffab2 100644 --- a/app/src/main/res/drawable/rounded_translate_24.xml +++ b/app/src/main/res/drawable/rounded_translate_24.xml @@ -13,8 +13,15 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - - - + + + + diff --git a/app/src/main/res/drawable/rounded_visibility_24.xml b/app/src/main/res/drawable/rounded_visibility_24.xml index 198d1616b..85463f359 100644 --- a/app/src/main/res/drawable/rounded_visibility_24.xml +++ b/app/src/main/res/drawable/rounded_visibility_24.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/app/src/main/res/drawable/rounded_visibility_off_24.xml b/app/src/main/res/drawable/rounded_visibility_off_24.xml index 516b890fe..5eeaa9f02 100644 --- a/app/src/main/res/drawable/rounded_visibility_off_24.xml +++ b/app/src/main/res/drawable/rounded_visibility_off_24.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4b7ffdda7..47a6d73f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1464,48 +1464,48 @@ Advertise Enabled Report to applications that battery saver is enabled. - + Data Saver Enable Data Saver to restrict background data usage. - + Force Dark/Night Mode Force dark theme when battery saver is activated. - + Disable Launch Boost Reduce CPU boosting during app startup to save power. - + Disable Vibration Disable haptic feedback and vibrations globally. - + Disable Animations Turn off window and system animations. - + Defer Full Backup Postpone full system backups until battery saver is turned off. - + Defer Key-Value Backup Postpone key-value backups. - + Enable Firewall Enable net firewall to restrict background networking. - + Enable Brightness Reduction Allow lowering the display brightness limit when saver is active. - + Brightness Adjustment Factor - + Force Standby Put all apps into App Standby bucket when active. - + Force Background Check Enforce strict background service restrictions. - + Disable Optional Sensors Disable power-hungry optional sensors like proximity, gyro, etc. - + Disable Always-on Display Turn off Ambient / Always-on display. - + Enable Quick Doze Enter Doze sleep mode faster when the screen turns off. @@ -1544,7 +1544,6 @@ Notification snooze options reset successfully - Interaction Interface Display diff --git a/app/src/main/res/xml/qs_tiles_widget_info.xml b/app/src/main/res/xml/qs_tiles_widget_info.xml index 092ff01ef..e95d8e71a 100644 --- a/app/src/main/res/xml/qs_tiles_widget_info.xml +++ b/app/src/main/res/xml/qs_tiles_widget_info.xml @@ -1,5 +1,6 @@ + android:widgetCategory="home_screen" + android:widgetFeatures="reconfigurable|configuration_optional" />