From 3c5776214fbeb4857d7ef0b4736780075badc4d9 Mon Sep 17 00:00:00 2001 From: Ushie Date: Fri, 3 Nov 2023 12:15:17 +0300 Subject: [PATCH] feat(Installer): use BottomAppBar (#1428) --- .../manager/ui/screen/InstallerScreen.kt | 83 +++++++++---------- .../ui/viewmodel/InstallerViewModel.kt | 2 +- app/src/main/res/values/strings.xml | 4 +- 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screen/InstallerScreen.kt b/app/src/main/java/app/revanced/manager/ui/screen/InstallerScreen.kt index c2a6d300..b72b944b 100644 --- a/app/src/main/java/app/revanced/manager/ui/screen/InstallerScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screen/InstallerScreen.kt @@ -13,7 +13,9 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Cancel import androidx.compose.material.icons.filled.CheckCircle -import androidx.compose.material.icons.outlined.MoreVert +import androidx.compose.material.icons.outlined.FileDownload +import androidx.compose.material.icons.outlined.PostAdd +import androidx.compose.material.icons.outlined.Save import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf @@ -36,8 +38,8 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import app.revanced.manager.R import app.revanced.manager.data.room.apps.installed.InstallType -import app.revanced.manager.patcher.worker.Step import app.revanced.manager.patcher.worker.State +import app.revanced.manager.patcher.worker.Step import app.revanced.manager.ui.component.AppScaffold import app.revanced.manager.ui.component.AppTopBar import app.revanced.manager.ui.component.ArrowButton @@ -59,7 +61,6 @@ fun InstallerScreen( val patcherState by vm.patcherState.observeAsState(null) val steps by vm.progress.collectAsStateWithLifecycle() val canInstall by remember { derivedStateOf { patcherState == true && (vm.installedPackageName != null || !vm.isInstalling) } } - var dropdownActive by rememberSaveable { mutableStateOf(false) } var showInstallPicker by rememberSaveable { mutableStateOf(false) } if (showInstallPicker) @@ -72,23 +73,40 @@ fun InstallerScreen( topBar = { AppTopBar( title = stringResource(R.string.installer), - onBackClick = onBackClick, - actions = { - IconButton(onClick = { dropdownActive = true }) { - Icon(Icons.Outlined.MoreVert, stringResource(R.string.more)) - } - DropdownMenu( - expanded = dropdownActive, - onDismissRequest = { dropdownActive = false } - ) { - DropdownMenuItem( - text = { Text(stringResource(R.string.save_logs)) }, - onClick = { vm.exportLogs(context) }, - enabled = patcherState != null - ) - } - } + onBackClick = onBackClick ) + }, + bottomBar = { + AnimatedVisibility(patcherState != null) { + BottomAppBar( + actions = { + if (canInstall) { + IconButton(onClick = { exportApkLauncher.launch("${vm.packageName}.apk") }) { + Icon(Icons.Outlined.Save, stringResource(id = R.string.save_apk)) + } + } + IconButton(onClick = { vm.exportLogs(context) }) { + Icon(Icons.Outlined.PostAdd, stringResource(id = R.string.save_logs)) + } + }, + floatingActionButton = { + if (canInstall) { + ExtendedFloatingActionButton( + text = { Text(stringResource(vm.appButtonText)) }, + icon = { Icon(Icons.Outlined.FileDownload, stringResource(id = R.string.install_app)) }, + containerColor = BottomAppBarDefaults.bottomAppBarFabColor, + elevation = FloatingActionButtonDefaults.bottomAppBarFabElevation(), + onClick = { + if (vm.installedPackageName == null) + showInstallPicker = true + else + vm.open() + } + ) + } + } + ) + } } ) { paddingValues -> Column( @@ -100,33 +118,6 @@ fun InstallerScreen( steps.forEach { InstallStep(it) } - Spacer(modifier = Modifier.weight(1f)) - Row( - verticalAlignment = Alignment.Bottom, - horizontalArrangement = Arrangement.spacedBy(12.dp, Alignment.End), - modifier = Modifier - .fillMaxWidth() - .padding(start = 16.dp, end = 16.dp, bottom = 16.dp) - ) { - Button( - onClick = { exportApkLauncher.launch("${vm.packageName}.apk") }, - enabled = canInstall - ) { - Text(stringResource(R.string.export_app)) - } - - Button( - onClick = { - if (vm.installedPackageName == null) - showInstallPicker = true - else - vm.open() - }, - enabled = canInstall - ) { - Text(stringResource(vm.appButtonText)) - } - } } } } diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt index bbb94299..177a7e5f 100644 --- a/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/InstallerViewModel.kt @@ -211,7 +211,7 @@ class InstallerViewModel( app.contentResolver.openOutputStream(it) .use { stream -> Files.copy(outputFile.toPath(), stream) } } - app.toast(app.getString(R.string.export_app_success)) + app.toast(app.getString(R.string.save_apk_success)) } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0f6c6eda..63f53250 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -229,8 +229,8 @@ Failed to install app: %s Failed to uninstall app: %s Open - Export - Apk exported + Save APK + APK Saved Failed to sign Apk: %s Save logs Select installation type