Commit 48fa7c25 authored by wanglei's avatar wanglei

处理权限问题

parent 328eac6a
......@@ -256,10 +256,10 @@ class AppManagerActivity : BaseActivity<ActivityAppManagerBinding>() {
}
private fun initViewPager() {
pages.add(AppListFragment().apply { setInitData(launcher, APP_LIST_TYPE_NAME, true) })
pages.add(AppListFragment().apply { setInitData(launcher, APP_LIST_TYPE_INSTALL, false) })
pages.add(AppListFragment().apply { setInitData(launcher, APP_LIST_TYPE_SIZE, false, needPermission = true) })
pages.add(AppListFragment().apply { setInitData(launcher, APP_LIST_TYPE_LAST_USE, false, needPermission = true) })
pages.add(AppListFragment().apply { setInitData(APP_LIST_TYPE_NAME, true) })
pages.add(AppListFragment().apply { setInitData(APP_LIST_TYPE_INSTALL, false) })
pages.add(AppListFragment().apply { setInitData(APP_LIST_TYPE_SIZE, false, needPermission = true) })
pages.add(AppListFragment().apply { setInitData(APP_LIST_TYPE_LAST_USE, false, needPermission = true) })
pagerAdapter = ScreenSlidePagerAdapter(this@AppManagerActivity)
......
package com.test.basd.fastcleanerjunk.activity
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.Settings
import android.text.format.Formatter
import android.view.View
import android.view.ViewGroup
......@@ -16,8 +11,6 @@ import androidx.activity.addCallback
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.RecyclerView
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.PermissionUtils
import com.test.basd.fastcleanerjunk.R
import com.test.basd.fastcleanerjunk.activity.LargeFileCleanActivity.Filter.Companion.KEY_1_MONTH
import com.test.basd.fastcleanerjunk.activity.LargeFileCleanActivity.Filter.Companion.KEY_1_WEEK
......@@ -47,6 +40,7 @@ import com.test.basd.fastcleanerjunk.helps.BaseActivity
import com.test.basd.fastcleanerjunk.helps.FileHelps
import com.test.basd.fastcleanerjunk.helps.LogEx
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.checkStorePermission
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.manageStoreIntent
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.requestStorePermission
import com.test.basd.fastcleanerjunk.helps.TimeUtils
import com.test.basd.fastcleanerjunk.helps.ads.AdmobUtils
......@@ -176,23 +170,15 @@ class LargeFileCleanActivity : BaseActivity<ActivityLayoutLargeFileBinding>() {
initList()
} else {
DialogViews.showGerPermission(this, {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
if (intent.resolveActivity(packageManager) != null) {
requestStorePermission(launcher, jumpAction = {}, result = { flag ->
if (flag) {
playLottie()
initList()
} else {
finishToMain()
}
})
PermissionTripActivity.launch(this)
} else {
finishToMain()
}
requestStorePermission(launcher, result = { flag ->
if (flag) {
playLottie()
initList()
} else {
finishToMain()
}
}, resolveNoAction = { finishToMain() })
PermissionTripActivity.launch(this)
}, {
finishToMain()
})
......
package com.test.basd.fastcleanerjunk.activity
import android.annotation.SuppressLint
import android.app.AppOpsManager
import android.app.usage.NetworkStats
import android.app.usage.NetworkStatsManager
import android.content.Context
import android.graphics.Color
import android.net.ConnectivityManager
import android.os.Build
import android.util.SparseLongArray
import android.view.LayoutInflater
import android.view.View
......@@ -30,6 +28,8 @@ import com.test.basd.fastcleanerjunk.helps.BaseActivity
import com.test.basd.fastcleanerjunk.helps.ConfigHelper
import com.test.basd.fastcleanerjunk.helps.KotlinExt.toFormatSize
import com.test.basd.fastcleanerjunk.helps.NetworkStatsHelper
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.checkUsageAccessSettings
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.requestUsageAccessSettings
import com.test.basd.fastcleanerjunk.helps.ads.AdmobUtils
import com.test.basd.fastcleanerjunk.view.DialogViews
import kotlin.random.Random
......@@ -40,57 +40,9 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
private val wifiList = mutableListOf<TrafficBean>()
private val mobileList = mutableListOf<TrafficBean>()
private val AllList = mutableListOf<TrafficBean>()
private val allList = mutableListOf<TrafficBean>()
private var startTime = NetworkStatsHelper.getTimesMonthmorning()
private var types = 2
private var ifPlayAnimal = false
override fun onStart() {
super.onStart()
if (ifPlayAnimal) {
hasAccessSettings()
}
}
private fun hasAccessSettings() {
val appOpsManager = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
if (
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOpsManager.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
} else {
appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
}
) {
binding.idLlNoAccpermion.isVisible = false
initList()
} else {
binding.idLlNoAccpermion.isVisible = true
}
}
private fun playLottie() {
binding.idLlNetDh.isVisible = true
binding.idLottieNetwork.imageAssetsFolder = "wan_smax_gluo/images/"
binding.idLottieNetwork.setAnimation("wan_smax_gluo/data.json")
binding.idLottieNetwork.playAnimation()
binding.root.postDelayed({
AdmobUtils.showInterstitialAd(this) {
binding.idLlNetDh.isVisible = false
ifPlayAnimal=true
hasAccessSettings()
}
}, Random.nextLong(2500, 4000))
}
override val binding: ActivityLayoutNetworkBinding by lazy {
......@@ -102,9 +54,13 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
binding.root.updatePadding(top = BarUtils.getStatusBarHeight())
binding.idTvThisMonth.isSelected = true
playLottie()
}
@SuppressLint("SetTextI18n")
override fun initListener() {
binding.idBackNetwork.setOnClickListener {
......@@ -119,7 +75,14 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
})
binding.idGant.setOnClickListener {
checkAccesSettings(true)
requestUsageAccessSettings(launcher, result = { flag ->
if (flag) {
binding.idLlNoAccpermion.isVisible = false
setData()
} else {
finishToMain()
}
}, resolveNoAction = { finishToMain() })
}
binding.idTvThisMonth.setOnClickListener {
clickTop(0)
......@@ -147,7 +110,6 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
1 -> {
binding.idTvTypes.text = "Wi-Fi"
types = 1
}
2 -> {
......@@ -160,6 +122,24 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
}
}
private fun playLottie() {
binding.idLlNetDh.isVisible = true
binding.idLottieNetwork.imageAssetsFolder = "wan_smax_gluo/images/"
binding.idLottieNetwork.setAnimation("wan_smax_gluo/data.json")
binding.idLottieNetwork.playAnimation()
binding.root.postDelayed({
AdmobUtils.showInterstitialAd(this) {
binding.idLlNetDh.isVisible = false
if (checkUsageAccessSettings()) {
binding.idLlNoAccpermion.isVisible = false
setData()
} else {
binding.idLlNoAccpermion.isVisible = true
}
}
}, Random.nextLong(2500, 4000))
}
private fun clickTop(p: Int) {
listOf(binding.idTvThisMonth, binding.id30Day, binding.id24Hours).forEachIndexed { index, view ->
view.isSelected = p == index
......@@ -167,17 +147,13 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
}
private fun initList() {
setData()
// setMobileData(allMobide)
}
@SuppressLint("NotifyDataSetChanged")
@Suppress("DEPRECATION")
private fun setData(
) {
val allMobide = getNetworkStats(
val allMobile = getNetworkStats(
ConnectivityManager.TYPE_MOBILE,
startTime,
System.currentTimeMillis()
......@@ -186,11 +162,11 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
ConnectivityManager.TYPE_WIFI,
startTime, System.currentTimeMillis()
)
AllList.clear()
allList.clear()
mobileList.clear()
wifiList.clear()
var mobileSize = 0L
allMobide.forEach { key, value ->
allMobile.forEach { key, value ->
mobileSize += value
val appPkg = packageManager.getPackagesForUid(key)
if (appPkg?.isNotEmpty() == true) {
......@@ -234,15 +210,13 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
}
}
for (value in map.values) {
AllList.add(value)
allList.add(value)
}
AllList.sortByDescending { it.mobileUsed + it.wifiUsed }
AllList.removeAll(AllList.filter {
allList.sortByDescending { it.mobileUsed + it.wifiUsed }
allList.removeAll(allList.filter {
it.packageName == this.packageName
})
// AllList.sortByDescending { it.wifiUsed }
// Log.e("MXL", "所有的数据: " + AllList.size + AllList.toString())
if (AllList.isNotEmpty()) {
if (allList.isNotEmpty()) {
binding.idTvNoData.isVisible = false
binding.idRlNetworkTra.run {
layoutManager = LinearLayoutManager(context)
......@@ -256,7 +230,7 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
}
fun getNetworkStats(uid: Int, start: Long, end: Long): SparseLongArray {
private fun getNetworkStats(uid: Int, start: Long, end: Long): SparseLongArray {
val result = SparseLongArray()
val bucket = NetworkStats.Bucket()
try {
......@@ -316,27 +290,27 @@ class NetWorkActivity : BaseActivity<ActivityLayoutNetworkBinding>() {
return ViewHolder(view)
}
override fun getItemCount() = AllList.size
override fun getItemCount() = allList.size
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val c = ConfigHelper.appList?.firstOrNull {
it.packageName == AllList[position].packageName
it.packageName == allList[position].packageName
}
holder.ivImage.setImageDrawable(c?.icon)
holder.tvName.text = c?.name
holder.tvTraffic.text =
(AllList[position].wifiUsed + AllList[position].mobileUsed).toFormatSize()
(allList[position].wifiUsed + allList[position].mobileUsed).toFormatSize()
holder.wifiPro.max = (AllList[0].wifiUsed + AllList[0].mobileUsed).toInt()
holder.mobilePro.max = (AllList[0].wifiUsed + AllList[0].mobileUsed).toInt()
holder.wifiPro.max = (allList[0].wifiUsed + allList[0].mobileUsed).toInt()
holder.mobilePro.max = (allList[0].wifiUsed + allList[0].mobileUsed).toInt()
holder.wifiPro.progress =
(AllList[position].wifiUsed + AllList[position].mobileUsed).toInt()
holder.mobilePro.progress = (AllList[position].mobileUsed).toInt()
(allList[position].wifiUsed + allList[position].mobileUsed).toInt()
holder.mobilePro.progress = (allList[position].mobileUsed).toInt()
holder.tvstop.isEnabled =
NetworkStatsHelper.canStop(this@NetWorkActivity, AllList[position].packageName)
NetworkStatsHelper.canStop(this@NetWorkActivity, allList[position].packageName)
holder.tvstop.setOnClickListener {
AppUtils.launchAppDetailsSettings(AllList[position].packageName)
AppUtils.launchAppDetailsSettings(allList[position].packageName)
}
holder.itemView.setOnClickListener {
......
......@@ -41,22 +41,14 @@ class PrepareScanActivity : BaseActivity<ActivityLayoutParepreScanBinding>() {
playLottie()
} else {
DialogViews.showGerPermission(this, {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
if (intent.resolveActivity(packageManager) != null) {
requestStorePermission(launcher, jumpAction = {}, result = { flag ->
if (flag) {
playLottie()
} else {
finishToMain()
}
})
PermissionTripActivity.launch(this)
} else {
finishToMain()
}
requestStorePermission(launcher, result = { flag ->
if (flag) {
playLottie()
} else {
finishToMain()
}
}, resolveNoAction = { finishToMain() })
PermissionTripActivity.launch(this)
}, {
finishToMain()
})
......
......@@ -47,22 +47,14 @@ class PreparedPhotoActivity : BaseActivity<ActivityLayoutRepeaterdPhotoBinding>(
initData()
} else {
DialogViews.showGerPermission(this, {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
if (intent.resolveActivity(packageManager) != null) {
requestStorePermission(launcher, jumpAction = {}, result = { flag ->
if (flag) {
initData()
} else {
finishToMain()
}
})
PermissionTripActivity.launch(this)
} else {
finishToMain()
}
requestStorePermission(launcher, result = { flag ->
if (flag) {
initData()
} else {
finishToMain()
}
}, resolveNoAction = { finishToMain() })
PermissionTripActivity.launch(this)
}, {
finishToMain()
})
......@@ -114,10 +106,6 @@ class PreparedPhotoActivity : BaseActivity<ActivityLayoutRepeaterdPhotoBinding>(
}
private var fileList = mutableListOf<ImageDataBean>()
override fun onStart() {
super.onStart()
checkPermission()
}
private fun initData() {
......
......@@ -33,6 +33,8 @@ import com.test.basd.fastcleanerjunk.helps.TimeUtils.timePair
import com.test.basd.fastcleanerjunk.helps.ads.AdmobUtils
import com.test.basd.fastcleanerjunk.helps.recentapp.LaunchTimeStat
import com.test.basd.fastcleanerjunk.databinding.ActivityRecentAppBinding
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.checkUsageAccessSettings
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.requestUsageAccessSettings
import com.test.basd.fastcleanerjunk.helps.recentapp.ScreenTimeStat
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
......@@ -59,7 +61,6 @@ class RecentAppActivity : BaseActivity<ActivityRecentAppBinding>() {
initPage()
intTab()
if (checkUsageAccessSettings()) {
// Log.e("MXL", "onCreate: " + checkUsageAccessSettings())
intData()
} else {
binding.llContent.visibility = View.GONE
......@@ -71,7 +72,7 @@ class RecentAppActivity : BaseActivity<ActivityRecentAppBinding>() {
override fun initListener() {
binding.flBack.setOnClickListener {
AdmobUtils.showInterstitialAd(this) {
finishToMain()
finishToMain()
}
}
onBackPressedDispatcher.addCallback {
......@@ -81,22 +82,19 @@ class RecentAppActivity : BaseActivity<ActivityRecentAppBinding>() {
}
}
binding.tvGrand.setOnClickListener {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${context.packageName}")
launcher.launch(intent) {
LogEx.logDebug(TAG, "launcher callback")
val obj = JSONObject()
obj.put("activity", javaClass.simpleName)
if (checkUsageAccessSettings()) {
requestUsageAccessSettings(launcher, result = { flag ->
if (flag) {
binding.flPermission.visibility = View.GONE
binding.llContent.visibility = View.VISIBLE
intData()
} else {
finishToMain()
}
}
}, resolveNoAction = {
finishToMain()
})
}
}
......@@ -254,25 +252,6 @@ class RecentAppActivity : BaseActivity<ActivityRecentAppBinding>() {
}
private fun checkUsageAccessSettings(): Boolean {
val appOpsManager = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOpsManager.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
} else {
appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
}
}
private fun isLaunchApp(context: Context, app: PackageInfo, filterSystem: Boolean = true): Boolean {
val flagSystem = (app.applicationInfo.flags and ApplicationInfo.FLAG_SYSTEM) < 1
......
......@@ -32,26 +32,18 @@ class ScanJunkActivity : BaseActivity<ActivityLayoutScanJunkBinding>() {
})
if (checkStorePermission()){
if (checkStorePermission()) {
playLottie()
}else{
} else {
DialogViews.showGerPermission(this, {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
if (intent.resolveActivity(packageManager) != null) {
requestStorePermission(launcher, jumpAction = {}, result = { flag ->
if (flag) {
playLottie()
} else {
finishToMain()
}
})
PermissionTripActivity.launch(this)
} else {
finishToMain()
}
requestStorePermission(launcher, result = { flag ->
if (flag) {
playLottie()
} else {
finishToMain()
}
}, resolveNoAction = { finishToMain() })
PermissionTripActivity.launch(this)
}, {
finishToMain()
})
......
......@@ -2,14 +2,20 @@ package com.test.basd.fastcleanerjunk.activity.photocompress.photo
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Handler
import android.provider.Settings
import androidx.activity.OnBackPressedCallback
import androidx.core.view.updatePadding
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ToastUtils
import com.test.basd.fastcleanerjunk.activity.PermissionTripActivity
import com.test.basd.fastcleanerjunk.databinding.ActivityStartCompressionPhotoBinding
import com.test.basd.fastcleanerjunk.helps.BaseActivity
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.checkStorePermission
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.requestStorePermission
import com.test.basd.fastcleanerjunk.helps.ads.AdmobUtils
import com.test.basd.fastcleanerjunk.view.DialogViews
import kotlin.random.Random
......@@ -30,24 +36,26 @@ class StartCompressionPhotoActivity : BaseActivity<ActivityStartCompressionPhoto
}
})
}
override fun onStart() {
super.onStart()
checkPermission()
}
var isplay = 0
override fun onPermissionsResult(isGranted: Boolean) {
if (isGranted) {
isplay += 1
if (isplay == 1) {
playLottie()
}
if (checkStorePermission()) {
playLottie()
} else {
finishToMain()
DialogViews.showGerPermission(this, {
requestStorePermission(launcher, result = { flag ->
if (flag) {
playLottie()
} else {
finishToMain()
}
}, resolveNoAction = { finishToMain() })
PermissionTripActivity.launch(this)
}, {
finishToMain()
})
}
}
private fun playLottie(){
private fun playLottie() {
binding.idLottie1.imageAssetsFolder = "ya_smax_suo/images/"
binding.idLottie1.setAnimation("ya_smax_suo/data.json")
binding.idLottie1.playAnimation()
......@@ -61,7 +69,7 @@ class StartCompressionPhotoActivity : BaseActivity<ActivityStartCompressionPhoto
ToastUtils.showShort("Album photos not detected, no compression required.")
}
}
},Random.nextLong(3000,4000))
}, Random.nextLong(3000, 4000))
}
......
......@@ -14,8 +14,11 @@ import com.test.basd.fastcleanerjunk.adapter.AppListAdapter
import com.test.basd.fastcleanerjunk.bean.AppBean
import com.test.basd.fastcleanerjunk.databinding.FragmentAppListBinding
import com.test.basd.fastcleanerjunk.helps.ActivityLauncher
import com.test.basd.fastcleanerjunk.helps.BaseActivity
import com.test.basd.fastcleanerjunk.helps.BaseFragment
import com.test.basd.fastcleanerjunk.helps.LogEx
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.checkUsageAccessSettings
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.requestUsageAccessSettings
import com.test.basd.fastcleanerjunk.view.AppDetailDialog.showAppDetailDialog
import net.sourceforge.pinyin4j.PinyinHelper
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType
......@@ -32,29 +35,28 @@ class AppListFragment : BaseFragment<FragmentAppListBinding>() {
private var list = arrayListOf<AppBean>()
private var isRefreshData = false//是否需要更新数据
private lateinit var launcher: ActivityLauncher
private var type: Int = 0
var isAsc: Boolean = true
private var needPermission: Boolean = false
private lateinit var launcher: ActivityLauncher
override val binding: FragmentAppListBinding by lazy {
FragmentAppListBinding.inflate(layoutInflater)
}
fun setInitData(
launcher: ActivityLauncher,
type: Int = 0,
isAsc: Boolean = true,
needPermission: Boolean = false
) {
this.launcher = launcher
this.type = type
this.isAsc = isAsc
this.needPermission = needPermission
}
override fun setView() {
if (needPermission && !checkUsageAccessSettings(requireContext())) {
launcher = (requireActivity() as AppManagerActivity).launcher
if (needPermission && !requireContext().checkUsageAccessSettings()) {
binding.flContent.visibility = View.GONE
binding.flPermission.visibility = View.VISIBLE
} else {
......@@ -68,13 +70,11 @@ class AppListFragment : BaseFragment<FragmentAppListBinding>() {
override fun setListener() {
binding.tvAuthorization.setOnClickListener {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${requireActivity().packageName}")
launcher.launch(intent) {
LogEx.logDebug(TAG, "launcher callback")
(requireActivity() as AppManagerActivity).refreshUsageAccessData()
}
requireContext().requestUsageAccessSettings(launcher, result = { flag ->
if (flag) {
(requireActivity() as AppManagerActivity).refreshUsageAccessData()
}
})
}
}
......@@ -87,7 +87,7 @@ class AppListFragment : BaseFragment<FragmentAppListBinding>() {
override fun onResume() {
super.onResume()
if (checkUsageAccessSettings(requireContext())) {
if (requireContext().checkUsageAccessSettings()) {
binding.flPermission.visibility = View.GONE
binding.flContent.visibility = View.VISIBLE
}
......@@ -280,21 +280,4 @@ class AppListFragment : BaseFragment<FragmentAppListBinding>() {
}
private fun checkUsageAccessSettings(context: Context): Boolean {
val appOpsManager = context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOpsManager.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
context.packageName
) == AppOpsManager.MODE_ALLOWED
} else {
appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
context.packageName
) == AppOpsManager.MODE_ALLOWED
}
}
}
\ No newline at end of file
......@@ -47,80 +47,6 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
protected open fun initListener() {}
private val permissionLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
onPermissionsResult(Environment.isExternalStorageManager())
}
}
open fun onPermissionsResult(isGranted: Boolean) {
val obj = JSONObject()
obj.put("activity", javaClass.simpleName)
if (isGranted) {
EventHelper.event("permission_allow", ext = obj)
} else {
EventHelper.event("permission_deny", ext = obj)
}
}
private var isRequested = false
fun checkPermission(needcheck: Boolean = false) {
if (needcheck) {
onPermissionsResult(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager()
} else {
PermissionUtils.isGranted(PermissionConstants.STORAGE)
}
)
} else {
if (isRequested) {
onPermissionsResult(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
Environment.isExternalStorageManager()
} else {
PermissionUtils.isGranted(PermissionConstants.STORAGE)
}
)
return
}
isRequested = true
// requestPermissionCount--
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
onPermissionsResult(true)
} else {
if (isFinishing || isDestroyed) {
return
}
dialog = DialogViews.showGerPermission(this, {
val intent =
Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
permissionLauncher.launch(intent)
PermissionTripActivity.launch(this)
}, {
finishToMain()
})
}
} else {
PermissionUtils.permissionGroup(PermissionConstants.STORAGE)
.callback { isAllGranted, _, _, _ ->
if (isAllGranted) {
onPermissionsResult(true)
} else {
onPermissionsResult(false)
}
}.request()
}
}
protected fun finishToMain() {
if (this !is MainActivity && !ActivityUtils.isActivityExistsInStack(MainActivity::class.java)) {
startActivity(Intent(this, MainActivity::class.java))
......@@ -128,97 +54,8 @@ abstract class BaseActivity<T : ViewBinding> : AppCompatActivity() {
finish()
}
private var isRequestedAccess = false
private val accessLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
}
fun checkAccesSettings(needcheck: Boolean = false) {
val appOpsManager = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
if (needcheck) {
onAccesSettingsResult(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOpsManager.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
} else {
appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
}
)
} else {
if (isRequestedAccess) {
onAccesSettingsResult(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOpsManager.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
} else {
appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
}
)
return
}
isRequestedAccess = true
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
if (appOpsManager.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
) {
onAccesSettingsResult(true)
} else {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${this.packageName}")
accessLauncher.launch(intent)
}
} else {
if (appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
) {
onAccesSettingsResult(true)
} else {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${this.packageName}")
accessLauncher.launch(intent)
}
}
}
open fun onAccesSettingsResult(isGranted: Boolean) {
val obj = JSONObject()
obj.put("activity", javaClass.simpleName)
if (isGranted) {
EventHelper.event("permission_allow", ext = obj)
} else {
EventHelper.event("permission_deny", ext = obj)
}
}
var dialog: Dialog? = null
override fun onDestroy() {
super.onDestroy()
if (dialog != null) {
......
package com.test.basd.fastcleanerjunk.helps
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
......@@ -10,6 +11,7 @@ import androidx.viewbinding.ViewBinding
abstract class BaseFragment<T : ViewBinding> : Fragment() {
protected abstract val binding: T
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
......
package com.test.basd.fastcleanerjunk.helps
import android.annotation.SuppressLint
import android.app.AppOpsManager
import android.content.Context
import android.content.Intent
import android.net.Uri
......@@ -9,6 +10,7 @@ import android.os.Environment
import android.provider.Settings
import com.blankj.utilcode.constant.PermissionConstants
import com.blankj.utilcode.util.PermissionUtils
import com.test.basd.fastcleanerjunk.helps.PermissionHelp.requestUsageAccessSettings
object PermissionHelp {
fun checkStorePermission(): Boolean {
......@@ -19,20 +21,27 @@ object PermissionHelp {
}
}
fun Context.manageStoreIntent(): Intent {
val intent =
Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
return intent
}
fun Context.requestStorePermission(
launcher: ActivityLauncher,
jumpAction: (() -> Unit)? = null,
result: (flag: Boolean) -> Unit
result: (flag: Boolean) -> Unit,
resolveNoAction: (() -> Unit)? = null,
) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val intent =
Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${packageName}")
jumpAction?.invoke()
launcher.launch(intent) {
result.invoke(checkStorePermission())
val intent = manageStoreIntent()
if (intent.resolveActivity(packageManager) != null) {
launcher.launch(intent) {
result.invoke(checkStorePermission())
}
} else {
resolveNoAction?.invoke()
}
} else {
PermissionUtils.permissionGroup(PermissionConstants.STORAGE).callback { isAllGranted, _, _, _ ->
......@@ -41,4 +50,46 @@ object PermissionHelp {
}
}
fun Context.checkUsageAccessSettings(): Boolean {
val appOpsManager = getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
appOpsManager.unsafeCheckOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
} else {
appOpsManager.checkOpNoThrow(
AppOpsManager.OPSTR_GET_USAGE_STATS,
android.os.Process.myUid(),
this.packageName
) == AppOpsManager.MODE_ALLOWED
}
}
fun Context.usageAccessSettings(): Intent {
val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS)
intent.addCategory("android.intent.category.DEFAULT")
intent.data = Uri.parse("package:${this.packageName}")
return intent
}
fun Context.requestUsageAccessSettings(
launcher: ActivityLauncher,
result: (flag: Boolean) -> Unit,
resolveNoAction: (() -> Unit)? = null,
) {
val intent = usageAccessSettings()
if (intent.resolveActivity(packageManager) != null) {
launcher.launch(intent) {
result.invoke(checkUsageAccessSettings())
}
} else {
resolveNoAction?.invoke()
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment