populating the main viewpager and top tabs

This commit is contained in:
tibbi
2020-05-06 22:50:07 +02:00
parent 654570f258
commit c7be9a2f2c
7 changed files with 174 additions and 7 deletions

View File

@ -37,4 +37,5 @@ android {
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:5.27.9' implementation 'com.simplemobiletools:commons:5.27.9'
implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a'
} }

View File

@ -1,8 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.simplemobiletools.dialer" package="com.simplemobiletools.dialer"
android:installLocation="auto"> android:installLocation="auto">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission
android:name="android.permission.USE_FINGERPRINT"
tools:node="remove" />
<application <application
android:name=".App" android:name=".App"
android:allowBackup="true" android:allowBackup="true"
@ -36,7 +44,7 @@
<activity <activity
android:name="com.simplemobiletools.commons.activities.CustomizationActivity" android:name="com.simplemobiletools.commons.activities.CustomizationActivity"
android:label="@string/customize_colors" android:label="@string/customize_colors"
android:parentActivityName=".activities.SettingsActivity"/> android:parentActivityName=".activities.SettingsActivity" />
<activity <activity
android:name="com.simplemobiletools.commons.activities.FAQActivity" android:name="com.simplemobiletools.commons.activities.FAQActivity"
@ -46,7 +54,7 @@
<activity <activity
android:name=".activities.SettingsActivity" android:name=".activities.SettingsActivity"
android:label="@string/settings" android:label="@string/settings"
android:parentActivityName=".activities.MainActivity"/> android:parentActivityName=".activities.MainActivity" />
</application> </application>
</manifest> </manifest>

View File

