From 113eec59f9ed9bc61d71b42592cb979bec7c77f6 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Fri, 17 Jul 2020 01:27:35 -0700 Subject: [PATCH] Request storage rw for saving logs Fix #2993 --- .../model/entity/recycler/SettingsItem.kt | 78 ++++++++++--------- .../topjohnwu/magisk/ui/base/BaseViewModel.kt | 11 ++- .../magisk/ui/flash/FlashViewModel.kt | 2 - .../topjohnwu/magisk/ui/home/HomeViewModel.kt | 4 +- .../topjohnwu/magisk/ui/log/LogViewModel.kt | 4 +- .../magisk/ui/module/ModuleViewModel.kt | 16 +--- .../magisk/ui/settings/SettingsViewModel.kt | 10 +-- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-iw/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-ka/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 26 files changed, 77 insertions(+), 86 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt index 36b3820c6..8a685468b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt +++ b/app/src/main/java/com/topjohnwu/magisk/model/entity/recycler/SettingsItem.kt @@ -53,7 +53,7 @@ sealed class SettingsItem : ObservableItem() { // --- interface Callback { - fun onItemPressed(view: View, item: SettingsItem) + fun onItemPressed(view: View, item: SettingsItem, method: () -> Unit) fun onItemChanged(view: View, item: SettingsItem) } @@ -80,9 +80,10 @@ sealed class SettingsItem : ObservableItem() { override val layoutRes = R.layout.item_settings_toggle override fun onPressed(view: View, callback: Callback) { - callback.onItemPressed(view, this) - value = !value - super.onPressed(view, callback) + callback.onItemPressed(view, this) { + value = !value + super.onPressed(view, callback) + } } fun onTouched(view: View, callback: Callback, event: MotionEvent): Boolean { @@ -103,27 +104,28 @@ sealed class SettingsItem : ObservableItem() { protected abstract val intermediate: String? override fun onPressed(view: View, callback: Callback) { - callback.onItemPressed(view, this) - MagiskDialog(view.context) - .applyTitle(title.getText(resources)) - .applyView(getView(view.context)) - .applyButton(MagiskDialog.ButtonType.POSITIVE) { - titleRes = android.R.string.ok - onClick { - intermediate?.let { result -> - preventDismiss = false - value = result - it.dismiss() - super.onPressed(view, callback) - return@onClick + callback.onItemPressed(view, this) { + MagiskDialog(view.context) + .applyTitle(title.getText(resources)) + .applyView(getView(view.context)) + .applyButton(MagiskDialog.ButtonType.POSITIVE) { + titleRes = android.R.string.ok + onClick { + intermediate?.let { result -> + preventDismiss = false + value = result + it.dismiss() + super.onPressed(view, callback) + return@onClick + } + preventDismiss = true } - preventDismiss = true } - } - .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = android.R.string.cancel - } - .reveal() + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = android.R.string.cancel + } + .reveal() + } } abstract fun getView(context: Context): View @@ -156,18 +158,19 @@ sealed class SettingsItem : ObservableItem() { override fun onPressed(view: View, callback: Callback) { if (entries.isEmpty() || entryValues.isEmpty()) return - callback.onItemPressed(view, this) - MagiskDialog(view.context) - .applyTitle(title.getText(resources)) - .applyButton(MagiskDialog.ButtonType.NEGATIVE) { - titleRes = android.R.string.cancel - } - .applyAdapter(entries) { - value = it - notifyPropertyChanged(BR.selectedEntry) - super.onPressed(view, callback) - } - .reveal() + callback.onItemPressed(view, this) { + MagiskDialog(view.context) + .applyTitle(title.getText(resources)) + .applyButton(MagiskDialog.ButtonType.NEGATIVE) { + titleRes = android.R.string.cancel + } + .applyAdapter(entries) { + value = it + notifyPropertyChanged(BR.selectedEntry) + super.onPressed(view, callback) + } + .reveal() + } } } @@ -177,8 +180,9 @@ sealed class SettingsItem : ObservableItem() { override val layoutRes = R.layout.item_settings_blank override fun onPressed(view: View, callback: Callback) { - callback.onItemPressed(view, this) - super.onPressed(view, callback) + callback.onItemPressed(view, this) { + super.onPressed(view, callback) + } } } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseViewModel.kt index 310657499..eb32ee487 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/base/BaseViewModel.kt @@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavDirections import com.topjohnwu.magisk.BR +import com.topjohnwu.magisk.R import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.base.BaseActivity import com.topjohnwu.magisk.model.events.* @@ -85,8 +86,14 @@ abstract class BaseViewModel( PermissionEvent(permissions.toList(), callback).publish() } - fun withExternalRW(callback: (Boolean) -> Unit) { - withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, callback = callback) + fun withExternalRW(callback: () -> Unit) { + withPermissions(Manifest.permission.WRITE_EXTERNAL_STORAGE) { + if (!it) { + SnackbarEvent(R.string.external_rw_permission_denied).publish() + } else { + callback() + } + } } fun back() = BackPressEvent().publish() diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt index b6844d755..0fdbf7943 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt @@ -107,8 +107,6 @@ class FlashViewModel( } private fun savePressed() = withExternalRW { - if (!it) - return@withExternalRW viewModelScope.launch { val name = Const.MAGISK_INSTALL_LOG_FILENAME.format(now.toTime(timeFormatStandard)) val file = File(Config.downloadDirectory, name) diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt index def26b3fb..99f5e86b5 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/home/HomeViewModel.kt @@ -131,9 +131,7 @@ class HomeViewModel( fun onManagerPressed() = ManagerInstallDialog().publish() fun onMagiskPressed() = withExternalRW { - if (it) { - HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish() - } + HomeFragmentDirections.actionHomeFragmentToInstallFragment().publish() } fun hideNotice() { diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt index 04746b219..0d624302e 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/log/LogViewModel.kt @@ -57,7 +57,7 @@ class LogViewModel( items.lastOrNull()?.isBottom = true } - fun saveMagiskLog() { + fun saveMagiskLog() = withExternalRW { val now = Calendar.getInstance() val filename = "magisk_log_%04d%02d%02d_%02d%02d%02d.log".format( now.get(Calendar.YEAR), now.get(Calendar.MONTH) + 1, @@ -70,7 +70,7 @@ class LogViewModel( logFile.createNewFile() } catch (e: IOException) { Timber.e(e) - return + return@withExternalRW } Shell.su("cat ${Const.MAGISK_LOG} > $logFile").submit { 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 ea0c256b7..5c065ac3c 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 @@ -19,7 +19,6 @@ 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 @@ -323,26 +322,15 @@ class ModuleViewModel( } fun downloadPressed(item: RepoItem) = withExternalRW { - if (it) - ModuleInstallDialog(item.item).publish() - else - permissionDenied() + ModuleInstallDialog(item.item).publish() } fun installPressed() = withExternalRW { - if (it) - InstallExternalModuleEvent().publish() - else - permissionDenied() + InstallExternalModuleEvent().publish() } 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/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt index 9d5e781c0..92f1487d1 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsViewModel.kt @@ -87,9 +87,9 @@ class SettingsViewModel( return list } - override fun onItemPressed(view: View, item: SettingsItem) = when (item) { - is DownloadPath -> requireRWPermission() - else -> Unit + override fun onItemPressed(view: View, item: SettingsItem, method: () -> Unit) = when (item) { + is DownloadPath -> withExternalRW(method) + else -> method() } override fun onItemChanged(view: View, item: SettingsItem) = when (item) { @@ -136,10 +136,6 @@ class SettingsViewModel( } } - private fun requireRWPermission() { - withExternalRW { if (!it) requireRWPermission() } - } - private fun updateManager(hide: Boolean) { if (hide) { PatchAPK.hideManager(get(), Hide.value) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 99816341b..58adf2a60 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -137,7 +137,7 @@ التحديث متوفر @string/home_installed_version تسلسل الترتيب - امنحني إذن الولوج للذاكرة الداخلية + امنحني إذن الولوج للذاكرة الداخلية وضـعية الِسمات diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 9644c53f7..819a25ed1 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -128,7 +128,7 @@ Даступныя абнаўленні Усталяваныя Парадак сартавання - Дайце доступ да сховішча, каб уключыць гэтую функцыю + Дайце доступ да сховішча, каб уключыць гэтую функцыю Рэжым афармлення Абярыце рэжым, які вам больш даспадобы! diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index f30eb002b..54adbdd0c 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -137,7 +137,7 @@ Actualització Disponible @string/home_installed_version Ordre de Classificació - Garanteix permís d\'emmagatzematge per activar aquesta funcionalitat + Garanteix permís d\'emmagatzematge per activar aquesta funcionalitat Mode del tema diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f7d29250d..647c69dcc 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -136,7 +136,7 @@ Update verfügbar @string/home_installed_version Sortierreihenfolge - Gewähre den Speicher-Zugriff, um diese Funtion zu aktivieren. + Gewähre den Speicher-Zugriff, um diese Funtion zu aktivieren. Themen-Modus diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d7e93289a..f4fd7ea82 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -134,7 +134,7 @@ Actualización disponible Instalado Clasificar por - Conceder permiso de almacenamiento para habilitar esta funcionalidad + Conceder permiso de almacenamiento para habilitar esta funcionalidad Elegir modo diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 18c8ced04..3e1b1d1bc 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -137,7 +137,7 @@ Mise à jour disponible @string/home_installed_version Classement - Autorisez l’accès au stockage pour activer cette fonctionnalité + Autorisez l’accès au stockage pour activer cette fonctionnalité Mode du thème diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 0ccc7a048..156807ce4 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -137,7 +137,7 @@ Pembaruan Tersedia @string/home_installed_version Urutkan Susunan - Berikan izin penyimpanan untuk mengaktifkan fungsi ini + Berikan izin penyimpanan untuk mengaktifkan fungsi ini Mode Tema diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 156e4bd6b..08e0e9cc3 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -137,7 +137,7 @@ עדכונים זמינים @string/home_installed_version סדר מיון - הענק הרשאה לאחסון כדי לאפשר פונקציונליות זו + הענק הרשאה לאחסון כדי לאפשר פונקציונליות זו מצב עיצוב diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d3eac782c..3e4a9a3fe 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -251,7 +251,7 @@ リストの幅を設定します。アプリを再起動して変更を適用します。 フォルダの作成エラー。ルートディレクトリからアクセスできなければならず、そしてファイルでない必要があります。 自分のスタイルに合ったモードを選択! - この機能を有効にするためにストレージの許可を付与 + この機能を有効にするためにストレージの許可を付与 "親フォルダに表示 " ファイルを表示 このバージョンの Magisk Manager は、%1$s 以下の Magisk バージョンには対応していません。 アプリは Magisk がインストールされていないかのように動作しますので、できるだけ早く Magisk をアップグレードしてください。 diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 311c5f83d..a39b45427 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -137,7 +137,7 @@ ხელმისაწვდომია განახლება @string/home_installed_version სორტირება - დართეთ მეხსიერებასთან წვდომის ნებართვა ამ ფუნქციის გამოსაყნებლად + დართეთ მეხსიერებასთან წვდომის ნებართვა ამ ფუნქციის გამოსაყნებლად თემების ჩამონათვალი diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 78501882e..26104fafe 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -136,7 +136,7 @@ Update beschikbaar @string/home_installed_version Sorteervolgorde - Verleen de machtiging \'Opslag\' om deze functie te kunnen gebruiken + Verleen de machtiging \'Opslag\' om deze functie te kunnen gebruiken Thema diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f24496a6a..e68d01f86 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -136,7 +136,7 @@ Dostępna aktualizacja Zainstalowane Kolejność sortowania - Zezwól na dostęp do pamięci wewnętrznej, aby włączyć tę funkcjonalność. + Zezwól na dostęp do pamięci wewnętrznej, aby włączyć tę funkcjonalność. Tryb motywu diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 47f3f3b44..f47d1ce13 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -136,7 +136,7 @@ Actualizare disponibilă Instalate Ordine de sortare - Acordă permisiunea de stocare pentru a activa această funcționalitate + Acordă permisiunea de stocare pentru a activa această funcționalitate Mod pentru temă diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 674653904..1c0d14549 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -137,7 +137,7 @@ Доступно обновление Установлены Сортировка - Пожалуйста, предоставьте доступ к хранилищу + Пожалуйста, предоставьте доступ к хранилищу Оттенок diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 8b61e38c5..037fd4402 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -137,7 +137,7 @@ Dostupná aktualizácia @string/home_installed_version Zoradenie - Udeľte povolenie pre povolenie tejto funkcie + Udeľte povolenie pre povolenie tejto funkcie Režim motívu diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e9839c2e2..80c256144 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -137,7 +137,7 @@ Доступне оновлення @string/home_installed_version Порядок сортування - Надайте доступ до сховища, щоб увімкнути цей функціонал + Надайте доступ до сховища, щоб увімкнути цей функціонал Режим теми diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 7c3d3e331..28c7831ab 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -137,7 +137,7 @@ 可更新 @string/home_installed_version 排序方式 - 请允许访问存储空间以使用此功能 + 请允许访问存储空间以使用此功能 主题模式 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 0e1f3d197..7c9e691f3 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -136,7 +136,7 @@ 有可用的更新 @string/home_installed_version 排序方式 - 授予儲存權限以啟用這個功能 + 授予儲存權限以啟用這個功能 主題模式 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 024001f81..16952f55f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -137,7 +137,6 @@ Update Available @string/home_installed_version Sorting Order - Grant storage permission to enable this functionality Theme Mode @@ -255,5 +254,6 @@ Authenticate Unsupported Magisk Version This version of Magisk Manager does not support Magisk version lower than %1$s.\n\nThe app will behave as if no Magisk is installed, please upgrade Magisk as soon as possible. + Grant storage permission to enable this functionality