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" />