@ -1,20 +1,36 @@
package com.simplemobiletools.dialer.activities package com.simplemobiletools.dialer.activities
import android.content.Intent import android.content.Intent
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import com.simplemobiletools.commons.extensions.appLaunched import androidx.viewpager.widget.ViewPager
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_GET_ACCOUNTS
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.models.FAQItem import com.simplemobiletools.commons.models.FAQItem
import com.simplemobiletools.dialer.BuildConfig import com.simplemobiletools.dialer.BuildConfig
import com.simplemobiletools.dialer.R import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.ViewPagerAdapter
import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.helpers.ALL_TABS_MASK
import com.simplemobiletools.dialer.helpers.tabsList
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_contacts.*
class MainActivity : SimpleActivity() { class MainActivity : SimpleActivity() {
private var isGettingContacts = false
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
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()
checkContactPermissions()
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@ -32,6 +48,102 @@ class MainActivity : SimpleActivity() {
return true return true
} }
private fun checkContactPermissions() {
handlePermission(PERMISSION_READ_CONTACTS) {
if (it) {
handlePermission(PERMISSION_GET_ACCOUNTS) {
initFragments()
}
} else {
initFragments()
}
}
}
private fun setupTabColors() {
val lastUsedPage = config.lastUsedViewPagerPage
main_tabs_holder.apply {
background = ColorDrawable(config.backgroundColor)
setSelectedTabIndicatorColor(getAdjustedPrimaryColor())
getTabAt(lastUsedPage)?.select()
getTabAt(lastUsedPage)?.icon?.applyColorFilter(getAdjustedPrimaryColor())
getInactiveTabIndexes(lastUsedPage).forEach {
getTabAt(it)?.icon?.applyColorFilter(config.textColor)
}
}
}
private fun getInactiveTabIndexes(activeIndex: Int) = (0 until tabsList.size).filter { it != activeIndex }
private fun initFragments() {
viewpager.offscreenPageLimit = tabsList.size - 1
viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {
main_tabs_holder.getTabAt(position)?.select()
getAllFragments().forEach {
it?.finishActMode()
}
invalidateOptionsMenu()
}
})
viewpager.onGlobalLayout {
refreshContacts(ALL_TABS_MASK)
}
main_tabs_holder.onTabSelectionChanged(
tabUnselectedAction = {
it.icon?.applyColorFilter(config.textColor)
},
tabSelectedAction = {
viewpager.currentItem = it.position
it.icon?.applyColorFilter(getAdjustedPrimaryColor())
}
)
main_tabs_holder.removeAllTabs()
tabsList.forEachIndexed { index, value ->
val tab = main_tabs_holder.newTab().setIcon(getTabIcon(index))
main_tabs_holder.addTab(tab, index, config.lastUsedViewPagerPage == index)
}
// selecting the proper tab sometimes glitches, add an extra selector to make sure we have it right
main_tabs_holder.onGlobalLayout {
Handler().postDelayed({
main_tabs_holder.getTabAt(config.lastUsedViewPagerPage)?.select()
invalidateOptionsMenu()
}, 100L)
}
}
private fun getTabIcon(position: Int): Drawable {
val drawableId = when (position) {
else -> R.drawable.ic_person_vector
}
return resources.getColoredDrawableWithColor(drawableId, config.textColor)
}
fun refreshContacts(refreshTabsMask: Int) {
if (isDestroyed || isFinishing || isGettingContacts) {
return
}
isGettingContacts = true
if (viewpager.adapter == null) {
viewpager.adapter = ViewPagerAdapter(this)
viewpager.currentItem = config.lastUsedViewPagerPage
}
}
private fun getAllFragments() = arrayListOf(contacts_fragment)
private fun launchAbout() { private fun launchAbout() {
val licenses = 0 val licenses = 0

View File

@ -0,0 +1,35 @@
package com.simplemobiletools.dialer.adapters
import android.view.View
import android.view.ViewGroup
import androidx.viewpager.widget.PagerAdapter
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.fragments.MyViewPagerFragment
class ViewPagerAdapter(val activity: SimpleActivity) : PagerAdapter() {
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val layout = getFragment(position)
val view = activity.layoutInflater.inflate(layout, container, false)
container.addView(view)
(view as MyViewPagerFragment).apply {
setupFragment(activity)
}
return view
}
override fun destroyItem(container: ViewGroup, position: Int, item: Any) {
container.removeView(item as View)
}
override fun getCount() = 1
override fun isViewFromObject(view: View, item: Any) = view == item
private fun getFragment(position: Int): Int {
return R.layout.fragment_contacts
}
}

View File

@ -3,6 +3,7 @@ package com.simplemobiletools.dialer.fragments
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.coordinatorlayout.widget.CoordinatorLayout
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.underlineText import com.simplemobiletools.commons.extensions.underlineText
import com.simplemobiletools.dialer.activities.SimpleActivity import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.extensions.config import com.simplemobiletools.dialer.extensions.config
@ -25,4 +26,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_placeholder_2?.underlineText() fragment_placeholder_2?.underlineText()
} }
} }
fun finishActMode() {
(fragment_list.adapter as? MyRecyclerViewAdapter)?.finishActMode()
}
} }

View File

@ -1 +1,8 @@
package com.simplemobiletools.dialer.helpers package com.simplemobiletools.dialer.helpers
const val CONTACTS_TAB_MASK = 1
const val FAVORITES_TAB_MASK = 2
const val HISTORY_TAB_MASK = 4
const val ALL_TABS_MASK = CONTACTS_TAB_MASK or FAVORITES_TAB_MASK or HISTORY_TAB_MASK
val tabsList = arrayListOf(CONTACTS_TAB_MASK)

View File

@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.simplemobiletools.contacts.pro.fragments.ContactsFragment <com.simplemobiletools.dialer.fragments.ContactsFragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contacts_fragment" android:id="@+id/contacts_fragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<include layout="@layout/fragment_letters_layout"/> <include layout="@layout/fragment_letters_layout" />
</com.simplemobiletools.contacts.pro.fragments.ContactsFragment> </com.simplemobiletools.dialer.fragments.ContactsFragment>