compose: menu: Encapsulate menu with screens

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2025-09-16 17:45:13 +05:30
parent e1b3f5be73
commit 66ed08c502
11 changed files with 60 additions and 76 deletions

View File

@@ -15,7 +15,7 @@ import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.rememberSavedStateNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator
import com.aurora.store.compose.ui.commons.BlacklistScreen
import com.aurora.store.compose.ui.blacklist.BlacklistScreen
import com.aurora.store.compose.ui.details.AppDetailsScreen
import com.aurora.store.compose.ui.dev.DevProfileScreen
import com.aurora.store.compose.ui.commons.PermissionRationaleScreen

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.compose.ui.commons
package com.aurora.store.compose.ui.blacklist
import android.content.pm.PackageInfo
import android.net.Uri
@@ -46,10 +46,10 @@ import com.aurora.Constants
import com.aurora.extensions.toast
import com.aurora.store.R
import com.aurora.store.compose.composables.BlackListComposable
import com.aurora.store.compose.menu.BlacklistMenu
import com.aurora.store.compose.menu.items.BlacklistMenuItem
import com.aurora.store.compose.ui.blacklist.menu.BlacklistMenu
import com.aurora.store.compose.ui.blacklist.menu.MenuItem
import com.aurora.store.util.PackageUtil
import com.aurora.store.viewmodel.all.BlacklistViewModel
import com.aurora.store.viewmodel.blacklist.BlacklistViewModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import java.util.Calendar
@@ -130,13 +130,13 @@ private fun ScreenContent(
fun SetupMenu() {
BlacklistMenu { menuItem ->
when (menuItem) {
BlacklistMenuItem.SELECT_ALL -> onBlacklistAll()
BlacklistMenuItem.REMOVE_ALL -> onWhitelistAll()
BlacklistMenuItem.IMPORT -> {
MenuItem.SELECT_ALL -> onBlacklistAll()
MenuItem.REMOVE_ALL -> onWhitelistAll()
MenuItem.IMPORT -> {
docImportLauncher.launch(arrayOf(Constants.JSON_MIME_TYPE))
}
BlacklistMenuItem.EXPORT -> {
MenuItem.EXPORT -> {
docExportLauncher.launch(
"aurora_store_apps_${Calendar.getInstance().time.time}.json"
)

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.compose.menu
package com.aurora.store.compose.ui.blacklist.menu
import androidx.compose.foundation.layout.Box
import androidx.compose.material3.DropdownMenu
@@ -21,23 +21,22 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.aurora.store.R
import com.aurora.store.compose.menu.items.BlacklistMenuItem
/**
* Menu for the blacklist screen
* @param modifier The modifier to be applied to the composable
* @param onMenuItemClicked Callback when a menu item has been clicked
* @see BlacklistMenuItem
* @see MenuItem
*/
@Composable
fun BlacklistMenu(
modifier: Modifier = Modifier,
isExpanded: Boolean = false,
onMenuItemClicked: (blacklistMenuItem: BlacklistMenuItem) -> Unit = {}
onMenuItemClicked: (menuItem: MenuItem) -> Unit = {}
) {
var expanded by remember { mutableStateOf(isExpanded) }
fun onClick(blacklistMenuItem: BlacklistMenuItem) {
onMenuItemClicked(blacklistMenuItem)
fun onClick(menuItem: MenuItem) {
onMenuItemClicked(menuItem)
expanded = false
}
@@ -51,19 +50,19 @@ fun BlacklistMenu(
DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_select_all)) },
onClick = { onClick(BlacklistMenuItem.SELECT_ALL) }
onClick = { onClick(MenuItem.SELECT_ALL) }
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_remove_all)) },
onClick = { onClick(BlacklistMenuItem.REMOVE_ALL) }
onClick = { onClick(MenuItem.REMOVE_ALL) }
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_import)) },
onClick = { onClick(BlacklistMenuItem.IMPORT) }
onClick = { onClick(MenuItem.IMPORT) }
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_export)) },
onClick = { onClick(BlacklistMenuItem.EXPORT) }
onClick = { onClick(MenuItem.EXPORT) }
)
}
}

View File

