Allow selecting default tab, disable For You Page & add quick exit

This commit is contained in:
Rahul Kumar Patel
2021-04-04 02:12:10 +05:30
parent 002a018993
commit e8ce479269
10 changed files with 195 additions and 66 deletions

View File

@@ -155,7 +155,6 @@ class MainActivity : BaseActivity() {
val backGroundColor = getStyledAttributeColor(android.R.attr.colorBackground) val backGroundColor = getStyledAttributeColor(android.R.attr.colorBackground)
bottomNavigationView.setBackgroundColor(ColorUtils.setAlphaComponent(backGroundColor, 245)) bottomNavigationView.setBackgroundColor(ColorUtils.setAlphaComponent(backGroundColor, 245))
bottomNavigationView.setOnNavigationItemSelectedListener { item -> bottomNavigationView.setOnNavigationItemSelectedListener { item ->
if (item.itemId == bottomNavigationView.selectedItemId) if (item.itemId == bottomNavigationView.selectedItemId)
return@setOnNavigationItemSelectedListener false 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() { private fun attachDrawer() {
@@ -226,11 +236,15 @@ class MainActivity : BaseActivity() {
if (B.drawerLayout.isDrawerOpen(GravityCompat.START)) { if (B.drawerLayout.isDrawerOpen(GravityCompat.START)) {
B.drawerLayout.close() B.drawerLayout.close()
} else if (!navController.navigateUp()) { } else if (!navController.navigateUp()) {
if (lastBackPressed + 1000 > System.currentTimeMillis()) { if (Preferences.getBoolean(this, Preferences.PREFERENCE_QUICK_EXIT)) {
super.onBackPressed() super.onBackPressed()
} else { } else {
lastBackPressed = System.currentTimeMillis() if (lastBackPressed + 1000 > System.currentTimeMillis()) {
Toast.makeText(this, "Click twice to exit", Toast.LENGTH_SHORT).show() super.onBackPressed()
} else {
lastBackPressed = System.currentTimeMillis()
Toast.makeText(this, "Click twice to exit", Toast.LENGTH_SHORT).show()
}
} }
} }
} }

View File

@@ -32,6 +32,9 @@ object Preferences {
const val PREFERENCE_INSTALLER_ID = "PREFERENCE_INSTALLER_ID" const val PREFERENCE_INSTALLER_ID = "PREFERENCE_INSTALLER_ID"
const val PREFERENCE_THEME_TYPE = "PREFERENCE_THEME_TYPE" const val PREFERENCE_THEME_TYPE = "PREFERENCE_THEME_TYPE"
const val PREFERENCE_THEME_ACCENT = "PREFERENCE_THEME_ACCENT" 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_INTRO = "PREFERENCE_INTRO"
const val PREFERENCE_FILTER_GOOGLE = "PREFERENCE_FILTER_GOOGLE" const val PREFERENCE_FILTER_GOOGLE = "PREFERENCE_FILTER_GOOGLE"

View File

@@ -31,6 +31,7 @@ import com.aurora.gplayapi.data.models.AuthData
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentAppsGamesBinding 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.CategoryFragment
import com.aurora.store.view.ui.commons.EditorChoiceFragment import com.aurora.store.view.ui.commons.EditorChoiceFragment
import com.aurora.store.view.ui.commons.ForYouFragment import com.aurora.store.view.ui.commons.ForYouFragment
@@ -65,42 +66,67 @@ class AppsContainerFragment : Fragment() {
} }
private fun setupViewPager() { 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 B.pager.isUserInputEnabled = false //Disable viewpager scroll to avoid scroll conflicts
TabLayoutMediator(B.tabLayout, B.pager, true) { tab: TabLayout.Tab, position: Int -> val tabTitles: MutableList<String> = mutableListOf<String>().apply {
when (position) { if (isForYouEnabled) {
0 -> tab.text = getString(R.string.tab_for_you) add(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 -> {
}
} }
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() }.attach()
} }
internal class ViewPagerAdapter( internal class ViewPagerAdapter(
fragment: FragmentManager, fragment: FragmentManager,
lifecycle: Lifecycle, lifecycle: Lifecycle,
private val isAnonymous: Boolean private val isGoogleAccount: Boolean,
private val isForYouEnabled: Boolean
) : ) :
FragmentStateAdapter(fragment, lifecycle) { FragmentStateAdapter(fragment, lifecycle) {
override fun createFragment(position: Int): Fragment {
return when (position) { private val tabFragments: MutableList<Fragment> = mutableListOf<Fragment>().apply {
0 -> ForYouFragment.newInstance(0) if (isForYouEnabled) {
1 -> TopChartContainerFragment() add(ForYouFragment.newInstance(0))
2 -> CategoryFragment.newInstance(0) }
3 -> EditorChoiceFragment.newInstance(0)
else -> Fragment() 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 { override fun getItemCount(): Int {
return if (isAnonymous) return tabFragments.size
3
else
4
} }
} }
} }

View File

@@ -32,6 +32,7 @@ import com.aurora.gplayapi.data.models.AuthData
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentTopChartBinding import com.aurora.store.databinding.FragmentTopChartBinding
import com.aurora.store.view.ui.games.TopChartFragment
class TopChartContainerFragment : Fragment() { class TopChartContainerFragment : Fragment() {
@@ -87,18 +88,19 @@ class TopChartContainerFragment : Fragment() {
internal class ViewPagerAdapter(fragment: FragmentManager, lifecycle: Lifecycle) : internal class ViewPagerAdapter(fragment: FragmentManager, lifecycle: Lifecycle) :
FragmentStateAdapter(fragment, lifecycle) { FragmentStateAdapter(fragment, lifecycle) {
private val tabFragments: MutableList<TopChartFragment> = mutableListOf(
TopChartFragment.newInstance(0, 0),
TopChartFragment.newInstance(0, 1),
TopChartFragment.newInstance(0, 2),
TopChartFragment.newInstance(0, 3)
)
override fun createFragment(position: Int): Fragment { override fun createFragment(position: Int): Fragment {
return when (position) { return tabFragments[position]
0 -> TopChartFragment.newInstance(0, 0)
1 -> TopChartFragment.newInstance(0, 1)
2 -> TopChartFragment.newInstance(0, 2)
3 -> TopChartFragment.newInstance(0, 3)
else -> Fragment()
}
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
return 4 return tabFragments.size
} }
} }
} }

View File

@@ -31,8 +31,8 @@ import com.aurora.gplayapi.data.models.AuthData
import com.aurora.store.R import com.aurora.store.R
import com.aurora.store.data.providers.AuthProvider import com.aurora.store.data.providers.AuthProvider
import com.aurora.store.databinding.FragmentAppsGamesBinding 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.CategoryFragment
import com.aurora.store.view.ui.commons.EarlyAccessFragment
import com.aurora.store.view.ui.commons.EditorChoiceFragment import com.aurora.store.view.ui.commons.EditorChoiceFragment
import com.aurora.store.view.ui.commons.ForYouFragment import com.aurora.store.view.ui.commons.ForYouFragment
import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayout
@@ -66,44 +66,66 @@ class GamesContainerFragment : Fragment() {
} }
private fun setupViewPager() { 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 B.pager.isUserInputEnabled = false
TabLayoutMediator(B.tabLayout, B.pager, true) { tab: TabLayout.Tab, position: Int -> val tabTitles: MutableList<String> = mutableListOf<String>().apply {
when (position) { if (isForYouEnabled) {
0 -> tab.text = "For you" add(getString(R.string.tab_for_you))
1 -> tab.text = "Top charts"
2 -> tab.text = "Categories"
3 -> tab.text = "Early access"
4 -> tab.text = "Editor choice"
else -> {
}
} }
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() }.attach()
} }
internal class ViewPagerAdapter( internal class ViewPagerAdapter(
fragment: FragmentManager, fragment: FragmentManager,
lifecycle: Lifecycle, lifecycle: Lifecycle,
private val isAnonymous: Boolean private val isGoogleAccount: Boolean,
private val isForYouEnabled: Boolean
) : ) :
FragmentStateAdapter(fragment, lifecycle) { FragmentStateAdapter(fragment, lifecycle) {
override fun createFragment(position: Int): Fragment { private val tabFragments: MutableList<Fragment> = mutableListOf<Fragment>().apply {
return when (position) { if (isForYouEnabled) {
0 -> ForYouFragment.newInstance(1) add(ForYouFragment.newInstance(1))
1 -> TopChartContainerFragment() }
2 -> CategoryFragment.newInstance(1)
3 -> EarlyAccessFragment.newInstance(1) add(TopChartContainerFragment())
4 -> EditorChoiceFragment.newInstance(1) add(CategoryFragment.newInstance(1))
else -> Fragment()
if (isGoogleAccount) {
add(EditorChoiceFragment.newInstance(1))
} }
} }
override fun createFragment(position: Int): Fragment {
return tabFragments[position]
}
override fun getItemCount(): Int { override fun getItemCount(): Int {
return if (isAnonymous) return tabFragments.size
3
else
5
} }
} }
} }

View File

@@ -87,18 +87,20 @@ class TopChartContainerFragment : Fragment() {
internal class ViewPagerAdapter(fragment: FragmentManager, lifecycle: Lifecycle) : internal class ViewPagerAdapter(fragment: FragmentManager, lifecycle: Lifecycle) :
FragmentStateAdapter(fragment, lifecycle) { FragmentStateAdapter(fragment, lifecycle) {
private val tabFragments: MutableList<TopChartFragment> = mutableListOf(
TopChartFragment.newInstance(1, 0),
TopChartFragment.newInstance(1, 1),
TopChartFragment.newInstance(1, 2),
TopChartFragment.newInstance(1, 3)
)
override fun createFragment(position: Int): Fragment { override fun createFragment(position: Int): Fragment {
return when (position) { return tabFragments[position]
0 -> TopChartFragment.newInstance(1, 0)
1 -> TopChartFragment.newInstance(1, 1)
2 -> TopChartFragment.newInstance(1, 2)
3 -> TopChartFragment.newInstance(1, 3)
else -> Fragment()
}
} }
override fun getItemCount(): Int { override fun getItemCount(): Int {
return 4 return tabFragments.size
} }
} }
} }

View File

@@ -32,13 +32,16 @@ import com.aurora.store.databinding.ActivityOnboardingBinding
import com.aurora.store.util.Preferences import com.aurora.store.util.Preferences
import com.aurora.store.util.Preferences.PREFERENCE_AUTO_DELETE 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
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_ACTIVE
import com.aurora.store.util.Preferences.PREFERENCE_DOWNLOAD_EXTERNAL 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_FDROID
import com.aurora.store.util.Preferences.PREFERENCE_FILTER_GOOGLE 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_INSECURE_ANONYMOUS
import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID import com.aurora.store.util.Preferences.PREFERENCE_INSTALLER_ID
import com.aurora.store.util.Preferences.PREFERENCE_INTRO 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_ACCENT
import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE import com.aurora.store.util.Preferences.PREFERENCE_THEME_TYPE
import com.aurora.store.util.save import com.aurora.store.util.save
@@ -159,9 +162,12 @@ class OnboardingActivity : BaseActivity() {
/*Network*/ /*Network*/
save(PREFERENCE_INSECURE_ANONYMOUS, false) save(PREFERENCE_INSECURE_ANONYMOUS, false)
/*Theme*/ /*Customization*/
save(PREFERENCE_THEME_TYPE, 0) save(PREFERENCE_THEME_TYPE, 0)
save(PREFERENCE_THEME_ACCENT, 0) save(PREFERENCE_THEME_ACCENT, 0)
save(PREFERENCE_DEFAULT_SELECTED_TAB, 0)
save(PREFERENCE_QUICK_EXIT, false)
save(PREFERENCE_FOR_YOU, true)
/*Installer*/ /*Installer*/
save(PREFERENCE_AUTO_DELETE, true) save(PREFERENCE_AUTO_DELETE, true)

View File

@@ -159,4 +159,17 @@
<item>@string/about_telegram_summary</item> <item>@string/about_telegram_summary</item>
<item>@string/about_fdroid_summary</item> <item>@string/about_fdroid_summary</item>
</string-array> </string-array>
<string-array name="pref_default_tab">
<item>@string/title_apps</item>
<item>@string/title_games</item>
<item>@string/title_updates</item>
</string-array>
<string-array name="pref_default_tab_values">
<item>0</item>
<item>1</item>
<item>2</item>
</string-array>
</resources> </resources>

View File

@@ -257,6 +257,8 @@
<string name="pref_abandon_session">"Force clear installation sessions"</string> <string name="pref_abandon_session">"Force clear installation sessions"</string>
<string name="pref_abandon_session_desc">"Clear abandon or pending installation sessions"</string> <string name="pref_abandon_session_desc">"Clear abandon or pending installation sessions"</string>
<string name="pref_app_download">"Downloads"</string> <string name="pref_app_download">"Downloads"</string>
<string name="pref_common_advance">"Advance"</string>
<string name="pref_common_extra">"Extras"</string>
<string name="pref_dialog_to_apply_restart">"This setting will be applied after you restart the app"</string> <string name="pref_dialog_to_apply_restart">"This setting will be applied after you restart the app"</string>
<string name="pref_downloader_active_summary">"Maximum number of active downloads"</string> <string name="pref_downloader_active_summary">"Maximum number of active downloads"</string>
<string name="pref_downloader_active_title">"Active download"</string> <string name="pref_downloader_active_title">"Active download"</string>
@@ -290,6 +292,12 @@
<string name="pref_ui_theme_system">"Follow System"</string> <string name="pref_ui_theme_system">"Follow System"</string>
<string name="pref_ui_theme_title">"Theme"</string> <string name="pref_ui_theme_title">"Theme"</string>
<string name="pref_ui_title">"Customization"</string> <string name="pref_ui_title">"Customization"</string>
<string name="pref_ui_layout">"Layout"</string>
<string name="pref_ui_layout_tab">"Select default tab"</string>
<string name="pref_ui_quick_exit">"Quick exit"</string>
<string name="pref_ui_quick_exit_desc">"Exit app on single back action"</string>
<string name="pref_ui_no_for_you">"For You Pages"</string>
<string name="pref_ui_no_for_you_desc">"Display For You Pages on home screen"</string>
<string name="purchase_failed">"Download Failed"</string> <string name="purchase_failed">"Download Failed"</string>
<string name="purchase_invalid">"App not purchased"</string> <string name="purchase_invalid">"App not purchased"</string>
<string name="purchase_unsupported">"App not supported"</string> <string name="purchase_unsupported">"App not supported"</string>

View File

@@ -36,4 +36,37 @@
app:key="PREFERENCE_THEME_ACCENT" app:key="PREFERENCE_THEME_ACCENT"
app:title="@string/pref_ui_accent_title" app:title="@string/pref_ui_accent_title"
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<PreferenceCategory
app:iconSpaceReserved="false"
app:singleLineTitle="false"
app:title="@string/pref_ui_layout" />
<com.aurora.store.view.custom.preference.AuroraListPreference
app:defaultValue="0"
app:entries="@array/pref_default_tab"
app:entryValues="@array/pref_default_tab_values"
app:iconSpaceReserved="false"
app:key="PREFERENCE_DEFAULT_SELECTED_TAB"
app:title="@string/pref_ui_layout_tab"
app:useSimpleSummaryProvider="true" />
<PreferenceCategory
app:iconSpaceReserved="false"
app:singleLineTitle="false"
app:title="@string/pref_common_extra" />
<SwitchPreferenceCompat
app:defaultValue="false"
app:iconSpaceReserved="false"
app:key="PREFERENCE_QUICK_EXIT"
app:summary="@string/pref_ui_quick_exit_desc"
app:title="@string/pref_ui_quick_exit" />
<SwitchPreferenceCompat
app:defaultValue="true"
app:iconSpaceReserved="false"
app:key="PREFERENCE_FOR_YOU"
app:summary="@string/pref_ui_no_for_you_desc"
app:title="@string/pref_ui_no_for_you" />
</androidx.preference.PreferenceScreen> </androidx.preference.PreferenceScreen>