diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index da5463ed..39cf1951 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,6 +21,7 @@ <uses-permission android:name="android.telecom.action.CONFIGURE_PHONE_ACCOUNT" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> + <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 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 e36cae24..4936b55c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/DialpadActivity.kt @@ -22,7 +22,7 @@ import androidx.core.view.isVisible import com.reddit.indicatorfastscroll.FastScrollItemIndicator 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.* @@ -36,7 +36,7 @@ import java.util.* import kotlin.math.roundToInt class DialpadActivity : SimpleActivity() { - private var allContacts = ArrayList<SimpleContact>() + private var allContacts = ArrayList<Contact>() private var speedDialValues = ArrayList<SpeedDial>() private val russianCharsMap = HashMap<Char, Int>() private var hasRussianLocale = false @@ -138,7 +138,7 @@ class DialpadActivity : SimpleActivity() { dialpad_input.onTextChangeListener { dialpadValueChanged(it) } dialpad_input.requestFocus() - SimpleContactsHelper(this).getAvailableContacts(false) { gotContacts(it) } + ContactsHelper(this).getContacts{ gotContacts(it) } dialpad_input.disableKeyboard() val properPrimaryColor = getProperPrimaryColor() @@ -219,10 +219,10 @@ class DialpadActivity : SimpleActivity() { dialpad_input.setText("") } - private fun gotContacts(newContacts: ArrayList<SimpleContact>) { + private fun gotContacts(newContacts: ArrayList<Contact>) { allContacts = newContacts - val privateContacts = MyContactsContentProvider.getSimpleContacts(this, privateCursor) + val privateContacts = MyContactsContentProvider.getContacts(this, privateCursor) if (privateContacts.isNotEmpty()) { allContacts.addAll(privateContacts) allContacts.sort() @@ -270,7 +270,7 @@ class DialpadActivity : SimpleActivity() { it.doesContainPhoneNumber(text) || (convertedName.contains(text, true)) }.sortedWith(compareBy { !it.doesContainPhoneNumber(text) - }).toMutableList() as ArrayList<SimpleContact> + }).toMutableList() as ArrayList<Contact> letter_fastscroller.setupWithRecyclerView(dialpad_list, { position -> try { @@ -283,7 +283,7 @@ class DialpadActivity : SimpleActivity() { }) ContactsAdapter(this, filtered, dialpad_list, null, text) { - startCallIntent((it as SimpleContact).phoneNumbers.first().normalizedNumber) + startCallIntent((it as Contact).phoneNumbers.first().normalizedNumber) }.apply { dialpad_list.adapter = this } 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 59300c48..4709d54e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/activities/MainActivity.kt @@ -20,7 +20,7 @@ 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 @@ -41,7 +41,7 @@ import me.grantland.widget.AutofitHelper class MainActivity : SimpleActivity() { private var launchedDialer = false private var storedShowTabs = 0 - var cachedContacts = ArrayList<SimpleContact>() + var cachedContacts = ArrayList<Contact>() override fun onCreate(savedInstanceState: Bundle?) { isMaterialActivity = true @@ -83,7 +83,7 @@ class MainActivity : SimpleActivity() { } setupTabs() - SimpleContact.sorting = config.sorting + Contact.sorting = config.sorting } override fun onResume() { @@ -520,7 +520,7 @@ class MainActivity : SimpleActivity() { } } - fun cacheContacts(contacts: List<SimpleContact>) { + fun cacheContacts(contacts: List<Contact>) { 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 fccad533..e24c5cad 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,10 @@ 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,7 +16,7 @@ import com.simplemobiletools.dialer.models.SpeedDial import kotlinx.android.synthetic.main.activity_manage_speed_dial.* class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener { - private var allContacts = ArrayList<SimpleContact>() + private var allContacts = ArrayList<Contact>() private var speedDialValues = ArrayList<SpeedDial>() override fun onCreate(savedInstanceState: Bundle?) { @@ -28,7 +29,7 @@ class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener { speedDialValues = config.getSpeedDialValues() updateAdapter() - SimpleContactsHelper(this).getAvailableContacts(false) { contacts -> + ContactsHelper(this).getContacts(false) { contacts -> allContacts = contacts } 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..d0636447 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<SimpleContact>, + var contacts: ArrayList<Contact>, recyclerView: MyRecyclerView, val refreshItemsListener: RefreshItemsListener? = null, highlightText: String = "", @@ -135,9 +135,9 @@ class ContactsAdapter( override fun getItemCount() = contacts.size - fun updateItems(newItems: ArrayList<SimpleContact>, highlightText: String = "") { + fun updateItems(newItems: ArrayList<Contact>, highlightText: String = "") { if (newItems.hashCode() != contacts.hashCode()) { - contacts = newItems.clone() as ArrayList<SimpleContact> + contacts = newItems.clone() as ArrayList<Contact> textToHighlight = highlightText notifyDataSetChanged() finishActMode() @@ -221,7 +221,7 @@ class ContactsAdapter( } } - private fun getSelectedItems() = contacts.filter { selectedKeys.contains(it.rawId) } as ArrayList<SimpleContact> + private fun getSelectedItems() = contacts.filter { selectedKeys.contains(it.rawId) } as ArrayList<Contact> private fun getSelectedPhoneNumber(): String? { val numbers = getSelectedItems().firstOrNull()?.phoneNumbers @@ -270,7 +270,7 @@ class ContactsAdapter( } } - private fun setupView(view: View, contact: SimpleContact, holder: ViewHolder) { + private fun setupView(view: View, contact: Contact, holder: ViewHolder) { view.apply { findViewById<FrameLayout>(R.id.item_contact_frame).isSelected = selectedKeys.contains(contact.rawId) findViewById<TextView>(R.id.item_contact_name).apply { 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..7f403022 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) } 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..f18c5b21 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/ChangeSortingDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/ChangeSortingDialog.kt @@ -1,26 +1,17 @@ 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.contactsConfig 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 config = activity.contactsConfig private var view = activity.layoutInflater.inflate(R.layout.dialog_change_sorting, null) init { @@ -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/SelectContactDialog.kt b/app/src/main/kotlin/com/simplemobiletools/dialer/dialogs/SelectContactDialog.kt index 0e881471..86dd1624 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<SimpleContact>, val callback: (selectedContact: SimpleContact) -> Unit) { +class SelectContactDialog(val activity: SimpleActivity, contacts: ArrayList<Contact>, val callback: (selectedContact: Contact) -> Unit) { private var dialog: AlertDialog? = null private var view = activity.layoutInflater.inflate(R.layout.dialog_select_contact, null) @@ -32,7 +32,7 @@ class SelectContactDialog(val activity: SimpleActivity, contacts: ArrayList<Simp }) select_contact_list.adapter = ContactsAdapter(activity, contacts, select_contact_list) { - callback(it as SimpleContact) + callback(it as Contact) dialog?.dismiss() } } 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 acfd694d..cb665ed7 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,7 @@ 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.SimpleActivity import com.simplemobiletools.dialer.dialogs.SelectSIMDialog @@ -42,7 +42,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 && 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..6951d9cc 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<SimpleContact>() + private var allContacts = ArrayList<Contact>() override fun setupFragment() { val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) { @@ -64,10 +62,10 @@ 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 { contacts -> allContacts = contacts - val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor) + val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor) if (privateContacts.isNotEmpty()) { allContacts.addAll(privateContacts) allContacts.sort() @@ -82,7 +80,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag } } - private fun gotContacts(contacts: ArrayList<SimpleContact>) { + private fun gotContacts(contacts: ArrayList<Contact>) { setupLetterFastscroller(contacts) if (contacts.isEmpty()) { fragment_placeholder.beVisible() @@ -96,7 +94,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,7 +109,7 @@ class ContactsFragment(context: Context, attributeSet: AttributeSet) : MyViewPag } } - private fun setupLetterFastscroller(contacts: ArrayList<SimpleContact>) { + private fun setupLetterFastscroller(contacts: ArrayList<Contact>) { letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> try { val name = contacts[position].name @@ -130,26 +128,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<SimpleContact> + val shouldNormalize = text.normalizeString() == text + val filtered = allContacts.filter { + getProperText(it.name, 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.name + !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(false) { 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..ad0550a5 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,11 @@ 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.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 +23,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<SimpleContact>() + private var allContacts = ArrayList<Contact>() override fun setupFragment() { val placeholderResId = if (context.hasPermission(PERMISSION_READ_CONTACTS)) { @@ -49,17 +49,20 @@ 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 { contacts -> allContacts = contacts - val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor) + val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor) if (privateContacts.isNotEmpty()) { allContacts.addAll(privateContacts) allContacts.sort() } + val favorites = contacts.filter { it.starred == 1 } as ArrayList<Contact> - if (activity!!.config.isCustomOrderSelected) { - allContacts = sortByCustomOrder(allContacts) + allContacts = if (activity!!.config.isCustomOrderSelected) { + sortByCustomOrder(favorites) + } else { + favorites } activity?.runOnUiThread { @@ -69,7 +72,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } } - private fun gotContacts(contacts: ArrayList<SimpleContact>) { + private fun gotContacts(contacts: ArrayList<Contact>) { setupLetterFastscroller(contacts) if (contacts.isEmpty()) { fragment_placeholder.beVisible() @@ -89,11 +92,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).name) { callContact(it) } } else { - callContact(it as SimpleContact) + callContact(it as Contact) } }.apply { fragment_list.adapter = this @@ -117,7 +120,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } } - private fun sortByCustomOrder(favorites: List<SimpleContact>): ArrayList<SimpleContact> { + private fun sortByCustomOrder(favorites: List<Contact>): ArrayList<Contact> { val favoritesOrder = activity!!.config.favoritesContactsOrder if (favoritesOrder.isEmpty()) { @@ -131,7 +134,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa return ArrayList(sorted) } - private fun saveCustomOrderToPrefs(items: ArrayList<SimpleContact>) { + private fun saveCustomOrderToPrefs(items: ArrayList<Contact>) { activity?.apply { val orderIds = items.map { it.contactId } val orderGsonString = Gson().toJson(orderIds) @@ -139,7 +142,7 @@ 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) { activity?.launchCallIntent(phoneNumbers.first().normalizedNumber) @@ -161,7 +164,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } } - private fun setupLetterFastscroller(contacts: ArrayList<SimpleContact>) { + private fun setupLetterFastscroller(contacts: ArrayList<Contact>) { letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> try { val name = contacts[position].name @@ -184,7 +187,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<SimpleContact> + }.toMutableList() as ArrayList<Contact> fragment_placeholder.beVisibleIf(contacts.isEmpty()) (fragment_list.adapter as? ContactsAdapter)?.updateItems(contacts, text) 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..8a81c1a0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/dialer/fragments/RecentsFragment.kt @@ -4,6 +4,7 @@ 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 @@ -49,8 +50,8 @@ 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 { contacts -> + val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor) recents.filter { it.phoneNumber == it.name }.forEach { recent -> var wasNameFilled = false @@ -63,7 +64,7 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage } 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 } 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..93a3226a 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,9 @@ 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 +36,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{ contacts -> + val privateContacts = MyContactsContentProvider.getContacts(context, privateCursor) if (privateContacts.isNotEmpty()) { contacts.addAll(privateContacts) } 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..ebd63c9d 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(false) { 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<SimpleContact>, groupSubsequentCalls: Boolean, callback: (ArrayList<RecentCall>) -> Unit) { + private fun getRecents(contacts: ArrayList<Contact>, groupSubsequentCalls: Boolean, callback: (ArrayList<RecentCall>) -> Unit) { + var recentCalls = ArrayList<RecentCall>() var previousRecentCallFrom = "" var previousStartTS = 0 @@ -96,7 +97,7 @@ 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)) { 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"> + <com.simplemobiletools.commons.views.MyCompatRadioButton + android:id="@+id/sorting_dialog_radio_first_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" + android:text="@string/first_name" /> + + <com.simplemobiletools.commons.views.MyCompatRadioButton + android:id="@+id/sorting_dialog_radio_middle_name" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" + android:text="@string/middle_name" /> + + <com.simplemobiletools.commons.views.MyCompatRadioButton + android:id="@+id/sorting_dialog_radio_surname" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" + android:text="@string/surname" /> + <com.simplemobiletools.commons.views.MyCompatRadioButton android:id="@+id/sorting_dialog_radio_full_name" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" android:text="@string/full_name" /> <com.simplemobiletools.commons.views.MyCompatRadioButton android:id="@+id/sorting_dialog_radio_date_created" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" android:text="@string/date_created" /> <com.simplemobiletools.commons.views.MyCompatRadioButton android:id="@+id/sorting_dialog_radio_custom" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" android:text="@string/custom" /> + </RadioGroup> <include @@ -53,12 +84,16 @@ android:id="@+id/sorting_dialog_radio_ascending" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" android:text="@string/ascending" /> <com.simplemobiletools.commons.views.MyCompatRadioButton android:id="@+id/sorting_dialog_radio_descending" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="@dimen/medium_margin" + android:paddingBottom="@dimen/medium_margin" android:text="@string/descending" /> </RadioGroup> </LinearLayout>