From 129977986856fed7eaac0404ea9b74bd9ab053e1 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sun, 22 Jan 2023 13:05:05 +0800 Subject: [PATCH] Modify change apps config filters function with 3 types such as user apps, system apps and all apps --- .../apperrorstracking/bean/AppFiltersBean.kt | 5 +-- .../bean/enum/AppFiltersType.kt | 36 +++++++++++++++++++ .../hook/entity/FrameworkHooker.kt | 15 ++++++-- .../errors/AppErrorsRecordActivity.kt | 3 +- .../ui/activity/main/ConfigureActivity.kt | 18 ++++++++-- app/src/main/res/layout/dia_apps_filter.xml | 36 ++++++++++++++++--- 6 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/com/fankes/apperrorstracking/bean/enum/AppFiltersType.kt 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