UpdatesFrgament: Request storage permission if required before updating apps

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2023-06-02 23:57:12 +08:00
parent 2f80ef1109
commit c43b43cdfe

View File

@@ -19,17 +19,25 @@
package com.aurora.store.view.ui.updates package com.aurora.store.view.ui.updates
import android.Manifest
import android.content.ComponentName import android.content.ComponentName
import android.content.Intent import android.content.Intent
import android.content.ServiceConnection import android.content.ServiceConnection
import android.content.pm.PackageManager
import android.os.Bundle import android.os.Bundle
import android.os.Environment
import android.os.IBinder import android.os.IBinder
import android.provider.Settings
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.content.ContextCompat
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.aurora.Constants import com.aurora.Constants
import com.aurora.extensions.isRAndAbove
import com.aurora.extensions.stackTraceToString import com.aurora.extensions.stackTraceToString
import com.aurora.extensions.toast
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.State import com.aurora.store.State
@@ -39,6 +47,8 @@ import com.aurora.store.data.model.UpdateFile
import com.aurora.store.data.service.UpdateService import com.aurora.store.data.service.UpdateService
import com.aurora.store.databinding.FragmentUpdatesBinding import com.aurora.store.databinding.FragmentUpdatesBinding
import com.aurora.store.util.Log import com.aurora.store.util.Log
import com.aurora.store.util.PathUtil
import com.aurora.store.util.isExternalStorageEnable
import com.aurora.store.view.epoxy.views.UpdateHeaderViewModel_ import com.aurora.store.view.epoxy.views.UpdateHeaderViewModel_
import com.aurora.store.view.epoxy.views.app.AppUpdateViewModel_ import com.aurora.store.view.epoxy.views.app.AppUpdateViewModel_
import com.aurora.store.view.epoxy.views.app.NoAppViewModel_ import com.aurora.store.view.epoxy.views.app.NoAppViewModel_
@@ -56,9 +66,25 @@ class UpdatesFragment : BaseFragment() {
private lateinit var B: FragmentUpdatesBinding private lateinit var B: FragmentUpdatesBinding
private lateinit var VM: UpdatesViewModel private lateinit var VM: UpdatesViewModel
private lateinit var app: App
private val startForStorageManagerResult =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (isRAndAbove() && Environment.isExternalStorageManager()) {
updateSingle(app)
} else {
toast(R.string.permissions_denied)
}
}
private val startForPermissions =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { perm ->
if (perm) updateSingle(app) else toast(R.string.permissions_denied)
}
val listOfActionsWhenServiceAttaches = ArrayList<Runnable>() val listOfActionsWhenServiceAttaches = ArrayList<Runnable>()
private lateinit var fetchListener: AbstractFetchGroupListener private lateinit var fetchListener: AbstractFetchGroupListener
private var updateService: UpdateService? = null
private var attachToServiceCalled = false private var attachToServiceCalled = false
private var serviceConnection = object : ServiceConnection { private var serviceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, binder: IBinder) { override fun onServiceConnected(name: ComponentName, binder: IBinder) {
@@ -212,7 +238,7 @@ class UpdatesFragment : BaseFragment() {
if (VM.updateAllEnqueued) if (VM.updateAllEnqueued)
cancelAll() cancelAll()
else else
updateAll() updateFileMap.values.forEach { updateSingle(it.app, true) }
requestModelBuild() requestModelBuild()
} }
@@ -244,8 +270,6 @@ class UpdatesFragment : BaseFragment() {
} }
} }
private var updateService: UpdateService? = null
fun runInService(runnable: Runnable) { fun runInService(runnable: Runnable) {
if (updateService == null) { if (updateService == null) {
listOfActionsWhenServiceAttaches.add(runnable) listOfActionsWhenServiceAttaches.add(runnable)
@@ -255,11 +279,36 @@ class UpdatesFragment : BaseFragment() {
} }
} }
private fun updateSingle(app: App) { private fun updateSingle(app: App, updateAll: Boolean = false) {
this.app = app
runInService { runInService {
VM.updateState(app.getGroupId(requireContext()), State.QUEUED) VM.updateState(app.getGroupId(requireContext()), State.QUEUED)
VM.updateAllEnqueued = updateAll
updateService?.updateApp(app) if (PathUtil.needsStorageManagerPerm(app.fileList) ||
requireContext().isExternalStorageEnable()) {
if (isRAndAbove()) {
if (!Environment.isExternalStorageManager()) {
startForStorageManagerResult.launch(
Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)
)
} else {
updateService?.updateApp(app)
}
} else {
if (ContextCompat.checkSelfPermission(
requireContext(),
Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_GRANTED
) {
updateService?.updateApp(app)
} else {
startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
}
} else {
updateService?.updateApp(app)
}
} }
} }
@@ -269,13 +318,6 @@ class UpdatesFragment : BaseFragment() {
} }
} }
private fun updateAll() {
runInService {
updateService?.updateAll(updateFileMap)
VM.updateAllEnqueued = true
}
}
private fun cancelAll() { private fun cancelAll() {
runInService { runInService {
VM.updateAllEnqueued = false VM.updateAllEnqueued = false