diff --git a/CHANGELOG.md b/CHANGELOG.md
index f2071bb6..5927b6d0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,63 @@
Changelog
==========
+Version 5.17.8 *(2023-04-19)*
+----------------------------
+
+ * Avoid showing contacts without a phone number
+ * Fixed multiple contact handling related glitches
+ * Added some stability, translation and UX improvements
+
+Version 5.17.7 *(2023-04-12)*
+----------------------------
+
+ * Added some stability, translation and UX improvements
+
+Version 5.17.6 *(2023-04-07)*
+----------------------------
+
+ * Fixed number presses during call
+ * Added some stability, translation and UX improvements
+
+Version 5.17.5 *(2023-03-29)*
+----------------------------
+
+ * Allow filtering contacts
+ * Fix displaying contacts, if name starts with surname
+ * Fixed some right-to-left layout glitches
+ * Added some stability, translation and UX improvements
+
+Version 5.17.4 *(2023-03-21)*
+----------------------------
+
+ * Allow filtering contacts
+ * Fix displaying contacts, if name starts with surname
+ * Fixed some right-to-left layout glitches
+ * Added some stability, translation and UX improvements
+
+Version 5.17.3 *(2023-01-12)*
+----------------------------
+
+ * Fixed a search glitch on some devices
+
+Version 5.17.2 *(2023-01-10)*
+----------------------------
+
+ * Fixed a glitch with dialpad button not being visible on some devices
+
+Version 5.17.1 *(2023-01-04)*
+----------------------------
+
+ * Added the new search bar at the top menu
+
+Version 5.17.0 *(2022-12-30)*
+----------------------------
+
+ * Do not allow calling blocked numbers
+ * Allow hiding numbers on the dialpad
+ * Use Material You theme by default on Android 12+
+ * Added some UI, translation and stability improvements
+
Version 5.16.0 *(2022-11-12)*
----------------------------
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 00000000..0730468b
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,8 @@
+### Reporting
+Before you report something, read the reporting rules [here](https://github.com/SimpleMobileTools/General-Discussion#how-do-i-suggest-an-improvement-ask-a-question-or-report-an-issue) please.
+
+### Contributing as a developer
+Some instructions about code style and everything that has to be done to increase the change of your code getting accepted can be found at the [General Discussion](https://github.com/SimpleMobileTools/General-Discussion#contribution-rules-for-developers) section.
+
+### Contributing as a non developer
+In case you just want to for example improve a translation, you can find the way of doing it [here](https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file).
diff --git a/app/build.gradle b/app/build.gradle
index f70ed88e..fadd4c20 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,8 +15,8 @@ android {
applicationId "com.simplemobiletools.dialer"
minSdkVersion 23
targetSdkVersion 33
- versionCode 46
- versionName "5.16.0"
+ versionCode 55
+ versionName "5.17.8"
setProperty("archivesBaseName", "dialer")
}
@@ -62,7 +62,7 @@ android {
}
dependencies {
- implementation 'com.github.SimpleMobileTools:Simple-Commons:5b5a6b083f'
+ implementation 'com.github.SimpleMobileTools:Simple-Commons:ee2e127758'
implementation 'com.github.tibbi:IndicatorFastScroll:4524cd0b61'
implementation 'me.grantland:autofittextview:0.2.1'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 562addd4..39cf1951 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
@@ -20,6 +21,7 @@
+
@@ -116,6 +124,7 @@
android:exported="true"
android:label="@string/dialpad"
android:parentActivityName=".activities.MainActivity"
+ android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden">
@@ -144,6 +153,7 @@
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt
index bc17fb76..c8d46677 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/CallActivity.kt
@@ -20,12 +20,10 @@ import android.view.WindowManager
import android.view.animation.AccelerateDecelerateInterpolator
import android.view.animation.OvershootInterpolator
import android.widget.ImageView
+import androidx.core.content.res.ResourcesCompat
import androidx.core.view.children
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.LOWER_ALPHA
-import com.simplemobiletools.commons.helpers.MINUTE_SECONDS
-import com.simplemobiletools.commons.helpers.isOreoMr1Plus
-import com.simplemobiletools.commons.helpers.isOreoPlus
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.SimpleListItem
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.dialogs.DynamicBottomSheetChooserDialog
@@ -88,7 +86,7 @@ class CallActivity : SimpleActivity() {
override fun onResume() {
super.onResume()
updateState()
- updateNavigationBarColor(getBottomNavigationBackgroundColor())
+ updateNavigationBarColor(getProperBackgroundColor())
}
override fun onDestroy() {
@@ -187,6 +185,25 @@ class CallActivity : SimpleActivity() {
dialpad_8_holder.setOnClickListener { dialpadPressed('8') }
dialpad_9_holder.setOnClickListener { dialpadPressed('9') }
+ arrayOf(
+ dialpad_0_holder,
+ dialpad_1_holder,
+ dialpad_2_holder,
+ dialpad_3_holder,
+ dialpad_4_holder,
+ dialpad_5_holder,
+ dialpad_6_holder,
+ dialpad_7_holder,
+ dialpad_8_holder,
+ dialpad_9_holder,
+ dialpad_plus_holder,
+ dialpad_asterisk_holder,
+ dialpad_hashtag_holder
+ ).forEach {
+ it.background = ResourcesCompat.getDrawable(resources, R.drawable.pill_background, theme)
+ it.background?.alpha = LOWER_ALPHA_INT
+ }
+
dialpad_0_holder.setOnLongClickListener { dialpadPressed('+'); true }
dialpad_asterisk_holder.setOnClickListener { dialpadPressed('*') }
dialpad_hashtag_holder.setOnClickListener { dialpadPressed('#') }
@@ -383,7 +400,7 @@ class CallActivity : SimpleActivity() {
}
private fun dialpadPressed(char: Char) {
- CallManager.keypad(this, char)
+ CallManager.keypad(char)
dialpad_input.addCharacter(char)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ConferenceActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ConferenceActivity.kt
index 3114cd29..a4da2049 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ConferenceActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ConferenceActivity.kt
@@ -10,10 +10,12 @@ import kotlinx.android.synthetic.main.activity_conference.*
class ConferenceActivity : SimpleActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
+ isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_conference)
-
- conference_calls_list.adapter = ConferenceCallsAdapter(this, conference_calls_list, ArrayList(CallManager.getConferenceCalls())) {}
+ updateMaterialActivityViews(conference_coordinator, conference_list, useTransparentNavigation = true, useTopSearchMenu = false)
+ setupMaterialScrollListener(conference_list, conference_toolbar)
+ conference_list.adapter = ConferenceCallsAdapter(this, conference_list, ArrayList(CallManager.getConferenceCalls())) {}
}
override fun onResume() {
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialerActivity.kt
index 69c2505b..3f7def96 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialerActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialerActivity.kt
@@ -36,6 +36,12 @@ class DialerActivity : SimpleActivity() {
@SuppressLint("MissingPermission")
private fun initOutgoingCall() {
try {
+ if (isNumberBlocked(callNumber.toString().replace("tel:", ""), getBlockedNumbers())) {
+ toast(R.string.calling_blocked_number)
+ finish()
+ return
+ }
+
getHandleToUse(intent, callNumber.toString()) { handle ->
if (handle != null) {
Bundle().apply {
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt
index e92e1e54..3f89e74d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt
@@ -17,10 +17,13 @@ import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.view.ViewConfiguration
+import androidx.core.content.res.ResourcesCompat
+import androidx.core.view.isVisible
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
+import com.simplemobiletools.commons.dialogs.CallConfirmationDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.ContactsAdapter
import com.simplemobiletools.dialer.extensions.*
@@ -34,7 +37,7 @@ import java.util.*
import kotlin.math.roundToInt
class DialpadActivity : SimpleActivity() {
- private var allContacts = ArrayList()
+ private var allContacts = ArrayList()
private var speedDialValues = ArrayList()
private val russianCharsMap = HashMap()
private var hasRussianLocale = false
@@ -49,10 +52,47 @@ class DialpadActivity : SimpleActivity() {
setContentView(R.layout.activity_dialpad)
hasRussianLocale = Locale.getDefault().language == "ru"
+ updateMaterialActivityViews(dialpad_coordinator, dialpad_holder, useTransparentNavigation = true, useTopSearchMenu = false)
+ setupMaterialScrollListener(dialpad_list, dialpad_toolbar)
+ updateNavigationBarColor(getProperBackgroundColor())
+
if (checkAppSideloading()) {
return
}
+ if (config.hideDialpadNumbers) {
+ dialpad_1_holder.isVisible = false
+ dialpad_2_holder.isVisible = false
+ dialpad_3_holder.isVisible = false
+ dialpad_4_holder.isVisible = false
+ dialpad_5_holder.isVisible = false
+ dialpad_6_holder.isVisible = false
+ dialpad_7_holder.isVisible = false
+ dialpad_8_holder.isVisible = false
+ dialpad_9_holder.isVisible = false
+ dialpad_plus_holder.isVisible = true
+ dialpad_0_holder.visibility = View.INVISIBLE
+ }
+
+ arrayOf(
+ dialpad_0_holder,
+ dialpad_1_holder,
+ dialpad_2_holder,
+ dialpad_3_holder,
+ dialpad_4_holder,
+ dialpad_5_holder,
+ dialpad_6_holder,
+ dialpad_7_holder,
+ dialpad_8_holder,
+ dialpad_9_holder,
+ dialpad_plus_holder,
+ dialpad_asterisk_holder,
+ dialpad_hashtag_holder
+ ).forEach {
+ it.background = ResourcesCompat.getDrawable(resources, R.drawable.pill_background, theme)
+ it.background?.alpha = LOWER_ALPHA_INT
+ }
+
setupOptionsMenu()
speedDialValues = config.getSpeedDialValues()
privateCursor = getMyContactsCursor(favoritesOnly = false, withPhoneNumbersOnly = true)
@@ -89,6 +129,7 @@ class DialpadActivity : SimpleActivity() {
setupCharClick(dialpad_8_holder, '8')
setupCharClick(dialpad_9_holder, '9')
setupCharClick(dialpad_0_holder, '0')
+ setupCharClick(dialpad_plus_holder, '+', longClickable = false)
setupCharClick(dialpad_asterisk_holder, '*', longClickable = false)
setupCharClick(dialpad_hashtag_holder, '#', longClickable = false)
@@ -97,10 +138,13 @@ class DialpadActivity : SimpleActivity() {
dialpad_call_button.setOnClickListener { initCall(dialpad_input.value, 0) }
dialpad_input.onTextChangeListener { dialpadValueChanged(it) }
dialpad_input.requestFocus()
-
- SimpleContactsHelper(this).getAvailableContacts(false) { gotContacts(it) }
dialpad_input.disableKeyboard()
+ ContactsHelper(this).getContacts(showOnlyContactsWithNumbers = true) { allContacts ->
+ gotContacts(allContacts)
+ }
+
+
val properPrimaryColor = getProperPrimaryColor()
val callIconId = if (areMultipleSIMsAvailable()) {
val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_two_vector, properPrimaryColor.getContrastColor())
@@ -131,7 +175,7 @@ class DialpadActivity : SimpleActivity() {
super.onResume()
updateTextColors(dialpad_holder)
dialpad_clear_char.applyColorFilter(getProperTextColor())
- updateNavigationBarColor(getBottomNavigationBackgroundColor())
+ updateNavigationBarColor(getProperBackgroundColor())
setupToolbar(dialpad_toolbar, NavigationIcon.Arrow)
}
@@ -179,10 +223,10 @@ class DialpadActivity : SimpleActivity() {
dialpad_input.setText("")
}
- private fun gotContacts(newContacts: ArrayList) {
+ private fun gotContacts(newContacts: ArrayList) {
allContacts = newContacts
- val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor)
+ val privateContacts = MyContactsContentProvider.getContacts(this, privateCursor)
if (privateContacts.isNotEmpty()) {
allContacts.addAll(privateContacts)
allContacts.sort()
@@ -230,11 +274,11 @@ class DialpadActivity : SimpleActivity() {
it.doesContainPhoneNumber(text) || (convertedName.contains(text, true))
}.sortedWith(compareBy {
!it.doesContainPhoneNumber(text)
- }).toMutableList() as ArrayList
+ }).toMutableList() as ArrayList
letter_fastscroller.setupWithRecyclerView(dialpad_list, { position ->
try {
- val name = filtered[position].name
+ val name = filtered[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault()))
} catch (e: Exception) {
@@ -243,7 +287,14 @@ class DialpadActivity : SimpleActivity() {
})
ContactsAdapter(this, filtered, dialpad_list, null, text) {
- startCallIntent((it as SimpleContact).phoneNumbers.first().normalizedNumber)
+ val contact = it as Contact
+ if (config.showCallConfirmation) {
+ CallConfirmationDialog(this@DialpadActivity, contact.getNameToDisplay()) {
+ startCallIntent(contact.getPrimaryNumber() ?: return@CallConfirmationDialog)
+ }
+ } else {
+ startCallIntent(contact.getPrimaryNumber() ?: return@ContactsAdapter)
+ }
}.apply {
dialpad_list.adapter = this
}
@@ -262,9 +313,21 @@ class DialpadActivity : SimpleActivity() {
private fun initCall(number: String = dialpad_input.value, handleIndex: Int) {
if (number.isNotEmpty()) {
if (handleIndex != -1 && areMultipleSIMsAvailable()) {
- callContactWithSim(number, handleIndex == 0)
+ if (config.showCallConfirmation) {
+ CallConfirmationDialog(this, number) {
+ callContactWithSim(number, handleIndex == 0)
+ }
+ }else{
+ callContactWithSim(number, handleIndex == 0)
+ }
} else {
- startCallIntent(number)
+ if (config.showCallConfirmation) {
+ CallConfirmationDialog(this, number) {
+ startCallIntent(number)
+ }
+ }else{
+ startCallIntent(number)
+ }
}
}
}
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 36a1ae3a..6cf2e169 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt
@@ -2,8 +2,6 @@ package com.simplemobiletools.dialer.activities
import android.annotation.SuppressLint
import android.app.Activity
-import android.app.SearchManager
-import android.content.Context
import android.content.Intent
import android.content.pm.ShortcutInfo
import android.content.res.Configuration
@@ -13,24 +11,21 @@ import android.graphics.drawable.LayerDrawable
import android.os.Bundle
import android.os.Handler
import android.provider.Settings
-import android.view.Menu
-import android.view.MenuItem
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
-import androidx.appcompat.widget.SearchView
-import androidx.core.view.MenuItemCompat
import androidx.viewpager.widget.ViewPager
import com.google.android.material.snackbar.Snackbar
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.FAQItem
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.BuildConfig
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.ViewPagerAdapter
import com.simplemobiletools.dialer.dialogs.ChangeSortingDialog
+import com.simplemobiletools.dialer.dialogs.FilterContactSourcesDialog
import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.extensions.launchCreateNewContactIntent
import com.simplemobiletools.dialer.fragments.FavoritesFragment
@@ -45,19 +40,19 @@ import kotlinx.android.synthetic.main.fragment_recents.*
import me.grantland.widget.AutofitHelper
class MainActivity : SimpleActivity() {
- private var isSearchOpen = false
private var launchedDialer = false
- private var mSearchMenuItem: MenuItem? = null
private var storedShowTabs = 0
- private var searchQuery = ""
- var cachedContacts = ArrayList()
+ private var storedStartNameWithSurname = false
+ var cachedContacts = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
+ isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
appLaunched(BuildConfig.APPLICATION_ID)
setupOptionsMenu()
refreshMenuItems()
+ updateMaterialActivityViews(main_coordinator, main_holder, useTransparentNavigation = false, useTopSearchMenu = true)
launchedDialer = savedInstanceState?.getBoolean(OPEN_DIAL_PAD_AT_LAUNCH) ?: false
@@ -90,28 +85,37 @@ class MainActivity : SimpleActivity() {
}
setupTabs()
- SimpleContact.sorting = config.sorting
+ Contact.sorting = config.sorting
}
override fun onResume() {
super.onResume()
+ if (storedShowTabs != config.showTabs) {
+ config.lastUsedViewPagerPage = 0
+ System.exit(0)
+ return
+ }
+
+ updateMenuColors()
val properPrimaryColor = getProperPrimaryColor()
val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad_vector, properPrimaryColor.getContrastColor())
main_dialpad_button.setImageDrawable(dialpadIcon)
- setupTabColors()
- setupToolbar(main_toolbar, searchMenuItem = mSearchMenuItem)
updateTextColors(main_holder)
+ setupTabColors()
getAllFragments().forEach {
it?.setupColors(getProperTextColor(), getProperPrimaryColor(), getProperPrimaryColor())
}
- if (!isSearchOpen) {
- if (storedShowTabs != config.showTabs) {
- System.exit(0)
- return
- }
+ val configStartNameWithSurname = config.startNameWithSurname
+ if (storedStartNameWithSurname != configStartNameWithSurname) {
+ contacts_fragment?.startNameWithSurnameChanged(configStartNameWithSurname)
+ favorites_fragment?.startNameWithSurnameChanged(configStartNameWithSurname)
+ storedStartNameWithSurname = config.startNameWithSurname
+ }
+
+ if (!main_menu.isSearchOpen) {
refreshItems(true)
}
@@ -124,6 +128,7 @@ class MainActivity : SimpleActivity() {
override fun onPause() {
super.onPause()
storedShowTabs = config.showTabs
+ storedStartNameWithSurname = config.startNameWithSurname
config.lastUsedViewPagerPage = view_pager.currentItem
}
@@ -149,8 +154,8 @@ class MainActivity : SimpleActivity() {
}
override fun onBackPressed() {
- if (isSearchOpen && mSearchMenuItem != null) {
- mSearchMenuItem!!.collapseActionView()
+ if (main_menu.isSearchOpen) {
+ main_menu.closeSearch()
} else {
super.onBackPressed()
}
@@ -158,7 +163,7 @@ class MainActivity : SimpleActivity() {
private fun refreshMenuItems() {
val currentFragment = getCurrentFragment()
- main_toolbar.menu.apply {
+ main_menu.getToolbar().menu.apply {
findItem(R.id.clear_call_history).isVisible = currentFragment == recents_fragment
findItem(R.id.sort).isVisible = currentFragment != recents_fragment
findItem(R.id.create_new_contact).isVisible = currentFragment == contacts_fragment
@@ -167,12 +172,26 @@ class MainActivity : SimpleActivity() {
}
private fun setupOptionsMenu() {
- setupSearch(main_toolbar.menu)
- main_toolbar.setOnMenuItemClickListener { menuItem ->
+ main_menu.getToolbar().inflateMenu(R.menu.menu)
+ main_menu.toggleHideOnScroll(false)
+ main_menu.setupMenu()
+
+ main_menu.onSearchClosedListener = {
+ getAllFragments().forEach {
+ it?.onSearchQueryChanged("")
+ }
+ }
+
+ main_menu.onSearchTextChangedListener = { text ->
+ getCurrentFragment()?.onSearchQueryChanged(text)
+ }
+
+ main_menu.getToolbar().setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.clear_call_history -> clearCallHistory()
R.id.create_new_contact -> launchCreateNewContactIntent()
R.id.sort -> showSortingDialog(showCustomSorting = getCurrentFragment() is FavoritesFragment)
+ R.id.filter -> showFilterDialog()
R.id.more_apps_from_us -> launchMoreAppsFromUsIntent()
R.id.settings -> launchSettings()
R.id.about -> launchAbout()
@@ -182,53 +201,20 @@ class MainActivity : SimpleActivity() {
}
}
+ private fun updateMenuColors() {
+ updateStatusbarColor(getProperBackgroundColor())
+ main_menu.updateColors()
+ }
+
private fun checkContactPermissions() {
handlePermission(PERMISSION_READ_CONTACTS) {
initFragments()
}
}
- private fun setupSearch(menu: Menu) {
- val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
- mSearchMenuItem = menu.findItem(R.id.search)
- (mSearchMenuItem!!.actionView as SearchView).apply {
- setSearchableInfo(searchManager.getSearchableInfo(componentName))
- isSubmitButtonEnabled = false
- queryHint = getString(R.string.search)
- setOnQueryTextListener(object : SearchView.OnQueryTextListener {
- override fun onQueryTextSubmit(query: String) = false
-
- override fun onQueryTextChange(newText: String): Boolean {
- if (isSearchOpen) {
- searchQuery = newText
- getCurrentFragment()?.onSearchQueryChanged(newText)
- }
- return true
- }
- })
- }
-
- MenuItemCompat.setOnActionExpandListener(mSearchMenuItem, object : MenuItemCompat.OnActionExpandListener {
- override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
- isSearchOpen = true
- main_dialpad_button.beGone()
- return true
- }
-
- override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
- if (isSearchOpen) {
- getCurrentFragment()?.onSearchClosed()
- }
-
- isSearchOpen = false
- main_dialpad_button.beVisible()
- return true
- }
- })
- }
-
private fun clearCallHistory() {
- ConfirmationDialog(this, "", R.string.clear_history_confirmation) {
+ val confirmationText = "${getString(R.string.remove_confirmation)}\n\n${getString(R.string.cannot_be_undone)}"
+ ConfirmationDialog(this, confirmationText) {
RecentsHelper(this).removeAllRecentCalls(this) {
runOnUiThread {
recents_fragment?.refreshItems()
@@ -270,11 +256,11 @@ class MainActivity : SimpleActivity() {
private fun setupTabColors() {
val activeView = main_tabs_holder.getTabAt(view_pager.currentItem)?.customView
- updateBottomTabItemColors(activeView, true)
+ updateBottomTabItemColors(activeView, true, getSelectedTabDrawableIds()[view_pager.currentItem])
getInactiveTabIndexes(view_pager.currentItem).forEach { index ->
val inactiveView = main_tabs_holder.getTabAt(index)?.customView
- updateBottomTabItemColors(inactiveView, false)
+ updateBottomTabItemColors(inactiveView, false, getDeselectedTabDrawableIds()[index])
}
val bottomBarColor = getBottomNavigationBackgroundColor()
@@ -282,7 +268,45 @@ class MainActivity : SimpleActivity() {
updateNavigationBarColor(bottomBarColor)
}
- private fun getInactiveTabIndexes(activeIndex: Int) = (0 until tabsList.size).filter { it != activeIndex }
+ private fun getInactiveTabIndexes(activeIndex: Int) = (0 until main_tabs_holder.tabCount).filter { it != activeIndex }
+
+ private fun getSelectedTabDrawableIds(): ArrayList {
+ val showTabs = config.showTabs
+ val icons = ArrayList()
+
+ if (showTabs and TAB_CONTACTS != 0) {
+ icons.add(R.drawable.ic_person_vector)
+ }
+
+ if (showTabs and TAB_FAVORITES != 0) {
+ icons.add(R.drawable.ic_star_vector)
+ }
+
+ if (showTabs and TAB_CALL_HISTORY != 0) {
+ icons.add(R.drawable.ic_clock_filled_vector)
+ }
+
+ return icons
+ }
+
+ private fun getDeselectedTabDrawableIds(): ArrayList {
+ val showTabs = config.showTabs
+ val icons = ArrayList()
+
+ if (showTabs and TAB_CONTACTS != 0) {
+ icons.add(R.drawable.ic_person_outline_vector)
+ }
+
+ if (showTabs and TAB_FAVORITES != 0) {
+ icons.add(R.drawable.ic_star_outline_vector)
+ }
+
+ if (showTabs and TAB_CALL_HISTORY != 0) {
+ icons.add(R.drawable.ic_clock_vector)
+ }
+
+ return icons
+ }
private fun initFragments() {
view_pager.offscreenPageLimit = 2
@@ -349,17 +373,18 @@ class MainActivity : SimpleActivity() {
main_tabs_holder.onTabSelectionChanged(
tabUnselectedAction = {
- updateBottomTabItemColors(it.customView, false)
+ updateBottomTabItemColors(it.customView, false, getDeselectedTabDrawableIds()[it.position])
},
tabSelectedAction = {
- closeSearch()
+ main_menu.closeSearch()
view_pager.currentItem = it.position
- updateBottomTabItemColors(it.customView, true)
+ updateBottomTabItemColors(it.customView, true, getSelectedTabDrawableIds()[it.position])
}
)
main_tabs_holder.beGoneIf(main_tabs_holder.tabCount == 1)
storedShowTabs = config.showTabs
+ storedStartNameWithSurname = config.startNameWithSurname
}
private fun getTabIcon(position: Int): Drawable {
@@ -404,7 +429,7 @@ class MainActivity : SimpleActivity() {
}
}
- private fun refreshFragments() {
+ fun refreshFragments() {
contacts_fragment?.refreshItems()
favorites_fragment?.refreshItems()
recents_fragment?.refreshItems()
@@ -471,13 +496,11 @@ class MainActivity : SimpleActivity() {
}
private fun launchSettings() {
- closeSearch()
hideKeyboard()
startActivity(Intent(applicationContext, SettingsActivity::class.java))
}
private fun launchAbout() {
- closeSearch()
val licenses = LICENSE_GLIDE or LICENSE_INDICATOR_FAST_SCROLL or LICENSE_AUTOFITTEXTVIEW
val faqItems = arrayListOf(
@@ -496,29 +519,40 @@ class MainActivity : SimpleActivity() {
private fun showSortingDialog(showCustomSorting: Boolean) {
ChangeSortingDialog(this, showCustomSorting) {
favorites_fragment?.refreshItems {
- if (isSearchOpen) {
- getCurrentFragment()?.onSearchQueryChanged(searchQuery)
+ if (main_menu.isSearchOpen) {
+ getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery())
}
}
contacts_fragment?.refreshItems {
- if (isSearchOpen) {
- getCurrentFragment()?.onSearchQueryChanged(searchQuery)
+ if (main_menu.isSearchOpen) {
+ getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery())
}
}
}
}
-
- private fun closeSearch() {
- if (isSearchOpen) {
- getAllFragments().forEach {
- it?.onSearchQueryChanged("")
+ private fun showFilterDialog() {
+ FilterContactSourcesDialog(this) {
+ favorites_fragment?.refreshItems {
+ if (main_menu.isSearchOpen) {
+ getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery())
+ }
+ }
+
+ contacts_fragment?.refreshItems {
+ if (main_menu.isSearchOpen) {
+ getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery())
+ }
+ }
+
+ recents_fragment?.refreshItems{
+ if (main_menu.isSearchOpen) {
+ getCurrentFragment()?.onSearchQueryChanged(main_menu.getCurrentQuery())
+ }
}
- mSearchMenuItem?.collapseActionView()
}
}
-
- fun cacheContacts(contacts: List) {
+ fun cacheContacts(contacts: List) {
try {
cachedContacts.clear()
cachedContacts.addAll(contacts)
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ManageSpeedDialActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ManageSpeedDialActivity.kt
index ab864cbf..8d1f5961 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ManageSpeedDialActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/ManageSpeedDialActivity.kt
@@ -3,9 +3,9 @@ package com.simplemobiletools.dialer.activities
import android.os.Bundle
import com.google.gson.Gson
import com.simplemobiletools.commons.extensions.updateTextColors
+import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.helpers.NavigationIcon
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.adapters.SpeedDialAdapter
import com.simplemobiletools.dialer.dialogs.SelectContactDialog
@@ -15,16 +15,20 @@ import com.simplemobiletools.dialer.models.SpeedDial
import kotlinx.android.synthetic.main.activity_manage_speed_dial.*
class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
- private var allContacts = ArrayList()
+ private var allContacts = ArrayList()
private var speedDialValues = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
+ isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_manage_speed_dial)
+ updateMaterialActivityViews(manage_speed_dial_coordinator, manage_speed_dial_holder, useTransparentNavigation = true, useTopSearchMenu = false)
+ setupMaterialScrollListener(manage_speed_dial_scrollview, manage_speed_dial_toolbar)
+
speedDialValues = config.getSpeedDialValues()
updateAdapter()
- SimpleContactsHelper(this).getAvailableContacts(false) { contacts ->
+ ContactsHelper(this).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
allContacts = contacts
}
@@ -50,7 +54,7 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener {
SelectContactDialog(this, allContacts) { selectedContact ->
speedDialValues.first { it.id == clickedContact.id }.apply {
- displayName = selectedContact.name
+ displayName = selectedContact.getNameToDisplay()
number = selectedContact.phoneNumbers.first().normalizedNumber
}
updateAdapter()
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/SettingsActivity.kt
index 7d6e339c..827ac53b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/SettingsActivity.kt
@@ -20,9 +20,14 @@ import java.util.*
import kotlin.system.exitProcess
class SettingsActivity : SimpleActivity() {
+
override fun onCreate(savedInstanceState: Bundle?) {
+ isMaterialActivity = true
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
+
+ updateMaterialActivityViews(settings_coordinator, settings_holder, useTransparentNavigation = true, useTopSearchMenu = false)
+ setupMaterialScrollListener(settings_nested_scrollview, settings_toolbar)
}
override fun onResume() {
@@ -43,6 +48,7 @@ class SettingsActivity : SimpleActivity() {
setupGroupSubsequentCalls()
setupStartNameWithSurname()
setupDialpadVibrations()
+ setupDialpadNumbers()
setupDialpadBeeps()
setupShowCallConfirmation()
setupDisableProximitySensor()
@@ -51,22 +57,13 @@ class SettingsActivity : SimpleActivity() {
updateTextColors(settings_holder)
arrayOf(
- settings_color_customization_label,
+ settings_color_customization_section_label,
settings_general_settings_label,
settings_startup_label,
settings_calls_label
).forEach {
it.setTextColor(getProperPrimaryColor())
}
-
- arrayOf(
- settings_color_customization_holder,
- settings_general_settings_holder,
- settings_startup_holder,
- settings_calls_holder
- ).forEach {
- it.background.applyColorFilter(getProperBackgroundColor().getContrastColor())
- }
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -76,21 +73,14 @@ class SettingsActivity : SimpleActivity() {
private fun setupPurchaseThankYou() {
settings_purchase_thank_you_holder.beGoneIf(isOrWasThankYouInstalled())
-
- // make sure the corners at ripple fit the stroke rounded corners
- if (settings_purchase_thank_you_holder.isGone()) {
- settings_use_english_holder.background = resources.getDrawable(R.drawable.ripple_top_corners, theme)
- settings_manage_blocked_numbers_holder.background = resources.getDrawable(R.drawable.ripple_top_corners, theme)
- }
-
settings_purchase_thank_you_holder.setOnClickListener {
launchPurchaseThankYouIntent()
}
}
private fun setupCustomizeColors() {
- settings_customize_colors_label.text = getCustomizeColorsString()
- settings_customize_colors_holder.setOnClickListener {
+ settings_color_customization_label.text = getCustomizeColorsString()
+ settings_color_customization_holder.setOnClickListener {
handleCustomizeColorsClick()
}
}
@@ -108,11 +98,6 @@ class SettingsActivity : SimpleActivity() {
private fun setupLanguage() {
settings_language.text = Locale.getDefault().displayLanguage
settings_language_holder.beVisibleIf(isTiramisuPlus())
-
- if (settings_use_english_holder.isGone() && settings_language_holder.isGone() && settings_purchase_thank_you_holder.isGone()) {
- settings_manage_blocked_numbers_holder.background = resources.getDrawable(R.drawable.ripple_top_corners, theme)
- }
-
settings_language_holder.setOnClickListener {
launchChangeAppLanguageIntent()
}
@@ -123,11 +108,6 @@ class SettingsActivity : SimpleActivity() {
private fun setupManageBlockedNumbers() {
settings_manage_blocked_numbers_label.text = addLockedLabelIfNeeded(R.string.manage_blocked_numbers)
settings_manage_blocked_numbers_holder.beVisibleIf(isNougatPlus())
-
- if (settings_use_english_holder.isGone() && settings_purchase_thank_you_holder.isGone() && settings_manage_blocked_numbers_holder.isGone()) {
- settings_change_date_time_format_holder.background = resources.getDrawable(R.drawable.ripple_top_corners, theme)
- }
-
settings_manage_blocked_numbers_holder.setOnClickListener {
if (isOrWasThankYouInstalled()) {
Intent(this, ManageBlockedNumbersActivity::class.java).apply {
@@ -234,6 +214,14 @@ class SettingsActivity : SimpleActivity() {
}
}
+ private fun setupDialpadNumbers() {
+ settings_hide_dialpad_numbers.isChecked = config.hideDialpadNumbers
+ settings_hide_dialpad_numbers_holder.setOnClickListener {
+ settings_hide_dialpad_numbers.toggle()
+ config.hideDialpadNumbers = settings_hide_dialpad_numbers.isChecked
+ }
+ }
+
private fun setupDialpadBeeps() {
settings_dialpad_beeps.isChecked = config.dialpadBeeps
settings_dialpad_beeps_holder.setOnClickListener {
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt
index 1383b3ae..c2ee834d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/ContactsAdapter.kt
@@ -28,7 +28,7 @@ import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.commons.interfaces.ItemMoveCallback
import com.simplemobiletools.commons.interfaces.ItemTouchHelperContract
import com.simplemobiletools.commons.interfaces.StartReorderDragListener
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity
@@ -41,7 +41,7 @@ import java.util.*
class ContactsAdapter(
activity: SimpleActivity,
- var contacts: ArrayList,
+ var contacts: ArrayList,
recyclerView: MyRecyclerView,
val refreshItemsListener: RefreshItemsListener? = null,
highlightText: String = "",
@@ -135,9 +135,9 @@ class ContactsAdapter(
override fun getItemCount() = contacts.size
- fun updateItems(newItems: ArrayList, highlightText: String = "") {
+ fun updateItems(newItems: ArrayList, highlightText: String = "") {
if (newItems.hashCode() != contacts.hashCode()) {
- contacts = newItems.clone() as ArrayList
+ contacts = newItems.clone() as ArrayList
textToHighlight = highlightText
notifyDataSetChanged()
finishActMode()
@@ -184,7 +184,7 @@ class ContactsAdapter(
val itemsCnt = selectedKeys.size
val firstItem = getSelectedItems().firstOrNull() ?: return
val items = if (itemsCnt == 1) {
- "\"${firstItem.name}\""
+ "\"${firstItem.getNameToDisplay()}\""
} else {
resources.getQuantityString(R.plurals.delete_contacts, itemsCnt, itemsCnt)
}
@@ -221,12 +221,10 @@ class ContactsAdapter(
}
}
- private fun getSelectedItems() = contacts.filter { selectedKeys.contains(it.rawId) } as ArrayList
+ private fun getSelectedItems() = contacts.filter { selectedKeys.contains(it.rawId) } as ArrayList
private fun getSelectedPhoneNumber(): String? {
- val numbers = getSelectedItems().firstOrNull()?.phoneNumbers
- val primaryNumber = numbers?.firstOrNull { it.isPrimary }
- return primaryNumber?.normalizedNumber ?: numbers?.firstOrNull()?.normalizedNumber
+ return getSelectedItems().firstOrNull()?.getPrimaryNumber()
}
private fun tryCreateShortcut() {
@@ -242,16 +240,16 @@ class ContactsAdapter(
val contact = contacts.firstOrNull { selectedKeys.contains(it.rawId) } ?: return
val manager = activity.shortcutManager
if (manager.isRequestPinShortcutSupported) {
- SimpleContactsHelper(activity).getShortcutImage(contact.photoUri, contact.name) { image ->
+ SimpleContactsHelper(activity).getShortcutImage(contact.photoUri, contact.getNameToDisplay()) { image ->
activity.runOnUiThread {
activity.handlePermission(PERMISSION_CALL_PHONE) { hasPermission ->
val action = if (hasPermission) Intent.ACTION_CALL else Intent.ACTION_DIAL
val intent = Intent(action).apply {
- data = Uri.fromParts("tel", contact.phoneNumbers.first().normalizedNumber, null)
+ data = Uri.fromParts("tel", getSelectedPhoneNumber(), null)
}
val shortcut = ShortcutInfo.Builder(activity, contact.hashCode().toString())
- .setShortLabel(contact.name)
+ .setShortLabel(contact.getNameToDisplay())
.setIcon(Icon.createWithBitmap(image))
.setIntent(intent)
.build()
@@ -270,18 +268,19 @@ class ContactsAdapter(
}
}
- private fun setupView(view: View, contact: SimpleContact, holder: ViewHolder) {
+ private fun setupView(view: View, contact: Contact, holder: ViewHolder) {
view.apply {
findViewById(R.id.item_contact_frame).isSelected = selectedKeys.contains(contact.rawId)
findViewById(R.id.item_contact_name).apply {
setTextColor(textColor)
setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
- text = if (textToHighlight.isEmpty()) contact.name else {
- if (contact.name.contains(textToHighlight, true)) {
- contact.name.highlightTextPart(textToHighlight, properPrimaryColor)
+ val name = contact.getNameToDisplay()
+ text = if (textToHighlight.isEmpty()) name else {
+ if (name.contains(textToHighlight, true)) {
+ name.highlightTextPart(textToHighlight, properPrimaryColor)
} else {
- contact.name.highlightTextFromNumbers(textToHighlight, properPrimaryColor)
+ name.highlightTextFromNumbers(textToHighlight, properPrimaryColor)
}
}
}
@@ -306,7 +305,7 @@ class ContactsAdapter(
}
if (!activity.isDestroyed) {
- SimpleContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.name)
+ SimpleContactsHelper(context).loadContactImage(contact.photoUri, findViewById(R.id.item_contact_image), contact.getNameToDisplay())
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/FilterContactSourcesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/FilterContactSourcesAdapter.kt
new file mode 100644
index 00000000..9a756857
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/FilterContactSourcesAdapter.kt
@@ -0,0 +1,78 @@
+package com.simplemobiletools.dialer.adapters
+
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.simplemobiletools.commons.extensions.getProperBackgroundColor
+import com.simplemobiletools.commons.extensions.getProperPrimaryColor
+import com.simplemobiletools.commons.extensions.getProperTextColor
+import com.simplemobiletools.commons.helpers.SMT_PRIVATE
+import com.simplemobiletools.commons.models.contacts.ContactSource
+import com.simplemobiletools.dialer.R
+import com.simplemobiletools.dialer.activities.SimpleActivity
+import kotlinx.android.synthetic.main.item_filter_contact_source.view.*
+
+class FilterContactSourcesAdapter(
+ val activity: SimpleActivity,
+ private val contactSources: List,
+ private val displayContactSources: ArrayList
+) : RecyclerView.Adapter() {
+
+ private val selectedKeys = HashSet()
+
+ init {
+ contactSources.forEachIndexed { index, contactSource ->
+ if (displayContactSources.contains(contactSource.name)) {
+ selectedKeys.add(contactSource.hashCode())
+ }
+
+ if (contactSource.type == SMT_PRIVATE && displayContactSources.contains(SMT_PRIVATE)) {
+ selectedKeys.add(contactSource.hashCode())
+ }
+ }
+ }
+
+ private fun toggleItemSelection(select: Boolean, contactSource: ContactSource, position: Int) {
+ if (select) {
+ selectedKeys.add(contactSource.hashCode())
+ } else {
+ selectedKeys.remove(contactSource.hashCode())
+ }
+
+ notifyItemChanged(position)
+ }
+
+ fun getSelectedContactSources() = contactSources.filter { selectedKeys.contains(it.hashCode()) }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val view = activity.layoutInflater.inflate(R.layout.item_filter_contact_source, parent, false)
+ return ViewHolder(view)
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val contactSource = contactSources[position]
+ holder.bindView(contactSource)
+ }
+
+ override fun getItemCount() = contactSources.size
+
+ inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
+ fun bindView(contactSource: ContactSource): View {
+ val isSelected = selectedKeys.contains(contactSource.hashCode())
+ itemView.apply {
+ filter_contact_source_checkbox.isChecked = isSelected
+ filter_contact_source_checkbox.setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor())
+ val countText = if (contactSource.count >= 0) " (${contactSource.count})" else ""
+ val displayName = "${contactSource.publicName}$countText"
+ filter_contact_source_checkbox.text = displayName
+ filter_contact_source_holder.setOnClickListener { viewClicked(!isSelected, contactSource) }
+ }
+
+ return itemView
+ }
+
+ private fun viewClicked(select: Boolean, contactSource: ContactSource) {
+ toggleItemSelection(select, contactSource, adapterPosition)
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt
index 66de686f..71c91dd9 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/adapters/RecentCallsAdapter.kt
@@ -14,7 +14,7 @@ import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.FeatureLockedDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.MainActivity
@@ -246,11 +246,11 @@ class RecentCallsAdapter(
}
}
- private fun findContactByCall(recentCall: RecentCall): SimpleContact? {
+ private fun findContactByCall(recentCall: RecentCall): Contact? {
return (activity as MainActivity).cachedContacts.find { it.name == recentCall.name && it.doesHavePhoneNumber(recentCall.phoneNumber) }
}
- private fun launchContactDetailsIntent(contact: SimpleContact?) {
+ private fun launchContactDetailsIntent(contact: Contact?) {
if (contact != null) {
activity.startContactDetailsIntent(contact)
}
@@ -275,13 +275,14 @@ class RecentCallsAdapter(
private fun setupView(view: View, call: RecentCall) {
view.apply {
item_recents_holder.isSelected = selectedKeys.contains(call.id)
- var nameToShow = SpannableString(call.name)
+ val name = findContactByCall(call)?.getNameToDisplay() ?: call.name
+ var nameToShow = SpannableString(name)
if (call.specificType.isNotEmpty()) {
- nameToShow = SpannableString("${call.name} - ${call.specificType}")
+ nameToShow = SpannableString("${name} - ${call.specificType}")
// show specific number at "Show call details" dialog too
if (refreshItemsListener == null) {
- nameToShow = SpannableString("${call.name} - ${call.specificType}, ${call.specificNumber}")
+ nameToShow = SpannableString("${name} - ${call.specificType}, ${call.specificNumber}")
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/ChangeSortingDialog.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/ChangeSortingDialog.kt
index ef309efb..db411f26 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/ChangeSortingDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/ChangeSortingDialog.kt
@@ -1,24 +1,15 @@
package com.simplemobiletools.dialer.dialogs
-import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.beGoneIf
import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
import com.simplemobiletools.commons.extensions.setupDialogStuff
-import com.simplemobiletools.commons.helpers.SORT_BY_CUSTOM
-import com.simplemobiletools.commons.helpers.SORT_BY_DATE_CREATED
-import com.simplemobiletools.commons.helpers.SORT_BY_FULL_NAME
-import com.simplemobiletools.commons.helpers.SORT_DESCENDING
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.extensions.config
import kotlinx.android.synthetic.main.dialog_change_sorting.view.*
-class ChangeSortingDialog(
- val activity: BaseSimpleActivity,
- private val showCustomSorting: Boolean = false,
- private val callback: () -> Unit
-) {
+class ChangeSortingDialog(val activity: BaseSimpleActivity, private val showCustomSorting: Boolean = false, private val callback: () -> Unit) {
private var currSorting = 0
private var config = activity.config
private var view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null)
@@ -51,17 +42,18 @@ class ChangeSortingDialog(
}
val sortBtn = when {
+ currSorting and SORT_BY_FIRST_NAME != 0 -> sortingRadio.sorting_dialog_radio_first_name
+ currSorting and SORT_BY_MIDDLE_NAME != 0 -> sortingRadio.sorting_dialog_radio_middle_name
+ currSorting and SORT_BY_SURNAME != 0 -> sortingRadio.sorting_dialog_radio_surname
currSorting and SORT_BY_FULL_NAME != 0 -> sortingRadio.sorting_dialog_radio_full_name
currSorting and SORT_BY_CUSTOM != 0 -> sortingRadio.sorting_dialog_radio_custom
else -> sortingRadio.sorting_dialog_radio_date_created
}
-
sortBtn.isChecked = true
if (showCustomSorting) {
sortingRadio.sorting_dialog_radio_custom.isChecked = config.isCustomOrderSelected
}
-
view.sorting_dialog_radio_custom.beGoneIf(!showCustomSorting)
}
@@ -78,6 +70,9 @@ class ChangeSortingDialog(
private fun dialogConfirmed() {
val sortingRadio = view.sorting_dialog_radio_sorting
var sorting = when (sortingRadio.checkedRadioButtonId) {
+ R.id.sorting_dialog_radio_first_name -> SORT_BY_FIRST_NAME
+ R.id.sorting_dialog_radio_middle_name -> SORT_BY_MIDDLE_NAME
+ R.id.sorting_dialog_radio_surname -> SORT_BY_SURNAME
R.id.sorting_dialog_radio_full_name -> SORT_BY_FULL_NAME
R.id.sorting_dialog_radio_custom -> SORT_BY_CUSTOM
else -> SORT_BY_DATE_CREATED
@@ -98,7 +93,6 @@ class ChangeSortingDialog(
config.sorting = sorting
}
- SimpleContact.sorting = sorting
callback()
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/FilterContactSourcesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/FilterContactSourcesDialog.kt
new file mode 100644
index 00000000..5ff44d7a
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/FilterContactSourcesDialog.kt
@@ -0,0 +1,91 @@
+package com.simplemobiletools.dialer.dialogs
+
+import androidx.appcompat.app.AlertDialog
+import com.simplemobiletools.commons.extensions.getAlertDialogBuilder
+import com.simplemobiletools.commons.extensions.getMyContactsCursor
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.helpers.SMT_PRIVATE
+import com.simplemobiletools.commons.extensions.getVisibleContactSources
+import com.simplemobiletools.commons.helpers.ContactsHelper
+import com.simplemobiletools.commons.helpers.MyContactsContentProvider
+import com.simplemobiletools.commons.models.contacts.*
+import com.simplemobiletools.dialer.R
+import com.simplemobiletools.dialer.activities.SimpleActivity
+import com.simplemobiletools.dialer.adapters.FilterContactSourcesAdapter
+import com.simplemobiletools.dialer.extensions.config
+import kotlinx.android.synthetic.main.dialog_filter_contact_sources.view.*
+
+class FilterContactSourcesDialog(val activity: SimpleActivity, private val callback: () -> Unit) {
+ private var dialog: AlertDialog? = null
+ private val view = activity.layoutInflater.inflate(R.layout.dialog_filter_contact_sources, null)
+ private var contactSources = ArrayList()
+ private var contacts = ArrayList()
+ private var isContactSourcesReady = false
+ private var isContactsReady = false
+
+ init {
+ val contactHelper = ContactsHelper(activity)
+ contactHelper.getContactSources { contactSources ->
+ contactSources.mapTo(this@FilterContactSourcesDialog.contactSources) { it.copy() }
+ isContactSourcesReady = true
+ processDataIfReady()
+ }
+
+ contactHelper.getContacts(getAll = true, showOnlyContactsWithNumbers = true) {
+ it.mapTo(contacts) { contact -> contact.copy() }
+ val privateCursor = activity.getMyContactsCursor(false, true)
+ val privateContacts = MyContactsContentProvider.getContacts(activity, privateCursor)
+ this.contacts.addAll(privateContacts)
+ isContactsReady = true
+ processDataIfReady()
+ }
+ }
+
+ private fun processDataIfReady() {
+ if (!isContactSourcesReady) {
+ return
+ }
+
+ val contactSourcesWithCount = ArrayList()
+ for (contactSource in contactSources) {
+ val count = if (isContactsReady) {
+ contacts.filter { it.source == contactSource.name }.count()
+ } else {
+ -1
+ }
+ contactSourcesWithCount.add(contactSource.copy(count = count))
+ }
+
+ contactSources.clear()
+ contactSources.addAll(contactSourcesWithCount)
+
+ activity.runOnUiThread {
+ val selectedSources = activity.getVisibleContactSources()
+ view.filter_contact_sources_list.adapter = FilterContactSourcesAdapter(activity, contactSourcesWithCount, selectedSources)
+
+ if (dialog == null) {
+ activity.getAlertDialogBuilder()
+ .setPositiveButton(R.string.ok) { dialogInterface, i -> confirmContactSources() }
+ .setNegativeButton(R.string.cancel, null)
+ .apply {
+ activity.setupDialogStuff(view, this) { alertDialog ->
+ dialog = alertDialog
+ }
+ }
+ }
+ }
+ }
+
+ private fun confirmContactSources() {
+ val selectedContactSources = (view.filter_contact_sources_list.adapter as FilterContactSourcesAdapter).getSelectedContactSources()
+ val ignoredContactSources = contactSources.filter { !selectedContactSources.contains(it) }.map {
+ if (it.type == SMT_PRIVATE) SMT_PRIVATE else it.getFullIdentifier()
+ }.toHashSet()
+
+ if (activity.getVisibleContactSources() != ignoredContactSources) {
+ activity.config.ignoredContactSources = ignoredContactSources
+ callback()
+ }
+ dialog?.dismiss()
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/SelectContactDialog.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/SelectContactDialog.kt
index 0e881471..104838fe 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/SelectContactDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/SelectContactDialog.kt
@@ -3,14 +3,14 @@ package com.simplemobiletools.dialer.dialogs
import androidx.appcompat.app.AlertDialog
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.ContactsAdapter
import kotlinx.android.synthetic.main.dialog_select_contact.view.*
import java.util.*
-class SelectContactDialog(val activity: SimpleActivity, contacts: ArrayList, val callback: (selectedContact: SimpleContact) -> Unit) {
+class SelectContactDialog(val activity: SimpleActivity, contacts: ArrayList, val callback: (selectedContact: Contact) -> Unit) {
private var dialog: AlertDialog? = null
private var view = activity.layoutInflater.inflate(R.layout.dialog_select_contact, null)
@@ -23,7 +23,7 @@ class SelectContactDialog(val activity: SimpleActivity, contacts: ArrayList
try {
- val name = contacts[position].name
+ val name = contacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault()))
} catch (e: Exception) {
@@ -32,7 +32,7 @@ class SelectContactDialog(val activity: SimpleActivity, contacts: ArrayList Unit) {
+class SelectSIMDialog(
+ val activity: BaseSimpleActivity,
+ val phoneNumber: String,
+ onDismiss: () -> Unit = {},
+ val callback: (handle: PhoneAccountHandle?) -> Unit
+) {
private var dialog: AlertDialog? = null
private val view = activity.layoutInflater.inflate(R.layout.dialog_select_sim, null)
@@ -42,6 +47,10 @@ class SelectSIMDialog(val activity: BaseSimpleActivity, val phoneNumber: String,
dialog = alertDialog
}
}
+
+ dialog?.setOnDismissListener {
+ onDismiss()
+ }
}
private fun selectedSIM(handle: PhoneAccountHandle) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Activity.kt
index e59a784b..479d5ed4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/extensions/Activity.kt
@@ -11,7 +11,8 @@ import android.telecom.TelecomManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
+import com.simplemobiletools.dialer.activities.DialerActivity
import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.dialogs.SelectSIMDialog
@@ -42,7 +43,7 @@ fun BaseSimpleActivity.callContactWithSim(recipient: String, useMainSIM: Boolean
}
// handle private contacts differently, only Simple Contacts Pro can open them
-fun Activity.startContactDetailsIntent(contact: SimpleContact) {
+fun Activity.startContactDetailsIntent(contact: Contact) {
val simpleContacts = "com.simplemobiletools.contacts.pro"
val simpleContactsDebug = "com.simplemobiletools.contacts.pro.debug"
if (contact.rawId > 1000000 && contact.contactId > 1000000 && contact.rawId == contact.contactId &&
@@ -81,7 +82,11 @@ fun SimpleActivity.getHandleToUse(intent: Intent?, phoneNumber: String, callback
defaultHandle != null -> callback(defaultHandle)
else -> {
- SelectSIMDialog(this, phoneNumber) { handle ->
+ SelectSIMDialog(this, phoneNumber, onDismiss = {
+ if (this is DialerActivity) {
+ finish()
+ }
+ }) { handle ->
callback(handle)
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt
index f0a2bb9f..ffbd619a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/ContactsFragment.kt
@@ -5,10 +5,8 @@ import android.util.AttributeSet
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.MyContactsContentProvider
-import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.helpers.*
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.MainActivity
import com.simplemobiletools.dialer.activities.SimpleActivity
@@ -20,7 +18,7 @@ import kotlinx.android.synthetic.main.fragment_letters_layout.view.*
import java.util.*
class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshItemsListener {
- private var allContacts = ArrayList()
+ private var allContacts = ArrayList()
override fun setupFragment() {
val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
@@ -64,15 +62,16 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
override fun refreshItems(callback: (() -> Unit)?) {
val privateCursor = context?.getMyContactsCursor(false, true)
- SimpleContactsHelper(context).getAvailableContacts(false) { contacts ->
+ ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
allContacts = contacts
- val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor)
- if (privateContacts.isNotEmpty()) {
- allContacts.addAll(privateContacts)
- allContacts.sort()
+ if (SMT_PRIVATE !in context.baseConfig.ignoredContactSources) {
+ val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor)
+ if (privateContacts.isNotEmpty()) {
+ allContacts.addAll(privateContacts)
+ allContacts.sort()
+ }
}
-
(activity as MainActivity).cacheContacts(allContacts)
activity?.runOnUiThread {
@@ -82,7 +81,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
}
}
- private fun gotContacts(contacts: ArrayList) {
+ private fun gotContacts(contacts: ArrayList) {
setupLetterFastscroller(contacts)
if (contacts.isEmpty()) {
fragment_placeholder.beVisible()
@@ -96,7 +95,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
val currAdapter = fragment_list.adapter
if (currAdapter == null) {
ContactsAdapter(activity as SimpleActivity, contacts, fragment_list, this) {
- val contact = it as SimpleContact
+ val contact = it as Contact
activity?.startContactDetailsIntent(contact)
}.apply {
fragment_list.adapter = this
@@ -111,10 +110,10 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
}
}
- private fun setupLetterFastscroller(contacts: ArrayList) {
+ private fun setupLetterFastscroller(contacts: ArrayList) {
letter_fastscroller.setupWithRecyclerView(fragment_list, { position ->
try {
- val name = contacts[position].name
+ val name = contacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault()).normalizeString())
} catch (e: Exception) {
@@ -130,26 +129,37 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag
}
override fun onSearchQueryChanged(text: String) {
- val contacts = allContacts.filter {
- it.doesContainPhoneNumber(text) ||
- it.name.contains(text, true) ||
- it.name.normalizeString().contains(text, true) ||
- it.name.contains(text.normalizeString(), true)
- }.sortedByDescending {
- it.name.startsWith(text, true)
- }.toMutableList() as ArrayList
+ val shouldNormalize = text.normalizeString() == text
+ val filtered = allContacts.filter {
+ getProperText(it.getNameToDisplay(), shouldNormalize).contains(text, true) ||
+ getProperText(it.nickname, shouldNormalize).contains(text, true) ||
+ it.phoneNumbers.any {
+ text.normalizePhoneNumber().isNotEmpty() && it.normalizedNumber.contains(text.normalizePhoneNumber(), true)
+ } ||
+ it.emails.any { it.value.contains(text, true) } ||
+ it.addresses.any { getProperText(it.value, shouldNormalize).contains(text, true) } ||
+ it.IMs.any { it.value.contains(text, true) } ||
+ getProperText(it.notes, shouldNormalize).contains(text, true) ||
+ getProperText(it.organization.company, shouldNormalize).contains(text, true) ||
+ getProperText(it.organization.jobPosition, shouldNormalize).contains(text, true) ||
+ it.websites.any { it.contains(text, true) }
+ } as ArrayList
- fragment_placeholder.beVisibleIf(contacts.isEmpty())
- (fragment_list.adapter as? ContactsAdapter)?.updateItems(contacts, text)
- setupLetterFastscroller(contacts)
- }
+ filtered.sortBy {
+ val nameToDisplay = it.getNameToDisplay()
+ !getProperText(nameToDisplay, shouldNormalize).startsWith(text, true) && !nameToDisplay.contains(text, true)
+ }
+ fragment_placeholder.beVisibleIf(filtered.isEmpty())
+ (fragment_list.adapter as? ContactsAdapter)?.updateItems(filtered, text)
+ setupLetterFastscroller(filtered)
+ }
private fun requestReadContactsPermission() {
activity?.handlePermission(PERMISSION_READ_CONTACTS) {
if (it) {
fragment_placeholder.text = context.getString(R.string.no_contacts_found)
fragment_placeholder_2.text = context.getString(R.string.create_new_contact)
- SimpleContactsHelper(context).getAvailableContacts(false) { contacts ->
+ ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
activity?.runOnUiThread {
gotContacts(contacts)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/FavoritesFragment.kt
index 8c6dc263..5336f857 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/FavoritesFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/FavoritesFragment.kt
@@ -8,11 +8,12 @@ import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.CallConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.helpers.MyContactsContentProvider
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
+import com.simplemobiletools.commons.helpers.SMT_PRIVATE
import com.simplemobiletools.commons.models.RadioItem
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.ContactsAdapter
@@ -23,7 +24,7 @@ import kotlinx.android.synthetic.main.fragment_letters_layout.view.*
import java.util.*
class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPagerFragment(context, attributeSet), RefreshItemsListener {
- private var allContacts = ArrayList()
+ private var allContacts = ArrayList()
override fun setupFragment() {
val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) {
@@ -48,18 +49,25 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
}
override fun refreshItems(callback: (() -> Unit)?) {
- val privateCursor = context?.getMyContactsCursor(true, true)
- SimpleContactsHelper(context).getAvailableContacts(true) { contacts ->
+ ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
allContacts = contacts
- val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor)
- if (privateContacts.isNotEmpty()) {
- allContacts.addAll(privateContacts)
- allContacts.sort()
+ if (SMT_PRIVATE !in context.baseConfig.ignoredContactSources) {
+ val privateCursor = context?.getMyContactsCursor(true, true)
+ val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor).map {
+ it.copy(starred = 1)
+ }
+ if (privateContacts.isNotEmpty()) {
+ allContacts.addAll(privateContacts)
+ allContacts.sort()
+ }
}
+ val favorites = contacts.filter { it.starred == 1 } as ArrayList
- if (activity!!.config.isCustomOrderSelected) {
- allContacts = sortByCustomOrder(allContacts)
+ allContacts = if (activity!!.config.isCustomOrderSelected) {
+ sortByCustomOrder(favorites)
+ } else {
+ favorites
}
activity?.runOnUiThread {
@@ -69,7 +77,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
}
}
- private fun gotContacts(contacts: ArrayList) {
+ private fun gotContacts(contacts: ArrayList) {
setupLetterFastscroller(contacts)
if (contacts.isEmpty()) {
fragment_placeholder.beVisible()
@@ -89,11 +97,11 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
enableDrag = true,
) {
if (context.config.showCallConfirmation) {
- CallConfirmationDialog(activity as SimpleActivity, (it as SimpleContact).name) {
+ CallConfirmationDialog(activity as SimpleActivity, (it as Contact).getNameToDisplay()) {
callContact(it)
}
} else {
- callContact(it as SimpleContact)
+ callContact(it as Contact)
}
}.apply {
fragment_list.adapter = this
@@ -117,7 +125,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
}
}
- private fun sortByCustomOrder(favorites: List): ArrayList {
+ private fun sortByCustomOrder(favorites: List): ArrayList {
val favoritesOrder = activity!!.config.favoritesContactsOrder
if (favoritesOrder.isEmpty()) {
@@ -131,7 +139,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
return ArrayList(sorted)
}
- private fun saveCustomOrderToPrefs(items: ArrayList) {
+ private fun saveCustomOrderToPrefs(items: ArrayList) {
activity?.apply {
val orderIds = items.map { it.contactId }
val orderGsonString = Gson().toJson(orderIds)
@@ -139,9 +147,11 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
}
}
- private fun callContact(simpleContact: SimpleContact) {
+ private fun callContact(simpleContact: Contact) {
val phoneNumbers = simpleContact.phoneNumbers
- if (phoneNumbers.size <= 1) {
+ if (phoneNumbers.isEmpty()) {
+ return
+ } else if (phoneNumbers.size <= 1) {
activity?.launchCallIntent(phoneNumbers.first().normalizedNumber)
} else {
val primaryNumber = simpleContact.phoneNumbers.find { it.isPrimary }
@@ -161,10 +171,10 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
}
}
- private fun setupLetterFastscroller(contacts: ArrayList) {
+ private fun setupLetterFastscroller(contacts: ArrayList) {
letter_fastscroller.setupWithRecyclerView(fragment_list, { position ->
try {
- val name = contacts[position].name
+ val name = contacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault()).normalizeString())
} catch (e: Exception) {
@@ -184,7 +194,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa
it.name.contains(text, true) || it.doesContainPhoneNumber(text)
}.sortedByDescending {
it.name.startsWith(text, true)
- }.toMutableList() as ArrayList
+ }.toMutableList() as ArrayList
fragment_placeholder.beVisibleIf(contacts.isEmpty())
(fragment_list.adapter as? ContactsAdapter)?.updateItems(contacts, text)
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 d18a0a0f..0a6f1e17 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/MyViewPagerFragment.kt
@@ -6,7 +6,11 @@ import android.widget.RelativeLayout
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.getProperPrimaryColor
import com.simplemobiletools.commons.extensions.getProperTextColor
+import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
+import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
+import com.simplemobiletools.dialer.activities.MainActivity
import com.simplemobiletools.dialer.activities.SimpleActivity
+import com.simplemobiletools.dialer.adapters.ContactsAdapter
import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.helpers.Config
import kotlinx.android.synthetic.main.fragment_letters_layout.view.*
@@ -27,6 +31,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
}
}
+ fun startNameWithSurnameChanged(startNameWithSurname: Boolean) {
+ if (this !is RecentsFragment) {
+ (fragment_list.adapter as? ContactsAdapter)?.apply {
+ config.sorting = if (startNameWithSurname) SORT_BY_SURNAME else SORT_BY_FIRST_NAME
+ (this@MyViewPagerFragment.activity!! as MainActivity).refreshFragments()
+ }
+ }
+ }
+
fun finishActMode() {
(fragment_list?.adapter as? MyRecyclerViewAdapter)?.finishActMode()
(recents_list?.adapter as? MyRecyclerViewAdapter)?.finishActMode()
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt
index e7c59c32..0a995e11 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt
@@ -4,9 +4,10 @@ import android.content.Context
import android.util.AttributeSet
import com.simplemobiletools.commons.dialogs.CallConfirmationDialog
import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.helpers.MyContactsContentProvider
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
+import com.simplemobiletools.commons.helpers.SMT_PRIVATE
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.adapters.RecentCallsAdapter
@@ -49,30 +50,38 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage
val privateCursor = context?.getMyContactsCursor(false, true)
val groupSubsequentCalls = context?.config?.groupSubsequentCalls ?: false
RecentsHelper(context).getRecentCalls(groupSubsequentCalls) { recents ->
- SimpleContactsHelper(context).getAvailableContacts(false) { contacts ->
- val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor)
+ ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
+ val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor)
recents.filter { it.phoneNumber == it.name }.forEach { recent ->
var wasNameFilled = false
if (privateContacts.isNotEmpty()) {
val privateContact = privateContacts.firstOrNull { it.doesContainPhoneNumber(recent.phoneNumber) }
if (privateContact != null) {
- recent.name = privateContact.name
+ recent.name = privateContact.getNameToDisplay()
wasNameFilled = true
}
}
if (!wasNameFilled) {
- val contact = contacts.firstOrNull { it.phoneNumbers.first().normalizedNumber == recent.phoneNumber }
+ val contact = contacts.filter { it.phoneNumbers.isNotEmpty() }.firstOrNull { it.phoneNumbers.first().normalizedNumber == recent.phoneNumber }
if (contact != null) {
- recent.name = contact.name
+ recent.name = contact.getNameToDisplay()
}
}
}
-
allRecentCalls = recents
+
+ // hide private contacts from recent calls
+ if (SMT_PRIVATE in context.baseConfig.ignoredContactSources) {
+ allRecentCalls = recents.filterNot { recent ->
+ val privateNumbers = privateContacts.flatMap { it.phoneNumbers }.map { it.value }
+ recent.phoneNumber in privateNumbers
+ } as ArrayList
+ }
+
activity?.runOnUiThread {
- gotRecents(recents)
+ gotRecents(allRecentCalls)
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallContactHelper.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallContactHelper.kt
index 9d0b4cb5..fbf1c3ea 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallContactHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallContactHelper.kt
@@ -5,8 +5,8 @@ import android.net.Uri
import android.telecom.Call
import com.simplemobiletools.commons.extensions.getMyContactsCursor
import com.simplemobiletools.commons.extensions.getPhoneNumberTypeText
+import com.simplemobiletools.commons.helpers.ContactsHelper
import com.simplemobiletools.commons.helpers.MyContactsContentProvider
-import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.extensions.isConference
@@ -35,8 +35,8 @@ fun getCallContact(context: Context, call: Call?, callback: (CallContact) -> Uni
val uri = Uri.decode(handle)
if (uri.startsWith("tel:")) {
val number = uri.substringAfter("tel:")
- SimpleContactsHelper(context).getAvailableContacts(false) { contacts ->
- val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor)
+ ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
+ val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor)
if (privateContacts.isNotEmpty()) {
contacts.addAll(privateContacts)
}
@@ -53,7 +53,7 @@ fun getCallContact(context: Context, call: Call?, callback: (CallContact) -> Uni
callContact.number = number
val contact = contacts.firstOrNull { it.doesHavePhoneNumber(number) }
if (contact != null) {
- callContact.name = contact.name
+ callContact.name = contact.getNameToDisplay()
callContact.photoUri = contact.photoUri
if (contact.phoneNumbers.size > 1) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt
index 7840047f..641e9cf1 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/CallManager.kt
@@ -1,13 +1,11 @@
package com.simplemobiletools.dialer.helpers
import android.annotation.SuppressLint
-import android.content.Context
import android.os.Handler
import android.telecom.Call
import android.telecom.CallAudioState
import android.telecom.InCallService
import android.telecom.VideoProfile
-import com.simplemobiletools.dialer.extensions.config
import com.simplemobiletools.dialer.extensions.getStateCompat
import com.simplemobiletools.dialer.extensions.hasCapability
import com.simplemobiletools.dialer.extensions.isConference
@@ -156,9 +154,10 @@ class CallManager {
fun reject() {
if (call != null) {
- if (getState() == Call.STATE_RINGING) {
+ val state = getState()
+ if (state == Call.STATE_RINGING) {
call!!.reject(false, null)
- } else {
+ } else if (state != Call.STATE_DISCONNECTED && state != Call.STATE_DISCONNECTING) {
call!!.disconnect()
}
}
@@ -201,15 +200,11 @@ class CallManager {
fun getState() = getPrimaryCall()?.getStateCompat()
- fun keypad(context: Context, char: Char) {
- call?.playDtmfTone(char)
- if (context.config.dialpadBeeps) {
+ fun keypad(char: Char) {
+ call?.playDtmfTone(char)
Handler().postDelayed({
call?.stopDtmfTone()
}, DIALPAD_TONE_LENGTH_MS)
- } else {
- call?.stopDtmfTone()
- }
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Config.kt
index 351fbd4d..3b84c086 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Config.kt
@@ -13,11 +13,6 @@ class Config(context: Context) : BaseConfig(context) {
companion object {
fun newInstance(context: Context) = Config(context)
}
-
- var speedDial: String
- get() = prefs.getString(SPEED_DIAL, "")!!
- set(speedDial) = prefs.edit().putString(SPEED_DIAL, speedDial).apply()
-
fun getSpeedDialValues(): ArrayList {
val speedDialType = object : TypeToken>() {}.type
val speedDialValues = Gson().fromJson>(speedDial, speedDialType) ?: ArrayList(1)
@@ -54,6 +49,9 @@ class Config(context: Context) : BaseConfig(context) {
fun removeCustomSIM(number: String) {
prefs.edit().remove(REMEMBER_SIM_PREFIX + number).apply()
}
+ var showTabs: Int
+ get() = prefs.getInt(SHOW_TABS, ALL_TABS_MASK)
+ set(showTabs) = prefs.edit().putInt(SHOW_TABS, showTabs).apply()
var groupSubsequentCalls: Boolean
get() = prefs.getBoolean(GROUP_SUBSEQUENT_CALLS, true)
@@ -71,18 +69,6 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(DISABLE_SWIPE_TO_ANSWER, false)
set(disableSwipeToAnswer) = prefs.edit().putBoolean(DISABLE_SWIPE_TO_ANSWER, disableSwipeToAnswer).apply()
- var showTabs: Int
- get() = prefs.getInt(SHOW_TABS, ALL_TABS_MASK)
- set(showTabs) = prefs.edit().putInt(SHOW_TABS, showTabs).apply()
-
- var favoritesContactsOrder: String
- get() = prefs.getString(FAVORITES_CONTACTS_ORDER, "")!!
- set(order) = prefs.edit().putString(FAVORITES_CONTACTS_ORDER, order).apply()
-
- var isCustomOrderSelected: Boolean
- get() = prefs.getBoolean(FAVORITES_CUSTOM_ORDER_SELECTED, false)
- set(selected) = prefs.edit().putBoolean(FAVORITES_CUSTOM_ORDER_SELECTED, selected).apply()
-
var wasOverlaySnackbarConfirmed: Boolean
get() = prefs.getBoolean(WAS_OVERLAY_SNACKBAR_CONFIRMED, false)
set(wasOverlaySnackbarConfirmed) = prefs.edit().putBoolean(WAS_OVERLAY_SNACKBAR_CONFIRMED, wasOverlaySnackbarConfirmed).apply()
@@ -91,6 +77,10 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getBoolean(DIALPAD_VIBRATION, true)
set(dialpadVibration) = prefs.edit().putBoolean(DIALPAD_VIBRATION, dialpadVibration).apply()
+ var hideDialpadNumbers: Boolean
+ get() = prefs.getBoolean(HIDE_DIALPAD_NUMBERS, false)
+ set(hideDialpadNumbers) = prefs.edit().putBoolean(HIDE_DIALPAD_NUMBERS, hideDialpadNumbers).apply()
+
var dialpadBeeps: Boolean
get() = prefs.getBoolean(DIALPAD_BEEPS, true)
set(dialpadBeeps) = prefs.edit().putBoolean(DIALPAD_BEEPS, dialpadBeeps).apply()
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 7c970ed9..a1329979 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/Constants.kt
@@ -17,6 +17,7 @@ const val FAVORITES_CUSTOM_ORDER_SELECTED = "favorites_custom_order_selected"
const val WAS_OVERLAY_SNACKBAR_CONFIRMED = "was_overlay_snackbar_confirmed"
const val DIALPAD_VIBRATION = "dialpad_vibration"
const val DIALPAD_BEEPS = "dialpad_beeps"
+const val HIDE_DIALPAD_NUMBERS = "hide_dialpad_numbers"
const val ALWAYS_SHOW_FULLSCREEN = "always_show_fullscreen"
const val ALL_TABS_MASK = TAB_CONTACTS or TAB_FAVORITES or TAB_CALL_HISTORY
diff --git a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt
index f6e2a347..1dd7d8ed 100644
--- a/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/dialer/helpers/RecentsHelper.kt
@@ -5,7 +5,7 @@ import android.content.Context
import android.provider.CallLog.Calls
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
-import com.simplemobiletools.commons.models.SimpleContact
+import com.simplemobiletools.commons.models.contacts.Contact
import com.simplemobiletools.dialer.R
import com.simplemobiletools.dialer.activities.SimpleActivity
import com.simplemobiletools.dialer.extensions.getAvailableSIMCardLabels
@@ -24,8 +24,8 @@ class RecentsHelper(private val context: Context) {
return@ensureBackgroundThread
}
- SimpleContactsHelper(context).getAvailableContacts(false) { contacts ->
- val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor)
+ ContactsHelper(context).getContacts(showOnlyContactsWithNumbers = true) { contacts ->
+ val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor)
if (privateContacts.isNotEmpty()) {
contacts.addAll(privateContacts)
}
@@ -36,7 +36,8 @@ class RecentsHelper(private val context: Context) {
}
@SuppressLint("NewApi")
- private fun getRecents(contacts: ArrayList, groupSubsequentCalls: Boolean, callback: (ArrayList) -> Unit) {
+ private fun getRecents(contacts: ArrayList, groupSubsequentCalls: Boolean, callback: (ArrayList) -> Unit) {
+
var recentCalls = ArrayList()
var previousRecentCallFrom = ""
var previousStartTS = 0
@@ -96,11 +97,11 @@ class RecentsHelper(private val context: Context) {
} else {
val normalizedNumber = number.normalizePhoneNumber()
if (normalizedNumber!!.length >= COMPARABLE_PHONE_NUMBER_LENGTH) {
- name = contacts.firstOrNull { contact ->
+ name = contacts.filter { it.phoneNumbers.isNotEmpty() }.firstOrNull { contact ->
val curNumber = contact.phoneNumbers.first().normalizedNumber
if (curNumber.length >= COMPARABLE_PHONE_NUMBER_LENGTH) {
if (curNumber.substring(curNumber.length - COMPARABLE_PHONE_NUMBER_LENGTH) == normalizedNumber.substring(normalizedNumber.length - COMPARABLE_PHONE_NUMBER_LENGTH)) {
- contactsNumbersMap[number] = contact.name
+ contactsNumbersMap[number] = contact.getNameToDisplay()
return@firstOrNull true
}
}
diff --git a/app/src/main/res/layout/activity_conference.xml b/app/src/main/res/layout/activity_conference.xml
index f07b4385..d8e1f10c 100644
--- a/app/src/main/res/layout/activity_conference.xml
+++ b/app/src/main/res/layout/activity_conference.xml
@@ -6,29 +6,22 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
-
-
-
-
+ android:layout_height="?attr/actionBarSize"
+ android:background="@color/color_primary"
+ app:title="@string/conference"
+ app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
+ android:layout_marginTop="?attr/actionBarSize">
-
-
-
-
-
+ android:layout_height="?attr/actionBarSize"
+ android:background="@color/color_primary"
+ app:menu="@menu/menu_dialpad"
+ app:title="@string/dialpad"
+ app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
+ android:layout_marginTop="?attr/actionBarSize"
+ android:focusableInTouchMode="true">
-
-
-
-
-
+ android:layout_height="wrap_content" />
+ android:layout_marginTop="?attr/actionBarSize"
+ android:fillViewport="true"
+ android:scrollbars="none">
-
+ android:layout_height="?attr/actionBarSize"
+ android:background="@color/color_primary"
+ app:title="@string/manage_speed_dial"
+ app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
-
-
-
-
-
+ android:layout_marginTop="?attr/actionBarSize"
+ android:fillViewport="true"
+ android:scrollbars="none">
-
+
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 4c3df964..de1c60eb 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -6,29 +6,21 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
-
-
-
-
+ android:layout_height="?attr/actionBarSize"
+ android:background="@color/color_primary"
+ app:title="@string/settings"
+ app:titleTextAppearance="@style/AppTheme.ActionBar.TitleTextStyle" />
+ android:scrollbars="none">
-
+ android:layout_height="wrap_content">
-
+ android:text="@string/customize_colors"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
-
+
-
-
+
-
+ android:layout_height="wrap_content">
-
+
+
+
+
+
+
+ android:text="@string/use_english_language" />
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:layout_below="@+id/settings_font_size_label"
+ tools:text="@string/medium" />
-
+
-
+
-
+ android:text="@string/start_name_with_surname" />
-
+
-
+
-
-
-
+ android:text="@string/hide_dialpad_numbers" />
-
+
-
+
-
+ android:text="@string/dialpad_vibrations" />
-
+
-
+
-
+ android:text="@string/dialpad_beeps" />
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+ android:layout_height="wrap_content">
-
+
+
+
+
+
+
+
+
+ android:layout_below="@+id/settings_default_tab_label"
+ tools:text="@string/last_used_tab" />
-
+
-
+
-
+ android:text="@string/open_dialpad_by_default" />
-
+
-
-
-
-
-
-
-
-
-
-
+
-
+ android:layout_height="wrap_content">
-
+ android:text="@string/group_subsequent_calls" />
-
+
-
+
-
+ android:text="@string/show_call_confirmation_dialog" />
-
+
-
+
-
+ android:text="@string/disable_proximity_sensor" />
-
+
-
+
-
+ android:text="@string/disable_swipe_to_answer" />
-
+
-
+
-
+ android:text="@string/show_incoming_calls_full_screen" />
-
-
-
-
+
diff --git a/app/src/main/res/layout/dialog_change_sorting.xml b/app/src/main/res/layout/dialog_change_sorting.xml
index c1e1d493..2a073839 100644
--- a/app/src/main/res/layout/dialog_change_sorting.xml
+++ b/app/src/main/res/layout/dialog_change_sorting.xml
@@ -19,23 +19,54 @@
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/medium_margin">
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialog_filter_contact_sources.xml b/app/src/main/res/layout/dialog_filter_contact_sources.xml
new file mode 100644
index 00000000..19b4890e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_filter_contact_sources.xml
@@ -0,0 +1,10 @@
+
+
diff --git a/app/src/main/res/layout/dialpad.xml b/app/src/main/res/layout/dialpad.xml
index 8db0614f..45a9e70b 100644
--- a/app/src/main/res/layout/dialpad.xml
+++ b/app/src/main/res/layout/dialpad.xml
@@ -8,15 +8,16 @@
android:layout_alignParentBottom="true"
android:focusableInTouchMode="true"
android:layoutDirection="ltr"
+ android:paddingStart="@dimen/medium_margin"
android:paddingTop="@dimen/medium_margin"
+ android:paddingEnd="@dimen/medium_margin"
tools:ignore="HardcodedText">
+
+ android:layout_below="@+id/dialpad_0"
+ android:layout_marginBottom="@dimen/small_margin"
+ android:text="+" />
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_filter_contact_source.xml b/app/src/main/res/layout/item_filter_contact_source.xml
new file mode 100644
index 00000000..d4218d60
--- /dev/null
+++ b/app/src/main/res/layout/item_filter_contact_source.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/item_recent_call.xml b/app/src/main/res/layout/item_recent_call.xml
index 3bfae1d6..aa4bee34 100644
--- a/app/src/main/res/layout/item_recent_call.xml
+++ b/app/src/main/res/layout/item_recent_call.xml
@@ -17,7 +17,7 @@
android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size"
android:layout_centerVertical="true"
- android:layout_marginStart="@dimen/small_margin"
+ android:layout_marginStart="@dimen/normal_margin"
android:layout_marginEnd="@dimen/small_margin"
android:padding="@dimen/small_margin"
android:src="@drawable/ic_person_vector"
@@ -34,6 +34,8 @@
android:ellipsize="end"
android:maxLines="1"
android:textSize="@dimen/bigger_text_size"
+ android:textDirection="locale"
+ android:textAlignment="viewStart"
app:layout_constraintBottom_toTopOf="@id/item_recents_date_time"
app:layout_constraintEnd_toStartOf="@+id/overflow_menu_icon"
app:layout_constraintStart_toEndOf="@+id/item_recents_image"
@@ -81,7 +83,6 @@
android:src="@drawable/ic_incoming_call_vector"
app:layout_constraintBottom_toBottomOf="@+id/item_recents_date_time"
app:layout_constraintDimensionRatio="1:1"
- app:layout_constraintEnd_toStartOf="@id/item_recents_date_time"
app:layout_constraintStart_toEndOf="@+id/item_recents_sim_image"
app:layout_constraintTop_toTopOf="@+id/item_recents_date_time" />
diff --git a/app/src/main/res/menu/cab_contacts.xml b/app/src/main/res/menu/cab_contacts.xml
index 7b8e9dd1..b7b31717 100644
--- a/app/src/main/res/menu/cab_contacts.xml
+++ b/app/src/main/res/menu/cab_contacts.xml
@@ -2,7 +2,7 @@