Merge branch 'dev' into 'master'

dev

See merge request AuroraOSS/AuroraStore!562
This commit is contained in:
Rahul Patel
2026-05-12 02:32:42 +05:30
50 changed files with 174 additions and 60 deletions

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -8,7 +9,10 @@ package com.aurora.store.compose.navigation
import android.content.Intent import android.content.Intent
import androidx.activity.compose.LocalActivity import androidx.activity.compose.LocalActivity
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.LifecycleEventEffect
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation.NavDeepLinkBuilder import androidx.navigation.NavDeepLinkBuilder
import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.NavKey
@@ -16,6 +20,10 @@ import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay import androidx.navigation3.ui.NavDisplay
import com.aurora.Constants.PACKAGE_NAME_GMS
import com.aurora.extensions.toast
import com.aurora.store.AuroraApp
import com.aurora.store.ComposeActivity
import com.aurora.store.MainActivity import com.aurora.store.MainActivity
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.compose.ui.about.AboutScreen import com.aurora.store.compose.ui.about.AboutScreen
@@ -33,6 +41,11 @@ import com.aurora.store.compose.ui.onboarding.OnboardingScreen
import com.aurora.store.compose.ui.preferences.installation.InstallerScreen import com.aurora.store.compose.ui.preferences.installation.InstallerScreen
import com.aurora.store.compose.ui.search.SearchScreen import com.aurora.store.compose.ui.search.SearchScreen
import com.aurora.store.compose.ui.spoof.SpoofScreen import com.aurora.store.compose.ui.spoof.SpoofScreen
import com.aurora.store.data.event.InstallerEvent
import com.aurora.store.data.model.AccountType
import com.aurora.store.data.providers.AccountProvider
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.Preferences
/** /**
* Navigation display for compose screens * Navigation display for compose screens
@@ -58,6 +71,36 @@ fun NavDisplay(startDestination: NavKey) {
if (backstack.size == 1) activity?.finish() else backstack.removeLastOrNull() if (backstack.size == 1) activity?.finish() else backstack.removeLastOrNull()
} }
val context = LocalContext.current
fun isMicroGAuthInvalidated(): Boolean =
Preferences.getBoolean(context, Preferences.PREFERENCE_AUTH_VIA_MICROG, false) &&
AccountProvider.getAccountType(context) == AccountType.GOOGLE &&
!PackageUtil.hasSupportedMicroGVariant(context)
fun handleMicroGRemoved() {
context.toast(R.string.microg_removed_auth_warning)
AccountProvider.logout(context)
val intent = Intent(context, ComposeActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
}
context.startActivity(intent)
}
// Check every time the screen resumes in case microG was removed while Aurora was in background.
LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
if (isMicroGAuthInvalidated()) handleMicroGRemoved()
}
// Also react immediately if the GMS package is uninstalled while Aurora is in the foreground.
LaunchedEffect(Unit) {
AuroraApp.events.installerEvent.collect { event ->
if (event is InstallerEvent.Uninstalled && event.packageName == PACKAGE_NAME_GMS) {
if (isMicroGAuthInvalidated()) handleMicroGRemoved()
}
}
}
NavDisplay( NavDisplay(
backStack = backstack, backStack = backstack,
entryDecorators = listOf( entryDecorators = listOf(

View File

@@ -1,14 +1,13 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2024-2025 The Calyx Institute * SPDX-FileCopyrightText: 2024-2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
package com.aurora.store.compose.theme package com.aurora.store.compose.theme
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
import android.os.Build import android.os.Build
import androidx.activity.compose.LocalActivity
import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialExpressiveTheme import androidx.compose.material3.MaterialExpressiveTheme
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@@ -31,6 +30,7 @@ import com.aurora.store.util.Preferences
@Composable @Composable
fun AuroraTheme(content: @Composable () -> Unit) { fun AuroraTheme(content: @Composable () -> Unit) {
val context = LocalContext.current val context = LocalContext.current
val themeStyle = Preferences.getInteger(context, Preferences.PREFERENCE_THEME_STYLE) val themeStyle = Preferences.getInteger(context, Preferences.PREFERENCE_THEME_STYLE)
val isDynamicColorSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S val isDynamicColorSupported = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
@@ -63,10 +63,11 @@ fun AuroraTheme(content: @Composable () -> Unit) {
* This is necessary on OEM devices that don't properly support dynamic theming and may have issues with light/dark status bar icons. * This is necessary on OEM devices that don't properly support dynamic theming and may have issues with light/dark status bar icons.
*/ */
val view = LocalView.current val view = LocalView.current
val activity = LocalActivity.current
if (!view.isInEditMode) { if (!view.isInEditMode) {
SideEffect { SideEffect {
val activity = view.context.findActivity() ?: return@SideEffect val currentActivity = activity ?: return@SideEffect
val window = activity.window val window = currentActivity.window
// Transparent system bars // Transparent system bars
window.statusBarColor = android.graphics.Color.TRANSPARENT window.statusBarColor = android.graphics.Color.TRANSPARENT
@@ -84,9 +85,3 @@ fun AuroraTheme(content: @Composable () -> Unit) {
MaterialExpressiveTheme(colorScheme = colorScheme, content = content) MaterialExpressiveTheme(colorScheme = colorScheme, content = content)
} }
tailrec fun Context.findActivity(): Activity? = when (this) {
is Activity -> this
is ContextWrapper -> baseContext.findActivity()
else -> null
}

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -8,7 +9,7 @@ package com.aurora.store.compose.ui.commons
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -57,7 +58,7 @@ private fun ScreenContent(
permissions: List<Permission> = emptyList(), permissions: List<Permission> = emptyList(),
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
onPermissionCallback: (type: PermissionType) -> Unit = {}, onPermissionCallback: (type: PermissionType) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
Scaffold( Scaffold(
topBar = { topBar = {

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -23,7 +24,7 @@ import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.material3.adaptive.layout.AdaptStrategy import androidx.compose.material3.adaptive.layout.AdaptStrategy
import androidx.compose.material3.adaptive.layout.AnimatedPane import androidx.compose.material3.adaptive.layout.AnimatedPane
import androidx.compose.material3.adaptive.layout.PaneAdaptedValue import androidx.compose.material3.adaptive.layout.PaneAdaptedValue
@@ -241,7 +242,7 @@ private fun ScreenContentApp(
onUninstall: () -> Unit = {}, onUninstall: () -> Unit = {},
onOpen: () -> Unit = {}, onOpen: () -> Unit = {},
onTestingSubscriptionChange: (subscribe: Boolean) -> Unit = {}, onTestingSubscriptionChange: (subscribe: Boolean) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo(), windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2(),
forceSinglePane: Boolean = false, forceSinglePane: Boolean = false,
onForceRestart: () -> Unit = {} onForceRestart: () -> Unit = {}
) { ) {

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -17,7 +18,7 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -58,7 +59,7 @@ fun ExodusScreen(
onNavigateUp: () -> Unit, onNavigateUp: () -> Unit,
appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName), appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName),
exodusViewModel: ExodusViewModel = hiltViewModel(key = "$packageName/exodus"), exodusViewModel: ExodusViewModel = hiltViewModel(key = "$packageName/exodus"),
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val context = LocalContext.current val context = LocalContext.current
@@ -103,7 +104,7 @@ private fun ScreenContentReport(
trackers: List<ExodusTracker> = emptyList(), trackers: List<ExodusTracker> = emptyList(),
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
onRequestAnalysis: () -> Unit = {}, onRequestAnalysis: () -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val context = LocalContext.current val context = LocalContext.current
@@ -175,7 +176,7 @@ private fun ScreenContentError(
topAppBarTitle: String? = null, topAppBarTitle: String? = null,
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
onRequestAnalysis: () -> Unit = {}, onRequestAnalysis: () -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
Scaffold( Scaffold(
topBar = { topBar = {

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -25,7 +26,7 @@ import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -71,7 +72,7 @@ fun ManualDownloadScreen(
onNavigateUp: () -> Unit, onNavigateUp: () -> Unit,
onRequestInstall: (requestedApp: App) -> Unit, onRequestInstall: (requestedApp: App) -> Unit,
viewModel: AppDetailsViewModel = hiltViewModel(key = packageName), viewModel: AppDetailsViewModel = hiltViewModel(key = packageName),
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val app by viewModel.app.collectAsStateWithLifecycle() val app by viewModel.app.collectAsStateWithLifecycle()
val state by viewModel.state.collectAsStateWithLifecycle() val state by viewModel.state.collectAsStateWithLifecycle()
@@ -106,7 +107,7 @@ private fun ScreenContent(
currentVersionCode: Long = 0L, currentVersionCode: Long = 0L,
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
onRequestInstall: (versionCode: Long) -> Unit = {}, onRequestInstall: (versionCode: Long) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val snackBarHostState = remember { SnackbarHostState() } val snackBarHostState = remember { SnackbarHostState() }

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -20,7 +21,7 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@@ -58,7 +59,7 @@ fun MicroGScreen(
onIgnore: (Boolean) -> Unit, onIgnore: (Boolean) -> Unit,
appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName), appDetailsViewModel: AppDetailsViewModel = hiltViewModel(key = packageName),
viewModel: MicroGViewModel = hiltViewModel(), viewModel: MicroGViewModel = hiltViewModel(),
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val app by appDetailsViewModel.app.collectAsStateWithLifecycle() val app by appDetailsViewModel.app.collectAsStateWithLifecycle()
val topAppBarTitle = when { val topAppBarTitle = when {
@@ -84,7 +85,7 @@ private fun ScreenContent(
onInstall: () -> Unit = {}, onInstall: () -> Unit = {},
onRetry: () -> Unit = {}, onRetry: () -> Unit = {},
onIgnore: (Boolean) -> Unit = {}, onIgnore: (Boolean) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val context = LocalContext.current val context = LocalContext.current
val listState = rememberLazyListState() val listState = rememberLazyListState()

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -18,7 +19,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@@ -78,7 +79,7 @@ private fun ScreenContent(
dependencies: List<App>? = null, dependencies: List<App>? = null,
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
onNavigateToAppDetails: (packageName: String) -> Unit = {}, onNavigateToAppDetails: (packageName: String) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val topAppBarTitle = when { val topAppBarTitle = when {
windowAdaptiveInfo.isWindowCompact -> app.displayName windowAdaptiveInfo.isWindowCompact -> app.displayName

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -15,7 +16,7 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@@ -54,7 +55,7 @@ fun PermissionScreen(
factory.create(appDetailsViewModel.app.value!!.permissions) factory.create(appDetailsViewModel.app.value!!.permissions)
} }
), ),
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val app by appDetailsViewModel.app.collectAsStateWithLifecycle() val app by appDetailsViewModel.app.collectAsStateWithLifecycle()
val permissionsInfo by permissionViewModel.permissionsInfo.collectAsStateWithLifecycle() val permissionsInfo by permissionViewModel.permissionsInfo.collectAsStateWithLifecycle()
@@ -76,7 +77,7 @@ private fun ScreenContent(
topAppBarTitle: String? = null, topAppBarTitle: String? = null,
permissionsInfo: Map<String, PermissionInfo> = emptyMap(), permissionsInfo: Map<String, PermissionInfo> = emptyMap(),
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val packageManager = LocalContext.current.packageManager val packageManager = LocalContext.current.packageManager

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -21,7 +22,7 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@@ -71,7 +72,7 @@ fun ReviewScreen(
factory.create(appDetailsViewModel.app.value!!.packageName) factory.create(appDetailsViewModel.app.value!!.packageName)
} }
), ),
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val app by appDetailsViewModel.app.collectAsStateWithLifecycle() val app by appDetailsViewModel.app.collectAsStateWithLifecycle()
val reviews = reviewViewModel.reviews.collectAsLazyPagingItems() val reviews = reviewViewModel.reviews.collectAsLazyPagingItems()
@@ -95,7 +96,7 @@ private fun ScreenContent(
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
reviews: LazyPagingItems<Review> = emptyPagingItems(), reviews: LazyPagingItems<Review> = emptyPagingItems(),
onFilter: (filter: Review.Filter) -> Unit = {}, onFilter: (filter: Review.Filter) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
Scaffold( Scaffold(
topBar = { topBar = {

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -11,7 +12,7 @@ import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -37,7 +38,7 @@ fun ScreenshotScreen(
index: Int, index: Int,
onNavigateUp: () -> Unit, onNavigateUp: () -> Unit,
viewModel: AppDetailsViewModel = hiltViewModel(key = packageName), viewModel: AppDetailsViewModel = hiltViewModel(key = packageName),
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val app by viewModel.app.collectAsStateWithLifecycle() val app by viewModel.app.collectAsStateWithLifecycle()
@@ -60,7 +61,7 @@ private fun ScreenContent(
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
screenshots: List<Artwork> = emptyList(), screenshots: List<Artwork> = emptyList(),
index: Int = 0, index: Int = 0,
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val displayMetrics = LocalContext.current.resources.displayMetrics val displayMetrics = LocalContext.current.resources.displayMetrics
val pagerState = rememberPagerState(initialPage = index) { screenshots.size } val pagerState = rememberPagerState(initialPage = index) { screenshots.size }

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -16,7 +17,7 @@ import androidx.compose.material3.Button
import androidx.compose.material3.FilledTonalButton import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.dimensionResource
@@ -47,7 +48,7 @@ fun Actions(
isSecondaryActionEnabled: Boolean = true, isSecondaryActionEnabled: Boolean = true,
onPrimaryAction: () -> Unit = {}, onPrimaryAction: () -> Unit = {},
onSecondaryAction: () -> Unit = {}, onSecondaryAction: () -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -20,7 +21,7 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -58,7 +59,7 @@ fun RatingAndReviews(
rating: Rating, rating: Rating,
featuredReviews: List<Review> = emptyList(), featuredReviews: List<Review> = emptyList(),
onNavigateToDetailsReview: () -> Unit = {}, onNavigateToDetailsReview: () -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val stars = listOf( val stars = listOf(
rating.oneStar, rating.oneStar,

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -10,7 +11,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -83,7 +84,7 @@ private fun ScreenContent(
topAppBarTitle: String, topAppBarTitle: String,
onNavigateUp: () -> Unit = {}, onNavigateUp: () -> Unit = {},
onNavigateToAppDetails: (packageName: String) -> Unit = {}, onNavigateToAppDetails: (packageName: String) -> Unit = {},
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
Scaffold( Scaffold(
topBar = { topBar = {

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -24,7 +25,7 @@ import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfoV2
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@@ -71,7 +72,7 @@ private fun ScreenContent(
onFinishOnboarding: () -> Unit = {}, onFinishOnboarding: () -> Unit = {},
uiState: OnboardingUiState, uiState: OnboardingUiState,
onMicrogTOSChecked: (Boolean) -> Unit, onMicrogTOSChecked: (Boolean) -> Unit,
windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfo() windowAdaptiveInfo: WindowAdaptiveInfo = currentWindowAdaptiveInfoV2()
) { ) {
val pagerState = rememberPagerState { pages.size } val pagerState = rememberPagerState { pages.size }
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -116,6 +116,14 @@ class DownloadHelper @Inject constructor(
downloadDao.updateStatus(packageName, DownloadStatus.CANCELLED) downloadDao.updateStatus(packageName, DownloadStatus.CANCELLED)
} }
/**
* Removes the download record from the database without deleting downloaded files.
* @param packageName Name of the package
*/
suspend fun removeDownload(packageName: String) {
downloadDao.delete(packageName)
}
/** /**
* Clears the entry & downloaded files for the given package * Clears the entry & downloaded files for the given package
* @param packageName Name of the package of the app * @param packageName Name of the package of the app

View File

@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */
@@ -28,7 +29,7 @@ class GenericPagingSource<T : Any>(
) : PagingSource<Int, T>() { ) : PagingSource<Int, T>() {
companion object { companion object {
private const val DEFAULT_PAGE_SIZE = 20 const val DEFAULT_PAGE_SIZE = 20
/** /**
* Method to create pager objects using [PagingSource] * Method to create pager objects using [PagingSource]

View File

@@ -80,5 +80,6 @@ object AccountProvider {
Preferences.remove(context, Constants.ACCOUNT_EMAIL_PLAIN) Preferences.remove(context, Constants.ACCOUNT_EMAIL_PLAIN)
Preferences.remove(context, Constants.ACCOUNT_AAS_PLAIN) Preferences.remove(context, Constants.ACCOUNT_AAS_PLAIN)
Preferences.remove(context, Constants.ACCOUNT_AUTH_PLAIN) Preferences.remove(context, Constants.ACCOUNT_AUTH_PLAIN)
Preferences.remove(context, Preferences.PREFERENCE_AUTH_VIA_MICROG)
} }
} }

View File

@@ -1,3 +1,8 @@
/*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-License-Identifier: GPL-3.0-or-later
*/
package com.aurora.store.data.work package com.aurora.store.data.work
import android.app.NotificationManager import android.app.NotificationManager

View File

@@ -48,6 +48,7 @@ object Preferences {
const val PREFERENCE_PROXY_INFO = "PREFERENCE_PROXY_INFO" const val PREFERENCE_PROXY_INFO = "PREFERENCE_PROXY_INFO"
const val PREFERENCE_MICROG_AUTH = "PREFERENCE_MICROG_AUTH" const val PREFERENCE_MICROG_AUTH = "PREFERENCE_MICROG_AUTH"
const val PREFERENCE_AUTH_VIA_MICROG = "PREFERENCE_AUTH_VIA_MICROG"
const val PREFERENCE_DISPENSER_URLS = "PREFERENCE_DISPENSER_URLS" const val PREFERENCE_DISPENSER_URLS = "PREFERENCE_DISPENSER_URLS"
const val PREFERENCE_VENDING_VERSION = "PREFERENCE_VENDING_VERSION" const val PREFERENCE_VENDING_VERSION = "PREFERENCE_VENDING_VERSION"

View File

@@ -27,6 +27,7 @@ import androidx.paging.cachedIn
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.helpers.web.WebAppDetailsHelper import com.aurora.gplayapi.helpers.web.WebAppDetailsHelper
import com.aurora.store.data.PageResult import com.aurora.store.data.PageResult
import com.aurora.store.data.paging.GenericPagingSource
import com.aurora.store.data.paging.GenericPagingSource.Companion.manualPager import com.aurora.store.data.paging.GenericPagingSource.Companion.manualPager
import com.aurora.store.data.providers.BlacklistProvider import com.aurora.store.data.providers.BlacklistProvider
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
@@ -65,7 +66,7 @@ class InstalledViewModel @Inject constructor(
) { ) {
PackageUtil.getAllValidPackages(context) PackageUtil.getAllValidPackages(context)
.filterNot { it.packageName in blacklist } .filterNot { it.packageName in blacklist }
.chunked(PAGE_SIZE) .chunked(GenericPagingSource.DEFAULT_PAGE_SIZE)
} }
init { init {
@@ -73,7 +74,7 @@ class InstalledViewModel @Inject constructor(
} }
private fun fetchApps() { private fun fetchApps() {
manualPager(pageSize = PAGE_SIZE) { page -> manualPager(pageSize = GenericPagingSource.DEFAULT_PAGE_SIZE) { page ->
// page is 1-indexed, but list is 0-indexed // page is 1-indexed, but list is 0-indexed
val chunks = pagedPackages.await() val chunks = pagedPackages.await()
val chunk = chunks.getOrNull(page - 1) val chunk = chunks.getOrNull(page - 1)
@@ -85,8 +86,4 @@ class InstalledViewModel @Inject constructor(
.onEach { _apps.value = it } .onEach { _apps.value = it }
.launchIn(viewModelScope) .launchIn(viewModelScope)
} }
companion object {
private const val PAGE_SIZE = 20
}
} }

View File

@@ -35,6 +35,7 @@ import com.aurora.store.data.model.AuthState
import com.aurora.store.data.providers.AccountProvider import com.aurora.store.data.providers.AccountProvider
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.util.AC2DMTask import com.aurora.store.util.AC2DMTask
import com.aurora.store.util.PackageUtil
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
@@ -171,13 +172,26 @@ class AuthViewModel @Inject constructor(
_authState.value = AuthState.Verifying _authState.value = AuthState.Verifying
if (authData.authToken.isNotEmpty() && authData.deviceConfigToken.isNotEmpty()) { if (authData.authToken.isNotEmpty() && authData.deviceConfigToken.isNotEmpty()) {
authProvider.saveAuthData(authData) authProvider.saveAuthData(authData)
val tokenType =
if (authData.aasToken.isBlank()) AuthHelper.Token.AUTH else AuthHelper.Token.AAS
AccountProvider.login( AccountProvider.login(
context, context,
authData.email, authData.email,
authData.aasToken.ifBlank { authData.authToken }, authData.aasToken.ifBlank {
if (authData.aasToken.isBlank()) AuthHelper.Token.AUTH else AuthHelper.Token.AAS, authData.authToken
},
tokenType,
accountType accountType
) )
// Record whether this Google session relies on microG's AccountManager so we
// can warn the user if microG is later uninstalled.
Preferences.putBoolean(
context,
Preferences.PREFERENCE_AUTH_VIA_MICROG,
accountType == AccountType.GOOGLE &&
tokenType == AuthHelper.Token.AUTH &&
PackageUtil.hasSupportedMicroGVariant(context)
)
_authState.value = AuthState.SignedIn _authState.value = AuthState.SignedIn
} else { } else {
authProvider.removeAuthData(context) authProvider.removeAuthData(context)

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -155,12 +155,22 @@ class AppDetailsViewModel @Inject constructor(
_app.value = appDetailsHelper.getAppByPackageName(packageName).copy( _app.value = appDetailsHelper.getAppByPackageName(packageName).copy(
isInstalled = PackageUtil.isInstalled(context, packageName) isInstalled = PackageUtil.isInstalled(context, packageName)
) )
// Seed state from any in-flight download for this package so reopening val existingDownload = downloadHelper.getDownload(packageName)
// the screen doesn't briefly flash the default install action while the
// download flow catches up. // A COMPLETED record for an app that is no longer installed means the app was
_state.value = downloadHelper.getDownload(packageName) // installed then removed while Aurora held a stale record.
?.let { stateFromDownload(it) } // Remove it so the live download observer doesn't lock the UI in Installing state
?: defaultAppState // indefinitely.
if (existingDownload?.status == DownloadStatus.COMPLETED && !isInstalled) {
downloadHelper.removeDownload(packageName)
_state.value = defaultAppState
} else {
// Seed state from any in-flight download for this package so reopening
// the screen doesn't briefly flash the default install action while the
// download flow catches up.
_state.value =
existingDownload?.let { stateFromDownload(it) } ?: defaultAppState
}
} catch (exception: Exception) { } catch (exception: Exception) {
Log.e(TAG, "Failed to fetch app details", exception) Log.e(TAG, "Failed to fetch app details", exception)
_app.value = null _app.value = null

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later
*/ */

View File

@@ -1,4 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2026 Aurora OSS
* SPDX-FileCopyrightText: 2021 Rahul Kumar Patel <whyorean@gmail.com> * SPDX-FileCopyrightText: 2021 Rahul Kumar Patel <whyorean@gmail.com>
* SPDX-FileCopyrightText: 2025 The Calyx Institute * SPDX-FileCopyrightText: 2025 The Calyx Institute
* SPDX-License-Identifier: GPL-3.0-or-later * SPDX-License-Identifier: GPL-3.0-or-later

View File

@@ -392,6 +392,7 @@
<string name="native_installer_desc">Best suited for devices running below Android 4.4</string> <string name="native_installer_desc">Best suited for devices running below Android 4.4</string>
<string name="services_installer_subtitle">Installer for background installations</string> <string name="services_installer_subtitle">Installer for background installations</string>
<string name="services_installer_desc">Requires Aurora Services to be installed as a privileged-system app</string> <string name="services_installer_desc">Requires Aurora Services to be installed as a privileged-system app</string>
<string name="microg_removed_auth_warning">microG is no longer installed. Run setup again to keep things working smoothly.</string>
<string name="microg_installer_subtitle">Requires microG companion app to be installed</string> <string name="microg_installer_subtitle">Requires microG companion app to be installed</string>
<string name="microg_installer_desc">Helps you bypass App Integrity (installer only) check</string> <string name="microg_installer_desc">Helps you bypass App Integrity (installer only) check</string>
<string name="am_installer_subtitle">Full-featured open source package manager</string> <string name="am_installer_subtitle">Full-featured open source package manager</string>