Skip to content

Commit 5c5a1f6

Browse files
committed
Add delay after notification shade collapse
1 parent a6d334e commit 5c5a1f6

File tree

15 files changed

+207
-48
lines changed

15 files changed

+207
-48
lines changed

app/build.gradle.kts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ android {
99

1010
defaultConfig {
1111
applicationId = "com.vamsi3.android.screentranslator"
12-
versionCode = 4
13-
versionName = "0.0.4"
12+
versionCode = 5
13+
versionName = "0.0.5"
1414
}
1515

1616
buildTypes {
@@ -26,12 +26,13 @@ android {
2626
}
2727

2828
dependencies {
29-
implementation(project(":core:ui"))
29+
implementation(project(":core:model"))
3030
implementation(project(":core:resource"))
31+
implementation(project(":core:ui"))
3132
implementation(project(":feature:settings"))
3233
implementation(project(":feature:translate"))
33-
implementation(libs.androidx.hilt.navigation.compose)
3434
implementation(libs.androidx.appcompat)
3535
implementation(libs.androidx.compose.material.icons)
3636
implementation(libs.androidx.core.splashscreen)
37+
implementation(libs.androidx.hilt.navigation.compose)
3738
}

app/src/main/java/com/vamsi3/android/screentranslator/MainActivity.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.content.ComponentName
55
import android.graphics.drawable.Icon
66
import android.os.Build
77
import android.os.Bundle
8+
import android.util.Log
89
import androidx.activity.ComponentActivity
910
import androidx.activity.compose.setContent
1011
import androidx.activity.viewModels
@@ -15,26 +16,31 @@ import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
1516
import androidx.lifecycle.Lifecycle
1617
import androidx.lifecycle.lifecycleScope
1718
import androidx.lifecycle.repeatOnLifecycle
19+
import com.vamsi3.android.screentranslator.core.data.model.ThemeMode
20+
import com.vamsi3.android.screentranslator.core.data.model.TranslateApp
1821
import com.vamsi3.android.screentranslator.core.ui.HomeScreen
1922
import com.vamsi3.android.screentranslator.feature.translate.ScreenTranslatorTileService
2023
import com.vamsi3.android.screentranslator.core.resource.R
24+
import com.vamsi3.android.screentranslator.feature.settings.SettingsData
2125
import com.vamsi3.android.screentranslator.feature.settings.SettingsUiState
2226
import com.vamsi3.android.screentranslator.feature.settings.SettingsUiState.Loading
2327
import com.vamsi3.android.screentranslator.feature.settings.SettingsUiState.Success
2428
import com.vamsi3.android.screentranslator.feature.settings.SettingsViewModel
2529
import dagger.hilt.android.AndroidEntryPoint
2630
import kotlinx.coroutines.flow.collectLatest
31+
import kotlinx.coroutines.flow.onEmpty
2732
import kotlinx.coroutines.launch
2833

2934
@AndroidEntryPoint
3035
class MainActivity : ComponentActivity() {
3136

32-
val viewModel: SettingsViewModel by viewModels()
37+
private val viewModel: SettingsViewModel by viewModels()
3338

3439
override fun onCreate(savedInstanceState: Bundle?) {
35-
val splashScreen = installSplashScreen()
3640
super.onCreate(savedInstanceState)
3741

42+
val splashScreen = installSplashScreen()
43+
3844
var uiState: SettingsUiState by mutableStateOf(Loading)
3945

4046
lifecycleScope.launch {
@@ -46,12 +52,7 @@ class MainActivity : ComponentActivity() {
4652
}
4753
}
4854

49-
splashScreen.setKeepOnScreenCondition {
50-
when (uiState) {
51-
Loading -> true
52-
is Success -> false
53-
}
54-
}
55+
splashScreen.setKeepOnScreenCondition { uiState == Loading }
5556

5657
setContent {
5758
HomeScreen()

build-logic/convention/src/main/kotlin/com/vamsi3/android/screentranslator/buildlogic/KotlinAndroid.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ internal fun Project.configureKotlinAndroid(
3737
"-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
3838
"-opt-in=kotlinx.coroutines.FlowPreview",
3939
"-opt-in=kotlin.Experimental",
40+
"-opt-in=kotlin.time.ExperimentalTime",
4041
)
4142
jvmTarget = JavaVersion.VERSION_11.toString()
4243
}

core/data/src/main/java/com/vamsi3/android/screentranslator/core/data/repository/OfflineFirstUserDataRepository.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@ class OfflineFirstUserDataRepository @Inject constructor(
1818
override suspend fun setTranslateApp(translateApp: TranslateApp) =
1919
userPreferencesDataSource.setTranslateApp(translateApp)
2020

21+
override suspend fun setNotificationShadeCollapseDelayDuration(notificationShadeCollapseDelayDuration: Duration) =
22+
userPreferencesDataSource.setNotificationShadeCollapseDelayDuration(notificationShadeCollapseDelayDuration)
23+
2124
}

core/data/src/main/java/com/vamsi3/android/screentranslator/core/data/repository/UserDataRepository.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ package com.vamsi3.android.screentranslator.core.data.repository
33
import com.vamsi3.android.screentranslator.core.data.model.ThemeMode
44
import com.vamsi3.android.screentranslator.core.data.model.TranslateApp
55
import com.vamsi3.android.screentranslator.core.data.model.UserData
6+
import kotlinx.coroutines.flow.Flow
67
import kotlinx.coroutines.flow.StateFlow
78
import kotlin.time.Duration
89

910
interface UserDataRepository {
10-
val userData: StateFlow<UserData>
11+
val userData: StateFlow<UserData?>
1112

1213
suspend fun setThemeMode(themeMode: ThemeMode)
1314

1415
suspend fun setTranslateApp(translateApp: TranslateApp)
16+
17+
suspend fun setNotificationShadeCollapseDelayDuration(notificationShadeCollapseDelayDuration: Duration)
1518
}

core/datastore/src/main/java/com/vamsi3/android/screentranslator/core/datastore/UserPreferencesDataSource.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.vamsi3.android.screentranslator.core.datastore
22

3+
import android.util.Log
34
import androidx.datastore.core.DataStore
45
import com.vamsi3.android.screentranslator.core.data.model.ThemeMode
56
import com.vamsi3.android.screentranslator.core.data.model.TranslateApp
@@ -11,14 +12,15 @@ import kotlinx.coroutines.flow.map
1112
import kotlinx.coroutines.flow.stateIn
1213
import javax.inject.Inject
1314
import kotlin.time.Duration
14-
import kotlin.time.Duration.Companion.milliseconds
15+
import kotlin.time.milliseconds
1516

1617
class UserPreferencesDataSource @Inject constructor(
1718
private val userPreferencesProto: DataStore<UserPreferencesProto>,
1819
) {
1920
val userData = userPreferencesProto.data
2021
.map {
2122
UserData(
23+
notificationShadeCollapseDelayDuration = it.notificationShadeCollapseDelayMilliseconds.milliseconds,
2224
themeMode = when(it.userThemePreference) {
2325
null,
2426
UserThemePreferenceProto.UNRECOGNIZED,
@@ -37,10 +39,20 @@ class UserPreferencesDataSource @Inject constructor(
3739
},
3840
)
3941
}
40-
.stateIn(CoroutineScope(Dispatchers.IO), SharingStarted.Eagerly, UserData(
41-
ThemeMode.SYSTEM,
42-
TranslateApp.GOOGLE_LENS
43-
))
42+
.stateIn(
43+
scope = CoroutineScope(Dispatchers.IO),
44+
started = SharingStarted.Eagerly,
45+
initialValue = null
46+
)
47+
48+
suspend fun setNotificationShadeCollapseDelayDuration(notificationShadeCollapseDelayDuration: Duration) {
49+
userPreferencesProto.updateData {
50+
it.copy {
51+
Log.i("ScreenTranslator", "updating to $notificationShadeCollapseDelayDuration")
52+
this.notificationShadeCollapseDelayMilliseconds = notificationShadeCollapseDelayDuration.inWholeMilliseconds.toInt()
53+
}
54+
}
55+
}
4456

4557
suspend fun setThemeMode(themeMode: ThemeMode) {
4658
userPreferencesProto.updateData {

core/datastore/src/main/proto/com/vamsi3/android/screentranslator/core/datastore/user_preferences.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ option java_package = "com.vamsi3.android.screentranslator.core.datastore";
77
option java_multiple_files = true;
88

99
message UserPreferencesProto {
10+
int32 notification_shade_collapse_delay_milliseconds = 2;
1011
UserThemePreferenceProto user_theme_preference = 3;
1112
UserTranslateAppPreferenceProto user_translate_app_preference = 4;
1213
}

core/model/src/main/java/com/vamsi3/android/screentranslator/core/data/model/ThemeMode.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,9 @@ enum class ThemeMode(
55
) {
66
SYSTEM("System"),
77
LIGHT("Light"),
8-
DARK("Dark")
8+
DARK("Dark");
9+
10+
companion object {
11+
val default = SYSTEM
12+
}
913
}

core/model/src/main/java/com/vamsi3/android/screentranslator/core/data/model/TranslateApp.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,9 @@ enum class TranslateApp(
77
) {
88
GOOGLE_LENS("Google Lens", "com.google.ar.lens", "com.google.vr.apps.ornament.app.lens.LensLauncherActivity"),
99
NAVER_PAPAGO("Naver Papago", "com.naver.labs.translator", "com.naver.labs.translator.ui.main.DeepLinkActivity"),
10-
DEEPL_TRANSLATE("DeepL Translate", "com.deepl.mobiletranslator", "com.deepl.mobiletranslator.MainActivity"),
10+
DEEPL_TRANSLATE("DeepL Translate", "com.deepl.mobiletranslator", "com.deepl.mobiletranslator.MainActivity");
11+
12+
companion object {
13+
val default = GOOGLE_LENS
14+
}
1115
}

core/model/src/main/java/com/vamsi3/android/screentranslator/core/data/model/UserData.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kotlin.time.Duration
66
* Class summarizing user interest data
77
*/
88
data class UserData(
9+
val notificationShadeCollapseDelayDuration: Duration,
910
val themeMode: ThemeMode,
1011
val translateApp: TranslateApp,
1112
)

core/ui/src/main/java/com/vamsi3/android/screentranslator/core/ui/HomeScreen.kt

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.vamsi3.android.screentranslator.core.ui
22

3+
import android.util.Log
34
import androidx.compose.foundation.isSystemInDarkTheme
45
import androidx.compose.foundation.layout.Column
56
import androidx.compose.foundation.layout.fillMaxSize
@@ -10,20 +11,32 @@ import androidx.compose.material3.Surface
1011
import androidx.compose.material3.Text
1112
import androidx.compose.runtime.Composable
1213
import androidx.compose.runtime.getValue
14+
import androidx.compose.runtime.mutableStateOf
15+
import androidx.compose.runtime.setValue
1316
import androidx.compose.ui.Modifier
1417
import androidx.compose.ui.platform.LocalUriHandler
1518
import androidx.compose.ui.res.stringResource
1619
import androidx.compose.ui.unit.dp
1720
import androidx.hilt.navigation.compose.hiltViewModel
21+
import androidx.lifecycle.Lifecycle
1822
import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
1923
import androidx.lifecycle.compose.collectAsStateWithLifecycle
24+
import androidx.lifecycle.lifecycleScope
25+
import androidx.lifecycle.repeatOnLifecycle
2026
import com.vamsi3.android.screentranslator.core.data.model.ThemeMode
27+
import com.vamsi3.android.screentranslator.core.data.model.TranslateApp
2128
import com.vamsi3.android.screentranslator.core.design.theme.ScreenTranslatorTheme
2229
import com.vamsi3.android.screentranslator.core.design.util.ThemePreviews
2330
import com.vamsi3.android.screentranslator.core.resource.R
31+
import com.vamsi3.android.screentranslator.feature.settings.SettingsData
2432
import com.vamsi3.android.screentranslator.feature.settings.SettingsScreen
2533
import com.vamsi3.android.screentranslator.feature.settings.SettingsUiState
34+
import com.vamsi3.android.screentranslator.feature.settings.SettingsUiState.Loading
35+
import com.vamsi3.android.screentranslator.feature.settings.SettingsUiState.Success
2636
import com.vamsi3.android.screentranslator.feature.settings.SettingsViewModel
37+
import kotlinx.coroutines.flow.collectLatest
38+
import kotlinx.coroutines.flow.onEmpty
39+
import kotlinx.coroutines.launch
2740

2841
@OptIn(ExperimentalLifecycleComposeApi::class)
2942
@Composable
@@ -32,15 +45,16 @@ fun HomeScreen(
3245
) {
3346
val settingsUiState by viewModel.uiState.collectAsStateWithLifecycle()
3447

48+
3549
when (settingsUiState) {
36-
SettingsUiState.Loading -> {
50+
Loading -> {
3751
Text(
3852
text = "Loading...",
3953
modifier = Modifier.padding(vertical = 16.dp)
4054
)
4155
}
42-
is SettingsUiState.Success -> {
43-
val darkTheme = when ((settingsUiState as SettingsUiState.Success).settingsData.themeMode) {
56+
is Success -> {
57+
val darkTheme = when ((settingsUiState as Success).settingsData.themeMode) {
4458
ThemeMode.SYSTEM -> isSystemInDarkTheme()
4559
ThemeMode.LIGHT -> false
4660
ThemeMode.DARK -> true

0 commit comments

Comments
 (0)