diff --git a/app/src/main/java/com/aurora/store/MainActivity.kt b/app/src/main/java/com/aurora/store/MainActivity.kt index 6950ecef7..7a598a997 100644 --- a/app/src/main/java/com/aurora/store/MainActivity.kt +++ b/app/src/main/java/com/aurora/store/MainActivity.kt @@ -155,7 +155,6 @@ class MainActivity : BaseActivity() { val backGroundColor = getStyledAttributeColor(android.R.attr.colorBackground) bottomNavigationView.setBackgroundColor(ColorUtils.setAlphaComponent(backGroundColor, 245)) - bottomNavigationView.setOnNavigationItemSelectedListener { item -> if (item.itemId == bottomNavigationView.selectedItemId) return@setOnNavigationItemSelectedListener false @@ -173,6 +172,17 @@ class MainActivity : BaseActivity() { } } } + + val defaultTab = Preferences.getInteger(this, Preferences.PREFERENCE_DEFAULT_SELECTED_TAB) + val graph = navController.graph + + when (defaultTab) { + 0 -> graph.startDestination = R.id.navigation_apps + 1 -> graph.startDestination = R.id.navigation_games + 2 -> graph.startDestination = R.id.navigation_updates + } + + navController.graph = graph } private fun attachDrawer() { @@ -226,11 +236,15 @@ class MainActivity : BaseActivity() { if (B.drawerLayout.isDrawerOpen(GravityCompat.START)) { B.drawerLayout.close() } else if (!navController.navigateUp()) { - if (lastBackPressed + 1000 > System.currentTimeMillis()) { + if (Preferences.getBoolean(this, Preferences.PREFERENCE_QUICK_EXIT)) { super.onBackPressed() } else { - lastBackPressed = System.currentTimeMillis() - Toast.makeText(this, "Click twice to exit", Toast.LENGTH_SHORT).show() + if (lastBackPressed + 1000 > System.currentTimeMillis()) { + super.onBackPressed() + } else { + lastBackPressed = System.currentTimeMillis() + Toast.makeText(this, "Click twice to exit", Toast.LENGTH_SHORT).show() + } } } } diff --git a/app/src/main/java/com/aurora/store/util/Preferences.kt b/app/src/main/java/com/aurora/store/util/Preferences.kt index 0aed8bf9e..e776243c7 100644 --- a/app/src/main/java/com/aurora/store/util/Preferences.kt +++ b/app/src/main/java/com/aurora/store/util/Preferences.kt @@ -32,6 +32,9 @@ object Preferences { const val PREFERENCE_INSTALLER_ID = "PREFERENCE_INSTALLER_ID" const val PREFERENCE_THEME_TYPE = "PREFERENCE_THEME_TYPE" const val PREFERENCE_THEME_ACCENT = "PREFERENCE_THEME_ACCENT" + const val PREFERENCE_DEFAULT_SELECTED_TAB = "PREFERENCE_DEFAULT_SELECTED_TAB" + const val PREFERENCE_QUICK_EXIT = "PREFERENCE_QUICK_EXIT" + const val PREFERENCE_FOR_YOU = "PREFERENCE_FOR_YOU" const val PREFERENCE_INTRO = "PREFERENCE_INTRO" const val PREFERENCE_FILTER_GOOGLE = "PREFERENCE_FILTER_GOOGLE" diff --git a/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt index 307f68001..7b2402cb5 100644 --- a/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/apps/AppsContainerFragment.kt @@ -31,6 +31,7 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.store.R import com.aurora.store.data.providers.AuthProvider import com.aurora.store.databinding.FragmentAppsGamesBinding +import com.aurora.store.util.Preferences import com.aurora.store.view.ui.commons.CategoryFragment import com.aurora.store.view.ui.commons.EditorChoiceFragment import com.aurora.store.view.ui.commons.ForYouFragment @@ -65,42 +66,67 @@ class AppsContainerFragment : Fragment() { } private fun setupViewPager() { - B.pager.adapter = ViewPagerAdapter(childFragmentManager, lifecycle, authData.isAnonymous) + val isForYouEnabled = Preferences.getBoolean( + requireContext(), + Preferences.PREFERENCE_FOR_YOU + ) + + val isGoogleAccount = !authData.isAnonymous + + B.pager.adapter = ViewPagerAdapter( + childFragmentManager, + lifecycle, + isGoogleAccount, + isForYouEnabled + ) + B.pager.isUserInputEnabled = false //Disable viewpager scroll to avoid scroll conflicts - TabLayoutMediator(B.tabLayout, B.pager, true) { tab: TabLayout.Tab, position: Int -> - when (position) { - 0 -> tab.text = getString(R.string.tab_for_you) - 1 -> tab.text = getString(R.string.tab_top_charts) - 2 -> tab.text = getString(R.string.tab_categories) - 3 -> tab.text = getString(R.string.tab_editor_choice) - else -> { - } + val tabTitles: MutableList = mutableListOf().apply { + if (isForYouEnabled) { + add(getString(R.string.tab_for_you)) } + + add(getString(R.string.tab_top_charts)) + add(getString(R.string.tab_categories)) + + if (isGoogleAccount) { + add(getString(R.string.tab_editor_choice)) + } + } + + TabLayoutMediator(B.tabLayout, B.pager, true) { tab: TabLayout.Tab, position: Int -> + tab.text = tabTitles[position] }.attach() } internal class ViewPagerAdapter( fragment: FragmentManager, lifecycle: Lifecycle, - private val isAnonymous: Boolean + private val isGoogleAccount: Boolean, + private val isForYouEnabled: Boolean ) : FragmentStateAdapter(fragment, lifecycle) { - override fun createFragment(position: Int): Fragment { - return when (position) { - 0 -> ForYouFragment.newInstance(0) - 1 -> TopChartContainerFragment() - 2 -> CategoryFragment.newInstance(0) - 3 -> EditorChoiceFragment.newInstance(0) - else -> Fragment() + + private val tabFragments: MutableList = mutableListOf().apply { + if (isForYouEnabled) { + add(ForYouFragment.newInstance(0)) + } + + add(TopChartContainerFragment()) + add(CategoryFragment.newInstance(0)) + + if (isGoogleAccount) { + add(EditorChoiceFragment.newInstance(0)) } } + override fun createFragment(position: Int): Fragment { + return tabFragments[position] + } + override fun getItemCount(): Int { - return if (isAnonymous) - 3 - else - 4 + return tabFragments.size } } } \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/ui/apps/TopChartContainerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/apps/TopChartContainerFragment.kt index 3140d9a19..b9d56cc71 100644 --- a/app/src/main/java/com/aurora/store/view/ui/apps/TopChartContainerFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/apps/TopChartContainerFragment.kt @@ -32,6 +32,7 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.store.R import com.aurora.store.data.providers.AuthProvider import com.aurora.store.databinding.FragmentTopChartBinding +import com.aurora.store.view.ui.games.TopChartFragment class TopChartContainerFragment : Fragment() { @@ -87,18 +88,19 @@ class TopChartContainerFragment : Fragment() { internal class ViewPagerAdapter(fragment: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fragment, lifecycle) { + private val tabFragments: MutableList = mutableListOf( + TopChartFragment.newInstance(0, 0), + TopChartFragment.newInstance(0, 1), + TopChartFragment.newInstance(0, 2), + TopChartFragment.newInstance(0, 3) + ) + override fun createFragment(position: Int): Fragment { - return when (position) { - 0 -> TopChartFragment.newInstance(0, 0) - 1 -> TopChartFragment.newInstance(0, 1) - 2 -> TopChartFragment.newInstance(0, 2) - 3 -> TopChartFragment.newInstance(0, 3) - else -> Fragment() - } + return tabFragments[position] } override fun getItemCount(): Int { - return 4 + return tabFragments.size } } } \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/ui/games/GamesContainerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/games/GamesContainerFragment.kt index 0850681bf..7620e4837 100644 --- a/app/src/main/java/com/aurora/store/view/ui/games/GamesContainerFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/games/GamesContainerFragment.kt @@ -31,8 +31,8 @@ import com.aurora.gplayapi.data.models.AuthData import com.aurora.store.R import com.aurora.store.data.providers.AuthProvider import com.aurora.store.databinding.FragmentAppsGamesBinding +import com.aurora.store.util.Preferences import com.aurora.store.view.ui.commons.CategoryFragment -import com.aurora.store.view.ui.commons.EarlyAccessFragment import com.aurora.store.view.ui.commons.EditorChoiceFragment import com.aurora.store.view.ui.commons.ForYouFragment import com.google.android.material.tabs.TabLayout @@ -66,44 +66,66 @@ class GamesContainerFragment : Fragment() { } private fun setupViewPager() { - B.pager.adapter = ViewPagerAdapter(childFragmentManager, lifecycle, authData.isAnonymous) + val isForYouEnabled = Preferences.getBoolean( + requireContext(), + Preferences.PREFERENCE_FOR_YOU + ) + + val isGoogleAccount = !authData.isAnonymous + + B.pager.adapter = ViewPagerAdapter( + childFragmentManager, + lifecycle, + isGoogleAccount, + isForYouEnabled + ) + B.pager.isUserInputEnabled = false - TabLayoutMediator(B.tabLayout, B.pager, true) { tab: TabLayout.Tab, position: Int -> - when (position) { - 0 -> tab.text = "For you" - 1 -> tab.text = "Top charts" - 2 -> tab.text = "Categories" - 3 -> tab.text = "Early access" - 4 -> tab.text = "Editor choice" - else -> { - } + val tabTitles: MutableList = mutableListOf().apply { + if (isForYouEnabled) { + add(getString(R.string.tab_for_you)) } + + add(getString(R.string.tab_top_charts)) + add(getString(R.string.tab_categories)) + + if (isGoogleAccount) { + add(getString(R.string.tab_editor_choice)) + } + } + + TabLayoutMediator(B.tabLayout, B.pager, true) { tab: TabLayout.Tab, position: Int -> + tab.text = tabTitles[position] }.attach() } internal class ViewPagerAdapter( fragment: FragmentManager, lifecycle: Lifecycle, - private val isAnonymous: Boolean + private val isGoogleAccount: Boolean, + private val isForYouEnabled: Boolean ) : FragmentStateAdapter(fragment, lifecycle) { - override fun createFragment(position: Int): Fragment { - return when (position) { - 0 -> ForYouFragment.newInstance(1) - 1 -> TopChartContainerFragment() - 2 -> CategoryFragment.newInstance(1) - 3 -> EarlyAccessFragment.newInstance(1) - 4 -> EditorChoiceFragment.newInstance(1) - else -> Fragment() + private val tabFragments: MutableList = mutableListOf().apply { + if (isForYouEnabled) { + add(ForYouFragment.newInstance(1)) + } + + add(TopChartContainerFragment()) + add(CategoryFragment.newInstance(1)) + + if (isGoogleAccount) { + add(EditorChoiceFragment.newInstance(1)) } } + override fun createFragment(position: Int): Fragment { + return tabFragments[position] + } + override fun getItemCount(): Int { - return if (isAnonymous) - 3 - else - 5 + return tabFragments.size } } } \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/ui/games/TopChartContainerFragment.kt b/app/src/main/java/com/aurora/store/view/ui/games/TopChartContainerFragment.kt index 10c1b2e9e..8df4359e0 100644 --- a/app/src/main/java/com/aurora/store/view/ui/games/TopChartContainerFragment.kt +++ b/app/src/main/java/com/aurora/store/view/ui/games/TopChartContainerFragment.kt @@ -87,18 +87,20 @@ class TopChartContainerFragment : Fragment() { internal class ViewPagerAdapter(fragment: FragmentManager, lifecycle: Lifecycle) : FragmentStateAdapter(fragment, lifecycle) { + + private val tabFragments: MutableList = mutableListOf( + TopChartFragment.newInstance(1, 0), + TopChartFragment.newInstance(1, 1), + TopChartFragment.newInstance(1, 2), + TopChartFragment.newInstance(1, 3) + ) + override fun createFragment(position: Int): Fragment { - return when (position) { - 0 -> TopChartFragment.newInstance(1, 0) - 1 -> TopChartFragment.newInstance(1, 1) - 2 -> TopChartFragment.newInstance(1, 2) - 3 -> TopChartFragment.newInstance(1, 3) - else -> Fragment() - } + return tabFragments[position] } override fun getItemCount(): Int { - return 4 + return tabFragments.size } } } \ No newline at end of file diff --git a/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingActivity.kt b/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingActivity.kt index 46792ad6e..e5471cf96 100644 --- a/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingActivity.kt +++ b/app/src/main/java/com/aurora/store/view/ui/onboarding/OnboardingActivity.kt @@ -32,13 +32,16 @@ import com.aurora.store.databinding.ActivityOnboardingBinding import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences.PREFERENCE_AUTO_DELETE import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT +import com.aurora.store.util.Preferences.PREFERENCE_DEFAULT_SELECTED_TAB import com.aurora.store.util.Preferences.PREFERENCE_DOWNLOAD_ACTIVE import com.aurora.store.util.Preferences.PREFERENCE_DOWNLOAD_EXTERNAL import com.aurora.store.util.Preferences.PREFERENCE_FILTER_FDROID import com.aurora.store.util.Preferences.PREFERENCE_FILTER_GOOGLE +import com.aurora.store.util.Preferences.PREFERENCE_FOR_YOU import com.aurora.store.util.Preferences.PREFERENCE_INSECURE_ANONYMOUS import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID import com.aurora.store.util.Preferences.PREFERENCE_INTRO +import com.aurora.store.util.Preferences.PREFERENCE_QUICK_EXIT import com.aurora.store.util.Preferences.PREFERENCE_THEME_ACCENT import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE import com.aurora.store.util.save @@ -159,9 +162,12 @@ class OnboardingActivity : BaseActivity() { /*Network*/ save(PREFERENCE_INSECURE_ANONYMOUS, false) - /*Theme*/ + /*Customization*/ save(PREFERENCE_THEME_TYPE, 0) save(PREFERENCE_THEME_ACCENT, 0) + save(PREFERENCE_DEFAULT_SELECTED_TAB, 0) + save(PREFERENCE_QUICK_EXIT, false) + save(PREFERENCE_FOR_YOU, true) /*Installer*/ save(PREFERENCE_AUTO_DELETE, true) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 4a82627f6..1d483749e 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -159,4 +159,17 @@ @string/about_telegram_summary @string/about_fdroid_summary + + + @string/title_apps + @string/title_games + @string/title_updates + + + + 0 + 1 + 2 + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c63a44ff..fd1bd10c0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -257,6 +257,8 @@ "Force clear installation sessions" "Clear abandon or pending installation sessions" "Downloads" + "Advance" + "Extras" "This setting will be applied after you restart the app" "Maximum number of active downloads" "Active download" @@ -290,6 +292,12 @@ "Follow System" "Theme" "Customization" + "Layout" + "Select default tab" + "Quick exit" + "Exit app on single back action" + "For You Pages" + "Display For You Pages on home screen" "Download Failed" "App not purchased" "App not supported" diff --git a/app/src/main/res/xml/preferences_ui.xml b/app/src/main/res/xml/preferences_ui.xml index 5dd254930..dfeba122a 100644 --- a/app/src/main/res/xml/preferences_ui.xml +++ b/app/src/main/res/xml/preferences_ui.xml @@ -36,4 +36,37 @@ app:key="PREFERENCE_THEME_ACCENT" app:title="@string/pref_ui_accent_title" app:useSimpleSummaryProvider="true" /> + + + + + + + + + +