OOBE: another attemp to fix issues on Android 11 & 12
This commit is contained in:
@@ -12,6 +12,7 @@ import android.util.Log
|
|||||||
import androidx.activity.result.ActivityResult
|
import androidx.activity.result.ActivityResult
|
||||||
import androidx.activity.result.ActivityResultCallback
|
import androidx.activity.result.ActivityResultCallback
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import com.aurora.extensions.checkManifestPermission
|
import com.aurora.extensions.checkManifestPermission
|
||||||
import com.aurora.extensions.isDomainVerified
|
import com.aurora.extensions.isDomainVerified
|
||||||
@@ -73,7 +74,22 @@ class PermissionProvider(private val fragment: Fragment) :
|
|||||||
if (!isGranted(PermissionType.INSTALL_UNKNOWN_APPS)) {
|
if (!isGranted(PermissionType.INSTALL_UNKNOWN_APPS)) {
|
||||||
context.toast(R.string.toast_permission_installer_required)
|
context.toast(R.string.toast_permission_installer_required)
|
||||||
} else {
|
} 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)
|
context.toast(R.string.toast_permission_esm_restart)
|
||||||
|
|
||||||
intentLauncher.launch(intent)
|
intentLauncher.launch(intent)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -174,18 +174,11 @@ object PackageUtil {
|
|||||||
|
|
||||||
@RequiresApi(Build.VERSION_CODES.R)
|
@RequiresApi(Build.VERSION_CODES.R)
|
||||||
fun getStorageManagerIntent(context: Context): Intent {
|
fun getStorageManagerIntent(context: Context): Intent {
|
||||||
var intent = Intent(
|
val intent = Intent(
|
||||||
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
|
Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION,
|
||||||
Uri.parse("package:${BuildConfig.APPLICATION_ID}")
|
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
|
// Check if the intent can be resolved
|
||||||
val packageManager = context.packageManager
|
val packageManager = context.packageManager
|
||||||
val isIntentAvailable = packageManager.queryIntentActivities(
|
val isIntentAvailable = packageManager.queryIntentActivities(
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ import com.aurora.gplayapi.data.models.StreamCluster
|
|||||||
import com.aurora.gplayapi.data.models.datasafety.EntryType
|
import com.aurora.gplayapi.data.models.datasafety.EntryType
|
||||||
import com.aurora.store.AppStreamStash
|
import com.aurora.store.AppStreamStash
|
||||||
import com.aurora.store.AuroraApp
|
import com.aurora.store.AuroraApp
|
||||||
|
import com.aurora.store.MainActivity
|
||||||
import com.aurora.store.R
|
import com.aurora.store.R
|
||||||
import com.aurora.store.data.event.BusEvent
|
import com.aurora.store.data.event.BusEvent
|
||||||
import com.aurora.store.data.event.Event
|
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.view.ui.commons.BaseFragment
|
||||||
import com.aurora.store.viewmodel.details.AppDetailsViewModel
|
import com.aurora.store.viewmodel.details.AppDetailsViewModel
|
||||||
import com.aurora.store.viewmodel.details.DetailsClusterViewModel
|
import com.aurora.store.viewmodel.details.DetailsClusterViewModel
|
||||||
|
import com.jakewharton.processphoenix.ProcessPhoenix
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import kotlinx.coroutines.flow.filterNotNull
|
import kotlinx.coroutines.flow.filterNotNull
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
@@ -538,8 +540,16 @@ class AppDetailsFragment : BaseFragment<FragmentDetailsBinding>() {
|
|||||||
viewModel.download(app)
|
viewModel.download(app)
|
||||||
} else {
|
} else {
|
||||||
permissionProvider.request(PermissionType.STORAGE_MANAGER) {
|
permissionProvider.request(PermissionType.STORAGE_MANAGER) {
|
||||||
if (it) viewModel.download(app) else {
|
if (it) {
|
||||||
// TODO: Ask for permission again or redirect to Permission Manager
|
// 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<FragmentDetailsBinding>() {
|
|||||||
binding.layoutDetailsApp.btnSecondaryAction.isEnabled = true
|
binding.layoutDetailsApp.btnSecondaryAction.isEnabled = true
|
||||||
|
|
||||||
if (app.isInstalled) {
|
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 {
|
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)) {
|
if ((isUpdatable && hasValidCert) || (isUpdatable && isExtendedUpdateEnabled)) {
|
||||||
|
|||||||
@@ -29,9 +29,9 @@ import android.os.Looper
|
|||||||
import android.util.Base64
|
import android.util.Base64
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.core.view.isVisible
|
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.navigation.fragment.findNavController
|
import androidx.navigation.fragment.findNavController
|
||||||
@@ -240,7 +240,8 @@ class SplashFragment : BaseFragment<FragmentSplashBinding>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun navigateToDefaultTab() {
|
private fun navigateToDefaultTab() {
|
||||||
val defaultDestination = Preferences.getInteger(requireContext(), PREFERENCE_DEFAULT_SELECTED_TAB)
|
val defaultDestination =
|
||||||
|
Preferences.getInteger(requireContext(), PREFERENCE_DEFAULT_SELECTED_TAB)
|
||||||
val directions =
|
val directions =
|
||||||
when (requireArguments().getInt("destinationId", defaultDestination)) {
|
when (requireArguments().getInt("destinationId", defaultDestination)) {
|
||||||
R.id.updatesFragment -> {
|
R.id.updatesFragment -> {
|
||||||
@@ -263,6 +264,8 @@ class SplashFragment : BaseFragment<FragmentSplashBinding>() {
|
|||||||
} else if (requireActivity().intent != null && requireActivity().intent.action == Intent.ACTION_SEND) {
|
} else if (requireActivity().intent != null && requireActivity().intent.action == Intent.ACTION_SEND) {
|
||||||
val clipData = requireActivity().intent.getStringExtra(Intent.EXTRA_TEXT) ?: ""
|
val clipData = requireActivity().intent.getStringExtra(Intent.EXTRA_TEXT) ?: ""
|
||||||
UrlQuerySanitizer(clipData).getValue("id") ?: ""
|
UrlQuerySanitizer(clipData).getValue("id") ?: ""
|
||||||
|
} else if (requireActivity().intent != null && requireActivity().intent.extras != null) {
|
||||||
|
requireActivity().intent.extras?.getString("packageName") ?: ""
|
||||||
} else {
|
} else {
|
||||||
requireArguments().getString("packageName") ?: ""
|
requireArguments().getString("packageName") ?: ""
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user