Skip to content

Commit 85b13fe

Browse files
committed
Push Beta
[Added some customize setting options] [Fixed task create date overflowed after undo] [Push 0.2.0-Build_beta05]
1 parent 3a67d7b commit 85b13fe

File tree

16 files changed

+167
-51
lines changed

16 files changed

+167
-51
lines changed

app/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ android {
1414
minSdk = 26
1515
targetSdk = 35
1616
versionCode = 22
17-
versionName = "0.2.0-Build_CI"
17+
versionName = "0.2.0-Build_beta05"
1818

1919
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2020
vectorDrawables {

app/release/app-release.apk

199 KB
Binary file not shown.

app/release/output-metadata.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"filters": [],
1313
"attributes": [],
1414
"versionCode": 22,
15-
"versionName": "0.2.0-Build_beta04",
15+
"versionName": "0.2.0-Build_beta05",
1616
"outputFile": "app-release.apk"
1717
}
1818
],

app/src/main/java/com/sqz/checklist/MainActivity.kt

+29-7
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,28 @@ import androidx.compose.runtime.remember
2121
import androidx.compose.runtime.setValue
2222
import androidx.compose.ui.Modifier
2323
import androidx.compose.ui.graphics.toArgb
24+
import androidx.lifecycle.coroutineScope
2425
import com.sqz.checklist.cache.clearExpiredCache
2526
import com.sqz.checklist.cache.clearOldCacheIfNeeded
27+
import com.sqz.checklist.database.DatabaseRepository
2628
import com.sqz.checklist.database.TaskDatabase
2729
import com.sqz.checklist.database.buildDatabase
30+
import com.sqz.checklist.preferences.PrimaryPreferences
2831
import com.sqz.checklist.ui.MainLayout
2932
import com.sqz.checklist.ui.theme.ChecklistTheme
33+
import kotlinx.coroutines.launch
3034

3135
class MainActivity : ComponentActivity() {
3236
companion object {
3337
lateinit var taskDatabase: TaskDatabase
3438
lateinit var appDir: String
3539
}
3640

41+
@Override
3742
override fun onCreate(savedInstanceState: Bundle?) {
3843
super.onCreate(savedInstanceState)
39-
taskDatabase = buildDatabase(applicationContext)
40-
appDir = applicationContext.filesDir.absolutePath
44+
taskDatabase = buildDatabase(applicationContext) // load database
45+
appDir = applicationContext.filesDir.absolutePath // load app dir location
4146
setContent {
4247
var getNavHeight by remember { mutableIntStateOf(0) }
4348
val navigationBars = WindowInsets.navigationBars.toString()
@@ -61,29 +66,46 @@ class MainActivity : ComponentActivity() {
6166
.windowInsetsPadding(WindowInsets.statusBars) // Do not override state bar area
6267
.fillMaxSize() then windowInsetsPadding,
6368
color = MaterialTheme.colorScheme.background
64-
) {
69+
) { // Main app UI
6570
MainLayout(
6671
context = applicationContext,
6772
view = window.decorView,
6873
)
6974
}
7075
@Suppress("DEPRECATION")
71-
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
76+
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // set state bar color for low android version
7277
window.statusBarColor = stateBarColor.toArgb()
7378
window.navigationBarColor = if (isSystemInDarkTheme()) {
7479
MaterialTheme.colorScheme.onSecondary.toArgb()
75-
} else {
76-
MaterialTheme.colorScheme.secondary.toArgb()
77-
}
80+
} else MaterialTheme.colorScheme.secondary.toArgb()
7881
}
7982
}
8083
}
8184
}
8285

86+
@Override
87+
override fun onDestroy() {
88+
super.onDestroy()
89+
clearHistoryWhenLeaved()
90+
}
91+
92+
@Override
93+
override fun onStart() {
94+
super.onStart()
95+
clearHistoryWhenLeaved()
96+
}
97+
8398
@Override
8499
override fun onStop() {
85100
super.onStop()
86101
clearExpiredCache(applicationContext)
87102
clearOldCacheIfNeeded(applicationContext)
88103
}
104+
105+
private fun clearHistoryWhenLeaved() {
106+
if (PrimaryPreferences(applicationContext).clearHistoryWhenLeaved()) super.lifecycle.coroutineScope.launch {
107+
DatabaseRepository(taskDatabase).deleteAllHistory()
108+
Log.d("clearHistoryWhenLeaved", "Clear all history")
109+
}
110+
}
89111
}

