Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
1b81fa2
1. Added Marquee in required locations.
rahulsharma860 May 3, 2026
8a0d3bc
Merge branch 'main' into fix/ui-added-marquee
sameerasw May 12, 2026
af138f1
1. Added Marquee in required locations. (#391)
sameerasw May 12, 2026
dfe5523
feat: add Beta label to FloatingToolbar and update FeatureCard stylin…
sameerasw May 12, 2026
08084ed
feat: add Shizuku restart configuration to Shut Up settings to preven…
sameerasw May 12, 2026
1e811a7
feat: replace text ellipsis with basicMarquee in QuickSettingsTilesSe…
sameerasw May 12, 2026
f4437de
feat: enable marquee animation for truncated favorite titles in Favor…
sameerasw May 12, 2026
d4b1a1e
feat: add WatchInstallHelpBottomSheet to guide users through installi…
sameerasw May 12, 2026
72aef22
feat: add high-resolution shortcut icon generation to AppUtil and int…
sameerasw May 12, 2026
2315731
refactor: #372 move status bar icon logic to StatusBarIconHandler and…
sameerasw May 12, 2026
70d8466
feat: add toggle to disable rotation suggestion in other customizatio…
sameerasw May 12, 2026
1467510
feat: add support for customizing lock screen clock styles
sameerasw May 12, 2026
b2e86dd
feat: add haptic feedback on carousel item change in lock screen cloc…
sameerasw May 12, 2026
7a54f88
feat: add customization options for lock screen clock style, color, a…
sameerasw May 12, 2026
6d90fa7
feat: implement dynamic seed color calculation based on selected lock…
sameerasw May 12, 2026
3acee5e
feat: expand LockScreenClockSettingsUI with additional color options,…
sameerasw May 12, 2026
ec43919
feat: add pause and resume functionality to location alarms and updat…
sameerasw May 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ dependencies {
// Google Maps & Location
implementation(libs.play.services.location)
implementation(libs.play.services.wearable)
implementation(libs.androidx.wear.remote.interactions)
implementation(libs.androidx.work.runtime.ktx)
implementation(libs.gson)

Expand All @@ -153,4 +154,10 @@ dependencies {
implementation(libs.androidx.media3.exoplayer)
implementation(libs.androidx.media3.common)

// RemoteIntent support
implementation("androidx.wear:wear-remote-interactions:1.1.0-alpha02")

// tandard wearable library
implementation("com.google.android.gms:play-services-wearable:19.0.0")

}
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,7 @@ class FeatureSettingsActivity : AppCompatActivity() {
// Help Sheet State
var showHelpSheet by remember { mutableStateOf(false) }
var showInstructionsSheet by remember { mutableStateOf(false) }
var showWatchInstallHelpSheet by remember { mutableStateOf(false) }
var selectedHelpFeature by remember {
mutableStateOf<com.sameerasw.essentials.domain.model.Feature?>(
null
Expand Down Expand Up @@ -270,6 +271,7 @@ class FeatureSettingsActivity : AppCompatActivity() {
"Battery notification" -> !viewModel.isPostNotificationsEnabled.value || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !viewModel.isBluetoothPermissionGranted.value)
"Text and animations" -> !viewModel.isWriteSettingsEnabled.value || !isWriteSecureSettingsEnabled
"Always on Display" -> !isWriteSecureSettingsEnabled
"Lock screen clock" -> !isWriteSecureSettingsEnabled
"Other customizations" -> !com.sameerasw.essentials.utils.ShellUtils.hasPermission(context)
"Shut-Up!" -> !isWriteSecureSettingsEnabled || !viewModel.isUsageStatsPermissionGranted.value
else -> false
Expand Down Expand Up @@ -326,6 +328,12 @@ class FeatureSettingsActivity : AppCompatActivity() {
)
}

if (showWatchInstallHelpSheet) {
com.sameerasw.essentials.ui.components.sheets.WatchInstallHelpBottomSheet(
onDismissRequest = { showWatchInstallHelpSheet = false }
)
}

val pageTitle = if (featureObj != null) stringResource(featureObj.title) else featureId
val hasMenu = featureObj != null && featureObj.aboutDescription != null

Expand Down Expand Up @@ -413,6 +421,7 @@ class FeatureSettingsActivity : AppCompatActivity() {
"Caffeinate" -> !viewModel.isPostNotificationsEnabled.value
"Battery notification" -> !viewModel.isPostNotificationsEnabled.value || (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !viewModel.isBluetoothPermissionGranted.value)
"Text and animations" -> !viewModel.isWriteSettingsEnabled.value || !isWriteSecureSettingsEnabled
"Lock screen clock" -> !isWriteSecureSettingsEnabled
"Screen refresh rate" -> !viewModel.isShizukuPermissionGranted.value
"Shut-Up!" -> !isWriteSecureSettingsEnabled || !viewModel.isUsageStatsPermissionGranted.value
else -> false
Expand Down Expand Up @@ -682,6 +691,14 @@ class FeatureSettingsActivity : AppCompatActivity() {
)
}

"Lock screen clock" -> {
com.sameerasw.essentials.ui.composables.configs.LockScreenClockSettingsUI(
viewModel = viewModel,
modifier = Modifier.padding(top = 16.dp),
highlightSetting = highlightSetting
)
}

"Shut-Up!" -> {
ShutUpSettingsUI(
viewModel = viewModel,
Expand All @@ -700,12 +717,15 @@ class FeatureSettingsActivity : AppCompatActivity() {

EssentialsFloatingToolbar(
title = pageTitle,
isBeta = featureObj?.isBeta ?: false,
onBackClick = { finish() },
modifier = Modifier
.align(Alignment.BottomCenter)
.zIndex(1f),
onHelpClick = {
if (hasMenu) {
if (featureId == "Watch") {
showWatchInstallHelpSheet = true
} else if (hasMenu) {
selectedHelpFeature = featureObj
showHelpSheet = true
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,4 +150,19 @@ class LocationReachedRepository(context: Context) {
saveAlarms(alarms)
}
}

fun updatePausedState(alarmId: String, isPaused: Boolean) {
val alarms = getAlarms().toMutableList()
val index = alarms.indexOfFirst { it.id == alarmId }
if (index != -1) {
alarms[index] = alarms[index].copy(isPaused = isPaused)
saveAlarms(alarms)
}

// Also update temp alarm if it matches
val currentTemp = _tempAlarm.value
if (currentTemp?.id == alarmId) {
_tempAlarm.value = currentTemp.copy(isPaused = isPaused)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,16 @@ class SettingsRepository(private val context: Context) {

const val KEY_SHUT_UP_SELECTED_APPS = "shut_up_selected_apps"
const val KEY_SHUT_UP_ORIGINAL_SETTINGS = "shut_up_original_settings"
const val KEY_SHUT_UP_ATTEMPT_SHIZUKU_RESTART = "shut_up_attempt_shizuku_restart"
const val KEY_DISABLE_ROTATION_SUGGESTION = "disable_rotation_suggestion"

const val KEY_LOCK_SCREEN_CLOCK_WEIGHT = "lock_screen_clock_weight"
const val KEY_LOCK_SCREEN_CLOCK_WIDTH = "lock_screen_clock_width"
const val KEY_LOCK_SCREEN_CLOCK_GRADE = "lock_screen_clock_grade"
const val KEY_LOCK_SCREEN_CLOCK_ROUNDNESS = "lock_screen_clock_roundness"
const val KEY_LOCK_SCREEN_CLOCK_COLOR_TONE = "lock_screen_clock_color_tone"
const val KEY_LOCK_SCREEN_CLOCK_SELECTED_COLOR_ID = "lock_screen_clock_selected_color_id"
const val KEY_LOCK_SCREEN_CLOCK_SEED_COLOR = "lock_screen_clock_seed_color"
}

// Observe changes
Expand Down Expand Up @@ -800,6 +810,9 @@ class SettingsRepository(private val context: Context) {
saveTrackedRepos(current)
}

fun isShutUpAttemptShizukuRestartEnabled(): Boolean = getBoolean(KEY_SHUT_UP_ATTEMPT_SHIZUKU_RESTART, true)
fun setShutUpAttemptShizukuRestartEnabled(enabled: Boolean) = putBoolean(KEY_SHUT_UP_ATTEMPT_SHIZUKU_RESTART, enabled)

fun removeTrackedRepo(fullName: String) {
val current = getTrackedRepos().toMutableList()
current.removeAll { it.fullName == fullName }
Expand Down Expand Up @@ -1209,5 +1222,25 @@ class SettingsRepository(private val context: Context) {
}
}

fun getLockScreenClockWeight(): Int = getInt(KEY_LOCK_SCREEN_CLOCK_WEIGHT, 300)
fun setLockScreenClockWeight(value: Int) = putInt(KEY_LOCK_SCREEN_CLOCK_WEIGHT, value)

fun getLockScreenClockWidth(): Int = getInt(KEY_LOCK_SCREEN_CLOCK_WIDTH, 116)
fun setLockScreenClockWidth(value: Int) = putInt(KEY_LOCK_SCREEN_CLOCK_WIDTH, value)

fun getLockScreenClockGrade(): Int = getInt(KEY_LOCK_SCREEN_CLOCK_GRADE, 0)
fun setLockScreenClockGrade(value: Int) = putInt(KEY_LOCK_SCREEN_CLOCK_GRADE, value)

fun getLockScreenClockRoundness(): Int = getInt(KEY_LOCK_SCREEN_CLOCK_ROUNDNESS, 100)
fun setLockScreenClockRoundness(value: Int) = putInt(KEY_LOCK_SCREEN_CLOCK_ROUNDNESS, value)

fun getLockScreenClockColorTone(): Int = getInt(KEY_LOCK_SCREEN_CLOCK_COLOR_TONE, 75)
fun setLockScreenClockColorTone(value: Int) = putInt(KEY_LOCK_SCREEN_CLOCK_COLOR_TONE, value)

fun getLockScreenClockSelectedColorId(): String = getString(KEY_LOCK_SCREEN_CLOCK_SELECTED_COLOR_ID, "DEFAULT") ?: "DEFAULT"
fun setLockScreenClockSelectedColorId(value: String) = putString(KEY_LOCK_SCREEN_CLOCK_SELECTED_COLOR_ID, value)

fun getLockScreenClockSeedColor(): Int = getInt(KEY_LOCK_SCREEN_CLOCK_SEED_COLOR, 0)
fun setLockScreenClockSeedColor(value: Int) = putInt(KEY_LOCK_SCREEN_CLOCK_SEED_COLOR, value)
}

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ data class LocationAlarm(
@SerializedName("radius") val radius: Int = 1000, // in meters
@SerializedName("isEnabled") val isEnabled: Boolean = false,
@SerializedName("lastTravelled") val lastTravelled: Long? = null,
@SerializedName("isPaused") val isPaused: Boolean = false,
@SerializedName("iconResName") val iconResName: String = "round_navigation_24",
@SerializedName("createdAt") val createdAt: Long = System.currentTimeMillis()
)
Original file line number Diff line number Diff line change
Expand Up @@ -105,21 +105,6 @@ object FeatureRegistry {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},
object : Feature(
id = "Shut-Up!",
title = R.string.feat_shut_up_title,
iconRes = R.drawable.rounded_domino_mask_24,
category = R.string.cat_system,
description = R.string.feat_shut_up_desc,
aboutDescription = R.string.shut_up_description,
permissionKeys = listOf("WRITE_SECURE_SETTINGS", "USAGE_STATS"),
showToggle = false,
hasMoreSettings = true,
parentFeatureId = "Security"
) {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},
object : Feature(
id = "Notifications",
title = R.string.feat_notifications_alerts_title,
Expand Down Expand Up @@ -234,6 +219,20 @@ object FeatureRegistry {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},
object : Feature(
id = "Lock screen clock",
title = R.string.feat_lock_screen_clock_title,
iconRes = R.drawable.rounded_nest_clock_farsight_analog_24,
category = R.string.cat_interface,
description = R.string.feat_lock_screen_clock_desc,
aboutDescription = R.string.about_desc_lock_screen_clock,
permissionKeys = listOf("WRITE_SECURE_SETTINGS"),
showToggle = false,
parentFeatureId = "Display"
) {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},
object : Feature(
id = "Watch",
title = R.string.feat_watch_title,
Expand Down Expand Up @@ -826,14 +825,30 @@ object FeatureRegistry {

override fun isEnabled(viewModel: MainViewModel) = viewModel.isAppLockEnabled.value
override fun isToggleEnabled(viewModel: MainViewModel, context: Context) =
if (viewModel.isUseUsageAccess.value)
(if (viewModel.isUseUsageAccess.value)
viewModel.isUsageStatsPermissionGranted.value
else
viewModel.isAccessibilityEnabled.value
viewModel.isAccessibilityEnabled.value)

override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) =
viewModel.setAppLockEnabled(enabled, context)
},
object : Feature(
id = "Shut-Up!",
title = R.string.feat_shut_up_title,
iconRes = R.drawable.rounded_domino_mask_24,
category = R.string.cat_system,
description = R.string.feat_shut_up_desc,
aboutDescription = R.string.shut_up_description,
permissionKeys = listOf("WRITE_SECURE_SETTINGS", "USAGE_STATS"),
showToggle = false,
hasMoreSettings = true,
isBeta = true,
parentFeatureId = "Security"
) {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},

object : Feature(
id = "Location reached",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ fun initPermissionRegistry() {
PermissionRegistry.register("WRITE_SECURE_SETTINGS", R.string.feat_dynamic_night_light_title)
PermissionRegistry.register("WRITE_SECURE_SETTINGS", R.string.tile_developer_options)
PermissionRegistry.register("WRITE_SECURE_SETTINGS", R.string.tile_charge_optimization)
PermissionRegistry.register("WRITE_SECURE_SETTINGS", R.string.feat_lock_screen_clock_title)

// Shizuku permission
PermissionRegistry.register("SHIZUKU", R.string.feat_freeze_title)
Expand Down
Loading