move tabs at the bottom

This commit is contained in:
tibbi 2022-06-23 22:50:57 +02:00
parent 9e614c9e35
commit 489b5d859d
2 changed files with 57 additions and 81 deletions

View File

@ -7,7 +7,6 @@ import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.ShortcutInfo import android.content.pm.ShortcutInfo
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.Icon import android.graphics.drawable.Icon
import android.graphics.drawable.LayerDrawable import android.graphics.drawable.LayerDrawable
@ -17,6 +16,8 @@ import android.provider.CallLog
import android.provider.Settings import android.provider.Settings
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat import androidx.core.view.MenuItemCompat
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
@ -53,7 +54,6 @@ class MainActivity : SimpleActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID) appLaunched(BuildConfig.APPLICATION_ID)
setupTabColors()
launchedDialer = savedInstanceState?.getBoolean(OPEN_DIAL_PAD_AT_LAUNCH) ?: false launchedDialer = savedInstanceState?.getBoolean(OPEN_DIAL_PAD_AT_LAUNCH) ?: false
@ -73,8 +73,7 @@ class MainActivity : SimpleActivity() {
launchSetDefaultDialerIntent() launchSetDefaultDialerIntent()
} }
hideTabs() setupTabs()
SimpleContact.sorting = config.sorting SimpleContact.sorting = config.sorting
} }
@ -92,19 +91,7 @@ class MainActivity : SimpleActivity() {
background.applyColorFilter(properPrimaryColor) background.applyColorFilter(properPrimaryColor)
} }
main_tabs_holder.setBackgroundColor(getProperBackgroundColor()) setupTabColors()
main_tabs_holder.setSelectedTabIndicatorColor(properPrimaryColor)
if (viewpager.adapter != null) {
getInactiveTabIndexes(viewpager.currentItem).forEach {
main_tabs_holder.getTabAt(it)?.icon?.applyColorFilter(getProperTextColor())
}
main_tabs_holder.getTabAt(viewpager.currentItem)?.icon?.applyColorFilter(properPrimaryColor)
getAllFragments().forEach {
it?.setupColors(getProperTextColor(), getProperPrimaryColor(), getProperPrimaryColor())
}
}
if (!isSearchOpen) { if (!isSearchOpen) {
if (storedShowTabs != config.showTabs) { if (storedShowTabs != config.showTabs) {
@ -123,7 +110,7 @@ class MainActivity : SimpleActivity() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
storedShowTabs = config.showTabs storedShowTabs = config.showTabs
config.lastUsedViewPagerPage = viewpager.currentItem config.lastUsedViewPagerPage = view_pager.currentItem
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@ -246,34 +233,20 @@ class MainActivity : SimpleActivity() {
} }
private fun setupTabColors() { private fun setupTabColors() {
val lastUsedPage = getDefaultTab() val activeView = main_tabs_holder.getTabAt(view_pager.currentItem)?.customView
main_tabs_holder.apply { updateBottomTabItemColors(activeView, true)
background = ColorDrawable(getProperBackgroundColor())
setSelectedTabIndicatorColor(getProperPrimaryColor())
getTabAt(lastUsedPage)?.select()
getTabAt(lastUsedPage)?.icon?.applyColorFilter(getProperPrimaryColor())
getInactiveTabIndexes(lastUsedPage).forEach { getInactiveTabIndexes(view_pager.currentItem).forEach { index ->
getTabAt(it)?.icon?.applyColorFilter(getProperTextColor()) val inactiveView = main_tabs_holder.getTabAt(index)?.customView
} updateBottomTabItemColors(inactiveView, false)
} }
main_tabs_holder.onTabSelectionChanged(
tabUnselectedAction = {
it.icon?.applyColorFilter(getProperTextColor())
},
tabSelectedAction = {
viewpager.currentItem = it.position
it.icon?.applyColorFilter(getProperPrimaryColor())
}
)
} }
private fun getInactiveTabIndexes(activeIndex: Int) = (0 until tabsList.size).filter { it != activeIndex } private fun getInactiveTabIndexes(activeIndex: Int) = (0 until tabsList.size).filter { it != activeIndex }
private fun initFragments() { private fun initFragments() {
viewpager.offscreenPageLimit = 2 view_pager.offscreenPageLimit = 2
viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) { override fun onPageScrollStateChanged(state: Int) {
searchMenuItem?.collapseActionView() searchMenuItem?.collapseActionView()
} }
@ -318,29 +291,31 @@ class MainActivity : SimpleActivity() {
} }
} }
private fun hideTabs() { private fun setupTabs() {
val selectedTabIndex = main_tabs_holder.selectedTabPosition view_pager.adapter = null
viewpager.adapter = null main_tabs_holder.removeAllTabs()
main_tabs_holder.removeAllTabs() main_tabs_holder.removeAllTabs()
var skippedTabs = 0
var isAnySelected = false
tabsList.forEachIndexed { index, value -> tabsList.forEachIndexed { index, value ->
if (config.showTabs and value == 0) { if (config.showTabs and value != 0) {
skippedTabs++ main_tabs_holder.newTab().setCustomView(R.layout.bottom_tablayout_item).apply {
} else { customView?.findViewById<ImageView>(R.id.tab_item_icon)?.setImageDrawable(getTabIcon(index))
val tab = main_tabs_holder.newTab().setIcon(getTabIcon(index)) customView?.findViewById<TextView>(R.id.tab_item_label)?.text = getTabLabel(index)
tab.contentDescription = getTabContentDescription(index) main_tabs_holder.addTab(this)
val wasAlreadySelected = selectedTabIndex > -1 && selectedTabIndex == index - skippedTabs
val shouldSelect = !isAnySelected && wasAlreadySelected
if (shouldSelect) {
isAnySelected = true
} }
main_tabs_holder.addTab(tab, index - skippedTabs, shouldSelect)
} }
} }
if (!isAnySelected) {
main_tabs_holder.selectTab(main_tabs_holder.getTabAt(getDefaultTab())) main_tabs_holder.onTabSelectionChanged(
} tabUnselectedAction = {
updateBottomTabItemColors(it.customView, false)
},
tabSelectedAction = {
view_pager.currentItem = it.position
updateBottomTabItemColors(it.customView, true)
}
)
main_tabs_holder.beGoneIf(main_tabs_holder.tabCount == 1) main_tabs_holder.beGoneIf(main_tabs_holder.tabCount == 1)
storedShowTabs = config.showTabs storedShowTabs = config.showTabs
} }
@ -355,7 +330,7 @@ class MainActivity : SimpleActivity() {
return resources.getColoredDrawableWithColor(drawableId, getProperTextColor()) return resources.getColoredDrawableWithColor(drawableId, getProperTextColor())
} }
private fun getTabContentDescription(position: Int): String { private fun getTabLabel(position: Int): String {
val stringId = when (position) { val stringId = when (position) {
0 -> R.string.contacts_tab 0 -> R.string.contacts_tab
1 -> R.string.favorites_tab 1 -> R.string.favorites_tab
@ -370,10 +345,10 @@ class MainActivity : SimpleActivity() {
return return
} }
if (viewpager.adapter == null) { if (view_pager.adapter == null) {
viewpager.adapter = ViewPagerAdapter(this) view_pager.adapter = ViewPagerAdapter(this)
viewpager.currentItem = if (openLastTab) main_tabs_holder.selectedTabPosition else getDefaultTab() view_pager.currentItem = if (openLastTab) main_tabs_holder.selectedTabPosition else getDefaultTab()
viewpager.onGlobalLayout { view_pager.onGlobalLayout {
refreshFragments() refreshFragments()
} }
} else { } else {
@ -412,7 +387,7 @@ class MainActivity : SimpleActivity() {
return fragments return fragments
} }
private fun getCurrentFragment(): MyViewPagerFragment? = getAllFragments().getOrNull(viewpager.currentItem) private fun getCurrentFragment(): MyViewPagerFragment? = getAllFragments().getOrNull(view_pager.currentItem)
private fun getDefaultTab(): Int { private fun getDefaultTab(): Int {
val showTabsMask = config.showTabs val showTabsMask = config.showTabs

View File

@ -1,37 +1,38 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_holder" android:id="@+id/main_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/main_tabs_holder"
android:layout_width="match_parent"
android:layout_height="48dp"
app:elevation="6dp"
app:tabIndicatorColor="@android:color/white"
app:tabIndicatorHeight="2dp"
app:tabMinWidth="150dp"
app:tabSelectedTextColor="@android:color/white" />
<com.simplemobiletools.commons.views.MyViewPager <com.simplemobiletools.commons.views.MyViewPager
android:id="@+id/viewpager" android:id="@+id/view_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="0dp"
android:layout_below="@+id/main_tabs_holder" /> app:layout_constraintBottom_toTopOf="@+id/main_tabs_holder"
app:layout_constraintTop_toTopOf="parent" />
<ImageView <ImageView
android:id="@+id/main_dialpad_button" android:id="@+id/main_dialpad_button"
android:layout_width="@dimen/dialpad_button_size" android:layout_width="@dimen/dialpad_button_size"
android:layout_height="@dimen/dialpad_button_size" android:layout_height="@dimen/dialpad_button_size"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/activity_margin" android:layout_marginBottom="@dimen/activity_margin"
android:background="@drawable/circle_background" android:background="@drawable/circle_background"
android:contentDescription="@string/dialpad" android:contentDescription="@string/dialpad"
android:elevation="@dimen/medium_margin" android:elevation="@dimen/medium_margin"
android:padding="@dimen/activity_margin" android:padding="@dimen/activity_margin"
android:src="@drawable/ic_dialpad_vector" /> android:src="@drawable/ic_dialpad_vector"
app:layout_constraintBottom_toTopOf="@+id/main_tabs_holder"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</RelativeLayout> <com.google.android.material.tabs.TabLayout
android:id="@+id/main_tabs_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:tabIndicator="@null"
app:tabMinWidth="150dp"
app:tabRippleColor="@null" />
</androidx.constraintlayout.widget.ConstraintLayout>