Loading app/src/main/java/foundation/e/apps/MainActivity.kt +5 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.Environment import android.os.StatFs import android.os.storage.StorageManager import android.view.View import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.distinctUntilChanged Loading @@ -46,6 +47,7 @@ import foundation.e.apps.login.AuthObject import foundation.e.apps.login.LoginViewModel import foundation.e.apps.manager.database.fusedDownload.FusedDownload import foundation.e.apps.manager.workmanager.InstallWorkManager import foundation.e.apps.permission.PermissionChecker import foundation.e.apps.purchase.AppPurchaseFragmentDirections import foundation.e.apps.settings.SettingsFragment import foundation.e.apps.setup.signin.SignInViewModel Loading @@ -71,6 +73,7 @@ class MainActivity : AppCompatActivity() { private val TAG = MainActivity::class.java.simpleName private lateinit var viewModel: MainActivityViewModel @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Loading Loading @@ -230,6 +233,8 @@ class MainActivity : AppCompatActivity() { ).show(supportFragmentManager, TAG) } } PermissionChecker.run(applicationContext, supportFragmentManager) } private suspend fun observeInvalidAuth() { Loading app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt +22 −1 Original line number Diff line number Diff line Loading @@ -69,11 +69,32 @@ class InstallerService : Service() { val packageNamePackageManagerModule = intent.getStringExtra(PkgManagerModule.PACKAGE_NAME) packageName = packageName ?: packageNamePackageManagerModule postStatus(status, packageName, extra) when (status) { PackageInstaller.STATUS_PENDING_USER_ACTION -> promptUser(intent) else -> postStatus(status, packageName, extra) } stopSelf() return START_NOT_STICKY } private fun promptUser(intent: Intent) { val confirmationIntent: Intent? = intent.getParcelableExtra(Intent.EXTRA_INTENT) confirmationIntent?.let { it.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) it.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, PkgManagerModule.FAKE_STORE_PACKAGE_NAME) it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) try { startActivity(it) } catch (e: Exception) { Timber.e(e.message) } } } private fun postStatus(status: Int, packageName: String?, extra: String?) { Timber.d("postStatus: $status $packageName $extra") if (status == PackageInstaller.STATUS_SUCCESS) { Loading app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -183,7 +183,7 @@ class PkgManagerModule @Inject constructor( setInstallReason(PackageManager.INSTALL_REASON_USER) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { setRequireUserAction(SessionParams.USER_ACTION_NOT_REQUIRED) setRequireUserAction(SessionParams.USER_ACTION_REQUIRED) } } Loading app/src/main/java/foundation/e/apps/permission/PermissionChecker.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line package foundation.e.apps.permission import android.app.AlertDialog import android.app.Dialog import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle import android.os.Environment import android.provider.Settings import androidx.annotation.RequiresApi import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager object PermissionChecker { private const val TAG = "PermissionChecker" @RequiresApi(Build.VERSION_CODES.O) fun run(context: Context, supportFragmentManager: FragmentManager) { if (!context.packageManager.canRequestPackageInstalls()) { InstallSettingDialog().show(supportFragmentManager, TAG) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { ExternalManagerSettingDialog().show(supportFragmentManager, TAG) } } else { } } class InstallSettingDialog() : DialogFragment() { @RequiresApi(Build.VERSION_CODES.O) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext()) .setMessage("App Lounge requires some more permission to install packages.") .setCancelable(false) .setPositiveButton("Go to settings") { _, _ -> startActivity(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)) } .create() } class ExternalManagerSettingDialog() : DialogFragment() { @RequiresApi(Build.VERSION_CODES.R) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext()) .setMessage("App Lounge requires some more permission to access files.") .setCancelable(false) .setPositiveButton("Go to settings") { _, _ -> startActivity(Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)) } .create() } } No newline at end of file Loading
app/src/main/java/foundation/e/apps/MainActivity.kt +5 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.Environment import android.os.StatFs import android.os.storage.StorageManager import android.view.View import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.distinctUntilChanged Loading @@ -46,6 +47,7 @@ import foundation.e.apps.login.AuthObject import foundation.e.apps.login.LoginViewModel import foundation.e.apps.manager.database.fusedDownload.FusedDownload import foundation.e.apps.manager.workmanager.InstallWorkManager import foundation.e.apps.permission.PermissionChecker import foundation.e.apps.purchase.AppPurchaseFragmentDirections import foundation.e.apps.settings.SettingsFragment import foundation.e.apps.setup.signin.SignInViewModel Loading @@ -71,6 +73,7 @@ class MainActivity : AppCompatActivity() { private val TAG = MainActivity::class.java.simpleName private lateinit var viewModel: MainActivityViewModel @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Loading Loading @@ -230,6 +233,8 @@ class MainActivity : AppCompatActivity() { ).show(supportFragmentManager, TAG) } } PermissionChecker.run(applicationContext, supportFragmentManager) } private suspend fun observeInvalidAuth() { Loading
app/src/main/java/foundation/e/apps/manager/pkg/InstallerService.kt +22 −1 Original line number Diff line number Diff line Loading @@ -69,11 +69,32 @@ class InstallerService : Service() { val packageNamePackageManagerModule = intent.getStringExtra(PkgManagerModule.PACKAGE_NAME) packageName = packageName ?: packageNamePackageManagerModule postStatus(status, packageName, extra) when (status) { PackageInstaller.STATUS_PENDING_USER_ACTION -> promptUser(intent) else -> postStatus(status, packageName, extra) } stopSelf() return START_NOT_STICKY } private fun promptUser(intent: Intent) { val confirmationIntent: Intent? = intent.getParcelableExtra(Intent.EXTRA_INTENT) confirmationIntent?.let { it.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) it.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, PkgManagerModule.FAKE_STORE_PACKAGE_NAME) it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) try { startActivity(it) } catch (e: Exception) { Timber.e(e.message) } } } private fun postStatus(status: Int, packageName: String?, extra: String?) { Timber.d("postStatus: $status $packageName $extra") if (status == PackageInstaller.STATUS_SUCCESS) { Loading
app/src/main/java/foundation/e/apps/manager/pkg/PkgManagerModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -183,7 +183,7 @@ class PkgManagerModule @Inject constructor( setInstallReason(PackageManager.INSTALL_REASON_USER) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { setRequireUserAction(SessionParams.USER_ACTION_NOT_REQUIRED) setRequireUserAction(SessionParams.USER_ACTION_REQUIRED) } } Loading
app/src/main/java/foundation/e/apps/permission/PermissionChecker.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line package foundation.e.apps.permission import android.app.AlertDialog import android.app.Dialog import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle import android.os.Environment import android.provider.Settings import androidx.annotation.RequiresApi import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager object PermissionChecker { private const val TAG = "PermissionChecker" @RequiresApi(Build.VERSION_CODES.O) fun run(context: Context, supportFragmentManager: FragmentManager) { if (!context.packageManager.canRequestPackageInstalls()) { InstallSettingDialog().show(supportFragmentManager, TAG) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { ExternalManagerSettingDialog().show(supportFragmentManager, TAG) } } else { } } class InstallSettingDialog() : DialogFragment() { @RequiresApi(Build.VERSION_CODES.O) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext()) .setMessage("App Lounge requires some more permission to install packages.") .setCancelable(false) .setPositiveButton("Go to settings") { _, _ -> startActivity(Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)) } .create() } class ExternalManagerSettingDialog() : DialogFragment() { @RequiresApi(Build.VERSION_CODES.R) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog.Builder(requireContext()) .setMessage("App Lounge requires some more permission to access files.") .setCancelable(false) .setPositiveButton("Go to settings") { _, _ -> startActivity(Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION)) } .create() } } No newline at end of file