diff --git a/app/build.gradle b/app/build.gradle
index 76f7f0c1..d7b9c08b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -37,4 +37,5 @@ android {
dependencies {
implementation 'com.simplemobiletools:commons:5.27.9'
+ implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4935252b..baafac16 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,8 +1,16 @@
+
+
+
+
+
+ android:parentActivityName=".activities.SettingsActivity" />
+ android:parentActivityName=".activities.MainActivity" />
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt
index ea133032..1b34fe79 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt
@@ -1,20 +1,36 @@
package com.simplemobiletools.dialer.activities
import android.content.Intent
+import android.graphics.drawable.ColorDrawable
+import android.graphics.drawable.Drawable
import android.os.Bundle
+import android.os.Handler
import android.view.Menu
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.dialer.BuildConfig
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() {
+ private var isGettingContacts = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID)
+
+ setupTabColors()
+ checkContactPermissions()
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -32,6 +48,102 @@ class MainActivity : SimpleActivity() {
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() {
val licenses = 0
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ViewPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ViewPagerAdapter.kt
new file mode 100644
index 00000000..8e48e665
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ViewPagerAdapter.kt
@@ -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
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/MyViewPagerFragment.kt
index 93bbad07..3d2587a9 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/MyViewPagerFragment.kt
@@ -3,6 +3,7 @@ package com.simplemobiletools.dialer.fragments
import android.content.Context
import android.util.AttributeSet
import androidx.coordinatorlayout.widget.CoordinatorLayout
+import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.underlineText
import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.extensions.config
@@ -25,4 +26,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_placeholder_2?.underlineText()
}
}
+
+ fun finishActMode() {
+ (fragment_list.adapter as? MyRecyclerViewAdapter)?.finishActMode()
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt
index 57c4b8d1..4c82374a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt
@@ -1 +1,8 @@
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)
diff --git a/app/src/main/res/layout/fragment_contacts.xml b/app/src/main/res/layout/fragment_contacts.xml
index 23bfe6c3..fcbe9f7e 100644
--- a/app/src/main/res/layout/fragment_contacts.xml
+++ b/app/src/main/res/layout/fragment_contacts.xml
@@ -1,10 +1,9 @@
-
-
+
-
+