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 @@ -18,8 +18,8 @@ android {
applicationId = "co.adityarajput.notifilter"
minSdk = 29
targetSdk = 36
versionCode = 15
versionName = "4.0.0"
versionCode = 16
versionName = "4.1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@ import kotlinx.serialization.Serializable

@Serializable
data class App(val name: String, val packageName: String)

val None = App("", "")
val Any = App("Any app", ".*")
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import co.adityarajput.notifilter.Constants
import co.adityarajput.notifilter.R
import co.adityarajput.notifilter.data.AppContainer
import co.adityarajput.notifilter.data.models.Action
import co.adityarajput.notifilter.data.models.Any
import co.adityarajput.notifilter.data.models.Filter
import co.adityarajput.notifilter.data.models.Notification
import co.adityarajput.notifilter.utils.Logger
Expand Down Expand Up @@ -115,7 +116,7 @@ class NotificationListener : NotificationListenerService() {
Logger.d("NotificationListener.onNotificationPosted", "Received $notification")

val filter = filters.filter {
notification.origin == it.app.packageName
(notification.origin == it.app.packageName || it.app == Any)
&& it.enabled
&& it.schedule.includesNow()
&& it.matchesTextOf(notification)
Expand Down Expand Up @@ -230,7 +231,11 @@ class NotificationListener : NotificationListenerService() {
}

serviceScope.launch {
repository.registerHit(filter, notification.copy(origin = filter.app.name))
repository.registerHit(
filter,
if (filter.app == Any) notification
else notification.copy(origin = filter.app.name),
)
notifications = repository.notifications().first()
Logger.d(
"NotificationListener.onNotificationPosted",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class UpsertFilterViewModel(
data class Values(
val filterId: Int = 0,
val notification: Notification? = null,
val app: App = App("", ""),
val app: App = None,
val regexTarget: RegexTarget = RegexTarget.OR,
val queryPattern: String = "",
val secondaryQueryPattern: String = "",
Expand Down Expand Up @@ -87,7 +87,7 @@ class UpsertFilterViewModel(

init {
viewModelScope.launch {
while (state.page.isFirstPage()) {
while (true) {
activeNotifications = NotificationListener.instance
?.activeNotifications
?.filter { it.notification.flags and FLAG_GROUP_SUMMARY == 0 }
Expand All @@ -109,7 +109,7 @@ class UpsertFilterViewModel(
when (page) {
FormPage.ZAPPER -> return null

FormPage.PACKAGE -> if (values.app.packageName.isBlank()) return FormError.BLANK_FIELDS
FormPage.PACKAGE -> if (values.app == None) return FormError.BLANK_FIELDS

FormPage.PATTERN -> {
if (values.queryPattern.isBlank()) return FormError.BLANK_FIELDS
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.lifecycle.viewmodel.compose.viewModel
import co.adityarajput.notifilter.R
import co.adityarajput.notifilter.data.models.Any
import co.adityarajput.notifilter.data.models.RegexTarget
import co.adityarajput.notifilter.utils.getFirst
import co.adityarajput.notifilter.utils.getToggleString
Expand Down Expand Up @@ -98,7 +99,8 @@ fun FiltersScreen(
}
},
it.action.verb(),
it.app.name.getFirst(30),
if (it.app == Any) stringResource(R.string.any_app)
else it.app.name.getFirst(30),
if (!it.enabled) stringResource(R.string.filter_disabled)
else if (!it.historyEnabled) stringResource(R.string.history_disabled)
else pluralStringResource(R.plurals.hit, it.hits, it.hits),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextDecoration
import androidx.lifecycle.viewmodel.compose.viewModel
import co.adityarajput.notifilter.R
import co.adityarajput.notifilter.data.models.Action
import co.adityarajput.notifilter.data.models.App
import co.adityarajput.notifilter.data.models.RegexTarget
import co.adityarajput.notifilter.data.models.*
import co.adityarajput.notifilter.utils.filterFirst
import co.adityarajput.notifilter.utils.getFirst
import co.adityarajput.notifilter.utils.hasAccessibilityServicePermission
Expand Down Expand Up @@ -219,8 +217,14 @@ private fun ZapperPage(viewModel: UpsertFilterViewModel) {
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun PackagePage(viewModel: UpsertFilterViewModel) {
var searchString by remember { mutableStateOf("") }
var searchString by remember {
mutableStateOf(
if (viewModel.state.values.app == Any) ""
else viewModel.state.values.app.name,
)
}
var visibleItemsCount by remember { mutableIntStateOf(10) }
var showAdvancedOptions by remember { mutableStateOf(viewModel.state.values.app == Any) }
var showSystemPackages by remember { mutableStateOf(false) }

val (apps, searchFinished) = (if (showSystemPackages) viewModel.allPackages else viewModel.visibleApps)
Expand All @@ -244,26 +248,72 @@ private fun PackagePage(viewModel: UpsertFilterViewModel) {
),
singleLine = true,
)
Row(
Modifier
.padding(vertical = dimensionResource(R.dimen.padding_medium))
.toggleable(showSystemPackages) { showSystemPackages = it },
Arrangement.spacedBy(dimensionResource(R.dimen.padding_small)),
Alignment.CenterVertically,
Column(
Modifier.padding(dimensionResource(R.dimen.padding_medium)),
Arrangement.spacedBy(dimensionResource(R.dimen.padding_medium)),
) {
Checkbox(showSystemPackages, null)
Column {
Row(
Modifier.toggleable(showAdvancedOptions) { showAdvancedOptions = it },
Arrangement.spacedBy(dimensionResource(R.dimen.padding_small)),
Alignment.CenterVertically,
) {
Checkbox(showAdvancedOptions, null)
Text(
stringResource(R.string.show_system_packages),
stringResource(R.string.advanced_options),
style = MaterialTheme.typography.labelLarge,
fontWeight = FontWeight.Normal,
)
Text(
stringResource(R.string.system_packages_warning),
Modifier.padding(top = dimensionResource(R.dimen.padding_small)),
style = MaterialTheme.typography.labelMedium,
fontWeight = FontWeight.Normal,
)
}
if (showAdvancedOptions) {
Row(
Modifier
.padding(horizontal = dimensionResource(R.dimen.padding_small))
.toggleable(viewModel.state.values.app == Any) {
viewModel.updateForm(
FormPage.PACKAGE,
viewModel.state.values.copy(app = if (it) Any else None),
)
},
Arrangement.spacedBy(dimensionResource(R.dimen.padding_small)),
Alignment.CenterVertically,
) {
Checkbox(viewModel.state.values.app == Any, null)
Column {
Text(
stringResource(R.string.target_all_apps),
style = MaterialTheme.typography.labelLarge,
fontWeight = FontWeight.Normal,
)
Text(
stringResource(R.string.all_apps_warning),
Modifier.padding(top = dimensionResource(R.dimen.padding_small)),
style = MaterialTheme.typography.labelMedium,
fontWeight = FontWeight.Normal,
)
}
}
Row(
Modifier
.padding(horizontal = dimensionResource(R.dimen.padding_small))
.toggleable(showSystemPackages) { showSystemPackages = it },
Arrangement.spacedBy(dimensionResource(R.dimen.padding_small)),
Alignment.CenterVertically,
) {
Checkbox(showSystemPackages, null)
Column {
Text(
stringResource(R.string.show_system_packages),
style = MaterialTheme.typography.labelLarge,
fontWeight = FontWeight.Normal,
)
Text(
stringResource(R.string.system_packages_warning),
Modifier.padding(top = dimensionResource(R.dimen.padding_small)),
style = MaterialTheme.typography.labelMedium,
fontWeight = FontWeight.Normal,
)
}
}
}
}
FlowRow(
Expand Down
6 changes: 5 additions & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<resources>
<string name="app_name">NotiFilter</string>
<string name="app_name_launcher">NotiFilter</string>
<string name="app_version">4.0.0</string>
<string name="app_version">4.1.0</string>

<string name="no_filters">No filters added.\nTap + to get started.</string>
<string name="on_weekdays">"on weekdays "</string>
Expand All @@ -13,6 +13,7 @@
<string name="tap_button_short">tap \"%1$s\"</string>
<string name="batch_short">batch every %1$s</string>
<string name="delay_short">delay notifications</string>
<string name="any_app">Any app</string>
<string name="history_disabled">history disabled</string>
<string name="filter_disabled">filter disabled</string>

Expand All @@ -38,6 +39,9 @@
<string name="no_active_notifications">Waiting for active notifications…</string>
<string name="zapper_page_title">Choose a notification to target</string>
<string name="package_page_title">Choose an app to target</string>
<string name="advanced_options">Advanced options</string>
<string name="target_all_apps">Target all apps?</string>
<string name="all_apps_warning">Targeting all apps is rarely necessary. This may cause unexpected issues.</string>
<string name="show_system_packages">Show system packages?</string>
<string name="system_packages_warning">Notifications from system packages may contain critical information.</string>
<string name="package_name">Package name</string>
Expand Down
3 changes: 3 additions & 0 deletions metadata/en-US/changelogs/16.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
• fix: Handle TAP_NOTIFICATION on Android 14 & 15
• feat: Let filters target all apps
• fix: Improve UI of "create/edit filter" screen