From f5b8f77e9e89f31f4503f3a07fea17d62c42b16d Mon Sep 17 00:00:00 2001 From: xLexip Date: Wed, 21 May 2025 21:13:31 +0200 Subject: [PATCH 01/75] feat(ui): Material Design 3 Expressive Redesign * Match the new system settings (Android 16 QPR 1) --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 8 ++-- .../ui/components/SwitchPreferenceCard.kt | 41 ++++++++++++++----- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 1fec2c3..25a1651 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -34,6 +34,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll 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 dev.lexip.hecate.R @@ -48,7 +49,7 @@ fun AdaptiveThemeScreen( ) { val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) - val horizontalOffsetPadding = 4.dp + val horizontalOffsetPadding = 8.dp Scaffold( modifier = Modifier .nestedScroll(scrollBehavior.nestedScrollConnection), @@ -62,7 +63,8 @@ fun AdaptiveThemeScreen( title = { Text( text = stringResource(id = R.string.app_name), - style = MaterialTheme.typography.displaySmall + style = MaterialTheme.typography.displaySmall, + fontWeight = FontWeight.Medium ) }, scrollBehavior = scrollBehavior @@ -74,12 +76,12 @@ fun AdaptiveThemeScreen( .windowInsetsPadding(WindowInsets.systemGestures.only(WindowInsetsSides.Horizontal)) .fillMaxSize() .padding(innerPadding) - .padding(horizontal = horizontalOffsetPadding) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(32.dp) ) { Text( + modifier = Modifier.padding(horizontal = horizontalOffsetPadding), text = stringResource(id = R.string.description_adaptive_theme), style = MaterialTheme.typography.bodyLarge.copy(lineHeight = 22.sp) ) diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/SwitchPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/SwitchPreferenceCard.kt index f1d39fd..664343a 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/SwitchPreferenceCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/SwitchPreferenceCard.kt @@ -13,47 +13,68 @@ package dev.lexip.hecate.ui.components import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Clear import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Switch +import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp @Composable fun SwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { - val mainSwitchTextSize = (MaterialTheme.typography.titleLarge.fontSize.value - 2).sp - Card( modifier = Modifier .fillMaxWidth(), - shape = MaterialTheme.shapes.extraLarge, + shape = RoundedCornerShape(percent = 100), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.primaryContainer), onClick = { onCheckedChange(!isChecked) } ) { Row( modifier = Modifier .fillMaxWidth() - .padding(PaddingValues(16.dp)) - .padding(start = 4.dp), + .padding(top = 12.dp, bottom = 12.dp, start = 32.dp, end = 20.dp), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { Text( - style = MaterialTheme.typography.titleLarge, - fontSize = mainSwitchTextSize, + style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onPrimaryContainer, text = text ) - Switch(checked = isChecked, onCheckedChange = onCheckedChange) + Switch( + checked = isChecked, + onCheckedChange = onCheckedChange, + thumbContent = if (isChecked) { + { + Icon( + imageVector = Icons.Filled.Check, + contentDescription = null, + modifier = Modifier.size(SwitchDefaults.IconSize), + ) + } + } else { + { + Icon( + imageVector = Icons.Filled.Clear, + contentDescription = null, + modifier = Modifier.size(SwitchDefaults.IconSize), + ) + } + } + ) } } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d66de97..4a5c0c8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,7 +2,7 @@ Adaptive theme Disable notification Use adaptive theme - Adaptive Theme automatically adjusts the device theme based on ambient brightness. It enhances visibility in bright conditions while optimizing battery life. + Adaptive Theme automatically adjusts the device theme based on ambient brightness.\nIt enhances visibility in bright conditions while optimizing battery life. Background Activity Adaptive theme is active \ No newline at end of file From 2966150d414c58025f41c5da6340e7f9d6c5ada8 Mon Sep 17 00:00:00 2001 From: xLexip Date: Thu, 30 Oct 2025 20:49:36 +0100 Subject: [PATCH 02/75] chore: Apply minor dependency updates --- app/build.gradle.kts | 7 ++++-- .../java/dev/lexip/hecate/ui/theme/Theme.kt | 15 ++++++++--- gradle/libs.versions.toml | 25 ++++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index cf24241..99c34c7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -33,8 +33,10 @@ android { sourceCompatibility = VERSION_23 targetCompatibility = VERSION_23 } - kotlinOptions { - jvmTarget = "23" + kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_23) + } } buildFeatures { compose = true @@ -65,6 +67,7 @@ dependencies { implementation(libs.androidx.ui.tooling.preview) implementation(libs.material) implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.material.icons.extended) testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) diff --git a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt index a80b1c0..12abbfb 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 xLexip + * Copyright (C) 2024-2025 xLexip * * Licensed under the GNU General Public License, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,13 +13,16 @@ package dev.lexip.hecate.ui.theme import android.content.Context +import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TopAppBarColors import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.material3.darkColorScheme import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext @@ -29,8 +32,12 @@ fun HecateTheme( context: Context = LocalContext.current, content: @Composable () -> Unit ) { - val colorScheme = - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + val colorScheme = when { + Build.VERSION.SDK_INT >= 31 && darkTheme -> dynamicDarkColorScheme(context) + Build.VERSION.SDK_INT >= 31 -> dynamicLightColorScheme(context) + darkTheme -> darkColorScheme() + else -> lightColorScheme() + } MaterialTheme( colorScheme = colorScheme, @@ -40,7 +47,7 @@ fun HecateTheme( @OptIn(ExperimentalMaterial3Api::class) @Composable -fun hecateTopAppBarColors(): TopAppBarColors = TopAppBarDefaults.largeTopAppBarColors( +fun hecateTopAppBarColors(): TopAppBarColors = TopAppBarDefaults.topAppBarColors( // This represents the top app bar style of the android system settings app in Android 15. containerColor = MaterialTheme.colorScheme.surfaceContainer, scrolledContainerColor = MaterialTheme.colorScheme.surfaceVariant, diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b57eb2c..3a21ed9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,25 +1,26 @@ [versions] -activityCompose = "1.10.1" -agp = "8.9.2" -appcompat = "1.7.0" -composeBom = "2025.04.01" -coreKtx = "1.16.0" +activityCompose = "1.11.0" +agp = "8.13.0" +appcompat = "1.7.1" +composeBom = "2025.10.01" +coreKtx = "1.17.0" coreSplashscreenVersion = "1.0.1" -datastorePreferencesCore = "1.1.4" -espressoCore = "3.6.1" +datastorePreferencesCore = "1.1.7" +espressoCore = "3.7.0" junit = "4.13.2" -junitVersion = "1.2.1" -kotlin = "2.1.20" -lifecycleRuntimeKtx = "2.8.7" -lifecycleViewmodelCompose = "2.8.7" +junitVersion = "1.3.0" +kotlin = "2.2.21" +lifecycleRuntimeKtx = "2.9.4" +lifecycleViewmodelCompose = "2.9.4" localbroadcastmanager = "1.1.0" -material = "1.12.0" +material = "1.13.0" preference = "1.2.1" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-splashscreen-v100 = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreenVersion" } androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "datastorePreferencesCore" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca025c8..d4081da 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From afd37cd840c5c270b465246bbbbfffe532a1f4c3 Mon Sep 17 00:00:00 2001 From: xLexip Date: Thu, 30 Oct 2025 20:50:01 +0100 Subject: [PATCH 03/75] chore: Update sonarqube to v7 --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 17166ed..1eb577e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,13 +3,13 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false - id("org.sonarqube") version "6.1.0.5360" + id("org.sonarqube") version "7.0.1.6134" } sonar { properties { property("sonar.projectKey", "xLexip_Hecate") - property("sonar.projectVersion", "1.0.0") + property("sonar.projectVersion", "0.1.0") property("sonar.organization", "xlexip") property("sonar.host.url", "https://sonarcloud.io") property("sonar.androidLint.reportPaths", "app/build/reports/lint-results-debug.html") From b92b71796fefade985ce3a992c9a84fbf185b83f Mon Sep 17 00:00:00 2001 From: xLexip Date: Thu, 30 Oct 2025 21:19:34 +0100 Subject: [PATCH 04/75] chore(renovate): Add renovate label to merge requests --- renovate.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/renovate.json b/renovate.json index ef1b19c..51aaecb 100644 --- a/renovate.json +++ b/renovate.json @@ -8,6 +8,9 @@ "develop" ], "dependencyDashboard": true, + "labels": [ + "renovate" + ], "packageRules": [ { "groupName": "Patched Dependencies", From 89c6c3eb03b1fe0d8bec4b67259b4671efc98a93 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 01:19:32 +0000 Subject: [PATCH 05/75] chore(config): migrate config renovate.json --- renovate.json | 58 +++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/renovate.json b/renovate.json index 51aaecb..2e664a2 100644 --- a/renovate.json +++ b/renovate.json @@ -1,31 +1,31 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:recommended", - ":semanticCommits" - ], - "baseBranches": [ - "develop" - ], - "dependencyDashboard": true, - "labels": [ - "renovate" - ], - "packageRules": [ - { - "groupName": "Patched Dependencies", - "groupSlug": "patch-updates", - "matchUpdateTypes": [ - "patch" - ] - }, - { - "commitMessageAction": "Apply", - "groupName": "Minor Dependency Updates", - "groupSlug": "minor-updates", - "matchUpdateTypes": [ - "minor" - ] - } - ] + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended", + ":semanticCommits" + ], + "baseBranchPatterns": [ + "develop" + ], + "dependencyDashboard": true, + "labels": [ + "renovate" + ], + "packageRules": [ + { + "groupName": "Patched Dependencies", + "groupSlug": "patch-updates", + "matchUpdateTypes": [ + "patch" + ] + }, + { + "commitMessageAction": "Apply", + "groupName": "Minor Dependency Updates", + "groupSlug": "minor-updates", + "matchUpdateTypes": [ + "minor" + ] + } + ] } From cc6291a67a994d0957b99ed2c52bc02a87dae014 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 01:19:11 +0000 Subject: [PATCH 06/75] chore(deps): update gradle to v9 --- gradle/wrapper/gradle-wrapper.jar | Bin 43764 -> 45633 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 5 +---- gradlew.bat | 3 +-- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55baabb587c669f562ae36f953de2481846..f8e1ee3125fe0768e9a76ee977ac089eb657005e 100644 GIT binary patch delta 37442 zcmX6^V`E)y*G$_Ojn&w;ZQHhOYNtI^y0dB5x*u&jIU21Bhf}7%e`>rSh z1#LY&uAK}92G$A&y5+$IAt4F@2|8jt0LwA}}afFkG#WBw^#$TCX0J^k+I+tvA_2h1Itw`Li1kgyHcDwujll*+Po z$XwsbUNDm$Wt&2Li;oZ)KsqHBet>&OoWy>!E1MRems2?s$vd~r0vYTN=myB^=e|Ep zOPhp4yC7$yh?X{pJgiX}r=I+{B<4TOeoUksBm-D~H<`&WFHZHWL|{HK)gK&-S}>%I ziIqri>?=0OaJ^KsnnmZJiFiG_f?UADlLvkG)=-3Aw~z%^S?4XD<*iL~Me#4^m2$Zj`empiTmN1WnOgbi8v`sM08Y{O`ZL zDN>@uIp~1rj*c9p2a4rsJ73t%3fhNB|EHS9+$2cA79N(jr%Qb1IRH{_$pRXHaK`8dw#}-s*DfXJeoWNogcLPp( zC#5c477mpu8)E~nb*Lev%2hfE^f-7GM%lGk{TaOK^n$z$aidXt)|O&57^|vNL>i(A z#)k1{uik?cea-bP^a_f6K&sH6VAxcnmS1QMy#2JiyY`*r9k9U@c%6$#Db1g4QmPTw zP-deC)iPvGaxE1m;GFQI)sY#;1|iY~Z6?hbnLrJT6FpYiejmw@Q~IHbUGL-xND<2H z)p(|GQFxTZ0Z$`p7!szU_@vn|OEhF%W2}>S`xPL$Q5I20*Q2c#UZ*|-a{ zHzYc6en{$9^L)!5OqfHaa8Tcj#Y=((4}9UN>~bEB#cO1=P7B_!+=f+Q)*C&M+}T{A zC$+v;Z=?Rmh%t98yfbSSdXdE1ik=VA0XEuuTl;a7dqqhIalVtBiDWUu(_dP$jeCeT zg=taDEp4CPa+l{5z;DhDQH6y3?xR^7gTqNT18`DFf(ZXGMz10kuL(@XTIRo_Fi&weHNZ z{f+G(;f9?EH1rb4&On<@5auFNj4=O6plt+z2MsAQ z8k`XP$8pawNz0h;U|{P%{&AcJ)J=l{ibTZ&*eRe2A^E3#m#8U5L%z}D75eMWs?LvQ zEgL^DQ1p!?GLXUCrU=t9~vC@d(;hnKYq zz-NRPA}7GAe!c-G)@#XGGL2KR9#Pk!OP#C^T{%|z?md4$f^_9{Ph=PBs!J8(Tr9Gb zqDXW|?BjJhtGwDEHvYm1Ih5xBA!in0QB8q0A;={r;k1q_HtrI29(e6yr9m|ZS1p`> zw0xGJm>J`~n-4Ss_6bUB*oyI@{1V3ope$jB^p@#E&jhX?_o-ru6SU981 ze)V2H^*$Qu)80DEw0)aq15ULt$3JT0kL+Z3h%PZs68>Feuhj^a;WIF8F0SVWm^;Q? zF~#Eq@?K8P`}4hb-@v;B!!9{S5s__4MAlH1p2A^=x&k&ACPyA4ZKQAeD{#bKkGcWnJ&KdnWOzmd7*3E|K=Jp6|BnUXG#*K^`Fw zoKj0L0wF5~|G`d7z(qj&AMBdI|JPb@h{!++807z8x2}%nPj8A9?d4$A?55*L6-Y{M zXUK{)1o_*6noez=I8?gIK1*hAFLlJ-aK7O)?$HGxNK?lY({-_4^ik$E>|P<9pT;0( zO5uOyGQ~H|b&UV@wrx=JO?Dr$f1X0&3d3KCMt2*{T`gPX5rM7pEOwDm_6jGqN=sf1 z=?Va=;;1lVob8jLkNLM`xq;WsJ~%UHq#`E6{1#{)!e3H)|N2hrwAsh=7E@w{va{Ig z9)TaK$6`yQ+h2{`My4D0MBKs1#ilh=VJ!2}h#DO3B6=G5LMoO9*4jCysFxZB!7mT(pAs+&x3tA+WNE6*L{!uJLW%`O+he16V|(Lf61#p- z+5;bNlZSnyj%Dqaoyi0w?QR*Fk#Ur1kl&mIGa68}#o8sYOeM2va~cKbsjx*jCjs%% z>*9UbKz@piah<FraUf9bX;sb6pnTz6@^OtCl{Xm@FVPZ>AZLr+j` z+FrD-xpS`2$~Op!%w0nxbxz`5@s2qKdnKo~+szzy7VEK&ae-AdEdh0ef6)4EZH*CE z2u>zofc77JU*S)@8*;GBBkoF2Rsi_DGT1@yaEH8)D%3>|3K9fvf%Ld_`nJXrGTW~) zg*MA##_5?aBWzMxmgolOMBDOZS?BoZHsbWQonmqxCYPQUJp+sr&$;kg&PBf`=vTy8 zhfoZeUff7#bEav>zt9W`ClJ^wFQ24^$43&d9V0ii{yJYY)iTAqG0zpjiA*{Oss8tZS-9rG^AyY)Wa|1j~~6Bg#bIlf8RGXZ|*4fzu%?X zvR?7{(l6-$>Jz@e=jB$1Kce7C&Rq9D-~-2+e=Obn^mccoe}h`+X439@L@b#jV*SK{ ze2%A|pEo^H^2SWfxi+fEGW85~80T1ToZC5k$bGTL6zEv(S02%x{e!)y=Y=os5pyNg z&^ajEQY=aW=fD&lf+mfP@J+YWCi-FKJgT7~KUEbzu@^c)8O<)IjHRJX9v6e!R^;vL zKf?7J+_EYE00RR-{f}_t*s_3g1KdSyf5;SgT9D`nLZT&mCJt@8A+*|eR&+*d(?C|F zlOa_+cSJ@bcMBF4I3XKjhqa2%Rhp$G{ep5fyTZf7k(#R9zxmtifV__tfu1F5zo`p) zTSFD$?uo4XoaeiaWtY#p(Ki72Opq8vjb4{;$>ZuyIDRftxo9mN76AYO80`KVIH}Ees*qdW5YMA!`(*T zpVcITlyl$vfU=pG&Ace2Hf8~<9MtD-8TGIplWXoQ%lURZBQC?E55TFaRp!!jL1&huPF?kM)nXq0Y zSkHSGKvPF;8M#%Q^INbzNKOj^Ht0))l}6-h>;<+iJlujO!g4Oz8*9Ax2(HWy6_~($IN;e!=A3uP`^0TeU)dC{b&0=;1 z!JJ~urGMEwU4i57C5x--mNIl=z?o-bQNRYsKx@pW!%qQFPq%t{*vq zeJJvTX06{ea*@9AHC~`5JTcw=L3LZdL`~Hlk_@!wq$s}D=T9%4-iw}?4+w%M7?$;8Cyx``?!aOr=YFU+7<~{;UDH+XL_5(v4_nLN< z)_I+|aujQA+|t^af$2z1k<)Ltr0y;k7|_&Z^eN4y`Qz2UjId8mSsi2`5(?}9P$sGg z0r5}bTxpT2QLyehtu}`>8JBKi=f~g4i%>vE9IOD4TG4@QAu7h4P3dIDYh|B$EgOze zsSS6WwN9^IZ$r%UnN^T;LU};2)XyTeVQTuivote^uqe5hMpA_79W8;9TZqWtVJreT z4BO^Bm7_|xyfhOSm@GiLzrR%pa*2L*kv0O54UUx7Fn*rXRt{*LZw16Vc12XMO9F~D)uL+OW8>IOoiV`6Y;;N{kQCzW0Cs!IhS9sdtxUG`*{jq%{>mF?p z0@OH+uj=)nafI->pI-+}=<5n7Iu>x4v_Y1hIY)5@QW-_H~dmPzJ z)H_p4ln&SI4x@~n+X5Spsr|&rrb#u@3G$D`4LTW#DQ<5Laiy(Bl7Fc2K9L*0|*znNkRynffSJJ zaLio&qPSBb&5zn4KmfCqs{npIO%Xag3T=$j&CzO8;)?whCQ^5QEQ49=g3MNz191T} zxw{4Ax`3ND0+{}Uvi5V~e4yX4;*KWadQGL&>-%b*p?#VrzQfPh7M1De)wWPXkDOE< z<>dw*-_FE{xeksr)(k&G@#03M00EE{1Xe8(!$K@`3Kw3SG{k# z8vPRB(Wuj^NplhePT4~dxYa~+XrGAaduyYUo%dK-flcB0nwH<{aEM^+R>4ER=X_>A z$Y?8i)rKB)Zd^VW`2MtTX6N=Kx3i^b$p2g2tKsdZRY)zQ!B^y|{Xu%vs16u?7FAb~ zBB9CzBU3N4a>TyeCmN#A_Umev6)#nQtavE@X26q2 z_9Oe|_|Q9W>`VMGOr3cnE|TmaPnJp|CK3Z3IMxm)^P6(eCN$3R$pmm=BwS59Iz}uv zh_mtStIzK%Ftx!DCZT z!^$DGi3F5DL<#6Oe5vjJD!7%madOcZX=*A+$Ezwx&snd>!(Yo`)vci$xrURt5u6#O zM})7Znb^#`hFp^l;|VOYbF>5#6*hzoihwWZK-(oJj)DuE8LW8K#K_jM&fmXnd@$DvXp$|uvQ5SWGu3evwGe;}6=DxC~ z%0WCxF#rGyE#~l!R37!(AUsGbsD-yE2a@_oab%Bnib>Y%j^Q;M`Htj!&Tq}e{dzRr zqSqTzA)i=iD}MX4FXRtLUG&tt_(3vVB`18$0%99@E(Lo}=a+Sx!V2#WMyCwc7(a~> z#X&b(F(wB^mc5IxiQzw!@pJn_HS<+QX|WqPet>4O_tcI<=n2Jp^tSeBcUHKD%sf8~ zF70vG3=vopQ<@OR-w~%JMfbl2Y+QN+$OL>4+v#))Rc~ZIV-=^aXz{u-*Ze9;e z`972;UHl970lJr;^8FfV`1@8xK@vbJj?g~%AeT){G5Icv-VJVLv!Q*1S|S9eor z63+tjSKkF$#(#l8`}_Oz1Iec}U)hOf$U9fgcF|3JOtKQtR@{*JVZv=_Q8y1G1CrV_ z;UbSJBv>Mzg_?FXxw$0vI>I0n8v@PELOierQ z%bQydx@H{$rh*{`g$aivh@OJD1Q*hL(-pN2F*Fp8C7a|3%4JKur z8~}a&?K8ZzZEuVXNrdzBa$LPi0+=E&vzKF5XCUd-U_0sm}a_&jn+{ML;Z+ymwj*kl7 zNz~0NC;lg(m@`Nf`j@x^Ygb}mkP}c`#4`%RqkJq@^Ibc|EFPTvmNy!v!*Ir$ou^(z zi3aM3T9O5RGkx?76|+|sYd#MZmVQpn!tzmWH8C608FWl1n)cQ#E$ z^o{Y(q2!V5@-H%J$V7ju?jC$qAY22*^vo;5C#skwW*b9#oMdHemvlkrF)m`)3`0L} z6~e>gHYGkvxv)NoQZ6rN7LV956%gfE(l)!`k!PrBimCAtb-vYzS6INMOhL9RG9t(&o~J9n!|)&CvH1@Mm;M1>8sdLD3k8J)Ku!UN2?-CxAUTgjX{XTn zo0AlMTzG^CLbW_bwNW`q75uPgay8plwqq;#GA6#_PUHnMi~6w#@g%N-TRwOWrvlMG z=h-~R;%NCg7ZGeGa2fu}-hrWQy8{OCxQzIE0j_i_5VJ&zoV1x(%|B6GvO_##gD`@{ z{@oF{yKxW!xRo!}{l$CpXGOvDD5_YZbl$#sTdDere@VfGDuR*aia;ft8Ut1d4jr{! z(C&m`uRV++Oi!RM^w|#;EBK6Z(k(nUL=^H;by(=P7bz2TF|@Z;q9gj_=qb%I-4Mwc$Q2Wa$B|9 z=b$yl$f69Gt8A*=bYds@q+dUP#7&f*S zW1yL4(`L;Cy&uyP;N+hO4oV@J30ZaU6;3z0+*f(8CQ z>^*JS?keN4b1I)v7y>{ABuyn3@jre(q%?~nIvhj+$JeSx=Qr16kQY zE6)A{LPNEPi6=@XO(Ow2pI3zYK^z+%uK2FuCrVq+&|V;r)Cjn!E>!B{Vc+8e)#Xmyg~^hI_pn#+Ufw|~`h3XRP&l3)ZoX%&RTB}Iw( zip3J`t!lNMH_x2d5YQ^!?ibq{!*WnzLFo&*hgKo*la)~f+EPtEVH`88kfMlj ztlEh!kI-^CPhjku@SUpV;Sjgz7*5g%Drwy?D#wYDV>0~Sz$)O%Io)vcRKkAZt$GA& z(!6kXr9gY$dwUyCQYxZocyk-AATmUlRah(uuRy8{^H3)fz^-E-E^_P+ixsRafhZdg zCQKaM#-4zQjW7N1ovOnRZ&)|fjyT&Hl=u2*&P}CI2MvO!PW2t(8&x~Veo4hD5~F0K zd`FiqYKM1TTm!t)%J#a#L@F9HYVlQMrxH4RNKe%GktRtg{B=ixSFgBK(5Gk&+b-8* zq_lagx-ypCOv}C`sJVxHcP__+WYNa6dEByg*huh)1W2ei{8e_&6V4dm=fes1%H+f! z;LiYTq)L)Z&X-+ifSFTBoWqL2nPRWL50OmpYIYhQu5u=H$h#YprdCZDx(yKKmbow@ zt_CBIu8C=mRip@TC)KBYM$6mBF2Rg+{?7;NNZZ>i|5pX3{#ONt=!^lHQnZHuECfs2 zo^WGA@+0@>KeQJTE*??8ND%i}UPM4a5dywo1Y?}-XjZjS{khq#EYDe7EcMUNxw+k7 zw1zpmI|x%3)6mv@aYKMLe2JaTog27Myb}0(jb(IjiRd!-w#;i^Y3vB^GWGK7ROVu z?&0ibE;~*)!LN_WCG14BoBm0_6u$8ly$M54&fh&6KfyQdK#etU2tPMMJz|(gKow1? z=ty-pg!Ygxa7T^>Nr%jT*c;jKtNKRRS|D}1r1l!Q7=C#m%#kc(*q0tKD`f5)SG|CT z3=1)zHl{du?gV)Gy|({TrPVP%-QGl2q&TGveN;gP3f_dG7$^Voghu%;PK^gT6@6mQ zUBG_#XTM|^oYg@AV1P9uPw(B^P62Dz*{}4FGfF@ZP zD~4I7G)!PTYy&L?rNa~=m+9ny>2=t@E1Wejmzy- zi?Mn|#uVNpt1>!31>LkcguaE&vTousNf~3TL$7k>wwJ4Vy?{rbu9&(bV~#iW^K)x! zt3IR=lKp9V(KQ?1J-t+ZUKNXM5~*)48bu2;#B5&6l;Gs_99y#7nCO!cd(g^yAwajs9RF$_-|skMcGTm*bild?wpt#1@WH=LTLF)B4WUW79mE}> z!}{ZA24(;aQ6j=FSQ0a6Lf}w1vjHaX`7W+*xjQpUa`oI?G(YD!qDVvEQvbx{vpF5_EqhcTGPfyJ@@8$}7Mov@^N4un=9?j=llt}$ zzMcwylO`K#(!FcMKHE^)gI>Ee!YZ9X7J`ncX2}MS#xc4v+CxeoDkap;kkhhIo# zA>4oiWsYGL{l+Kjv6CsSYDmvEeTt%ZQbQkdq@!B!ZHe%Uv%YwwyYEL#?%5@ZEv>54tD#iB`QII+H>YWoMg!R>C!+2TBTtsGhQ z!^%SvbO+$ZbPMl6B=Wz&w9Q-wYenN)6Ruk?XWj?GQD}GfYm8Q-b_VyRT1G%<+|07* z#z7Qz(qMT4AL1n2hFoYyc*XWPzCHO~PA`vO1a}Kl$3hzS3cGT?!je>Cz1ac6_?pA~ zjK}%aXk$G(`!3Zs{9w9*<}{b5XRvejJQKy$fZMaVB*V&^G>-Os25*&bKF)pw7$;sZ zbK91Nwg`S(p^``bdBtW3bSo73LVcvQKy&bp2y!LoxsI5SP>vzukN$xtI;s1CdB&YO zs85Lh#wG@8ddf3!Ft9mjFi;_zB0xt2M-A=sCyXrCce}Z{IdxJwnLyoe-2unS@5)wE zdF+j87z`rLD3IhVPUd~qspIsiUwxl}T}?Jb4d&&3cfE%MH?z6B!9#xJFmkdf8DU&L zPZ#6O)1OaM3;@3`k^n0-tQ=l{Uy4sNM~Tr37e1UUICJM-Nk$X2$cmDc3P8RDoOlXo z>)@9LtvrDTI!(svVY*+XYHg4Umsq_gspf0&2iu@MDS#tO)|Sf8q_mQg*Oj9w{OJ{xHY|B;F{RkX_kZK}Z+Huo zSff$(#+3}?OY-DBUJ--Y1B~U%$qKJZt;qGhi35oJ01JhQzb_)|swoq`<$_y9Ck{6{ z%yNfH!i^yo%Rv>DPi{b$LObHPO%unM*vi`{m9n2kP1_REE8@WGnrnj1jfNgb;{|a?Jviy}~N=2J5vH zFTCqWVAt@@M}g^zuhjGwvud`{p9E4F9tP^k z-Cn%iLTPpDbfcmEhLCj2#-lMd4Kq{RkzobK!6D)%DqVD_e&KbW7eI7jQ%kt@zzjRB)p*2oKD7J=BREc*SoSoH z_6NQ?fw^bQ3}B%&(7K{$q?Qe327xF3kn4Lq-ZLS^$R=cGy`{UEV;O5CO+zKNw+j0Q z-b_X-jpsK4H<5xbI1Z@>d&#?q(7mj!HL3Hyx;(z9`G<|t=Hr7!spI8cMea_&Xcn`F zQq*Bi%+H@c%yiN2$P%G&4)U4l;kYF47D=MX`xuy}ZUA%`QfdEu-BV`sxlxl2mk=-J zm2hh912wx~g_XCg@Y77_`~HE-?L4=y9anG-H>4G6dsLR}O(^!JE>5Ns5hhKGR~ zo!T16FC6M&F$-qZA#3jsERGF01}6{^cDYeT3tD-pEN>w0T@8VeOH|||fHI`kQ&nua zZ+@&MA3);!Z~;D!9ykb<8lrX-P;NNm1*$#i_zL{?SKdXbpG6_{w1h<*<|ot3cb)UF z7HNsSfAJ&IcK?8+tu4n;63C5l<~W0N@(%K-RUKyjg`lcbY4npWa8<>hL0cC0)1)`NlM1EV zj+bX*Nzn+rq1m27^S$Tp@)dltilf0G(5kJ^1v2@6p{@eP=SM}*1&;~9#${d{jSnYN zlIf^8#K?Ua1{?Su_ZRWOCJYf6nEx>q zXY5S|go#sSNzpjo^0{hlx7hCRdqoU@&^5ubwcD%~a9Z-bQ7p2v7=_`U`i*KT#SqyV z`==qr)J~`ct!_tJv34AwMt2gqlYd4rrge6s8KG5*xrDM+DF!jz*SE2;L3}v&_wBE| zKrD=+o<5IME-^x(Dl~R6QU19w^_iIGX6Ex*W0R&wPKF_TvieeLU<=k@P=3nj3?iAs za9^A(F-wx$n&@VlL1QhtS}!~xr~ zmvF~$Y38~WU3Qdq&MWTU@Jl@NygoxwYqrxB659R=dYmAP8aU(z3_I26@6(Plf8jqk$=f1 zlpk!s&HNb-vn5nz2lZW(-`^1hI;OAADW5X6dQ6NAW6fV12MyT-V(2tRLraGk;|L;@ zEGBJ5Mj%&h-(>kGwsvJJ%1oGYZ6Z`1M6Gz%70K1HvMv_@<4&}~_y+Mt0?6h1ez@WK z_I5ukush17*vurxm_n^HW8eB$X?#z!~>!3#?01=G_b z!q@Uc_oWZiU#(ZU5%y%#Bz{kT-?uvGn71+z$Bq&C8+q#kwWYDA95HX=AcNOU(GmBsVS~qjwA@$%cMxuayqGV*WIx%}Git%fH}J=;B>d9(%Rkh` zW4y*_!!Bhb#cg*0?l=GNAwa4Zx_ZtB?QpaZ6<&^1I}XI|Ot|V9(vaeaV-^CTPJJiy z_3ghosr4R#0OemGrseP+;)_8t(IAs|FGk)$IfXx0WA@v+5 zNbEOG+^r|;FFy0C%=fC?e~G;vOlJPQB-;wQgn4!|SFtG?Hk{yMxgtIjm zOO}l`J*+$>D`)O$>-mccuycD=&1-B1%nn1g@qwSfz%zTX6{~=Jy!EW8CzE@ww#J7< zkEKLL%JV@Va2Q`uP%R`gN^Wbz>}{DVeS(I^+ep0h=#MEsE}$C}ywtw$dX08Fkw-N* z!a$zfus&)9mxb+n=GK4P4!WMYfn#_0C4}i0()>`U<8AZuWA}!J<_gwV{B08<*bXDK zWw=HUBSiCU@*C1O6ZobK^(uk?9&PfOh$!oyqD1~bMae@*7ND&6FR6;gM-n>thY)t~ z8gVJLKu_Iyp9iV1vp+j)|IxXevP(3G=g<$=u0IF|@~>!UppN+PpCcMVuu8bym!g^u}vves#PwQPOv?)_<7{9{m@eQ8^=||smzq1 zChZ?VJB{8D-=N5K) ziK%|Y#IHsCgP3dV&h&w-bgG}Q-=mIBJz z^gHVwb+#J3wqqJ$&_D=J?gkv-8v-U!Vu9%v)ap;Ig5~dsA6;;m_hJ)9LOaHyO`|TC z^|Oa}Yum1vQ7u`Znk==ys~N#&^fxkFvQ(;i=vR^^dcS2^H6X6Owr5)M&&84)MGV)- zZG(^1`K>G#2I)4Yq&&c3GkrV1-^-0NSn8BGnCYM*`uzHN7w2b`lG?);tDhG@wbiLI z(Wt$SsNiT7Qp}*qEmr=R$K2P5x`DfU<#g!zTkr7e`+x^V{e%$#SB6DPK>7b#+4-E3 z&)UBiAO82^IsiV0f3ajg8U86Ok-ZSo8GJPNgL|r>P$?t`NmU_9%>qGI(Bn(T)aI6z zhg~G)E73dTuV3+$FW=rN2VTB^C(Xc{%zWPJ*!=k1Kj#1w+0b}#bbIu6Mb1s&x8RA0 zGvSNzsiTh?J3y1Q0u^M{?!>x~PcvsFC_F?zwi=-E^8<2}uUauRw3HQ-)7DHlap583 zLeIs!ALqq#;C3vMaHYoCSyEQ9Ghy0HkIhnd3O@@!DbsJ5yKDuiSceb$to)6f)lX9B zWmqIYS@X}a6_I*>f71pd&UKKQ3w^r6e7h);}z+X1Rseme(2-mdI-4 zq(mk+TLOq#(b#jbZ2D9}8|9zn;N&)}iG^h#i`X=Tc7=`~96m-*bMf|T+a{%+tNMD~ zMo3FTlS`eYzHamY^3{Qt0AoEF;tNVq2#9>|(9WqZS)G=sPIC9Un%Ym@Ei^k@NzTyB zyHt)MX>G1+spXW4B70o_-b)2Rgw5Win%jTn8?#8fGyBN`*Y`I}1<>>c^*>6^UDVBh z0>qpFat{BgZIC|ox9%WLQlKEXeN)I9c`Q*;@4$?(NCK{`${^*4G8y+OUJZxVb=%u6 zq1xdb4wSs^4%l!`LIzT!^14dG3&r~n`G#v+#W`4{_PLI0-usCTg6WBQ%`aCjKkTQSybb^_`mN_WK{tXe|3c&#JiN4-ct-X>Ck|GO z^$mo<=-K*ly)7D^QSAGB7Z(?c2pm;|Ylq=#8Nrp^Llsu^oJ&t(@K_7fHB2GNI_R3I zoSdo@x>*i?T=0LFB>uQ*dw=#}ff)oV=sY_qG}JoZt{+7eTMrz(s;8?=QbjX|?H>T% zpK?3vfzbUxRPjF4z(`gR_uyx*!NVLqEv;=N^CIH_qn<}Q9dLM1Of$G8X%rh!C`#M# zJ{*PXi+wN5Tv!6{0;1sh#p#7XLNP&qpyw=UnrqmlU>Z9XV+*9{6hov&S$&Ent{xnz zgcm$wnrA2*28=68ozFLs^oGKAUIJ8FPKHZ3wJhZGLq`cw(K28zL((_I`@;7-thpvj z;Gs)Us-|uyEqHfoE+-5R|B5x1-is~W2c_Pdd|5gDoAE0+r}Ca!aiWsh$&|`4alVch zT+tL4Zm6W;!?v{QBeBn7MR}#)OpT_wRApz-wuk#z#OxdbqF^#>+Jk~73IGN9(IB*< z+6VllEYoarEE%j=gYp_*w|O+aS3*_aA;*`=rNxz~tm>6|f1r`EgZ(mhV0UuXhjLZ@ zuL@1lDhntl`C%g5B}u|Lo=#DRP^0h%CXSlBEwZE-r3j#@^*!aaO7VMGXUB+R-zuw^2bY)3xT>Ar>2-6<#w{X(xe2*QXRws{a_zG z3a=BJP%qUFa6fs4Xe!OB%GY1lKRL-cu8Zt1`c?*A)mL3j$C!)nsT-vajWNDVluwKhwb?1v~o?)z-U;qYd< zqq7xcYL|=^oP+sGIq&4Z|FcoGsaz6d{>>;T|8IbcN{Ik;{%d!i!0$RKVzAWE`ZMTm zI+m5;+KR|!9)w8rLqkw3wqfo@?K&3CgiLoLzBjWLY}y5+LlkoV+*2+35<1ekqIQ;J z-{Y+7tXFfu$LC*!9zt^LEnC}(68+Pt4P9h;b%LcyvQ7hzP2t%;tq!g79XsX_tHret z&){758-S=xFQaPD;-FGQhJW`IAKpxu3^&FbYg0^|oQ#Z&qMGSzQ3lkj?ART=aR&KS zj?O70Aq`o$S{k7bWf-d}5tR|Dyfo^M%SMclZc}tpDjUtVz44A_^ywg8o2Y|~gTaFM z(e|qhlXl*99+J(}a}zQF2Hb7t)@x~qM|iw(UqCVi-Y$iWZwx%L!{)tMATbrl0VXcr z%^Anwj*f?GFp2~FmxEU9VH{%v4qMj=Dli_|uRtiYL|7;a$e58a6QB;P&bqN^Ij(AD z)=|n>Gv#y;rTDt##u7~?NitIJpoEEop02^P`Yvu}s3y{>Hj?=(c2BeClvCu|h#1Y4 z8NfO*Aulk=sLN}cK<~=23ofsoP|Tv2MrJ2QJ(?JLQ|d%cxY(bk=8cwRV)+x2TyL9A zFLQTAzjiWP*LeytNf>6TP$M)J4nDha>o(EM0wVi@3>{MYree+5i4(B=hNV*04u-sTMf32#Ox*zVWIp6Sf(ZRTL6T(|0GcqK zx@zd34lJN&Zait0;?Qr}x%q*viRn~!y{twy^K_;}u8Ar6gMXP_SiCMLeENMH{sgG% zDk|wB2?>fhRZ?13x(Y|oQa41xQI}CtQ(wIWMM6XzZ*hR+6YHMl{a=r|T(0RoeVp#QR>C|4pV7Z`XWv;jxAq*0g&Z2IX|V1 zi(B#LpT2zYwi%ev_SO!JGwP-H(~PrlV?pgUHN;eCg|)`Eu2(1Tw@bXPD9DqMZ%T07 zYGP*h$fECeYNZ07sv%e0a$5D~FT?y}pMI51M6b$i@{nDKjpB-M#hA51W=Gp1&c0Q3 zY&Gi(Y9~qQY@Z%+s@zdl1#n}@%WIK)4a!X@&n#%>@1BUR-@!haZ(`piEl(O#Lnp{g zvB>s!2IQAGy)F^T_Z5I)7&G-tExOWhh6){)*u;@>VrwpIwqn<<1#zO6LLd#D!c)j* zD%U2NBBZXj*(AtdDu6C2Z>0i(snh-Aiql9Ld^LvH!NMcwyM@&afWLQyQv+J}GXdg| zxm2qZ$!;2i0jv@;q)Tipv{^@QW;g>8Xagez*jMg%b%g5SjZRr|?Ct7(=r392%lnC2 zYMOWfK`xeb5e|#>5cmT$ybyHrJtq;AmSpqy!~=9O^$6LM<=z?hj$PsCgZ5_oOgFj^ z2zcYous)bj`NmhefR{S@a6)+`gLCY)PsB2sm66&9%_C3Bb=)3uS8(JW-Z~o#qta+ZL({y>ti(OS zf;^L(wV#n3tpeA<^OJ^UStdx1#C4_*P6&nIy?y&sx}4avV#DTdyCb~1I0lZ|%b?Z& zk}{dM{XGHBqD{kb(2Ou=d8_uOd>11era6+6E{Ne)+iy71*4A&vt4_d2_X3X8#VvA} z>X7^uOi6|R1Nc!Z2x0dbe|}`*h5XO@P044WE|pbb#SE-GGD6c( z8ASh^J%&(i6pjaX$?}czY}%%bo^7gZbBjwKr>D^qPpye+cnZnyhn~q#4;d~|i$fr{2ck3c{~y}K1{5X=^j6_#YOvcazJYUMj|)!8jtC3SIOyb9PxLj z@A{igCn(aDo;-T|Ed4FjhNknxliS!mF?$(h=)&YeyxL?(^-*S0IepHkTXd=$vaee! z{uiOw$Z!tm0>_@^q_)?LP*sFm=f!hxSntd&)K`R=FUb&RVptez{m`431OwUM8g@nC zm+f@givgvD7NDi;nUb}mt}cB!Z|%%0>&XHh&3U;=M!cMYxuW8d4w{=>dLnTWB0G?4 zSxQNUCC(3sI`Wdov1+MsE=W9C8d1(j>&eNl9+52p?E9(~^e z6yJHmyd8UKawp1h_Uc3nk(1*SA5@iUCUo|0`?s=Xs$D*nhWOYUaC=qo$TG3}uPqmhDit zieQL4M$(LboP*N~^g%lx5H(XCF5K)!4+Yd~P1AGg<=aQWTF!g~-*s%-sD}RV7pyYMNovcnSOQ>|*vFN>Agd8o0CXq?TK7}d#+ZQhvFE?g zIKP3pDgMH=IyK;>|c8K1>S{u}9ry>D} zHS}FhF>Rc479J{bOs|k>)hYL4;!BpbN2bu8P(#rzBMXA{3c1) zFY|yC?0`Zvp;W7w-;~Q9OBqgMnMtbS`+p>zV{oQjvxVb{?M!Ujwr$(C^CX$rwrx8T z+qP}nXWsApxT~wW_OD%aSM6Ti>uS7Iig(Z)a`dN{wlb4lXeJHJHkt&$X1(!m>rD8( zt~Vey83W~pM$6wA;_!LaW5AE7j%R*h0Oxw}@Px-H5vW!jj)3o?S%pEb><(z^Y76$45CfLyHnTAG=56F)j`<`-wQ| zO4w5{-JNFm81s!NJlPd|lr>khu4zq!vpqL>ic_E>4JV!Y?a z`Iac9B#Y3+Axn<~K)lKE?PFL(c@H8z+8Y2NPq(>&fG_Y;|n!3l{w(-O2lR}|>4OcGZC54ViSB@{m(mC_6yXuweO zIAG(V1^`ufo6C!{=9j%8Uncx=(*%#|H}?P32S!^6u2m=?pkw6! zH&vh}zH*}_s(4`}&XhtVI;ar=6cKq-LALzzG!zv+bCf|)WEiJ@!d1* zA3-gnDe9i!wy;kxI?&$ZFUAJpKnDH!U8^j#XN8SO$0$z;O7xBig zOiY_qVugyeEBH<|R^R&wN;Ad;cv1&^ov0jk0!5p>hAuKx$9hrh)(BRz110s}YJU(Z z+y+!Mn-084>aeLsT#}l2ne?f#M2jZ3Ca;Eyo`rJP4LPI=c}l>K5sox6a$tWu|Ln$9 zk;G~S6kjb*tJQuL^lSju*6mu~yX-0#{`oYQk;|F@%pGGQYsA2|3-_D7vUo6u71s3N z=s$8^2^~4IRIv@cmu4y2!<ZRwjN#LUhIGy)wO&Be{lZk`&{%XV&(*3~WOWOFL@IO}{B z)mzrSTd6DN)mxV(ML*8hG6|Ao5`b9!$8GQF7vGbO)PEZB?WnOxlT>@o*)@*+X8W@% z+LhQLAT0g#-@8eKi@JiENbN5@$FW8$`%X#$e7GK(1#fVLq)w^>)Rkl1V)Pa2z-*Q~*<@pID} z(2O}3Bqdi;zJenjy`C0-TCuh5*M%ind1&S|TtCB7=mfAZ>7k`f)97(QSV)Rr3Q3EX zDlcMAc1=ISm86CvGN_+xuvAf@Yql(!lpw>BeOZnP*1RD^kex42B4eKF;i!^QPAA&~ z@SVXf%=qDp^7(Q;vpIg|U#KCX#0`EHrnzhX`1pzqw>c zHm36wx~pVN97<_-y0gU!TSKh-Xyq;N++!55R;u)=1Tt^z5<7-5^2Ty$ZQyB%M7nB8 zqz+JJGt`JBgR3>}sb~!!ve}RJj--tPsD+KEI{eP~5LA@~N~tOWs%_*7)T;9|I|n4( z2f`-Oe;Yu4D{E4S=#|Xf8rYKR<}W~N4ISe4)XrPgCAHYZ{$7R=7=*4{neR~25*Bn& z9-LC?pt^x`YF|poS+;PqYhVhGDKVLss%T=YUHq+?Tw|ydOdJS`u=KAU0U}lhh@#9r z4l{OOxmhBx&XHxGTQu4x;)>176!9+7KrYUyWm;4svGbxftY`^53QRqTImL@@?D4Yl zO2Wh^$7E1O>w$JBn8{BfBBjd+7F$PVX$K`5;mwM52Cca<)3&n^DP?s9j#*z>)DIy+ z-_P=Ck-I%JzlocMOVC7kgpEW4M8qNAARsAG-gzNo%bLz`=g+vfV2!cr(_C%b_a*wd zQdYN#3&80{9BSPnl7LD;^>wjb`%l^K1R$C~w$y%4Z@^V+^16jpQ)cK1p*Wl7LPYDx zi-WP(M~)i^R|X~Wh&527ghIPLJ@;aj1`i+7$6e;*NR1Ydr1c0AV@|pPgvqQ*Sh*sS z#iC;d2Ftfq)}wv}<+FOxE|^G?CB_U}3D2P_om>#AWTroF_8 zYgw#2tUd#VJ!)6C5N~*`2APiMv7_w

WNp5~7YD4``2J+2^JLXSDAn1#GQa=Wm~d2R({ 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 delta 35599 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 ORzXA2f%7X@nSTIfr%7r6 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da..bad7c24 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a9..adff685 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee..e509b2d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell From af3d5aa6795ab257c1012ca0369ecb08e4e80f6c Mon Sep 17 00:00:00 2001 From: xLexip Date: Thu, 30 Oct 2025 20:02:40 +0100 Subject: [PATCH 07/75] #45: feat(ui): Implement permission-error dialog * Dialog for when the WRITE_SECURE_SETTINGS permission is missing. * Provide the ADB command (and a copy action). --- app/src/main/AndroidManifest.xml | 1 + .../services/BroadcastReceiverService.kt | 4 +- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 42 +++++++++++- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 3 +- .../java/dev/lexip/hecate/ui/MainActivity.kt | 32 ++++++++- .../ui/components/PermissionMissingDialog.kt | 68 +++++++++++++++++++ app/src/main/res/values/strings.xml | 14 +++- 7 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a94fca8..8b5bbf0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,7 @@ + Unit + updateAdaptiveThemeEnabled: (Boolean) -> Unit, + hasWriteSecureSettingsPermission: Boolean, + copyAdbCommand: (String) -> Unit ) { val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) val horizontalOffsetPadding = 8.dp + var showMissingPermissionDialog by remember { mutableStateOf(false) } + var pendingAdbCommand by remember { mutableStateOf("") } + + val context = LocalContext.current + val packageName = context.packageName + Scaffold( modifier = Modifier .nestedScroll(scrollBehavior.nestedScrollConnection), @@ -90,9 +105,32 @@ fun AdaptiveThemeScreen( id = R.string.action_use_adaptive_theme ), isChecked = uiState.adaptiveThemeEnabled, - onCheckedChange = { checked -> updateAdaptiveThemeEnabled(checked) } + onCheckedChange = { checked -> + if (checked && !hasWriteSecureSettingsPermission) { + ) + pendingAdbCommand = + "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" + showMissingPermissionDialog = true + } else { + updateAdaptiveThemeEnabled(checked) + } + } ) } } + + PermissionMissingDialog( + show = showMissingPermissionDialog, + adbCommand = pendingAdbCommand, + onCopy = { cmd -> + copyAdbCommand(cmd) + // keep dialog open + }, + onCloseApp = { + val activity = (context as? Activity) + activity?.finishAffinity() + }, + onDismiss = { showMissingPermissionDialog = false } + ) } \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index 55682ba..46c8a5f 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -51,7 +51,6 @@ class AdaptiveThemeViewModel( } fun updateAdaptiveThemeEnabled(enable: Boolean) { - // TODO #30: Check for android.permission.WRITE_SECURE_SETTINGS viewModelScope.launch { userPreferencesRepository.updateAdaptiveThemeEnabled(enable) if (enable) startBroadcastReceiverService() else stopBroadcastReceiverService() @@ -68,7 +67,7 @@ class AdaptiveThemeViewModel( val intent = Intent(application.applicationContext, BroadcastReceiverService::class.java) application.applicationContext.stopService(intent) } - + private suspend fun updateAdaptiveThemeThresholdLux(lux: Float) { userPreferencesRepository.updateAdaptiveThemeThresholdLux(lux) } diff --git a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt index ec6a116..c2b44f1 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 xLexip + * Copyright (C) 2024-2025 xLexip * * Licensed under the GNU General Public License, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,12 +12,17 @@ package dev.lexip.hecate.ui +import android.Manifest +import android.content.ClipData +import android.content.ClipboardManager import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.core.content.ContextCompat +import androidx.core.content.PermissionChecker.PERMISSION_GRANTED import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.lifecycle.viewmodel.compose.viewModel import dev.lexip.hecate.HecateApplication @@ -42,11 +47,32 @@ class MainActivity : ComponentActivity() { ) ) val state by adaptiveThemeViewModel.uiState.collectAsState() + + val hasPermission = hasWriteSecureSettingsPermission() + val copyAdbCommand: (String) -> Unit = + { adbCommand -> copyToClipboard("ADB Command", adbCommand) } + HecateTheme { - AdaptiveThemeScreen(state, adaptiveThemeViewModel::updateAdaptiveThemeEnabled) + AdaptiveThemeScreen( + state, + adaptiveThemeViewModel::updateAdaptiveThemeEnabled, + hasPermission, + copyAdbCommand + ) } } } -} + private fun hasWriteSecureSettingsPermission(): Boolean { + val permission = Manifest.permission.WRITE_SECURE_SETTINGS + return ContextCompat.checkSelfPermission(this, permission) == PERMISSION_GRANTED + } + + private fun copyToClipboard(label: String, text: String) { + val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText(label, text) + clipboard.setPrimaryClip(clip) + } + +} diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt new file mode 100644 index 0000000..0122610 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.components + +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.stringResource +import dev.lexip.hecate.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PermissionMissingDialog( + show: Boolean, + adbCommand: String, + onCopy: (String) -> Unit, + onCloseApp: () -> Unit, + onDismiss: () -> Unit +) { + if (!show) return + + val haptic = LocalHapticFeedback.current + + LaunchedEffect(show) { + if (show) haptic.performHapticFeedback(HapticFeedbackType.Reject) + } + + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(text = stringResource(id = R.string.title_missing_permission)) }, + text = { + Text( + text = stringResource( + id = R.string.description_missing_secure_settings_permission, + adbCommand + ) + ) + }, + confirmButton = { + TextButton(onClick = { + onCopy(adbCommand) + haptic.performHapticFeedback(HapticFeedbackType.Confirm) + }) { + Text(text = stringResource(id = R.string.action_copy_adb_command)) + } + }, + dismissButton = { + TextButton(onClick = onCloseApp) { + Text(text = stringResource(id = R.string.action_close_app)) + } + } + ) +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4a5c0c8..7b3584a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,8 +1,16 @@ Adaptive theme + + Close App + Copy ADB Command Disable notification Use adaptive theme - Adaptive Theme automatically adjusts the device theme based on ambient brightness.\nIt enhances visibility in bright conditions while optimizing battery life. - Background Activity - Adaptive theme is active + + Adaptive Theme automatically adjusts the device theme based on ambient brightness.\nIt enhances visibility in bright conditions while optimizing battery life in darker ones. + This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from app settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s + + Adaptive theme is active + + Missing permission + Background Activity \ No newline at end of file From 66870e140fe4e0681c9105cb155635b105b90a67 Mon Sep 17 00:00:00 2001 From: xLexip Date: Thu, 30 Oct 2025 20:17:42 +0100 Subject: [PATCH 08/75] feat(ux): Implement haptic feedback for the main service switch --- .../main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 9 ++++++++- gradle/libs.versions.toml | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index b30f457..b6c993f 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -37,8 +37,10 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -64,6 +66,7 @@ fun AdaptiveThemeScreen( val context = LocalContext.current val packageName = context.packageName + val haptic = LocalHapticFeedback.current Scaffold( modifier = Modifier @@ -107,11 +110,15 @@ fun AdaptiveThemeScreen( isChecked = uiState.adaptiveThemeEnabled, onCheckedChange = { checked -> if (checked && !hasWriteSecureSettingsPermission) { - ) pendingAdbCommand = "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" showMissingPermissionDialog = true } else { + val hapticType = + if (checked) HapticFeedbackType.ToggleOn else HapticFeedbackType.ToggleOff + if (!showMissingPermissionDialog) { + haptic.performHapticFeedback(hapticType) + } updateAdaptiveThemeEnabled(checked) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3a21ed9..09f7c3a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ lifecycleViewmodelCompose = "2.9.4" localbroadcastmanager = "1.1.0" material = "1.13.0" preference = "1.2.1" +composeMaterial = "1.5.4" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } @@ -39,6 +40,7 @@ androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } junit = { group = "junit", name = "junit", version.ref = "junit" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } +androidx-compose-material = { group = "androidx.wear.compose", name = "compose-material", version.ref = "composeMaterial" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From 4c5f4ff369d2d1b80126f629dc5b267a11b28dab Mon Sep 17 00:00:00 2001 From: xLexip Date: Thu, 30 Oct 2025 21:12:58 +0100 Subject: [PATCH 09/75] #45: refactor(ux): Closable permission-error dialog * and check if the permission was granted in the meantime on another switch toggle. --- .../dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 17 ++++++++++------- .../java/dev/lexip/hecate/ui/MainActivity.kt | 2 -- .../ui/components/PermissionMissingDialog.kt | 5 ++--- app/src/main/res/values/strings.xml | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index b6c993f..1532890 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -12,7 +12,8 @@ package dev.lexip.hecate.ui -import android.app.Activity +import android.Manifest +import android.content.pm.PackageManager import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets @@ -45,6 +46,7 @@ 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.content.ContextCompat import dev.lexip.hecate.R import dev.lexip.hecate.ui.components.PermissionMissingDialog import dev.lexip.hecate.ui.components.SwitchPreferenceCard @@ -55,7 +57,6 @@ import dev.lexip.hecate.ui.theme.hecateTopAppBarColors fun AdaptiveThemeScreen( uiState: AdaptiveThemeUiState, updateAdaptiveThemeEnabled: (Boolean) -> Unit, - hasWriteSecureSettingsPermission: Boolean, copyAdbCommand: (String) -> Unit ) { val scrollBehavior = @@ -109,7 +110,13 @@ fun AdaptiveThemeScreen( ), isChecked = uiState.adaptiveThemeEnabled, onCheckedChange = { checked -> - if (checked && !hasWriteSecureSettingsPermission) { + // Re-check the permission at the moment the user toggles the switch. + val currentHasPermission = ContextCompat.checkSelfPermission( + context, + Manifest.permission.WRITE_SECURE_SETTINGS + ) == PackageManager.PERMISSION_GRANTED + + if (checked && !currentHasPermission) { pendingAdbCommand = "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" showMissingPermissionDialog = true @@ -134,10 +141,6 @@ fun AdaptiveThemeScreen( copyAdbCommand(cmd) // keep dialog open }, - onCloseApp = { - val activity = (context as? Activity) - activity?.finishAffinity() - }, onDismiss = { showMissingPermissionDialog = false } ) } \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt index c2b44f1..fa7cd7e 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt @@ -48,7 +48,6 @@ class MainActivity : ComponentActivity() { ) val state by adaptiveThemeViewModel.uiState.collectAsState() - val hasPermission = hasWriteSecureSettingsPermission() val copyAdbCommand: (String) -> Unit = { adbCommand -> copyToClipboard("ADB Command", adbCommand) } @@ -56,7 +55,6 @@ class MainActivity : ComponentActivity() { AdaptiveThemeScreen( state, adaptiveThemeViewModel::updateAdaptiveThemeEnabled, - hasPermission, copyAdbCommand ) } diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt index 0122610..0ed3c53 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt @@ -29,7 +29,6 @@ fun PermissionMissingDialog( show: Boolean, adbCommand: String, onCopy: (String) -> Unit, - onCloseApp: () -> Unit, onDismiss: () -> Unit ) { if (!show) return @@ -60,8 +59,8 @@ fun PermissionMissingDialog( } }, dismissButton = { - TextButton(onClick = onCloseApp) { - Text(text = stringResource(id = R.string.action_close_app)) + TextButton(onClick = onDismiss) { + Text(text = stringResource(id = R.string.action_close)) } } ) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7b3584a..c00c64a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,7 @@ Adaptive theme - Close App + Close Copy ADB Command Disable notification Use adaptive theme From 610d95014e8b7be4e28114e92d5e59c2575e451f Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 31 Oct 2025 02:30:15 +0100 Subject: [PATCH 10/75] refactor(ui): Fix sonarqube findings --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 21 +++++++------------ .../java/dev/lexip/hecate/ui/MainActivity.kt | 8 ------- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 1532890..3f30e11 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -105,31 +105,24 @@ fun AdaptiveThemeScreen( style = MaterialTheme.typography.bodyLarge.copy(lineHeight = 22.sp) ) SwitchPreferenceCard( - text = stringResource( - id = R.string.action_use_adaptive_theme - ), + text = stringResource(id = R.string.action_use_adaptive_theme), isChecked = uiState.adaptiveThemeEnabled, onCheckedChange = { checked -> - // Re-check the permission at the moment the user toggles the switch. - val currentHasPermission = ContextCompat.checkSelfPermission( - context, - Manifest.permission.WRITE_SECURE_SETTINGS + val hasPermission = ContextCompat.checkSelfPermission( + context, Manifest.permission.WRITE_SECURE_SETTINGS ) == PackageManager.PERMISSION_GRANTED - if (checked && !currentHasPermission) { + if (checked && !hasPermission) { pendingAdbCommand = "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" showMissingPermissionDialog = true - } else { - val hapticType = + } else if (!showMissingPermissionDialog) { + haptic.performHapticFeedback( if (checked) HapticFeedbackType.ToggleOn else HapticFeedbackType.ToggleOff - if (!showMissingPermissionDialog) { - haptic.performHapticFeedback(hapticType) - } + ) updateAdaptiveThemeEnabled(checked) } } - ) } } diff --git a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt index fa7cd7e..7c68f77 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt @@ -12,7 +12,6 @@ package dev.lexip.hecate.ui -import android.Manifest import android.content.ClipData import android.content.ClipboardManager import android.os.Bundle @@ -21,8 +20,6 @@ import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.core.content.ContextCompat -import androidx.core.content.PermissionChecker.PERMISSION_GRANTED import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.lifecycle.viewmodel.compose.viewModel import dev.lexip.hecate.HecateApplication @@ -62,11 +59,6 @@ class MainActivity : ComponentActivity() { } - private fun hasWriteSecureSettingsPermission(): Boolean { - val permission = Manifest.permission.WRITE_SECURE_SETTINGS - return ContextCompat.checkSelfPermission(this, permission) == PERMISSION_GRANTED - } - private fun copyToClipboard(label: String, text: String) { val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager val clip = ClipData.newPlainText(label, text) From 631fe596b4de906713155f54a1a8a882cd4701d8 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 31 Oct 2025 04:28:41 +0100 Subject: [PATCH 11/75] feat: Integrate Firebase Crashlytics #7 --- .github/workflows/build.yml | 10 ++++++++++ app/build.gradle.kts | 5 +++++ build.gradle.kts | 2 ++ gradle/libs.versions.toml | 8 ++++++-- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c29ce1..fb2629d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,16 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + + - name: Create google-services.json from secret + run: | + set -e + mkdir -p app + printf '%s' "$GOOGLE_SERVICES_JSON" > google-services.json + printf '%s' "$GOOGLE_SERVICES_JSON" > app/google-services.json + env: + GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }} + - name: Set up JDK 23 uses: actions/setup-java@v4 with: diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 99c34c7..f3e5bcb 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,9 +1,11 @@ import org.gradle.api.JavaVersion.VERSION_23 plugins { + id("com.google.gms.google-services") alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) + alias(libs.plugins.google.firebase.crashlytics) } android { @@ -52,6 +54,9 @@ android { } dependencies { + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.crashlytics) + implementation(libs.androidx.localbroadcastmanager) implementation(libs.androidx.core.splashscreen.v100) implementation(libs.androidx.activity.compose) diff --git a/build.gradle.kts b/build.gradle.kts index 1eb577e..1765e31 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,6 +4,8 @@ plugins { alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false id("org.sonarqube") version "7.0.1.6134" + id("com.google.gms.google-services") version "4.4.4" apply false + alias(libs.plugins.google.firebase.crashlytics) apply false } sonar { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 09f7c3a..753d6c7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ coreKtx = "1.17.0" coreSplashscreenVersion = "1.0.1" datastorePreferencesCore = "1.1.7" espressoCore = "3.7.0" +firebaseBom = "34.5.0" junit = "4.13.2" junitVersion = "1.3.0" kotlin = "2.2.21" @@ -15,7 +16,8 @@ lifecycleViewmodelCompose = "2.9.4" localbroadcastmanager = "1.1.0" material = "1.13.0" preference = "1.2.1" -composeMaterial = "1.5.4" +firebaseCrashlytics = "20.0.3" +googleFirebaseCrashlytics = "3.0.6" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } @@ -38,11 +40,13 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version = "1.8.0" } androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } junit = { group = "junit", name = "junit", version.ref = "junit" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } -androidx-compose-material = { group = "androidx.wear.compose", name = "compose-material", version.ref = "composeMaterial" } +firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics", version.ref = "firebaseCrashlytics" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +google-firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "googleFirebaseCrashlytics" } From 83943e66c4bb291d574af01e6bdc53287e0c6ccf Mon Sep 17 00:00:00 2001 From: xLexip Date: Sat, 1 Nov 2025 13:04:57 +0100 Subject: [PATCH 12/75] refactor: Update app branding * Write app name in title case * Update app logo ("rainy light") --- app/src/main/AndroidManifest.xml | 2 +- app/src/main/ic_launcher-playstore.png | Bin 14111 -> 19545 bytes .../res/drawable/ic_launcher_background.xml | 9 ------ .../res/drawable/ic_launcher_foreground.xml | 26 ++++++++---------- .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 ++-- .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 ---- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 994 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2254 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 746 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1442 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1286 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3192 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 1868 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5078 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 2426 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7126 -> 0 bytes .../res/values/ic_launcher_background.xml | 4 +++ app/src/main/res/values/strings.xml | 4 +-- 18 files changed, 22 insertions(+), 35 deletions(-) delete mode 100644 app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8b5bbf0..c8d6c8e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,7 +28,7 @@ android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/Theme.App.Starting" android:usesCleartextTraffic="false" diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 4139987caa18ff8a16d19c842da81aeb5c94802a..927095707e711f919a1bfbe0aeeb6719b16ca508 100644 GIT binary patch literal 19545 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 diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index 47be326..0000000 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 4250414..f356068 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,16 +1,14 @@ - - - + android:width="108dp" + android:height="108dp" + android:viewportWidth="960" + android:viewportHeight="960"> + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index 52ac069..1c84df9 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,6 +1,6 @@ - - - + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 52ac069..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index f3b07686e966aa75f75bd6c0e64dd88c0a844987..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 52d37005aeaed57d0eaa8433e8026dc201dd589c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 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 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index b4ca1bb084c74849ed3a5a406b415f47f0fd1d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3192 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 8939e36d5e7a6937ac80be7a7cbe34f5b69220b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7126 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 MG!hziU$^WT01@Q63;+NC diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..071fcf5 --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #202124 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c00c64a..f24d1bb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,10 +1,10 @@ - Adaptive theme + Adaptive Theme Close Copy ADB Command Disable notification - Use adaptive theme + Use Adaptive Theme Adaptive Theme automatically adjusts the device theme based on ambient brightness.\nIt enhances visibility in bright conditions while optimizing battery life in darker ones. This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from app settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s From 52fa72d795985b5d685e9f0d06b4f3925c6f87ed Mon Sep 17 00:00:00 2001 From: xLexip Date: Sat, 1 Nov 2025 14:49:26 +0100 Subject: [PATCH 13/75] refactor(ui): Organize service toggling logic --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 67 ++++++++++++------- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 60 ++++++++++++++++- .../java/dev/lexip/hecate/ui/MainActivity.kt | 15 +---- .../ui/components/PermissionMissingDialog.kt | 5 -- 4 files changed, 102 insertions(+), 45 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 3f30e11..8e7ac9e 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -13,6 +13,8 @@ package dev.lexip.hecate.ui import android.Manifest +import android.content.ClipData +import android.content.ClipboardManager import android.content.pm.PackageManager import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -33,10 +35,9 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState 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.hapticfeedback.HapticFeedbackType import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -47,6 +48,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat +import androidx.lifecycle.viewmodel.compose.viewModel import dev.lexip.hecate.R import dev.lexip.hecate.ui.components.PermissionMissingDialog import dev.lexip.hecate.ui.components.SwitchPreferenceCard @@ -55,19 +57,38 @@ import dev.lexip.hecate.ui.theme.hecateTopAppBarColors @OptIn(ExperimentalMaterial3Api::class) @Composable fun AdaptiveThemeScreen( - uiState: AdaptiveThemeUiState, - updateAdaptiveThemeEnabled: (Boolean) -> Unit, - copyAdbCommand: (String) -> Unit + uiState: AdaptiveThemeUiState ) { val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) val horizontalOffsetPadding = 8.dp - var showMissingPermissionDialog by remember { mutableStateOf(false) } - var pendingAdbCommand by remember { mutableStateOf("") } val context = LocalContext.current - val packageName = context.packageName val haptic = LocalHapticFeedback.current + val packageName = context.packageName + + val adaptiveThemeViewModel: AdaptiveThemeViewModel = viewModel( + factory = AdaptiveThemeViewModelFactory( + context.applicationContext as dev.lexip.hecate.HecateApplication, + dev.lexip.hecate.data.UserPreferencesRepository((context.applicationContext as dev.lexip.hecate.HecateApplication).userPreferencesDataStore), + dev.lexip.hecate.util.DarkThemeHandler(context) + ) + ) + + val showMissingPermissionDialog by adaptiveThemeViewModel.showMissingPermissionDialog.collectAsState() + val pendingAdbCommand by adaptiveThemeViewModel.pendingAdbCommand.collectAsState() + + LaunchedEffect(adaptiveThemeViewModel) { + adaptiveThemeViewModel.uiEvents.collect { event -> + when (event) { + is UiEvent.CopyToClipboard -> { + val clipboard = context.getSystemService(ClipboardManager::class.java) + val clip = ClipData.newPlainText("ADB Command", event.text) + clipboard?.setPrimaryClip(clip) + } + } + } + } Scaffold( modifier = Modifier @@ -112,16 +133,19 @@ fun AdaptiveThemeScreen( context, Manifest.permission.WRITE_SECURE_SETTINGS ) == PackageManager.PERMISSION_GRANTED - if (checked && !hasPermission) { - pendingAdbCommand = - "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" - showMissingPermissionDialog = true - } else if (!showMissingPermissionDialog) { - haptic.performHapticFeedback( - if (checked) HapticFeedbackType.ToggleOn else HapticFeedbackType.ToggleOff - ) - updateAdaptiveThemeEnabled(checked) + adaptiveThemeViewModel.onServiceToggleRequested( + checked, + hasPermission, + packageName + ).also { wasToggled -> + if (wasToggled) + haptic.performHapticFeedback( + if (checked) HapticFeedbackType.ToggleOn else HapticFeedbackType.ToggleOff + ) + else + haptic.performHapticFeedback(HapticFeedbackType.Reject) } + } ) } @@ -130,10 +154,7 @@ fun AdaptiveThemeScreen( PermissionMissingDialog( show = showMissingPermissionDialog, adbCommand = pendingAdbCommand, - onCopy = { cmd -> - copyAdbCommand(cmd) - // keep dialog open - }, - onDismiss = { showMissingPermissionDialog = false } + onCopy = { adaptiveThemeViewModel.requestCopyAdbCommand() }, + onDismiss = { adaptiveThemeViewModel.dismissDialog() } ) } \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index 46c8a5f..ecd2e00 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -20,12 +20,17 @@ import dev.lexip.hecate.HecateApplication import dev.lexip.hecate.data.UserPreferencesRepository import dev.lexip.hecate.services.BroadcastReceiverService import dev.lexip.hecate.util.DarkThemeHandler +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch -private const val TAG = "AdaptiveThemeViewModel" +sealed interface UiEvent { + data class CopyToClipboard(val text: String) : UiEvent +} data class AdaptiveThemeUiState( val adaptiveThemeEnabled: Boolean = false @@ -34,12 +39,29 @@ data class AdaptiveThemeUiState( class AdaptiveThemeViewModel( private val application: HecateApplication, private val userPreferencesRepository: UserPreferencesRepository, - private var darkThemeHandler: DarkThemeHandler + @Suppress("unused") + private var _darkThemeHandler: DarkThemeHandler ) : ViewModel() { + // UI state private val _uiState = MutableStateFlow(AdaptiveThemeUiState()) val uiState: StateFlow = _uiState.asStateFlow() + // One-shot UI events (copy to clipboard, etc.) + private val _uiEvents = MutableSharedFlow( + replay = 0, + extraBufferCapacity = 1, + onBufferOverflow = BufferOverflow.DROP_OLDEST + ) + val uiEvents = _uiEvents.asSharedFlow() + + // Permission error dialog + private val _showMissingPermissionDialog = MutableStateFlow(false) + val showMissingPermissionDialog: StateFlow = _showMissingPermissionDialog.asStateFlow() + private val _pendingAdbCommand = MutableStateFlow("") + val pendingAdbCommand: StateFlow = _pendingAdbCommand.asStateFlow() + + init { viewModelScope.launch { userPreferencesRepository.userPreferencesFlow.collect { userPreferences -> @@ -50,7 +72,39 @@ class AdaptiveThemeViewModel( } } - fun updateAdaptiveThemeEnabled(enable: Boolean) { + /** + * Toggle adaptive theme service or show permission dialog. + * @return true if service was toggled, false if permission dialog is shown. + */ + fun onServiceToggleRequested( + checked: Boolean, + hasPermission: Boolean, + packageName: String + ): Boolean { + if (checked && !hasPermission) { + _pendingAdbCommand.value = + "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" + _showMissingPermissionDialog.value = true + return false + } else { + _showMissingPermissionDialog.value = false + updateAdaptiveThemeEnabled(checked) + return true + } + } + + fun dismissDialog() { + _showMissingPermissionDialog.value = false + } + + fun requestCopyAdbCommand() { + val cmd = _pendingAdbCommand.value + viewModelScope.launch { + _uiEvents.emit(UiEvent.CopyToClipboard(cmd)) + } + } + + private fun updateAdaptiveThemeEnabled(enable: Boolean) { viewModelScope.launch { userPreferencesRepository.updateAdaptiveThemeEnabled(enable) if (enable) startBroadcastReceiverService() else stopBroadcastReceiverService() diff --git a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt index 7c68f77..7f90a0d 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt @@ -12,8 +12,6 @@ package dev.lexip.hecate.ui -import android.content.ClipData -import android.content.ClipboardManager import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -45,24 +43,13 @@ class MainActivity : ComponentActivity() { ) val state by adaptiveThemeViewModel.uiState.collectAsState() - val copyAdbCommand: (String) -> Unit = - { adbCommand -> copyToClipboard("ADB Command", adbCommand) } - HecateTheme { AdaptiveThemeScreen( - state, - adaptiveThemeViewModel::updateAdaptiveThemeEnabled, - copyAdbCommand + state ) } } } - private fun copyToClipboard(label: String, text: String) { - val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText(label, text) - clipboard.setPrimaryClip(clip) - } - } diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt index 0ed3c53..14a087f 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt @@ -17,7 +17,6 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.stringResource @@ -35,10 +34,6 @@ fun PermissionMissingDialog( val haptic = LocalHapticFeedback.current - LaunchedEffect(show) { - if (show) haptic.performHapticFeedback(HapticFeedbackType.Reject) - } - AlertDialog( onDismissRequest = onDismiss, title = { Text(text = stringResource(id = R.string.title_missing_permission)) }, From c1e0a9064ffab8aa8337d8e817f4da8f36638383 Mon Sep 17 00:00:00 2001 From: xLexip Date: Sat, 1 Nov 2025 14:58:31 +0100 Subject: [PATCH 14/75] chore(ci): Limit build job permissions --- .github/workflows/build.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fb2629d..4022806 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,8 @@ on: jobs: build: name: Build and analyze + permissions: + contents: read runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From 4d59e882ecebc3b5bda790687209d37aedaa5848 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 31 Oct 2025 17:34:27 +0100 Subject: [PATCH 15/75] chore: Add PRIVACY_POLICY.md --- PRIVACY_POLICY.md | 87 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 PRIVACY_POLICY.md diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md new file mode 100644 index 0000000..5d2aacf --- /dev/null +++ b/PRIVACY_POLICY.md @@ -0,0 +1,87 @@ +# Privacy Policy — Adaptive Theme (aka. Hecate) + +**Last updated:** 2025-10-31 + +## 1. Overview + +Adaptive Theme (`dev.lexip.hecate`) (the “App”). This Privacy Policy explains what +information the App collects, how it is used and shared, and your choices. This policy +applies to the App distributed via Google Play and any in-app disclosures. + +- App name: Adaptive Theme +- Package name: `dev.lexip.hecate` +- Publisher: X. Lexip — x@lexip.dev + +## 2. Core principles + +We follow a minimal-data principle. The App is designed to work without collecting personal +information. When we do collect technical or diagnostic data it is strictly limited to what is +necessary to run, diagnose, and improve the App. + +## 3. Data we may collect and why + +### 3.1 No personal information + +The App does not collect personal information (name, email, account ID, payment information) as part +of normal usage. The only time personal information may be provided is if you voluntarily send it to +us (for example, an email when contacting support). + +### 3.2 Device, diagnostics, and usage data + +We use Firebase services (Firebase Analytics and Firebase Crashlytics) to collect aggregated and +diagnostic usage information. Examples of data sent to Firebase include: + +- Crash stacks and related device metadata (Android version, device model, app version) +- Anonymous analytics events for app usage patterns + +This data helps us fix crashes, improve stability, and improve user experience. Firebase is operated +by Google; data processing by Firebase is subject to Google’s privacy policies. You can review +Firebase’s privacy docs here: https://firebase.google.com/support/privacy + +By using the App you explicitly consent to the collection, processing, and transfer of the +analytics and diagnostic data described above by Firebase Analytics and Firebase Crashlytics. If you +do not agree to this processing, please do not use the App; alternatively contact us at +x@lexip.dev and we'll advise on available options. + +### 3.3 Sensitive capability: WRITE_SECURE_SETTINGS + +The App implements features that require the Android capability `WRITE_SECURE_SETTINGS`. Important +points: + +- `WRITE_SECURE_SETTINGS` cannot be granted by a normal runtime permission prompt. It must be + granted externally (for example, with ADB or via an enterprise device-management policy). +- The App does not request or obtain this capability silently. If the capability is not granted the + App will disable the related features and show an explanatory message to the user. +- We use this capability only to perform the specific feature described in the UI: modify the system + theme (adaptive theme behavior). We do not use it to collect or transmit personal data. + +## 4. Analytics, crash reporting, and third parties + +We use Firebase Analytics and Firebase Crashlytics. These services process data on our behalf and +are contractually limited to that purpose. They may collect aggregated and device-level diagnostic +information. We do not sell user data or share it with other third parties for their own independent +use. + +## 5. Data retention and deletion + +- Crash reports and analytics data are retained by Firebase according to Firebase retention + policies. Aggregated or anonymized analytics data may be kept indefinitely for product + improvement. +- If you wish to request deletion of data associated with you, contact us at x@lexip.dev with a + clear description of the request. We'll respond and take reasonable steps to comply, subject to + any legal obligations to retain certain records. + +## 6. Security + +We implement reasonable technical and organizational measures to protect data we process. However, +no method of transmission or storage is completely secure. If you believe your data has been +compromised, contact us immediately at x@lexip.dev. + +## 7. International data transfers + +Firebase (Google) and other service providers may process data in countries outside your own. By +using the App you consent to the transfer and processing described in this policy. + +## 8. Changes to this privacy policy + +We may update this Privacy Policy. When we do, we will update the “Last updated” date above. \ No newline at end of file From 1f87280584619c28ed0976b31d94f7b1ddcb471e Mon Sep 17 00:00:00 2001 From: xLexip Date: Sun, 2 Nov 2025 12:49:53 +0100 Subject: [PATCH 16/75] feat(data): Implement a threshold lux enum #31 --- .../lexip/hecate/data/AdaptiveThreshold.kt | 37 +++++++++++++++++++ .../hecate/data/UserPreferencesRepository.kt | 11 +++++- app/src/main/res/values/strings.xml | 9 +++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt diff --git a/app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt b/app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt new file mode 100644 index 0000000..639ba93 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.data + +import dev.lexip.hecate.R + +enum class AdaptiveThreshold(val labelRes: Int, val lux: Float) { + DARK_ROOM(R.string.adaptive_threshold_dark_room, 5f), + DIM_ROOM(R.string.adaptive_threshold_dim_room, 50f), + INDOOR(R.string.adaptive_threshold_indoor, 150f), + BRIGHT_INDOOR(R.string.adaptive_threshold_bright_indoor, 500f), + DAYLIGHT(R.string.adaptive_threshold_daylight, 2_000f), + SUNLIGHT(R.string.adaptive_threshold_sunlight, 10_000f); + + companion object { + fun fromIndex(index: Int): AdaptiveThreshold { + val i = index.coerceIn(0, entries.size - 1) + return entries[i] + } + + fun fromLux(lux: Float): AdaptiveThreshold { + val exact = entries.firstOrNull { it.lux == lux } + if (exact != null) return exact + return entries.minByOrNull { kotlin.math.abs(it.lux - lux) } ?: INDOOR + } + } +} diff --git a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt index 12a0265..be80761 100644 --- a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt +++ b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 xLexip + * Copyright (C) 2024-2025 xLexip * * Licensed under the GNU General Public License, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,6 +55,15 @@ class UserPreferencesRepository(private val dataStore: DataStore) { suspend fun fetchInitialPreferences() = mapUserPreferences(dataStore.data.first().toPreferences()) + + suspend fun ensureAdaptiveThemeThresholdDefault(default: Float) { + dataStore.edit { preferences -> + if (preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] == null) { + preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] = default + } + } + } + private fun mapUserPreferences(preferences: Preferences): UserPreferences { // Get our show completed value, defaulting to false if not set: preferences[PreferencesKeys.ADAPTIVE_THEME_ENABLED] == true diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f24d1bb..911d0a3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,15 @@ Adaptive theme is active + Brightness Threshold Missing permission Background Activity + + + Dark Room + Dim Room + Indoor + Bright Indoor + Daylight + Sunlight \ No newline at end of file From 98eb16164f76d0bc5b9c4ec66576ba94cc124e5b Mon Sep 17 00:00:00 2001 From: xLexip Date: Sun, 2 Nov 2025 12:52:57 +0100 Subject: [PATCH 17/75] feat(services): Consider live threshold changes while the service is running #31 --- .../java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt | 2 +- .../lexip/hecate/services/BroadcastReceiverService.kt | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt b/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt index c523353..47583ff 100644 --- a/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt +++ b/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt @@ -30,7 +30,7 @@ class ScreenOnReceiver( private val proximitySensorManager: ProximitySensorManager, private val lightSensorManager: LightSensorManager, private val darkThemeHandler: DarkThemeHandler, - private val adaptiveThemeThresholdLux: Float + var adaptiveThemeThresholdLux: Float ) : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { diff --git a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt index d830028..6b21e5c 100644 --- a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt +++ b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt @@ -50,6 +50,7 @@ class BroadcastReceiverService : Service() { private lateinit var proximitySensorManager: ProximitySensorManager override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + super.onStartCommand(intent, flags, startId) Log.i(TAG, "Service starting...") initializeUtils() @@ -78,6 +79,14 @@ class BroadcastReceiverService : Service() { } } + // Collect preference updates and update the receiver's threshold while service runs + applicationScope.launch { + val userPreferencesRepository = UserPreferencesRepository(dataStore) + userPreferencesRepository.userPreferencesFlow.collect { prefs -> + screenOnReceiver?.adaptiveThemeThresholdLux = prefs.adaptiveThemeThresholdLux + } + } + return START_STICKY } From 5b432e3118ddfda01bed8ebedf126c3d6b9fa995 Mon Sep 17 00:00:00 2001 From: xLexip Date: Sun, 2 Nov 2025 14:31:07 +0100 Subject: [PATCH 18/75] feat(ui): Implement lux threshold slider #31 --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 31 +++- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 39 +++-- ...nceCard.kt => MainSwitchPreferenceCard.kt} | 2 +- .../ui/components/SliderPreferenceCard.kt | 146 ++++++++++++++++++ 4 files changed, 200 insertions(+), 18 deletions(-) rename app/src/main/java/dev/lexip/hecate/ui/components/{SwitchPreferenceCard.kt => MainSwitchPreferenceCard.kt} (96%) create mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 8e7ac9e..745a121 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -50,8 +50,10 @@ import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat import androidx.lifecycle.viewmodel.compose.viewModel import dev.lexip.hecate.R +import dev.lexip.hecate.data.AdaptiveThreshold +import dev.lexip.hecate.ui.components.MainSwitchPreferenceCard import dev.lexip.hecate.ui.components.PermissionMissingDialog -import dev.lexip.hecate.ui.components.SwitchPreferenceCard +import dev.lexip.hecate.ui.components.SliderPreferenceCard import dev.lexip.hecate.ui.theme.hecateTopAppBarColors @OptIn(ExperimentalMaterial3Api::class) @@ -125,7 +127,7 @@ fun AdaptiveThemeScreen( text = stringResource(id = R.string.description_adaptive_theme), style = MaterialTheme.typography.bodyLarge.copy(lineHeight = 22.sp) ) - SwitchPreferenceCard( + MainSwitchPreferenceCard( text = stringResource(id = R.string.action_use_adaptive_theme), isChecked = uiState.adaptiveThemeEnabled, onCheckedChange = { checked -> @@ -148,6 +150,31 @@ fun AdaptiveThemeScreen( } ) + + val currentIndex = adaptiveThemeViewModel.getIndexForCurrentLux() + val labels = AdaptiveThreshold.entries.map { stringResource(id = it.labelRes) } + val lux = AdaptiveThreshold.entries.map { it.lux } + + Column( + verticalArrangement = Arrangement.spacedBy(2.dp) + ) { + SliderPreferenceCard( + title = stringResource(id = R.string.title_brightness_threshold), + valueIndex = currentIndex, + steps = labels.size, + labels = labels, + lux = lux, + onValueChange = { index -> + adaptiveThemeViewModel.updateAdaptiveThemeThresholdByIndex( + index + ) + }, + enabled = uiState.adaptiveThemeEnabled, + topRounded = true, + bottomRounded = true + ) + + } } } diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index ecd2e00..6914940 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -17,6 +17,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import dev.lexip.hecate.HecateApplication +import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.data.UserPreferencesRepository import dev.lexip.hecate.services.BroadcastReceiverService import dev.lexip.hecate.util.DarkThemeHandler @@ -33,7 +34,8 @@ sealed interface UiEvent { } data class AdaptiveThemeUiState( - val adaptiveThemeEnabled: Boolean = false + val adaptiveThemeEnabled: Boolean = false, + val adaptiveThemeThresholdLux: Float = AdaptiveThreshold.BRIGHT_INDOOR.lux ) class AdaptiveThemeViewModel( @@ -61,12 +63,12 @@ class AdaptiveThemeViewModel( private val _pendingAdbCommand = MutableStateFlow("") val pendingAdbCommand: StateFlow = _pendingAdbCommand.asStateFlow() - init { viewModelScope.launch { userPreferencesRepository.userPreferencesFlow.collect { userPreferences -> _uiState.value = AdaptiveThemeUiState( - adaptiveThemeEnabled = userPreferences.adaptiveThemeEnabled + adaptiveThemeEnabled = userPreferences.adaptiveThemeEnabled, + adaptiveThemeThresholdLux = userPreferences.adaptiveThemeThresholdLux ) } } @@ -86,11 +88,10 @@ class AdaptiveThemeViewModel( "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" _showMissingPermissionDialog.value = true return false - } else { - _showMissingPermissionDialog.value = false - updateAdaptiveThemeEnabled(checked) - return true } + _showMissingPermissionDialog.value = false + _updateAdaptiveThemeEnabled(checked) + return true } fun dismissDialog() { @@ -104,14 +105,27 @@ class AdaptiveThemeViewModel( } } - private fun updateAdaptiveThemeEnabled(enable: Boolean) { + private fun _updateAdaptiveThemeEnabled(enable: Boolean) { viewModelScope.launch { userPreferencesRepository.updateAdaptiveThemeEnabled(enable) - if (enable) startBroadcastReceiverService() else stopBroadcastReceiverService() - updateAdaptiveThemeThresholdLux(500f) + if (enable) { + startBroadcastReceiverService() + userPreferencesRepository.ensureAdaptiveThemeThresholdDefault(AdaptiveThreshold.BRIGHT_INDOOR.lux) + } else stopBroadcastReceiverService() + } + } + + fun updateAdaptiveThemeThresholdByIndex(index: Int) { + val threshold = AdaptiveThreshold.fromIndex(index) + viewModelScope.launch { + userPreferencesRepository.updateAdaptiveThemeThresholdLux(threshold.lux) } } + fun getIndexForCurrentLux(): Int { + return AdaptiveThreshold.fromLux(_uiState.value.adaptiveThemeThresholdLux).ordinal + } + private fun startBroadcastReceiverService() { val intent = Intent(application.applicationContext, BroadcastReceiverService::class.java) application.applicationContext.startService(intent) @@ -121,11 +135,6 @@ class AdaptiveThemeViewModel( val intent = Intent(application.applicationContext, BroadcastReceiverService::class.java) application.applicationContext.stopService(intent) } - - private suspend fun updateAdaptiveThemeThresholdLux(lux: Float) { - userPreferencesRepository.updateAdaptiveThemeThresholdLux(lux) - } - } class AdaptiveThemeViewModelFactory( diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/SwitchPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt similarity index 96% rename from app/src/main/java/dev/lexip/hecate/ui/components/SwitchPreferenceCard.kt rename to app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt index 664343a..0de61b4 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/SwitchPreferenceCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable -fun SwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { +fun MainSwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { Card( modifier = Modifier .fillMaxWidth(), diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt new file mode 100644 index 0000000..ac4dbbf --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Slider +import androidx.compose.material3.SliderDefaults +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.draw.alpha +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import kotlin.math.roundToInt + +@Composable +fun SliderPreferenceCard( + title: String, + valueIndex: Int, + steps: Int, + labels: List, + lux: List? = null, + onValueChange: (Int) -> Unit, + enabled: Boolean = true, + topRounded: Boolean = false, + bottomRounded: Boolean = false, +) { + val largeRadius = 20.dp + val smallRadius = 4.dp + val shape = RoundedCornerShape( + topStart = if (topRounded) largeRadius else smallRadius, + topEnd = if (topRounded) largeRadius else smallRadius, + bottomStart = if (bottomRounded) largeRadius else smallRadius, + bottomEnd = if (bottomRounded) largeRadius else smallRadius, + ) + + Card( + shape = shape, + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceBright) + ) { + Column( + modifier = Modifier.padding(14.dp), + verticalArrangement = Arrangement.spacedBy(0.dp) + ) { + Text( + modifier = Modifier.alpha(if (enabled) 1f else 0.38f), + text = title, + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurface, + ) + LabeledSlider( + valueIndex = valueIndex, + steps = steps, + labels = labels, + lux = lux, + onValueChange = onValueChange, + enabled = enabled + ) + } + } +} + +@Composable +private fun LabeledSlider( + valueIndex: Int, + steps: Int, + labels: List, + lux: List? = null, + onValueChange: (Int) -> Unit, + enabled: Boolean = true +) { + val haptic = LocalHapticFeedback.current + var sliderPosition by remember { mutableStateOf(valueIndex.toFloat()) } + var lastLiveIndex by remember { mutableStateOf(valueIndex) } + + LaunchedEffect(valueIndex) { sliderPosition = valueIndex.toFloat() } + + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 12.dp) + ) { + Slider( + value = sliderPosition, + onValueChange = { new -> + sliderPosition = new + val liveIndex = sliderPosition.roundToInt().coerceIn(0, steps - 1) + if (liveIndex != lastLiveIndex) { + haptic.performHapticFeedback(HapticFeedbackType.SegmentTick) + lastLiveIndex = liveIndex + } + }, + onValueChangeFinished = { onValueChange(sliderPosition.toInt()) }, + valueRange = 0f..(steps - 1).toFloat(), + steps = (steps - 2).coerceAtLeast(0), + enabled = enabled, + colors = SliderDefaults.colors() + ) + + if (enabled) { + val liveIndex = sliderPosition.roundToInt().coerceIn(0, steps - 1) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = labels.getOrNull(liveIndex) ?: liveIndex.toString(), + fontSize = MaterialTheme.typography.bodySmall.fontSize, + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.weight(1f) + ) + Text( + text = lux?.getOrNull(liveIndex)?.toInt()?.let { "$it lux" } ?: "", + fontSize = MaterialTheme.typography.bodySmall.fontSize, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.End + ) + } + } + } +} From 4c51f92c945569c44fab126084b1d7cbe0ace977 Mon Sep 17 00:00:00 2001 From: xLexip Date: Sun, 2 Nov 2025 14:39:26 +0100 Subject: [PATCH 19/75] chore(ci): Run SonarCloud analysis on all branches --- .github/workflows/build.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4022806..1058ee9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,9 +1,6 @@ name: SonarCloud on: - push: - branches: - - main - - develop + push: { } pull_request: types: [ opened, synchronize, reopened ] jobs: From 713f7d4bd71994374abfffe2f1d19bb28f18473c Mon Sep 17 00:00:00 2001 From: xLexip Date: Sun, 2 Nov 2025 15:02:47 +0100 Subject: [PATCH 20/75] refactor: Address SonarCloud findings #31 --- .../java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt | 4 ++-- .../dev/lexip/hecate/ui/components/SliderPreferenceCard.kt | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index 6914940..eb8e732 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -90,7 +90,7 @@ class AdaptiveThemeViewModel( return false } _showMissingPermissionDialog.value = false - _updateAdaptiveThemeEnabled(checked) + updateAdaptiveThemeEnabled(checked) return true } @@ -105,7 +105,7 @@ class AdaptiveThemeViewModel( } } - private fun _updateAdaptiveThemeEnabled(enable: Boolean) { + private fun updateAdaptiveThemeEnabled(enable: Boolean) { viewModelScope.launch { userPreferencesRepository.updateAdaptiveThemeEnabled(enable) if (enable) { diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt index ac4dbbf..df7c2b6 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt @@ -27,7 +27,8 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier @@ -95,8 +96,8 @@ private fun LabeledSlider( enabled: Boolean = true ) { val haptic = LocalHapticFeedback.current - var sliderPosition by remember { mutableStateOf(valueIndex.toFloat()) } - var lastLiveIndex by remember { mutableStateOf(valueIndex) } + var sliderPosition by remember { mutableFloatStateOf(valueIndex.toFloat()) } + var lastLiveIndex by remember { mutableIntStateOf(valueIndex) } LaunchedEffect(valueIndex) { sliderPosition = valueIndex.toFloat() } From 90c1a5a92a6415f433aa68be96a9d1969dd5e43e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 2 Nov 2025 14:21:40 +0000 Subject: [PATCH 21/75] chore(deps): update CI actions to v5 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1058ee9..1e54bba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ jobs: contents: read runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis @@ -24,7 +24,7 @@ jobs: GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }} - name: Set up JDK 23 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: 23 distribution: 'zulu' From fe52cf160d3a49536d15167b8c6873299e8628ea Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 18:13:45 +0100 Subject: [PATCH 22/75] feat(ui): Implement current brightness indication #50 * Implement a segmented progress bar to indicate the current ambient brightness. * Re-structure detail settings and outsource common code to DetailPreferenceCard.kt. * Implement Int.formatLux() to display lux values in the local number format. --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 19 +++- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 46 +++++++- .../preferences/DetailPreferenceCard.kt | 64 +++++++++++ .../preferences/ProgressDetailCard.kt | 104 ++++++++++++++++++ .../SliderDetailCard.kt} | 43 +++----- .../java/dev/lexip/hecate/util/FormatUtils.kt | 25 +++++ app/src/main/res/values/strings.xml | 2 +- 7 files changed, 263 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/preferences/DetailPreferenceCard.kt create mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/preferences/ProgressDetailCard.kt rename app/src/main/java/dev/lexip/hecate/ui/components/{SliderPreferenceCard.kt => preferences/SliderDetailCard.kt} (74%) create mode 100644 app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 745a121..04a5d46 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -53,7 +53,8 @@ import dev.lexip.hecate.R import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.ui.components.MainSwitchPreferenceCard import dev.lexip.hecate.ui.components.PermissionMissingDialog -import dev.lexip.hecate.ui.components.SliderPreferenceCard +import dev.lexip.hecate.ui.components.preferences.ProgressDetailCard +import dev.lexip.hecate.ui.components.preferences.SliderDetailCard import dev.lexip.hecate.ui.theme.hecateTopAppBarColors @OptIn(ExperimentalMaterial3Api::class) @@ -154,11 +155,12 @@ fun AdaptiveThemeScreen( val currentIndex = adaptiveThemeViewModel.getIndexForCurrentLux() val labels = AdaptiveThreshold.entries.map { stringResource(id = it.labelRes) } val lux = AdaptiveThreshold.entries.map { it.lux } + val currentLux by adaptiveThemeViewModel.currentSensorLuxFlow.collectAsState(initial = adaptiveThemeViewModel.currentSensorLux) Column( verticalArrangement = Arrangement.spacedBy(2.dp) ) { - SliderPreferenceCard( + SliderDetailCard( title = stringResource(id = R.string.title_brightness_threshold), valueIndex = currentIndex, steps = labels.size, @@ -170,8 +172,17 @@ fun AdaptiveThemeScreen( ) }, enabled = uiState.adaptiveThemeEnabled, - topRounded = true, - bottomRounded = true + firstCard = true, + lastCard = false + ) + + ProgressDetailCard( + title = stringResource(id = R.string.title_current_brightness), + currentLux = currentLux, + luxSteps = lux, + enabled = uiState.adaptiveThemeEnabled, + firstCard = false, + lastCard = true ) } diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index eb8e732..8bdbeaf 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -21,6 +21,7 @@ import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.data.UserPreferencesRepository import dev.lexip.hecate.services.BroadcastReceiverService import dev.lexip.hecate.util.DarkThemeHandler +import dev.lexip.hecate.util.LightSensorManager import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow @@ -35,7 +36,7 @@ sealed interface UiEvent { data class AdaptiveThemeUiState( val adaptiveThemeEnabled: Boolean = false, - val adaptiveThemeThresholdLux: Float = AdaptiveThreshold.BRIGHT_INDOOR.lux + val adaptiveThemeThresholdLux: Float = AdaptiveThreshold.BRIGHT.lux ) class AdaptiveThemeViewModel( @@ -45,11 +46,10 @@ class AdaptiveThemeViewModel( private var _darkThemeHandler: DarkThemeHandler ) : ViewModel() { - // UI state private val _uiState = MutableStateFlow(AdaptiveThemeUiState()) val uiState: StateFlow = _uiState.asStateFlow() - // One-shot UI events (copy to clipboard, etc.) + // One-shot UI events private val _uiEvents = MutableSharedFlow( replay = 0, extraBufferCapacity = 1, @@ -57,12 +57,24 @@ class AdaptiveThemeViewModel( ) val uiEvents = _uiEvents.asSharedFlow() - // Permission error dialog + // Permission Error Dialog private val _showMissingPermissionDialog = MutableStateFlow(false) val showMissingPermissionDialog: StateFlow = _showMissingPermissionDialog.asStateFlow() private val _pendingAdbCommand = MutableStateFlow("") val pendingAdbCommand: StateFlow = _pendingAdbCommand.asStateFlow() + // Light Sensor + private val lightSensorManager = LightSensorManager(application.applicationContext) + private var isListeningToSensor = false + + private val _currentSensorLux = MutableStateFlow(0f) + val currentSensorLuxFlow: StateFlow = _currentSensorLux.asStateFlow() + val currentSensorLux: Float get() = _currentSensorLux.value + + fun updateCurrentSensorLux(lux: Float) { + _currentSensorLux.value = lux + } + init { viewModelScope.launch { userPreferencesRepository.userPreferencesFlow.collect { userPreferences -> @@ -70,10 +82,34 @@ class AdaptiveThemeViewModel( adaptiveThemeEnabled = userPreferences.adaptiveThemeEnabled, adaptiveThemeThresholdLux = userPreferences.adaptiveThemeThresholdLux ) + + if (userPreferences.adaptiveThemeEnabled) startLightSensorListening() + else stopLightSensorListening() } } } + private fun startLightSensorListening() { + if (isListeningToSensor) return + isListeningToSensor = true + lightSensorManager.startListening { lux -> + viewModelScope.launch { + updateCurrentSensorLux(lux) + } + } + } + + private fun stopLightSensorListening() { + if (!isListeningToSensor) return + isListeningToSensor = false + lightSensorManager.stopListening() + } + + override fun onCleared() { + stopLightSensorListening() + super.onCleared() + } + /** * Toggle adaptive theme service or show permission dialog. * @return true if service was toggled, false if permission dialog is shown. @@ -110,7 +146,7 @@ class AdaptiveThemeViewModel( userPreferencesRepository.updateAdaptiveThemeEnabled(enable) if (enable) { startBroadcastReceiverService() - userPreferencesRepository.ensureAdaptiveThemeThresholdDefault(AdaptiveThreshold.BRIGHT_INDOOR.lux) + userPreferencesRepository.ensureAdaptiveThemeThresholdDefault(AdaptiveThreshold.BRIGHT.lux) } else stopBroadcastReceiverService() } } diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/DetailPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/DetailPreferenceCard.kt new file mode 100644 index 0000000..991f971 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/DetailPreferenceCard.kt @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.components.preferences + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.unit.dp + +@Composable +fun DetailPreferenceCard( + title: String, + enabled: Boolean = true, + firstCard: Boolean = false, + lastCard: Boolean = false, + content: @Composable () -> Unit +) { + val largeRadius = 20.dp + val smallRadius = 4.dp + val shape = RoundedCornerShape( + topStart = if (firstCard) largeRadius else smallRadius, + topEnd = if (firstCard) largeRadius else smallRadius, + bottomStart = if (lastCard) largeRadius else smallRadius, + bottomEnd = if (lastCard) largeRadius else smallRadius, + ) + + Card( + shape = shape, + colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceBright) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(14.dp) + .alpha(if (enabled) 1f else 0.38f) + ) { + Text( + text = title, + style = MaterialTheme.typography.titleMedium, + color = MaterialTheme.colorScheme.onSurface + ) + + content() + } + } +} diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/ProgressDetailCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/ProgressDetailCard.kt new file mode 100644 index 0000000..8ff14df --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/ProgressDetailCard.kt @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.components.preferences + +import androidx.compose.foundation.background +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.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp + +@Composable +fun ProgressDetailCard( + title: String, + currentLux: Float, + luxSteps: List, + enabled: Boolean = true, + firstCard: Boolean = false, + lastCard: Boolean = false +) { + DetailPreferenceCard( + title = title, + enabled = enabled, + firstCard = firstCard, + lastCard = lastCard + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 12.dp) + .padding(top = 8.dp, bottom = 8.dp), + verticalArrangement = Arrangement.spacedBy(8.dp) + ) { + val segments = (luxSteps.size - 1).coerceAtLeast(1) + + val activeIndex = remember(currentLux, luxSteps) { + computeActiveSegmentIndex( + luxSteps, + currentLux + ).coerceIn(-1, segments - 1) + } + + SegmentedBrightnessRow( + segments = segments, + activeIndex = activeIndex, + enabled = enabled + ) + } + } +} + +@Composable +private fun SegmentedBrightnessRow(segments: Int, activeIndex: Int, enabled: Boolean) { + val sliderColors = androidx.compose.material3.SliderDefaults.colors() + val activeColor = sliderColors.activeTrackColor + val inactiveColor = sliderColors.inactiveTrackColor + + Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(6.dp)) { + for (i in 0 until segments) { + val isActive = i <= activeIndex + val shape = RoundedCornerShape(8.dp) + + Box( + modifier = Modifier + .weight(1f) + .height(16.dp) + .clip(shape) + .background( + if (enabled && isActive) activeColor + else inactiveColor + ) + ) {} + } + } +} + +private fun computeActiveSegmentIndex(luxSteps: List, currentLux: Float): Int { + val n = luxSteps.size + if (n < 2) return -1 + var idx = -1 + for (i in 0 until n - 1) { + val upper = luxSteps.getOrNull(i + 1) ?: continue + if (currentLux > upper) idx = i + } + return idx +} diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt similarity index 74% rename from app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt rename to app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt index df7c2b6..857143f 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/SliderPreferenceCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt @@ -10,16 +10,13 @@ * Please see the License for specific terms regarding permissions and limitations. */ -package dev.lexip.hecate.ui.components +package dev.lexip.hecate.ui.components.preferences import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Slider import androidx.compose.material3.SliderDefaults @@ -32,15 +29,15 @@ import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import dev.lexip.hecate.util.formatLux import kotlin.math.roundToInt @Composable -fun SliderPreferenceCard( +fun SliderDetailCard( title: String, valueIndex: Int, steps: Int, @@ -48,32 +45,19 @@ fun SliderPreferenceCard( lux: List? = null, onValueChange: (Int) -> Unit, enabled: Boolean = true, - topRounded: Boolean = false, - bottomRounded: Boolean = false, + firstCard: Boolean = false, + lastCard: Boolean = false, ) { - val largeRadius = 20.dp - val smallRadius = 4.dp - val shape = RoundedCornerShape( - topStart = if (topRounded) largeRadius else smallRadius, - topEnd = if (topRounded) largeRadius else smallRadius, - bottomStart = if (bottomRounded) largeRadius else smallRadius, - bottomEnd = if (bottomRounded) largeRadius else smallRadius, - ) - - Card( - shape = shape, - colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceBright) + DetailPreferenceCard( + title = title, + enabled = enabled, + firstCard = firstCard, + lastCard = lastCard ) { Column( - modifier = Modifier.padding(14.dp), + modifier = Modifier.padding(horizontal = 12.dp), verticalArrangement = Arrangement.spacedBy(0.dp) ) { - Text( - modifier = Modifier.alpha(if (enabled) 1f else 0.38f), - text = title, - style = MaterialTheme.typography.titleMedium, - color = MaterialTheme.colorScheme.onSurface, - ) LabeledSlider( valueIndex = valueIndex, steps = steps, @@ -104,7 +88,6 @@ private fun LabeledSlider( Column( modifier = Modifier .fillMaxWidth() - .padding(horizontal = 12.dp) ) { Slider( value = sliderPosition, @@ -132,11 +115,11 @@ private fun LabeledSlider( Text( text = labels.getOrNull(liveIndex) ?: liveIndex.toString(), fontSize = MaterialTheme.typography.bodySmall.fontSize, - color = MaterialTheme.colorScheme.primary, + color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.weight(1f) ) Text( - text = lux?.getOrNull(liveIndex)?.toInt()?.let { "$it lux" } ?: "", + text = lux?.getOrNull(liveIndex)?.toInt()?.let { "${it.formatLux()} lx" } ?: "", fontSize = MaterialTheme.typography.bodySmall.fontSize, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.End diff --git a/app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt b/app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt new file mode 100644 index 0000000..e8097d6 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.util + +import java.text.NumberFormat +import java.util.Locale + +/** + * Extension to format lux values with locale-aware thousands separators. + * Usage: val s = 10000.formatLux() + */ +fun Int.formatLux(): String { + val nf = NumberFormat.getIntegerInstance(Locale.getDefault()) + return nf.format(this) +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 911d0a3..320e47f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,7 +14,7 @@ Brightness Threshold Missing permission Background Activity - + Current Brightness Dark Room Dim Room From 508c955b325c8275a96162380681b1b656ec79a2 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 18:13:45 +0100 Subject: [PATCH 23/75] fix(util): Use SENSOR_DELAY_FASTEST to reduce theme switching delay --- app/src/main/java/dev/lexip/hecate/util/LightSensorManager.kt | 4 ++-- .../main/java/dev/lexip/hecate/util/ProximitySensorManager.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/util/LightSensorManager.kt b/app/src/main/java/dev/lexip/hecate/util/LightSensorManager.kt index 89072d4..7b05dfa 100644 --- a/app/src/main/java/dev/lexip/hecate/util/LightSensorManager.kt +++ b/app/src/main/java/dev/lexip/hecate/util/LightSensorManager.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 xLexip + * Copyright (C) 2024-2025 xLexip * * Licensed under the GNU General Public License, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ class LightSensorManager(private val context: Context) : SensorEventListener { fun startListening(callback: (Float) -> Unit) { this.callback = callback lightSensor?.let { - sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL) + sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_FASTEST) } } diff --git a/app/src/main/java/dev/lexip/hecate/util/ProximitySensorManager.kt b/app/src/main/java/dev/lexip/hecate/util/ProximitySensorManager.kt index b569f0d..68cf2d7 100644 --- a/app/src/main/java/dev/lexip/hecate/util/ProximitySensorManager.kt +++ b/app/src/main/java/dev/lexip/hecate/util/ProximitySensorManager.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 xLexip + * Copyright (C) 2024-2025 xLexip * * Licensed under the GNU General Public License, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ class ProximitySensorManager(private val context: Context) : SensorEventListener fun startListening(callback: (Float) -> Unit) { this.callback = callback proximitySensor?.let { - sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_NORMAL) + sensorManager.registerListener(this, it, SensorManager.SENSOR_DELAY_FASTEST) } } From dea15cde7d50a8e98f40f074f3603a3540425680 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 18:13:45 +0100 Subject: [PATCH 24/75] refactor(data): Use a perfect logarithmic scale for brightness steps * and use location-independent labels and strings --- .../java/dev/lexip/hecate/data/AdaptiveThreshold.kt | 12 ++++++------ app/src/main/res/values/strings.xml | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt b/app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt index 639ba93..bea10f2 100644 --- a/app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt +++ b/app/src/main/java/dev/lexip/hecate/data/AdaptiveThreshold.kt @@ -15,11 +15,11 @@ package dev.lexip.hecate.data import dev.lexip.hecate.R enum class AdaptiveThreshold(val labelRes: Int, val lux: Float) { - DARK_ROOM(R.string.adaptive_threshold_dark_room, 5f), - DIM_ROOM(R.string.adaptive_threshold_dim_room, 50f), - INDOOR(R.string.adaptive_threshold_indoor, 150f), - BRIGHT_INDOOR(R.string.adaptive_threshold_bright_indoor, 500f), - DAYLIGHT(R.string.adaptive_threshold_daylight, 2_000f), + DARK(R.string.adaptive_threshold_dark, 0f), + DIM(R.string.adaptive_threshold_dim, 1f), + SOFT(R.string.adaptive_threshold_soft, 10f), + BRIGHT(R.string.adaptive_threshold_bright, 100f), + DAYLIGHT(R.string.adaptive_threshold_daylight, 1_000f), SUNLIGHT(R.string.adaptive_threshold_sunlight, 10_000f); companion object { @@ -31,7 +31,7 @@ enum class AdaptiveThreshold(val labelRes: Int, val lux: Float) { fun fromLux(lux: Float): AdaptiveThreshold { val exact = entries.firstOrNull { it.lux == lux } if (exact != null) return exact - return entries.minByOrNull { kotlin.math.abs(it.lux - lux) } ?: INDOOR + return entries.minByOrNull { kotlin.math.abs(it.lux - lux) } ?: SOFT } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 320e47f..acd0884 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,7 +6,7 @@ Disable notification Use Adaptive Theme - Adaptive Theme automatically adjusts the device theme based on ambient brightness.\nIt enhances visibility in bright conditions while optimizing battery life in darker ones. + Automatically switches between light and dark mode based on ambient brightness to improve visibility and help save battery. Changes only occur right after the screen turns on and when the device is uncovered. This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from app settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s Adaptive theme is active @@ -15,11 +15,11 @@ Missing permission Background Activity Current Brightness - - Dark Room - Dim Room - Indoor - Bright Indoor + + Dark + Dim + Soft + Bright Daylight Sunlight \ No newline at end of file From b0f7f718875a780d596bcb78dc9725bb556b094e Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 18:13:46 +0100 Subject: [PATCH 25/75] feat(broadcasts): Implement a 10% hyteresis ratio to avoid rapid toggles --- .../lexip/hecate/broadcasts/ScreenOnReceiver.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt b/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt index 47583ff..51e43df 100644 --- a/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt +++ b/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt @@ -19,8 +19,10 @@ import android.util.Log import dev.lexip.hecate.util.DarkThemeHandler import dev.lexip.hecate.util.LightSensorManager import dev.lexip.hecate.util.ProximitySensorManager +import kotlin.math.max private const val TAG = "ScreenOnReceiver" +private const val HYSTERESIS_RATIO = 0.10f // 10% /** * Adaptive theme switching logic. Executes when the screen is turned on. @@ -45,7 +47,19 @@ class ScreenOnReceiver( if (distance >= 5f) { lightSensorManager.startListening { lightValue -> lightSensorManager.stopListening() - darkThemeHandler.setDarkTheme(lightValue < adaptiveThemeThresholdLux) + + // Hysteresis around the configured threshold to avoid rapid toggles + val threshold = adaptiveThemeThresholdLux + val clampedThreshold = max(0f, threshold) + val lower = clampedThreshold * (1f - HYSTERESIS_RATIO) + val upper = clampedThreshold * (1f + HYSTERESIS_RATIO) + val isCurrentlyDark = darkThemeHandler.isDarkThemeEnabled() + + val shouldBeDark = + if (isCurrentlyDark) lightValue <= upper + else lightValue < lower + + darkThemeHandler.setDarkTheme(shouldBeDark) } } else Log.d(TAG, "Device is covered, skipping adaptive theme checks.") From 7dc0df1e1ea5eac305010f6286fec2b9f605d932 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 19:28:07 +0100 Subject: [PATCH 26/75] style: Bundle Nunito font to match system settings design --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 2 +- .../ui/components/MainSwitchPreferenceCard.kt | 2 + .../java/dev/lexip/hecate/ui/theme/Theme.kt | 52 ++++++++-- app/src/main/res/font/nunito_black.ttf | Bin 0 -> 132028 bytes app/src/main/res/font/nunito_bold.ttf | Bin 0 -> 132148 bytes app/src/main/res/font/nunito_extrabold.ttf | Bin 0 -> 132068 bytes app/src/main/res/font/nunito_italic.ttf | Bin 0 -> 135528 bytes app/src/main/res/font/nunito_light.ttf | Bin 0 -> 132216 bytes app/src/main/res/font/nunito_medium.ttf | Bin 0 -> 132300 bytes app/src/main/res/font/nunito_regular.ttf | Bin 0 -> 132200 bytes app/src/main/res/font/nunito_semibold.ttf | Bin 0 -> 132152 bytes app/src/main/res/raw/nunito_ofl.txt | 93 ++++++++++++++++++ 12 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/font/nunito_black.ttf create mode 100644 app/src/main/res/font/nunito_bold.ttf create mode 100644 app/src/main/res/font/nunito_extrabold.ttf create mode 100644 app/src/main/res/font/nunito_italic.ttf create mode 100644 app/src/main/res/font/nunito_light.ttf create mode 100644 app/src/main/res/font/nunito_medium.ttf create mode 100644 app/src/main/res/font/nunito_regular.ttf create mode 100644 app/src/main/res/font/nunito_semibold.ttf create mode 100644 app/src/main/res/raw/nunito_ofl.txt diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 04a5d46..898a6cc 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -126,7 +126,7 @@ fun AdaptiveThemeScreen( Text( modifier = Modifier.padding(horizontal = horizontalOffsetPadding), text = stringResource(id = R.string.description_adaptive_theme), - style = MaterialTheme.typography.bodyLarge.copy(lineHeight = 22.sp) + style = MaterialTheme.typography.bodyLarge.copy(lineHeight = 21.sp) ) MainSwitchPreferenceCard( text = stringResource(id = R.string.action_use_adaptive_theme), diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt index 0de61b4..8613e7b 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt @@ -32,6 +32,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp @Composable fun MainSwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { @@ -51,6 +52,7 @@ fun MainSwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: ) { Text( style = MaterialTheme.typography.titleMedium, + fontSize = 16.sp, color = MaterialTheme.colorScheme.onPrimaryContainer, text = text ) diff --git a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt index 12abbfb..b8b72bd 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt @@ -13,18 +13,23 @@ package dev.lexip.hecate.ui.theme import android.content.Context -import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TopAppBarColors import androidx.compose.material3.TopAppBarDefaults -import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.Typography import androidx.compose.material3.dynamicDarkColorScheme import androidx.compose.material3.dynamicLightColorScheme -import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp +import dev.lexip.hecate.R @Composable fun HecateTheme( @@ -33,14 +38,47 @@ fun HecateTheme( content: @Composable () -> Unit ) { val colorScheme = when { - Build.VERSION.SDK_INT >= 31 && darkTheme -> dynamicDarkColorScheme(context) - Build.VERSION.SDK_INT >= 31 -> dynamicLightColorScheme(context) - darkTheme -> darkColorScheme() - else -> lightColorScheme() + darkTheme -> dynamicDarkColorScheme(context) + else -> dynamicLightColorScheme(context) } + // Bundle Nunito Font to match system settings design + val nunitoFontFamily = FontFamily( + Font(R.font.nunito_black, weight = FontWeight.Black), + Font(R.font.nunito_extrabold, weight = FontWeight.ExtraBold), + Font(R.font.nunito_bold, weight = FontWeight.Bold), + Font(R.font.nunito_semibold, weight = FontWeight.SemiBold), + Font(R.font.nunito_medium, weight = FontWeight.Medium), + Font(R.font.nunito_regular, weight = FontWeight.Normal), + Font(R.font.nunito_light, weight = FontWeight.Light), + Font(R.font.nunito_italic, weight = FontWeight.Normal, style = FontStyle.Italic) + ) + + val appTypography = Typography( + displaySmall = TextStyle( + fontFamily = nunitoFontFamily, + fontWeight = FontWeight.Black, + fontSize = 36.sp + ), + titleMedium = TextStyle( + fontFamily = nunitoFontFamily, + fontWeight = FontWeight.Bold, + fontSize = 16.sp + ), + bodyLarge = TextStyle( + fontFamily = nunitoFontFamily, + fontSize = 17.sp + ), + bodySmall = TextStyle( + fontFamily = nunitoFontFamily, + fontWeight = FontWeight.SemiBold, + fontSize = 12.sp + ) + ) + MaterialTheme( colorScheme = colorScheme, + typography = appTypography, content = content ) } diff --git a/app/src/main/res/font/nunito_black.ttf b/app/src/main/res/font/nunito_black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..99491f840fc899e6c6f1b645195701a615c7a1a5 GIT binary patch literal 132028 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/nunito_medium.ttf b/app/src/main/res/font/nunito_medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a6993ebb18dfb1007cb5112512c23de183dc63d6 GIT binary patch literal 132300 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ⓈKfr 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

$K&CE$0=xXzV#iX zlbvgsXHvd3Q#@wsFZXypYhk__%G5I4b zCO`V0Sxo+z?#@^ilT7zn7Lz|ZKI=68hZYn6hH8t+AIW0UnS#XxuBWhX3^~`jQcV@} z4ERx#AUeJ&+|Rrqw)S1Nm{?nF*<$i(IMn>3%{6UJ^+v1~UKdEcf`7QBrrmxaAw{(! zbq|n%Bo;tgIH`LOnq4{u^-X|(=nQNnKl;mUB`@p>I>%PBh$Me6)mFk_WO5{ICDn3^ z$Hq;y&#~HXm4qX+YytQE=ZknCgv%>75%?IteIEE|g;_WwDf2J0mAo*@mIXg}%vQw} zNpw4qTl9UxQIbI|TZyGbyc)I=PKB{VXojT(N(b4+jtFr`$3IwIIxhZs(lM+hLcDCy zSlwD87>>8FStDyn6%DuLT}w&MCg-pTU?UmvxE142#eE=LZW~FClGkoqxhG)%h~4gL zR+uVUy(~%ZD*HiTE%70zo_zp(KRG~{GGSRu-U-?GsPOPhvzBNPSWCPipR73ruO!!p zTDq{m6#hR0ej}nO#FYf6%kR?=YEWAfjv|+|mm+hPMj>f#Da*YJRamLEAZ54UV47*V zCtPktf6Y!2R3hwM<8pyy^VbAT*(FN1_%yH6dmTM^rJG@mW;*Q_{=dMbA1Yf*m;!DY zOTb>3Ggso@z*zF&;64e=T9m-7M+^B;Kkp6l|HT>d^qMu(vcb8_yxL8x>`UNPy~3wo z$Xb%{Xu&E20{?8vvX%hJL4~X(5tGhAI`}(ad7h!Hl4LC*@3^ftx!c<6TXe(@hB71k z9qCZG1xe6ly=9_E5DaqTj?Z(iVH&WtQtb%e`zh$0Lq&K)<;D?JkDLJrjmBS;9A_L~ z;$7@7n9gj4xxN;u;YnE@p{q~gP-2$c|DS^Q*bF0&?2>2cUmX9<|Bl8wMR6h{sQS%R z6Pf2cAM@h0B?OKbmku?0Ldd`7ZHO=aC=?HP-AW`l)y(}SKSTGXG}XMQ=h0q~>u`LJ zyOL>YWyoQ1%YKr)WZX$)#^yS78LGaFDi%xYU@QM1Y~`@oLDNFND{bXO-O9G|xA`UB zhZ=|ZR7wpei1PcPCUw_EawxDBO1OEMU#Cc=eh~Xq9KLo%>gmTKO~%RBPBRf?ew~Vr zgbhg!BXaC0s-STQ6$}J!glFd!KC&jBaD2~k7Z;{+Tx5;I%5-rBrMmkC=*{tT#S9BGWz=W@uc>lP$Gy%=taHsrI`3-B*lw)j^xfV%3k&A%8_&tN?* zVm-mpvruGwplU^BYulm)4XY}IBBjjcp|^bKZ!U0%W*GzbC6GRUYMjj;FHg=HwW;>gEwyB$5&A+^ukz zEdquEe2lw}e-1GGo899vv?JRd$|_3p?X&!v!RWGIlZ_?M-N!$Tc7EYlvN2N2Z54ue z^Y4!D+ZdVQzQ+F$Z+^u=e`k0+$=%JrA8&q(eaCQuI(D5718<&lJYjuqGY1AJiloHNNIc1ml32~3=R3Ie z7qaI*_mb?n7|E)6@$lZx*n`-`H!#@m;_EpMJ;E-FJhvcYr5^H|VFyu|E_2ZRINQ*W zm2pCs4iy9>m2dLm>;OWaf_@Y-aKZZ-ccZS3wIBb0_6}I>jk&G%u#|~zqiw4_PM0(( zNc$~_8)TBlk#hVsnyOKi8W%Mcbb3p*S;{B*y~ST4OZ(?ZGO%nQ#Bf8#pJWw#73a2; zH=*#un<)S4_xKH5OvtYOCBH$F?*b*hi}DBG1s1^xEEe>9WBv&&qLndYvV+>=Sb4JeT7-zXbSq`Ye6KF8ot<8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/font/nunito_regular.ttf b/app/src/main/res/font/nunito_regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..be80c3f04dd43c91a0b6bba392a9a34b7409842a GIT binary patch literal 132200 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 Date: Fri, 5 Dec 2025 08:37:55 +0100 Subject: [PATCH 27/75] feat(ui): Implement quick settings tile #36 * Taps toggle the service * Long Press open the app * Unavailable if the permission is missing (WRITE_SECURE_SETTINGS) --- app/src/main/AndroidManifest.xml | 29 +++++- .../hecate/data/UserPreferencesRepository.kt | 2 +- .../services/QuickSettingsTileService.kt | 97 +++++++++++++++++++ .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 2 +- app/src/main/res/drawable/ic_qs_app.xml | 9 ++ 5 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt create mode 100644 app/src/main/res/drawable/ic_qs_app.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c8d6c8e..80b8c67 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,12 +42,12 @@ + + + + - - @@ -56,6 +56,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt index be80761..8bcf25c 100644 --- a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt +++ b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt @@ -56,7 +56,7 @@ class UserPreferencesRepository(private val dataStore: DataStore) { mapUserPreferences(dataStore.data.first().toPreferences()) - suspend fun ensureAdaptiveThemeThresholdDefault(default: Float) { + suspend fun ensureAdaptiveThemeThresholdDefault(default: Float = AdaptiveThreshold.BRIGHT.lux) { dataStore.edit { preferences -> if (preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] == null) { preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] = default diff --git a/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt b/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt new file mode 100644 index 0000000..d9ea2f5 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.services + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.service.quicksettings.Tile +import android.service.quicksettings.TileService +import dev.lexip.hecate.HecateApplication +import dev.lexip.hecate.data.UserPreferencesRepository +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.launch + +private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) + +class QuickSettingsTileService : TileService() { + + private fun hasWriteSecureSettingsPermission(): Boolean { + return packageManager.checkPermission( + Manifest.permission.WRITE_SECURE_SETTINGS, + packageName + ) == PackageManager.PERMISSION_GRANTED + } + + override fun onStartListening() { + super.onStartListening() + val tile = qsTile ?: return + + // No permission => tile unavailable + if (!hasWriteSecureSettingsPermission()) { + tile.state = Tile.STATE_UNAVAILABLE + tile.updateTile() + return + } + + // Load user preference and set tile state + val dataStore = (applicationContext as HecateApplication).userPreferencesDataStore + val repo = UserPreferencesRepository(dataStore) + + serviceScope.launch { + val prefs = repo.fetchInitialPreferences() + tile.state = if (prefs.adaptiveThemeEnabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE + tile.updateTile() + } + } + + override fun onClick() { + super.onClick() + val tile = qsTile ?: return + + // No permission => tile unavailable + if (!hasWriteSecureSettingsPermission()) { + tile.state = Tile.STATE_UNAVAILABLE + tile.updateTile() + return + } + + val dataStore = (applicationContext as HecateApplication).userPreferencesDataStore + val repo = UserPreferencesRepository(dataStore) + + // Toggle adaptive theme + serviceScope.launch { + val prefs = repo.fetchInitialPreferences() + val newEnabled = !prefs.adaptiveThemeEnabled + + repo.updateAdaptiveThemeEnabled(newEnabled) + + // Start/stop the service + val intent = Intent(applicationContext, BroadcastReceiverService::class.java) + if (newEnabled) { + repo.ensureAdaptiveThemeThresholdDefault() + applicationContext.startService(intent) + } else { + applicationContext.stopService(intent) + } + + // Update tile UI + tile.state = if (newEnabled) Tile.STATE_ACTIVE else Tile.STATE_INACTIVE + tile.updateTile() + } + } + +} + diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index 8bdbeaf..1ed9754 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -146,7 +146,7 @@ class AdaptiveThemeViewModel( userPreferencesRepository.updateAdaptiveThemeEnabled(enable) if (enable) { startBroadcastReceiverService() - userPreferencesRepository.ensureAdaptiveThemeThresholdDefault(AdaptiveThreshold.BRIGHT.lux) + userPreferencesRepository.ensureAdaptiveThemeThresholdDefault() } else stopBroadcastReceiverService() } } diff --git a/app/src/main/res/drawable/ic_qs_app.xml b/app/src/main/res/drawable/ic_qs_app.xml new file mode 100644 index 0000000..d1e86c7 --- /dev/null +++ b/app/src/main/res/drawable/ic_qs_app.xml @@ -0,0 +1,9 @@ + + + From 3464565dc9f0c160b442b64804551f5fbbb5fcc9 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:00:40 +0100 Subject: [PATCH 28/75] chore(test): Remove example tests --- .../lexip/hecate/ExampleInstrumentedTest.kt | 22 ------------------- .../java/dev/lexip/hecate/ExampleUnitTest.kt | 16 -------------- 2 files changed, 38 deletions(-) delete mode 100644 app/src/androidTest/java/dev/lexip/hecate/ExampleInstrumentedTest.kt delete mode 100644 app/src/test/java/dev/lexip/hecate/ExampleUnitTest.kt diff --git a/app/src/androidTest/java/dev/lexip/hecate/ExampleInstrumentedTest.kt b/app/src/androidTest/java/dev/lexip/hecate/ExampleInstrumentedTest.kt deleted file mode 100644 index afba040..0000000 --- a/app/src/androidTest/java/dev/lexip/hecate/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package dev.lexip.hecate - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert.* -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("dev.lexip.hecate", appContext.packageName) - } -} \ No newline at end of file diff --git a/app/src/test/java/dev/lexip/hecate/ExampleUnitTest.kt b/app/src/test/java/dev/lexip/hecate/ExampleUnitTest.kt deleted file mode 100644 index 0f57358..0000000 --- a/app/src/test/java/dev/lexip/hecate/ExampleUnitTest.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.lexip.hecate - -import org.junit.Assert.* -import org.junit.Test - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file From 72ffd3977e12253e51f9620a0a6e8bf326b43ce6 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:00:40 +0100 Subject: [PATCH 29/75] chore(mainfest): Add special use FGS justification * https://developer.android.com/develop/background-work/services/fgs/service-types#special-use --- app/src/main/AndroidManifest.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 80b8c67..df4c97f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -58,7 +58,11 @@ + android:foregroundServiceType="specialUse"> + + Date: Fri, 5 Dec 2025 20:00:40 +0100 Subject: [PATCH 30/75] build: Set app version to v0.2.0 * Play Store Alpha Testing --- app/build.gradle.kts | 4 ++-- build.gradle.kts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f3e5bcb..42ab136 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,8 +16,8 @@ android { applicationId = "dev.lexip.hecate" minSdk = 31 targetSdk = 36 - versionCode = 1 - versionName = "0.1.0" + versionCode = 3 + versionName = "0.2.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/build.gradle.kts b/build.gradle.kts index 1765e31..e76ce15 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { sonar { properties { property("sonar.projectKey", "xLexip_Hecate") - property("sonar.projectVersion", "0.1.0") + property("sonar.projectVersion", "0.2.0") property("sonar.organization", "xlexip") property("sonar.host.url", "https://sonarcloud.io") property("sonar.androidLint.reportPaths", "app/build/reports/lint-results-debug.html") From 2c32e2cd53df7181d788ba53fd19fc8aa4c4f925 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:00:41 +0100 Subject: [PATCH 31/75] refactor: Refine service notification * Fix icon * Add description * Add service disable action to the notification --- app/src/main/AndroidManifest.xml | 2 +- .../services/BroadcastReceiverService.kt | 71 ++++++++++++++++--- .../drawable/{ic_qs_app.xml => ic_app.xml} | 0 app/src/main/res/values/strings.xml | 6 +- 4 files changed, 66 insertions(+), 13 deletions(-) rename app/src/main/res/drawable/{ic_qs_app.xml => ic_app.xml} (100%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index df4c97f..e044fba 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -68,7 +68,7 @@ android:name=".services.QuickSettingsTileService" android:exported="true" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE" - android:icon="@drawable/ic_qs_app"> + android:icon="@drawable/ic_app"> diff --git a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt index 6b21e5c..200be56 100644 --- a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt +++ b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt @@ -37,6 +37,7 @@ import kotlinx.coroutines.launch private const val TAG = "BroadcastReceiverService" private const val NOTIFICATION_CHANNEL_ID = "ForegroundServiceChannel" +private const val ACTION_STOP_SERVICE = "dev.lexip.hecate.action.STOP_SERVICE" private var screenOnReceiver: ScreenOnReceiver? = null @@ -51,11 +52,34 @@ class BroadcastReceiverService : Service() { override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) + + // Initialize data store + val dataStore = (this.applicationContext as HecateApplication).userPreferencesDataStore + + // Handle stop action from notification + if (intent.action == ACTION_STOP_SERVICE) { + Log.i( + TAG, + "Disable action received from notification - disabling adaptive theme and stopping service..." + ) + applicationScope.launch { + try { + val userPreferencesRepository = UserPreferencesRepository(dataStore) + userPreferencesRepository.updateAdaptiveThemeEnabled(false) + Log.i(TAG, "Adaptive theme disabled via notification action.") + } catch (e: Exception) { + Log.e(TAG, "Failed to update adaptive theme preference", e) + } + stopForeground(STOP_FOREGROUND_REMOVE) + stopSelf() + } + return START_NOT_STICKY + } + Log.i(TAG, "Service starting...") initializeUtils() // Load user preferences from data store - val dataStore = (this.applicationContext as HecateApplication).userPreferencesDataStore applicationScope.launch { val userPreferencesRepository = UserPreferencesRepository(dataStore) val userPreferences = userPreferencesRepository.fetchInitialPreferences() @@ -79,7 +103,7 @@ class BroadcastReceiverService : Service() { } } - // Collect preference updates and update the receiver's threshold while service runs + // Collect preference updates while service runs applicationScope.launch { val userPreferencesRepository = UserPreferencesRepository(dataStore) userPreferencesRepository.userPreferencesFlow.collect { prefs -> @@ -118,23 +142,52 @@ class BroadcastReceiverService : Service() { pendingIntent ).build() + // Create action to stop the service + val stopIntent = Intent(this, BroadcastReceiverService::class.java).apply { + action = ACTION_STOP_SERVICE + } + val stopPendingIntent = PendingIntent.getService( + this, + 0, + stopIntent, + PendingIntent.FLAG_IMMUTABLE + ) + val stopAction = NotificationCompat.Action.Builder( + 0, + getString(R.string.action_stop_service), + stopPendingIntent + ).build() + // Build notification - return NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) - .setContentTitle(getString(R.string.message_notification_service_running)) + val builder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.app_name)) + .setContentText(getString(R.string.description_notification_service_running)) .setCategory(Notification.CATEGORY_SERVICE) - .setSmallIcon(R.drawable.ic_launcher_foreground) + .setSmallIcon(R.drawable.ic_app) + .setOnlyAlertOnce(true) .setContentIntent(pendingIntent) .addAction(disableAction) - .build() + .addAction(stopAction) + .setOngoing(true) + .setPriority(NotificationCompat.PRIORITY_MIN) + + + val notification = builder.build() + notification.flags = + notification.flags or Notification.FLAG_ONGOING_EVENT or Notification.FLAG_NO_CLEAR or Notification.FLAG_FOREGROUND_SERVICE + + return notification } private fun createNotificationChannel() { val serviceChannel = NotificationChannel( - "ForegroundServiceChannel", + NOTIFICATION_CHANNEL_ID, getString(R.string.title_notification_channel_service), - NotificationManager.IMPORTANCE_DEFAULT, + NotificationManager.IMPORTANCE_MIN + ) + + serviceChannel.setSound(null, null) // Silent - ) val manager = getSystemService(NotificationManager::class.java) manager?.createNotificationChannel(serviceChannel) } diff --git a/app/src/main/res/drawable/ic_qs_app.xml b/app/src/main/res/drawable/ic_app.xml similarity index 100% rename from app/src/main/res/drawable/ic_qs_app.xml rename to app/src/main/res/drawable/ic_app.xml diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index acd0884..df1fda5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,13 +3,13 @@ Close Copy ADB Command - Disable notification + Hide notification Use Adaptive Theme + Disable service Automatically switches between light and dark mode based on ambient brightness to improve visibility and help save battery. Changes only occur right after the screen turns on and when the device is uncovered. This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from app settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s - - Adaptive theme is active + Auto-switching the device theme based on ambient brightness. Brightness Threshold Missing permission From 5412c9f924bbc140a791a6dfcbb322c103299134 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:00:41 +0100 Subject: [PATCH 32/75] build: Enable optimized resource shrinking & NDK debug symbols --- app/build.gradle.kts | 3 +++ gradle.properties | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 42ab136..910159c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -29,6 +29,9 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) + ndk { + debugSymbolLevel = "SYMBOL_TABLE" + } } } compileOptions { diff --git a/gradle.properties b/gradle.properties index 20e2a01..36d0b3e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,4 +20,6 @@ kotlin.code.style=official # Enables namespacing of each library's R class so that its R class includes only the # resources declared in the library itself and none from the library's dependencies, # thereby reducing the size of the R class for that library -android.nonTransitiveRClass=true \ No newline at end of file +android.nonTransitiveRClass=true +# Enable optimized resource shrinking +android.r8.optimizedResourceShrinking=true From 3d9825b44869cac17b41bf6614f5fb9ce2f189e4 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:03:00 +0100 Subject: [PATCH 33/75] style: Update launcher icon colors --- app/src/main/ic_launcher-playstore.png | Bin 19545 -> 19566 bytes .../res/drawable/ic_launcher_foreground.xml | 6 +++--- .../res/values/ic_launcher_background.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png index 927095707e711f919a1bfbe0aeeb6719b16ca508..c5cae40a1cf3bc1af051bafbc509daae4cbfbe4b 100644 GIT binary patch literal 19566 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 z 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 literal 19545 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 - + diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml index 071fcf5..1a9fc46 100644 --- a/app/src/main/res/values/ic_launcher_background.xml +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #202124 + #181920 \ No newline at end of file From 925333a8d2a3706ea92240c3fcaad47b390fa177 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 19:04:41 +0100 Subject: [PATCH 34/75] fix(manifest): Disable backup * A backup does not make sense since the WIRTE_SECURE_SETTINGS permission needs to be granted after a new installation. --- app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e044fba..4ca575f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,7 @@ Date: Fri, 5 Dec 2025 19:22:27 +0100 Subject: [PATCH 35/75] docs: Add README --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c118dbe..3222b15 100644 --- a/README.md +++ b/README.md @@ -1 +1,42 @@ -[![SonarCloud](https://sonarcloud.io/api/project_badges/quality_gate?project=xLexip_Hecate)](https://sonarcloud.io/summary/new_code?id=xLexip_Hecate) \ No newline at end of file +[![GooglePlay](https://upload.wikimedia.org/wikipedia/commons/7/78/Google_Play_Store_badge_EN.svg)](https://lexip.dev/hecate/play) + +**Adaptive Theme** automatically switches your device between light and dark mode based on ambient +brightness — bright and readable in sunlight, easy on the eyes (and battery) in the dark. + +Theme changes only happen right after the screen turns on and only when the device is uncovered to +avoid flicker and unnecessary sensor usage. + +**Package:** dev.lexip.hecate + +--- + +### Highlights + +- Smart automatic light/dark theme switching +- Customizable brightness threshold +- Quick Settings tile for quick service toggling +- Lightweight and battery-friendly +- System-wide theme control +- No root required +- Modern Jetpack Compose app with native Material You design +- Only switches when the device is uncovered + +--- + +### One-time setup + +To change the system theme, the app needs the WRITE_SECURE_SETTINGS permission. Because this is a +system-level permission, you have to grant it via ADB: + +- Enable developer options and USB debugging on your phone. +- Connect your phone to a computer with ADB installed. +- Run this command: + *adb shell pm grant dev.lexip.hecate android.permission.WRITE_SECURE_SETTINGS* + +The app doesn’t need any special access beyond this permission. It is used only for theme switching. + +--- + +That’s it — open the app, set your threshold, and you’re done. + +[![SonarCloud](https://sonarcloud.io/api/project_badges/quality_gate?project=xLexip_Hecate)](https://sonarcloud.io/summary/new_code?id=xLexip_Hecate) From ffb54a74ac3fb820272ab2c8fe2e8e2f5753f62b Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 19:27:45 +0100 Subject: [PATCH 36/75] chore(analytics): Integrate firebase analytics #48 --- app/build.gradle.kts | 2 +- .../lexip/hecate/analytics/AnalyticsLogger.kt | 60 +++++++++++++++++++ .../services/BroadcastReceiverService.kt | 5 ++ .../services/QuickSettingsTileService.kt | 15 ++++- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 27 ++++++++- gradle/libs.versions.toml | 6 +- 6 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 910159c..f6cce19 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -58,8 +58,8 @@ android { dependencies { implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.analytics) implementation(libs.firebase.crashlytics) - implementation(libs.androidx.localbroadcastmanager) implementation(libs.androidx.core.splashscreen.v100) implementation(libs.androidx.activity.compose) diff --git a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt new file mode 100644 index 0000000..bee622f --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.analytics + +import android.content.Context +import com.google.firebase.analytics.FirebaseAnalytics +import com.google.firebase.analytics.logEvent + +object AnalyticsLogger { + + private fun analytics(context: Context): FirebaseAnalytics = + FirebaseAnalytics.getInstance(context) + + fun logPermissionErrorShown(context: Context, reason: String, attemptedAction: String) { + analytics(context).logEvent("permission_error_shown") { + param("reason", reason) + param("attempted_action", attemptedAction) + } + } + + fun logServiceEnabled(context: Context, source: String) { + analytics(context).logEvent("adaptive_service_enabled") { + param("source", source) + } + } + + fun logServiceDisabled(context: Context, source: String) { + analytics(context).logEvent("adaptive_service_disabled") { + param("source", source) + } + } + + fun logBrightnessThresholdChanged( + context: Context, + oldLux: Float, + newLux: Float + ) { + if (oldLux == newLux) return + analytics(context).logEvent("brightness_threshold_changed") { + param("old_lux", oldLux.toLong()) + param("new_lux", newLux.toLong()) + } + } + + fun logQuickSettingsTileAdded(context: Context, active: Boolean) { + analytics(context).logEvent("qs_tile_added") { + param("active", if (active) 1L else 0L) + } + } +} diff --git a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt index 200be56..9bdb8a6 100644 --- a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt +++ b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt @@ -25,6 +25,7 @@ import android.util.Log import androidx.core.app.NotificationCompat import dev.lexip.hecate.HecateApplication import dev.lexip.hecate.R +import dev.lexip.hecate.analytics.AnalyticsLogger import dev.lexip.hecate.broadcasts.ScreenOnReceiver import dev.lexip.hecate.data.UserPreferencesRepository import dev.lexip.hecate.util.DarkThemeHandler @@ -67,6 +68,10 @@ class BroadcastReceiverService : Service() { val userPreferencesRepository = UserPreferencesRepository(dataStore) userPreferencesRepository.updateAdaptiveThemeEnabled(false) Log.i(TAG, "Adaptive theme disabled via notification action.") + AnalyticsLogger.logServiceDisabled( + applicationContext, + source = "notification_action" + ) } catch (e: Exception) { Log.e(TAG, "Failed to update adaptive theme preference", e) } diff --git a/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt b/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt index d9ea2f5..748e08f 100644 --- a/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt +++ b/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt @@ -18,6 +18,7 @@ import android.content.pm.PackageManager import android.service.quicksettings.Tile import android.service.quicksettings.TileService import dev.lexip.hecate.HecateApplication +import dev.lexip.hecate.analytics.AnalyticsLogger import dev.lexip.hecate.data.UserPreferencesRepository import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -35,6 +36,11 @@ class QuickSettingsTileService : TileService() { ) == PackageManager.PERMISSION_GRANTED } + override fun onTileAdded() { + super.onTileAdded() + AnalyticsLogger.logQuickSettingsTileAdded(applicationContext) + } + override fun onStartListening() { super.onStartListening() val tile = qsTile ?: return @@ -83,8 +89,16 @@ class QuickSettingsTileService : TileService() { if (newEnabled) { repo.ensureAdaptiveThemeThresholdDefault() applicationContext.startService(intent) + AnalyticsLogger.logServiceEnabled( + applicationContext, + source = "quick_settings_tile" + ) } else { applicationContext.stopService(intent) + AnalyticsLogger.logServiceDisabled( + applicationContext, + source = "quick_settings_tile" + ) } // Update tile UI @@ -94,4 +108,3 @@ class QuickSettingsTileService : TileService() { } } - diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index 1ed9754..3c19ef9 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -17,6 +17,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import dev.lexip.hecate.HecateApplication +import dev.lexip.hecate.analytics.AnalyticsLogger import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.data.UserPreferencesRepository import dev.lexip.hecate.services.BroadcastReceiverService @@ -123,6 +124,12 @@ class AdaptiveThemeViewModel( _pendingAdbCommand.value = "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" _showMissingPermissionDialog.value = true + // Log permission error shown + AnalyticsLogger.logPermissionErrorShown( + application.applicationContext, + reason = "missing_write_secure_settings", + attemptedAction = "enable_adaptive_theme" + ) return false } _showMissingPermissionDialog.value = false @@ -142,19 +149,37 @@ class AdaptiveThemeViewModel( } private fun updateAdaptiveThemeEnabled(enable: Boolean) { + val wasEnabled = _uiState.value.adaptiveThemeEnabled viewModelScope.launch { userPreferencesRepository.updateAdaptiveThemeEnabled(enable) if (enable) { startBroadcastReceiverService() userPreferencesRepository.ensureAdaptiveThemeThresholdDefault() - } else stopBroadcastReceiverService() + AnalyticsLogger.logServiceEnabled( + application.applicationContext, + source = if (wasEnabled) "state_restore" else "ui_toggle" + ) + } else { + stopBroadcastReceiverService() + AnalyticsLogger.logServiceDisabled( + application.applicationContext, + source = if (wasEnabled) "ui_toggle" else "state_restore" + ) + } } } fun updateAdaptiveThemeThresholdByIndex(index: Int) { val threshold = AdaptiveThreshold.fromIndex(index) + val oldLux = _uiState.value.adaptiveThemeThresholdLux viewModelScope.launch { userPreferencesRepository.updateAdaptiveThemeThresholdLux(threshold.lux) + // Log threshold change + AnalyticsLogger.logBrightnessThresholdChanged( + application.applicationContext, + oldLux = oldLux, + newLux = threshold.lux + ) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 753d6c7..8e6992d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,9 @@ coreSplashscreenVersion = "1.0.1" datastorePreferencesCore = "1.1.7" espressoCore = "3.7.0" firebaseBom = "34.5.0" +firebaseAnalytics = "23.0.0" +firebaseCrashlytics = "20.0.3" +googleFirebaseCrashlytics = "3.0.6" junit = "4.13.2" junitVersion = "1.3.0" kotlin = "2.2.21" @@ -16,8 +19,6 @@ lifecycleViewmodelCompose = "2.9.4" localbroadcastmanager = "1.1.0" material = "1.13.0" preference = "1.2.1" -firebaseCrashlytics = "20.0.3" -googleFirebaseCrashlytics = "3.0.6" [libraries] androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } @@ -43,6 +44,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } junit = { group = "junit", name = "junit", version.ref = "junit" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } +firebase-analytics = { group = "com.google.firebase", name = "firebase-analytics", version.ref = "firebaseAnalytics" } firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics", version.ref = "firebaseCrashlytics" } [plugins] From cc47236901ae22165ecc1338718caa7f2f1af205 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 19:56:18 +0100 Subject: [PATCH 37/75] chore(analytics): Only log events in production #48 * Implement an Analytics Gate to disable logging for alternative installation methods (= not Google Play) x --- app/build.gradle.kts | 1 + .../dev/lexip/hecate/HecateApplication.kt | 8 +++- .../lexip/hecate/analytics/AnalyticsGate.kt | 41 +++++++++++++++++++ .../lexip/hecate/analytics/AnalyticsLogger.kt | 38 +++++++++++------ 4 files changed, 74 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/analytics/AnalyticsGate.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index f6cce19..ca9a729 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -45,6 +45,7 @@ android { } buildFeatures { compose = true + buildConfig = true } buildToolsVersion = "35.0.0" sourceSets { diff --git a/app/src/main/java/dev/lexip/hecate/HecateApplication.kt b/app/src/main/java/dev/lexip/hecate/HecateApplication.kt index 9953443..6b27ccc 100644 --- a/app/src/main/java/dev/lexip/hecate/HecateApplication.kt +++ b/app/src/main/java/dev/lexip/hecate/HecateApplication.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 xLexip + * Copyright (C) 2024-2025 xLexip * * Licensed under the GNU General Public License, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ import android.content.Context import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.preferencesDataStore +import dev.lexip.hecate.analytics.AnalyticsGate const val USER_PREFERENCES_NAME = "user_preferences" private val Context.dataStore by preferencesDataStore(USER_PREFERENCES_NAME) @@ -28,4 +29,9 @@ class HecateApplication : Application() { */ val userPreferencesDataStore: DataStore get() = this.dataStore + + override fun onCreate() { + super.onCreate() + AnalyticsGate.init(this) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsGate.kt b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsGate.kt new file mode 100644 index 0000000..f79b7d4 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsGate.kt @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.analytics + +import android.content.Context +import com.google.firebase.analytics.FirebaseAnalytics + +/** + * Controls whether analytics collection is enabled. + * - App is not debuggable (release-like) + * - App is installed from Play Store + */ +object AnalyticsGate { + @Volatile + private var enabled = false + + fun init(context: Context) { + val pm = context.packageManager + val installer = try { + pm.getInstallSourceInfo(context.packageName).installingPackageName + ?: pm.getInstallSourceInfo(context.packageName).initiatingPackageName + } catch (_: Exception) { + null + } + val isGooglePlayInstall = installer == "com.android.vending" + enabled = isGooglePlayInstall + FirebaseAnalytics.getInstance(context).setAnalyticsCollectionEnabled(enabled) + } + + fun allowed(): Boolean = enabled +} diff --git a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt index bee622f..54d843e 100644 --- a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt +++ b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt @@ -21,22 +21,32 @@ object AnalyticsLogger { private fun analytics(context: Context): FirebaseAnalytics = FirebaseAnalytics.getInstance(context) + private inline fun ifAllowed(block: () -> Unit) { + if (AnalyticsGate.allowed()) block() + } + fun logPermissionErrorShown(context: Context, reason: String, attemptedAction: String) { - analytics(context).logEvent("permission_error_shown") { - param("reason", reason) - param("attempted_action", attemptedAction) + ifAllowed { + analytics(context).logEvent("permission_error_shown") { + param("reason", reason) + param("attempted_action", attemptedAction) + } } } fun logServiceEnabled(context: Context, source: String) { - analytics(context).logEvent("adaptive_service_enabled") { - param("source", source) + ifAllowed { + analytics(context).logEvent("adaptive_service_enabled") { + param("source", source) + } } } fun logServiceDisabled(context: Context, source: String) { - analytics(context).logEvent("adaptive_service_disabled") { - param("source", source) + ifAllowed { + analytics(context).logEvent("adaptive_service_disabled") { + param("source", source) + } } } @@ -46,15 +56,17 @@ object AnalyticsLogger { newLux: Float ) { if (oldLux == newLux) return - analytics(context).logEvent("brightness_threshold_changed") { - param("old_lux", oldLux.toLong()) - param("new_lux", newLux.toLong()) + ifAllowed { + analytics(context).logEvent("brightness_threshold_changed") { + param("old_lux", oldLux.toLong()) + param("new_lux", newLux.toLong()) + } } } - fun logQuickSettingsTileAdded(context: Context, active: Boolean) { - analytics(context).logEvent("qs_tile_added") { - param("active", if (active) 1L else 0L) + fun logQuickSettingsTileAdded(context: Context) { + ifAllowed { + analytics(context).logEvent("qs_tile_added") { } } } } From 920dca13b954de53ef1fcde7486add629052aac0 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 19:56:18 +0100 Subject: [PATCH 38/75] style: Minor UI/UX tweaks --- .../dev/lexip/hecate/services/BroadcastReceiverService.kt | 3 +-- .../main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 2 -- .../hecate/ui/components/MainSwitchPreferenceCard.kt | 2 -- .../hecate/ui/components/preferences/SliderDetailCard.kt | 4 ++-- app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt | 2 +- app/src/main/res/values/strings.xml | 8 ++++---- 6 files changed, 8 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt index 9bdb8a6..461742f 100644 --- a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt +++ b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt @@ -174,7 +174,6 @@ class BroadcastReceiverService : Service() { .addAction(disableAction) .addAction(stopAction) .setOngoing(true) - .setPriority(NotificationCompat.PRIORITY_MIN) val notification = builder.build() @@ -188,7 +187,7 @@ class BroadcastReceiverService : Service() { val serviceChannel = NotificationChannel( NOTIFICATION_CHANNEL_ID, getString(R.string.title_notification_channel_service), - NotificationManager.IMPORTANCE_MIN + NotificationManager.IMPORTANCE_DEFAULT ) serviceChannel.setSound(null, null) // Silent diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 898a6cc..238ee7b 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -44,7 +44,6 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalHapticFeedback 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.content.ContextCompat @@ -107,7 +106,6 @@ fun AdaptiveThemeScreen( Text( text = stringResource(id = R.string.app_name), style = MaterialTheme.typography.displaySmall, - fontWeight = FontWeight.Medium ) }, scrollBehavior = scrollBehavior diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt index 8613e7b..0de61b4 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt @@ -32,7 +32,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp @Composable fun MainSwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: (Boolean) -> Unit) { @@ -52,7 +51,6 @@ fun MainSwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: ) { Text( style = MaterialTheme.typography.titleMedium, - fontSize = 16.sp, color = MaterialTheme.colorScheme.onPrimaryContainer, text = text ) diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt index 857143f..34ed9ef 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt @@ -114,13 +114,13 @@ private fun LabeledSlider( ) { Text( text = labels.getOrNull(liveIndex) ?: liveIndex.toString(), - fontSize = MaterialTheme.typography.bodySmall.fontSize, + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.weight(1f) ) Text( text = lux?.getOrNull(liveIndex)?.toInt()?.let { "${it.formatLux()} lx" } ?: "", - fontSize = MaterialTheme.typography.bodySmall.fontSize, + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.End ) diff --git a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt index b8b72bd..02a1e32 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt @@ -57,7 +57,7 @@ fun HecateTheme( val appTypography = Typography( displaySmall = TextStyle( fontFamily = nunitoFontFamily, - fontWeight = FontWeight.Black, + fontWeight = FontWeight.Bold, fontSize = 36.sp ), titleMedium = TextStyle( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df1fda5..778befe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,16 +3,16 @@ Close Copy ADB Command - Hide notification + Hide Notification Use Adaptive Theme - Disable service + Disable Service Automatically switches between light and dark mode based on ambient brightness to improve visibility and help save battery. Changes only occur right after the screen turns on and when the device is uncovered. - This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from app settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s + This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from the device settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s Auto-switching the device theme based on ambient brightness. Brightness Threshold - Missing permission + Missing Permission Background Activity Current Brightness From 11e58a0286216dcee9f85ef4257e88dc4f3828c1 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:21:49 +0100 Subject: [PATCH 39/75] chore(analytics): Disable AdID collection for Firebase Analytics --- app/src/main/AndroidManifest.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4ca575f..7a94703 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,6 +34,11 @@ android:usesCleartextTraffic="false" android:windowSoftInputMode="adjustResize"> + + + Date: Fri, 5 Dec 2025 20:22:19 +0100 Subject: [PATCH 40/75] build: Set app version to v0.3.0 * Play Store Beta Testing * Use JVM 17 * Add beta suffix for debug builds --- .gitignore | 2 ++ app/build.gradle.kts | 17 +++++++++-------- build.gradle.kts | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 2c94f50..6adab54 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ google-services.json *.hprof app/release/* + +app/debug/ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ca9a729..eeb1a0a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,5 +1,3 @@ -import org.gradle.api.JavaVersion.VERSION_23 - plugins { id("com.google.gms.google-services") alias(libs.plugins.android.application) @@ -16,8 +14,8 @@ android { applicationId = "dev.lexip.hecate" minSdk = 31 targetSdk = 36 - versionCode = 3 - versionName = "0.2.0" + versionCode = 7 + versionName = "0.3.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -33,21 +31,24 @@ android { debugSymbolLevel = "SYMBOL_TABLE" } } + debug { + versionNameSuffix = "-beta" + } } compileOptions { - sourceCompatibility = VERSION_23 - targetCompatibility = VERSION_23 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlin { compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_23) + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } } buildFeatures { compose = true buildConfig = true } - buildToolsVersion = "35.0.0" + buildToolsVersion = "36.0.0" sourceSets { getByName("main") { resources { diff --git a/build.gradle.kts b/build.gradle.kts index e76ce15..7422ee5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { sonar { properties { property("sonar.projectKey", "xLexip_Hecate") - property("sonar.projectVersion", "0.2.0") + property("sonar.projectVersion", "0.3.0") property("sonar.organization", "xlexip") property("sonar.host.url", "https://sonarcloud.io") property("sonar.androidLint.reportPaths", "app/build/reports/lint-results-debug.html") From 4a87c9a9fa036991d56e1c72d7f4803e483fd40e Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:34:24 +0100 Subject: [PATCH 41/75] fix: Increase service robustness * Fixes NPE in BroadcastReceiverService.onStartCommand. * Accept Intent? in onStartCommand to prevent NPE. * Start foreground immediately to meet Android requirements. * Switch callers to startForegroundService to comply with background limits. * And other small improvements. --- app/build.gradle.kts | 4 +- .../broadcasts/BootCompletedReceiver.kt | 5 +- .../services/BroadcastReceiverService.kt | 46 ++++++++++++------- .../services/QuickSettingsTileService.kt | 3 +- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 3 +- build.gradle.kts | 2 +- 6 files changed, 40 insertions(+), 23 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index eeb1a0a..29f005d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,8 @@ android { applicationId = "dev.lexip.hecate" minSdk = 31 targetSdk = 36 - versionCode = 7 - versionName = "0.3.0" + versionCode = 8 + versionName = "0.3.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/dev/lexip/hecate/broadcasts/BootCompletedReceiver.kt b/app/src/main/java/dev/lexip/hecate/broadcasts/BootCompletedReceiver.kt index 2862e8c..8731c21 100644 --- a/app/src/main/java/dev/lexip/hecate/broadcasts/BootCompletedReceiver.kt +++ b/app/src/main/java/dev/lexip/hecate/broadcasts/BootCompletedReceiver.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 xLexip + * Copyright (C) 2024-2025 xLexip * * Licensed under the GNU General Public License, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.util.Log +import androidx.core.content.ContextCompat import dev.lexip.hecate.services.BroadcastReceiverService private const val TAG = "BootCompletedReceiver" @@ -26,7 +27,7 @@ class BootCompletedReceiver : BroadcastReceiver() { if (intent.action == Intent.ACTION_BOOT_COMPLETED) { Log.i(TAG, "Boot completed, starting broadcast receiver service...") val serviceIntent = Intent(context, BroadcastReceiverService::class.java) - context.startService(serviceIntent) + ContextCompat.startForegroundService(context, serviceIntent) } } diff --git a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt index 461742f..5438d9f 100644 --- a/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt +++ b/app/src/main/java/dev/lexip/hecate/services/BroadcastReceiverService.kt @@ -34,6 +34,7 @@ import dev.lexip.hecate.util.ProximitySensorManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel import kotlinx.coroutines.launch private const val TAG = "BroadcastReceiverService" @@ -42,8 +43,6 @@ private const val ACTION_STOP_SERVICE = "dev.lexip.hecate.action.STOP_SERVICE" private var screenOnReceiver: ScreenOnReceiver? = null -private val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) - class BroadcastReceiverService : Service() { // Utils @@ -51,19 +50,29 @@ class BroadcastReceiverService : Service() { private lateinit var lightSensorManager: LightSensorManager private lateinit var proximitySensorManager: ProximitySensorManager - override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + // Service-bound scope + private val serviceScope = CoroutineScope(SupervisorJob() + Dispatchers.Main) + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) + if (intent == null) { + Log.w( + TAG, + "onStartCommand called with null intent; likely system restart. Proceeding safely." + ) + } + // Initialize data store val dataStore = (this.applicationContext as HecateApplication).userPreferencesDataStore // Handle stop action from notification - if (intent.action == ACTION_STOP_SERVICE) { + if (intent?.action == ACTION_STOP_SERVICE) { Log.i( TAG, "Disable action received from notification - disabling adaptive theme and stopping service..." ) - applicationScope.launch { + serviceScope.launch { try { val userPreferencesRepository = UserPreferencesRepository(dataStore) userPreferencesRepository.updateAdaptiveThemeEnabled(false) @@ -84,8 +93,13 @@ class BroadcastReceiverService : Service() { Log.i(TAG, "Service starting...") initializeUtils() + // Start foreground immediately to comply with O+ requirements + createNotificationChannel() + val initialNotification = buildNotification() + startForeground(1, initialNotification) + // Load user preferences from data store - applicationScope.launch { + serviceScope.launch { val userPreferencesRepository = UserPreferencesRepository(dataStore) val userPreferences = userPreferencesRepository.fetchInitialPreferences() @@ -96,20 +110,14 @@ class BroadcastReceiverService : Service() { // Abort service start when there is no receiver to handle if (screenOnReceiver == null) { - Log.d(TAG, "No receiver to handle, service start aborted.") + Log.d(TAG, "No receiver to handle, stopping foreground and self.") + stopForeground(STOP_FOREGROUND_REMOVE) stopSelf() - } else { - // Create service notification and channel - createNotificationChannel() - val notification = buildNotification() - - // Start the service in the foreground - startForeground(1, notification) } } // Collect preference updates while service runs - applicationScope.launch { + serviceScope.launch { val userPreferencesRepository = UserPreferencesRepository(dataStore) userPreferencesRepository.userPreferencesFlow.collect { prefs -> screenOnReceiver?.adaptiveThemeThresholdLux = prefs.adaptiveThemeThresholdLux @@ -124,8 +132,14 @@ class BroadcastReceiverService : Service() { Log.i(TAG, "Service is being destroyed...") screenOnReceiver?.let { Log.d(TAG, "Unregistering screen-on receiver...") - unregisterReceiver(it) + try { + unregisterReceiver(it) + } catch (e: IllegalArgumentException) { + Log.w(TAG, "Receiver was not registered or already unregistered.", e) + } } + screenOnReceiver = null + serviceScope.cancel() } override fun onBind(intent: Intent?): IBinder? { diff --git a/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt b/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt index 748e08f..21d6ad1 100644 --- a/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt +++ b/app/src/main/java/dev/lexip/hecate/services/QuickSettingsTileService.kt @@ -17,6 +17,7 @@ import android.content.Intent import android.content.pm.PackageManager import android.service.quicksettings.Tile import android.service.quicksettings.TileService +import androidx.core.content.ContextCompat import dev.lexip.hecate.HecateApplication import dev.lexip.hecate.analytics.AnalyticsLogger import dev.lexip.hecate.data.UserPreferencesRepository @@ -88,7 +89,7 @@ class QuickSettingsTileService : TileService() { val intent = Intent(applicationContext, BroadcastReceiverService::class.java) if (newEnabled) { repo.ensureAdaptiveThemeThresholdDefault() - applicationContext.startService(intent) + ContextCompat.startForegroundService(applicationContext, intent) AnalyticsLogger.logServiceEnabled( applicationContext, source = "quick_settings_tile" diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index 3c19ef9..cd012b9 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -13,6 +13,7 @@ package dev.lexip.hecate.ui import android.content.Intent +import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope @@ -189,7 +190,7 @@ class AdaptiveThemeViewModel( private fun startBroadcastReceiverService() { val intent = Intent(application.applicationContext, BroadcastReceiverService::class.java) - application.applicationContext.startService(intent) + ContextCompat.startForegroundService(application.applicationContext, intent) } private fun stopBroadcastReceiverService() { diff --git a/build.gradle.kts b/build.gradle.kts index 7422ee5..734332f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { sonar { properties { property("sonar.projectKey", "xLexip_Hecate") - property("sonar.projectVersion", "0.3.0") + property("sonar.projectVersion", "0.3.1") property("sonar.organization", "xlexip") property("sonar.host.url", "https://sonarcloud.io") property("sonar.androidLint.reportPaths", "app/build/reports/lint-results-debug.html") From e291db0321eb8530cea77ec082338f1b167c6533 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 19:21:12 +0100 Subject: [PATCH 42/75] About dialog --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 47 +++++- .../lexip/hecate/ui/components/AboutDialog.kt | 136 ++++++++++++++++++ app/src/main/res/values/strings.xml | 9 +- 3 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 238ee7b..aa36b01 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -27,7 +27,13 @@ import androidx.compose.foundation.layout.systemGestures import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.LargeTopAppBar import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold @@ -38,6 +44,9 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState 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.hapticfeedback.HapticFeedbackType import androidx.compose.ui.input.nestedscroll.nestedScroll @@ -50,6 +59,7 @@ import androidx.core.content.ContextCompat import androidx.lifecycle.viewmodel.compose.viewModel import dev.lexip.hecate.R import dev.lexip.hecate.data.AdaptiveThreshold +import dev.lexip.hecate.ui.components.AboutDialog import dev.lexip.hecate.ui.components.MainSwitchPreferenceCard import dev.lexip.hecate.ui.components.PermissionMissingDialog import dev.lexip.hecate.ui.components.preferences.ProgressDetailCard @@ -59,7 +69,8 @@ import dev.lexip.hecate.ui.theme.hecateTopAppBarColors @OptIn(ExperimentalMaterial3Api::class) @Composable fun AdaptiveThemeScreen( - uiState: AdaptiveThemeUiState + uiState: AdaptiveThemeUiState, + onAboutClick: () -> Unit = {} ) { val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) @@ -80,6 +91,8 @@ fun AdaptiveThemeScreen( val showMissingPermissionDialog by adaptiveThemeViewModel.showMissingPermissionDialog.collectAsState() val pendingAdbCommand by adaptiveThemeViewModel.pendingAdbCommand.collectAsState() + var showAbout by remember { mutableStateOf(false) } + LaunchedEffect(adaptiveThemeViewModel) { adaptiveThemeViewModel.uiEvents.collect { event -> when (event) { @@ -108,6 +121,30 @@ fun AdaptiveThemeScreen( style = MaterialTheme.typography.displaySmall, ) }, + actions = { + var menuExpanded by remember { mutableStateOf(false) } + androidx.compose.foundation.layout.Box { + IconButton(onClick = { menuExpanded = true }) { + Icon( + imageVector = Icons.Filled.MoreVert, + contentDescription = stringResource(id = R.string.title_more) + ) + } + DropdownMenu( + expanded = menuExpanded, + onDismissRequest = { menuExpanded = false } + ) { + DropdownMenuItem( + text = { Text(text = stringResource(id = R.string.title_about)) }, + onClick = { + menuExpanded = false + showAbout = true + onAboutClick() + } + ) + } + } + }, scrollBehavior = scrollBehavior ) } @@ -187,6 +224,14 @@ fun AdaptiveThemeScreen( } } + AboutDialog( + show = showAbout, + onDismiss = { + showAbout = false + haptic.performHapticFeedback(HapticFeedbackType.Confirm) + } + ) + PermissionMissingDialog( show = showMissingPermissionDialog, adbCommand = pendingAdbCommand, diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt new file mode 100644 index 0000000..63ca275 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.components + +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import dev.lexip.hecate.R + +@Composable +fun AboutDialog(show: Boolean, onDismiss: () -> Unit) { + if (!show) return + + val info = rememberAppAboutInfo() + + AlertDialog( + onDismissRequest = onDismiss, + title = {}, + text = { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + Image( + painter = painterResource(id = R.drawable.ic_app), + contentDescription = null, + modifier = Modifier.size(64.dp), + colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) + ) + + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = info.appName, + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(6.dp)) + Text( + text = info.packageName, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(4.dp)) + Text( + text = "v${info.version}", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center + ) + Spacer(modifier = Modifier.height(32.dp)) + Text( + text = stringResource(id = R.string.dialog_about_copyright), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center + ) + } + }, + confirmButton = { + TextButton(onClick = { + onDismiss() + }) { + Text(text = stringResource(id = R.string.action_close)) + } + } + ) +} + +@Composable +fun rememberAppAboutInfo(): AppAboutInfo { + val context = LocalContext.current + return remember(context.packageName) { + val pm = context.packageManager + val pkg = context.packageName + val packageInfo = pm.getPackageInfo(pkg, 0) + val versionName = + packageInfo.versionName ?: context.getString(R.string.dialog_about_version_unknown) + val appInfo: ApplicationInfo = try { + pm.getApplicationInfo(pkg, 0) + } catch (_: PackageManager.NameNotFoundException) { + context.applicationInfo + } + val appLabel = pm.getApplicationLabel(appInfo).toString() + val icon = try { + pm.getApplicationIcon(appInfo) + } catch (_: Exception) { + null + } + AppAboutInfo( + appName = appLabel, + version = versionName, + packageName = pkg, + icon = icon + ) + } +} + +data class AppAboutInfo( + val appName: String, + val version: String, + val packageName: String, + val icon: Drawable? +) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 778befe..5383231 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,9 +12,11 @@ Auto-switching the device theme based on ambient brightness. Brightness Threshold + Current Brightness Missing Permission + More Background Activity - Current Brightness + About Dark Dim @@ -22,4 +24,9 @@ Bright Daylight Sunlight + + Version %1$s + Package %1$s + Unknown + All rights reserved. \ No newline at end of file From 508a756018e95bc4ab7f557b3326af74960efc43 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:31:39 +0100 Subject: [PATCH 43/75] feat: Implement "send feedback" action * A mail action in the three-dot menu. --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 32 +++++++++++++++++++ app/src/main/res/values/strings.xml | 3 ++ 2 files changed, 35 insertions(+) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index aa36b01..b1ca7e8 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -13,9 +13,12 @@ package dev.lexip.hecate.ui import android.Manifest +import android.content.ActivityNotFoundException import android.content.ClipData import android.content.ClipboardManager +import android.content.Intent import android.content.pm.PackageManager +import android.widget.Toast import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets @@ -56,7 +59,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat +import androidx.core.net.toUri import androidx.lifecycle.viewmodel.compose.viewModel +import dev.lexip.hecate.BuildConfig import dev.lexip.hecate.R import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.ui.components.AboutDialog @@ -65,6 +70,8 @@ import dev.lexip.hecate.ui.components.PermissionMissingDialog import dev.lexip.hecate.ui.components.preferences.ProgressDetailCard import dev.lexip.hecate.ui.components.preferences.SliderDetailCard import dev.lexip.hecate.ui.theme.hecateTopAppBarColors +import java.net.URLEncoder +import java.nio.charset.StandardCharsets @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -122,6 +129,7 @@ fun AdaptiveThemeScreen( ) }, actions = { + val noEmailClientMessage = stringResource(id = R.string.error_no_email_client) var menuExpanded by remember { mutableStateOf(false) } androidx.compose.foundation.layout.Box { IconButton(onClick = { menuExpanded = true }) { @@ -134,6 +142,30 @@ fun AdaptiveThemeScreen( expanded = menuExpanded, onDismissRequest = { menuExpanded = false } ) { + val feedbackSubject = + "Adaptive Theme Feedback (v${BuildConfig.VERSION_NAME})" + DropdownMenuItem( + text = { Text(text = stringResource(id = R.string.title_send_feedback)) }, + onClick = { + menuExpanded = false + val encodedSubject = URLEncoder.encode( + feedbackSubject, + StandardCharsets.UTF_8.toString() + ) + val feedbackUri = + "https://lexip.dev/hecate/feedback?subject=$encodedSubject".toUri() + val feedbackIntent = Intent(Intent.ACTION_VIEW, feedbackUri) + try { + context.startActivity(feedbackIntent) + } catch (_: ActivityNotFoundException) { + Toast.makeText( + context, + noEmailClientMessage, + Toast.LENGTH_SHORT + ).show() + } + } + ) DropdownMenuItem( text = { Text(text = stringResource(id = R.string.title_about)) }, onClick = { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5383231..a861630 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,12 +11,15 @@ This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from the device settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s Auto-switching the device theme based on ambient brightness. + No email app found + Brightness Threshold Current Brightness Missing Permission More Background Activity About + Send feedback Dark Dim From 70fa87fa3c9d7de971a7688253d6305a56fbc013 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:31:39 +0100 Subject: [PATCH 44/75] feat: Implement custom thresholds * Users can now set custom thresholds over the three-dot menu. --- .../hecate/data/UserPreferencesRepository.kt | 32 +++++- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 39 ++++++-- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 58 ++++++++++- .../preferences/CustomThresholdDialog.kt | 98 +++++++++++++++++++ .../preferences/SliderDetailCard.kt | 2 +- .../java/dev/lexip/hecate/util/FormatUtils.kt | 8 ++ app/src/main/res/values/strings.xml | 8 ++ 7 files changed, 229 insertions(+), 16 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt diff --git a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt index 8bcf25c..90e8254 100644 --- a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt +++ b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt @@ -29,7 +29,8 @@ private const val TAG = "UserPreferencesRepository" data class UserPreferences( val adaptiveThemeEnabled: Boolean, - val adaptiveThemeThresholdLux: Float + val adaptiveThemeThresholdLux: Float, + val customAdaptiveThemeThresholdLux: Float? = null ) class UserPreferencesRepository(private val dataStore: DataStore) { @@ -37,6 +38,8 @@ class UserPreferencesRepository(private val dataStore: DataStore) { private object PreferencesKeys { val ADAPTIVE_THEME_ENABLED = booleanPreferencesKey("adaptive_theme_enabled") val ADAPTIVE_THEME_THRESHOLD_LUX = floatPreferencesKey("adaptive_theme_threshold_lux") + val CUSTOM_ADAPTIVE_THEME_THRESHOLD_LUX = + floatPreferencesKey("custom_adaptive_theme_threshold_lux") } val userPreferencesFlow: Flow = dataStore.data @@ -65,12 +68,17 @@ class UserPreferencesRepository(private val dataStore: DataStore) { } private fun mapUserPreferences(preferences: Preferences): UserPreferences { - // Get our show completed value, defaulting to false if not set: - preferences[PreferencesKeys.ADAPTIVE_THEME_ENABLED] == true val adaptiveThemeEnabled = preferences[PreferencesKeys.ADAPTIVE_THEME_ENABLED] == true val adaptiveThemeThresholdLux = - preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] ?: 100f - return UserPreferences(adaptiveThemeEnabled, adaptiveThemeThresholdLux) + preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] + ?: AdaptiveThreshold.BRIGHT.lux + val customAdaptiveThemeThresholdLux = + preferences[PreferencesKeys.CUSTOM_ADAPTIVE_THEME_THRESHOLD_LUX] + return UserPreferences( + adaptiveThemeEnabled = adaptiveThemeEnabled, + adaptiveThemeThresholdLux = adaptiveThemeThresholdLux, + customAdaptiveThemeThresholdLux = customAdaptiveThemeThresholdLux + ) } suspend fun updateAdaptiveThemeEnabled(enabled: Boolean) { @@ -82,6 +90,20 @@ class UserPreferencesRepository(private val dataStore: DataStore) { suspend fun updateAdaptiveThemeThresholdLux(lux: Float) { dataStore.edit { preferences -> preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] = lux + preferences.remove(PreferencesKeys.CUSTOM_ADAPTIVE_THEME_THRESHOLD_LUX) + } + } + + suspend fun updateCustomAdaptiveThemeThresholdLux(lux: Float) { + dataStore.edit { preferences -> + preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] = lux + preferences[PreferencesKeys.CUSTOM_ADAPTIVE_THEME_THRESHOLD_LUX] = lux + } + } + + suspend fun clearCustomAdaptiveThemeThreshold() { + dataStore.edit { preferences -> + preferences.remove(PreferencesKeys.CUSTOM_ADAPTIVE_THEME_THRESHOLD_LUX) } } diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index b1ca7e8..15d9cbc 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -67,6 +67,7 @@ import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.ui.components.AboutDialog import dev.lexip.hecate.ui.components.MainSwitchPreferenceCard import dev.lexip.hecate.ui.components.PermissionMissingDialog +import dev.lexip.hecate.ui.components.preferences.CustomThresholdDialog import dev.lexip.hecate.ui.components.preferences.ProgressDetailCard import dev.lexip.hecate.ui.components.preferences.SliderDetailCard import dev.lexip.hecate.ui.theme.hecateTopAppBarColors @@ -99,6 +100,7 @@ fun AdaptiveThemeScreen( val pendingAdbCommand by adaptiveThemeViewModel.pendingAdbCommand.collectAsState() var showAbout by remember { mutableStateOf(false) } + var showCustomDialog by remember { mutableStateOf(false) } LaunchedEffect(adaptiveThemeViewModel) { adaptiveThemeViewModel.uiEvents.collect { event -> @@ -166,6 +168,16 @@ fun AdaptiveThemeScreen( } } ) + DropdownMenuItem( + text = { Text(text = stringResource(id = R.string.title_custom_threshold)) }, + enabled = uiState.adaptiveThemeEnabled, + onClick = { + menuExpanded = false + if (uiState.adaptiveThemeEnabled) { + showCustomDialog = true + } + } + ) DropdownMenuItem( text = { Text(text = stringResource(id = R.string.title_about)) }, onClick = { @@ -219,9 +231,13 @@ fun AdaptiveThemeScreen( } ) - val currentIndex = adaptiveThemeViewModel.getIndexForCurrentLux() - val labels = AdaptiveThreshold.entries.map { stringResource(id = it.labelRes) } - val lux = AdaptiveThreshold.entries.map { it.lux } + val customLabel = stringResource(id = R.string.adaptive_threshold_custom) + val labels = adaptiveThemeViewModel.getDisplayLabels( + AdaptiveThreshold.entries.map { stringResource(id = it.labelRes) }, + customLabel + ) + val baseLux = AdaptiveThreshold.entries.map { it.lux } + val lux = adaptiveThemeViewModel.getDisplayLuxSteps(baseLux) val currentLux by adaptiveThemeViewModel.currentSensorLuxFlow.collectAsState(initial = adaptiveThemeViewModel.currentSensorLux) Column( @@ -229,14 +245,13 @@ fun AdaptiveThemeScreen( ) { SliderDetailCard( title = stringResource(id = R.string.title_brightness_threshold), - valueIndex = currentIndex, + valueIndex = adaptiveThemeViewModel.getIndexForCurrentLux(), steps = labels.size, labels = labels, lux = lux, onValueChange = { index -> - adaptiveThemeViewModel.updateAdaptiveThemeThresholdByIndex( - index - ) + adaptiveThemeViewModel.setPendingCustomSliderLux(lux[index]) + adaptiveThemeViewModel.onSliderValueCommitted(index) }, enabled = uiState.adaptiveThemeEnabled, firstCard = true, @@ -270,4 +285,14 @@ fun AdaptiveThemeScreen( onCopy = { adaptiveThemeViewModel.requestCopyAdbCommand() }, onDismiss = { adaptiveThemeViewModel.dismissDialog() } ) + + CustomThresholdDialog( + show = showCustomDialog, + currentLux = uiState.customAdaptiveThemeThresholdLux ?: uiState.adaptiveThemeThresholdLux, + onConfirm = { luxValue: Float -> + adaptiveThemeViewModel.setCustomAdaptiveThemeThreshold(luxValue) + showCustomDialog = false + }, + onDismiss = { showCustomDialog = false } + ) } \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index cd012b9..f185d26 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -38,7 +38,8 @@ sealed interface UiEvent { data class AdaptiveThemeUiState( val adaptiveThemeEnabled: Boolean = false, - val adaptiveThemeThresholdLux: Float = AdaptiveThreshold.BRIGHT.lux + val adaptiveThemeThresholdLux: Float = AdaptiveThreshold.BRIGHT.lux, + val customAdaptiveThemeThresholdLux: Float? = null ) class AdaptiveThemeViewModel( @@ -77,12 +78,16 @@ class AdaptiveThemeViewModel( _currentSensorLux.value = lux } + // Temporary variable for custom threshold + private var customThresholdTemp: Float? = null + init { viewModelScope.launch { userPreferencesRepository.userPreferencesFlow.collect { userPreferences -> _uiState.value = AdaptiveThemeUiState( adaptiveThemeEnabled = userPreferences.adaptiveThemeEnabled, - adaptiveThemeThresholdLux = userPreferences.adaptiveThemeThresholdLux + adaptiveThemeThresholdLux = userPreferences.adaptiveThemeThresholdLux, + customAdaptiveThemeThresholdLux = userPreferences.customAdaptiveThemeThresholdLux ) if (userPreferences.adaptiveThemeEnabled) startLightSensorListening() @@ -184,8 +189,55 @@ class AdaptiveThemeViewModel( } } + fun setCustomAdaptiveThemeThreshold(lux: Float) { + val oldLux = _uiState.value.adaptiveThemeThresholdLux + viewModelScope.launch { + userPreferencesRepository.updateCustomAdaptiveThemeThresholdLux(lux) + AnalyticsLogger.logBrightnessThresholdChanged( + application.applicationContext, + oldLux = oldLux, + newLux = lux + ) + } + } + + fun clearCustomAdaptiveThemeThreshold() { + viewModelScope.launch { + userPreferencesRepository.clearCustomAdaptiveThemeThreshold() + } + } + + val isUsingCustomThreshold: Boolean + get() = _uiState.value.customAdaptiveThemeThresholdLux != null + + fun getDisplayLuxSteps(baseLux: List): List { + val customLux = _uiState.value.customAdaptiveThemeThresholdLux ?: return baseLux + val index = AdaptiveThreshold.fromLux(customLux).ordinal + return baseLux.mapIndexed { i, value -> if (i == index) customLux else value } + } + + fun getDisplayLabels(labels: List, customLabel: String): List { + return if (isUsingCustomThreshold) { + labels.mapIndexed { index, label -> + if (index == getIndexForCurrentLux()) customLabel else label + } + } else labels + } + + fun onSliderValueCommitted(index: Int) { + if (isUsingCustomThreshold) { + customThresholdTemp = null + } + updateAdaptiveThemeThresholdByIndex(index) + } + fun getIndexForCurrentLux(): Int { - return AdaptiveThreshold.fromLux(_uiState.value.adaptiveThemeThresholdLux).ordinal + val lux = customThresholdTemp ?: _uiState.value.adaptiveThemeThresholdLux + return AdaptiveThreshold.fromLux(lux).ordinal + } + + fun setPendingCustomSliderLux(lux: Float) { + customThresholdTemp = lux } private fun startBroadcastReceiverService() { diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt new file mode 100644 index 0000000..2756075 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.components.preferences + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +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.res.stringResource +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import dev.lexip.hecate.R + +@Composable +fun CustomThresholdDialog( + show: Boolean, + currentLux: Float, + onConfirm: (Float) -> Unit, + onDismiss: () -> Unit +) { + if (!show) return + + var text by remember(currentLux) { + mutableStateOf( + if (currentLux >= 0) currentLux.toInt().toString() else "" + ) + } + var error by remember { mutableStateOf(null) } + + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(text = stringResource(id = R.string.title_custom_threshold)) }, + text = { + Column(modifier = Modifier.fillMaxWidth()) { + OutlinedTextField( + modifier = Modifier + .fillMaxWidth() + .padding(top = 4.dp), + value = text, + onValueChange = { + text = it + error = null + }, + label = { Text(text = stringResource(id = R.string.hint_custom_threshold_value)) }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + singleLine = true, + isError = error != null, + supportingText = error?.let { errorRes -> + { Text(text = stringResource(id = errorRes)) } + } + ) + } + }, + confirmButton = { + TextButton(onClick = { + val value = text.toFloatOrNull() + if (value == null) { + error = R.string.error_invalid_lux_value + return@TextButton + } + + if (value < 0f) { + error = R.string.error_negative_lux_value + return@TextButton + } + + onConfirm(value) + }) { + Text(text = stringResource(id = R.string.action_set)) + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { + Text(text = stringResource(id = R.string.action_cancel)) + } + } + ) +} diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt index 34ed9ef..3182e2d 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/SliderDetailCard.kt @@ -119,7 +119,7 @@ private fun LabeledSlider( modifier = Modifier.weight(1f) ) Text( - text = lux?.getOrNull(liveIndex)?.toInt()?.let { "${it.formatLux()} lx" } ?: "", + text = lux?.getOrNull(liveIndex)?.let { "${it.formatLux()} lx" } ?: "", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.End diff --git a/app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt b/app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt index e8097d6..dece9df 100644 --- a/app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt +++ b/app/src/main/java/dev/lexip/hecate/util/FormatUtils.kt @@ -23,3 +23,11 @@ fun Int.formatLux(): String { val nf = NumberFormat.getIntegerInstance(Locale.getDefault()) return nf.format(this) } + +fun Float.formatLux(): String { + val nf = NumberFormat.getNumberInstance(Locale.getDefault()).apply { + maximumFractionDigits = if (this@formatLux % 1f == 0f) 0 else 1 + minimumFractionDigits = 0 + } + return nf.format(this) +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a861630..98d40f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -12,6 +12,8 @@ Auto-switching the device theme based on ambient brightness. No email app found + Please enter a valid lux value. + Lux value cannot be negative. Brightness Threshold Current Brightness @@ -20,6 +22,7 @@ Background Activity About Send feedback + Custom threshold Dark Dim @@ -27,9 +30,14 @@ Bright Daylight Sunlight + Custom Version %1$s Package %1$s Unknown All rights reserved. + + Lux value + Set + Cancel \ No newline at end of file From e4d411737099e2a93b05efa11c08e81b8ca4e54e Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:31:39 +0100 Subject: [PATCH 45/75] chore: Create FUNDING.yml --- FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 FUNDING.yml diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 0000000..6df9a3a --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1 @@ +buy_me_a_coffee: lexip \ No newline at end of file From 7fc3d7802e5e1eea834dfefa44129d5dadb7c036 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:31:39 +0100 Subject: [PATCH 46/75] chore(analytics): Log system theme changes --- .../dev/lexip/hecate/analytics/AnalyticsLogger.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt index 54d843e..c57e7e5 100644 --- a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt +++ b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt @@ -69,4 +69,17 @@ object AnalyticsLogger { analytics(context).logEvent("qs_tile_added") { } } } + + fun logThemeSwitched( + context: Context, + targetMode: Int, + succeeded: Boolean + ) { + ifAllowed { + analytics(context).logEvent("theme_switched") { + param("target_mode", targetMode.toLong()) + param("succeeded", if (succeeded) 1L else 0L) + } + } + } } From 1413a9b01883952a89232f94f1195f35f01aa15c Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:32:15 +0100 Subject: [PATCH 47/75] refactor: Change about action to changeable URL * lexip.dev/hecate/about * Currently leads to the github repo --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 19 ++- .../lexip/hecate/ui/components/AboutDialog.kt | 136 ------------------ app/src/main/res/values/strings.xml | 5 - 3 files changed, 8 insertions(+), 152 deletions(-) delete mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 15d9cbc..686fcfa 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -64,7 +64,6 @@ import androidx.lifecycle.viewmodel.compose.viewModel import dev.lexip.hecate.BuildConfig import dev.lexip.hecate.R import dev.lexip.hecate.data.AdaptiveThreshold -import dev.lexip.hecate.ui.components.AboutDialog import dev.lexip.hecate.ui.components.MainSwitchPreferenceCard import dev.lexip.hecate.ui.components.PermissionMissingDialog import dev.lexip.hecate.ui.components.preferences.CustomThresholdDialog @@ -99,7 +98,6 @@ fun AdaptiveThemeScreen( val showMissingPermissionDialog by adaptiveThemeViewModel.showMissingPermissionDialog.collectAsState() val pendingAdbCommand by adaptiveThemeViewModel.pendingAdbCommand.collectAsState() - var showAbout by remember { mutableStateOf(false) } var showCustomDialog by remember { mutableStateOf(false) } LaunchedEffect(adaptiveThemeViewModel) { @@ -179,10 +177,16 @@ fun AdaptiveThemeScreen( } ) DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.title_about)) }, + text = { Text(stringResource(R.string.title_about)) }, onClick = { menuExpanded = false - showAbout = true + val aboutUri = "https://lexip.dev/hecate/about".toUri() + val aboutIntent = Intent(Intent.ACTION_VIEW, aboutUri) + try { + context.startActivity(aboutIntent) + } catch (_: ActivityNotFoundException) { + context.startActivity(Intent(Intent.ACTION_VIEW, aboutUri)) + } onAboutClick() } ) @@ -271,13 +275,6 @@ fun AdaptiveThemeScreen( } } - AboutDialog( - show = showAbout, - onDismiss = { - showAbout = false - haptic.performHapticFeedback(HapticFeedbackType.Confirm) - } - ) PermissionMissingDialog( show = showMissingPermissionDialog, diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt deleted file mode 100644 index 63ca275..0000000 --- a/app/src/main/java/dev/lexip/hecate/ui/components/AboutDialog.kt +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2025 xLexip - * - * Licensed under the GNU General Public License, Version 3.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/gpl-3.0 - * - * Please see the License for specific terms regarding permissions and limitations. - */ - -package dev.lexip.hecate.ui.components - -import android.content.pm.ApplicationInfo -import android.content.pm.PackageManager -import android.graphics.drawable.Drawable -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.size -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import dev.lexip.hecate.R - -@Composable -fun AboutDialog(show: Boolean, onDismiss: () -> Unit) { - if (!show) return - - val info = rememberAppAboutInfo() - - AlertDialog( - onDismissRequest = onDismiss, - title = {}, - text = { - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Image( - painter = painterResource(id = R.drawable.ic_app), - contentDescription = null, - modifier = Modifier.size(64.dp), - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.primary) - ) - - Spacer(modifier = Modifier.height(12.dp)) - Text( - text = info.appName, - style = MaterialTheme.typography.titleLarge, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(6.dp)) - Text( - text = info.packageName, - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(4.dp)) - Text( - text = "v${info.version}", - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Center - ) - Spacer(modifier = Modifier.height(32.dp)) - Text( - text = stringResource(id = R.string.dialog_about_copyright), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - textAlign = TextAlign.Center - ) - } - }, - confirmButton = { - TextButton(onClick = { - onDismiss() - }) { - Text(text = stringResource(id = R.string.action_close)) - } - } - ) -} - -@Composable -fun rememberAppAboutInfo(): AppAboutInfo { - val context = LocalContext.current - return remember(context.packageName) { - val pm = context.packageManager - val pkg = context.packageName - val packageInfo = pm.getPackageInfo(pkg, 0) - val versionName = - packageInfo.versionName ?: context.getString(R.string.dialog_about_version_unknown) - val appInfo: ApplicationInfo = try { - pm.getApplicationInfo(pkg, 0) - } catch (_: PackageManager.NameNotFoundException) { - context.applicationInfo - } - val appLabel = pm.getApplicationLabel(appInfo).toString() - val icon = try { - pm.getApplicationIcon(appInfo) - } catch (_: Exception) { - null - } - AppAboutInfo( - appName = appLabel, - version = versionName, - packageName = pkg, - icon = icon - ) - } -} - -data class AppAboutInfo( - val appName: String, - val version: String, - val packageName: String, - val icon: Drawable? -) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 98d40f0..edd363b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -32,11 +32,6 @@ Sunlight Custom - Version %1$s - Package %1$s - Unknown - All rights reserved. - Lux value Set Cancel From 5ae683a833b050283b0ddbcf3984f29f70661eb3 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 11:20:03 +0100 Subject: [PATCH 48/75] style: Optimize custom threshold dialog * Emphasize set button and outline cancel button to match system style. * Add haptic feedback for Set and Errors. * Limit custom value to 100,000 lux. --- .../preferences/CustomThresholdDialog.kt | 28 +++++++++++++++---- app/src/main/res/values/strings.xml | 1 + 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt index 2756075..9deb084 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/preferences/CustomThresholdDialog.kt @@ -17,20 +17,25 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text -import androidx.compose.material3.TextButton 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.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import dev.lexip.hecate.R +private const val MAX_LUX = 100_000f + @Composable fun CustomThresholdDialog( show: Boolean, @@ -40,6 +45,8 @@ fun CustomThresholdDialog( ) { if (!show) return + val haptic = LocalHapticFeedback.current + var text by remember(currentLux) { mutableStateOf( if (currentLux >= 0) currentLux.toInt().toString() else "" @@ -72,25 +79,36 @@ fun CustomThresholdDialog( } }, confirmButton = { - TextButton(onClick = { + Button(onClick = { val value = text.toFloatOrNull() if (value == null) { error = R.string.error_invalid_lux_value - return@TextButton + haptic.performHapticFeedback(HapticFeedbackType.Reject) + return@Button } if (value < 0f) { error = R.string.error_negative_lux_value - return@TextButton + haptic.performHapticFeedback(HapticFeedbackType.Reject) + return@Button } + if (value > MAX_LUX) { + error = R.string.error_lux_value_too_large + haptic.performHapticFeedback(HapticFeedbackType.Reject) + return@Button + } + + haptic.performHapticFeedback(HapticFeedbackType.Confirm) onConfirm(value) }) { Text(text = stringResource(id = R.string.action_set)) } }, dismissButton = { - TextButton(onClick = onDismiss) { + OutlinedButton(onClick = { + onDismiss() + }) { Text(text = stringResource(id = R.string.action_cancel)) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index edd363b..2f09818 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,7 @@ No email app found Please enter a valid lux value. Lux value cannot be negative. + Lux value cannot exceed 100,000. Brightness Threshold Current Brightness From 5d4545ff17912103ade711379e882e8c3fdbca84 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 11:20:35 +0100 Subject: [PATCH 49/75] feat(res): Optimize strings and DE translation --- app/src/main/res/values-de/strings.xml | 48 ++++++++++++++++++++++++++ app/src/main/res/values/strings.xml | 26 +++++++++----- 2 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/values-de/strings.xml diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 0000000..63b26ca --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,48 @@ + + + Adaptive Theme + + Schließen + ADB-Command kopieren + Benachrichtigung ausblenden + Adaptive Theme verwenden + Dienst stoppen + + + Wechselt automatisch zwischen hellem und dunklem Modus basierend auf dem Umgebungslicht – für bessere Sichtbarkeit und Akkulaufzeit. Der Wechsel erfolgt nur beim Einschalten des Bildschirms und nur, wenn das Gerät nicht abgedeckt ist. + + + + Diese App benötigt die Berechtigung WRITE_SECURE_SETTINGS, um das Systemtheme zu ändern. Es handelt sich um eine Systemberechtigung, die nicht über die Geräteeinstellungen erteilt werden kann.\n\nUm sie zu vergeben, führe den folgenden ADB-Command auf einem mit deinem Gerät verbundenen Computer aus:\n\n%1$s + + + + Systemtheme wird anhand der Umgebungshelligkeit angepasst. + + + Keine E-Mail-App gefunden. + Ungültiger Lux-Wert. + Der Lux-Wert darf nicht negativ sein. + Der Lux-Wert kann maximal 100.000 sein. + + Helligkeitsschwelle + Aktuelle Helligkeit + Fehlende Berechtigung + Mehr + Hintergrundaktivität + Info + Feedback senden + Benutzerdefinierte Schwelle + + Dunkel + Schwach + Leicht + Hell + Tageslicht + Sonnenlicht + Benutzerdefiniert + + Lux-Wert + Festlegen + Abbrechen + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f09818..682ef24 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,14 +5,22 @@ Copy ADB Command Hide Notification Use Adaptive Theme - Disable Service + Stop Service - Automatically switches between light and dark mode based on ambient brightness to improve visibility and help save battery. Changes only occur right after the screen turns on and when the device is uncovered. - This app needs the WRITE_SECURE_SETTINGS permission to modify the device theme. It is a system-level permission that cannot be granted from the device settings.\n\nTo grant it you can run the following ADB command from a computer connected to your device:\n\n%1$s - Auto-switching the device theme based on ambient brightness. + + Automatically switches between Light and Dark mode based on ambient light for better visibility and battery life. Theme changes occur only when the screen turns on and the device is uncovered. + - No email app found - Please enter a valid lux value. + + This app requires the WRITE_SECURE_SETTINGS permission to change the system theme. It’s a system-level permission that cannot be granted through device settings.\n\nTo grant it, run the following ADB command from a computer connected to your device:\n\n%1$s + + + + Adjusting the system theme based on ambient brightness. + + + No email app found. + Invalid lux value. Lux value cannot be negative. Lux value cannot exceed 100,000. @@ -22,8 +30,8 @@ More Background Activity About - Send feedback - Custom threshold + Send Feedback + Custom Threshold Dark Dim @@ -36,4 +44,4 @@ Lux value Set Cancel - \ No newline at end of file + From fad49271ca621eb0e7d5346d2d61ede2e0daae20 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 11:59:14 +0100 Subject: [PATCH 50/75] feat: Implement per-app language preferences * Implement Android's per-app language preferences and a change language option (Android 12+). * Also reorder the three-dot menu. --- app/build.gradle.kts | 3 + .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 59 ++++++++++++++----- app/src/main/res/resources.properties | 1 + app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 5 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 app/src/main/res/resources.properties diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 29f005d..75cabfe 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -56,6 +56,9 @@ android { } } } + androidResources { + generateLocaleConfig = true + } } dependencies { diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 686fcfa..f77eb99 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -18,6 +18,7 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Intent import android.content.pm.PackageManager +import android.provider.Settings import android.widget.Toast import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -98,7 +99,7 @@ fun AdaptiveThemeScreen( val showMissingPermissionDialog by adaptiveThemeViewModel.showMissingPermissionDialog.collectAsState() val pendingAdbCommand by adaptiveThemeViewModel.pendingAdbCommand.collectAsState() - var showCustomDialog by remember { mutableStateOf(false) } + val showCustomDialog = remember { mutableStateOf(false) } LaunchedEffect(adaptiveThemeViewModel) { adaptiveThemeViewModel.uiEvents.collect { event -> @@ -144,6 +145,44 @@ fun AdaptiveThemeScreen( ) { val feedbackSubject = "Adaptive Theme Feedback (v${BuildConfig.VERSION_NAME})" + + // 1) Custom Threshold + DropdownMenuItem( + text = { Text(text = stringResource(id = R.string.title_custom_threshold)) }, + enabled = uiState.adaptiveThemeEnabled, + onClick = { + menuExpanded = false + if (uiState.adaptiveThemeEnabled) { + showCustomDialog.value = true + } + } + ) + + // 2) Change Language (Android 13+) + if (android.os.Build.VERSION.SDK_INT >= 33) { + DropdownMenuItem( + text = { Text(text = stringResource(id = R.string.title_change_language)) }, + onClick = { + menuExpanded = false + val intent = + Intent(Settings.ACTION_APP_LOCALE_SETTINGS).apply { + data = "package:$packageName".toUri() + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + try { + context.startActivity(intent) + } catch (_: ActivityNotFoundException) { + Toast.makeText( + context, + context.getString(R.string.error_no_app_language_settings), + Toast.LENGTH_SHORT + ).show() + } + } + ) + } + + // 3) Send Feedback DropdownMenuItem( text = { Text(text = stringResource(id = R.string.title_send_feedback)) }, onClick = { @@ -166,16 +205,8 @@ fun AdaptiveThemeScreen( } } ) - DropdownMenuItem( - text = { Text(text = stringResource(id = R.string.title_custom_threshold)) }, - enabled = uiState.adaptiveThemeEnabled, - onClick = { - menuExpanded = false - if (uiState.adaptiveThemeEnabled) { - showCustomDialog = true - } - } - ) + + // 4) About DropdownMenuItem( text = { Text(stringResource(R.string.title_about)) }, onClick = { @@ -284,12 +315,12 @@ fun AdaptiveThemeScreen( ) CustomThresholdDialog( - show = showCustomDialog, + show = showCustomDialog.value, currentLux = uiState.customAdaptiveThemeThresholdLux ?: uiState.adaptiveThemeThresholdLux, onConfirm = { luxValue: Float -> adaptiveThemeViewModel.setCustomAdaptiveThemeThreshold(luxValue) - showCustomDialog = false + showCustomDialog.value = false }, - onDismiss = { showCustomDialog = false } + onDismiss = { showCustomDialog.value = false } ) } \ No newline at end of file diff --git a/app/src/main/res/resources.properties b/app/src/main/res/resources.properties new file mode 100644 index 0000000..63b46f9 --- /dev/null +++ b/app/src/main/res/resources.properties @@ -0,0 +1 @@ +unqualifiedResLocale=en \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 63b26ca..77d8a75 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -24,6 +24,7 @@ Ungültiger Lux-Wert. Der Lux-Wert darf nicht negativ sein. Der Lux-Wert kann maximal 100.000 sein. + Per-App Spracheneinstellungen sind auf diesem Gerät nicht verfügbar. Helligkeitsschwelle Aktuelle Helligkeit @@ -31,6 +32,7 @@ Mehr Hintergrundaktivität Info + Sprache ändern Feedback senden Benutzerdefinierte Schwelle diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 682ef24..829ac4b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -23,6 +23,7 @@ Invalid lux value. Lux value cannot be negative. Lux value cannot exceed 100,000. + Per-app language preferences are unavailable on this device. Brightness Threshold Current Brightness @@ -30,6 +31,7 @@ More Background Activity About + Change Language Send Feedback Custom Threshold From b6df62290cd3c2906f949826c0dba1540975d043 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 12:20:43 +0100 Subject: [PATCH 51/75] chore(gradle): Create beta build type * For play store beta releases. * With beta version suffix. --- .gitignore | 5 +++-- app/build.gradle.kts | 6 ++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6adab54..f60c3b8 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ google-services.json # Android Profiling *.hprof -app/release/* - +# Builds +app/release/ app/debug/ +app/beta/ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 75cabfe..c9be8a2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -32,7 +32,13 @@ android { } } debug { + versionNameSuffix = "-debug" + isDebuggable = true + } + create("beta") { + initWith(getByName("release")) versionNameSuffix = "-beta" + isDebuggable = false } } compileOptions { From c662c50a50d086427e6bb3bfc22964fb368de4db Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 12:27:55 +0100 Subject: [PATCH 52/75] chore(gradle): Set NDK debug symbol level to full --- app/build.gradle.kts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c9be8a2..b47e5f9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -28,18 +28,22 @@ android { "proguard-rules.pro" ) ndk { - debugSymbolLevel = "SYMBOL_TABLE" + debugSymbolLevel = "FULL" } } debug { versionNameSuffix = "-debug" isDebuggable = true + ndk { + debugSymbolLevel = "FULL" + } } create("beta") { initWith(getByName("release")) versionNameSuffix = "-beta" isDebuggable = false } + } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 From 50db3a12b55604fe01f8b0daef62b1ecd9ab9fbe Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:08:59 +0100 Subject: [PATCH 53/75] feat: Show app version toast on about action --- app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index f77eb99..33debb0 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -213,6 +213,11 @@ fun AdaptiveThemeScreen( menuExpanded = false val aboutUri = "https://lexip.dev/hecate/about".toUri() val aboutIntent = Intent(Intent.ACTION_VIEW, aboutUri) + Toast.makeText( + context, + "v${BuildConfig.VERSION_NAME}", + Toast.LENGTH_SHORT + ).show() try { context.startActivity(aboutIntent) } catch (_: ActivityNotFoundException) { From d77327d1553e59a83ed45a1dc9fa76da68a13221 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:09:27 +0100 Subject: [PATCH 54/75] chore: Add analytics to the three-dot menu actions --- .../dev/lexip/hecate/analytics/AnalyticsLogger.kt | 8 ++++++++ .../dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt index c57e7e5..8ddc82e 100644 --- a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt +++ b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt @@ -82,4 +82,12 @@ object AnalyticsLogger { } } } + + fun logOverflowMenuItemClicked(context: Context, menuItem: String) { + ifAllowed { + analytics(context).logEvent("overflow_menu_item_clicked") { + param("menu_item", menuItem) + } + } + } } diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 33debb0..8e8bb6e 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -64,6 +64,7 @@ import androidx.core.net.toUri import androidx.lifecycle.viewmodel.compose.viewModel import dev.lexip.hecate.BuildConfig import dev.lexip.hecate.R +import dev.lexip.hecate.analytics.AnalyticsLogger import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.ui.components.MainSwitchPreferenceCard import dev.lexip.hecate.ui.components.PermissionMissingDialog @@ -152,6 +153,10 @@ fun AdaptiveThemeScreen( enabled = uiState.adaptiveThemeEnabled, onClick = { menuExpanded = false + AnalyticsLogger.logOverflowMenuItemClicked( + context, + "custom_threshold" + ) if (uiState.adaptiveThemeEnabled) { showCustomDialog.value = true } @@ -164,6 +169,10 @@ fun AdaptiveThemeScreen( text = { Text(text = stringResource(id = R.string.title_change_language)) }, onClick = { menuExpanded = false + AnalyticsLogger.logOverflowMenuItemClicked( + context, + "change_language" + ) val intent = Intent(Settings.ACTION_APP_LOCALE_SETTINGS).apply { data = "package:$packageName".toUri() @@ -187,6 +196,11 @@ fun AdaptiveThemeScreen( text = { Text(text = stringResource(id = R.string.title_send_feedback)) }, onClick = { menuExpanded = false + AnalyticsLogger.logOverflowMenuItemClicked( + context, + "send_feedback" + ) + onFeedbackClick() val encodedSubject = URLEncoder.encode( feedbackSubject, StandardCharsets.UTF_8.toString() @@ -211,6 +225,7 @@ fun AdaptiveThemeScreen( text = { Text(stringResource(R.string.title_about)) }, onClick = { menuExpanded = false + AnalyticsLogger.logOverflowMenuItemClicked(context, "about") val aboutUri = "https://lexip.dev/hecate/about".toUri() val aboutIntent = Intent(Intent.ACTION_VIEW, aboutUri) Toast.makeText( From ede8c50bc48bd10179ea2197718326c145d211b6 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:09:27 +0100 Subject: [PATCH 55/75] feat: Offer a webapp for easy app setup * Instead of installing ADB and executing a command, users can now simply use lexip.dev/hecate/setup. --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 26 ++++++++++-- .../ui/components/PermissionMissingDialog.kt | 42 +++++++++++++------ app/src/main/res/values-de/strings.xml | 11 +++-- app/src/main/res/values/strings.xml | 9 ++-- 4 files changed, 65 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 8e8bb6e..0b59c06 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -98,7 +98,6 @@ fun AdaptiveThemeScreen( ) val showMissingPermissionDialog by adaptiveThemeViewModel.showMissingPermissionDialog.collectAsState() - val pendingAdbCommand by adaptiveThemeViewModel.pendingAdbCommand.collectAsState() val showCustomDialog = remember { mutableStateOf(false) } @@ -329,8 +328,29 @@ fun AdaptiveThemeScreen( PermissionMissingDialog( show = showMissingPermissionDialog, - adbCommand = pendingAdbCommand, - onCopy = { adaptiveThemeViewModel.requestCopyAdbCommand() }, + setupUrl = "https://lexip.dev/setup", + onOpenSetup = { + val setupUri = "https://lexip.dev/setup".toUri() + val intent = Intent(Intent.ACTION_VIEW, setupUri) + try { + context.startActivity(intent) + } catch (_: Exception) { + context.startActivity(Intent(Intent.ACTION_VIEW, setupUri)) + } + }, + onShareSetupUrl = { url -> + val shareIntent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, url) + type = "text/plain" + } + val chooser = Intent.createChooser(shareIntent, null) + try { + context.startActivity(chooser) + } catch (_: Exception) { + // ignore if no activity can handle share + } + }, onDismiss = { adaptiveThemeViewModel.dismissDialog() } ) diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt index 14a087f..7c75170 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt @@ -12,11 +12,16 @@ package dev.lexip.hecate.ui.components +import androidx.compose.foundation.layout.Column import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.res.stringResource @@ -26,8 +31,9 @@ import dev.lexip.hecate.R @Composable fun PermissionMissingDialog( show: Boolean, - adbCommand: String, - onCopy: (String) -> Unit, + setupUrl: String, + onOpenSetup: () -> Unit, + onShareSetupUrl: (String) -> Unit, onDismiss: () -> Unit ) { if (!show) return @@ -38,23 +44,35 @@ fun PermissionMissingDialog( onDismissRequest = onDismiss, title = { Text(text = stringResource(id = R.string.title_missing_permission)) }, text = { - Text( - text = stringResource( - id = R.string.description_missing_secure_settings_permission, - adbCommand + // Show description text and extra action buttons in a Column + Column { + Text( + text = stringResource( + id = R.string.description_missing_permission, + setupUrl + ) ) - ) + + TextButton(onClick = { + onOpenSetup() + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + }, modifier = Modifier.align(Alignment.CenterHorizontally)) { + Text(text = stringResource(id = R.string.action_view_website)) + } + + + } }, confirmButton = { - TextButton(onClick = { - onCopy(adbCommand) - haptic.performHapticFeedback(HapticFeedbackType.Confirm) + Button(onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onShareSetupUrl(setupUrl) }) { - Text(text = stringResource(id = R.string.action_copy_adb_command)) + Text(text = stringResource(id = R.string.action_share_setup_url)) } }, dismissButton = { - TextButton(onClick = onDismiss) { + OutlinedButton(onClick = onDismiss) { Text(text = stringResource(id = R.string.action_close)) } } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 77d8a75..39edc17 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -7,14 +7,17 @@ Benachrichtigung ausblenden Adaptive Theme verwenden Dienst stoppen + Öffnen + Link teilen + Website öffnen + Wechselt automatisch zwischen hellem und dunklem Modus basierend auf dem Umgebungslicht – für bessere Sichtbarkeit und Akkulaufzeit. Der Wechsel erfolgt nur beim Einschalten des Bildschirms und nur, wenn das Gerät nicht abgedeckt ist. - - - Diese App benötigt die Berechtigung WRITE_SECURE_SETTINGS, um das Systemtheme zu ändern. Es handelt sich um eine Systemberechtigung, die nicht über die Geräteeinstellungen erteilt werden kann.\n\nUm sie zu vergeben, führe den folgenden ADB-Command auf einem mit deinem Gerät verbundenen Computer aus:\n\n%1$s - + +Diese App benötigt die Berechtigung WRITE_SECURE_SETTINGS, um das System-Theme ändern zu können. Diese Berechtigung kann leider nicht über die Geräteeinstellungen erteilt werden. \n\nUm sie zu erteilen, öffnen Sie einfach die Website lexip.dev/setup auf einem anderen Gerät und folgen Sie den Anweisungen. + Systemtheme wird anhand der Umgebungshelligkeit angepasst. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 829ac4b..0d3cfb5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,15 +6,16 @@ Hide Notification Use Adaptive Theme Stop Service + Open + Share Link + View Website Automatically switches between Light and Dark mode based on ambient light for better visibility and battery life. Theme changes occur only when the screen turns on and the device is uncovered. - - - This app requires the WRITE_SECURE_SETTINGS permission to change the system theme. It’s a system-level permission that cannot be granted through device settings.\n\nTo grant it, run the following ADB command from a computer connected to your device:\n\n%1$s + + This app needs the permission WRITE_SECURE_SETTINGS to modify the system theme. Unfortunately, it cannot be granted from the device settings. \n\nTo grant it, simply open the website lexip.dev/setup on another device and follow the instructions. - Adjusting the system theme based on ambient brightness. From 8b5a9d2b6fa2fd4f234567e542024ca9a45d27b6 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 20:22:43 +0100 Subject: [PATCH 56/75] feat: Add beta feedback action * It leads to the play store for the user to send the beta feedback. * In-app reviews do not work with beta feedback. --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 32 ++++++++++++------- app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 0b59c06..5f69536 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -130,7 +130,7 @@ fun AdaptiveThemeScreen( ) }, actions = { - val noEmailClientMessage = stringResource(id = R.string.error_no_email_client) + stringResource(id = R.string.error_no_email_client) var menuExpanded by remember { mutableStateOf(false) } androidx.compose.foundation.layout.Box { IconButton(onClick = { menuExpanded = true }) { @@ -199,7 +199,6 @@ fun AdaptiveThemeScreen( context, "send_feedback" ) - onFeedbackClick() val encodedSubject = URLEncoder.encode( feedbackSubject, StandardCharsets.UTF_8.toString() @@ -207,18 +206,29 @@ fun AdaptiveThemeScreen( val feedbackUri = "https://lexip.dev/hecate/feedback?subject=$encodedSubject".toUri() val feedbackIntent = Intent(Intent.ACTION_VIEW, feedbackUri) - try { - context.startActivity(feedbackIntent) - } catch (_: ActivityNotFoundException) { - Toast.makeText( - context, - noEmailClientMessage, - Toast.LENGTH_SHORT - ).show() - } + context.startActivity(feedbackIntent) + } ) + // 3) Beta Feedback (only on beta builds) + if (BuildConfig.VERSION_NAME.contains("-beta")) { + DropdownMenuItem( + text = { Text(text = "Beta Feedback") }, + onClick = { + menuExpanded = false + AnalyticsLogger.logOverflowMenuItemClicked( + context, + "beta_feedback" + ) + val betaUri = + "https://play.google.com/store/apps/details?id=dev.lexip.hecate".toUri() + val betaIntent = Intent(Intent.ACTION_VIEW, betaUri) + context.startActivity(betaIntent) + } + ) + } + // 4) About DropdownMenuItem( text = { Text(stringResource(R.string.title_about)) }, diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 39edc17..d7287a4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -38,6 +38,7 @@ Diese App benötigt die Berechtigung WRITE_SECURE_SETTINGS, um das System-Theme Sprache ändern Feedback senden Benutzerdefinierte Schwelle + Beta Feedback Dunkel Schwach diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0d3cfb5..145afbf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -35,6 +35,7 @@ Change Language Send Feedback Custom Threshold + Beta Feedback Dark Dim From b0b0d678a3ca1b505e021ac9154194835c1ad47c Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 21:59:41 +0100 Subject: [PATCH 57/75] refactor: Use Android Sharesheet for URL sharing --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 5f69536..51f2d76 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -75,6 +75,22 @@ import dev.lexip.hecate.ui.theme.hecateTopAppBarColors import java.net.URLEncoder import java.nio.charset.StandardCharsets +// Helper to share via Android Sharesheet +private fun android.content.Context.shareSetupUrl(url: String) { + if (url.isBlank()) return + + val sendIntent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, url) + putExtra(Intent.EXTRA_TITLE, "Setup - Adaptive Theme") + type = "text/plain" + } + + val shareIntent = Intent.createChooser(sendIntent, null) + startActivity(shareIntent) + +} + @OptIn(ExperimentalMaterial3Api::class) @Composable fun AdaptiveThemeScreen( @@ -349,17 +365,7 @@ fun AdaptiveThemeScreen( } }, onShareSetupUrl = { url -> - val shareIntent = Intent().apply { - action = Intent.ACTION_SEND - putExtra(Intent.EXTRA_TEXT, url) - type = "text/plain" - } - val chooser = Intent.createChooser(shareIntent, null) - try { - context.startActivity(chooser) - } catch (_: Exception) { - // ignore if no activity can handle share - } + context.shareSetupUrl(url) }, onDismiss = { adaptiveThemeViewModel.dismissDialog() } ) From 9036c718a70d9f8a9d04009e43c71fa78c60f084 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 08:54:41 +0100 Subject: [PATCH 58/75] Revert "feat(broadcasts): Implement a 10% hyteresis ratio to avoid rapid toggles" This reverts commit d87d67f9b909f357f8dab686d6ecee986c93981d. This led to user confusion. --- .../lexip/hecate/broadcasts/ScreenOnReceiver.kt | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt b/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt index 51e43df..47583ff 100644 --- a/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt +++ b/app/src/main/java/dev/lexip/hecate/broadcasts/ScreenOnReceiver.kt @@ -19,10 +19,8 @@ import android.util.Log import dev.lexip.hecate.util.DarkThemeHandler import dev.lexip.hecate.util.LightSensorManager import dev.lexip.hecate.util.ProximitySensorManager -import kotlin.math.max private const val TAG = "ScreenOnReceiver" -private const val HYSTERESIS_RATIO = 0.10f // 10% /** * Adaptive theme switching logic. Executes when the screen is turned on. @@ -47,19 +45,7 @@ class ScreenOnReceiver( if (distance >= 5f) { lightSensorManager.startListening { lightValue -> lightSensorManager.stopListening() - - // Hysteresis around the configured threshold to avoid rapid toggles - val threshold = adaptiveThemeThresholdLux - val clampedThreshold = max(0f, threshold) - val lower = clampedThreshold * (1f - HYSTERESIS_RATIO) - val upper = clampedThreshold * (1f + HYSTERESIS_RATIO) - val isCurrentlyDark = darkThemeHandler.isDarkThemeEnabled() - - val shouldBeDark = - if (isCurrentlyDark) lightValue <= upper - else lightValue < lower - - darkThemeHandler.setDarkTheme(shouldBeDark) + darkThemeHandler.setDarkTheme(lightValue < adaptiveThemeThresholdLux) } } else Log.d(TAG, "Device is covered, skipping adaptive theme checks.") From e1de37a92d7ea0658973a75990d925f4bb026561 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 09:31:26 +0100 Subject: [PATCH 59/75] fix: Catch mysterious unsupported Android versions lower than minSDK * We get crashes from Android 11 devices, despite minSDK 31. * Fixes Fatal Exception: java.lang.NoSuchFieldError: No instance field fontWeightAdjustment of type I in class Landroid/content/res/Configuration; or its superclasses (declaration of 'android.content.res.Configuration' appears in /system/framework/framework.jar) --- .../java/dev/lexip/hecate/ui/MainActivity.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt index 7f90a0d..5d7ca82 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt @@ -12,7 +12,9 @@ package dev.lexip.hecate.ui +import android.os.Build import android.os.Bundle +import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge @@ -29,6 +31,18 @@ class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + // Catch mysterious unsupported SDK versions despite minSDK 31 + if (Build.VERSION.SDK_INT < 31) { + Toast.makeText( + this, + "Unsupported Android version, please uninstall the app.", + Toast.LENGTH_LONG + ).show() + finish() + return + } + installSplashScreen() enableEdgeToEdge() @@ -49,7 +63,5 @@ class MainActivity : ComponentActivity() { ) } } - } - } From 07bc8a21ade39083cf162c61424c1ec9f6a88529 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 10:01:10 +0100 Subject: [PATCH 60/75] feat: Add translations for 48 languages * EN and DE manual, rest auto-translated using Gemini models. --- app/build.gradle.kts | 3 +- app/src/main/AndroidManifest.xml | 3 +- app/src/main/res/xml/locales_config.xml | 52 +++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/xml/locales_config.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b47e5f9..1f3bb43 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -67,7 +67,8 @@ android { } } androidResources { - generateLocaleConfig = true + generateLocaleConfig = false + localeFilters.addAll(listOf("ar", "bn", "bg", "ca", "zh-rCN", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "el", "gu", "he", "hi", "hu", "is", "id", "it", "ja", "kn", "ko", "lv", "lt", "ml", "mr", "no", "fa", "pl", "pt", "pa", "ro", "ru", "sk", "sl", "es", "sw", "sv", "ta", "te", "th", "tr", "uk", "ur", "vi", "zu")) } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7a94703..0035573 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -32,7 +32,8 @@ android:supportsRtl="true" android:theme="@style/Theme.App.Starting" android:usesCleartextTraffic="false" - android:windowSoftInputMode="adjustResize"> + android:windowSoftInputMode="adjustResize" + android:localeConfig="@xml/locales_config"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From f4e20ea13fa75b2d49b1023040c1519f4dde65da Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 12:21:08 +0100 Subject: [PATCH 61/75] chore: Don't support tablets * Adaptive theme does not work on tablets atm. --- app/src/main/AndroidManifest.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0035573..fe5a6f7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,14 @@ + + Date: Fri, 5 Dec 2025 12:21:51 +0100 Subject: [PATCH 62/75] chore(analytics): Add analytics to the setup/permission dialog --- .../lexip/hecate/analytics/AnalyticsLogger.kt | 16 ++++++++++++++++ .../dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 2 ++ 2 files changed, 18 insertions(+) diff --git a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt index 8ddc82e..5f16fe8 100644 --- a/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt +++ b/app/src/main/java/dev/lexip/hecate/analytics/AnalyticsLogger.kt @@ -90,4 +90,20 @@ object AnalyticsLogger { } } } + + fun logViewWebsiteClicked(context: Context, source: String) { + ifAllowed { + analytics(context).logEvent("view_website_clicked") { + param("source", source) + } + } + } + + fun logShareLinkClicked(context: Context, source: String) { + ifAllowed { + analytics(context).logEvent("share_link_clicked") { + param("source", source) + } + } + } } diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 51f2d76..e6902a3 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -356,6 +356,7 @@ fun AdaptiveThemeScreen( show = showMissingPermissionDialog, setupUrl = "https://lexip.dev/setup", onOpenSetup = { + AnalyticsLogger.logViewWebsiteClicked(context, "permission_dialog") val setupUri = "https://lexip.dev/setup".toUri() val intent = Intent(Intent.ACTION_VIEW, setupUri) try { @@ -365,6 +366,7 @@ fun AdaptiveThemeScreen( } }, onShareSetupUrl = { url -> + AnalyticsLogger.logShareLinkClicked(context, "permission_dialog") context.shareSetupUrl(url) }, onDismiss = { adaptiveThemeViewModel.dismissDialog() } From cd7b522f181b09bb71569c71e6d4b22a77ca3fb7 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 19:05:25 +0100 Subject: [PATCH 63/75] fix(ui): Fix horizontal screen margin / window insets * Fixes the horizontal margins for three-button-navigation users. --- .../main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index e6902a3..1517f03 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -27,7 +27,7 @@ import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemGestures +import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll @@ -91,6 +91,8 @@ private fun android.content.Context.shareSetupUrl(url: String) { } +private val ScreenHorizontalMargin = 20.dp + @OptIn(ExperimentalMaterial3Api::class) @Composable fun AdaptiveThemeScreen( @@ -136,7 +138,7 @@ fun AdaptiveThemeScreen( topBar = { LargeTopAppBar( modifier = Modifier - .padding(horizontal = horizontalOffsetPadding) + .padding(start = ScreenHorizontalMargin - 8.dp) .padding(top = 22.dp, bottom = 12.dp), colors = hecateTopAppBarColors(), title = { @@ -275,9 +277,10 @@ fun AdaptiveThemeScreen( ) { innerPadding -> Column( modifier = Modifier - .windowInsetsPadding(WindowInsets.systemGestures.only(WindowInsetsSides.Horizontal)) .fillMaxSize() .padding(innerPadding) + .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom)) + .padding(horizontal = ScreenHorizontalMargin) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(32.dp) From 87697bc53dce4a72812983b684037fdd13be1d70 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 12:19:03 +0100 Subject: [PATCH 64/75] style: Improve main switch card behavior for longer texts * Improved multi-line support without crashing into the switch. --- .../lexip/hecate/ui/components/MainSwitchPreferenceCard.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt index 0de61b4..80f1d27 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/components/MainSwitchPreferenceCard.kt @@ -31,6 +31,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp @Composable @@ -50,9 +51,12 @@ fun MainSwitchPreferenceCard(text: String, isChecked: Boolean, onCheckedChange: horizontalArrangement = Arrangement.SpaceBetween ) { Text( + modifier = Modifier + .fillMaxWidth(0.75f), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.onPrimaryContainer, - text = text + text = text, + overflow = TextOverflow.Ellipsis ) Switch( checked = isChecked, From a3999659a7ecbed7293680a1eee6ebde22eac389 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:23:41 +0100 Subject: [PATCH 65/75] fix: Remove translations for Indonesian and Hebrew * The injection of the automatic translations does not work because of a language code mismatch hd/in and he/iw. --- app/src/main/res/xml/locales_config.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index cca96b0..eaa1c44 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -15,11 +15,9 @@ - - From 6d6c247fbd48a600d640889b1af99d2f4a833c06 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 14:50:50 +0100 Subject: [PATCH 66/75] chore: Minor updates and v0.6.0 beta --- app/build.gradle.kts | 104 +++++++++++++++++++------------------- build.gradle.kts | 4 +- gradle/libs.versions.toml | 18 +++---- 3 files changed, 64 insertions(+), 62 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1f3bb43..6f211a5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -9,13 +9,14 @@ plugins { android { namespace = "dev.lexip.hecate" compileSdk = 36 + buildToolsVersion = "36.0.0" defaultConfig { applicationId = "dev.lexip.hecate" minSdk = 31 targetSdk = 36 - versionCode = 8 - versionName = "0.3.1" + versionCode = 27 + versionName = "0.6.3" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -45,58 +46,59 @@ android { } } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - kotlin { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + + bundle { + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } - } - buildFeatures { - compose = true - buildConfig = true - } - buildToolsVersion = "36.0.0" - sourceSets { - getByName("main") { - resources { - srcDirs("src/main/resources", "src/main/java/components") + + kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + } + } + + buildFeatures { + compose = true + buildConfig = true + } + + sourceSets { + getByName("main") { + resources { + srcDirs("src/main/resources", "src/main/java/components") + } } } } - androidResources { - generateLocaleConfig = false - localeFilters.addAll(listOf("ar", "bn", "bg", "ca", "zh-rCN", "hr", "cs", "da", "nl", "en", "et", "fi", "fr", "de", "el", "gu", "he", "hi", "hu", "is", "id", "it", "ja", "kn", "ko", "lv", "lt", "ml", "mr", "no", "fa", "pl", "pt", "pa", "ro", "ru", "sk", "sl", "es", "sw", "sv", "ta", "te", "th", "tr", "uk", "ur", "vi", "zu")) - } -} -dependencies { - implementation(platform(libs.firebase.bom)) - implementation(libs.firebase.analytics) - implementation(libs.firebase.crashlytics) - implementation(libs.androidx.localbroadcastmanager) - implementation(libs.androidx.core.splashscreen.v100) - implementation(libs.androidx.activity.compose) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.datastore.preferences) - implementation(libs.androidx.lifecycle.runtime.ktx) - implementation(libs.androidx.lifecycle.viewmodel.compose) - implementation(libs.androidx.material3) - implementation(libs.androidx.preference) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) - implementation(libs.material) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.compose.material.icons.extended) - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.ui.test.junit4) - debugImplementation(libs.androidx.ui.tooling) - debugImplementation(libs.androidx.ui.test.manifest) + dependencies { + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.analytics) + implementation(libs.firebase.crashlytics) + implementation(libs.androidx.localbroadcastmanager) + implementation(libs.androidx.core.splashscreen.v100) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.androidx.material3) + implementation(libs.androidx.preference) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.material) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.material.icons.extended) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) + } } \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 734332f..6877d6d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false - id("org.sonarqube") version "7.0.1.6134" + id("org.sonarqube") version "7.1.0.6387" id("com.google.gms.google-services") version "4.4.4" apply false alias(libs.plugins.google.firebase.crashlytics) apply false } @@ -11,7 +11,7 @@ plugins { sonar { properties { property("sonar.projectKey", "xLexip_Hecate") - property("sonar.projectVersion", "0.3.1") + property("sonar.projectVersion", "0.6.0") property("sonar.organization", "xlexip") property("sonar.host.url", "https://sonarcloud.io") property("sonar.androidLint.reportPaths", "app/build/reports/lint-results-debug.html") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8e6992d..f62f602 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,21 +1,21 @@ [versions] -activityCompose = "1.11.0" -agp = "8.13.0" +activityCompose = "1.12.0" +agp = "8.13.1" appcompat = "1.7.1" -composeBom = "2025.10.01" +composeBom = "2025.11.01" coreKtx = "1.17.0" -coreSplashscreenVersion = "1.0.1" -datastorePreferencesCore = "1.1.7" +coreSplashscreenVersion = "1.2.0" +datastorePreferencesCore = "1.2.0" espressoCore = "3.7.0" -firebaseBom = "34.5.0" +firebaseBom = "34.6.0" firebaseAnalytics = "23.0.0" firebaseCrashlytics = "20.0.3" googleFirebaseCrashlytics = "3.0.6" junit = "4.13.2" junitVersion = "1.3.0" kotlin = "2.2.21" -lifecycleRuntimeKtx = "2.9.4" -lifecycleViewmodelCompose = "2.9.4" +lifecycleRuntimeKtx = "2.10.0" +lifecycleViewmodelCompose = "2.10.0" localbroadcastmanager = "1.1.0" material = "1.13.0" preference = "1.2.1" @@ -38,7 +38,7 @@ androidx-preference = { group = "androidx.preference", name = "preference", vers androidx-ui = { group = "androidx.compose.ui", name = "ui" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } -androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version = "1.8.0" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version = "1.9.5" } androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } From c72a7232429dd664538c09c81a594210f82cc212 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 14:50:51 +0100 Subject: [PATCH 67/75] chore: Disable language splitting * For seamless language switching. * May be reverted later. --- app/build.gradle.kts | 5 +++++ app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6f211a5..7734f34 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -59,6 +59,11 @@ android { } } + language { + @Suppress("UnstableApiUsage") + enableSplit = false + } + buildFeatures { compose = true buildConfig = true diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 1517f03..f19711d 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -193,7 +193,6 @@ fun AdaptiveThemeScreen( val intent = Intent(Settings.ACTION_APP_LOCALE_SETTINGS).apply { data = "package:$packageName".toUri() - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } try { context.startActivity(intent) From 29d79f907954904383bc74b8c34d037efa809dce Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 14:50:51 +0100 Subject: [PATCH 68/75] Revert "fix: Remove translations for Indonesian and Hebrew" This reverts commit 026bad86ee2d54e8818553cede2fa25da52a4265. --- app/src/main/res/xml/locales_config.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml index eaa1c44..cca96b0 100644 --- a/app/src/main/res/xml/locales_config.xml +++ b/app/src/main/res/xml/locales_config.xml @@ -15,9 +15,11 @@ + + From 35bcdb6d8d7f5b97e5134890f4f7b2578f9b119b Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 14:50:51 +0100 Subject: [PATCH 69/75] feat: Implement in-app update prompts * Full-screen (immediate) prompts for the beta phase --- app/build.gradle.kts | 56 +++---- .../dev/lexip/hecate/ui/InAppUpdateManager.kt | 153 ++++++++++++++++++ .../java/dev/lexip/hecate/ui/MainActivity.kt | 14 ++ gradle/libs.versions.toml | 2 + 4 files changed, 197 insertions(+), 28 deletions(-) create mode 100644 app/src/main/java/dev/lexip/hecate/ui/InAppUpdateManager.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7734f34..064bb14 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -78,32 +78,32 @@ android { } } - dependencies { - implementation(platform(libs.firebase.bom)) - implementation(libs.firebase.analytics) - implementation(libs.firebase.crashlytics) - implementation(libs.androidx.localbroadcastmanager) - implementation(libs.androidx.core.splashscreen.v100) - implementation(libs.androidx.activity.compose) - implementation(libs.androidx.appcompat) - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.datastore.preferences) - implementation(libs.androidx.lifecycle.runtime.ktx) - implementation(libs.androidx.lifecycle.viewmodel.compose) - implementation(libs.androidx.material3) - implementation(libs.androidx.preference) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) - implementation(libs.material) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.compose.material.icons.extended) - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.ui.test.junit4) - debugImplementation(libs.androidx.ui.tooling) - debugImplementation(libs.androidx.ui.test.manifest) - } +dependencies { + implementation(platform(libs.firebase.bom)) + implementation(libs.firebase.analytics) + implementation(libs.firebase.crashlytics) + implementation(libs.androidx.localbroadcastmanager) + implementation(libs.androidx.core.splashscreen.v100) + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.datastore.preferences) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) + implementation(libs.androidx.material3) + implementation(libs.androidx.preference) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.material) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.material.icons.extended) + implementation(libs.app.update.ktx) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) } \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/ui/InAppUpdateManager.kt b/app/src/main/java/dev/lexip/hecate/ui/InAppUpdateManager.kt new file mode 100644 index 0000000..148c8a8 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/InAppUpdateManager.kt @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui + +import android.app.Activity +import android.util.Log +import android.widget.Toast +import androidx.activity.ComponentActivity +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.IntentSenderRequest +import androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult +import com.google.android.play.core.appupdate.AppUpdateManager +import com.google.android.play.core.appupdate.AppUpdateManagerFactory +import com.google.android.play.core.appupdate.AppUpdateOptions +import com.google.android.play.core.install.model.AppUpdateType +import com.google.android.play.core.install.model.UpdateAvailability + +private const val TAG = "InAppUpdateManager" +private const val DAYS_FOR_IMMEDIATE_UPDATE = 0 +private const val MIN_PRIORITY_FOR_IMMEDIATE = 0 + +class InAppUpdateManager(activity: ComponentActivity) { + + private val appUpdateManager: AppUpdateManager = AppUpdateManagerFactory.create(activity) + + private var updateLauncher: ActivityResultLauncher? = null + + fun registerUpdateLauncher(activity: ComponentActivity) { + if (updateLauncher != null) return + + updateLauncher = + activity.registerForActivityResult(StartIntentSenderForResult()) { result -> + when (result.resultCode) { + Activity.RESULT_OK -> { + Log.d(TAG, "In-app update completed successfully") + } + + Activity.RESULT_CANCELED -> { + Log.w(TAG, "In-app update was cancelled by the user") + Toast.makeText( + activity, + "Update cancelled. You can update later from the Play Store.", + Toast.LENGTH_SHORT + ).show() + } + + else -> { + Log.e(TAG, "In-app update failed with resultCode=${result.resultCode}") + Toast.makeText( + activity, + "Update failed to start. Please try again later.", + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + fun checkForImmediateUpdate( + onNoUpdate: () -> Unit = {}, + onError: (Throwable) -> Unit = {} + ) { + val launcher = updateLauncher + if (launcher == null) { + Log.w(TAG, "checkForImmediateUpdate called before launcher was registered") + return + } + + appUpdateManager.appUpdateInfo + .addOnSuccessListener { appUpdateInfo -> + val availability = appUpdateInfo.updateAvailability() + val isImmediateAllowed = appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) + val staleness = appUpdateInfo.clientVersionStalenessDays() ?: -1 + val priority = appUpdateInfo.updatePriority() + + Log.d( + TAG, + "Update info: availability=$availability, immediateAllowed=$isImmediateAllowed, stalenessDays=$staleness, priority=$priority" + ) + + val meetsStaleness = staleness == -1 || staleness >= DAYS_FOR_IMMEDIATE_UPDATE + val meetsPriority = priority >= MIN_PRIORITY_FOR_IMMEDIATE + + if (availability == UpdateAvailability.UPDATE_AVAILABLE && isImmediateAllowed && meetsStaleness && meetsPriority) { + Log.d(TAG, "Immediate update available, starting update flow") + try { + appUpdateManager.startUpdateFlowForResult( + appUpdateInfo, + launcher, + AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build() + ) + } catch (t: Throwable) { + Log.e(TAG, "Failed to launch immediate in-app update", t) + onError(t) + } + } else { + Log.d( + TAG, + "No eligible immediate update. availability=$availability, immediateAllowed=$isImmediateAllowed" + ) + onNoUpdate() + } + } + .addOnFailureListener { throwable -> + Log.e(TAG, "Failed to retrieve appUpdateInfo", throwable) + onError(throwable) + } + } + + fun resumeImmediateUpdateIfNeeded() { + val launcher = updateLauncher + if (launcher == null) { + Log.w(TAG, "resumeImmediateUpdateIfNeeded called before launcher was registered") + return + } + + appUpdateManager.appUpdateInfo + .addOnSuccessListener { appUpdateInfo -> + if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS && + appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE) + ) { + Log.d(TAG, "Resuming in-progress immediate in-app update") + try { + appUpdateManager.startUpdateFlowForResult( + appUpdateInfo, + launcher, + AppUpdateOptions.newBuilder(AppUpdateType.IMMEDIATE).build() + ) + } catch (t: Throwable) { + Log.e(TAG, "Failed to resume immediate in-app update", t) + } + } else { + Log.d( + TAG, + "No in-progress immediate update to resume. availability=${appUpdateInfo.updateAvailability()}" + ) + } + } + .addOnFailureListener { throwable -> + Log.e(TAG, "Failed to check for in-progress immediate update", throwable) + } + } +} diff --git a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt index 5d7ca82..4e40ed2 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt @@ -29,6 +29,8 @@ import dev.lexip.hecate.util.DarkThemeHandler class MainActivity : ComponentActivity() { + private lateinit var inAppUpdateManager: InAppUpdateManager + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -46,6 +48,9 @@ class MainActivity : ComponentActivity() { installSplashScreen() enableEdgeToEdge() + inAppUpdateManager = InAppUpdateManager(this) + inAppUpdateManager.registerUpdateLauncher(this) + setContent { val dataStore = (this.applicationContext as HecateApplication).userPreferencesDataStore val adaptiveThemeViewModel: AdaptiveThemeViewModel = viewModel( @@ -63,5 +68,14 @@ class MainActivity : ComponentActivity() { ) } } + + inAppUpdateManager.checkForImmediateUpdate() + } + + override fun onResume() { + super.onResume() + if (::inAppUpdateManager.isInitialized) { + inAppUpdateManager.resumeImmediateUpdateIfNeeded() + } } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f62f602..991d36f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,6 +2,7 @@ activityCompose = "1.12.0" agp = "8.13.1" appcompat = "1.7.1" +appUpdateKtx = "2.1.0" composeBom = "2025.11.01" coreKtx = "1.17.0" coreSplashscreenVersion = "1.2.0" @@ -41,6 +42,7 @@ androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version = "1.9.5" } androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +app-update-ktx = { module = "com.google.android.play:app-update-ktx", version.ref = "appUpdateKtx" } firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } junit = { group = "junit", name = "junit", version.ref = "junit" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } From 13eada505fc9f2c78e87fb5b1a31be9a85bf789e Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 14:50:51 +0100 Subject: [PATCH 70/75] fix: Make adaptive theme screen scrollable on small devices --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 31 +++++++++++++------ .../java/dev/lexip/hecate/ui/theme/Theme.kt | 2 +- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index f19711d..ed001a1 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -22,13 +22,8 @@ import android.provider.Settings import android.widget.Toast import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.safeDrawing -import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons @@ -99,8 +94,14 @@ fun AdaptiveThemeScreen( uiState: AdaptiveThemeUiState, onAboutClick: () -> Unit = {} ) { - val scrollBehavior = - TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) + // Enable top-app-bar collapsing on small devices + val configuration = androidx.compose.ui.platform.LocalConfiguration.current + val screenHeightDp = configuration.screenHeightDp + val enableCollapsing = screenHeightDp < 700 + val scrollBehavior = if (enableCollapsing) { + TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()) + } else null + val horizontalOffsetPadding = 8.dp val context = LocalContext.current @@ -133,9 +134,17 @@ fun AdaptiveThemeScreen( Scaffold( modifier = Modifier - .nestedScroll(scrollBehavior.nestedScrollConnection), + .fillMaxSize() + .then( + if (scrollBehavior != null) { + Modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + } else { + Modifier + } + ), containerColor = MaterialTheme.colorScheme.surfaceContainer, topBar = { + val collapsedFraction = scrollBehavior?.state?.collapsedFraction ?: 0f LargeTopAppBar( modifier = Modifier .padding(start = ScreenHorizontalMargin - 8.dp) @@ -144,7 +153,11 @@ fun AdaptiveThemeScreen( title = { Text( text = stringResource(id = R.string.app_name), - style = MaterialTheme.typography.displaySmall, + style = if (collapsedFraction > 0.4f) { + MaterialTheme.typography.titleLarge + } else { + MaterialTheme.typography.displaySmall + } ) }, actions = { diff --git a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt index 02a1e32..002bcd1 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/theme/Theme.kt @@ -88,7 +88,7 @@ fun HecateTheme( fun hecateTopAppBarColors(): TopAppBarColors = TopAppBarDefaults.topAppBarColors( // This represents the top app bar style of the android system settings app in Android 15. containerColor = MaterialTheme.colorScheme.surfaceContainer, - scrolledContainerColor = MaterialTheme.colorScheme.surfaceVariant, + scrolledContainerColor = MaterialTheme.colorScheme.surfaceContainer, navigationIconContentColor = MaterialTheme.colorScheme.onSurface, titleContentColor = MaterialTheme.colorScheme.onSurface, actionIconContentColor = MaterialTheme.colorScheme.onSurface From 9976fcb6556253e0c4fb9dd9813ac5607c06b201 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 16:00:01 +0100 Subject: [PATCH 71/75] feat: Implement setup wizard --- .../hecate/data/UserPreferencesRepository.kt | 19 +- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 226 +++++++- .../lexip/hecate/ui/AdaptiveThemeViewModel.kt | 73 ++- .../ui/components/PermissionMissingDialog.kt | 80 --- .../hecate/ui/setup/PermissionSetupCommon.kt | 246 ++++++++ .../hecate/ui/setup/PermissionSetupSteps.kt | 548 ++++++++++++++++++ .../ui/setup/PermissionSetupWizardScreen.kt | 149 +++++ app/src/main/res/values-de/strings.xml | 73 ++- app/src/main/res/values/strings.xml | 68 ++- 9 files changed, 1328 insertions(+), 154 deletions(-) delete mode 100644 app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt create mode 100644 app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt create mode 100644 app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt create mode 100644 app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupWizardScreen.kt diff --git a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt index 90e8254..e0b6a99 100644 --- a/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt +++ b/app/src/main/java/dev/lexip/hecate/data/UserPreferencesRepository.kt @@ -30,7 +30,8 @@ private const val TAG = "UserPreferencesRepository" data class UserPreferences( val adaptiveThemeEnabled: Boolean, val adaptiveThemeThresholdLux: Float, - val customAdaptiveThemeThresholdLux: Float? = null + val customAdaptiveThemeThresholdLux: Float? = null, + val permissionWizardCompleted: Boolean = false ) class UserPreferencesRepository(private val dataStore: DataStore) { @@ -40,6 +41,7 @@ class UserPreferencesRepository(private val dataStore: DataStore) { val ADAPTIVE_THEME_THRESHOLD_LUX = floatPreferencesKey("adaptive_theme_threshold_lux") val CUSTOM_ADAPTIVE_THEME_THRESHOLD_LUX = floatPreferencesKey("custom_adaptive_theme_threshold_lux") + val PERMISSION_WIZARD_COMPLETED = booleanPreferencesKey("permission_wizard_completed") } val userPreferencesFlow: Flow = dataStore.data @@ -59,7 +61,7 @@ class UserPreferencesRepository(private val dataStore: DataStore) { mapUserPreferences(dataStore.data.first().toPreferences()) - suspend fun ensureAdaptiveThemeThresholdDefault(default: Float = AdaptiveThreshold.BRIGHT.lux) { + suspend fun ensureAdaptiveThemeThresholdDefault(default: Float = AdaptiveThreshold.DAYLIGHT.lux) { dataStore.edit { preferences -> if (preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] == null) { preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] = default @@ -71,13 +73,16 @@ class UserPreferencesRepository(private val dataStore: DataStore) { val adaptiveThemeEnabled = preferences[PreferencesKeys.ADAPTIVE_THEME_ENABLED] == true val adaptiveThemeThresholdLux = preferences[PreferencesKeys.ADAPTIVE_THEME_THRESHOLD_LUX] - ?: AdaptiveThreshold.BRIGHT.lux + ?: AdaptiveThreshold.DAYLIGHT.lux val customAdaptiveThemeThresholdLux = preferences[PreferencesKeys.CUSTOM_ADAPTIVE_THEME_THRESHOLD_LUX] + val permissionWizardCompleted = + preferences[PreferencesKeys.PERMISSION_WIZARD_COMPLETED] == true return UserPreferences( adaptiveThemeEnabled = adaptiveThemeEnabled, adaptiveThemeThresholdLux = adaptiveThemeThresholdLux, - customAdaptiveThemeThresholdLux = customAdaptiveThemeThresholdLux + customAdaptiveThemeThresholdLux = customAdaptiveThemeThresholdLux, + permissionWizardCompleted = permissionWizardCompleted ) } @@ -107,4 +112,10 @@ class UserPreferencesRepository(private val dataStore: DataStore) { } } + suspend fun updatePermissionWizardCompleted(completed: Boolean) { + dataStore.edit { preferences -> + preferences[PreferencesKeys.PERMISSION_WIZARD_COMPLETED] = completed + } + } + } \ No newline at end of file diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index ed001a1..5b46a4c 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -62,10 +62,11 @@ import dev.lexip.hecate.R import dev.lexip.hecate.analytics.AnalyticsLogger import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.ui.components.MainSwitchPreferenceCard -import dev.lexip.hecate.ui.components.PermissionMissingDialog import dev.lexip.hecate.ui.components.preferences.CustomThresholdDialog import dev.lexip.hecate.ui.components.preferences.ProgressDetailCard import dev.lexip.hecate.ui.components.preferences.SliderDetailCard +import dev.lexip.hecate.ui.setup.PermissionSetupWizardScreen +import dev.lexip.hecate.ui.setup.PermissionWizardStep import dev.lexip.hecate.ui.theme.hecateTopAppBarColors import java.net.URLEncoder import java.nio.charset.StandardCharsets @@ -116,7 +117,7 @@ fun AdaptiveThemeScreen( ) ) - val showMissingPermissionDialog by adaptiveThemeViewModel.showMissingPermissionDialog.collectAsState() + val internalUiState by adaptiveThemeViewModel.uiState.collectAsState() val showCustomDialog = remember { mutableStateOf(false) } @@ -291,7 +292,6 @@ fun AdaptiveThemeScreen( modifier = Modifier .fillMaxSize() .padding(innerPadding) - .windowInsetsPadding(WindowInsets.safeDrawing.only(WindowInsetsSides.Bottom)) .padding(horizontal = ScreenHorizontalMargin) .verticalScroll(rememberScrollState()), verticalArrangement = Arrangement.spacedBy(32.dp) @@ -366,26 +366,212 @@ fun AdaptiveThemeScreen( } } + // Show permission wizard if needed + if (internalUiState.showPermissionWizard) { + var isDeveloperOptionsEnabled by remember { mutableStateOf(false) } + var isUsbDebuggingEnabled by remember { mutableStateOf(false) } + var isUsbConnected by remember { mutableStateOf(false) } + var hasPermission by remember { mutableStateOf(false) } - PermissionMissingDialog( - show = showMissingPermissionDialog, - setupUrl = "https://lexip.dev/setup", - onOpenSetup = { - AnalyticsLogger.logViewWebsiteClicked(context, "permission_dialog") - val setupUri = "https://lexip.dev/setup".toUri() - val intent = Intent(Intent.ACTION_VIEW, setupUri) - try { - context.startActivity(intent) + // Periodically check developer settings and permission status + LaunchedEffect(Unit) { + var previousDevOptionsState = try { + Settings.Global.getInt( + context.contentResolver, + Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, + 0 + ) == 1 } catch (_: Exception) { - context.startActivity(Intent(Intent.ACTION_VIEW, setupUri)) + false } - }, - onShareSetupUrl = { url -> - AnalyticsLogger.logShareLinkClicked(context, "permission_dialog") - context.shareSetupUrl(url) - }, - onDismiss = { adaptiveThemeViewModel.dismissDialog() } - ) + + var previousUsbDebuggingState = try { + Settings.Global.getInt( + context.contentResolver, + Settings.Global.ADB_ENABLED, + 0 + ) == 1 + } catch (_: Exception) { + false + } + + var previousUsbConnected = false + + // Observe USB state via sticky broadcast and runtime receiver + val usbFilter = + android.content.IntentFilter("android.hardware.usb.action.USB_STATE") + val sticky = context.registerReceiver(null, usbFilter) + fun parseUsbIntent(intent: Intent?): Boolean { + if (intent == null) return false + val extras = intent.extras ?: return false + val connected = extras.getBoolean("connected", false) + val configured = extras.getBoolean("configured", false) + val dataConnected = extras.getBoolean("data_connected", false) + val adb = extras.getBoolean("adb", false) + val hostConnected = extras.getBoolean("host_connected", false) + return connected && (configured || dataConnected || adb || hostConnected) + } + isUsbConnected = parseUsbIntent(sticky) + previousUsbConnected = isUsbConnected + + val runtimeReceiver = object : android.content.BroadcastReceiver() { + override fun onReceive( + ctx: android.content.Context?, + intent: Intent? + ) { + val nowConnected = parseUsbIntent(intent) + if (!previousUsbConnected && nowConnected) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + isUsbConnected = nowConnected + previousUsbConnected = nowConnected + } + } + context.registerReceiver(runtimeReceiver, usbFilter) + + try { + // Fallback: check attached USB devices via UsbManager + val usbManager = + context.getSystemService(android.content.Context.USB_SERVICE) as? android.hardware.usb.UsbManager + val nowConnected = (usbManager?.deviceList?.isNotEmpty() == true) + if (!previousUsbConnected && nowConnected) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + isUsbConnected = isUsbConnected || nowConnected + previousUsbConnected = isUsbConnected + } catch (_: Exception) { /* ignore */ + } + + try { + while (true) { + isDeveloperOptionsEnabled = try { + Settings.Global.getInt( + context.contentResolver, + Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, + 0 + ) == 1 + } catch (_: Exception) { + false + } + + isUsbDebuggingEnabled = try { + Settings.Global.getInt( + context.contentResolver, + Settings.Global.ADB_ENABLED, + 0 + ) == 1 + } catch (_: Exception) { + false + } + + hasPermission = ContextCompat.checkSelfPermission( + context, Manifest.permission.WRITE_SECURE_SETTINGS + ) == PackageManager.PERMISSION_GRANTED + + if (!previousDevOptionsState && isDeveloperOptionsEnabled) { + Toast.makeText( + context, + context.getString(R.string.permission_wizard_dev_options_enabled_toast), + Toast.LENGTH_LONG + ).show() + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + + if (!previousUsbDebuggingState && isUsbDebuggingEnabled) { + Toast.makeText( + context, + context.getString(R.string.permission_wizard_usb_debugging_enabled_toast), + Toast.LENGTH_LONG + ).show() + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + + previousDevOptionsState = isDeveloperOptionsEnabled + previousUsbDebuggingState = isUsbDebuggingEnabled + + // Fallback refresh: if sticky broadcast wasn’t conclusive, re-check UsbManager + if (!isUsbConnected) { + val usbManager = + context.getSystemService(android.content.Context.USB_SERVICE) as? android.hardware.usb.UsbManager + val nowConnected = usbManager?.deviceList?.isNotEmpty() == true + if (!previousUsbConnected && nowConnected) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + isUsbConnected = nowConnected + previousUsbConnected = nowConnected + } + + // If permission becomes granted, auto-complete wizard and enable service + if (hasPermission) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + adaptiveThemeViewModel.completePermissionWizardAndEnableService() + break + } + + // Check every second + kotlinx.coroutines.delay(1000) + } + } finally { + context.unregisterReceiver(runtimeReceiver) + } + } + + val adbCommand by adaptiveThemeViewModel.pendingAdbCommand.collectAsState() + + PermissionSetupWizardScreen( + step = internalUiState.permissionWizardStep, + adbCommand = adbCommand, + isUsbConnected = isUsbConnected, + hasWriteSecureSettings = hasPermission, + isDeveloperOptionsEnabled = isDeveloperOptionsEnabled, + isUsbDebuggingEnabled = isUsbDebuggingEnabled, + onNext = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + if (internalUiState.permissionWizardStep == PermissionWizardStep.GRANT_PERMISSION && hasPermission) { + adaptiveThemeViewModel.completePermissionWizardAndEnableService() + } else { + adaptiveThemeViewModel.goToNextPermissionWizardStep() + } + }, + onExit = { adaptiveThemeViewModel.dismissPermissionWizard() }, + onOpenSettings = { + val intent = Intent(Settings.ACTION_DEVICE_INFO_SETTINGS) + try { + context.startActivity(intent) + } catch (_: Exception) { + context.startActivity(Intent(Settings.ACTION_SETTINGS)) + } + }, + onOpenDeveloperSettings = { + val intent = Intent(Settings.ACTION_APPLICATION_DEVELOPMENT_SETTINGS) + try { + context.startActivity(intent) + } catch (_: Exception) { + context.startActivity(Intent(Settings.ACTION_SETTINGS)) + } + }, + onShareSetupUrl = { + AnalyticsLogger.logShareLinkClicked(context, "permission_wizard") + context.shareSetupUrl("https://lexip.dev/setup") + }, + onCopyAdbCommand = { adaptiveThemeViewModel.requestCopyAdbCommand() }, + onShareExpertCommand = { + context.shareSetupUrl(adbCommand) + }, + onCheckPermission = { + val nowGranted = + ContextCompat.checkSelfPermission( + context, Manifest.permission.WRITE_SECURE_SETTINGS + ) == PackageManager.PERMISSION_GRANTED + adaptiveThemeViewModel.recheckWriteSecureSettingsPermission(nowGranted) + if (nowGranted) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + adaptiveThemeViewModel.completePermissionWizardAndEnableService() + } + } + ) + return + } CustomThresholdDialog( show = showCustomDialog.value, diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt index f185d26..67559d2 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeViewModel.kt @@ -22,6 +22,7 @@ import dev.lexip.hecate.analytics.AnalyticsLogger import dev.lexip.hecate.data.AdaptiveThreshold import dev.lexip.hecate.data.UserPreferencesRepository import dev.lexip.hecate.services.BroadcastReceiverService +import dev.lexip.hecate.ui.setup.PermissionWizardStep import dev.lexip.hecate.util.DarkThemeHandler import dev.lexip.hecate.util.LightSensorManager import kotlinx.coroutines.channels.BufferOverflow @@ -38,8 +39,13 @@ sealed interface UiEvent { data class AdaptiveThemeUiState( val adaptiveThemeEnabled: Boolean = false, - val adaptiveThemeThresholdLux: Float = AdaptiveThreshold.BRIGHT.lux, - val customAdaptiveThemeThresholdLux: Float? = null + val adaptiveThemeThresholdLux: Float = 1000f, + val customAdaptiveThemeThresholdLux: Float? = null, + val showPermissionWizard: Boolean = false, + val permissionWizardStep: PermissionWizardStep = PermissionWizardStep.ENABLE_DEVELOPER_MODE, + val permissionWizardCompleted: Boolean = false, + val hasAutoAdvancedFromDeveloperMode: Boolean = false, + val hasAutoAdvancedFromConnectUsb: Boolean = false ) class AdaptiveThemeViewModel( @@ -60,9 +66,7 @@ class AdaptiveThemeViewModel( ) val uiEvents = _uiEvents.asSharedFlow() - // Permission Error Dialog - private val _showMissingPermissionDialog = MutableStateFlow(false) - val showMissingPermissionDialog: StateFlow = _showMissingPermissionDialog.asStateFlow() + // Wizard + pending ADB command private val _pendingAdbCommand = MutableStateFlow("") val pendingAdbCommand: StateFlow = _pendingAdbCommand.asStateFlow() @@ -87,7 +91,8 @@ class AdaptiveThemeViewModel( _uiState.value = AdaptiveThemeUiState( adaptiveThemeEnabled = userPreferences.adaptiveThemeEnabled, adaptiveThemeThresholdLux = userPreferences.adaptiveThemeThresholdLux, - customAdaptiveThemeThresholdLux = userPreferences.customAdaptiveThemeThresholdLux + customAdaptiveThemeThresholdLux = userPreferences.customAdaptiveThemeThresholdLux, + permissionWizardCompleted = userPreferences.permissionWizardCompleted ) if (userPreferences.adaptiveThemeEnabled) startLightSensorListening() @@ -118,8 +123,8 @@ class AdaptiveThemeViewModel( } /** - * Toggle adaptive theme service or show permission dialog. - * @return true if service was toggled, false if permission dialog is shown. + * Toggle adaptive theme service or show permission wizard. + * @return true if service was toggled, false if permission wizard is shown. */ fun onServiceToggleRequested( checked: Boolean, @@ -127,10 +132,7 @@ class AdaptiveThemeViewModel( packageName: String ): Boolean { if (checked && !hasPermission) { - _pendingAdbCommand.value = - "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" - _showMissingPermissionDialog.value = true - // Log permission error shown + startPermissionWizard(packageName) AnalyticsLogger.logPermissionErrorShown( application.applicationContext, reason = "missing_write_secure_settings", @@ -138,13 +140,54 @@ class AdaptiveThemeViewModel( ) return false } - _showMissingPermissionDialog.value = false updateAdaptiveThemeEnabled(checked) return true } - fun dismissDialog() { - _showMissingPermissionDialog.value = false + private fun startPermissionWizard(packageName: String) { + _pendingAdbCommand.value = + "adb shell pm grant $packageName android.permission.WRITE_SECURE_SETTINGS" + _uiState.value = _uiState.value.copy( + showPermissionWizard = true, + permissionWizardStep = PermissionWizardStep.ENABLE_DEVELOPER_MODE + ) + } + + fun goToNextPermissionWizardStep() { + val next = when (_uiState.value.permissionWizardStep) { + PermissionWizardStep.ENABLE_DEVELOPER_MODE -> PermissionWizardStep.CONNECT_USB + PermissionWizardStep.CONNECT_USB -> PermissionWizardStep.GRANT_PERMISSION + PermissionWizardStep.GRANT_PERMISSION -> PermissionWizardStep.GRANT_PERMISSION + } + _uiState.value = _uiState.value.copy(permissionWizardStep = next) + } + + fun goToPreviousPermissionWizardStep() { + val prev = when (_uiState.value.permissionWizardStep) { + PermissionWizardStep.ENABLE_DEVELOPER_MODE -> PermissionWizardStep.ENABLE_DEVELOPER_MODE + PermissionWizardStep.CONNECT_USB -> PermissionWizardStep.ENABLE_DEVELOPER_MODE + PermissionWizardStep.GRANT_PERMISSION -> PermissionWizardStep.CONNECT_USB + } + _uiState.value = _uiState.value.copy(permissionWizardStep = prev) + } + + fun dismissPermissionWizard() { + _uiState.value = _uiState.value.copy(showPermissionWizard = false) + } + + fun recheckWriteSecureSettingsPermission(granted: Boolean) { + if (granted) { + _uiState.value = + _uiState.value.copy(permissionWizardStep = PermissionWizardStep.GRANT_PERMISSION) + } + } + + fun completePermissionWizardAndEnableService() { + viewModelScope.launch { + userPreferencesRepository.updatePermissionWizardCompleted(true) + dismissPermissionWizard() + updateAdaptiveThemeEnabled(true) + } } fun requestCopyAdbCommand() { diff --git a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt b/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt deleted file mode 100644 index 7c75170..0000000 --- a/app/src/main/java/dev/lexip/hecate/ui/components/PermissionMissingDialog.kt +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2025 xLexip - * - * Licensed under the GNU General Public License, Version 3.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.gnu.org/licenses/gpl-3.0 - * - * Please see the License for specific terms regarding permissions and limitations. - */ - -package dev.lexip.hecate.ui.components - -import androidx.compose.foundation.layout.Column -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.hapticfeedback.HapticFeedbackType -import androidx.compose.ui.platform.LocalHapticFeedback -import androidx.compose.ui.res.stringResource -import dev.lexip.hecate.R - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun PermissionMissingDialog( - show: Boolean, - setupUrl: String, - onOpenSetup: () -> Unit, - onShareSetupUrl: (String) -> Unit, - onDismiss: () -> Unit -) { - if (!show) return - - val haptic = LocalHapticFeedback.current - - AlertDialog( - onDismissRequest = onDismiss, - title = { Text(text = stringResource(id = R.string.title_missing_permission)) }, - text = { - // Show description text and extra action buttons in a Column - Column { - Text( - text = stringResource( - id = R.string.description_missing_permission, - setupUrl - ) - ) - - TextButton(onClick = { - onOpenSetup() - haptic.performHapticFeedback(HapticFeedbackType.ContextClick) - }, modifier = Modifier.align(Alignment.CenterHorizontally)) { - Text(text = stringResource(id = R.string.action_view_website)) - } - - - } - }, - confirmButton = { - Button(onClick = { - haptic.performHapticFeedback(HapticFeedbackType.ContextClick) - onShareSetupUrl(setupUrl) - }) { - Text(text = stringResource(id = R.string.action_share_setup_url)) - } - }, - dismissButton = { - OutlinedButton(onClick = onDismiss) { - Text(text = stringResource(id = R.string.action_close)) - } - } - ) -} diff --git a/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt new file mode 100644 index 0000000..58037da --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.setup + +import android.widget.Toast +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +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.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.outlined.Circle +import androidx.compose.material.icons.outlined.ExpandLess +import androidx.compose.material.icons.outlined.ExpandMore +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +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.scale +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import dev.lexip.hecate.R + +@Composable +internal fun StatusCard( + isCompleted: Boolean, + title: String, + onClick: (() -> Unit)? = null, + isWaiting: Boolean = false +) { + val cardColors = if (isCompleted) { + CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.primaryContainer, + ) + } else { + CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surface, + ) + } + + val pulseScale = remember { Animatable(0.8f) } + + LaunchedEffect(isWaiting) { + if (isWaiting) { + pulseScale.animateTo( + targetValue = 1.2f, + animationSpec = infiniteRepeatable( + animation = tween(durationMillis = 750, easing = LinearOutSlowInEasing), + repeatMode = RepeatMode.Reverse + ) + ) + } else { + pulseScale.snapTo(1.0f) + } + } + + Card( + onClick = onClick ?: {}, + enabled = onClick != null, + modifier = Modifier + .fillMaxWidth() + .height(80.dp), + colors = cardColors + ) { + Row( + modifier = Modifier + .fillMaxSize() + .padding(20.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.weight(1f) + ) { + val icon = if (isCompleted && !isWaiting) { + Icons.Filled.CheckCircle + } else { + Icons.Outlined.Circle + } + Icon( + imageVector = icon, + contentDescription = null, + modifier = Modifier + .size(32.dp) + .scale(pulseScale.value), + tint = if (isCompleted && !isWaiting) + MaterialTheme.colorScheme.primary + else + MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(modifier = Modifier.width(16.dp)) + Text( + text = title, + style = MaterialTheme.typography.titleMedium, + fontWeight = if (isCompleted) FontWeight.Medium else FontWeight.Normal, + color = if (isCompleted) + MaterialTheme.colorScheme.onPrimaryContainer + else + MaterialTheme.colorScheme.onSurface + ) + } + } + } +} + +@Composable +internal fun ForExpertsSection( + summaryText: String? = null, + adbCommand: String?, + onCopyAdbCommand: (() -> Unit)? = null, + onShareExpertCommand: (() -> Unit)? = null, +) { + val context = LocalContext.current + val haptic = LocalHapticFeedback.current + var expanded by remember { mutableStateOf(false) } + + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surface + ) + ) { + Column(modifier = Modifier.padding(16.dp)) { + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { expanded = !expanded }, + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = stringResource(id = R.string.permission_wizard_for_experts), + style = MaterialTheme.typography.labelLarge, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.weight(1f) + ) + IconButton(onClick = { expanded = !expanded }) { + Icon( + imageVector = if (expanded) Icons.Outlined.ExpandLess else Icons.Outlined.ExpandMore, + contentDescription = null + ) + } + } + + if (expanded) { + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = summaryText + ?: stringResource(id = R.string.permission_wizard_manual_command), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + if (adbCommand != null) { + Spacer(modifier = Modifier.height(12.dp)) + Surface( + modifier = Modifier.fillMaxWidth(), + color = MaterialTheme.colorScheme.surface, + shape = MaterialTheme.shapes.small + ) { + Text( + text = adbCommand, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(12.dp), + fontWeight = FontWeight.Medium + ) + } + if (onCopyAdbCommand != null || onShareExpertCommand != null) { + Spacer(modifier = Modifier.height(8.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + if (onCopyAdbCommand != null) { + OutlinedButton( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onCopyAdbCommand() + Toast.makeText( + context, + R.string.permission_wizard_copied, + Toast.LENGTH_SHORT + ).show() + }, + modifier = Modifier.weight(1f) + ) { + Text(text = stringResource(id = R.string.action_copy)) + } + } + if (onShareExpertCommand != null) { + Button( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onShareExpertCommand() + }, + modifier = Modifier.weight(1f) + ) { + Text(text = stringResource(id = R.string.action_share)) + } + } + } + } + } + } + } + } +} diff --git a/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt new file mode 100644 index 0000000..74991e7 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt @@ -0,0 +1,548 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.setup + +import android.widget.Toast +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +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.foundation.layout.width +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.CheckCircle +import androidx.compose.material.icons.outlined.Circle +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.scale +import androidx.compose.ui.hapticfeedback.HapticFeedbackType +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalHapticFeedback +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import dev.lexip.hecate.R + +@Composable +internal fun DeveloperModeStep( + isDeveloperOptionsEnabled: Boolean, + isUsbDebuggingEnabled: Boolean, + onNext: () -> Unit, + onExit: () -> Unit, + onOpenSettings: () -> Unit, + onOpenDeveloperSettings: () -> Unit, +) { + val haptic = LocalHapticFeedback.current + val bothEnabled = isDeveloperOptionsEnabled && isUsbDebuggingEnabled + + LaunchedEffect(isDeveloperOptionsEnabled) { + if (isDeveloperOptionsEnabled) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + } + + LaunchedEffect(isUsbDebuggingEnabled) { + if (isUsbDebuggingEnabled) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + } + + LaunchedEffect(bothEnabled) { + if (bothEnabled) { + onNext() + } + } + + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + ) { + Text( + text = stringResource(id = R.string.permission_wizard_developer_mode_title), + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(id = R.string.permission_wizard_developer_mode_body), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + Spacer(modifier = Modifier.height(24.dp)) + + DeveloperOptionsCard( + isEnabled = isDeveloperOptionsEnabled, + onOpenSettings = onOpenSettings + ) + + Spacer(modifier = Modifier.height(16.dp)) + + UsbDebuggingCard( + isEnabled = isUsbDebuggingEnabled, + isDeveloperOptionsEnabled = isDeveloperOptionsEnabled, + onOpenDeveloperSettings = onOpenDeveloperSettings + ) + + Spacer(modifier = Modifier.weight(1f)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + OutlinedButton(onClick = onExit) { + Text(text = stringResource(id = R.string.action_close)) + } + Button( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onNext() + }, + enabled = bothEnabled + ) { + Text(text = stringResource(id = R.string.action_continue)) + } + } + } +} + +@Composable +private fun DeveloperOptionsCard( + isEnabled: Boolean, + onOpenSettings: () -> Unit, +) { + val context = LocalContext.current + + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = if (isEnabled) + MaterialTheme.colorScheme.primaryContainer + else + MaterialTheme.colorScheme.surface + ) + ) { + Column(modifier = Modifier.padding(20.dp)) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + if (isEnabled) { + Icon( + imageVector = Icons.Filled.CheckCircle, + contentDescription = null, + modifier = Modifier.size(32.dp), + tint = MaterialTheme.colorScheme.primary + ) + Spacer(modifier = Modifier.width(16.dp)) + } + Text( + text = stringResource( + id = if (isEnabled) + R.string.permission_wizard_developer_options_enabled + else + R.string.permission_wizard_developer_options_title + ), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold, + color = if (isEnabled) + MaterialTheme.colorScheme.onPrimaryContainer + else + MaterialTheme.colorScheme.onSurface, + modifier = Modifier.weight(1f) + ) + } + if (!isEnabled) { + Spacer(modifier = Modifier.height(12.dp)) + Button( + onClick = { + onOpenSettings() + Toast.makeText( + context, + context.getString(R.string.permission_wizard_dev_options_toast), + Toast.LENGTH_LONG + ).show() + }, + modifier = Modifier.fillMaxWidth() + ) { + Text(text = stringResource(id = R.string.permission_wizard_action_open_settings)) + } + } + } + } +} + +@Composable +private fun UsbDebuggingCard( + isEnabled: Boolean, + isDeveloperOptionsEnabled: Boolean, + onOpenDeveloperSettings: () -> Unit, +) { + val context = LocalContext.current + + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = if (isEnabled) + MaterialTheme.colorScheme.primaryContainer + else + MaterialTheme.colorScheme.surface + ) + ) { + Column(modifier = Modifier.padding(20.dp)) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + if (isEnabled) { + Icon( + imageVector = Icons.Filled.CheckCircle, + contentDescription = null, + modifier = Modifier.size(32.dp), + tint = MaterialTheme.colorScheme.primary + ) + Spacer(modifier = Modifier.width(16.dp)) + } + Text( + text = stringResource( + id = if (isEnabled) + R.string.permission_wizard_usb_debugging_enabled + else + R.string.permission_wizard_usb_debugging_disabled + ), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold, + color = if (isEnabled) + MaterialTheme.colorScheme.onPrimaryContainer + else + MaterialTheme.colorScheme.onSurface, + modifier = Modifier.weight(1f) + ) + } + if (!isEnabled && isDeveloperOptionsEnabled) { + Spacer(modifier = Modifier.height(12.dp)) + Button( + onClick = { + onOpenDeveloperSettings() + Toast.makeText( + context, + context.getString(R.string.permission_wizard_usb_debugging_toast), + Toast.LENGTH_LONG + ).show() + }, + modifier = Modifier.fillMaxWidth() + ) { + Text(text = stringResource(id = R.string.permission_wizard_action_open_developer_settings)) + } + } + } + } +} + +@Composable +internal fun ConnectUsbStep( + isUsbConnected: Boolean, + onNext: () -> Unit, + onExit: () -> Unit, +) { + val haptic = LocalHapticFeedback.current + + LaunchedEffect(isUsbConnected) { + if (isUsbConnected) { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + } + } + + LaunchedEffect(isUsbConnected) { + if (isUsbConnected) { + onNext() + } + } + + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + ) { + Text( + text = stringResource(id = R.string.permission_wizard_connect_title), + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(id = R.string.permission_wizard_connect_body), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + Spacer(modifier = Modifier.height(24.dp)) + + StatusCard( + isCompleted = isUsbConnected, + title = if (isUsbConnected) + stringResource(id = R.string.permission_wizard_usb_connected) + else + stringResource(id = R.string.permission_wizard_usb_not_connected), + isWaiting = !isUsbConnected + ) + + Spacer(modifier = Modifier.height(24.dp)) + + ConnectionWhySection() + + Spacer(modifier = Modifier.weight(1f)) + Spacer(modifier = Modifier.height(12.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + OutlinedButton(onClick = onExit) { + Text(text = stringResource(id = R.string.action_close)) + } + Button( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onNext() + }, + enabled = isUsbConnected + ) { + Text(text = stringResource(id = R.string.action_continue)) + } + } + } +} + +@Composable +private fun ConnectionWhySection() { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surface + ) + ) { + Column(modifier = Modifier.padding(16.dp)) { + Text( + text = stringResource(id = R.string.permission_wizard_why_other_device_title), + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource(id = R.string.permission_wizard_why_other_device), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } +} + +@Composable +internal fun GrantPermissionStep( + adbCommand: String, + hasWriteSecureSettings: Boolean, + onCopyAdbCommand: () -> Unit, + onShareSetupUrl: () -> Unit, + onShareExpertCommand: () -> Unit, + onCheckPermission: () -> Unit, + onExit: () -> Unit +) { + val haptic = LocalHapticFeedback.current + + val pulseScale = remember { Animatable(0.8f) } + LaunchedEffect(!hasWriteSecureSettings) { + if (!hasWriteSecureSettings) { + pulseScale.animateTo( + targetValue = 1.2f, + animationSpec = infiniteRepeatable( + animation = tween(durationMillis = 750, easing = LinearOutSlowInEasing), + repeatMode = RepeatMode.Reverse + ) + ) + } else { + pulseScale.snapTo(0.8f) + } + } + + LaunchedEffect(hasWriteSecureSettings) { + if (hasWriteSecureSettings) { + haptic.performHapticFeedback(HapticFeedbackType.Confirm) + } + } + + Column( + modifier = Modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + ) { + Text( + text = stringResource(id = R.string.permission_wizard_grant_title), + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(12.dp)) + Text( + text = stringResource(id = R.string.permission_wizard_grant_body), + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + + Spacer(modifier = Modifier.height(24.dp)) + + WebsiteShareCard(onShareSetupUrl = onShareSetupUrl) + + Spacer(modifier = Modifier.height(20.dp)) + + PermissionStatusSection( + hasWriteSecureSettings = hasWriteSecureSettings, + pulseScale = pulseScale + ) + + Spacer(modifier = Modifier.weight(1f)) + Spacer(modifier = Modifier.height(12.dp)) + + ForExpertsSection( + adbCommand = adbCommand, + onCopyAdbCommand = onCopyAdbCommand, + onShareExpertCommand = onShareExpertCommand + ) + + Spacer(modifier = Modifier.height(24.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + OutlinedButton(onClick = onExit) { + Text(text = stringResource(id = R.string.action_close)) + } + Button( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onCheckPermission() + }, + enabled = hasWriteSecureSettings + ) { + Text(text = stringResource(id = R.string.action_finish)) + } + } + } +} + +@Composable +private fun WebsiteShareCard( + onShareSetupUrl: () -> Unit, +) { + val haptic = LocalHapticFeedback.current + + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.primaryContainer + ) + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = stringResource(id = R.string.permission_wizard_website_url), + style = MaterialTheme.typography.displaySmall, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.primary, + textAlign = androidx.compose.ui.text.style.TextAlign.Center + ) + Spacer(modifier = Modifier.height(16.dp)) + OutlinedButton( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onShareSetupUrl() + }, + modifier = Modifier.wrapContentWidth(), + contentPadding = PaddingValues(horizontal = 8.dp, vertical = 6.dp) + ) { + Text(text = stringResource(id = R.string.action_share_setup_url)) + } + } + } +} + +@Composable +private fun PermissionStatusSection( + hasWriteSecureSettings: Boolean, + pulseScale: Animatable, +) { + if (hasWriteSecureSettings) { + StatusCard( + isCompleted = true, + title = stringResource(id = R.string.permission_wizard_permission_granted) + ) + } else { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surface + ) + ) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + imageVector = Icons.Outlined.Circle, + contentDescription = null, + modifier = Modifier + .size(24.dp) + .scale(pulseScale.value), + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + Spacer(modifier = Modifier.width(12.dp)) + Text( + text = stringResource(id = R.string.permission_wizard_permission_not_granted), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + } + } +} diff --git a/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupWizardScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupWizardScreen.kt new file mode 100644 index 0000000..3961a72 --- /dev/null +++ b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupWizardScreen.kt @@ -0,0 +1,149 @@ +/* + * Copyright (C) 2025 xLexip + * + * Licensed under the GNU General Public License, Version 3.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.gnu.org/licenses/gpl-3.0 + * + * Please see the License for specific terms regarding permissions and limitations. + */ + +package dev.lexip.hecate.ui.setup + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.LinearProgressIndicator +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import dev.lexip.hecate.R + +enum class PermissionWizardStep { + ENABLE_DEVELOPER_MODE, + CONNECT_USB, + GRANT_PERMISSION +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun PermissionSetupWizardScreen( + step: PermissionWizardStep, + adbCommand: String, + isUsbConnected: Boolean, + hasWriteSecureSettings: Boolean, + isDeveloperOptionsEnabled: Boolean, + isUsbDebuggingEnabled: Boolean, + onNext: () -> Unit, + onExit: () -> Unit, + onOpenSettings: () -> Unit, + onOpenDeveloperSettings: () -> Unit, + onShareSetupUrl: () -> Unit, + onCopyAdbCommand: () -> Unit, + onShareExpertCommand: () -> Unit, + onCheckPermission: () -> Unit, +) { + val totalSteps = PermissionWizardStep.entries.size + val currentStepIndex = step.ordinal + 1 + val progress = (currentStepIndex.toFloat() - (0.1).toFloat()) / totalSteps.toFloat() + + Scaffold( + containerColor = MaterialTheme.colorScheme.surfaceContainer, + topBar = { + TopAppBar( + title = { Text(text = "Service Setup", fontWeight = FontWeight.Bold) }, + colors = TopAppBarDefaults.topAppBarColors( + containerColor = MaterialTheme.colorScheme.surfaceContainer, + titleContentColor = MaterialTheme.colorScheme.onSurface + ) + ) + } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues) + ) { + // Progress indicator section + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 24.dp) + .padding(top = 16.dp) + ) { + LinearProgressIndicator( + progress = { progress }, + modifier = Modifier + .fillMaxWidth() + .height(8.dp), + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = stringResource( + id = R.string.permission_wizard_step_counter, + currentStepIndex, + totalSteps + ), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.Center + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + + // Main content + Column( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + .padding(horizontal = 24.dp), + verticalArrangement = Arrangement.SpaceBetween + ) { + when (step) { + PermissionWizardStep.ENABLE_DEVELOPER_MODE -> DeveloperModeStep( + isDeveloperOptionsEnabled = isDeveloperOptionsEnabled, + isUsbDebuggingEnabled = isUsbDebuggingEnabled, + onNext = onNext, + onExit = onExit, + onOpenSettings = onOpenSettings, + onOpenDeveloperSettings = onOpenDeveloperSettings + ) + + PermissionWizardStep.CONNECT_USB -> ConnectUsbStep( + isUsbConnected = isUsbConnected, + onNext = onNext, + onExit = onExit + ) + + PermissionWizardStep.GRANT_PERMISSION -> GrantPermissionStep( + adbCommand = adbCommand, + hasWriteSecureSettings = hasWriteSecureSettings, + onCopyAdbCommand = onCopyAdbCommand, + onShareSetupUrl = onShareSetupUrl, + onShareExpertCommand = onShareExpertCommand, + onCheckPermission = onCheckPermission, + onExit = onExit + ) + } + } + Spacer(modifier = Modifier.height(8.dp)) + } + } +} diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index d7287a4..11709e9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,54 +1,89 @@ - Adaptive Theme + Adaptive Theme + + Zurück + Abbrechen Schließen + Weiter + Kopieren ADB-Command kopieren Benachrichtigung ausblenden - Adaptive Theme verwenden - Dienst stoppen + Fertig Öffnen + Festlegen + Teilen Link teilen + Dienst stoppen + Adaptive Theme verwenden Website öffnen Wechselt automatisch zwischen hellem und dunklem Modus basierend auf dem Umgebungslicht – für bessere Sichtbarkeit und Akkulaufzeit. Der Wechsel erfolgt nur beim Einschalten des Bildschirms und nur, wenn das Gerät nicht abgedeckt ist. - -Diese App benötigt die Berechtigung WRITE_SECURE_SETTINGS, um das System-Theme ändern zu können. Diese Berechtigung kann leider nicht über die Geräteeinstellungen erteilt werden. \n\nUm sie zu erteilen, öffnen Sie einfach die Website lexip.dev/setup auf einem anderen Gerät und folgen Sie den Anweisungen. - Systemtheme wird anhand der Umgebungshelligkeit angepasst. - Keine E-Mail-App gefunden. Ungültiger Lux-Wert. - Der Lux-Wert darf nicht negativ sein. Der Lux-Wert kann maximal 100.000 sein. - Per-App Spracheneinstellungen sind auf diesem Gerät nicht verfügbar. + Der Lux-Wert darf nicht negativ sein. + Per-App-Spracheneinstellungen sind auf diesem Gerät nicht verfügbar. + Keine E-Mail-App gefunden. + Info + Beta-Feedback Helligkeitsschwelle + Sprache ändern Aktuelle Helligkeit - Fehlende Berechtigung + Benutzerdefinierte Schwelle Mehr Hintergrundaktivität - Info - Sprache ändern Feedback senden - Benutzerdefinierte Schwelle - Beta Feedback + Hell + Benutzerdefiniert Dunkel + Tageslicht Schwach Leicht - Hell - Tageslicht Sonnenlicht - Benutzerdefiniert Lux-Wert - Festlegen - Abbrechen + + + Berechtigung prüfen + Einstellungen öffnen + Einstellungen öffnen + ADB-Command + Um die Berechtigung zu erteilen, benötigen Sie ein weiteres Gerät (vorzugsweise einen Computer) mit Webbrowser. Verbinden Sie dieses Gerät per USB-Kabel damit. + Mit einem anderen Gerät verbinden + In die Zwischenablage kopiert. + Tippen Sie einfach mehrmals auf die Build-Nummer, um die Entwickleroptionen freizuschalten, und aktivieren Sie dort USB-Debugging. + Entwicklermodus aktivieren + Entwickleroptionen noch nicht aktiviert + Entwickleroptionen aktiviert + Entwickleroptionen aktivieren + Entwickleroptionen aktiviert! Sie können nun mit der Einrichtung fortfahren. + Mehrfach auf die Build-Nummer tippen, um die Entwickleroptionen zu aktivieren. + Damit das System-Theme automatisch geändert werden kann, benötigt diese App die spezielle Berechtigung WRITE_SECURE_SETTINGS. Sie kann nicht über die normalen Systemeinstellungen erteilt werden, daher führen wir Sie durch eine einmalige Einrichtung mit Entwickleroptionen und einem Computer. + Berechtigung erforderlich + Alternative für Experten + Öffne diese Website auf einem anderen Gerät und folge den Anweisungen dort: + Berechtigung erteilen + Falls ADB auf dem anderen Gerät installiert ist, kannst du dort stattdessen diesen Command ausführen: + Berechtigung erfolgreich erteilt! + Berechtigung noch nicht erteilt. Schließen Sie die Einrichtung auf dem anderen Gerät ab. + Schritt %1$d von %2$d + USB verbunden + USB-Debugging aktivieren + USB-Debugging aktiviert + USB-Debugging aktiviert! Sie können nun mit der Einrichtung fortfahren. + USB-Debugging aktivieren + Warten auf USB-Verbindung … + Die Berechtigung kann nur über ADB erteilt werden, wofür ein anderes Gerät mit einem Webbrowser oder ADB erforderlich ist. + Warum wird ein anderes Gerät benötigt? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 145afbf..e3ca346 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,20 +1,26 @@ - Adaptive Theme + Adaptive Theme + lexip.dev/setup + + Back + Cancel Close + Continue + Copy Copy ADB Command Hide Notification - Use Adaptive Theme - Stop Service + Finish Open + Set + Share Share Link + Stop Service + Use Adaptive Theme View Website Automatically switches between Light and Dark mode based on ambient light for better visibility and battery life. Theme changes occur only when the screen turns on and the device is uncovered. - - - This app needs the permission WRITE_SECURE_SETTINGS to modify the system theme. Unfortunately, it cannot be granted from the device settings. \n\nTo grant it, simply open the website lexip.dev/setup on another device and follow the instructions. Adjusting the system theme based on ambient brightness. @@ -26,26 +32,56 @@ Lux value cannot exceed 100,000. Per-app language preferences are unavailable on this device. + About + Beta Feedback Brightness Threshold + Change Language Current Brightness - Missing Permission + Custom Threshold More Background Activity - About - Change Language Send Feedback - Custom Threshold - Beta Feedback + Bright + Custom Dark + Daylight Dim Soft - Bright - Daylight Sunlight - Custom Lux value - Set - Cancel + + + Check permission + Open Settings + Open Settings + ADB command + To grant the permission, you\'ll need another device (preferably a computer) with a web browser. Connect this device to it using a USB cable. + Connect to another device + Command copied to clipboard. + Tap the build number several times to unlock Developer options, then enable USB debugging there. + Enable Developer Mode + Developer options not enabled yet + Developer options enabled + Enable developer options + Developer options enabled! You can now continue with the setup. + Look for the build number and tap it 7 times to enable the developer settings. You\'ll see a message confirming it\'s enabled. + To change the system theme automatically, this app needs the special WRITE_SECURE_SETTINGS permission. It can\'t be granted from the normal system settings, so you will be guided through a one-time setup using Developer options and a computer. + Permission required + Alternative for experts + On your other device, open this website and follow the instructions: + Grant the permission + If you have ADB installed on your computer, you can run this command instead: + Permission granted successfully! + Permission not yet granted. Complete the setup on your other device. + Step %1$d of %2$d + USB connected + Enable USB debugging + USB debugging enabled + USB debugging enabled! You can now continue with the setup. + Enable USB debugging + Waiting for USB connection + The permission can only be granted via ADB, which requires another device with either a web browser or ADB installed. + Why is another device required? From dc2dbb779b8dcadc8b86ad03cc0bfc2fca362ba9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:58:20 +0000 Subject: [PATCH 72/75] fix(deps): apply minor dependency updates --- app/build.gradle.kts | 37 ++++++++++++------------ build.gradle.kts | 2 +- gradle/libs.versions.toml | 6 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 064bb14..c8479a2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -47,36 +47,35 @@ android { } - bundle { - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - kotlin { - compilerOptions { - jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) - } - } + kotlinOptions { + jvmTarget = "17" + } + bundle { language { @Suppress("UnstableApiUsage") enableSplit = false } + } - buildFeatures { - compose = true - buildConfig = true - } + buildFeatures { + compose = true + buildConfig = true + } - sourceSets { - getByName("main") { - resources { - srcDirs("src/main/resources", "src/main/java/components") - } + sourceSets { + getByName("main") { + resources { + srcDirs("src/main/resources", "src/main/java/components") } } } +} dependencies { implementation(platform(libs.firebase.bom)) diff --git a/build.gradle.kts b/build.gradle.kts index 6877d6d..b4995d4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false - id("org.sonarqube") version "7.1.0.6387" + id("org.sonarqube") version "7.2.0.6526" id("com.google.gms.google-services") version "4.4.4" apply false alias(libs.plugins.google.firebase.crashlytics) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 991d36f..1ed0222 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,9 @@ [versions] -activityCompose = "1.12.0" +activityCompose = "1.12.1" agp = "8.13.1" appcompat = "1.7.1" appUpdateKtx = "2.1.0" -composeBom = "2025.11.01" +composeBom = "2025.12.00" coreKtx = "1.17.0" coreSplashscreenVersion = "1.2.0" datastorePreferencesCore = "1.2.0" @@ -39,7 +39,7 @@ androidx-preference = { group = "androidx.preference", name = "preference", vers androidx-ui = { group = "androidx.compose.ui", name = "ui" } androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } -androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version = "1.9.5" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version = "1.10.0" } androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } app-update-ktx = { module = "com.google.android.play:app-update-ktx", version.ref = "appUpdateKtx" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bad7c24..23449a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From ff5b71e96f63ebbb13efbe599137fa7f4a4d8ee9 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:46:34 +0100 Subject: [PATCH 73/75] refactor: Remove out-of-context toasts --- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 20 +------------------ app/src/main/res/values-de/strings.xml | 3 --- app/src/main/res/values/strings.xml | 3 --- 3 files changed, 1 insertion(+), 25 deletions(-) diff --git a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt index 5b46a4c..c344158 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/AdaptiveThemeScreen.kt @@ -208,15 +208,7 @@ fun AdaptiveThemeScreen( Intent(Settings.ACTION_APP_LOCALE_SETTINGS).apply { data = "package:$packageName".toUri() } - try { - context.startActivity(intent) - } catch (_: ActivityNotFoundException) { - Toast.makeText( - context, - context.getString(R.string.error_no_app_language_settings), - Toast.LENGTH_SHORT - ).show() - } + context.startActivity(intent) } ) } @@ -469,20 +461,10 @@ fun AdaptiveThemeScreen( ) == PackageManager.PERMISSION_GRANTED if (!previousDevOptionsState && isDeveloperOptionsEnabled) { - Toast.makeText( - context, - context.getString(R.string.permission_wizard_dev_options_enabled_toast), - Toast.LENGTH_LONG - ).show() haptic.performHapticFeedback(HapticFeedbackType.ContextClick) } if (!previousUsbDebuggingState && isUsbDebuggingEnabled) { - Toast.makeText( - context, - context.getString(R.string.permission_wizard_usb_debugging_enabled_toast), - Toast.LENGTH_LONG - ).show() haptic.performHapticFeedback(HapticFeedbackType.ContextClick) } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 11709e9..65907cc 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -31,7 +31,6 @@ Ungültiger Lux-Wert. Der Lux-Wert kann maximal 100.000 sein. Der Lux-Wert darf nicht negativ sein. - Per-App-Spracheneinstellungen sind auf diesem Gerät nicht verfügbar. Keine E-Mail-App gefunden. Info @@ -67,7 +66,6 @@ Entwickleroptionen noch nicht aktiviert Entwickleroptionen aktiviert Entwickleroptionen aktivieren - Entwickleroptionen aktiviert! Sie können nun mit der Einrichtung fortfahren. Mehrfach auf die Build-Nummer tippen, um die Entwickleroptionen zu aktivieren. Damit das System-Theme automatisch geändert werden kann, benötigt diese App die spezielle Berechtigung WRITE_SECURE_SETTINGS. Sie kann nicht über die normalen Systemeinstellungen erteilt werden, daher führen wir Sie durch eine einmalige Einrichtung mit Entwickleroptionen und einem Computer. Berechtigung erforderlich @@ -81,7 +79,6 @@ USB verbunden USB-Debugging aktivieren USB-Debugging aktiviert - USB-Debugging aktiviert! Sie können nun mit der Einrichtung fortfahren. USB-Debugging aktivieren Warten auf USB-Verbindung … Die Berechtigung kann nur über ADB erteilt werden, wofür ein anderes Gerät mit einem Webbrowser oder ADB erforderlich ist. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e3ca346..5308f26 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -30,7 +30,6 @@ Invalid lux value. Lux value cannot be negative. Lux value cannot exceed 100,000. - Per-app language preferences are unavailable on this device. About Beta Feedback @@ -65,7 +64,6 @@ Developer options not enabled yet Developer options enabled Enable developer options - Developer options enabled! You can now continue with the setup. Look for the build number and tap it 7 times to enable the developer settings. You\'ll see a message confirming it\'s enabled. To change the system theme automatically, this app needs the special WRITE_SECURE_SETTINGS permission. It can\'t be granted from the normal system settings, so you will be guided through a one-time setup using Developer options and a computer. Permission required @@ -79,7 +77,6 @@ USB connected Enable USB debugging USB debugging enabled - USB debugging enabled! You can now continue with the setup. Enable USB debugging Waiting for USB connection The permission can only be granted via ADB, which requires another device with either a web browser or ADB installed. From 5aa148db1f3905457400d10a8f58cf3df7dec8a5 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 18:43:40 +0100 Subject: [PATCH 74/75] reafctor: Address lint findings --- app/build.gradle.kts | 6 +- app/src/main/AndroidManifest.xml | 7 +- .../lexip/hecate/ui/AdaptiveThemeScreen.kt | 11 ++- .../java/dev/lexip/hecate/ui/MainActivity.kt | 2 + .../hecate/ui/setup/PermissionSetupCommon.kt | 91 +++++++++---------- .../hecate/ui/setup/PermissionSetupSteps.kt | 6 +- app/src/main/res/values-de/strings.xml | 13 --- app/src/main/res/values/strings.xml | 10 -- settings.gradle.kts | 2 +- 9 files changed, 64 insertions(+), 84 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c8479a2..6975a30 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -52,8 +52,10 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - kotlinOptions { - jvmTarget = "17" + kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + } } bundle { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe5a6f7..489edef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,7 +14,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" tools:ignore="ProtectedPermissions"> - + @@ -41,7 +43,8 @@ android:theme="@style/Theme.App.Starting" android:usesCleartextTraffic="false" android:windowSoftInputMode="adjustResize" - android:localeConfig="@xml/locales_config"> + android:localeConfig="@xml/locales_config" + tools:targetApi="33"> Unit = {} ) { // Enable top-app-bar collapsing on small devices - val configuration = androidx.compose.ui.platform.LocalConfiguration.current - val screenHeightDp = configuration.screenHeightDp - val enableCollapsing = screenHeightDp < 700 + val windowInfo = LocalWindowInfo.current + val density = androidx.compose.ui.platform.LocalDensity.current + val screenHeightDp = with(density) { windowInfo.containerSize.height.toDp().value } + val enableCollapsing = screenHeightDp < 700f val scrollBehavior = if (enableCollapsing) { TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()) } else null @@ -387,7 +389,6 @@ fun AdaptiveThemeScreen( false } - var previousUsbConnected = false // Observe USB state via sticky broadcast and runtime receiver val usbFilter = @@ -404,7 +405,7 @@ fun AdaptiveThemeScreen( return connected && (configured || dataConnected || adb || hostConnected) } isUsbConnected = parseUsbIntent(sticky) - previousUsbConnected = isUsbConnected + var previousUsbConnected = isUsbConnected val runtimeReceiver = object : android.content.BroadcastReceiver() { override fun onReceive( diff --git a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt index 4e40ed2..bba79de 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/MainActivity.kt @@ -12,6 +12,7 @@ package dev.lexip.hecate.ui +import android.annotation.SuppressLint import android.os.Build import android.os.Bundle import android.widget.Toast @@ -35,6 +36,7 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) // Catch mysterious unsupported SDK versions despite minSDK 31 + @SuppressLint("ObsoleteSdkInt") if (Build.VERSION.SDK_INT < 31) { Toast.makeText( this, diff --git a/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt index 58037da..561c63b 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupCommon.kt @@ -145,7 +145,6 @@ internal fun StatusCard( @Composable internal fun ForExpertsSection( - summaryText: String? = null, adbCommand: String?, onCopyAdbCommand: (() -> Unit)? = null, onShareExpertCommand: (() -> Unit)? = null, @@ -185,59 +184,53 @@ internal fun ForExpertsSection( if (expanded) { Spacer(modifier = Modifier.height(8.dp)) Text( - text = summaryText - ?: stringResource(id = R.string.permission_wizard_manual_command), + text = stringResource(id = R.string.permission_wizard_manual_command), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) - if (adbCommand != null) { - Spacer(modifier = Modifier.height(12.dp)) - Surface( - modifier = Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.surface, - shape = MaterialTheme.shapes.small + + Spacer(modifier = Modifier.height(12.dp)) + Surface( + modifier = Modifier.fillMaxWidth(), + color = MaterialTheme.colorScheme.surface, + shape = MaterialTheme.shapes.small + ) { + Text( + text = adbCommand ?: "", + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(12.dp), + fontWeight = FontWeight.Medium + ) + } + + Spacer(modifier = Modifier.height(8.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + OutlinedButton( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onCopyAdbCommand?.invoke() + Toast.makeText( + context, + R.string.permission_wizard_copied, + Toast.LENGTH_SHORT + ).show() + }, + modifier = Modifier.weight(1f) ) { - Text( - text = adbCommand, - style = MaterialTheme.typography.bodySmall, - modifier = Modifier.padding(12.dp), - fontWeight = FontWeight.Medium - ) + Text(text = stringResource(id = R.string.action_copy)) } - if (onCopyAdbCommand != null || onShareExpertCommand != null) { - Spacer(modifier = Modifier.height(8.dp)) - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(8.dp) - ) { - if (onCopyAdbCommand != null) { - OutlinedButton( - onClick = { - haptic.performHapticFeedback(HapticFeedbackType.ContextClick) - onCopyAdbCommand() - Toast.makeText( - context, - R.string.permission_wizard_copied, - Toast.LENGTH_SHORT - ).show() - }, - modifier = Modifier.weight(1f) - ) { - Text(text = stringResource(id = R.string.action_copy)) - } - } - if (onShareExpertCommand != null) { - Button( - onClick = { - haptic.performHapticFeedback(HapticFeedbackType.ContextClick) - onShareExpertCommand() - }, - modifier = Modifier.weight(1f) - ) { - Text(text = stringResource(id = R.string.action_share)) - } - } - } + + Button( + onClick = { + haptic.performHapticFeedback(HapticFeedbackType.ContextClick) + onShareExpertCommand?.invoke() + }, + modifier = Modifier.weight(1f) + ) { + Text(text = stringResource(id = R.string.action_share)) } } } diff --git a/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt index 74991e7..92838c1 100644 --- a/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt +++ b/app/src/main/java/dev/lexip/hecate/ui/setup/PermissionSetupSteps.kt @@ -188,12 +188,13 @@ private fun DeveloperOptionsCard( } if (!isEnabled) { Spacer(modifier = Modifier.height(12.dp)) + val toastText = stringResource(R.string.permission_wizard_dev_options_toast) Button( onClick = { onOpenSettings() Toast.makeText( context, - context.getString(R.string.permission_wizard_dev_options_toast), + toastText, Toast.LENGTH_LONG ).show() }, @@ -213,6 +214,7 @@ private fun UsbDebuggingCard( onOpenDeveloperSettings: () -> Unit, ) { val context = LocalContext.current + val usbDebuggingToastText = stringResource(R.string.permission_wizard_usb_debugging_toast) Card( modifier = Modifier.fillMaxWidth(), @@ -260,7 +262,7 @@ private fun UsbDebuggingCard( onOpenDeveloperSettings() Toast.makeText( context, - context.getString(R.string.permission_wizard_usb_debugging_toast), + usbDebuggingToastText, Toast.LENGTH_LONG ).show() }, diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 65907cc..91a8285 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,24 +1,17 @@ - Adaptive Theme - - Zurück Abbrechen Schließen Weiter Kopieren - ADB-Command kopieren Benachrichtigung ausblenden Fertig - Öffnen Festlegen Teilen Link teilen Dienst stoppen Adaptive Theme verwenden - Website öffnen - Wechselt automatisch zwischen hellem und dunklem Modus basierend auf dem Umgebungslicht – für bessere Sichtbarkeit und Akkulaufzeit. Der Wechsel erfolgt nur beim Einschalten des Bildschirms und nur, wenn das Gerät nicht abgedeckt ist. @@ -34,7 +27,6 @@ Keine E-Mail-App gefunden. Info - Beta-Feedback Helligkeitsschwelle Sprache ändern Aktuelle Helligkeit @@ -54,21 +46,16 @@ Lux-Wert - Berechtigung prüfen Einstellungen öffnen Einstellungen öffnen - ADB-Command Um die Berechtigung zu erteilen, benötigen Sie ein weiteres Gerät (vorzugsweise einen Computer) mit Webbrowser. Verbinden Sie dieses Gerät per USB-Kabel damit. Mit einem anderen Gerät verbinden In die Zwischenablage kopiert. Tippen Sie einfach mehrmals auf die Build-Nummer, um die Entwickleroptionen freizuschalten, und aktivieren Sie dort USB-Debugging. Entwicklermodus aktivieren - Entwickleroptionen noch nicht aktiviert Entwickleroptionen aktiviert Entwickleroptionen aktivieren Mehrfach auf die Build-Nummer tippen, um die Entwickleroptionen zu aktivieren. - Damit das System-Theme automatisch geändert werden kann, benötigt diese App die spezielle Berechtigung WRITE_SECURE_SETTINGS. Sie kann nicht über die normalen Systemeinstellungen erteilt werden, daher führen wir Sie durch eine einmalige Einrichtung mit Entwickleroptionen und einem Computer. - Berechtigung erforderlich Alternative für Experten Öffne diese Website auf einem anderen Gerät und folge den Anweisungen dort: Berechtigung erteilen diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5308f26..66d7063 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,21 +3,17 @@ lexip.dev/setup - Back Cancel Close Continue Copy - Copy ADB Command Hide Notification Finish - Open Set Share Share Link Stop Service Use Adaptive Theme - View Website Automatically switches between Light and Dark mode based on ambient light for better visibility and battery life. Theme changes occur only when the screen turns on and the device is uncovered. @@ -32,7 +28,6 @@ Lux value cannot exceed 100,000. About - Beta Feedback Brightness Threshold Change Language Current Brightness @@ -52,21 +47,16 @@ Lux value - Check permission Open Settings Open Settings - ADB command To grant the permission, you\'ll need another device (preferably a computer) with a web browser. Connect this device to it using a USB cable. Connect to another device Command copied to clipboard. Tap the build number several times to unlock Developer options, then enable USB debugging there. Enable Developer Mode - Developer options not enabled yet Developer options enabled Enable developer options Look for the build number and tap it 7 times to enable the developer settings. You\'ll see a message confirming it\'s enabled. - To change the system theme automatically, this app needs the special WRITE_SECURE_SETTINGS permission. It can\'t be granted from the normal system settings, so you will be guided through a one-time setup using Developer options and a computer. - Permission required Alternative for experts On your other device, open this website and follow the instructions: Grant the permission diff --git a/settings.gradle.kts b/settings.gradle.kts index 65bbffc..f7c1ba3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,5 +19,5 @@ dependencyResolutionManagement { } } -rootProject.name = "Hecate" +rootProject.name = "Adaptive Theme" include(":app") \ No newline at end of file From babe82ea48d3731d6244b54f13ec7e48d7456de5 Mon Sep 17 00:00:00 2001 From: xLexip Date: Fri, 5 Dec 2025 17:46:55 +0100 Subject: [PATCH 75/75] chore: v0.7.0-beta * Play Store Closed Testing Release --- .github/workflows/build.yml | 8 +++++- .gitignore | 5 +++- README.md | 54 ++++++++++++++++++------------------- app/build.gradle.kts | 4 +-- 4 files changed, 40 insertions(+), 31 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e54bba..c0dfd5e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,13 @@ jobs: printf '%s' "$GOOGLE_SERVICES_JSON" > app/google-services.json env: GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }} - + - name: Create mock DarkThemeHandler + run: | + set -e + mkdir -p app/src/main/java/dev/lexip/hecate/util || true + printf '%s' "$MOCK_DARK_THEME_HANDLER" > app/src/main/java/dev/lexip/hecate/util/DarkThemeHandler.kt + env: + MOCK_DARK_THEME_HANDLER: ${{ secrets.MOCK_DARK_THEME_HANDLER }} - name: Set up JDK 23 uses: actions/setup-java@v5 with: diff --git a/.gitignore b/.gitignore index f60c3b8..30793d4 100644 --- a/.gitignore +++ b/.gitignore @@ -30,10 +30,13 @@ render.experimental.xml # Google Services (e.g. APIs or Firebase) google-services.json +# Trade secret +app/src/main/java/dev/lexip/hecate/util/DarkThemeHandler.kt + # Android Profiling *.hprof # Builds app/release/ app/debug/ -app/beta/ +app/beta/ \ No newline at end of file diff --git a/README.md b/README.md index 3222b15..2fdccb2 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,42 @@ [![GooglePlay](https://upload.wikimedia.org/wikipedia/commons/7/78/Google_Play_Store_badge_EN.svg)](https://lexip.dev/hecate/play) -**Adaptive Theme** automatically switches your device between light and dark mode based on ambient -brightness — bright and readable in sunlight, easy on the eyes (and battery) in the dark. +![feature_graphic](https://i.ibb.co/G38P9b9V/adaptive-theme.jpg) -Theme changes only happen right after the screen turns on and only when the device is uncovered to -avoid flicker and unnecessary sensor usage. +## Adaptive Theme -**Package:** dev.lexip.hecate - ---- +Adaptive Theme intelligently switches your device between Light and Dark mode based on your +environment. + +Get the readability of Light mode in bright daylight and the comfort of Dark mode in low light — +going easy on your eyes and your battery. + +--- ### Highlights -- Smart automatic light/dark theme switching -- Customizable brightness threshold -- Quick Settings tile for quick service toggling -- Lightweight and battery-friendly -- System-wide theme control -- No root required -- Modern Jetpack Compose app with native Material You design -- Only switches when the device is uncovered +🌤️ **Smart Detection**: Uses your ambient light sensor to switch themes automatically. + +⚙️ **Full Control**: Fully customizable brightness threshold and a Quick Settings tile to +pause/resume the service. + +🔒 **Free & Open**: Free to use, no ads and open source. + +🚀 **Native Design**: Modern architecture, built with Jetpack Compose and Material You for a seamless +Android experience. + +🚫 **No Flickering**: The theme only changes when you turn on screen and the device is uncovered. ---- +--- -### One-time setup +### One-Time Setup -To change the system theme, the app needs the WRITE_SECURE_SETTINGS permission. Because this is a -system-level permission, you have to grant it via ADB: +To toggle the system theme, Android requires the permission `WRITE_SECURE_SETTINGS`. This is safe, +transparent and fully reversible. The app will guide you through the setup process. -- Enable developer options and USB debugging on your phone. -- Connect your phone to a computer with ADB installed. -- Run this command: - *adb shell pm grant dev.lexip.hecate android.permission.WRITE_SECURE_SETTINGS* +--- -The app doesn’t need any special access beyond this permission. It is used only for theme switching. - ---- +That’s it! Set your preference, and never worry about your light/dark mode again. -That’s it — open the app, set your threshold, and you’re done. +🇩🇪 Made with 🥨 🍺 in Germany. [![SonarCloud](https://sonarcloud.io/api/project_badges/quality_gate?project=xLexip_Hecate)](https://sonarcloud.io/summary/new_code?id=xLexip_Hecate) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6975a30..d0e6742 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -15,8 +15,8 @@ android { applicationId = "dev.lexip.hecate" minSdk = 31 targetSdk = 36 - versionCode = 27 - versionName = "0.6.3" + versionCode = 36 + versionName = "0.7.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" }