diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a791b8d70..3e13e8fc4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,7 +29,7 @@ - + @@ -56,7 +56,7 @@ + android:required="false" /> - + + @@ -124,9 +126,9 @@ @@ -151,8 +153,8 @@ + android:exported="true" + android:permission="android.permission.BIND_DEVICE_ADMIN"> diff --git a/app/src/main/java/com/aurora/extensions/Context.kt b/app/src/main/java/com/aurora/extensions/Context.kt index d33456e18..7d7b27db6 100644 --- a/app/src/main/java/com/aurora/extensions/Context.kt +++ b/app/src/main/java/com/aurora/extensions/Context.kt @@ -19,17 +19,23 @@ package com.aurora.extensions +import android.Manifest import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.verify.domain.DomainVerificationManager +import android.content.pm.verify.domain.DomainVerificationUserState import android.graphics.Color import android.net.Uri import android.os.Bundle +import android.os.Environment import android.os.PowerManager import android.util.TypedValue import android.view.LayoutInflater import androidx.browser.customtabs.CustomTabsIntent +import androidx.core.app.ActivityCompat import androidx.core.app.ActivityOptionsCompat import androidx.core.content.ContextCompat import com.aurora.Constants @@ -131,7 +137,9 @@ fun Context.accentColor(): Int { fun Context.isIgnoringBatteryOptimizations(): Boolean { return if (isMAndAbove()) { - (getSystemService(Context.POWER_SERVICE) as PowerManager).isIgnoringBatteryOptimizations(packageName) + (getSystemService(Context.POWER_SERVICE) as PowerManager).isIgnoringBatteryOptimizations( + packageName + ) } else { true } @@ -148,3 +156,26 @@ fun Context.restartApp() { exitProcess(0) } + +fun Context.checkManifestPermission(permission: String): Boolean { + return ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED +} + +fun Context.isExternalStorageAccessible(): Boolean { + return if (isRAndAbove()) { + Environment.isExternalStorageManager() + } else { + checkManifestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) + } +} + +fun Context.isDomainVerified(domain: String): Boolean { + return if (isSAndAbove()) { + val domainVerificationManager = getSystemService(DomainVerificationManager::class.java) + val userState = domainVerificationManager.getDomainVerificationUserState(packageName) + val domainMap = userState?.hostToStateMap?.filterKeys { it == domain } + domainMap?.values?.first() == DomainVerificationUserState.DOMAIN_STATE_SELECTED + } else { + true + } +} diff --git a/app/src/main/java/com/aurora/extensions/ThemeEngine.kt b/app/src/main/java/com/aurora/extensions/ThemeEngine.kt index 10e0732ec..634cfb3f1 100644 --- a/app/src/main/java/com/aurora/extensions/ThemeEngine.kt +++ b/app/src/main/java/com/aurora/extensions/ThemeEngine.kt @@ -77,7 +77,9 @@ private fun AppCompatActivity.setSystemBarConfiguration(light: Boolean) { if (isMAndAbove()) { isAppearanceLightStatusBars = light } else { + // Add a semi-transparent black color to the status bar & navigation bar window.statusBarColor = ColorUtils.setAlphaComponent(Color.BLACK, 120) + window.navigationBarColor = ColorUtils.setAlphaComponent(Color.BLACK, 120) } // Navigation bar color diff --git a/app/src/main/java/com/aurora/store/Aliases.kt b/app/src/main/java/com/aurora/store/Aliases.kt index 0e3d8b894..5dbdf03e9 100644 --- a/app/src/main/java/com/aurora/store/Aliases.kt +++ b/app/src/main/java/com/aurora/store/Aliases.kt @@ -1,5 +1,6 @@ package com.aurora.store +import androidx.activity.result.ActivityResult import com.aurora.gplayapi.data.models.Category import com.aurora.gplayapi.data.models.StreamBundle import com.aurora.gplayapi.data.models.StreamCluster @@ -9,4 +10,6 @@ import com.aurora.gplayapi.helpers.contracts.TopChartsContract typealias TopChartStash = MutableMap> typealias HomeStash = MutableMap typealias CategoryStash = MutableMap> -typealias AppStreamStash = MutableMap \ No newline at end of file +typealias AppStreamStash = MutableMap + +typealias PermissionCallback = (ActivityResult) -> Unit diff --git a/app/src/main/java/com/aurora/store/MainActivity.kt b/app/src/main/java/com/aurora/store/MainActivity.kt index 7747d8899..b7d41590b 100644 --- a/app/src/main/java/com/aurora/store/MainActivity.kt +++ b/app/src/main/java/com/aurora/store/MainActivity.kt @@ -69,9 +69,10 @@ class MainActivity : AppCompatActivity() { // This is needed thanks to OEMs breaking the MY_PACKAGE_REPLACED API MigrationReceiver.runMigrationsIfRequired(this) - applyThemeAccent() super.onCreate(savedInstanceState) + applyThemeAccent() + B = ActivityMainBinding.inflate(layoutInflater) setContentView(B.root) diff --git a/app/src/main/java/com/aurora/store/PermissionType.kt b/app/src/main/java/com/aurora/store/PermissionType.kt new file mode 100644 index 000000000..c2c1f2cc6 --- /dev/null +++ b/app/src/main/java/com/aurora/store/PermissionType.kt @@ -0,0 +1,10 @@ +package com.aurora.store + +enum class PermissionType { + EXTERNAL_STORAGE, + STORAGE_MANAGER, + INSTALL_UNKNOWN_APPS, + POST_NOTIFICATIONS, + DOZE_WHITELIST, + APP_LINKS +} diff --git a/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt b/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt index 0705a961b..aa473af6d 100644 --- a/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt +++ b/app/src/main/java/com/aurora/store/data/installer/NativeInstaller.kt @@ -70,7 +70,7 @@ class NativeInstaller @Inject constructor( intent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_ACTIVITY_NEW_TASK } else { intent = Intent(Intent.ACTION_VIEW) - intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); + intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive") intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK } diff --git a/app/src/main/java/com/aurora/store/data/model/Permission.kt b/app/src/main/java/com/aurora/store/data/model/Permission.kt index ff00f29ed..f6260b92d 100644 --- a/app/src/main/java/com/aurora/store/data/model/Permission.kt +++ b/app/src/main/java/com/aurora/store/data/model/Permission.kt @@ -19,19 +19,22 @@ package com.aurora.store.data.model +import com.aurora.store.PermissionType + data class Permission( - var id: Int, - var title: String, - var subtitle: String + val type: PermissionType, + val title: String, + val subtitle: String, + val optional: Boolean = false, ) { override fun equals(other: Any?): Boolean { return when (other) { - is Permission -> other.id == id + is Permission -> other.type == type else -> false } } override fun hashCode(): Int { - return id.hashCode() + return type.hashCode() } } diff --git a/app/src/main/java/com/aurora/store/data/providers/ApkProvider.kt b/app/src/main/java/com/aurora/store/data/providers/ApkProvider.kt index 0b0b5aa29..c131a295b 100644 --- a/app/src/main/java/com/aurora/store/data/providers/ApkProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/ApkProvider.kt @@ -21,6 +21,4 @@ package com.aurora.store.data.providers import androidx.core.content.FileProvider -class ApkProvider : FileProvider() { - -} \ No newline at end of file +class ApkProvider : FileProvider() \ No newline at end of file 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 new file mode 100644 index 000000000..a9c77c290 --- /dev/null +++ b/app/src/main/java/com/aurora/store/data/providers/PermissionProvider.kt @@ -0,0 +1,146 @@ +package com.aurora.store.data.providers + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.PowerManager +import android.provider.Settings +import android.provider.Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.fragment.app.Fragment +import com.aurora.extensions.checkManifestPermission +import com.aurora.extensions.isDomainVerified +import com.aurora.extensions.isExternalStorageAccessible +import com.aurora.extensions.isMAndAbove +import com.aurora.extensions.toast +import com.aurora.store.BuildConfig +import com.aurora.store.PermissionCallback +import com.aurora.store.PermissionType +import com.aurora.store.R +import com.aurora.store.util.Log +import com.aurora.store.util.PackageUtil + +@SuppressLint("NewApi") +class PermissionProvider : ActivityResultCallback { + private var context: Context + private var intentLauncher: ActivityResultLauncher + private var permissionLauncher: ActivityResultLauncher + + private var permissionCallback: PermissionCallback? = null + + constructor(activity: AppCompatActivity, callback: PermissionCallback? = null) { + this.context = activity + permissionCallback = callback + intentLauncher = activity.registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + this + ) + + permissionLauncher = + activity.registerForActivityResult(ActivityResultContracts.RequestPermission()) { + permissionCallback?.invoke( + ActivityResult( + if (it) Activity.RESULT_OK else Activity.RESULT_CANCELED, + null + ) + ) + } + } + + constructor(fragment: Fragment, callback: PermissionCallback? = null) { + this.context = fragment.requireContext() + permissionCallback = callback + intentLauncher = fragment.registerForActivityResult( + ActivityResultContracts.StartActivityForResult(), + this + ) + permissionLauncher = + fragment.registerForActivityResult(ActivityResultContracts.RequestPermission()) { + permissionCallback?.invoke( + ActivityResult( + if (it) Activity.RESULT_OK else Activity.RESULT_CANCELED, + null + ) + ) + } + } + + private fun knownPermissions(): Map { + return mapOf( + PermissionType.STORAGE_MANAGER to PackageUtil.getStorageManagerIntent(context), + PermissionType.INSTALL_UNKNOWN_APPS to PackageUtil.getInstallUnknownAppsIntent(), + PermissionType.DOZE_WHITELIST to Intent( + Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, + Uri.parse("package:${BuildConfig.APPLICATION_ID}") + ), + PermissionType.APP_LINKS to Intent( + ACTION_APP_OPEN_BY_DEFAULT_SETTINGS, + Uri.parse("package:${BuildConfig.APPLICATION_ID}") + ) + ) + } + + fun request(permissionType: PermissionType) { + try { + when (permissionType) { + PermissionType.EXTERNAL_STORAGE -> permissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) + PermissionType.POST_NOTIFICATIONS -> permissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + else -> { + val intent = knownPermissions()[permissionType] ?: return + + if (permissionType == PermissionType.STORAGE_MANAGER + && !isGranted(PermissionType.INSTALL_UNKNOWN_APPS) + ) { + context.toast(R.string.toast_permission_installer_required) + } else { + intentLauncher.launch(intent) + } + } + } + } catch (e: ActivityNotFoundException) { + Log.e("PermissionProvider", "Activity not found for $permissionType: ${e.message}") + } catch (e: Exception) { + Log.e("PermissionProvider", "Error requesting permission: ${e.message}") + } + } + + fun isGranted(permissionType: PermissionType): Boolean { + return when (permissionType) { + PermissionType.EXTERNAL_STORAGE, + PermissionType.STORAGE_MANAGER -> context.isExternalStorageAccessible() + + PermissionType.POST_NOTIFICATIONS -> context.checkManifestPermission(Manifest.permission.POST_NOTIFICATIONS) + PermissionType.INSTALL_UNKNOWN_APPS -> PackageUtil.canRequestPackageInstalls(context) + PermissionType.DOZE_WHITELIST -> { + if (isMAndAbove()) { + val powerManager = + context.getSystemService(Context.POWER_SERVICE) as PowerManager + powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID) + } else { + true + } + } + + PermissionType.APP_LINKS -> context.isDomainVerified("play.google.com") || context.isDomainVerified( + "market.android.com" + ) + } + } + + fun unregister() { + intentLauncher.unregister() + permissionLauncher.unregister() + } + + override fun onActivityResult(result: ActivityResult) { + permissionCallback?.invoke(result) + } +} diff --git a/app/src/main/java/com/aurora/store/data/providers/SpoofProvider.kt b/app/src/main/java/com/aurora/store/data/providers/SpoofProvider.kt index accdd5934..0c7047129 100644 --- a/app/src/main/java/com/aurora/store/data/providers/SpoofProvider.kt +++ b/app/src/main/java/com/aurora/store/data/providers/SpoofProvider.kt @@ -27,7 +27,7 @@ import java.lang.reflect.Modifier import java.util.Locale import java.util.Properties -class SpoofProvider constructor(var context: Context) { +class SpoofProvider(var context: Context) { companion object { const val LOCALE_SPOOF_ENABLED = "LOCALE_SPOOF_ENABLED" diff --git a/app/src/main/java/com/aurora/store/data/room/favourites/FavouriteDao.kt b/app/src/main/java/com/aurora/store/data/room/favourites/FavouriteDao.kt index d9aef8c9b..613562baf 100644 --- a/app/src/main/java/com/aurora/store/data/room/favourites/FavouriteDao.kt +++ b/app/src/main/java/com/aurora/store/data/room/favourites/FavouriteDao.kt @@ -1,6 +1,6 @@ -package com.aurora.store.data.room.favourites; +package com.aurora.store.data.room.favourites -import androidx.room.Dao; +import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query 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 bd2766f7c..9a8ce77b0 100644 --- a/app/src/main/java/com/aurora/store/util/PackageUtil.kt +++ b/app/src/main/java/com/aurora/store/util/PackageUtil.kt @@ -125,13 +125,46 @@ object PackageUtil { @RequiresApi(Build.VERSION_CODES.R) fun getStorageManagerIntent(context: Context): Intent { - return if (isTv(context)) { + val intent = Intent( + Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, + Uri.parse("package:${BuildConfig.APPLICATION_ID}") + ) + + // Check if the intent can be resolved + val packageManager = context.packageManager + val isIntentAvailable = packageManager.queryIntentActivities( + intent, + PackageManager.MATCH_DEFAULT_ONLY + ).isNotEmpty() + + return if (isIntentAvailable) { + intent + } else { + Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) + } + } + + fun getInstallUnknownAppsIntent(): Intent { + return if (isOAndAbove()) { Intent( - Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, + Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, Uri.parse("package:${BuildConfig.APPLICATION_ID}") ) } else { - Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) + Intent(Settings.ACTION_SECURITY_SETTINGS) + } + } + + fun canRequestPackageInstalls(context: Context): Boolean { + return if (isOAndAbove()) { + context.packageManager.canRequestPackageInstalls() + } else { + val secureResult = Settings.Secure.getInt( + context.contentResolver, + Settings.Secure.INSTALL_NON_MARKET_APPS, 0 + ) + + return secureResult == 1 } } @@ -222,7 +255,8 @@ object PackageUtil { if (isAuroraOnlyUpdateEnabled) { packageInfoList = packageInfoList .filter { - val packageInstaller = packageManager.getInstallerPackageNameCompat(it.packageName) + val packageInstaller = + packageManager.getInstallerPackageNameCompat(it.packageName) listOf( "com.aurora.store", "com.aurora.store.debug", diff --git a/app/src/main/java/com/aurora/store/util/PermissionUtil.kt b/app/src/main/java/com/aurora/store/util/PermissionUtil.kt deleted file mode 100644 index c42c156fd..000000000 --- a/app/src/main/java/com/aurora/store/util/PermissionUtil.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.aurora.store.util - -import android.Manifest -import android.content.Context -import android.content.pm.PackageManager -import androidx.core.app.ActivityCompat - -fun isExternalStorageAccessible(context: Context): Boolean { - return ActivityCompat.checkSelfPermission( - context, - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) == PackageManager.PERMISSION_GRANTED -} \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt index 76af65422..eabd6f2ad 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/ActionHeaderLayout.kt @@ -51,19 +51,30 @@ class ActionHeaderLayout : RelativeLayout { binding = ViewActionHeaderBinding.bind(view) val typedArray = context.obtainStyledAttributes(attrs, R.styleable.ActionHeaderLayout) - val textPrimary = typedArray.getString(R.styleable.ActionHeaderLayout_headerTitle) + val textTitle = typedArray.getString(R.styleable.ActionHeaderLayout_headerTitle) + val textSubtitle = typedArray.getString(R.styleable.ActionHeaderLayout_headerSubtitle) typedArray.recycle() - textPrimary?.let { + textTitle?.let { binding.txtTitle.text = it } + + textSubtitle?.let { + binding.txtSubtitle.visibility = View.VISIBLE + binding.txtSubtitle.text = it + } } - fun setHeader(header: String?) { + fun setTitle(header: String?) { binding.txtTitle.text = header } + fun setSubTitle(subHeader: String?) { + binding.txtSubtitle.visibility = View.VISIBLE + binding.txtSubtitle.text = subHeader + } + fun addClickListener(onclickListener: OnClickListener?) { binding.imgAction.visibility = View.VISIBLE binding.imgAction.setOnClickListener(onclickListener) diff --git a/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt b/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt index b9263fd41..0135666a3 100644 --- a/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt +++ b/app/src/main/java/com/aurora/store/view/custom/layouts/button/ActionButton.kt @@ -66,20 +66,6 @@ class ActionButton : RelativeLayout { R.drawable.ic_check ) - val stateBackground = - when (typedArray.getString(R.styleable.ActionButton_btnActionBackground)) { - "0" -> R.drawable.bg_state_outline - "1" -> R.drawable.bg_state_outline_rounded - "2" -> R.drawable.bg_state_flat - "3" -> R.drawable.bg_state_flat_rounded - "4" -> null - else -> null - } - - stateBackground?.let { - binding.root.background = ContextCompat.getDrawable(context, it) - } - val stateColor = ContextCompat.getColor(context, btnTxtColor) binding.btn.text = btnTxt diff --git a/app/src/main/java/com/aurora/store/view/custom/preference/AuroraListPreference.kt b/app/src/main/java/com/aurora/store/view/custom/preference/AuroraListPreference.kt index f18513541..263e32ffa 100644 --- a/app/src/main/java/com/aurora/store/view/custom/preference/AuroraListPreference.kt +++ b/app/src/main/java/com/aurora/store/view/custom/preference/AuroraListPreference.kt @@ -25,32 +25,24 @@ import androidx.preference.ListPreference class AuroraListPreference : ListPreference { - constructor(context: Context) : super(context) { + constructor(context: Context) : super(context) - } - - constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { - - } + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( context, attrs, defStyleAttr - ) { - - } + ) constructor( context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int - ) : super(context, attrs, defStyleAttr, defStyleRes) { + ) : super(context, attrs, defStyleAttr, defStyleRes) - } - - override fun getPersistedString(defaultReturnValue: String?): String? { + override fun getPersistedString(defaultReturnValue: String?): String { return getPersistedInt(defaultReturnValue?.toInt() ?: -1).toString() } diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/TextDividerView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/TextDividerView.kt new file mode 100644 index 000000000..1317b5465 --- /dev/null +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/TextDividerView.kt @@ -0,0 +1,42 @@ +/* + * Aurora Store + * Copyright (C) 2021, Rahul Kumar Patel + * + * Aurora Store is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Aurora Store is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Aurora Store. If not, see . + * + */ + +package com.aurora.store.view.epoxy.views + +import android.content.Context +import android.util.AttributeSet +import com.airbnb.epoxy.ModelProp +import com.airbnb.epoxy.ModelView +import com.aurora.store.databinding.ViewTextDividerBinding + +@ModelView( + autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT, + baseModelClass = BaseModel::class +) +class TextDividerView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : BaseView(context, attrs, defStyleAttr) { + + @ModelProp + fun title(title: String) { + binding.txtTitle.text = title + } +} diff --git a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt index 215a69f96..cb66206b9 100644 --- a/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt +++ b/app/src/main/java/com/aurora/store/view/epoxy/views/app/AppUpdateView.kt @@ -84,14 +84,14 @@ class AppUpdateView @JvmOverloads constructor( context.getString(R.string.details_changelog_unavailable) binding.headerIndicator.setOnClickListener { - if (binding.txtChangelog.isVisible) { + if (binding.cardChangelog.isVisible) { binding.headerIndicator.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_down) - binding.txtChangelog.visibility = View.GONE + binding.cardChangelog.visibility = View.GONE } else { binding.headerIndicator.icon = ContextCompat.getDrawable(context, R.drawable.ic_arrow_up) - binding.txtChangelog.visibility = View.VISIBLE + binding.cardChangelog.visibility = View.VISIBLE } } } 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 32a8883bc..c32818dd2 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 @@ -20,19 +20,15 @@ package com.aurora.store.view.ui.details -import android.Manifest import android.content.ActivityNotFoundException import android.content.Intent -import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle -import android.os.Environment import android.provider.Settings import android.view.View import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.Toast -import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.core.text.HtmlCompat import androidx.fragment.app.activityViewModels @@ -46,7 +42,6 @@ import com.aurora.Constants.EXODUS_SUBMIT_PAGE import com.aurora.extensions.browse import com.aurora.extensions.getString import com.aurora.extensions.hide -import com.aurora.extensions.isRAndAbove import com.aurora.extensions.runOnUiThread import com.aurora.extensions.share import com.aurora.extensions.show @@ -57,6 +52,7 @@ import com.aurora.gplayapi.data.models.StreamBundle import com.aurora.gplayapi.data.models.StreamCluster import com.aurora.store.AppStreamStash import com.aurora.store.AuroraApp +import com.aurora.store.PermissionType import com.aurora.store.R import com.aurora.store.data.event.BusEvent import com.aurora.store.data.event.Event @@ -67,6 +63,7 @@ import com.aurora.store.data.model.State import com.aurora.store.data.model.ViewState import com.aurora.store.data.model.ViewState.Loading.getDataAs import com.aurora.store.data.providers.AuthProvider +import com.aurora.store.data.providers.PermissionProvider import com.aurora.store.databinding.FragmentDetailsBinding import com.aurora.store.util.CertUtil import com.aurora.store.util.CommonUtil @@ -103,26 +100,9 @@ class AppDetailsFragment : BaseFragment() { @Inject lateinit var authProvider: AuthProvider - private lateinit var bottomSheetBehavior: BottomSheetBehavior - private val startForStorageManagerResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (isRAndAbove() && Environment.isExternalStorageManager()) { - viewModel.download(app) - } else { - flip(0) - toast(R.string.permissions_denied) - } - } - private val startForPermissions = - registerForActivityResult(ActivityResultContracts.RequestPermission()) { - if (it) { - viewModel.download(app) - } else { - flip(0) - toast(R.string.permissions_denied) - } - } + private lateinit var permissionProvider: PermissionProvider + private lateinit var bottomSheetBehavior: BottomSheetBehavior private lateinit var app: App @@ -171,9 +151,9 @@ class AppDetailsFragment : BaseFragment() { findNavController().navigate( AppDetailsFragmentDirections.actionAppDetailsFragmentToInstallErrorDialogSheet( app, - event.packageName ?: "", - event.error ?: "", - event.extra ?: "" + event.packageName, + event.error, + event.extra ) ) } @@ -192,6 +172,11 @@ class AppDetailsFragment : BaseFragment() { } } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + permissionProvider = PermissionProvider(this) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -378,6 +363,11 @@ class AppDetailsFragment : BaseFragment() { super.onResume() } + override fun onDestroy() { + permissionProvider.unregister() + super.onDestroy() + } + private fun attachActions() { flip(0) checkAndSetupInstall() @@ -560,24 +550,10 @@ class AppDetailsFragment : BaseFragment() { updateActionState(State.PROGRESS) if (PathUtil.needsStorageManagerPerm(app.fileList)) { - if (isRAndAbove()) { - if (!Environment.isExternalStorageManager()) { - startForStorageManagerResult.launch( - PackageUtil.getStorageManagerIntent(requireContext()) - ) - } else { - viewModel.download(app) - } + if (permissionProvider.isGranted(PermissionType.STORAGE_MANAGER)) { + viewModel.download(app) } else { - if (ContextCompat.checkSelfPermission( - requireContext(), - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) == PackageManager.PERMISSION_GRANTED - ) { - viewModel.download(app) - } else { - startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) - } + permissionProvider.request(PermissionType.STORAGE_MANAGER) } } else { viewModel.download(app) @@ -656,7 +632,9 @@ class AppDetailsFragment : BaseFragment() { } btn.addOnClickListener { - if (authProvider.isAnonymous && !app.isFree) { + if (!permissionProvider.isGranted(PermissionType.INSTALL_UNKNOWN_APPS)) { + permissionProvider.request(PermissionType.INSTALL_UNKNOWN_APPS) + } else if (authProvider.isAnonymous && !app.isFree) { toast(R.string.toast_purchase_blocked) } else if (app.versionCode == 0) { toast(R.string.toast_app_unavailable) @@ -665,6 +643,7 @@ class AppDetailsFragment : BaseFragment() { startDownload() } } + if (uninstallActionEnabled) { binding.layoutDetailsToolbar.toolbar.invalidateMenu() } @@ -952,7 +931,7 @@ class AppDetailsFragment : BaseFragment() { ) } } - txtPermissionCount.text = ("${app.permissions.size} permissions") + headerPermission.setSubTitle(("${app.permissions.size} permissions")) } } @@ -960,10 +939,10 @@ class AppDetailsFragment : BaseFragment() { binding.layoutDetailsBeta.apply { if (isSubscribed) { btnBetaAction.text = getString(R.string.action_leave) - txtBetaTitle.text = getString(R.string.details_beta_subscribed) + headerRatingReviews.setSubTitle(getString(R.string.details_beta_subscribed)) } else { btnBetaAction.text = getString(R.string.action_join) - txtBetaTitle.text = getString(R.string.details_beta_available) + headerRatingReviews.setSubTitle(getString(R.string.details_beta_available)) } } } diff --git a/app/src/main/java/com/aurora/store/view/ui/onboarding/AppLinksFragment.kt b/app/src/main/java/com/aurora/store/view/ui/onboarding/AppLinksFragment.kt index e1248cefe..13bbc6cf8 100644 --- a/app/src/main/java/com/aurora/store/view/ui/onboarding/AppLinksFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/onboarding/AppLinksFragment.kt @@ -1,108 +1,15 @@ package com.aurora.store.view.ui.onboarding -import android.content.Intent -import android.content.pm.verify.domain.DomainVerificationManager -import android.content.pm.verify.domain.DomainVerificationUserState -import android.net.Uri import android.os.Bundle -import android.provider.Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS -import android.util.Log import android.view.View -import androidx.activity.result.contract.ActivityResultContracts -import com.aurora.extensions.isSAndAbove -import com.aurora.extensions.toast -import com.aurora.store.R import com.aurora.store.databinding.FragmentAppLinksBinding import com.aurora.store.view.ui.commons.BaseFragment -import com.google.android.material.button.MaterialButton import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class AppLinksFragment : BaseFragment() { - private val TAG = AppLinksFragment::class.java.simpleName - private val playStoreDomain = "play.google.com" - private val marketDomain = "market.android.com" - - // AppLink buttons - private lateinit var buttons: Map - - private val startForResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (isSAndAbove() && buttons.keys.any { domainVerified(it) }) { - toast(R.string.app_link_enabled) - } - updateButtonState() - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - - buttons = mapOf( - playStoreDomain to binding.playStoreButton, - marketDomain to binding.marketButton, - ) - - updateButtonState() - if (isSAndAbove()) { - buttons.values.forEach { - it.setOnClickListener { - try { - val intent = Intent( - ACTION_APP_OPEN_BY_DEFAULT_SETTINGS, - Uri.parse("package:${view.context.packageName}") - ) - startForResult.launch(intent) - } catch (exception: Exception) { - Log.e(TAG, "Failed to open app links screen", exception) - toast(R.string.failed_app_link) - } - } - } - } } - - override fun onDestroyView() { - buttons = emptyMap() - super.onDestroyView() - } - - private fun updateButtonState() { - if (isSAndAbove()) { - buttons.forEach { (domain, button) -> - button.apply { - text = if (domainVerified(domain)) { - getString(R.string.action_enabled) - } else { - getString(R.string.action_enable) - } - isEnabled = !domainVerified(domain) - } - } - } else { - buttons.forEach { (_, button) -> - button.apply { - text = getString(R.string.action_enabled) - isEnabled = false - } - } - } - } - - private fun domainVerified(domain: String): Boolean { - return if (isSAndAbove()) { - val domainVerificationManager = requireContext().getSystemService( - DomainVerificationManager::class.java - ) - val userState = domainVerificationManager.getDomainVerificationUserState( - requireContext().packageName - ) - - val domainMap = userState?.hostToStateMap?.filterKeys { it == domain } - domainMap?.values?.first() == DomainVerificationUserState.DOMAIN_STATE_SELECTED - } else { - true - } - } - } diff --git a/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingFragment.kt b/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingFragment.kt index d69034c90..322b8b189 100644 --- a/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingFragment.kt @@ -76,7 +76,7 @@ class OnboardingFragment : BaseFragment() { } override fun getItemCount(): Int { - return 3 + return 2 } } @@ -122,9 +122,9 @@ class OnboardingFragment : BaseFragment() { fun refreshButtonState() { binding.btnBackward.isEnabled = lastPosition != 0 - binding.btnForward.isEnabled = lastPosition != 2 + binding.btnForward.isEnabled = lastPosition != 1 - if (lastPosition == 2) { + if (lastPosition == 1) { binding.btnForward.text = getString(R.string.action_finish) binding.btnForward.isEnabled = true binding.btnForward.setOnClickListener { finishOnboarding() } @@ -177,7 +177,10 @@ class OnboardingFragment : BaseFragment() { } private fun setupAutoUpdates() { - save(PREFERENCE_UPDATES_AUTO, if (requireContext().isIgnoringBatteryOptimizations()) 2 else 1) + save( + PREFERENCE_UPDATES_AUTO, + if (requireContext().isIgnoringBatteryOptimizations()) 2 else 1 + ) UpdateWorker.scheduleAutomatedCheck(requireContext()) } } diff --git a/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt index 638343fac..3780c099e 100644 --- a/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/onboarding/PermissionsFragment.kt @@ -20,206 +20,148 @@ package com.aurora.store.view.ui.onboarding -import android.Manifest -import android.content.Context -import android.content.Intent -import android.content.pm.PackageManager -import android.net.Uri import android.os.Bundle -import android.os.Environment -import android.os.PowerManager -import android.provider.Settings import android.view.View -import androidx.activity.result.contract.ActivityResultContracts -import androidx.core.app.ActivityCompat import com.aurora.extensions.isMAndAbove import com.aurora.extensions.isOAndAbove import com.aurora.extensions.isRAndAbove +import com.aurora.extensions.isSAndAbove import com.aurora.extensions.isTAndAbove -import com.aurora.extensions.toast -import com.aurora.store.BuildConfig +import com.aurora.store.PermissionType import com.aurora.store.R import com.aurora.store.data.model.Permission +import com.aurora.store.data.providers.PermissionProvider import com.aurora.store.databinding.FragmentOnboardingPermissionsBinding -import com.aurora.store.util.PackageUtil -import com.aurora.store.util.isExternalStorageAccessible +import com.aurora.store.view.epoxy.views.TextDividerViewModel_ import com.aurora.store.view.epoxy.views.preference.PermissionViewModel_ import com.aurora.store.view.ui.commons.BaseFragment import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class PermissionsFragment : BaseFragment() { + private lateinit var permissionProvider: PermissionProvider - private val startForDozeResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - context?.let { - val powerManager = it.getSystemService(Context.POWER_SERVICE) as PowerManager - if (isMAndAbove() && powerManager.isIgnoringBatteryOptimizations(it.packageName)) { - toast(R.string.toast_permission_granted) - binding.epoxyRecycler.requestModelBuild() - } - } - } - private val startForPackageManagerResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (isOAndAbove() && requireContext().packageManager.canRequestPackageInstalls()) { - toast(R.string.toast_permission_granted) - binding.epoxyRecycler.requestModelBuild() - } - } - private val startForStorageManagerResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (isRAndAbove() && Environment.isExternalStorageManager()) { - toast(R.string.toast_permission_granted) - binding.epoxyRecycler.requestModelBuild() - } - } - private val startForPermissions = - registerForActivityResult(ActivityResultContracts.RequestPermission()) { - if (it) { - toast(R.string.toast_permission_granted) - binding.epoxyRecycler.requestModelBuild() - } else { - toast(R.string.permissions_denied) - } - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + permissionProvider = PermissionProvider(this) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + updateController() + } - // RecyclerView - val installerList = mutableListOf( + override fun onResume() { + super.onResume() + updateController() + } + + override fun onDestroy() { + permissionProvider.unregister() + super.onDestroy() + } + + private fun permissionList(): List { + val permissions = mutableListOf( Permission( - 2, + PermissionType.INSTALL_UNKNOWN_APPS, getString(R.string.onboarding_permission_installer), - getString(R.string.onboarding_permission_installer_desc) + if (isOAndAbove()) { + getString(R.string.onboarding_permission_installer_desc) + } else { + getString(R.string.onboarding_permission_installer_legacy_desc) + } ) ) - if (isMAndAbove()) { - installerList.add( - Permission( - 4, - getString(R.string.onboarding_permission_doze), - getString(R.string.onboarding_permission_doze_desc) - ) - ) - } - if (isRAndAbove()) { - installerList.add( + permissions.add( Permission( - 1, + PermissionType.STORAGE_MANAGER, getString(R.string.onboarding_permission_esm), - getString(R.string.onboarding_permission_esa_desc) + getString(R.string.onboarding_permission_esa_desc), + false ) ) } else { - installerList.add( + permissions.add( Permission( - 0, + PermissionType.EXTERNAL_STORAGE, getString(R.string.onboarding_permission_esa), - getString(R.string.onboarding_permission_esa_desc) + getString(R.string.onboarding_permission_esa_desc), + false ) ) } - if (isTAndAbove()) { - installerList.add( - Permission( - 3, - getString(R.string.onboarding_permission_notifications), - getString(R.string.onboarding_permission_notifications_desc) - ) - ) - } - - binding.epoxyRecycler.withModels { - val dozeDisabled = if (isMAndAbove()) { - val powerManager = context?.getSystemService(Context.POWER_SERVICE) as PowerManager - powerManager.isIgnoringBatteryOptimizations(requireContext().packageName) - } else { - true - } - val writeExternalStorage = - if (!isRAndAbove()) isExternalStorageAccessible(requireContext()) else true - val postNotifications = if (isTAndAbove()) ActivityCompat.checkSelfPermission( - requireContext(), - Manifest.permission.POST_NOTIFICATIONS - ) == PackageManager.PERMISSION_GRANTED else true - val storageManager = if (isRAndAbove()) Environment.isExternalStorageManager() else true - val canInstallPackages = if (isOAndAbove()) { - requireContext().packageManager.canRequestPackageInstalls() - } else { - true - } - - setFilterDuplicates(true) - installerList.forEach { - add( - PermissionViewModel_() - .id(it.id) - .permission(it) - .isGranted( - when (it.id) { - 0 -> writeExternalStorage - 1 -> storageManager - 2 -> canInstallPackages - 3 -> postNotifications - 4 -> dozeDisabled - else -> false - } - ) - .click { _ -> - when (it.id) { - 0 -> checkStorageAccessPermission() - 1 -> requestStorageManagerPermission() - 2 -> requestPackageManagerPermission() - 3 -> checkPostNotificationsPermission() - 4 -> requestDozePermission() - } - } - ) - } - } - } - - private fun requestDozePermission() { if (isMAndAbove()) { - val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { - data = Uri.parse("package:${requireContext().packageName}") - } - startForDozeResult.launch(intent) - } - } - - private fun checkStorageAccessPermission() { - startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) - } - - private fun checkPostNotificationsPermission() { - if (isTAndAbove()) { - startForPermissions.launch(Manifest.permission.POST_NOTIFICATIONS) - } - } - - private fun requestStorageManagerPermission() { - if (isRAndAbove()) { - startForStorageManagerResult.launch( - PackageUtil.getStorageManagerIntent(requireContext()) - ) - } - } - - private fun requestPackageManagerPermission() { - if (isOAndAbove()) { - startForPackageManagerResult.launch( - Intent( - Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, - Uri.parse("package:${BuildConfig.APPLICATION_ID}") + permissions.add( + Permission( + PermissionType.DOZE_WHITELIST, + getString(R.string.onboarding_permission_doze), + getString(R.string.onboarding_permission_doze_desc), + true ) ) } + + if (isTAndAbove()) { + permissions.add( + Permission( + PermissionType.POST_NOTIFICATIONS, + getString(R.string.onboarding_permission_notifications), + getString(R.string.onboarding_permission_notifications_desc), + true + ) + ) + } + + if (isSAndAbove()) { + permissions.add( + Permission( + PermissionType.APP_LINKS, + "App Links", + "Enable Aurora Store to open links from the Play Store", + optional = true + ), + ) + } + + return permissions } + private fun updateController() { + binding.epoxyRecycler.withModels { + setFilterDuplicates(true) + + add( + TextDividerViewModel_() + .id("required_divider") + .title(getString(R.string.item_required)) + ) + + permissionList() + .filterNot { it.optional } + .forEach { add(renderPermissionView(it)) } + + val optionalPermissions = permissionList().filter { it.optional } + if (optionalPermissions.isNotEmpty()) { + add( + TextDividerViewModel_() + .id("optional_divider") + .title(getString(R.string.item_optional)) + ) + + optionalPermissions.forEach { add(renderPermissionView(it)) } + } + } + } + + private fun renderPermissionView(permission: Permission): PermissionViewModel_ { + return PermissionViewModel_() + .id(permission.type.name) + .permission(permission) + .isGranted(permissionProvider.isGranted(permission.type)) + .click { _ -> permissionProvider.request(permission.type) } + } } diff --git a/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt b/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt index 4f162b222..f425e1d81 100644 --- a/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/search/SearchResultsFragment.kt @@ -30,6 +30,7 @@ import android.view.inputmethod.EditorInfo import android.widget.TextView import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import com.aurora.extensions.hideKeyboard import com.aurora.extensions.showKeyboard import com.aurora.gplayapi.data.models.App import com.aurora.gplayapi.data.models.SearchBundle @@ -182,6 +183,7 @@ class SearchResultsFragment : BaseFragment(), .id(app.id) .app(app) .click(View.OnClickListener { + searchView.hideKeyboard() openDetailsFragment(app.packageName, app) }) ) diff --git a/app/src/main/java/com/aurora/store/view/ui/search/SearchSuggestionFragment.kt b/app/src/main/java/com/aurora/store/view/ui/search/SearchSuggestionFragment.kt index 1645cea7f..1db829e36 100644 --- a/app/src/main/java/com/aurora/store/view/ui/search/SearchSuggestionFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/search/SearchSuggestionFragment.kt @@ -28,6 +28,7 @@ import android.view.inputmethod.EditorInfo import android.widget.TextView import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController +import com.aurora.extensions.hideKeyboard import com.aurora.extensions.showKeyboard import com.aurora.gplayapi.SearchSuggestEntry import com.aurora.store.R @@ -54,6 +55,7 @@ class SearchSuggestionFragment : BaseFragment() binding.layoutToolbarSearch.apply { searchView = inputSearch imgActionPrimary.setOnClickListener { + searchView.hideKeyboard() findNavController().navigateUp() } imgActionSecondary.setOnClickListener { @@ -91,6 +93,7 @@ class SearchSuggestionFragment : BaseFragment() updateQuery(it.title) } .click { _ -> + searchView.hideKeyboard() search(it.title) } ) @@ -124,6 +127,7 @@ class SearchSuggestionFragment : BaseFragment() ) { query = searchView.text.toString() if (query.isNotEmpty()) { + searchView.hideKeyboard() search(query) return@setOnEditorActionListener true } diff --git a/app/src/main/java/com/aurora/store/view/ui/sheets/DozeWarningSheet.kt b/app/src/main/java/com/aurora/store/view/ui/sheets/DozeWarningSheet.kt index 568f2c414..2b756b852 100644 --- a/app/src/main/java/com/aurora/store/view/ui/sheets/DozeWarningSheet.kt +++ b/app/src/main/java/com/aurora/store/view/ui/sheets/DozeWarningSheet.kt @@ -1,16 +1,13 @@ package com.aurora.store.view.ui.sheets -import android.content.Intent -import android.net.Uri import android.os.Bundle -import android.provider.Settings import android.view.View -import androidx.activity.result.contract.ActivityResultContracts import androidx.navigation.fragment.navArgs import com.aurora.extensions.isIgnoringBatteryOptimizations -import com.aurora.extensions.isMAndAbove import com.aurora.extensions.toast +import com.aurora.store.PermissionType import com.aurora.store.R +import com.aurora.store.data.providers.PermissionProvider import com.aurora.store.data.work.UpdateWorker import com.aurora.store.databinding.SheetDozeWarningBinding import com.aurora.store.util.Preferences.PREFERENCE_UPDATES_AUTO @@ -20,34 +17,31 @@ class DozeWarningSheet : BaseDialogSheet() { private val args: DozeWarningSheetArgs by navArgs() - private val startForDozeResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - context?.let { - if (it.isIgnoringBatteryOptimizations()) { - if (args.enableAutoUpdate) { - requireContext().save(PREFERENCE_UPDATES_AUTO, 2) - UpdateWorker.scheduleAutomatedCheck(requireContext()) - } - toast(R.string.toast_permission_granted) - activity?.recreate() - } else { - toast(R.string.permissions_denied) - } - dismissAllowingStateLoss() - } - } + private lateinit var permissionProvider: PermissionProvider override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.btnSecondary.setOnClickListener { dismissAllowingStateLoss() } - binding.btnPrimary.setOnClickListener { - if (isMAndAbove()) { - val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { - data = Uri.parse("package:${requireContext().packageName}") + permissionProvider = PermissionProvider(this) { + if (requireContext().isIgnoringBatteryOptimizations()) { + if (args.enableAutoUpdate) { + requireContext().save(PREFERENCE_UPDATES_AUTO, 2) + UpdateWorker.scheduleAutomatedCheck(requireContext()) } - startForDozeResult.launch(intent) + toast(R.string.toast_permission_granted) + activity?.recreate() + } else { + toast(R.string.permissions_denied) } + dismissAllowingStateLoss() } + + binding.btnSecondary.setOnClickListener { dismissAllowingStateLoss() } + binding.btnPrimary.setOnClickListener { permissionProvider.request(PermissionType.DOZE_WHITELIST) } + } + + override fun onDestroy() { + permissionProvider.unregister() + super.onDestroy() } } diff --git a/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt b/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt index 98200052f..5779e25ea 100644 --- a/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/updates/UpdatesFragment.kt @@ -19,27 +19,21 @@ package com.aurora.store.view.ui.updates -import android.Manifest -import android.content.pm.PackageManager import android.os.Bundle -import android.os.Environment import android.view.View -import androidx.activity.result.contract.ActivityResultContracts -import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import com.aurora.Constants import com.aurora.extensions.browse -import com.aurora.extensions.isRAndAbove -import com.aurora.extensions.toast import com.aurora.store.MobileNavigationDirections +import com.aurora.store.PermissionType import com.aurora.store.R import com.aurora.store.data.model.MinimalApp +import com.aurora.store.data.providers.PermissionProvider import com.aurora.store.data.room.download.Download import com.aurora.store.data.room.update.Update import com.aurora.store.databinding.FragmentUpdatesBinding -import com.aurora.store.util.PackageUtil import com.aurora.store.util.PathUtil import com.aurora.store.view.epoxy.views.UpdateHeaderViewModel_ import com.aurora.store.view.epoxy.views.app.AppUpdateViewModel_ @@ -55,23 +49,15 @@ import kotlinx.coroutines.launch @AndroidEntryPoint class UpdatesFragment : BaseFragment() { + private lateinit var permissionProvider: PermissionProvider private lateinit var update: Update private val viewModel: UpdatesViewModel by viewModels() - private val startForStorageManagerResult = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - if (isRAndAbove() && Environment.isExternalStorageManager()) { - viewModel.download(update) - } else { - toast(R.string.permissions_denied) - } - } - - private val startForPermissions = - registerForActivityResult(ActivityResultContracts.RequestPermission()) { perm -> - if (perm) viewModel.download(update) else toast(R.string.permissions_denied) - } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + permissionProvider = PermissionProvider(this) + } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -109,8 +95,6 @@ class UpdatesFragment : BaseFragment() { viewModel.fetchingUpdates.collect { binding.swipeRefreshLayout.isRefreshing = it if (it && viewModel.updates.value.isNullOrEmpty()) { - updateController(null) - } else { updateController(emptyMap()) } } @@ -125,6 +109,11 @@ class UpdatesFragment : BaseFragment() { } } + override fun onDestroy() { + permissionProvider.unregister() + super.onDestroy() + } + private fun updateController(appList: Map?) { binding.recycler.withModels { setFilterDuplicates(true) @@ -205,24 +194,10 @@ class UpdatesFragment : BaseFragment() { viewModel.updateAllEnqueued = updateAll if (PathUtil.needsStorageManagerPerm(update.fileList)) { - if (isRAndAbove()) { - if (!Environment.isExternalStorageManager()) { - startForStorageManagerResult.launch( - PackageUtil.getStorageManagerIntent(requireContext()) - ) - } else { - viewModel.download(update) - } + if (permissionProvider.isGranted(PermissionType.STORAGE_MANAGER)) { + viewModel.download(update) } else { - if (ContextCompat.checkSelfPermission( - requireContext(), - Manifest.permission.WRITE_EXTERNAL_STORAGE - ) == PackageManager.PERMISSION_GRANTED - ) { - viewModel.download(update) - } else { - startForPermissions.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) - } + permissionProvider.request(PermissionType.STORAGE_MANAGER) } } else { viewModel.download(update) diff --git a/app/src/main/res/color/chip_stroke_selector.xml b/app/src/main/res/color/chip_stroke_selector.xml deleted file mode 100644 index 3c20a1261..000000000 --- a/app/src/main/res/color/chip_stroke_selector.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/chip_surface_selector.xml b/app/src/main/res/color/chip_surface_selector.xml deleted file mode 100644 index ac3d3d5f6..000000000 --- a/app/src/main/res/color/chip_surface_selector.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/chip_txt_selector.xml b/app/src/main/res/color/chip_txt_selector.xml deleted file mode 100644 index 672bff308..000000000 --- a/app/src/main/res/color/chip_txt_selector.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/color/preference_material_switch_color.xml b/app/src/main/res/color/preference_material_switch_color.xml index 21f561698..a1c1ce825 100644 --- a/app/src/main/res/color/preference_material_switch_color.xml +++ b/app/src/main/res/color/preference_material_switch_color.xml @@ -1,5 +1,5 @@ - + diff --git a/app/src/main/res/drawable-v24/bg_outlined_rounded.xml b/app/src/main/res/drawable-v24/bg_outlined_rounded.xml deleted file mode 100644 index 18a82ccd1..000000000 --- a/app/src/main/res/drawable-v24/bg_outlined_rounded.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/bg_progressbar.xml b/app/src/main/res/drawable-v24/bg_progressbar.xml deleted file mode 100644 index 836dd351b..000000000 --- a/app/src/main/res/drawable-v24/bg_progressbar.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_gradient_linear.xml b/app/src/main/res/drawable/bg_gradient_linear.xml deleted file mode 100644 index 08e67c70f..000000000 --- a/app/src/main/res/drawable/bg_gradient_linear.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_outlined_padded.xml b/app/src/main/res/drawable/bg_outlined_padded.xml deleted file mode 100644 index 5b14e0853..000000000 --- a/app/src/main/res/drawable/bg_outlined_padded.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_outlined_rounded.xml b/app/src/main/res/drawable/bg_outlined_rounded.xml deleted file mode 100644 index 18a82ccd1..000000000 --- a/app/src/main/res/drawable/bg_outlined_rounded.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_progressbar.xml b/app/src/main/res/drawable/bg_progressbar.xml deleted file mode 100644 index 8cfaa0b3b..000000000 --- a/app/src/main/res/drawable/bg_progressbar.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_round_solid.xml b/app/src/main/res/drawable/bg_round_solid.xml deleted file mode 100644 index 45e4fbb09..000000000 --- a/app/src/main/res/drawable/bg_round_solid.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/bg_search.xml b/app/src/main/res/drawable/bg_search.xml deleted file mode 100644 index 68150025f..000000000 --- a/app/src/main/res/drawable/bg_search.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_section.xml b/app/src/main/res/drawable/bg_section.xml deleted file mode 100644 index f2a3598a7..000000000 --- a/app/src/main/res/drawable/bg_section.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/drawable/bg_sharp.xml b/app/src/main/res/drawable/bg_sharp.xml deleted file mode 100644 index 2705eb864..000000000 --- a/app/src/main/res/drawable/bg_sharp.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/bg_sheet.xml b/app/src/main/res/drawable/bg_sheet.xml index c1bc5fbcd..29774bd74 100644 --- a/app/src/main/res/drawable/bg_sheet.xml +++ b/app/src/main/res/drawable/bg_sheet.xml @@ -20,7 +20,7 @@ - + diff --git a/app/src/main/res/drawable/bg_state_flat.xml b/app/src/main/res/drawable/bg_state_flat.xml deleted file mode 100644 index 46b2992fa..000000000 --- a/app/src/main/res/drawable/bg_state_flat.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_state_flat_rounded.xml b/app/src/main/res/drawable/bg_state_flat_rounded.xml deleted file mode 100644 index c0defdc60..000000000 --- a/app/src/main/res/drawable/bg_state_flat_rounded.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_state_outline.xml b/app/src/main/res/drawable/bg_state_outline.xml deleted file mode 100644 index 2d9051f45..000000000 --- a/app/src/main/res/drawable/bg_state_outline.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_state_outline_rounded.xml b/app/src/main/res/drawable/bg_state_outline_rounded.xml deleted file mode 100644 index 7492d8c48..000000000 --- a/app/src/main/res/drawable/bg_state_outline_rounded.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/custom_ripple_circular_solid.xml b/app/src/main/res/drawable/custom_ripple_circular_solid.xml deleted file mode 100644 index 5a8f1c391..000000000 --- a/app/src/main/res/drawable/custom_ripple_circular_solid.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/custom_ripple_rounded_solid.xml b/app/src/main/res/drawable/custom_ripple_rounded_solid.xml deleted file mode 100644 index 538796651..000000000 --- a/app/src/main/res/drawable/custom_ripple_rounded_solid.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/divider_alt.xml b/app/src/main/res/drawable/divider_alt.xml deleted file mode 100644 index 386cb0ec6..000000000 --- a/app/src/main/res/drawable/divider_alt.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/divider_line.xml b/app/src/main/res/drawable/divider_line.xml index fe70d55df..5354e5628 100644 --- a/app/src/main/res/drawable/divider_line.xml +++ b/app/src/main/res/drawable/divider_line.xml @@ -21,6 +21,6 @@ android:shape="rectangle"> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account.xml b/app/src/main/res/drawable/ic_account.xml index 8642fac83..0843860a4 100644 --- a/app/src/main/res/drawable/ic_account.xml +++ b/app/src/main/res/drawable/ic_account.xml @@ -2,10 +2,10 @@ + android:viewportHeight="960"> + android:pathData="M234,684Q285,645 348,622.5Q411,600 480,600Q549,600 612,622.5Q675,645 726,684Q761,643 780.5,591Q800,539 800,480Q800,347 706.5,253.5Q613,160 480,160Q347,160 253.5,253.5Q160,347 160,480Q160,539 179.5,591Q199,643 234,684ZM480,520Q421,520 380.5,479.5Q340,439 340,380Q340,321 380.5,280.5Q421,240 480,240Q539,240 579.5,280.5Q620,321 620,380Q620,439 579.5,479.5Q539,520 480,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q533,800 580,784.5Q627,769 666,740Q627,711 580,695.5Q533,680 480,680Q427,680 380,695.5Q333,711 294,740Q333,769 380,784.5Q427,800 480,800ZM480,440Q506,440 523,423Q540,406 540,380Q540,354 523,337Q506,320 480,320Q454,320 437,337Q420,354 420,380Q420,406 437,423Q454,440 480,440ZM480,380Q480,380 480,380Q480,380 480,380Q480,380 480,380Q480,380 480,380Q480,380 480,380Q480,380 480,380Q480,380 480,380Q480,380 480,380ZM480,740Q480,740 480,740Q480,740 480,740Q480,740 480,740Q480,740 480,740Q480,740 480,740Q480,740 480,740Q480,740 480,740Q480,740 480,740Z" /> diff --git a/app/src/main/res/drawable/ic_account_manager.xml b/app/src/main/res/drawable/ic_account_manager.xml index fcc369821..4e727ed0e 100644 --- a/app/src/main/res/drawable/ic_account_manager.xml +++ b/app/src/main/res/drawable/ic_account_manager.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M400,480Q334,480 287,433Q240,386 240,320Q240,254 287,207Q334,160 400,160Q466,160 513,207Q560,254 560,320Q560,386 513,433Q466,480 400,480ZM80,800L80,688Q80,655 97,626Q114,597 144,582Q195,556 259,538Q323,520 400,520Q408,520 414,520Q420,520 426,522Q418,540 412.5,559.5Q407,579 404,600L400,600Q329,600 272.5,618Q216,636 180,654Q171,659 165.5,668Q160,677 160,688L160,720L412,720Q418,741 428,761.5Q438,782 450,800L80,800ZM640,840L628,780Q616,775 605.5,769.5Q595,764 584,756L526,774L486,706L532,666Q530,652 530,640Q530,628 532,614L486,574L526,506L584,524Q595,516 605.5,510.5Q616,505 628,500L640,440L720,440L732,500Q744,505 754.5,511Q765,517 776,526L834,506L874,576L828,616Q830,628 830,641Q830,654 828,666L874,706L834,774L776,756Q765,764 754.5,769.5Q744,775 732,780L720,840L640,840ZM680,720Q713,720 736.5,696.5Q760,673 760,640Q760,607 736.5,583.5Q713,560 680,560Q647,560 623.5,583.5Q600,607 600,640Q600,673 623.5,696.5Q647,720 680,720ZM400,400Q433,400 456.5,376.5Q480,353 480,320Q480,287 456.5,263.5Q433,240 400,240Q367,240 343.5,263.5Q320,287 320,320Q320,353 343.5,376.5Q367,400 400,400ZM400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320Q400,320 400,320ZM412,720L412,720L412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720Q412,720 412,720L412,720Q412,720 412,720Q412,720 412,720Z" /> diff --git a/app/src/main/res/drawable/ic_apps.xml b/app/src/main/res/drawable/ic_apps.xml index ebfafe659..f0285049d 100644 --- a/app/src/main/res/drawable/ic_apps.xml +++ b/app/src/main/res/drawable/ic_apps.xml @@ -20,11 +20,11 @@ + android:viewportHeight="960"> + android:pathData="M240,800Q207,800 183.5,776.5Q160,753 160,720Q160,687 183.5,663.5Q207,640 240,640Q273,640 296.5,663.5Q320,687 320,720Q320,753 296.5,776.5Q273,800 240,800ZM480,800Q447,800 423.5,776.5Q400,753 400,720Q400,687 423.5,663.5Q447,640 480,640Q513,640 536.5,663.5Q560,687 560,720Q560,753 536.5,776.5Q513,800 480,800ZM720,800Q687,800 663.5,776.5Q640,753 640,720Q640,687 663.5,663.5Q687,640 720,640Q753,640 776.5,663.5Q800,687 800,720Q800,753 776.5,776.5Q753,800 720,800ZM240,560Q207,560 183.5,536.5Q160,513 160,480Q160,447 183.5,423.5Q207,400 240,400Q273,400 296.5,423.5Q320,447 320,480Q320,513 296.5,536.5Q273,560 240,560ZM480,560Q447,560 423.5,536.5Q400,513 400,480Q400,447 423.5,423.5Q447,400 480,400Q513,400 536.5,423.5Q560,447 560,480Q560,513 536.5,536.5Q513,560 480,560ZM720,560Q687,560 663.5,536.5Q640,513 640,480Q640,447 663.5,423.5Q687,400 720,400Q753,400 776.5,423.5Q800,447 800,480Q800,513 776.5,536.5Q753,560 720,560ZM240,320Q207,320 183.5,296.5Q160,273 160,240Q160,207 183.5,183.5Q207,160 240,160Q273,160 296.5,183.5Q320,207 320,240Q320,273 296.5,296.5Q273,320 240,320ZM480,320Q447,320 423.5,296.5Q400,273 400,240Q400,207 423.5,183.5Q447,160 480,160Q513,160 536.5,183.5Q560,207 560,240Q560,273 536.5,296.5Q513,320 480,320ZM720,320Q687,320 663.5,296.5Q640,273 640,240Q640,207 663.5,183.5Q687,160 720,160Q753,160 776.5,183.5Q800,207 800,240Q800,273 776.5,296.5Q753,320 720,320Z" /> diff --git a/app/src/main/res/drawable/ic_blacklist.xml b/app/src/main/res/drawable/ic_blacklist.xml index 2da2ff4ec..f79868314 100644 --- a/app/src/main/res/drawable/ic_blacklist.xml +++ b/app/src/main/res/drawable/ic_blacklist.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M791,905L671,785Q629,811 581,825.5Q533,840 480,840Q405,840 339.5,811.5Q274,783 225.5,734.5Q177,686 148.5,620.5Q120,555 120,480Q120,427 134.5,379Q149,331 175,289L55,169L112,112L848,848L791,905ZM480,760Q516,760 549.5,751.5Q583,743 613,727L233,347Q217,377 208.5,410.5Q200,444 200,480Q200,597 281.5,678.5Q363,760 480,760ZM600,400L600,320L710,320Q669,264 609,232Q549,200 480,200Q444,200 410.5,208.5Q377,217 347,233L289,175Q331,149 379,134.5Q427,120 480,120Q562,120 635.5,155Q709,190 760,254L760,160L840,160L840,400L600,400ZM520,406L440,326L440,280L520,280L520,406ZM785,671L727,613Q738,591 745.5,568Q753,545 756,520L838,520Q833,562 819.5,600Q806,638 785,671Z" /> diff --git a/app/src/main/res/drawable/ic_cancel.xml b/app/src/main/res/drawable/ic_cancel.xml index 2c25f52c2..cc0b7d133 100644 --- a/app/src/main/res/drawable/ic_cancel.xml +++ b/app/src/main/res/drawable/ic_cancel.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M256,760L200,704L424,480L200,256L256,200L480,424L704,200L760,256L536,480L760,704L704,760L480,536L256,760Z" /> diff --git a/app/src/main/res/drawable/ic_code.xml b/app/src/main/res/drawable/ic_code.xml index 680631584..91f50493d 100644 --- a/app/src/main/res/drawable/ic_code.xml +++ b/app/src/main/res/drawable/ic_code.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M320,720L80,480L320,240L377,297L193,481L376,664L320,720ZM640,720L583,663L767,479L584,296L640,240L880,480L640,720Z" /> diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml index 3688ff843..3e3991d97 100644 --- a/app/src/main/res/drawable/ic_delete.xml +++ b/app/src/main/res/drawable/ic_delete.xml @@ -2,10 +2,10 @@ + android:viewportHeight="960"> + android:pathData="M280,840Q247,840 223.5,816.5Q200,793 200,760L200,240L160,240L160,160L360,160L360,120L600,120L600,160L800,160L800,240L760,240L760,760Q760,793 736.5,816.5Q713,840 680,840L280,840ZM680,240L280,240L280,760Q280,760 280,760Q280,760 280,760L680,760Q680,760 680,760Q680,760 680,760L680,240ZM360,680L440,680L440,320L360,320L360,680ZM520,680L600,680L600,320L520,320L520,680ZM280,240L280,240L280,760Q280,760 280,760Q280,760 280,760L280,760Q280,760 280,760Q280,760 280,760L280,240Z" /> diff --git a/app/src/main/res/drawable/ic_disclaimer.xml b/app/src/main/res/drawable/ic_disclaimer.xml index a8e0e92e0..c933be9ff 100644 --- a/app/src/main/res/drawable/ic_disclaimer.xml +++ b/app/src/main/res/drawable/ic_disclaimer.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M480,680Q497,680 508.5,668.5Q520,657 520,640Q520,623 508.5,611.5Q497,600 480,600Q463,600 451.5,611.5Q440,623 440,640Q440,657 451.5,668.5Q463,680 480,680ZM440,520L520,520L520,280L440,280L440,520ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z" /> diff --git a/app/src/main/res/drawable/ic_download_manager.xml b/app/src/main/res/drawable/ic_download_manager.xml index 680ef50e5..dcc1a6d4a 100644 --- a/app/src/main/res/drawable/ic_download_manager.xml +++ b/app/src/main/res/drawable/ic_download_manager.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M480,640L280,440L336,382L440,486L440,160L520,160L520,486L624,382L680,440L480,640ZM240,800Q207,800 183.5,776.5Q160,753 160,720L160,600L240,600L240,720Q240,720 240,720Q240,720 240,720L720,720Q720,720 720,720Q720,720 720,720L720,600L800,600L800,720Q800,753 776.5,776.5Q753,800 720,800L240,800Z" /> diff --git a/app/src/main/res/drawable/ic_faq.xml b/app/src/main/res/drawable/ic_faq.xml index 06a9be04b..a80869041 100644 --- a/app/src/main/res/drawable/ic_faq.xml +++ b/app/src/main/res/drawable/ic_faq.xml @@ -20,11 +20,11 @@ + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M478,720Q499,720 513.5,705.5Q528,691 528,670Q528,649 513.5,634.5Q499,620 478,620Q457,620 442.5,634.5Q428,649 428,670Q428,691 442.5,705.5Q457,720 478,720ZM442,566L516,566Q516,533 523.5,514Q531,495 566,462Q592,436 607,412.5Q622,389 622,356Q622,300 581,270Q540,240 484,240Q427,240 391.5,270Q356,300 342,342L408,368Q413,350 430.5,329Q448,308 484,308Q516,308 532,325.5Q548,343 548,364Q548,384 536,401.5Q524,419 506,434Q462,473 452,493Q442,513 442,566ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z" /> diff --git a/app/src/main/res/drawable/ic_file_copy.xml b/app/src/main/res/drawable/ic_file_copy.xml index dc91a7666..048383e23 100644 --- a/app/src/main/res/drawable/ic_file_copy.xml +++ b/app/src/main/res/drawable/ic_file_copy.xml @@ -2,10 +2,10 @@ + android:viewportHeight="960"> + android:pathData="M760,760L320,760Q287,760 263.5,736.5Q240,713 240,680L240,120Q240,87 263.5,63.5Q287,40 320,40L600,40L840,280L840,680Q840,713 816.5,736.5Q793,760 760,760ZM560,320L560,120L320,120Q320,120 320,120Q320,120 320,120L320,680Q320,680 320,680Q320,680 320,680L760,680Q760,680 760,680Q760,680 760,680L760,320L560,320ZM160,920Q127,920 103.5,896.5Q80,873 80,840L80,280L160,280L160,840Q160,840 160,840Q160,840 160,840L600,840L600,920L160,920ZM320,120L320,120L320,320L320,320L320,120L320,320L320,320L320,680Q320,680 320,680Q320,680 320,680L320,680Q320,680 320,680Q320,680 320,680L320,120Q320,120 320,120Q320,120 320,120Z" /> diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml index 26c623bd1..3d063ef64 100644 --- a/app/src/main/res/drawable/ic_filter.xml +++ b/app/src/main/res/drawable/ic_filter.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M440,800Q423,800 411.5,788.5Q400,777 400,760L400,520L168,224Q153,204 163.5,182Q174,160 200,160L760,160Q786,160 796.5,182Q807,204 792,224L560,520L560,760Q560,777 548.5,788.5Q537,800 520,800L440,800ZM480,492L678,240L282,240L480,492ZM480,492L480,492L480,492L480,492Z" /> diff --git a/app/src/main/res/drawable/ic_games.xml b/app/src/main/res/drawable/ic_games.xml index 2832136ec..5a24bba2c 100644 --- a/app/src/main/res/drawable/ic_games.xml +++ b/app/src/main/res/drawable/ic_games.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M189,800Q129,800 86.5,757Q44,714 42,653Q42,644 43,635Q44,626 46,617L130,281Q144,227 187,193.5Q230,160 285,160L675,160Q730,160 773,193.5Q816,227 830,281L914,617Q916,626 917.5,635.5Q919,645 919,654Q919,715 875.5,757.5Q832,800 771,800Q729,800 693,778Q657,756 639,718L611,660Q606,650 596,645Q586,640 575,640L385,640Q374,640 364,645Q354,650 349,660L321,718Q303,756 267,778Q231,800 189,800ZM540,440Q557,440 568.5,428.5Q580,417 580,400Q580,383 568.5,371.5Q557,360 540,360Q523,360 511.5,371.5Q500,383 500,400Q500,417 511.5,428.5Q523,440 540,440ZM620,360Q637,360 648.5,348.5Q660,337 660,320Q660,303 648.5,291.5Q637,280 620,280Q603,280 591.5,291.5Q580,303 580,320Q580,337 591.5,348.5Q603,360 620,360ZM620,520Q637,520 648.5,508.5Q660,497 660,480Q660,463 648.5,451.5Q637,440 620,440Q603,440 591.5,451.5Q580,463 580,480Q580,497 591.5,508.5Q603,520 620,520ZM700,440Q717,440 728.5,428.5Q740,417 740,400Q740,383 728.5,371.5Q717,360 700,360Q683,360 671.5,371.5Q660,383 660,400Q660,417 671.5,428.5Q683,440 700,440ZM340,500Q353,500 361.5,491.5Q370,483 370,470L370,430L410,430Q423,430 431.5,421.5Q440,413 440,400Q440,387 431.5,378.5Q423,370 410,370L370,370L370,330Q370,317 361.5,308.5Q353,300 340,300Q327,300 318.5,308.5Q310,317 310,330L310,370L270,370Q257,370 248.5,378.5Q240,387 240,400Q240,413 248.5,421.5Q257,430 270,430L310,430L310,470Q310,483 318.5,491.5Q327,500 340,500Z" /> diff --git a/app/src/main/res/drawable/ic_help.xml b/app/src/main/res/drawable/ic_help.xml index 099d75ecd..37e2fd04d 100644 --- a/app/src/main/res/drawable/ic_help.xml +++ b/app/src/main/res/drawable/ic_help.xml @@ -2,11 +2,11 @@ + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M478,720Q499,720 513.5,705.5Q528,691 528,670Q528,649 513.5,634.5Q499,620 478,620Q457,620 442.5,634.5Q428,649 428,670Q428,691 442.5,705.5Q457,720 478,720ZM442,566L516,566Q516,533 523.5,514Q531,495 566,462Q592,436 607,412.5Q622,389 622,356Q622,300 581,270Q540,240 484,240Q427,240 391.5,270Q356,300 342,342L408,368Q413,350 430.5,329Q448,308 484,308Q516,308 532,325.5Q548,343 548,364Q548,384 536,401.5Q524,419 506,434Q462,473 452,493Q442,513 442,566ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z" /> diff --git a/app/src/main/res/drawable/ic_install.xml b/app/src/main/res/drawable/ic_install.xml index 8dc257519..9e7bd3aec 100644 --- a/app/src/main/res/drawable/ic_install.xml +++ b/app/src/main/res/drawable/ic_install.xml @@ -22,7 +22,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - + diff --git a/app/src/main/res/drawable/ic_installation.xml b/app/src/main/res/drawable/ic_installation.xml index 6d981ddba..dde78bb4c 100644 --- a/app/src/main/res/drawable/ic_installation.xml +++ b/app/src/main/res/drawable/ic_installation.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M280,920Q247,920 223.5,896.5Q200,873 200,840L200,120Q200,87 223.5,63.5Q247,40 280,40L560,40L560,120L280,120Q280,120 280,120Q280,120 280,120L280,160L560,160L560,240L280,240L280,720L680,720L680,640L760,640L760,840Q760,873 736.5,896.5Q713,920 680,920L280,920ZM280,800L280,840Q280,840 280,840Q280,840 280,840L680,840Q680,840 680,840Q680,840 680,840L680,800L280,800ZM720,560L520,360L576,304L680,408L680,120L760,120L760,408L864,304L920,360L720,560ZM280,160L280,160L280,120Q280,120 280,120Q280,120 280,120L280,120L280,160ZM280,800L280,800L280,840Q280,840 280,840Q280,840 280,840L280,840Q280,840 280,840Q280,840 280,840L280,800Z" /> diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml index 1343030f6..3cfca5b9c 100644 --- a/app/src/main/res/drawable/ic_launcher_monochrome.xml +++ b/app/src/main/res/drawable/ic_launcher_monochrome.xml @@ -3,20 +3,20 @@ android:height="108dp" android:viewportWidth="108" android:viewportHeight="108"> - - - + + + diff --git a/app/src/main/res/drawable/ic_license.xml b/app/src/main/res/drawable/ic_license.xml index be2cd135d..15f88305a 100644 --- a/app/src/main/res/drawable/ic_license.xml +++ b/app/src/main/res/drawable/ic_license.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M480,520Q430,520 395,485Q360,450 360,400Q360,350 395,315Q430,280 480,280Q530,280 565,315Q600,350 600,400Q600,450 565,485Q530,520 480,520ZM240,920L240,611Q202,569 181,515Q160,461 160,400Q160,266 253,173Q346,80 480,80Q614,80 707,173Q800,266 800,400Q800,461 779,515Q758,569 720,611L720,920L480,840L240,920ZM480,640Q580,640 650,570Q720,500 720,400Q720,300 650,230Q580,160 480,160Q380,160 310,230Q240,300 240,400Q240,500 310,570Q380,640 480,640ZM320,801L480,760L640,801L640,677Q605,697 564.5,708.5Q524,720 480,720Q436,720 395.5,708.5Q355,697 320,677L320,801ZM480,739L480,739Q480,739 480,739Q480,739 480,739Q480,739 480,739Q480,739 480,739L480,739L480,739L480,739Z" /> diff --git a/app/src/main/res/drawable/ic_mail.xml b/app/src/main/res/drawable/ic_mail.xml index f739bc0aa..230c765c2 100644 --- a/app/src/main/res/drawable/ic_mail.xml +++ b/app/src/main/res/drawable/ic_mail.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M160,800Q127,800 103.5,776.5Q80,753 80,720L80,240Q80,207 103.5,183.5Q127,160 160,160L800,160Q833,160 856.5,183.5Q880,207 880,240L880,720Q880,753 856.5,776.5Q833,800 800,800L160,800ZM480,520L160,320L160,720Q160,720 160,720Q160,720 160,720L800,720Q800,720 800,720Q800,720 800,720L800,320L480,520ZM480,440L800,240L160,240L480,440ZM160,320L160,240L160,240L160,320L160,720Q160,720 160,720Q160,720 160,720L160,720Q160,720 160,720Q160,720 160,720L160,320Z" /> diff --git a/app/src/main/res/drawable/ic_map.xml b/app/src/main/res/drawable/ic_map.xml index ef2a12ce2..ae5035a3f 100644 --- a/app/src/main/res/drawable/ic_map.xml +++ b/app/src/main/res/drawable/ic_map.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M480,480Q513,480 536.5,456.5Q560,433 560,400Q560,367 536.5,343.5Q513,320 480,320Q447,320 423.5,343.5Q400,367 400,400Q400,433 423.5,456.5Q447,480 480,480ZM480,774Q602,662 661,570.5Q720,479 720,408Q720,299 650.5,229.5Q581,160 480,160Q379,160 309.5,229.5Q240,299 240,408Q240,479 299,570.5Q358,662 480,774ZM480,880Q319,743 239.5,625.5Q160,508 160,408Q160,258 256.5,169Q353,80 480,80Q607,80 703.5,169Q800,258 800,408Q800,508 720.5,625.5Q641,743 480,880ZM480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Q480,400 480,400Z" /> diff --git a/app/src/main/res/drawable/ic_menu_about.xml b/app/src/main/res/drawable/ic_menu_about.xml index 8ccc1f658..f7fa7b56f 100644 --- a/app/src/main/res/drawable/ic_menu_about.xml +++ b/app/src/main/res/drawable/ic_menu_about.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M440,680L520,680L520,440L440,440L440,680ZM480,360Q497,360 508.5,348.5Q520,337 520,320Q520,303 508.5,291.5Q497,280 480,280Q463,280 451.5,291.5Q440,303 440,320Q440,337 451.5,348.5Q463,360 480,360ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM480,800Q614,800 707,707Q800,614 800,480Q800,346 707,253Q614,160 480,160Q346,160 253,253Q160,346 160,480Q160,614 253,707Q346,800 480,800ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Z" /> diff --git a/app/src/main/res/drawable/ic_menu_settings.xml b/app/src/main/res/drawable/ic_menu_settings.xml index 3aef48f51..0c88bbddd 100644 --- a/app/src/main/res/drawable/ic_menu_settings.xml +++ b/app/src/main/res/drawable/ic_menu_settings.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M370,880L354,752Q341,747 329.5,740Q318,733 307,725L188,775L78,585L181,507Q180,500 180,493.5Q180,487 180,480Q180,473 180,466.5Q180,460 181,453L78,375L188,185L307,235Q318,227 330,220Q342,213 354,208L370,80L590,80L606,208Q619,213 630.5,220Q642,227 653,235L772,185L882,375L779,453Q780,460 780,466.5Q780,473 780,480Q780,487 780,493.5Q780,500 778,507L881,585L771,775L653,725Q642,733 630,740Q618,747 606,752L590,880L370,880ZM440,800L519,800L533,694Q564,686 590.5,670.5Q617,655 639,633L738,674L777,606L691,541Q696,527 698,511.5Q700,496 700,480Q700,464 698,448.5Q696,433 691,419L777,354L738,286L639,328Q617,305 590.5,289.5Q564,274 533,266L520,160L441,160L427,266Q396,274 369.5,289.5Q343,305 321,327L222,286L183,354L269,418Q264,433 262,448Q260,463 260,480Q260,496 262,511Q264,526 269,541L183,606L222,674L321,632Q343,655 369.5,670.5Q396,686 427,694L440,800ZM482,620Q540,620 581,579Q622,538 622,480Q622,422 581,381Q540,340 482,340Q423,340 382.5,381Q342,422 342,480Q342,538 382.5,579Q423,620 482,620ZM480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480L480,480L480,480Q480,480 480,480Q480,480 480,480L480,480L480,480Z" /> diff --git a/app/src/main/res/drawable/ic_network.xml b/app/src/main/res/drawable/ic_network.xml index 11e832112..42a8b85c0 100644 --- a/app/src/main/res/drawable/ic_network.xml +++ b/app/src/main/res/drawable/ic_network.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880ZM440,798L440,720Q407,720 383.5,696.5Q360,673 360,640L360,600L168,408Q165,426 162.5,444Q160,462 160,480Q160,601 239.5,692Q319,783 440,798ZM716,696Q736,674 752,648.5Q768,623 778.5,595.5Q789,568 794.5,539Q800,510 800,480Q800,382 745.5,301Q691,220 600,184L600,200Q600,233 576.5,256.5Q553,280 520,280L440,280L440,360Q440,377 428.5,388.5Q417,400 400,400L320,400L320,480L560,480Q577,480 588.5,491.5Q600,503 600,520L600,640L640,640Q666,640 687,655.5Q708,671 716,696Z" /> diff --git a/app/src/main/res/drawable/ic_permission_android.xml b/app/src/main/res/drawable/ic_permission_android.xml index 58ed27a33..e4aabec6f 100644 --- a/app/src/main/res/drawable/ic_permission_android.xml +++ b/app/src/main/res/drawable/ic_permission_android.xml @@ -21,10 +21,10 @@ + android:viewportHeight="960"> + android:pathData="M40,720Q49,613 105.5,523Q162,433 256,380L182,252Q176,243 179,233Q182,223 192,218Q200,213 210,216Q220,219 226,228L300,356Q386,320 480,320Q574,320 660,356L734,228Q740,219 750,216Q760,213 768,218Q778,223 781,233Q784,243 778,252L704,380Q798,433 854.5,523Q911,613 920,720L40,720ZM280,610Q301,610 315.5,595.5Q330,581 330,560Q330,539 315.5,524.5Q301,510 280,510Q259,510 244.5,524.5Q230,539 230,560Q230,581 244.5,595.5Q259,610 280,610ZM680,610Q701,610 715.5,595.5Q730,581 730,560Q730,539 715.5,524.5Q701,510 680,510Q659,510 644.5,524.5Q630,539 630,560Q630,581 644.5,595.5Q659,610 680,610Z" /> diff --git a/app/src/main/res/drawable/ic_privacy.xml b/app/src/main/res/drawable/ic_privacy.xml index 5022366ad..7700dc3af 100644 --- a/app/src/main/res/drawable/ic_privacy.xml +++ b/app/src/main/res/drawable/ic_privacy.xml @@ -20,10 +20,10 @@ + android:viewportHeight="960"> + android:pathData="M480,880Q341,845 250.5,720.5Q160,596 160,444L160,200L480,80L800,200L800,444Q800,529 771,607.5Q742,686 688,746L560,618Q542,629 521.5,634.5Q501,640 480,640Q414,640 367,593Q320,546 320,480Q320,414 367,367Q414,320 480,320Q546,320 593,367Q640,414 640,480Q640,502 634.5,522.5Q629,543 618,562L678,622Q698,581 709,536Q720,491 720,444L720,255L480,165L240,255L240,444Q240,565 308,664Q376,763 480,796Q506,788 529.5,775.5Q553,763 576,746L632,802Q599,829 560.5,849Q522,869 480,880ZM480,560Q513,560 536.5,536.5Q560,513 560,480Q560,447 536.5,423.5Q513,400 480,400Q447,400 423.5,423.5Q400,447 400,480Q400,513 423.5,536.5Q447,560 480,560ZM488,483L488,483Q488,483 488,483Q488,483 488,483L488,483Q488,483 488,483Q488,483 488,483L488,483L488,483L488,483L488,483Q488,483 488,483Q488,483 488,483Q488,483 488,483Q488,483 488,483L488,483Z" /> diff --git a/app/src/main/res/drawable/ic_problem.xml b/app/src/main/res/drawable/ic_problem.xml index 02e63aecb..67491756c 100644 --- a/app/src/main/res/drawable/ic_problem.xml +++ b/app/src/main/res/drawable/ic_problem.xml @@ -1,5 +1,4 @@ - - - + - - - - - + + + + + diff --git a/app/src/main/res/layout-land/fragment_about.xml b/app/src/main/res/layout-land/fragment_about.xml index a8f84bdae..c2387857f 100644 --- a/app/src/main/res/layout-land/fragment_about.xml +++ b/app/src/main/res/layout-land/fragment_about.xml @@ -59,8 +59,6 @@ android:layout_height="wrap_content" android:layout_below="@+id/img_icon" android:layout_centerHorizontal="true" - android:layout_marginTop="@dimen/margin_normal" - android:layout_marginBottom="@dimen/margin_xsmall" android:text="@string/app_name" /> diff --git a/app/src/main/res/layout-land/fragment_installer.xml b/app/src/main/res/layout-land/fragment_installer.xml index ae013c7e6..863301a28 100644 --- a/app/src/main/res/layout-land/fragment_installer.xml +++ b/app/src/main/res/layout-land/fragment_installer.xml @@ -45,5 +45,4 @@ android:scrollbars="none" app:itemSpacing="@dimen/margin_small" tools:listitem="@layout/view_installer" /> - \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_onboarding_permissions.xml b/app/src/main/res/layout-land/fragment_onboarding_permissions.xml index c82f33c03..f08b3278f 100644 --- a/app/src/main/res/layout-land/fragment_onboarding_permissions.xml +++ b/app/src/main/res/layout-land/fragment_onboarding_permissions.xml @@ -20,12 +20,9 @@ --> @@ -63,9 +56,7 @@ android:layout_weight="1" android:clipToPadding="false" android:overScrollMode="never" - android:padding="@dimen/padding_normal" + android:padding="@dimen/padding_medium" android:scrollbars="none" - app:itemSpacing="@dimen/margin_small" - tools:listitem="@layout/view_installer" /> - + tools:listitem="@layout/view_permission" /> \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_onboarding_welcome.xml b/app/src/main/res/layout-land/fragment_onboarding_welcome.xml index e1d58284a..e3f9a99d0 100644 --- a/app/src/main/res/layout-land/fragment_onboarding_welcome.xml +++ b/app/src/main/res/layout-land/fragment_onboarding_welcome.xml @@ -20,13 +20,10 @@ --> + android:orientation="horizontal"> @@ -64,8 +57,7 @@ android:layout_weight="1" android:clipToPadding="false" android:overScrollMode="never" - android:padding="@dimen/padding_normal" + android:padding="@dimen/padding_medium" android:scrollbars="none" - app:itemSpacing="@dimen/margin_small" - tools:listitem="@layout/view_theme" /> + tools:listitem="@layout/view_dash" /> \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_splash.xml b/app/src/main/res/layout-land/fragment_splash.xml index 3df64fcca..36c580854 100644 --- a/app/src/main/res/layout-land/fragment_splash.xml +++ b/app/src/main/res/layout-land/fragment_splash.xml @@ -105,9 +105,9 @@ diff --git a/app/src/main/res/layout-sw600dp/activity_main.xml b/app/src/main/res/layout-sw600dp/activity_main.xml index 143b32701..b97a088c3 100644 --- a/app/src/main/res/layout-sw600dp/activity_main.xml +++ b/app/src/main/res/layout-sw600dp/activity_main.xml @@ -1,9 +1,9 @@ + android:layout_height="match_parent"> - diff --git a/app/src/main/res/layout/fragment_onboarding_welcome.xml b/app/src/main/res/layout/fragment_onboarding_welcome.xml index 2036223ba..f67665e9e 100644 --- a/app/src/main/res/layout/fragment_onboarding_welcome.xml +++ b/app/src/main/res/layout/fragment_onboarding_welcome.xml @@ -20,7 +20,6 @@ --> + tools:listitem="@layout/view_dash" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_screenshot.xml b/app/src/main/res/layout/fragment_screenshot.xml index 73a17f367..0cc5a6714 100644 --- a/app/src/main/res/layout/fragment_screenshot.xml +++ b/app/src/main/res/layout/fragment_screenshot.xml @@ -28,8 +28,8 @@ android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:translationZ="1dp" android:background="@color/colorTransparent" + android:translationZ="1dp" app:layout_scrollFlags="enterAlways|exitUntilCollapsed" /> diff --git a/app/src/main/res/layout/fragment_setting.xml b/app/src/main/res/layout/fragment_setting.xml index a94d1872a..328e8672c 100644 --- a/app/src/main/res/layout/fragment_setting.xml +++ b/app/src/main/res/layout/fragment_setting.xml @@ -1,5 +1,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/layout_details_permissions.xml b/app/src/main/res/layout/layout_details_permissions.xml index d549f440f..46c359713 100644 --- a/app/src/main/res/layout/layout_details_permissions.xml +++ b/app/src/main/res/layout/layout_details_permissions.xml @@ -26,7 +26,7 @@ android:layout_height="wrap_content" android:divider="@drawable/divider" android:orientation="vertical" - android:paddingStart="@dimen/padding_large" + android:paddingStart="@dimen/padding_small" android:paddingEnd="@dimen/padding_small" android:showDividers="middle"> @@ -34,12 +34,6 @@ android:id="@+id/header_permission" android:layout_width="match_parent" android:layout_height="wrap_content" - app:headerTitle="@string/details_permission" /> - - + app:headerTitle="@string/details_permission" + tools:headerSubtitle="36 permissions" /> \ No newline at end of file diff --git a/app/src/main/res/layout/layout_details_privacy.xml b/app/src/main/res/layout/layout_details_privacy.xml index 6c500983a..0d757003b 100644 --- a/app/src/main/res/layout/layout_details_privacy.xml +++ b/app/src/main/res/layout/layout_details_privacy.xml @@ -19,15 +19,14 @@ ~ --> - @@ -35,29 +34,27 @@ android:id="@+id/header_privacy" android:layout_width="match_parent" android:layout_height="wrap_content" + app:headerSubtitle="@string/exodus_powered" app:headerTitle="@string/details_privacy" /> - - + android:insetTop="@dimen/padding_small" + android:insetBottom="@dimen/padding_xsmall" + android:text="@string/action_request_analysis" + app:cornerRadius="@dimen/margin_small" /> - + diff --git a/app/src/main/res/layout/layout_details_review.xml b/app/src/main/res/layout/layout_details_review.xml index 72582ee2c..26d752bb1 100644 --- a/app/src/main/res/layout/layout_details_review.xml +++ b/app/src/main/res/layout/layout_details_review.xml @@ -24,7 +24,7 @@ android:layout_height="wrap_content" android:divider="@drawable/divider" android:orientation="vertical" - android:paddingStart="@dimen/padding_large" + android:paddingStart="@dimen/padding_small" android:paddingEnd="@dimen/padding_small" android:showDividers="middle"> @@ -56,15 +56,15 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="@dimen/margin_normal" - android:orientation="vertical" android:divider="@drawable/divider" + android:orientation="vertical" android:showDividers="middle"> + android:text="@string/action_post" + app:cornerRadius="@dimen/margin_small" /> @@ -141,7 +140,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" - android:divider="@drawable/divider_alt" + android:divider="@drawable/divider" android:orientation="vertical" android:showDividers="middle" /> @@ -153,7 +152,6 @@ android:orientation="vertical" android:overScrollMode="never" android:scrollbars="none" - app:itemSpacing="@dimen/margin_normal" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:itemCount="4" tools:listitem="@layout/view_review" /> diff --git a/app/src/main/res/layout/layout_nav_header.xml b/app/src/main/res/layout/layout_nav_header.xml index 804858ff4..dd1e05888 100644 --- a/app/src/main/res/layout/layout_nav_header.xml +++ b/app/src/main/res/layout/layout_nav_header.xml @@ -1,5 +1,4 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/preference_material_switch.xml b/app/src/main/res/layout/preference_material_switch.xml index aa4cb1570..3a3ee1385 100644 --- a/app/src/main/res/layout/preference_material_switch.xml +++ b/app/src/main/res/layout/preference_material_switch.xml @@ -1,5 +1,4 @@ - - + @@ -22,8 +21,8 @@ android:id="@+id/img_icon" android:layout_width="@dimen/icon_size_category" android:layout_height="@dimen/icon_size_category" - android:src="@drawable/ic_download_manager" android:layout_centerVertical="true" + android:src="@drawable/ic_download_manager" app:tint="@color/colorAccent" /> + tools:src="@drawable/bg_placeholder" /> + tools:src="@drawable/bg_placeholder" /> + android:layout_height="wrap_content" + android:paddingTop="@dimen/padding_xsmall" + android:paddingBottom="@dimen/padding_xsmall"> - + android:ellipsize="end" + android:maxLines="1" + tools:text="Title" /> - - - - + diff --git a/app/src/main/res/layout/view_app.xml b/app/src/main/res/layout/view_app.xml index b0024a6cd..fb9fc4cdd 100644 --- a/app/src/main/res/layout/view_app.xml +++ b/app/src/main/res/layout/view_app.xml @@ -20,15 +20,14 @@ + android:layout_height="wrap_content" + android:padding="@dimen/padding_xsmall"> + android:layout_centerHorizontal="true" /> @@ -69,7 +69,7 @@ android:layout_centerVertical="true" android:layout_marginTop="@dimen/margin_xxsmall" android:layout_marginBottom="@dimen/margin_xxsmall" - android:background="@color/colorPrimaryAlt" + android:background="?colorShimmer" android:maxLines="2" android:textAppearance="@style/TextAppearance.Aurora.Line3" /> diff --git a/app/src/main/res/layout/view_app_dependent.xml b/app/src/main/res/layout/view_app_dependent.xml index 413d0069d..18f6fce06 100644 --- a/app/src/main/res/layout/view_app_dependent.xml +++ b/app/src/main/res/layout/view_app_dependent.xml @@ -20,15 +20,14 @@ + android:layout_height="wrap_content" + android:padding="@dimen/padding_xxsmall"> + android:layout_centerHorizontal="true" /> + android:paddingStart="@dimen/padding_medium" + android:paddingTop="@dimen/padding_xsmall" + android:paddingEnd="@dimen/padding_small" + android:paddingBottom="@dimen/padding_xsmall"> + android:layout_centerVertical="true" + tools:src="@drawable/bg_placeholder" /> + android:paddingStart="@dimen/padding_medium" + android:paddingTop="@dimen/padding_xsmall" + android:paddingEnd="@dimen/padding_small" + android:paddingBottom="@dimen/padding_xsmall"> @@ -28,7 +27,7 @@ android:id="@+id/img_icon" android:layout_width="@dimen/icon_size_cluster" android:layout_height="@dimen/icon_size_cluster" + android:layout_centerInParent="true" android:scaleX="0.5" - android:scaleY="0.5" - android:layout_centerInParent="true" /> + android:scaleY="0.5" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_app_shimmer.xml b/app/src/main/res/layout/view_app_shimmer.xml index dcafeacbe..384ef0937 100644 --- a/app/src/main/res/layout/view_app_shimmer.xml +++ b/app/src/main/res/layout/view_app_shimmer.xml @@ -28,15 +28,14 @@ android:id="@+id/card" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="vertical"> + android:orientation="vertical" + android:padding="@dimen/padding_xsmall"> + android:paddingStart="@dimen/padding_medium" + android:paddingTop="@dimen/padding_small" + android:paddingEnd="@dimen/padding_small" + android:paddingBottom="@dimen/padding_small"> - + - + android:layout_height="match_parent" + android:layout_centerInParent="true" /> - - - - - - - - - - - - - - - - - - - - - - - - + + + android:singleLine="true" + android:textAppearance="@style/TextAppearance.Aurora.Line1" /> + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/view_category.xml b/app/src/main/res/layout/view_category.xml index 9a6295f27..34eb9c3da 100644 --- a/app/src/main/res/layout/view_category.xml +++ b/app/src/main/res/layout/view_category.xml @@ -18,17 +18,19 @@ --> + android:background="?android:selectableItemBackground" + android:padding="@dimen/padding_small"> + android:layout_width="@dimen/icon_size_default" + android:layout_height="@dimen/icon_size_default" + android:layout_centerVertical="true" + app:tint="?colorAccent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_dash.xml b/app/src/main/res/layout/view_dash.xml index e23b19c4f..d27df0ea6 100644 --- a/app/src/main/res/layout/view_dash.xml +++ b/app/src/main/res/layout/view_dash.xml @@ -17,35 +17,48 @@ ~ --> - + android:background="?selectableItemBackground" + android:orientation="horizontal" + android:padding="@dimen/padding_small"> + android:layout_gravity="center_vertical" + app:tint="?colorAccent" + tools:src="@drawable/ic_menu_about" /> - + + + android:orientation="vertical"> - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_dev_info.xml b/app/src/main/res/layout/view_dev_info.xml index 05d1047b5..fa7e5891c 100644 --- a/app/src/main/res/layout/view_dev_info.xml +++ b/app/src/main/res/layout/view_dev_info.xml @@ -22,9 +22,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_weight="1" - android:paddingTop="@dimen/margin_xxsmall" - android:paddingBottom="@dimen/margin_xxsmall"> + android:padding="@dimen/padding_xxsmall"> diff --git a/app/src/main/res/layout/view_device.xml b/app/src/main/res/layout/view_device.xml index d709498ce..66005edb0 100644 --- a/app/src/main/res/layout/view_device.xml +++ b/app/src/main/res/layout/view_device.xml @@ -21,8 +21,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingStart="@dimen/padding_normal" - android:paddingEnd="@dimen/padding_small"> + android:padding="@dimen/padding_small"> + android:layout_alignEnd="@id/line1" /> + android:layout_alignEnd="@id/line1" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_dispenser.xml b/app/src/main/res/layout/view_dispenser.xml index 4402a5d3c..f36622a2d 100644 --- a/app/src/main/res/layout/view_dispenser.xml +++ b/app/src/main/res/layout/view_dispenser.xml @@ -1,10 +1,11 @@ + android:background="?android:selectableItemBackground" + android:orientation="horizontal" + android:padding="@dimen/padding_small"> + android:background="@drawable/divider_line" + android:backgroundTint="?colorControlNormal" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_download.xml b/app/src/main/res/layout/view_download.xml index e62f73809..ce024309b 100644 --- a/app/src/main/res/layout/view_download.xml +++ b/app/src/main/res/layout/view_download.xml @@ -18,99 +18,101 @@ --> + android:paddingStart="@dimen/padding_medium" + android:paddingTop="@dimen/padding_xsmall" + android:paddingEnd="@dimen/padding_small" + android:paddingBottom="@dimen/padding_xsmall"> + + + + + + + android:layout_below="@id/progress_download" + android:layout_alignStart="@id/txt_title" + android:orientation="horizontal" + android:weightSum="3"> - - + tools:text="75%" /> - + - - - - - - - - + diff --git a/app/src/main/res/layout/view_editor_head.xml b/app/src/main/res/layout/view_editor_head.xml index 44ef8eae6..4cd368025 100644 --- a/app/src/main/res/layout/view_editor_head.xml +++ b/app/src/main/res/layout/view_editor_head.xml @@ -18,7 +18,6 @@ --> @@ -27,5 +26,5 @@ android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_centerInParent="true"/> + android:layout_centerInParent="true" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_exodus.xml b/app/src/main/res/layout/view_exodus.xml index 23242eeaf..adc565460 100644 --- a/app/src/main/res/layout/view_exodus.xml +++ b/app/src/main/res/layout/view_exodus.xml @@ -18,42 +18,42 @@ --> + android:layout_height="wrap_content" + android:padding="@dimen/padding_small" + android:textIsSelectable="true"> - + android:ellipsize="end" + android:maxLines="1" + android:textAppearance="@style/TextAppearance.Aurora.Line1" + android:textIsSelectable="true" + tools:text="Line1" /> - + - - - - + + diff --git a/app/src/main/res/layout/view_fav.xml b/app/src/main/res/layout/view_fav.xml index 34fee2b1b..2e5c65b28 100644 --- a/app/src/main/res/layout/view_fav.xml +++ b/app/src/main/res/layout/view_fav.xml @@ -22,7 +22,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingStart="@dimen/padding_normal" + android:paddingStart="@dimen/padding_small" android:paddingEnd="@dimen/padding_small"> + android:layout_height="wrap_content" + android:paddingStart="@dimen/padding_small" + android:paddingTop="@dimen/padding_xxsmall" + android:paddingEnd="@dimen/padding_small" + android:paddingBottom="@dimen/padding_xxsmall"> - - - - - - + android:ellipsize="end" + android:maxLines="1" + tools:text="Header" /> diff --git a/app/src/main/res/layout/view_header_shimmer.xml b/app/src/main/res/layout/view_header_shimmer.xml index 215e41e65..e517ad93f 100644 --- a/app/src/main/res/layout/view_header_shimmer.xml +++ b/app/src/main/res/layout/view_header_shimmer.xml @@ -27,33 +27,22 @@ + android:layout_height="wrap_content" + android:paddingStart="@dimen/padding_medium" + android:paddingTop="@dimen/padding_xsmall" + android:paddingEnd="@dimen/padding_small" + android:paddingBottom="@dimen/padding_xsmall"> - - - - - - + android:background="?colorShimmer" + android:ellipsize="end" + android:maxLines="1" /> diff --git a/app/src/main/res/layout/view_header_update.xml b/app/src/main/res/layout/view_header_update.xml index 4fcd92616..a6b9d04be 100644 --- a/app/src/main/res/layout/view_header_update.xml +++ b/app/src/main/res/layout/view_header_update.xml @@ -20,42 +20,30 @@ + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingStart="@dimen/padding_medium" + android:paddingTop="@dimen/padding_xsmall" + android:paddingEnd="@dimen/padding_small" + android:paddingBottom="@dimen/padding_xsmall"> - - - - - - + android:ellipsize="end" + android:gravity="center_vertical" + android:maxLines="1" + tools:text="Header" /> diff --git a/app/src/main/res/layout/view_info.xml b/app/src/main/res/layout/view_info.xml index 2d9559df8..2404f8cf3 100644 --- a/app/src/main/res/layout/view_info.xml +++ b/app/src/main/res/layout/view_info.xml @@ -21,33 +21,21 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingStart="@dimen/padding_normal" - android:paddingEnd="@dimen/padding_normal" - android:paddingTop="@dimen/padding_xsmall" - android:paddingBottom="@dimen/padding_xsmall"> + android:padding="@dimen/padding_xsmall"> - + android:textAlignment="viewStart" + tools:text="Title" /> - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/view_installer.xml b/app/src/main/res/layout/view_installer.xml index e6a802a19..29f5c0f42 100644 --- a/app/src/main/res/layout/view_installer.xml +++ b/app/src/main/res/layout/view_installer.xml @@ -20,8 +20,9 @@ + android:background="?android:selectableItemBackground" + android:orientation="horizontal" + android:padding="@dimen/padding_small"> - + android:background="?android:selectableItemBackground" + android:orientation="horizontal" + android:padding="@dimen/padding_small"> + android:layout_width="@dimen/icon_size_default" + android:layout_height="@dimen/icon_size_default" + android:layout_gravity="center_vertical" + tools:src="@drawable/ic_menu_about" /> - + + + android:orientation="vertical"> - + - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_locale.xml b/app/src/main/res/layout/view_locale.xml index 56ae4a234..21c94eb01 100644 --- a/app/src/main/res/layout/view_locale.xml +++ b/app/src/main/res/layout/view_locale.xml @@ -21,8 +21,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingStart="@dimen/padding_normal" - android:paddingEnd="@dimen/padding_small"> + android:padding="@dimen/padding_small"> @@ -48,6 +46,6 @@ android:layout_width="@dimen/icon_size_category" android:layout_height="@dimen/icon_size_category" android:layout_alignParentEnd="true" - android:layout_centerInParent="true" + android:layout_centerVertical="true" android:minWidth="0dp" /> diff --git a/app/src/main/res/layout/view_more_badge.xml b/app/src/main/res/layout/view_more_badge.xml index 299f801f4..8a9a198c7 100644 --- a/app/src/main/res/layout/view_more_badge.xml +++ b/app/src/main/res/layout/view_more_badge.xml @@ -18,12 +18,10 @@ --> + android:padding="@dimen/padding_xsmall"> + tools:text="Line1" /> + tools:text="Line2" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_no_app.xml b/app/src/main/res/layout/view_no_app.xml index 94d809208..b30269ada 100644 --- a/app/src/main/res/layout/view_no_app.xml +++ b/app/src/main/res/layout/view_no_app.xml @@ -28,7 +28,7 @@ android:layout_width="@dimen/icon_size" android:layout_height="@dimen/icon_size" android:layout_centerInParent="true" - app:tint="?android:textColorPrimary" + app:tint="?colorPrimary" tools:src="@drawable/ic_updates" /> + android:orientation="vertical" + android:padding="@dimen/padding_small"> + android:layout_toStartOf="@id/btn_action" + tools:text="Permission Title" /> + android:layout_below="@id/line1" + android:layout_toStartOf="@id/btn_action" + android:maxLines="3" + tools:text="Permission Description" /> + android:text="@string/action_grant" + app:iconPadding="@dimen/padding_small" /> diff --git a/app/src/main/res/layout/view_rating.xml b/app/src/main/res/layout/view_rating.xml index 8a3b38fa1..a28afae3a 100644 --- a/app/src/main/res/layout/view_rating.xml +++ b/app/src/main/res/layout/view_rating.xml @@ -34,7 +34,8 @@ android:layout_marginEnd="@dimen/margin_small" android:textAppearance="@style/TextAppearance.Aurora.Line1" android:textColor="?android:attr/textColorPrimary" - android:textStyle="bold" /> + android:textStyle="bold" + tools:text="4.0" /> diff --git a/app/src/main/res/layout/view_review.xml b/app/src/main/res/layout/view_review.xml index 8d4a4dd5c..c786db62a 100644 --- a/app/src/main/res/layout/view_review.xml +++ b/app/src/main/res/layout/view_review.xml @@ -24,51 +24,47 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:paddingStart="@dimen/padding_xsmall" - android:paddingEnd="@dimen/padding_xsmall"> + android:padding="@dimen/padding_xsmall"> + android:layout_marginEnd="@dimen/margin_small" /> - + android:ellipsize="end" + android:singleLine="true" + android:textAlignment="viewStart" + android:textSize="14sp" + tools:text="Author Name" /> - + - - - - + diff --git a/app/src/main/res/layout/view_state_button.xml b/app/src/main/res/layout/view_state_button.xml index dcf9d58a2..ba6bdd0db 100644 --- a/app/src/main/res/layout/view_state_button.xml +++ b/app/src/main/res/layout/view_state_button.xml @@ -25,20 +25,14 @@ @@ -49,11 +43,7 @@ android:layout_height="@dimen/icon_size_default" android:layout_alignEnd="@id/btn" android:layout_centerVertical="true" - android:layout_marginEnd="@dimen/icon_size_default" + android:layout_marginEnd="@dimen/margin_large" android:elevation="8dp" android:visibility="invisible" /> - - - - diff --git a/app/src/main/res/drawable/bg_circle.xml b/app/src/main/res/layout/view_text_divider.xml similarity index 57% rename from app/src/main/res/drawable/bg_circle.xml rename to app/src/main/res/layout/view_text_divider.xml index ab74b3dcb..9ac907296 100644 --- a/app/src/main/res/drawable/bg_circle.xml +++ b/app/src/main/res/layout/view_text_divider.xml @@ -17,8 +17,19 @@ ~ --> - - - + + + diff --git a/app/src/main/res/layout/view_toolbar_native.xml b/app/src/main/res/layout/view_toolbar_native.xml index 6ae162a55..266e9115b 100644 --- a/app/src/main/res/layout/view_toolbar_native.xml +++ b/app/src/main/res/layout/view_toolbar_native.xml @@ -30,4 +30,4 @@ android:layout_height="wrap_content" android:background="?android:windowBackground" app:layout_scrollFlags="enterAlways|exitUntilCollapsed" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/view_update_button.xml b/app/src/main/res/layout/view_update_button.xml index 773b548e1..18a0bccbe 100644 --- a/app/src/main/res/layout/view_update_button.xml +++ b/app/src/main/res/layout/view_update_button.xml @@ -36,7 +36,6 @@ - + --> + Wiki Find answers to frequently asked questions (F.A.Q.), troubleshooting steps and more "BHIM - UPI" @@ -198,6 +198,7 @@ "External Storage Manager" "Installer Permission" "Allow installing apps from Aurora Store" + "Allow installation of apps from unknown sources" "Notifications" "Send notifications regarding installations status" "Background Downloads" @@ -308,6 +309,7 @@ "Copied to clipboard" Turn on developer settings from the device settings to open them. "Permission granted" + "You need to grant Installer Permission first" Device spoof applied. "App purchases not available on Anonymous accounts." "The version code you are requesting is unavailable." @@ -347,6 +349,8 @@ Menu Expand %1$s • API %2$s + Required + Optional Required permissions were denied. Please grant them in order to continue the action Search for Apps & Games Requesting new session diff --git a/app/src/main/res/values/styles_widget.xml b/app/src/main/res/values/styles_widget.xml index d54a14dca..7ba934543 100644 --- a/app/src/main/res/values/styles_widget.xml +++ b/app/src/main/res/values/styles_widget.xml @@ -18,6 +18,7 @@ --> +