diff --git a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt
index 308ac927d..e4a955ecf 100644
--- a/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/model/events/InstallExternalModuleEvent.kt
@@ -1,8 +1,10 @@
package com.topjohnwu.magisk.model.events
+import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
+import androidx.annotation.RequiresPermission
import com.topjohnwu.magisk.core.Const
import com.topjohnwu.magisk.core.base.BaseActivity
import com.topjohnwu.magisk.core.intent
@@ -10,14 +12,11 @@ import com.topjohnwu.magisk.legacy.flash.FlashActivity
class InstallExternalModuleEvent : ViewEvent(), ActivityExecutor {
+ @RequiresPermission(allOf = [Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE])
override fun invoke(activity: BaseActivity) {
- activity.withExternalRW {
- onSuccess {
- val intent = Intent(Intent.ACTION_GET_CONTENT)
- intent.type = "application/zip"
- activity.startActivityForResult(intent, Const.ID.FETCH_ZIP)
- }
- }
+ val intent = Intent(Intent.ACTION_GET_CONTENT)
+ intent.type = "application/zip"
+ activity.startActivityForResult(intent, Const.ID.FETCH_ZIP)
}
companion object {
diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt
index ce359abb4..64224380f 100644
--- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt
@@ -1,5 +1,6 @@
package com.topjohnwu.magisk.ui.module
+import android.Manifest
import androidx.annotation.WorkerThread
import androidx.databinding.Bindable
import androidx.databinding.ObservableArrayList
@@ -20,6 +21,7 @@ import com.topjohnwu.magisk.model.entity.internal.DownloadSubject
import com.topjohnwu.magisk.model.entity.recycler.*
import com.topjohnwu.magisk.model.events.InstallExternalModuleEvent
import com.topjohnwu.magisk.model.events.OpenChangelogEvent
+import com.topjohnwu.magisk.model.events.SnackbarEvent
import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog
import com.topjohnwu.magisk.ui.base.*
import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
@@ -330,11 +332,27 @@ class ModuleViewModel(
else -> Unit
}
- fun downloadPressed(item: RepoItem) = ModuleInstallDialog(item.item).publish()
- fun installPressed() = InstallExternalModuleEvent().publish()
+ fun downloadPressed(item: RepoItem) = withPermissions(
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ ).any { it }.subscribeK(onError = { permissionDenied() }) {
+ ModuleInstallDialog(item.item).publish()
+ }.add()
+
+ fun installPressed() = withPermissions(
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE
+ ).any { it }.subscribeK(onError = { permissionDenied() }) {
+ InstallExternalModuleEvent().publish()
+ }.add()
+
fun infoPressed(item: RepoItem) = OpenChangelogEvent(item.item).publish()
fun infoPressed(item: ModuleItem) {
OpenChangelogEvent(item.repo ?: return).publish()
}
+ private fun permissionDenied() {
+ SnackbarEvent(R.string.module_permission_declined).publish()
+ }
+
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3e1b68de7..715a80d79 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -136,6 +136,7 @@
Update Available
@string/home_installed_version
Sorting Order
+ Grant storage permission to enable this functionality
Theme Mode