From 676fd8914600baf1ffa40656fd77126286f85903 Mon Sep 17 00:00:00 2001 From: Rahul Patel Date: Fri, 21 Feb 2025 23:27:41 +0530 Subject: [PATCH] OOBE: another attemp to fix issues on Android 11 & 12 --- .../data/providers/PermissionProvider.kt | 16 ++++++++++++++ .../java/com/aurora/store/util/PackageUtil.kt | 9 +------- .../view/ui/details/AppDetailsFragment.kt | 22 +++++++++++++++---- .../store/view/ui/splash/SplashFragment.kt | 7 ++++-- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt b/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt index aa0ad0e2d..8a0231081 100644 --- a/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt @@ -12,6 +12,7 @@ import android.util.Log import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.app.ActivityCompat import androidx.fragment.app.Fragment import com.aurora.extensions.checkManifestPermission import com.aurora.extensions.isDomainVerified @@ -73,7 +74,22 @@ class PermissionProvider(private val fragment: Fragment) : if (!isGranted(PermissionType.INSTALL_UNKNOWN_APPS)) { context.toast(R.string.toast_permission_installer_required) } else { + /** + * I don't know why, but for storage manager permission on Android 11 & 12, + * we need to request both permissions otherwise the permission is not granted, + * even though OS says it is granted. + */ + ActivityCompat.requestPermissions( + fragment.requireActivity(), + arrayOf( + Manifest.permission.WRITE_EXTERNAL_STORAGE + ), + 1 + ) + + // TODO: Verify & remove this after testing context.toast(R.string.toast_permission_esm_restart) + intentLauncher.launch(intent) } } else { diff --git a/app/src/main/java/com/aurora/store/util/PackageUtil.kt b/app/src/main/java/com/aurora/store/util/PackageUtil.kt index e6102a45a..970c77327 100644 --- a/app/src/main/java/com/aurora/store/util/PackageUtil.kt +++ b/app/src/main/java/com/aurora/store/util/PackageUtil.kt @@ -174,18 +174,11 @@ object PackageUtil { @RequiresApi(Build.VERSION_CODES.R) fun getStorageManagerIntent(context: Context): Intent { - var intent = Intent( + val intent = Intent( Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, Uri.parse("package:${BuildConfig.APPLICATION_ID}") ) - if (isHuawei) { - intent = Intent( - Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - Uri.parse("package:${BuildConfig.APPLICATION_ID}") - ) - } - // Check if the intent can be resolved val packageManager = context.packageManager val isIntentAvailable = packageManager.queryIntentActivities( diff --git a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt index 8197571e9..b0782e684 100644 --- a/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/details/AppDetailsFragment.kt @@ -61,6 +61,7 @@ import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.gplayapi.data.models.datasafety.EntryType import com.aurora.store.AppStreamStash import com.aurora.store.AuroraApp +import com.aurora.store.MainActivity import com.aurora.store.R import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.Event @@ -87,6 +88,7 @@ import com.aurora.store.view.epoxy.views.details.ScreenshotViewModel_ import com.aurora.store.view.ui.commons.BaseFragment import com.aurora.store.viewmodel.details.AppDetailsViewModel import com.aurora.store.viewmodel.details.DetailsClusterViewModel +import com.jakewharton.processphoenix.ProcessPhoenix import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.launchIn @@ -538,8 +540,16 @@ class AppDetailsFragment : BaseFragment() { viewModel.download(app) } else { permissionProvider.request(PermissionType.STORAGE_MANAGER) { - if (it) viewModel.download(app) else { - // TODO: Ask for permission again or redirect to Permission Manager + if (it) { + // Restart the app to ensure all permissions are granted + val intent = Intent( + requireContext(), + MainActivity::class.java + ) + // Pass the packageName so we're back to same app + intent.putExtra("packageName", app.packageName) + + ProcessPhoenix.triggerRebirth(requireContext(), intent) } } } @@ -604,9 +614,13 @@ class AppDetailsFragment : BaseFragment() { binding.layoutDetailsApp.btnSecondaryAction.isEnabled = true if (app.isInstalled) { - val isUpdatable = PackageUtil.isUpdatable(requireContext(), app.packageName, app.versionCode.toLong()) + val isUpdatable = + PackageUtil.isUpdatable(requireContext(), app.packageName, app.versionCode.toLong()) val hasValidCert = app.certificateSetList.any { - it.certificateSet in CertUtil.getEncodedCertificateHashes(requireContext(), app.packageName) + it.certificateSet in CertUtil.getEncodedCertificateHashes( + requireContext(), + app.packageName + ) } if ((isUpdatable && hasValidCert) || (isUpdatable && isExtendedUpdateEnabled)) { diff --git a/app/src/main/java/com/aurora/store/view/ui/splash/SplashFragment.kt b/app/src/main/java/com/aurora/store/view/ui/splash/SplashFragment.kt index 11d36cd68..277c0f322 100644 --- a/app/src/main/java/com/aurora/store/view/ui/splash/SplashFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/splash/SplashFragment.kt @@ -29,9 +29,9 @@ import android.os.Looper import android.util.Base64 import android.util.Log import android.view.View -import androidx.core.view.isVisible import androidx.activity.result.contract.ActivityResultContracts import androidx.core.os.bundleOf +import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -240,7 +240,8 @@ class SplashFragment : BaseFragment() { } private fun navigateToDefaultTab() { - val defaultDestination = Preferences.getInteger(requireContext(), PREFERENCE_DEFAULT_SELECTED_TAB) + val defaultDestination = + Preferences.getInteger(requireContext(), PREFERENCE_DEFAULT_SELECTED_TAB) val directions = when (requireArguments().getInt("destinationId", defaultDestination)) { R.id.updatesFragment -> { @@ -263,6 +264,8 @@ class SplashFragment : BaseFragment() { } else if (requireActivity().intent != null && requireActivity().intent.action == Intent.ACTION_SEND) { val clipData = requireActivity().intent.getStringExtra(Intent.EXTRA_TEXT) ?: "" UrlQuerySanitizer(clipData).getValue("id") ?: "" + } else if (requireActivity().intent != null && requireActivity().intent.extras != null) { + requireActivity().intent.extras?.getString("packageName") ?: "" } else { requireArguments().getString("packageName") ?: "" }