diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt b/app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt
index cc3a742..fd66a70 100644
--- a/app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt
+++ b/app/src/main/java/com/fankes/apperrorstracking/bean/AppFiltersBean.kt
@@ -21,14 +21,15 @@
*/
package com.fankes.apperrorstracking.bean
+import com.fankes.apperrorstracking.bean.enum.AppFiltersType
import java.io.Serializable
/**
* 应用过滤条件 bean
* @param name 名称或包名
- * @param isContainsSystem 是否包含系统应用
+ * @param type 过滤条件类型
*/
data class AppFiltersBean(
var name: String = "",
- var isContainsSystem: Boolean = false
+ var type: AppFiltersType = AppFiltersType.USER
) : Serializable
\ No newline at end of file
diff --git a/app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt b/app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt
new file mode 100644
index 0000000..5f8bdd7
--- /dev/null
+++ b/app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt
@@ -0,0 +1,36 @@
+/*
+ * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer.
+ * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com)
+ * https://github.com/KitsunePie/AppErrorsTracking
+ *
+ * This software is non-free but opensource software: you can redistribute it
+ * and/or modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * and eula along with this software. If not, see
+ *
+ *
+ * This file is Created by fankes on 2023/1/22.
+ */
+package com.fankes.apperrorstracking.bean.enum
+
+/**
+ * 应用过滤条件类型定义类
+ */
+enum class AppFiltersType {
+ /** 用户 */
+ USER,
+
+ /** 系统 */
+ SYSTEM,
+
+ /** 全部 */
+ ALL
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt b/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt
index 91a1ea3..695bc1f 100644
--- a/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt
+++ b/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt
@@ -26,6 +26,7 @@ import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
+import android.content.pm.PackageInfo
import android.os.Build
import android.os.Message
import android.os.SystemClock
@@ -38,6 +39,7 @@ import com.fankes.apperrorstracking.bean.AppErrorsDisplayBean
import com.fankes.apperrorstracking.bean.AppErrorsInfoBean
import com.fankes.apperrorstracking.bean.AppInfoBean
import com.fankes.apperrorstracking.bean.MutedErrorsAppBean
+import com.fankes.apperrorstracking.bean.enum.AppFiltersType
import com.fankes.apperrorstracking.data.AppErrorsConfigData
import com.fankes.apperrorstracking.data.AppErrorsRecordData
import com.fankes.apperrorstracking.data.ConfigData
@@ -245,9 +247,16 @@ object FrameworkHooker : YukiBaseHooker() {
(if (filters.name.isNotBlank()) info.filter {
it.packageName.contains(filters.name) || context.appNameOf(it.packageName).contains(filters.name)
} else info).let { result ->
- if (filters.isContainsSystem.not())
- result.filter { (it.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) == 0 }
- else result
+ /**
+ * 是否为系统应用
+ * @return [Boolean]
+ */
+ fun PackageInfo.isSystemApp() = (applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) != 0
+ when (filters.type) {
+ AppFiltersType.USER -> result.filter { it.isSystemApp().not() }
+ AppFiltersType.SYSTEM -> result.filter { it.isSystemApp() }
+ AppFiltersType.ALL -> result
+ }
}.sortedByDescending { it.lastUpdateTime }
.forEach { add(AppInfoBean(name = context.appNameOf(it.packageName), packageName = it.packageName)) }
}.apply { if (size <= 0) loggerW(msg = "Fetched installed packages but got empty list") }
diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt
index 43d1512..b4e5d7f 100644
--- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt
+++ b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/errors/AppErrorsRecordActivity.kt
@@ -35,6 +35,7 @@ import com.fankes.apperrorstracking.BuildConfig
import com.fankes.apperrorstracking.R
import com.fankes.apperrorstracking.bean.AppErrorsInfoBean
import com.fankes.apperrorstracking.bean.AppFiltersBean
+import com.fankes.apperrorstracking.bean.enum.AppFiltersType
import com.fankes.apperrorstracking.databinding.ActivityAppErrorsRecordBinding
import com.fankes.apperrorstracking.databinding.AdapterAppErrorsRecordBinding
import com.fankes.apperrorstracking.databinding.DiaAppErrorsStatisticsBinding
@@ -76,7 +77,7 @@ class AppErrorsRecordActivity : BaseActivity() {
title = LocaleString.notice
progressContent = LocaleString.generatingStatistics
noCancelable()
- FrameworkTool.fetchAppListData(context, AppFiltersBean(isContainsSystem = true)) {
+ FrameworkTool.fetchAppListData(context, AppFiltersBean(type = AppFiltersType.ALL)) {
newThread {
val errorsApps = listData.groupBy { it.packageName }
.map { it.key to it.value.size }
diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt
index f73df43..bdd9ef6 100644
--- a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt
+++ b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/ConfigureActivity.kt
@@ -24,6 +24,7 @@ package com.fankes.apperrorstracking.ui.activity.main
import androidx.core.view.isVisible
import com.fankes.apperrorstracking.bean.AppFiltersBean
import com.fankes.apperrorstracking.bean.AppInfoBean
+import com.fankes.apperrorstracking.bean.enum.AppFiltersType
import com.fankes.apperrorstracking.data.AppErrorsConfigData
import com.fankes.apperrorstracking.data.enum.AppErrorsConfigType
import com.fankes.apperrorstracking.databinding.ActivityConfigBinding
@@ -73,7 +74,9 @@ class ConfigureActivity : BaseActivity() {
binding.filterIcon.setOnClickListener {
showDialog {
title = LocaleString.filterByCondition
- binding.containsSystemSwitch.isChecked = appFilters.isContainsSystem
+ binding.filtersRadioUser.isChecked = appFilters.type == AppFiltersType.USER
+ binding.filtersRadioSystem.isChecked = appFilters.type == AppFiltersType.SYSTEM
+ binding.filtersRadioAll.isChecked = appFilters.type == AppFiltersType.ALL
binding.appFiltersEdit.apply {
requestFocus()
invalidate()
@@ -82,15 +85,24 @@ class ConfigureActivity : BaseActivity() {
setSelection(appFilters.name.length)
}
}
+ /** 设置 [AppFiltersBean.type] */
+ fun setAppFiltersType() {
+ appFilters.type = when {
+ binding.filtersRadioUser.isChecked -> AppFiltersType.USER
+ binding.filtersRadioSystem.isChecked -> AppFiltersType.SYSTEM
+ binding.filtersRadioAll.isChecked -> AppFiltersType.ALL
+ else -> error("Invalid app filters type")
+ }
+ }
confirmButton {
- appFilters.isContainsSystem = binding.containsSystemSwitch.isChecked
+ setAppFiltersType()
appFilters.name = binding.appFiltersEdit.text.toString().trim()
refreshData()
}
cancelButton()
if (appFilters.name.isNotBlank())
neutralButton(LocaleString.clearFilters) {
- appFilters.isContainsSystem = binding.containsSystemSwitch.isChecked
+ setAppFiltersType()
appFilters.name = ""
refreshData()
}
diff --git a/app/src/main/res/layout/dia_apps_filter.xml b/app/src/main/res/layout/dia_apps_filter.xml
index ab4539b..33de19b 100644
--- a/app/src/main/res/layout/dia_apps_filter.xml
+++ b/app/src/main/res/layout/dia_apps_filter.xml
@@ -21,11 +21,37 @@
android:singleLine="true" />
-
+ android:orientation="horizontal">
+
+
+
+
+
+
+
\ No newline at end of file