@@ -3,12 +3,12 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.compose.menu.items
package com.aurora.store.compose.ui.blacklist.menu
/**
* Valid menu items for the purpose of handling clicks
*/
enum class BlacklistMenuItem {
enum class MenuItem {
SELECT_ALL,
REMOVE_ALL,
IMPORT,

View File

@@ -62,8 +62,8 @@ import com.aurora.store.compose.composables.ProgressComposable
import com.aurora.store.compose.composables.ErrorComposable
import com.aurora.store.compose.preview.AppPreviewProvider
import com.aurora.store.compose.preview.coilPreviewProvider
import com.aurora.store.compose.menu.AppDetailsMenu
import com.aurora.store.compose.menu.items.AppDetailsMenuItem
import com.aurora.store.compose.ui.details.menu.AppDetailsMenu
import com.aurora.store.compose.ui.details.menu.MenuItem
import com.aurora.store.compose.navigation.Screen
import com.aurora.store.compose.ui.details.components.Actions
import com.aurora.store.compose.ui.details.components.Changelog
@@ -259,14 +259,14 @@ private fun ScreenContentApp(
fun SetupMenu() {
AppDetailsMenu(isInstalled = app.isInstalled, isFavorite = isFavorite) { menuItem ->
when (menuItem) {
AppDetailsMenuItem.FAVORITE -> onFavorite()
AppDetailsMenuItem.MANUAL_DOWNLOAD -> {
MenuItem.FAVORITE -> onFavorite()
MenuItem.MANUAL_DOWNLOAD -> {
showExtraPane(ExtraScreen.ManualDownload)
}
AppDetailsMenuItem.SHARE -> context.share(app.displayName, app.packageName)
AppDetailsMenuItem.APP_INFO -> context.appInfo(app.packageName)
AppDetailsMenuItem.PLAY_STORE -> context.browse("$SHARE_URL${app.packageName}")
AppDetailsMenuItem.ADD_TO_HOME -> {
MenuItem.SHARE -> context.share(app.displayName, app.packageName)
MenuItem.APP_INFO -> context.appInfo(app.packageName)
MenuItem.PLAY_STORE -> context.browse("$SHARE_URL${app.packageName}")
MenuItem.ADD_TO_HOME -> {
ShortcutManagerUtil.requestPinShortcut(context, app.packageName)
}
}

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.compose.menu
package com.aurora.store.compose.ui.details.menu
import androidx.compose.foundation.layout.Box
import androidx.compose.material3.DropdownMenu
@@ -25,14 +25,13 @@ import com.aurora.gplayapi.data.models.App
import com.aurora.store.R
import com.aurora.store.compose.composables.TopAppBarComposable
import com.aurora.store.compose.preview.AppPreviewProvider
import com.aurora.store.compose.menu.items.AppDetailsMenuItem
/**
* Menu for the app details screen
* @param app App for which this menu should be inflated
* @param modifier The modifier to be applied to the composable
* @param onMenuItemClicked Callback when a menu item has been clicked
* @see AppDetailsMenuItem
* @see MenuItem
*/
@Composable
fun AppDetailsMenu(
@@ -40,15 +39,15 @@ fun AppDetailsMenu(
isInstalled: Boolean = false,
isFavorite: Boolean = false,
isExpanded: Boolean = false,
onMenuItemClicked: (appDetailsMenuItem: AppDetailsMenuItem) -> Unit = {}
onMenuItemClicked: (menuItem: MenuItem) -> Unit = {}
) {
var expanded by remember { mutableStateOf(isExpanded) }
fun onClick(appDetailsMenuItem: AppDetailsMenuItem) {
onMenuItemClicked(appDetailsMenuItem)
fun onClick(menuItem: MenuItem) {
onMenuItemClicked(menuItem)
expanded = false
}
IconButton(onClick = { onClick(AppDetailsMenuItem.FAVORITE) }) {
IconButton(onClick = { onClick(MenuItem.FAVORITE) }) {
Icon(
painter = if (isFavorite) {
painterResource(R.drawable.ic_favorite_checked)
@@ -59,7 +58,7 @@ fun AppDetailsMenu(
)
}
IconButton(onClick = { onClick(AppDetailsMenuItem.SHARE) }) {
IconButton(onClick = { onClick(MenuItem.SHARE) }) {
Icon(
painter = painterResource(R.drawable.ic_share),
contentDescription = stringResource(R.string.action_share)
@@ -76,11 +75,11 @@ fun AppDetailsMenu(
DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
DropdownMenuItem(
text = { Text(text = stringResource(R.string.title_manual_download)) },
onClick = { onClick(AppDetailsMenuItem.MANUAL_DOWNLOAD) }
onClick = { onClick(MenuItem.MANUAL_DOWNLOAD) }
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.title_download_playstore)) },
onClick = { onClick(AppDetailsMenuItem.PLAY_STORE) }
onClick = { onClick(MenuItem.PLAY_STORE) }
)
// Inflate actions available only when app is installed below
@@ -88,11 +87,11 @@ fun AppDetailsMenu(
DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_info)) },
onClick = { onClick(AppDetailsMenuItem.APP_INFO) }
onClick = { onClick(MenuItem.APP_INFO) }
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_home_screen)) },
onClick = { onClick(AppDetailsMenuItem.ADD_TO_HOME) }
onClick = { onClick(MenuItem.ADD_TO_HOME) }
)
}
}

View File

@@ -3,12 +3,12 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.compose.menu.items
package com.aurora.store.compose.ui.details.menu
/**
* Valid menu items for app details screen for handling clicks
*/
enum class AppDetailsMenuItem {
enum class MenuItem {
FAVORITE,
SHARE,
MANUAL_DOWNLOAD,

View File

@@ -36,8 +36,8 @@ import com.aurora.store.compose.composables.DownloadComposable
import com.aurora.store.compose.composables.ErrorComposable
import com.aurora.store.compose.composables.ProgressComposable
import com.aurora.store.compose.composables.TopAppBarComposable
import com.aurora.store.compose.menu.DownloadsMenu
import com.aurora.store.compose.menu.items.DownloadsMenuItem
import com.aurora.store.compose.ui.downloads.menu.DownloadsMenu
import com.aurora.store.compose.ui.downloads.menu.MenuItem
import com.aurora.store.data.room.download.Download
import com.aurora.store.viewmodel.downloads.DownloadsViewModel
import kotlinx.coroutines.flow.flowOf
@@ -111,9 +111,9 @@ private fun ScreenContent(
fun SetupMenu() {
DownloadsMenu { menuItem ->
when (menuItem) {
DownloadsMenuItem.CANCEL_ALL -> onCancelAll()
DownloadsMenuItem.FORCE_CLEAR_ALL -> onForceClearAll()
DownloadsMenuItem.CLEAR_FINISHED -> onClearFinished()
MenuItem.CANCEL_ALL -> onCancelAll()
MenuItem.FORCE_CLEAR_ALL -> onForceClearAll()
MenuItem.CLEAR_FINISHED -> onClearFinished()
}
}
}

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.compose.menu
package com.aurora.store.compose.ui.downloads.menu
import androidx.compose.foundation.layout.Box
import androidx.compose.material3.DropdownMenu
@@ -21,22 +21,22 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.aurora.store.R
import com.aurora.store.compose.menu.items.DownloadsMenuItem
import com.aurora.store.compose.ui.downloads.menu.MenuItem
/**
* Menu for the blacklist screen
* @param modifier The modifier to be applied to the composable
* @param onMenuItemClicked Callback when a menu item has been clicked
* @see DownloadsMenuItem
* @see MenuItem
*/
@Composable
fun DownloadsMenu(
modifier: Modifier = Modifier,
isExpanded: Boolean = false,
onMenuItemClicked: (menuItem: DownloadsMenuItem) -> Unit = {}
onMenuItemClicked: (menuItem: MenuItem) -> Unit = {}
) {
var expanded by remember { mutableStateOf(isExpanded) }
fun onClick(menuItem: DownloadsMenuItem) {
fun onClick(menuItem: MenuItem) {
onMenuItemClicked(menuItem)
expanded = false
}
@@ -51,15 +51,15 @@ fun DownloadsMenu(
DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
DropdownMenuItem(
text = { Text(text = stringResource(R.string.download_cancel_all)) },
onClick = { onClick(DownloadsMenuItem.CANCEL_ALL) }
onClick = { onClick(MenuItem.CANCEL_ALL) }
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.download_clear_finished)) },
onClick = { onClick(DownloadsMenuItem.CLEAR_FINISHED) }
onClick = { onClick(MenuItem.CLEAR_FINISHED) }
)
DropdownMenuItem(
text = { Text(text = stringResource(R.string.download_force_clear_all)) },
onClick = { onClick(DownloadsMenuItem.FORCE_CLEAR_ALL) }
onClick = { onClick(MenuItem.FORCE_CLEAR_ALL) }
)
}
}

View File

@@ -3,12 +3,12 @@
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.compose.menu.items
package com.aurora.store.compose.ui.downloads.menu
/**
* Valid menu items for the purpose of handling clicks
*/
enum class DownloadsMenuItem {
enum class MenuItem {
CANCEL_ALL,
FORCE_CLEAR_ALL,
CLEAR_FINISHED

View File

@@ -1,23 +1,9 @@
/*
* Aurora Store
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com>
*
* Aurora Store is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* Aurora Store is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Aurora Store. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.viewmodel.all
package com.aurora.store.viewmodel.blacklist
import android.content.Context
import android.content.pm.PackageInfo
@@ -105,7 +91,7 @@ class BlacklistViewModel @Inject constructor(
fun blacklist(packageName: String) {
blacklist.add(packageName)
blacklistProvider.blacklist(packageName)
AuroraApp.events.send(BusEvent.Blacklisted(packageName))
AuroraApp.Companion.events.send(BusEvent.Blacklisted(packageName))
}
fun blacklistAll() {