fix: restart app on external storage permission grant

This commit is contained in:
Rahul Patel
2026-05-03 18:09:28 +05:30
parent 3584853bb8
commit de88411d63
2 changed files with 51 additions and 4 deletions

View File

@@ -11,6 +11,7 @@ import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.core.content.IntentCompat import androidx.core.content.IntentCompat
import com.aurora.extensions.getPackageName
import com.aurora.store.compose.composition.LocalUI import com.aurora.store.compose.composition.LocalUI
import com.aurora.store.compose.composition.UI import com.aurora.store.compose.composition.UI
import com.aurora.store.compose.navigation.NavDisplay import com.aurora.store.compose.navigation.NavDisplay
@@ -26,12 +27,21 @@ class ComposeActivity : ComponentActivity() {
enableEdgeToEdge() enableEdgeToEdge()
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// TODO: Change startDestination logic to mirror MainActivity // Ensure the classloader is set for the Screen parcelable
val startDestination = IntentCompat.getParcelableExtra( intent.setExtrasClassLoader(Screen::class.java.classLoader)
var startDestination = IntentCompat.getParcelableExtra(
intent, intent,
Screen.PARCEL_KEY, Screen.PARCEL_KEY,
Screen::class.java Screen::class.java
) ?: Screen.Blacklist ) ?: Screen.Onboarding
// If the intent contains a package name for app details,
// Override the start destination to be the app details screen for that package.
val packageName = intent.getPackageName()
if (packageName != null) {
startDestination = Screen.AppDetails(packageName)
}
val localUI = when { val localUI = when {
PackageUtil.isTv(this) -> UI.TV PackageUtil.isTv(this) -> UI.TV

View File

@@ -6,6 +6,7 @@
package com.aurora.store.compose.ui.details package com.aurora.store.compose.ui.details
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Intent
import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
@@ -19,8 +20,11 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.adaptive.WindowAdaptiveInfo import androidx.compose.material3.adaptive.WindowAdaptiveInfo
import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo
import androidx.compose.material3.adaptive.layout.AdaptStrategy import androidx.compose.material3.adaptive.layout.AdaptStrategy
@@ -34,8 +38,10 @@ import androidx.compose.material3.adaptive.navigation.rememberSupportingPaneScaf
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
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@@ -57,6 +63,7 @@ import com.aurora.extensions.toast
import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.App
import com.aurora.gplayapi.data.models.Review import com.aurora.gplayapi.data.models.Review
import com.aurora.gplayapi.data.models.datasafety.Report as DataSafetyReport import com.aurora.gplayapi.data.models.datasafety.Report as DataSafetyReport
import com.aurora.store.ComposeActivity
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.compose.composable.ContainedLoadingIndicator import com.aurora.store.compose.composable.ContainedLoadingIndicator
import com.aurora.store.compose.composable.Error import com.aurora.store.compose.composable.Error
@@ -87,11 +94,13 @@ import com.aurora.store.data.model.AppState
import com.aurora.store.data.model.PermissionType import com.aurora.store.data.model.PermissionType
import com.aurora.store.data.model.Report import com.aurora.store.data.model.Report
import com.aurora.store.data.model.Scores import com.aurora.store.data.model.Scores
import com.aurora.store.data.providers.PermissionProvider.Companion.isGranted
import com.aurora.store.data.providers.PermissionProvider.Companion.isPermittedToInstall import com.aurora.store.data.providers.PermissionProvider.Companion.isPermittedToInstall
import com.aurora.store.util.FlavouredUtil import com.aurora.store.util.FlavouredUtil
import com.aurora.store.util.PackageUtil import com.aurora.store.util.PackageUtil
import com.aurora.store.util.ShortcutManagerUtil import com.aurora.store.util.ShortcutManagerUtil
import com.aurora.store.viewmodel.details.AppDetailsViewModel import com.aurora.store.viewmodel.details.AppDetailsViewModel
import com.jakewharton.processphoenix.ProcessPhoenix
import kotlin.random.Random import kotlin.random.Random
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -244,6 +253,7 @@ private fun ScreenContentApp(
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
val shouldShowMenuOnMainPane = scaffoldNavigator val shouldShowMenuOnMainPane = scaffoldNavigator
.scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Hidden .scaffoldValue[SupportingPaneScaffoldRole.Supporting] == PaneAdaptedValue.Hidden
var showRestartDialog by remember { mutableStateOf(false) }
fun onNavigateBack() { fun onNavigateBack() {
coroutineScope.launch { coroutineScope.launch {
@@ -549,7 +559,15 @@ private fun ScreenContentApp(
is Screen.PermissionRationale -> PermissionRationaleScreen( is Screen.PermissionRationale -> PermissionRationaleScreen(
onNavigateUp = ::onNavigateBack, onNavigateUp = ::onNavigateBack,
requiredPermissions = screen.requiredPermissions, requiredPermissions = screen.requiredPermissions,
onPermissionCallback = { onInstall() } onPermissionCallback = { type ->
val isStoragePermission = type == PermissionType.EXTERNAL_STORAGE ||
type == PermissionType.STORAGE_MANAGER
if (isStoragePermission && isGranted(context, type)) {
showRestartDialog = true
} else {
onInstall()
}
}
) )
else -> {} else -> {}
@@ -565,6 +583,25 @@ private fun ScreenContentApp(
} }
} }
) )
if (showRestartDialog) {
AlertDialog(
onDismissRequest = {},
title = { Text(text = stringResource(R.string.force_restart_title)) },
text = { Text(text = stringResource(R.string.force_restart_summary)) },
confirmButton = {
TextButton(
onClick = {
val intent = Intent(context, ComposeActivity::class.java)
.putExtra("packageName", app.packageName)
ProcessPhoenix.triggerRebirth(context, intent)
}
) {
Text(text = stringResource(R.string.action_restart))
}
}
)
}
} }
@PreviewWrapper(ThemePreviewProvider::class) @PreviewWrapper(ThemePreviewProvider::class)