Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ android {
applicationId = "co.adityarajput.notifilter"
minSdk = 29
targetSdk = 36
versionCode = 26
versionName = "4.8.0"
versionCode = 27
versionName = "4.8.1"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ sealed class Action {
val entries by lazy {
listOf(
DISMISS, TAP_NOTIFICATION, TAP_BUTTON(""), BATCH(3),
DELAY, DEBOUNCE(2), MUTE, ALERT, DISTURB(5), DISMISS_STALE(10),
DELAY, DEBOUNCE(2), MUTE, ALERT, DISTURB(5), DISMISS_STALE(15),
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package co.adityarajput.notifilter.views.screens

import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import co.adityarajput.notifilter.R
import kotlin.math.max
import kotlin.math.min

@Composable
fun IntegerInput(
value: Int,
minValue: Int,
maxValue: Int,
stringResource: Int,
delta: Int = 1,
largeDelta: Int = delta * 5,
padLength: Int = 2,
onValueChange: (Int) -> Unit,
) {
Row(
Modifier.fillMaxWidth(),
Arrangement.Center,
Alignment.CenterVertically,
) {
Box(
Modifier
.padding(dimensionResource(R.dimen.padding_small))
.combinedClickable(
onClick = { onValueChange(max(minValue, value - delta)) },
onLongClick = { onValueChange(max(minValue, value - largeDelta)) },
),
) {
Icon(
painterResource(R.drawable.remove),
contentDescription = stringResource(R.string.alttext_subtract),
)
}
Text(
stringResource(
stringResource,
value.toString().padStart(padLength, '0'),
),
)
Box(
Modifier
.padding(dimensionResource(R.dimen.padding_small))
.combinedClickable(
onClick = { onValueChange(min(maxValue, value + delta)) },
onLongClick = { onValueChange(min(maxValue, value + largeDelta)) },
),
) {
Icon(
painterResource(R.drawable.add),
contentDescription = stringResource(R.string.alttext_add),
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringArrayResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
Expand Down Expand Up @@ -555,94 +554,33 @@ private fun ColumnScope.ActionPage(viewModel: UpsertFilterViewModel) {
}
}
AnimatedVisibility(it is Action.BATCH && viewModel.state.values.action is Action.BATCH) {
Row(
Modifier.fillMaxWidth(),
Arrangement.Center,
Alignment.CenterVertically,
) {
val batchLength = (viewModel.state.values.action as? Action.BATCH)?.batchLength ?: 3
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.BATCH((batchLength - 1))),
)
},
enabled = batchLength > 1,
) {
Icon(
painterResource(R.drawable.remove),
contentDescription = stringResource(R.string.alttext_subtract),
)
}
Text(
stringResource(
R.string.batch_frequency,
batchLength.toString().padStart(2, '0'),
),
IntegerInput(
(viewModel.state.values.action as? Action.BATCH)?.batchLength ?: 3,
1,
12,
R.string.batch_frequency,
) { value ->
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.BATCH(value)),
)
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.BATCH((batchLength + 1))),
)
},
enabled = batchLength < 12,
) {
Icon(
painterResource(R.drawable.add),
contentDescription = stringResource(R.string.alttext_add),
)
}
}
}
AnimatedVisibility(it is Action.DEBOUNCE && viewModel.state.values.action is Action.DEBOUNCE) {
Column(
Modifier.fillMaxWidth(),
Arrangement.spacedBy(dimensionResource(R.dimen.padding_medium)),
) {
Row(
Modifier.fillMaxWidth(),
Arrangement.Center,
Alignment.CenterVertically,
) {
val cooldownLength =
(viewModel.state.values.action as? Action.DEBOUNCE)?.cooldownLength ?: 2
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DEBOUNCE((cooldownLength - 1))),
)
},
enabled = cooldownLength > 1,
) {
Icon(
painterResource(R.drawable.remove),
contentDescription = stringResource(R.string.alttext_subtract),
)
}
Text(
stringResource(
R.string.cooldown_length,
cooldownLength.toString().padStart(2, '0'),
),
IntegerInput(
(viewModel.state.values.action as? Action.DEBOUNCE)?.cooldownLength ?: 2,
1,
30,
R.string.cooldown_length,
) { value ->
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DEBOUNCE(value)),
)
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DEBOUNCE((cooldownLength + 1))),
)
},
enabled = cooldownLength < 15,
) {
Icon(
painterResource(R.drawable.add),
contentDescription = stringResource(R.string.alttext_add),
)
}
}
Text(
stringResource(R.string.explain_debounce),
Expand Down Expand Up @@ -682,47 +620,16 @@ private fun ColumnScope.ActionPage(viewModel: UpsertFilterViewModel) {
Modifier.fillMaxWidth(),
Arrangement.spacedBy(dimensionResource(R.dimen.padding_medium)),
) {
Row(
Modifier.fillMaxWidth(),
Arrangement.Center,
Alignment.CenterVertically,
) {
val pauseLength =
(viewModel.state.values.action as? Action.DISTURB)?.pauseLength ?: 5
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DISTURB((pauseLength - 1))),
)
},
enabled = pauseLength > 1,
) {
Icon(
painterResource(R.drawable.remove),
contentDescription = stringResource(R.string.alttext_subtract),
)
}
Text(
stringResource(
R.string.pause_length,
pauseLength.toString().padStart(2, '0'),
),
IntegerInput(
(viewModel.state.values.action as? Action.DISTURB)?.pauseLength ?: 5,
1,
30,
R.string.pause_length,
) { value ->
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DISTURB(value)),
)
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DISTURB((pauseLength + 1))),
)
},
enabled = pauseLength < 15,
) {
Icon(
painterResource(R.drawable.add),
contentDescription = stringResource(R.string.alttext_add),
)
}
}
if (!hasPermissions.getValue(Permission.NOTIFICATION_POLICY)) {
ErrorText(R.string.notification_policy_permission_description)
Expand All @@ -747,48 +654,19 @@ private fun ColumnScope.ActionPage(viewModel: UpsertFilterViewModel) {
Modifier.fillMaxWidth(),
Arrangement.spacedBy(dimensionResource(R.dimen.padding_medium)),
) {
Row(
Modifier.fillMaxWidth(),
Arrangement.Center,
Alignment.CenterVertically,
) {
val retentionLength =
(viewModel.state.values.action as? Action.DISMISS_STALE)?.retentionLength
?: 10
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DISMISS_STALE((retentionLength - 5))),
)
},
enabled = retentionLength > 5,
) {
Icon(
painterResource(R.drawable.remove),
contentDescription = stringResource(R.string.alttext_subtract),
)
}
Text(
stringResource(
R.string.retention_length,
retentionLength.toString().padStart(2, '0'),
),
IntegerInput(
(viewModel.state.values.action as? Action.DISMISS_STALE)?.retentionLength ?: 15,
5,
300,
R.string.retention_length,
5,
30,
3,
) { value ->
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DISMISS_STALE(value)),
)
IconButton(
{
viewModel.updateForm(
viewModel.state.page,
viewModel.state.values.copy(action = Action.DISMISS_STALE((retentionLength + 5))),
)
},
enabled = retentionLength < 60,
) {
Icon(
painterResource(R.drawable.add),
contentDescription = stringResource(R.string.alttext_add),
)
}
}
if (!hasPermissions.getValue(Permission.SCHEDULE_EXACT_ALARM)) {
ErrorText(R.string.exact_alarm_permission_description)
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<resources>
<string name="app_name" translatable="false">NotiFilter</string>
<string name="app_name_launcher" translatable="false">NotiFilter</string>
<string name="app_version" translatable="false">4.8.0</string>
<string name="app_version" translatable="false">4.8.1</string>

<!-- region FiltersScreen -->
<string name="no_filters">No filters added.\nTap + to get started.</string>
Expand Down Expand Up @@ -115,7 +115,7 @@
<string name="pause_length">Enable after %1$s min(s)</string>
<string name="notification_policy_permission_description">NotiFilter requires access to the Notification Policy to change DND status.</string>
<string name="dismiss_stale_long">Remove stale notifications</string>
<string name="retention_length">Dismiss after %1$s min(s)</string>
<string name="retention_length">Dismiss after %1$s mins</string>
<string name="exact_alarm_permission_description">NotiFilter requires exemption from battery optimization to execute delayed dismissal.</string>
<string name="display_options">Choose where to display caught notification</string>
<string name="describe_history_screen">In-app History screen</string>
Expand Down
1 change: 1 addition & 0 deletions metadata/en-US/changelogs/27.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fix: Improve "IntegerInput" and expand ranges