diff --git a/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsScreen.kt b/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsScreen.kt index eed084206..19fb3eebe 100644 --- a/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsScreen.kt +++ b/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsScreen.kt @@ -113,6 +113,7 @@ fun RepoDetailsScreen( packageName: String, onNavigateBack: () -> Unit, onOpenUrl: (String) -> Unit, + onOpenScope: (packageName: String, userId: Int) -> Unit, dataSource: StoreDataSource, settings: StoreSettings, host: StoreInstallHost? = null, @@ -137,6 +138,7 @@ fun RepoDetailsScreen( val installedScope by viewModel.installedScope.collectAsState() val installedIsLegacy by viewModel.installedIsLegacy.collectAsState() val install by viewModel.installState.collectAsState() + val installedUserId by viewModel.installedUserId.collectAsState() var choosing by remember { mutableStateOf(null) } var optionsOpen by remember { mutableStateOf(false) } @@ -204,6 +206,8 @@ fun RepoDetailsScreen( else choosing = release }, onAcknowledge = viewModel::acknowledgeInstall, + installedUserId = installedUserId, + onOpenScope = { onOpenScope(packageName, it) }, ) } }, @@ -378,6 +382,9 @@ private fun InstallBar( install: InstallStep, onInstall: (Release) -> Unit, onAcknowledge: () -> Unit, + /** The installed copy's user id, so the "Manage" button can open the configuration screen. */ + installedUserId: Int?, + onOpenScope: (userId: Int) -> Unit, ) { val context = LocalContext.current val newest = state.releases.firstOrNull { it.apks.isNotEmpty() } ?: return @@ -449,31 +456,46 @@ private fun InstallBar( } } else -> { - Button( - onClick = { - onAcknowledge() - onInstall(newest) - }, - modifier = Modifier.fillMaxWidth(), - ) { - Icon( - Icons.Rounded.Download, - contentDescription = null, - modifier = Modifier.size(18.dp), - ) - Spacer(Modifier.width(8.dp)) - Text( - when { - state.upgradable -> - stringResource( - if (state.sameVersion) UiR.string.store_badge_reinstall - else UiR.string.store_badge_update, - state.latest?.versionName.orEmpty(), - ) - state.installed != null -> stringResource(UiR.string.store_reinstall) - else -> stringResource(UiR.string.store_install) - } - ) + // Installed and current — the next thing is to configure it, not reinstall it. + if (state.installed != null && !state.upgradable && installedUserId != null) { + FilledTonalButton( + onClick = { onOpenScope(installedUserId) }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + Icons.Rounded.Tune, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(Modifier.width(8.dp)) + Text(stringResource(UiR.string.nav_manage)) + } + } else { + Button( + onClick = { + onAcknowledge() + onInstall(newest) + }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + Icons.Rounded.Download, + contentDescription = null, + modifier = Modifier.size(18.dp), + ) + Spacer(Modifier.width(8.dp)) + Text( + when { + state.upgradable -> + stringResource( + if (state.sameVersion) UiR.string.store_badge_reinstall + else UiR.string.store_badge_update, + state.latest?.versionName.orEmpty(), + ) + else -> stringResource(UiR.string.store_install) + } + ) + } } } } diff --git a/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsViewModel.kt b/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsViewModel.kt index 67a24d161..a5ba45a30 100644 --- a/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsViewModel.kt +++ b/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/RepoDetailsViewModel.kt @@ -93,6 +93,10 @@ class RepoDetailsViewModel( val installedIsLegacy: StateFlow = host?.installedIsLegacy ?: MutableStateFlow(false).asStateFlow() + /** The user id of the installed copy, for the configuration screen; null when nothing is installed. */ + val installedUserId: StateFlow = + host?.installedUserId ?: MutableStateFlow(null).asStateFlow() + private val _detail = MutableStateFlow(null) private val _fetch = MutableStateFlow(DetailFetch.Loading) diff --git a/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/StoreInstallHost.kt b/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/StoreInstallHost.kt index 289066043..cb628438b 100644 --- a/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/StoreInstallHost.kt +++ b/manager-ui/src/main/kotlin/org/matrix/vector/ui/store/StoreInstallHost.kt @@ -23,6 +23,9 @@ interface StoreInstallHost { /** Whether the installed copy is a legacy-framework module (its scope names are swapped). */ val installedIsLegacy: StateFlow + /** The user id of the installed copy, for the configuration screen; null when nothing is installed. */ + val installedUserId: StateFlow + /** Download and install [asset], recording it against [releaseVersion]. */ fun install(asset: ReleaseAsset, releaseVersion: RepoVersion?) diff --git a/manager-ui/src/main/res/values-ar/strings_store.xml b/manager-ui/src/main/res/values-ar/strings_store.xml index 3f4b3d0a2..7ab1140f2 100644 --- a/manager-ui/src/main/res/values-ar/strings_store.xml +++ b/manager-ui/src/main/res/values-ar/strings_store.xml @@ -58,7 +58,6 @@ فتح صفحة الوحدة تثبيت - إعادة التثبيت اختر ملفًا للتثبيت لا تنزيلات diff --git a/manager-ui/src/main/res/values-de/strings_store.xml b/manager-ui/src/main/res/values-de/strings_store.xml index 273603105..8d2239989 100644 --- a/manager-ui/src/main/res/values-de/strings_store.xml +++ b/manager-ui/src/main/res/values-de/strings_store.xml @@ -42,7 +42,6 @@ Modulseite öffnen Installieren - Neu installieren Datei zur Installation wählen %1$d Download diff --git a/manager-ui/src/main/res/values-es/strings_store.xml b/manager-ui/src/main/res/values-es/strings_store.xml index f31bb9f7b..af0557815 100644 --- a/manager-ui/src/main/res/values-es/strings_store.xml +++ b/manager-ui/src/main/res/values-es/strings_store.xml @@ -42,7 +42,6 @@ Abrir la página del módulo Instalar - Reinstalar Elige el archivo que instalar %1$d descarga diff --git a/manager-ui/src/main/res/values-fa/strings_store.xml b/manager-ui/src/main/res/values-fa/strings_store.xml index 3814dab53..384e065c5 100644 --- a/manager-ui/src/main/res/values-fa/strings_store.xml +++ b/manager-ui/src/main/res/values-fa/strings_store.xml @@ -50,7 +50,6 @@ باز کردن صفحهٔ ماژول نصب - نصب دوباره پرونده‌ای برای نصب برگزینید %1$d بارگیری diff --git a/manager-ui/src/main/res/values-fr/strings_store.xml b/manager-ui/src/main/res/values-fr/strings_store.xml index 12f2f2651..a5cf26a12 100644 --- a/manager-ui/src/main/res/values-fr/strings_store.xml +++ b/manager-ui/src/main/res/values-fr/strings_store.xml @@ -42,7 +42,6 @@ Ouvrir la page du module Installer - Réinstaller Choisir un fichier à installer %1$d téléchargement diff --git a/manager-ui/src/main/res/values-in/strings_store.xml b/manager-ui/src/main/res/values-in/strings_store.xml index 9fe4fbded..2766d83db 100644 --- a/manager-ui/src/main/res/values-in/strings_store.xml +++ b/manager-ui/src/main/res/values-in/strings_store.xml @@ -40,7 +40,6 @@ Buka halaman modul Pasang - Pasang ulang Pilih berkas untuk dipasang %1$d unduhan diff --git a/manager-ui/src/main/res/values-it/strings_store.xml b/manager-ui/src/main/res/values-it/strings_store.xml index 8afce7e60..49036703f 100644 --- a/manager-ui/src/main/res/values-it/strings_store.xml +++ b/manager-ui/src/main/res/values-it/strings_store.xml @@ -42,7 +42,6 @@ Apri la pagina del modulo Installa - Reinstalla Scegli un file da installare %1$d download diff --git a/manager-ui/src/main/res/values-iw/strings_store.xml b/manager-ui/src/main/res/values-iw/strings_store.xml index a9ae18f32..023bd049f 100644 --- a/manager-ui/src/main/res/values-iw/strings_store.xml +++ b/manager-ui/src/main/res/values-iw/strings_store.xml @@ -46,7 +46,6 @@ פתיחת דף המודול התקנה - התקנה מחדש בחרו קובץ להתקנה הורדה אחת diff --git a/manager-ui/src/main/res/values-ja/strings_store.xml b/manager-ui/src/main/res/values-ja/strings_store.xml index dccee4c0a..ced32fec6 100644 --- a/manager-ui/src/main/res/values-ja/strings_store.xml +++ b/manager-ui/src/main/res/values-ja/strings_store.xml @@ -48,7 +48,6 @@ モジュールのページを開く インストール - 再インストール インストールするファイルを選択 %1$d 回のダウンロード diff --git a/manager-ui/src/main/res/values-ko/strings_store.xml b/manager-ui/src/main/res/values-ko/strings_store.xml index d19cc58c0..35c598136 100644 --- a/manager-ui/src/main/res/values-ko/strings_store.xml +++ b/manager-ui/src/main/res/values-ko/strings_store.xml @@ -48,7 +48,6 @@ 모듈 페이지 열기 설치 - 다시 설치 설치할 파일 고르기 다운로드 %1$d회 diff --git a/manager-ui/src/main/res/values-pl/strings_store.xml b/manager-ui/src/main/res/values-pl/strings_store.xml index b9719a1cd..8b7ae0faa 100644 --- a/manager-ui/src/main/res/values-pl/strings_store.xml +++ b/manager-ui/src/main/res/values-pl/strings_store.xml @@ -54,7 +54,6 @@ Otwórz stronę modułu Zainstaluj - Zainstaluj ponownie Wybierz plik do zainstalowania %1$d pobranie diff --git a/manager-ui/src/main/res/values-pt-rBR/strings_store.xml b/manager-ui/src/main/res/values-pt-rBR/strings_store.xml index 512284a54..e0f60d68d 100644 --- a/manager-ui/src/main/res/values-pt-rBR/strings_store.xml +++ b/manager-ui/src/main/res/values-pt-rBR/strings_store.xml @@ -42,7 +42,6 @@ Abrir a página do módulo Instalar - Reinstalar Escolha um arquivo para instalar %1$d download diff --git a/manager-ui/src/main/res/values-ru/strings_store.xml b/manager-ui/src/main/res/values-ru/strings_store.xml index 13c0f7c9b..6d21492c4 100644 --- a/manager-ui/src/main/res/values-ru/strings_store.xml +++ b/manager-ui/src/main/res/values-ru/strings_store.xml @@ -54,7 +54,6 @@ Открыть страницу модуля Установить - Переустановить Выберите файл для установки %1$d загрузка diff --git a/manager-ui/src/main/res/values-tr/strings_store.xml b/manager-ui/src/main/res/values-tr/strings_store.xml index 8e0eeb747..aa7c92cb8 100644 --- a/manager-ui/src/main/res/values-tr/strings_store.xml +++ b/manager-ui/src/main/res/values-tr/strings_store.xml @@ -50,7 +50,6 @@ Modül sayfasını aç Kur - Yeniden kur Kurulacak dosyayı seçin %1$d indirme diff --git a/manager-ui/src/main/res/values-uk/strings_store.xml b/manager-ui/src/main/res/values-uk/strings_store.xml index c98c30aaf..90083d97e 100644 --- a/manager-ui/src/main/res/values-uk/strings_store.xml +++ b/manager-ui/src/main/res/values-uk/strings_store.xml @@ -54,7 +54,6 @@ Відкрити сторінку модуля Встановити - Перевстановити Виберіть файл для встановлення %1$d завантаження diff --git a/manager-ui/src/main/res/values-vi/strings_store.xml b/manager-ui/src/main/res/values-vi/strings_store.xml index 79d9b79bf..b2e28571b 100644 --- a/manager-ui/src/main/res/values-vi/strings_store.xml +++ b/manager-ui/src/main/res/values-vi/strings_store.xml @@ -48,7 +48,6 @@ Mở trang của mô-đun Cài đặt - Cài lại Chọn tệp để cài %1$d lượt tải diff --git a/manager-ui/src/main/res/values-zh-rCN/strings_store.xml b/manager-ui/src/main/res/values-zh-rCN/strings_store.xml index 68447b70a..4b513d4b5 100644 --- a/manager-ui/src/main/res/values-zh-rCN/strings_store.xml +++ b/manager-ui/src/main/res/values-zh-rCN/strings_store.xml @@ -48,7 +48,6 @@ 打开模块页面 安装 - 重新安装 选择要安装的文件 %1$d 次下载 diff --git a/manager-ui/src/main/res/values-zh-rTW/strings_store.xml b/manager-ui/src/main/res/values-zh-rTW/strings_store.xml index 1c7a0f55a..5e8cedf32 100644 --- a/manager-ui/src/main/res/values-zh-rTW/strings_store.xml +++ b/manager-ui/src/main/res/values-zh-rTW/strings_store.xml @@ -48,7 +48,6 @@ 開啟模組頁面 安裝 - 重新安裝 選擇要安裝的檔案 %1$d 次下載 diff --git a/manager-ui/src/main/res/values/strings_store.xml b/manager-ui/src/main/res/values/strings_store.xml index bb40e3173..8efd90507 100644 --- a/manager-ui/src/main/res/values/strings_store.xml +++ b/manager-ui/src/main/res/values/strings_store.xml @@ -57,7 +57,6 @@ Install - Reinstall Choose a file to install %1$d download diff --git a/manager/src/main/kotlin/org/matrix/vector/manager/data/repository/VectorStoreInstallHost.kt b/manager/src/main/kotlin/org/matrix/vector/manager/data/repository/VectorStoreInstallHost.kt index ec4b1c3e8..81ecf49ef 100644 --- a/manager/src/main/kotlin/org/matrix/vector/manager/data/repository/VectorStoreInstallHost.kt +++ b/manager/src/main/kotlin/org/matrix/vector/manager/data/repository/VectorStoreInstallHost.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import org.matrix.vector.manager.data.model.versionCodeCompat import org.matrix.vector.manager.di.ServiceLocator +import org.matrix.vector.ui.module.PER_USER_RANGE import org.matrix.vector.ui.store.InstallStep import org.matrix.vector.ui.store.ReleaseAsset import org.matrix.vector.ui.store.RepoVersion @@ -37,6 +38,9 @@ class VectorStoreInstallHost(private val packageName: String) : StoreInstallHost private val _installedIsLegacy = MutableStateFlow(false) override val installedIsLegacy: StateFlow = _installedIsLegacy.asStateFlow() + private val _installedUserId = MutableStateFlow(null) + override val installedUserId: StateFlow = _installedUserId.asStateFlow() + init { refreshScope() } @@ -56,6 +60,7 @@ class VectorStoreInstallHost(private val packageName: String) : StoreInstallHost ) _installedScope.value = manifest.scope _installedIsLegacy.value = manifest.isLegacy + _installedUserId.value = appInfo.uid / PER_USER_RANGE } } } diff --git a/manager/src/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt b/manager/src/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt index 2d308ef56..c8474c7c6 100644 --- a/manager/src/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt +++ b/manager/src/main/kotlin/org/matrix/vector/manager/ui/VectorApp.kt @@ -235,6 +235,7 @@ private fun EntryProviderScope.registerRoutes(navigator: Navigator) { packageName = route.packageName, onNavigateBack = { navigator.back() }, onOpenUrl = { url -> navigator.go(Web(url)) }, + onOpenScope = { packageName, userId -> navigator.go(Scope(packageName, userId)) }, dataSource = ServiceLocator.store, settings = ServiceLocator.settings, host = remember(route.packageName) { VectorStoreInstallHost(route.packageName) },