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.runtime.rememberSavedStateNavEntryDecorator
import androidx.navigation3.ui.NavDisplay import androidx.navigation3.ui.NavDisplay
import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator 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.details.AppDetailsScreen
import com.aurora.store.compose.ui.dev.DevProfileScreen import com.aurora.store.compose.ui.dev.DevProfileScreen
import com.aurora.store.compose.ui.commons.PermissionRationaleScreen import com.aurora.store.compose.ui.commons.PermissionRationaleScreen

View File

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

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later * 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.foundation.layout.Box
import androidx.compose.material3.DropdownMenu 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.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.compose.menu.items.BlacklistMenuItem
/** /**
* Menu for the blacklist screen * Menu for the blacklist screen
* @param modifier The modifier to be applied to the composable * @param modifier The modifier to be applied to the composable
* @param onMenuItemClicked Callback when a menu item has been clicked * @param onMenuItemClicked Callback when a menu item has been clicked
* @see BlacklistMenuItem * @see MenuItem
*/ */
@Composable @Composable
fun BlacklistMenu( fun BlacklistMenu(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isExpanded: Boolean = false, isExpanded: Boolean = false,
onMenuItemClicked: (blacklistMenuItem: BlacklistMenuItem) -> Unit = {} onMenuItemClicked: (menuItem: MenuItem) -> Unit = {}
) { ) {
var expanded by remember { mutableStateOf(isExpanded) } var expanded by remember { mutableStateOf(isExpanded) }
fun onClick(blacklistMenuItem: BlacklistMenuItem) { fun onClick(menuItem: MenuItem) {
onMenuItemClicked(blacklistMenuItem) onMenuItemClicked(menuItem)
expanded = false expanded = false
} }
@@ -51,19 +50,19 @@ fun BlacklistMenu(
DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_select_all)) }, text = { Text(text = stringResource(R.string.action_select_all)) },
onClick = { onClick(BlacklistMenuItem.SELECT_ALL) } onClick = { onClick(MenuItem.SELECT_ALL) }
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_remove_all)) }, text = { Text(text = stringResource(R.string.action_remove_all)) },
onClick = { onClick(BlacklistMenuItem.REMOVE_ALL) } onClick = { onClick(MenuItem.REMOVE_ALL) }
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_import)) }, text = { Text(text = stringResource(R.string.action_import)) },
onClick = { onClick(BlacklistMenuItem.IMPORT) } onClick = { onClick(MenuItem.IMPORT) }
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_export)) }, 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 * 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 * Valid menu items for the purpose of handling clicks
*/ */
enum class BlacklistMenuItem { enum class MenuItem {
SELECT_ALL, SELECT_ALL,
REMOVE_ALL, REMOVE_ALL,
IMPORT, 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.composables.ErrorComposable
import com.aurora.store.compose.preview.AppPreviewProvider import com.aurora.store.compose.preview.AppPreviewProvider
import com.aurora.store.compose.preview.coilPreviewProvider import com.aurora.store.compose.preview.coilPreviewProvider
import com.aurora.store.compose.menu.AppDetailsMenu import com.aurora.store.compose.ui.details.menu.AppDetailsMenu
import com.aurora.store.compose.menu.items.AppDetailsMenuItem import com.aurora.store.compose.ui.details.menu.MenuItem
import com.aurora.store.compose.navigation.Screen import com.aurora.store.compose.navigation.Screen
import com.aurora.store.compose.ui.details.components.Actions import com.aurora.store.compose.ui.details.components.Actions
import com.aurora.store.compose.ui.details.components.Changelog import com.aurora.store.compose.ui.details.components.Changelog
@@ -259,14 +259,14 @@ private fun ScreenContentApp(
fun SetupMenu() { fun SetupMenu() {
AppDetailsMenu(isInstalled = app.isInstalled, isFavorite = isFavorite) { menuItem -> AppDetailsMenu(isInstalled = app.isInstalled, isFavorite = isFavorite) { menuItem ->
when (menuItem) { when (menuItem) {
AppDetailsMenuItem.FAVORITE -> onFavorite() MenuItem.FAVORITE -> onFavorite()
AppDetailsMenuItem.MANUAL_DOWNLOAD -> { MenuItem.MANUAL_DOWNLOAD -> {
showExtraPane(ExtraScreen.ManualDownload) showExtraPane(ExtraScreen.ManualDownload)
} }
AppDetailsMenuItem.SHARE -> context.share(app.displayName, app.packageName) MenuItem.SHARE -> context.share(app.displayName, app.packageName)
AppDetailsMenuItem.APP_INFO -> context.appInfo(app.packageName) MenuItem.APP_INFO -> context.appInfo(app.packageName)
AppDetailsMenuItem.PLAY_STORE -> context.browse("$SHARE_URL${app.packageName}") MenuItem.PLAY_STORE -> context.browse("$SHARE_URL${app.packageName}")
AppDetailsMenuItem.ADD_TO_HOME -> { MenuItem.ADD_TO_HOME -> {
ShortcutManagerUtil.requestPinShortcut(context, app.packageName) ShortcutManagerUtil.requestPinShortcut(context, app.packageName)
} }
} }

View File

@@ -3,7 +3,7 @@
* SPDX-License-Identifier: GPL-3.0-or-later * 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.foundation.layout.Box
import androidx.compose.material3.DropdownMenu 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.R
import com.aurora.store.compose.composables.TopAppBarComposable import com.aurora.store.compose.composables.TopAppBarComposable
import com.aurora.store.compose.preview.AppPreviewProvider import com.aurora.store.compose.preview.AppPreviewProvider
import com.aurora.store.compose.menu.items.AppDetailsMenuItem
/** /**
* Menu for the app details screen * Menu for the app details screen
* @param app App for which this menu should be inflated * @param app App for which this menu should be inflated
* @param modifier The modifier to be applied to the composable * @param modifier The modifier to be applied to the composable
* @param onMenuItemClicked Callback when a menu item has been clicked * @param onMenuItemClicked Callback when a menu item has been clicked
* @see AppDetailsMenuItem * @see MenuItem
*/ */
@Composable @Composable
fun AppDetailsMenu( fun AppDetailsMenu(
@@ -40,15 +39,15 @@ fun AppDetailsMenu(
isInstalled: Boolean = false, isInstalled: Boolean = false,
isFavorite: Boolean = false, isFavorite: Boolean = false,
isExpanded: Boolean = false, isExpanded: Boolean = false,
onMenuItemClicked: (appDetailsMenuItem: AppDetailsMenuItem) -> Unit = {} onMenuItemClicked: (menuItem: MenuItem) -> Unit = {}
) { ) {
var expanded by remember { mutableStateOf(isExpanded) } var expanded by remember { mutableStateOf(isExpanded) }
fun onClick(appDetailsMenuItem: AppDetailsMenuItem) { fun onClick(menuItem: MenuItem) {
onMenuItemClicked(appDetailsMenuItem) onMenuItemClicked(menuItem)
expanded = false expanded = false
} }
IconButton(onClick = { onClick(AppDetailsMenuItem.FAVORITE) }) { IconButton(onClick = { onClick(MenuItem.FAVORITE) }) {
Icon( Icon(
painter = if (isFavorite) { painter = if (isFavorite) {
painterResource(R.drawable.ic_favorite_checked) painterResource(R.drawable.ic_favorite_checked)
@@ -59,7 +58,7 @@ fun AppDetailsMenu(
) )
} }
IconButton(onClick = { onClick(AppDetailsMenuItem.SHARE) }) { IconButton(onClick = { onClick(MenuItem.SHARE) }) {
Icon( Icon(
painter = painterResource(R.drawable.ic_share), painter = painterResource(R.drawable.ic_share),
contentDescription = stringResource(R.string.action_share) contentDescription = stringResource(R.string.action_share)
@@ -76,11 +75,11 @@ fun AppDetailsMenu(
DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.title_manual_download)) }, text = { Text(text = stringResource(R.string.title_manual_download)) },
onClick = { onClick(AppDetailsMenuItem.MANUAL_DOWNLOAD) } onClick = { onClick(MenuItem.MANUAL_DOWNLOAD) }
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.title_download_playstore)) }, 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 // Inflate actions available only when app is installed below
@@ -88,11 +87,11 @@ fun AppDetailsMenu(
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_info)) }, text = { Text(text = stringResource(R.string.action_info)) },
onClick = { onClick(AppDetailsMenuItem.APP_INFO) } onClick = { onClick(MenuItem.APP_INFO) }
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(R.string.action_home_screen)) }, 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 * 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 * Valid menu items for app details screen for handling clicks
*/ */
enum class AppDetailsMenuItem { enum class MenuItem {
FAVORITE, FAVORITE,
SHARE, SHARE,
MANUAL_DOWNLOAD, 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.ErrorComposable
import com.aurora.store.compose.composables.ProgressComposable import com.aurora.store.compose.composables.ProgressComposable
import com.aurora.store.compose.composables.TopAppBarComposable import com.aurora.store.compose.composables.TopAppBarComposable
import com.aurora.store.compose.menu.DownloadsMenu import com.aurora.store.compose.ui.downloads.menu.DownloadsMenu
import com.aurora.store.compose.menu.items.DownloadsMenuItem import com.aurora.store.compose.ui.downloads.menu.MenuItem
import com.aurora.store.data.room.download.Download import com.aurora.store.data.room.download.Download
import com.aurora.store.viewmodel.downloads.DownloadsViewModel import com.aurora.store.viewmodel.downloads.DownloadsViewModel
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
@@ -111,9 +111,9 @@ private fun ScreenContent(
fun SetupMenu() { fun SetupMenu() {
DownloadsMenu { menuItem -> DownloadsMenu { menuItem ->
when (menuItem) { when (menuItem) {
DownloadsMenuItem.CANCEL_ALL -> onCancelAll() MenuItem.CANCEL_ALL -> onCancelAll()
DownloadsMenuItem.FORCE_CLEAR_ALL -> onForceClearAll() MenuItem.FORCE_CLEAR_ALL -> onForceClearAll()
DownloadsMenuItem.CLEAR_FINISHED -> onClearFinished() MenuItem.CLEAR_FINISHED -> onClearFinished()
} }
} }
} }

View File

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

View File

@@ -1,23 +1,9 @@
/* /*
* Aurora Store * SPDX-FileCopyrightText: 2025 The Calyx Institute
* Copyright (C) 2021, Rahul Kumar Patel <whyorean@gmail.com> * SPDX-License-Identifier: GPL-3.0-or-later
*
* 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/>.
*
*/ */
package com.aurora.store.viewmodel.all package com.aurora.store.viewmodel.blacklist
import android.content.Context import android.content.Context
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
@@ -105,7 +91,7 @@ class BlacklistViewModel @Inject constructor(
fun blacklist(packageName: String) { fun blacklist(packageName: String) {
blacklist.add(packageName) blacklist.add(packageName)
blacklistProvider.blacklist(packageName) blacklistProvider.blacklist(packageName)
AuroraApp.events.send(BusEvent.Blacklisted(packageName)) AuroraApp.Companion.events.send(BusEvent.Blacklisted(packageName))
} }
fun blacklistAll() { fun blacklistAll() {