app/src/main/java/com/sqz/checklist/preferences/PrimaryPreferences.kt

+12
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,16 @@ class PrimaryPreferences(context: Context) : PreferencesAccess(context) {
4848
if (setter != null) writePreferencesState(preferences, setter)
4949
return readPreferencesState(preferences, false)
5050
}
51+
52+
fun clearHistoryWhenLeaved(setter: Boolean? = null): Boolean {
53+
val preferences = "clear_history_when_leaved"
54+
if (setter != null) writePreferencesState(preferences, setter)
55+
return readPreferencesState(preferences, false)
56+
}
57+
58+
fun disableUndoButton(setter: Boolean? = null): Boolean {
59+
val preferences = "disable_undo_button"
60+
if (setter != null) writePreferencesState(preferences, setter)
61+
return readPreferencesState(preferences, false)
62+
}
5163
}

app/src/main/java/com/sqz/checklist/ui/main/settings/layout/SettingsLayout.kt

+16-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.displayCutout
1313
import androidx.compose.foundation.layout.fillMaxSize
1414
import androidx.compose.foundation.layout.fillMaxWidth
1515
import androidx.compose.foundation.layout.height
16+
import androidx.compose.foundation.layout.heightIn
1617
import androidx.compose.foundation.layout.navigationBars
1718
import androidx.compose.foundation.layout.padding
1819
import androidx.compose.foundation.lazy.LazyColumn
@@ -38,6 +39,7 @@ import androidx.compose.runtime.setValue
3839
import androidx.compose.ui.Alignment
3940
import androidx.compose.ui.Modifier
4041
import androidx.compose.ui.graphics.SolidColor
42+
import androidx.compose.ui.layout.onGloballyPositioned
4143
import androidx.compose.ui.platform.LocalConfiguration
4244
import androidx.compose.ui.platform.LocalDensity
4345
import androidx.compose.ui.platform.LocalLayoutDirection
@@ -77,9 +79,11 @@ fun SettingsLayout(
7779
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE && screenIsWidth
7880
) (WindowInsets.navigationBars.getBottom(LocalDensity.current) / LocalDensity.current.density).dp else 10.dp
7981
val settingsList = @Composable {
82+
var currentHeight by remember { mutableIntStateOf(0) }
83+
val searchBarSpace = if (currentHeight > 55) (currentHeight + 10).dp else 55.dp
8084
Box(safePaddingForFullscreen) {
8185
if (inSearchText == null) LazyColumn {
82-
item { if (viewModel.getSearchState()) Spacer(Modifier.height(55.dp)) }
86+
item { if (viewModel.getSearchState()) Spacer(Modifier.height(searchBarSpace)) }
8387
item { SubtitleText(stringResource(R.string.task_history)) }
8488
item {
8589
var height by remember { mutableIntStateOf(0) }
@@ -119,12 +123,12 @@ fun SettingsLayout(
119123
text.contains(inSearchText!!)
120124
}
121125
LazyColumn {
122-
item { if (viewModel.getSearchState()) Spacer(Modifier.height(55.dp)) }
126+
item { if (viewModel.getSearchState()) Spacer(Modifier.height(searchBarSpace)) }
123127
items(list) { it.Content() }
124128
item { Spacer(modifier = modifier.height(2.dp + safeBottomForFullscreen)) }
125129
}
126130
}
127-
inSearchText = if (viewModel.getSearchState()) searchBar() else {
131+
inSearchText = if (viewModel.getSearchState()) searchBar { currentHeight = it } else {
128132
null
129133
}
130134
}
@@ -142,25 +146,30 @@ fun SettingsLayout(
142146
}
143147

144148
@Composable
145-
private fun searchBar(): String? {
149+
private fun searchBar(currentHeight: (Int) -> Unit = {}): String? {
146150
val textFieldState = rememberTextFieldState()
147151
Box {
152+
val density = LocalDensity.current
148153
OutlinedCard(
149154
modifier = Modifier
150155
.fillMaxWidth()
151156
.padding(start = 18.dp, end = 18.dp, top = 12.dp)
152-
.height(50.dp),
157+
.heightIn(min = 50.dp)
158+
.onGloballyPositioned { layoutCoordinates ->
159+
val heightPx = layoutCoordinates.size.height
160+
currentHeight(with(density) { heightPx.toDp() }.value.toInt())
161+
},
153162
shape = ShapeDefaults.ExtraLarge
154163
) {
155-
Row(verticalAlignment = Alignment.CenterVertically) {
164+
Row(Modifier.heightIn(min = 50.dp), verticalAlignment = Alignment.CenterVertically) {
156165
Icon(
157166
modifier = Modifier.padding(start = 10.dp),
158167
imageVector = Icons.Filled.Search,
159168
contentDescription = stringResource(id = R.string.search)
160169
)
161170
BasicTextField(
162171
modifier = Modifier
163-
.fillMaxSize()
172+
.fillMaxWidth()
164173
.padding(start = 9.dp, end = 9.dp, top = 10.dp, bottom = 8.dp)
165174
.horizontalScroll(rememberScrollState()),
166175
state = textFieldState,

app/src/main/java/com/sqz/checklist/ui/main/settings/layout/SettingsList.kt

+45-5
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,15 @@ fun settingsList(
8282
val primaryPreferences = PrimaryPreferences(view.context)
8383
var heightDp by rememberSaveable { mutableIntStateOf(0) }
8484
val list = listOf(
85+
// History
86+
allowedNumberOfHistory(primaryPreferences, view),
87+
clearHistoryWhenLeaved(primaryPreferences, view),
88+
disableUndoButton(primaryPreferences, view),
8589
// Notification
8690
disableRemoveNotifyInReminded(primaryPreferences, view),
8791
disableNoScheduleExactAlarmNotice(primaryPreferences, view),
8892
recentlyRemindedKeepTime(primaryPreferences, view),
8993
removeNoticeInAutoDelReminded(primaryPreferences, view),
90-
// History
91-
allowedNumberOfHistory(primaryPreferences, view),
9294
// General
9395
pictureCompressionRate(primaryPreferences, view),
9496
videoCompressionRate(primaryPreferences, view),
@@ -361,10 +363,10 @@ private fun removeNoticeInAutoDelReminded(
361363
}
362364

363365
@Composable
364-
private fun allowedNumberOfHistory(references: PrimaryPreferences, view: View): SettingsItem {
366+
private fun allowedNumberOfHistory(preferences: PrimaryPreferences, view: View): SettingsItem {
365367
val content: @Composable (String) -> Unit = {
366368
var sliderPosition by remember {
367-
mutableFloatStateOf(references.allowedNumberOfHistory().toFloat())
369+
mutableFloatStateOf(preferences.allowedNumberOfHistory().toFloat())
368370
}
369371
var old by remember { mutableFloatStateOf(sliderPosition) }
370372
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && old != sliderPosition) {
@@ -385,7 +387,7 @@ private fun allowedNumberOfHistory(references: PrimaryPreferences, view: View):
385387
)
386388
Slider(
387389
value = sliderPosition, onValueChange = {
388-
sliderPosition = references.allowedNumberOfHistory(
390+
sliderPosition = preferences.allowedNumberOfHistory(
389391
it.toInt()
390392
).toFloat()
391393
}, colors = SliderDefaults.colors(
@@ -406,6 +408,44 @@ private fun allowedNumberOfHistory(references: PrimaryPreferences, view: View):
406408
}
407409
}
408410

411+
@Composable
412+
private fun clearHistoryWhenLeaved(preferences: PrimaryPreferences, view: View): SettingsItem {
413+
return SettingsItem(
414+
SettingsType.History, 64, stringResource(R.string.clear_history_when_leaved)
415+
) {
416+
Row(Modifier.padding(8.dp), verticalAlignment = Alignment.CenterVertically) {
417+
var setting by remember { mutableStateOf(preferences.clearHistoryWhenLeaved()) }
418+
OptionText(it, 48)
419+
Spacer(modifier = Modifier.weight(1f))
420+
Switch(
421+
checked = setting, onCheckedChange = {
422+
setting = preferences.clearHistoryWhenLeaved(it)
423+
view.playSoundEffect(SoundEffectConstants.CLICK)
424+
}
425+
)
426+
}
427+
}
428+
}
429+
430+
@Composable
431+
private fun disableUndoButton(preferences: PrimaryPreferences, view: View): SettingsItem {
432+
return SettingsItem(
433+
SettingsType.History, 64, stringResource(R.string.disable_undo_button)
434+
) {
435+
Row(Modifier.padding(8.dp), verticalAlignment = Alignment.CenterVertically) {
436+
var setting by remember { mutableStateOf(preferences.disableUndoButton()) }
437+
OptionText(it, 48)
438+
Spacer(modifier = Modifier.weight(1f))
439+
Switch(
440+
checked = setting, onCheckedChange = {
441+
setting = preferences.disableUndoButton(it)
442+
view.playSoundEffect(SoundEffectConstants.CLICK)
443+
}
444+
)
445+
}
446+
}
447+
}
448+
409449
private data class CompressionItem(val name: String, val value: Int)
410450

411451
@Composable

app/src/main/java/com/sqz/checklist/ui/main/task/TaskLayoutViewModel.kt

+23-20
Original file line numberDiff line numberDiff line change
@@ -137,28 +137,31 @@ open class TaskLayoutViewModel : ViewModel() {
137137
it.copy(checkTaskAction = true, undoActionId = id)
138138
}
139139

140-
fun undoTimeout(lazyState: LazyListState, context: Context): Boolean { // process undo button
141-
var rememberScroll by mutableIntStateOf(0)
142-
var rememberScrollIndex by mutableIntStateOf(0)
143-
val undoTimeout = { resetUndo(context) }
144-
if (_undo.value.checkTaskAction) viewModelScope.launch {
145-
while (true) {
146-
delay(50)
147-
rememberScroll = lazyState.firstVisibleItemScrollOffset
148-
rememberScrollIndex = lazyState.firstVisibleItemIndex
149-
_undo.update { it.copy(undoButtonState = true) }
150-
delay(1500)
151-
val isTimeout = rememberScroll > lazyState.firstVisibleItemScrollOffset + 10 ||
152-
rememberScroll < lazyState.firstVisibleItemScrollOffset - 10
153-
for (i in 1..7) {
154-
delay(500)
155-
if (rememberScrollIndex != lazyState.firstVisibleItemIndex || isTimeout) break
140+
/** Process undo button state **/
141+
fun undoButtonProcess(lazyState: LazyListState, context: Context): Boolean {
142+
if (!primaryPreferences(context).disableUndoButton()) {
143+
var rememberScroll by mutableIntStateOf(0)
144+
var rememberScrollIndex by mutableIntStateOf(0)
145+
val undoTimeout = { resetUndo(context) }
146+
if (_undo.value.checkTaskAction) viewModelScope.launch {
147+
while (true) {
148+
delay(50)
149+
rememberScroll = lazyState.firstVisibleItemScrollOffset
150+
rememberScrollIndex = lazyState.firstVisibleItemIndex
151+
_undo.update { it.copy(undoButtonState = true) }
152+
delay(1500)
153+
val isTimeout = rememberScroll > lazyState.firstVisibleItemScrollOffset + 10 ||
154+
rememberScroll < lazyState.firstVisibleItemScrollOffset - 10
155+
for (i in 1..7) {
156+
delay(500)
157+
if (rememberScrollIndex != lazyState.firstVisibleItemIndex || isTimeout) break
158+
}
159+
undoTimeout()
160+
break
156161
}
157-
undoTimeout()
158-
break
159162
}
160-
}
161-
return _undo.value.undoButtonState
163+
return _undo.value.undoButtonState
164+
} else return false.also { resetUndo(context) }
162165
}
163166

164167
/** Task click action **/

0 commit comments

Comments
 (0)