mirror of
https://github.com/KitsunePie/AppErrorsTracking.git
synced 2025-09-01 08:45:16 +08:00
Modify change apps config filters function with 3 types such as user apps, system apps and all apps
This commit is contained in:
@@ -21,14 +21,15 @@
|
|||||||
*/
|
*/
|
||||||
package com.fankes.apperrorstracking.bean
|
package com.fankes.apperrorstracking.bean
|
||||||
|
|
||||||
|
import com.fankes.apperrorstracking.bean.enum.AppFiltersType
|
||||||
import java.io.Serializable
|
import java.io.Serializable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 应用过滤条件 bean
|
* 应用过滤条件 bean
|
||||||
* @param name 名称或包名
|
* @param name 名称或包名
|
||||||
* @param isContainsSystem 是否包含系统应用
|
* @param type 过滤条件类型
|
||||||
*/
|
*/
|
||||||
data class AppFiltersBean(
|
data class AppFiltersBean(
|
||||||
var name: String = "",
|
var name: String = "",
|
||||||
var isContainsSystem: Boolean = false
|
var type: AppFiltersType = AppFiltersType.USER
|
||||||
) : Serializable
|
) : Serializable
|
@@ -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
|
||||||
|
* <https://www.gnu.org/licenses/>
|
||||||
|
*
|
||||||
|
* This file is Created by fankes on 2023/1/22.
|
||||||
|
*/
|
||||||
|
package com.fankes.apperrorstracking.bean.enum
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 应用过滤条件类型定义类
|
||||||
|
*/
|
||||||
|
enum class AppFiltersType {
|
||||||
|
/** 用户 */
|
||||||
|
USER,
|
||||||
|
|
||||||
|
/** 系统 */
|
||||||
|
SYSTEM,
|
||||||
|
|
||||||
|
/** 全部 */
|
||||||
|
ALL
|
||||||
|
}
|
@@ -26,6 +26,7 @@ import android.app.Dialog
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.pm.ApplicationInfo
|
import android.content.pm.ApplicationInfo
|
||||||
|
import android.content.pm.PackageInfo
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Message
|
import android.os.Message
|
||||||
import android.os.SystemClock
|
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.AppErrorsInfoBean
|
||||||
import com.fankes.apperrorstracking.bean.AppInfoBean
|
import com.fankes.apperrorstracking.bean.AppInfoBean
|
||||||
import com.fankes.apperrorstracking.bean.MutedErrorsAppBean
|
import com.fankes.apperrorstracking.bean.MutedErrorsAppBean
|
||||||
|
import com.fankes.apperrorstracking.bean.enum.AppFiltersType
|
||||||
import com.fankes.apperrorstracking.data.AppErrorsConfigData
|
import com.fankes.apperrorstracking.data.AppErrorsConfigData
|
||||||
import com.fankes.apperrorstracking.data.AppErrorsRecordData
|
import com.fankes.apperrorstracking.data.AppErrorsRecordData
|
||||||
import com.fankes.apperrorstracking.data.ConfigData
|
import com.fankes.apperrorstracking.data.ConfigData
|
||||||
@@ -245,9 +247,16 @@ object FrameworkHooker : YukiBaseHooker() {
|
|||||||
(if (filters.name.isNotBlank()) info.filter {
|
(if (filters.name.isNotBlank()) info.filter {
|
||||||
it.packageName.contains(filters.name) || context.appNameOf(it.packageName).contains(filters.name)
|
it.packageName.contains(filters.name) || context.appNameOf(it.packageName).contains(filters.name)
|
||||||
} else info).let { result ->
|
} 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 }
|
}.sortedByDescending { it.lastUpdateTime }
|
||||||
.forEach { add(AppInfoBean(name = context.appNameOf(it.packageName), packageName = it.packageName)) }
|
.forEach { add(AppInfoBean(name = context.appNameOf(it.packageName), packageName = it.packageName)) }
|
||||||
}.apply { if (size <= 0) loggerW(msg = "Fetched installed packages but got empty list") }
|
}.apply { if (size <= 0) loggerW(msg = "Fetched installed packages but got empty list") }
|
||||||
|
@@ -35,6 +35,7 @@ import com.fankes.apperrorstracking.BuildConfig
|
|||||||
import com.fankes.apperrorstracking.R
|
import com.fankes.apperrorstracking.R
|
||||||
import com.fankes.apperrorstracking.bean.AppErrorsInfoBean
|
import com.fankes.apperrorstracking.bean.AppErrorsInfoBean
|
||||||
import com.fankes.apperrorstracking.bean.AppFiltersBean
|
import com.fankes.apperrorstracking.bean.AppFiltersBean
|
||||||
|
import com.fankes.apperrorstracking.bean.enum.AppFiltersType
|
||||||
import com.fankes.apperrorstracking.databinding.ActivityAppErrorsRecordBinding
|
import com.fankes.apperrorstracking.databinding.ActivityAppErrorsRecordBinding
|
||||||
import com.fankes.apperrorstracking.databinding.AdapterAppErrorsRecordBinding
|
import com.fankes.apperrorstracking.databinding.AdapterAppErrorsRecordBinding
|
||||||
import com.fankes.apperrorstracking.databinding.DiaAppErrorsStatisticsBinding
|
import com.fankes.apperrorstracking.databinding.DiaAppErrorsStatisticsBinding
|
||||||
@@ -76,7 +77,7 @@ class AppErrorsRecordActivity : BaseActivity<ActivityAppErrorsRecordBinding>() {
|
|||||||
title = LocaleString.notice
|
title = LocaleString.notice
|
||||||
progressContent = LocaleString.generatingStatistics
|
progressContent = LocaleString.generatingStatistics
|
||||||
noCancelable()
|
noCancelable()
|
||||||
FrameworkTool.fetchAppListData(context, AppFiltersBean(isContainsSystem = true)) {
|
FrameworkTool.fetchAppListData(context, AppFiltersBean(type = AppFiltersType.ALL)) {
|
||||||
newThread {
|
newThread {
|
||||||
val errorsApps = listData.groupBy { it.packageName }
|
val errorsApps = listData.groupBy { it.packageName }
|
||||||
.map { it.key to it.value.size }
|
.map { it.key to it.value.size }
|
||||||
|
@@ -24,6 +24,7 @@ package com.fankes.apperrorstracking.ui.activity.main
|
|||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import com.fankes.apperrorstracking.bean.AppFiltersBean
|
import com.fankes.apperrorstracking.bean.AppFiltersBean
|
||||||
import com.fankes.apperrorstracking.bean.AppInfoBean
|
import com.fankes.apperrorstracking.bean.AppInfoBean
|
||||||
|
import com.fankes.apperrorstracking.bean.enum.AppFiltersType
|
||||||
import com.fankes.apperrorstracking.data.AppErrorsConfigData
|
import com.fankes.apperrorstracking.data.AppErrorsConfigData
|
||||||
import com.fankes.apperrorstracking.data.enum.AppErrorsConfigType
|
import com.fankes.apperrorstracking.data.enum.AppErrorsConfigType
|
||||||
import com.fankes.apperrorstracking.databinding.ActivityConfigBinding
|
import com.fankes.apperrorstracking.databinding.ActivityConfigBinding
|
||||||
@@ -73,7 +74,9 @@ class ConfigureActivity : BaseActivity<ActivityConfigBinding>() {
|
|||||||
binding.filterIcon.setOnClickListener {
|
binding.filterIcon.setOnClickListener {
|
||||||
showDialog<DiaAppsFilterBinding> {
|
showDialog<DiaAppsFilterBinding> {
|
||||||
title = LocaleString.filterByCondition
|
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 {
|
binding.appFiltersEdit.apply {
|
||||||
requestFocus()
|
requestFocus()
|
||||||
invalidate()
|
invalidate()
|
||||||
@@ -82,15 +85,24 @@ class ConfigureActivity : BaseActivity<ActivityConfigBinding>() {
|
|||||||
setSelection(appFilters.name.length)
|
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 {
|
confirmButton {
|
||||||
appFilters.isContainsSystem = binding.containsSystemSwitch.isChecked
|
setAppFiltersType()
|
||||||
appFilters.name = binding.appFiltersEdit.text.toString().trim()
|
appFilters.name = binding.appFiltersEdit.text.toString().trim()
|
||||||
refreshData()
|
refreshData()
|
||||||
}
|
}
|
||||||
cancelButton()
|
cancelButton()
|
||||||
if (appFilters.name.isNotBlank())
|
if (appFilters.name.isNotBlank())
|
||||||
neutralButton(LocaleString.clearFilters) {
|
neutralButton(LocaleString.clearFilters) {
|
||||||
appFilters.isContainsSystem = binding.containsSystemSwitch.isChecked
|
setAppFiltersType()
|
||||||
appFilters.name = ""
|
appFilters.name = ""
|
||||||
refreshData()
|
refreshData()
|
||||||
}
|
}
|
||||||
|
@@ -21,11 +21,37 @@
|
|||||||
android:singleLine="true" />
|
android:singleLine="true" />
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
<com.google.android.material.checkbox.MaterialCheckBox
|
<RadioGroup
|
||||||
android:id="@+id/contains_system_switch"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="10dp"
|
android:layout_marginTop="10dp"
|
||||||
android:text="@string/result_contains_system_apps"
|
android:orientation="horizontal">
|
||||||
app:buttonTint="@color/colorPrimaryAccent" />
|
|
||||||
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
|
android:id="@+id/filters_radio_user"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="10dp"
|
||||||
|
android:checked="true"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/user_apps"
|
||||||
|
app:buttonTint="@color/colorPrimaryAccent" />
|
||||||
|
|
||||||
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
|
android:id="@+id/filters_radio_system"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginEnd="10dp"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/system_apps"
|
||||||
|
app:buttonTint="@color/colorPrimaryAccent" />
|
||||||
|
|
||||||
|
<com.google.android.material.radiobutton.MaterialRadioButton
|
||||||
|
android:id="@+id/filters_radio_all"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/all_apps"
|
||||||
|
app:buttonTint="@color/colorPrimaryAccent" />
|
||||||
|
</RadioGroup>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
Reference in New Issue
Block a user