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 @@ - - + - +