Merge branch 'master' into prevent-adding-empty-contact

This commit is contained in:
Agnieszka C
2021-11-18 09:52:30 +01:00
50 changed files with 637 additions and 560 deletions

View File

@ -9,8 +9,8 @@ Contains no ads or unnecessary permissions. It is fully opensource, provides cus
This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
<a href='https://play.google.com/store/apps/details?id=com.simplemobiletools.contacts.pro'><img src='https://simplemobiletools.com/assets/images/google-play.png' alt='Get it on Google Play' height='45' /></a> <a href='https://play.google.com/store/apps/details?id=com.simplemobiletools.contacts.pro'><img src='https://simplemobiletools.com/images/button-google-play.svg' alt='Get it on Google Play' height='45' /></a>
<a href='https://f-droid.org/packages/com.simplemobiletools.contacts.pro'><img src='https://simplemobiletools.com/assets/images/f-droid.png' alt='Get it on F-Droid' height='45' /></a> <a href='https://f-droid.org/packages/com.simplemobiletools.contacts.pro'><img src='https://simplemobiletools.com/images/button-f-droid.png' alt='Get it on F-Droid' height='45' /></a>
<div style="display:flex;"> <div style="display:flex;">
<img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg" width="30%"> <img alt="App image" src="fastlane/metadata/android/en-US/images/phoneScreenshots/english/1.jpg" width="30%">

View File

@ -56,7 +56,7 @@ android {
} }
dependencies { dependencies {
implementation 'com.github.SimpleMobileTools:Simple-Commons:c1388a0721' implementation 'com.github.SimpleMobileTools:Simple-Commons:f86699e092'
implementation 'joda-time:joda-time:2.10.3' implementation 'joda-time:joda-time:2.10.3'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5'
implementation 'com.github.tibbi:IndicatorFastScroll:c3de1d040a' implementation 'com.github.tibbi:IndicatorFastScroll:c3de1d040a'

View File

@ -199,21 +199,11 @@
android:label="@string/about" android:label="@string/about"
android:parentActivityName=".activities.MainActivity"/> android:parentActivityName=".activities.MainActivity"/>
<activity
android:name="com.simplemobiletools.commons.activities.LicenseActivity"
android:label="@string/third_party_licences"
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
<activity <activity
android:name="com.simplemobiletools.commons.activities.CustomizationActivity" android:name="com.simplemobiletools.commons.activities.CustomizationActivity"
android:label="@string/customize_colors" android:label="@string/customize_colors"
android:parentActivityName=".activities.SettingsActivity"/> android:parentActivityName=".activities.SettingsActivity"/>
<activity
android:name="com.simplemobiletools.commons.activities.FAQActivity"
android:label="@string/frequently_asked_questions"
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
<provider <provider
android:name="androidx.core.content.FileProvider" android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider" android:authorities="${applicationId}.provider"

View File

@ -65,8 +65,10 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
fabClicked() fabClicked()
} }
val adjustedPrimaryColor = getAdjustedPrimaryColor()
group_contacts_fastscroller?.updateColors(adjustedPrimaryColor, adjustedPrimaryColor.getContrastColor())
group_contacts_placeholder_2.underlineText() group_contacts_placeholder_2.underlineText()
group_contacts_placeholder_2.setTextColor(getAdjustedPrimaryColor()) group_contacts_placeholder_2.setTextColor(adjustedPrimaryColor)
} }
override fun onResume() { override fun onResume() {
@ -108,7 +110,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
groupContacts = it.filter { it.groups.map { it.id }.contains(group.id) } as ArrayList<Contact> groupContacts = it.filter { it.groups.map { it.id }.contains(group.id) } as ArrayList<Contact>
group_contacts_placeholder_2.beVisibleIf(groupContacts.isEmpty()) group_contacts_placeholder_2.beVisibleIf(groupContacts.isEmpty())
group_contacts_placeholder.beVisibleIf(groupContacts.isEmpty()) group_contacts_placeholder.beVisibleIf(groupContacts.isEmpty())
group_contacts_list.beVisibleIf(groupContacts.isNotEmpty()) group_contacts_fastscroller.beVisibleIf(groupContacts.isNotEmpty())
updateContacts(groupContacts) updateContacts(groupContacts)
} }
} }
@ -133,17 +135,14 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
private fun updateContacts(contacts: ArrayList<Contact>) { private fun updateContacts(contacts: ArrayList<Contact>) {
val currAdapter = group_contacts_list.adapter val currAdapter = group_contacts_list.adapter
if (currAdapter == null) { if (currAdapter == null) {
ContactsAdapter(this, contacts, this, LOCATION_GROUP_CONTACTS, this, group_contacts_list, group_contacts_fastscroller) { ContactsAdapter(this, contacts, this, LOCATION_GROUP_CONTACTS, this, group_contacts_list) {
contactClicked(it as Contact) contactClicked(it as Contact)
}.apply { }.apply {
group_contacts_list.adapter = this group_contacts_list.adapter = this
} }
group_contacts_list.scheduleLayoutAnimation() if (areSystemAnimationsEnabled) {
group_contacts_fastscroller.setScrollToY(0) group_contacts_list.scheduleLayoutAnimation()
group_contacts_fastscroller.setViews(group_contacts_list) {
val item = (group_contacts_list.adapter as ContactsAdapter).contactItems.getOrNull(it)
group_contacts_fastscroller.updateBubbleText(item?.getBubbleText() ?: "")
} }
} else { } else {
(currAdapter as ContactsAdapter).updateItems(contacts) (currAdapter as ContactsAdapter).updateItems(contacts)
@ -180,9 +179,9 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, defaultRingtoneUri) putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, defaultRingtoneUri)
} }
} }
private fun setRingtoneOnSelected(uri: Uri) { private fun setRingtoneOnSelected(uri: Uri) {
groupContacts.forEach{ groupContacts.forEach {
ContactsHelper(this).updateRingtone(it.contactId.toString(), uri.toString()) ContactsHelper(this).updateRingtone(it.contactId.toString(), uri.toString())
} }
} }

View File

@ -386,6 +386,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
skippedTabs++ skippedTabs++
} else { } else {
val tab = main_tabs_holder.newTab().setIcon(getTabIcon(index)) val tab = main_tabs_holder.newTab().setIcon(getTabIcon(index))
tab.contentDescription = getTabContentDescription(index)
main_tabs_holder.addTab(tab, index - skippedTabs, getDefaultTab() == index - skippedTabs) main_tabs_holder.addTab(tab, index - skippedTabs, getDefaultTab() == index - skippedTabs)
} }
} }

View File

@ -12,9 +12,9 @@ import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat import androidx.core.view.MenuItemCompat
import com.reddit.indicatorfastscroll.FastScrollItemIndicator
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter
import com.simplemobiletools.contacts.pro.dialogs.ChangeSortingDialog import com.simplemobiletools.contacts.pro.dialogs.ChangeSortingDialog
@ -26,6 +26,8 @@ import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
import com.simplemobiletools.contacts.pro.helpers.getProperText import com.simplemobiletools.contacts.pro.helpers.getProperText
import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Contact
import kotlinx.android.synthetic.main.activity_select_contact.* import kotlinx.android.synthetic.main.activity_select_contact.*
import java.util.*
import kotlin.collections.ArrayList
class SelectContactActivity : SimpleActivity() { class SelectContactActivity : SimpleActivity() {
private var specialMimeType: String? = null private var specialMimeType: String? = null
@ -41,7 +43,7 @@ class SelectContactActivity : SimpleActivity() {
return return
} }
setupPlaceholders() setupViews()
handlePermission(PERMISSION_READ_CONTACTS) { handlePermission(PERMISSION_READ_CONTACTS) {
if (it) { if (it) {
@ -195,16 +197,25 @@ class SelectContactActivity : SimpleActivity() {
runOnUiThread { runOnUiThread {
updatePlaceholderVisibility(contacts) updatePlaceholderVisibility(contacts)
SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list, select_contact_fastscroller) { SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list) {
confirmSelection(it) confirmSelection(it)
}.apply { }.apply {
select_contact_list.adapter = this select_contact_list.adapter = this
} }
select_contact_list.scheduleLayoutAnimation() if (areSystemAnimationsEnabled) {
select_contact_fastscroller.setViews(select_contact_list) { select_contact_list.scheduleLayoutAnimation()
select_contact_fastscroller.updateBubbleText(contacts[it].getBubbleText())
} }
letter_fastscroller.setupWithRecyclerView(select_contact_list, { position ->
try {
val name = contacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
FastScrollItemIndicator.Text(character.normalizeString().toUpperCase(Locale.getDefault()))
} catch (e: Exception) {
FastScrollItemIndicator.Text("")
}
})
} }
} }
} }
@ -228,25 +239,35 @@ class SelectContactActivity : SimpleActivity() {
} }
} }
private fun setupPlaceholders() { private fun setupViews() {
val adjustedPrimaryColor = getAdjustedPrimaryColor()
select_contact_placeholder.setTextColor(config.textColor) select_contact_placeholder.setTextColor(config.textColor)
select_contact_placeholder_2.setTextColor(getAdjustedPrimaryColor()) select_contact_placeholder_2.setTextColor(adjustedPrimaryColor)
select_contact_placeholder_2.underlineText() select_contact_placeholder_2.underlineText()
select_contact_placeholder_2.setOnClickListener { select_contact_placeholder_2.setOnClickListener {
FilterContactSourcesDialog(this) { FilterContactSourcesDialog(this) {
initContacts() initContacts()
} }
} }
letter_fastscroller?.textColor = config.textColor.getColorStateList()
letter_fastscroller?.pressedTextColor = adjustedPrimaryColor
letter_fastscroller_thumb?.fontSize = getTextSize()
letter_fastscroller_thumb?.textColor = adjustedPrimaryColor.getContrastColor()
letter_fastscroller_thumb?.thumbColor = adjustedPrimaryColor.getColorStateList()
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller)
} }
private fun updatePlaceholderVisibility(contacts: ArrayList<Contact>) { private fun updatePlaceholderVisibility(contacts: ArrayList<Contact>) {
select_contact_list.beVisibleIf(contacts.isNotEmpty()) select_contact_list.beVisibleIf(contacts.isNotEmpty())
select_contact_placeholder_2.beVisibleIf(contacts.isEmpty()) select_contact_placeholder_2.beVisibleIf(contacts.isEmpty())
select_contact_placeholder.beVisibleIf(contacts.isEmpty()) select_contact_placeholder.beVisibleIf(contacts.isEmpty())
select_contact_placeholder.setText(when (specialMimeType) { select_contact_placeholder.setText(
Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails when (specialMimeType) {
Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails
else -> R.string.no_contacts_found Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers
}) else -> R.string.no_contacts_found
}
)
} }
} }

View File

@ -3,10 +3,7 @@ package com.simplemobiletools.contacts.pro.activities
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.baseConfig import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.extensions.beVisibleIf
import com.simplemobiletools.commons.extensions.getFontSizeText
import com.simplemobiletools.commons.extensions.updateTextColors
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.R
@ -44,6 +41,19 @@ class SettingsActivity : SimpleActivity() {
setupDefaultTab() setupDefaultTab()
updateTextColors(settings_holder) updateTextColors(settings_holder)
invalidateOptionsMenu() invalidateOptionsMenu()
arrayOf(settings_color_customization_label, settings_general_settings_label, settings_main_screen_label, settings_list_view_label).forEach {
it.setTextColor(getAdjustedPrimaryColor())
}
arrayOf(
settings_color_customization_holder,
settings_general_settings_holder,
settings_main_screen_holder,
settings_list_view_holder
).forEach {
it.background.applyColorFilter(baseConfig.backgroundColor.getContrastColor())
}
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
@ -64,7 +74,7 @@ class SettingsActivity : SimpleActivity() {
} }
private fun setupManageShownTabs() { private fun setupManageShownTabs() {
settings_manage_tabs_holder.setOnClickListener { settings_manage_shown_tabs_holder.setOnClickListener {
ManageVisibleTabsDialog(this) ManageVisibleTabsDialog(this)
} }
} }
@ -76,7 +86,8 @@ class SettingsActivity : SimpleActivity() {
RadioItem(TAB_CONTACTS, getString(R.string.contacts_tab)), RadioItem(TAB_CONTACTS, getString(R.string.contacts_tab)),
RadioItem(TAB_FAVORITES, getString(R.string.favorites_tab)), RadioItem(TAB_FAVORITES, getString(R.string.favorites_tab)),
RadioItem(TAB_GROUPS, getString(R.string.groups_tab)), RadioItem(TAB_GROUPS, getString(R.string.groups_tab)),
RadioItem(TAB_LAST_USED, getString(R.string.last_used_tab))) RadioItem(TAB_LAST_USED, getString(R.string.last_used_tab))
)
RadioGroupDialog(this@SettingsActivity, items, config.defaultTab) { RadioGroupDialog(this@SettingsActivity, items, config.defaultTab) {
config.defaultTab = it as Int config.defaultTab = it as Int
@ -85,12 +96,14 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private fun getDefaultTabText() = getString(when (baseConfig.defaultTab) { private fun getDefaultTabText() = getString(
TAB_CONTACTS -> R.string.contacts_tab when (baseConfig.defaultTab) {
TAB_FAVORITES -> R.string.favorites_tab TAB_CONTACTS -> R.string.contacts_tab
TAB_GROUPS -> R.string.groups_tab TAB_FAVORITES -> R.string.favorites_tab
else -> R.string.last_used_tab TAB_GROUPS -> R.string.groups_tab
}) else -> R.string.last_used_tab
}
)
private fun setupFontSize() { private fun setupFontSize() {
settings_font_size.text = getFontSizeText() settings_font_size.text = getFontSizeText()
@ -99,7 +112,8 @@ class SettingsActivity : SimpleActivity() {
RadioItem(FONT_SIZE_SMALL, getString(R.string.small)), RadioItem(FONT_SIZE_SMALL, getString(R.string.small)),
RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)), RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)),
RadioItem(FONT_SIZE_LARGE, getString(R.string.large)), RadioItem(FONT_SIZE_LARGE, getString(R.string.large)),
RadioItem(FONT_SIZE_EXTRA_LARGE, getString(R.string.extra_large))) RadioItem(FONT_SIZE_EXTRA_LARGE, getString(R.string.extra_large))
)
RadioGroupDialog(this@SettingsActivity, items, config.fontSize) { RadioGroupDialog(this@SettingsActivity, items, config.fontSize) {
config.fontSize = it as Int config.fontSize = it as Int
@ -111,6 +125,11 @@ class SettingsActivity : SimpleActivity() {
private fun setupUseEnglish() { private fun setupUseEnglish() {
settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en") settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en")
settings_use_english.isChecked = config.useEnglish settings_use_english.isChecked = config.useEnglish
if (settings_use_english_holder.isGone()) {
settings_font_size_holder.background = resources.getDrawable(R.drawable.ripple_top_corners, theme)
}
settings_use_english_holder.setOnClickListener { settings_use_english_holder.setOnClickListener {
settings_use_english.toggle() settings_use_english.toggle()
config.useEnglish = settings_use_english.isChecked config.useEnglish = settings_use_english.isChecked
@ -143,10 +162,10 @@ class SettingsActivity : SimpleActivity() {
} }
private fun setupStartNameWithSurname() { private fun setupStartNameWithSurname() {
settings_start_with_surname.isChecked = config.startNameWithSurname settings_start_name_with_surname.isChecked = config.startNameWithSurname
settings_start_with_surname_holder.setOnClickListener { settings_start_name_with_surname_holder.setOnClickListener {
settings_start_with_surname.toggle() settings_start_name_with_surname.toggle()
config.startNameWithSurname = settings_start_with_surname.isChecked config.startNameWithSurname = settings_start_name_with_surname.isChecked
} }
} }
@ -172,7 +191,8 @@ class SettingsActivity : SimpleActivity() {
val items = arrayListOf( val items = arrayListOf(
RadioItem(ON_CLICK_CALL_CONTACT, getString(R.string.call_contact)), RadioItem(ON_CLICK_CALL_CONTACT, getString(R.string.call_contact)),
RadioItem(ON_CLICK_VIEW_CONTACT, getString(R.string.view_contact)), RadioItem(ON_CLICK_VIEW_CONTACT, getString(R.string.view_contact)),
RadioItem(ON_CLICK_EDIT_CONTACT, getString(R.string.edit_contact))) RadioItem(ON_CLICK_EDIT_CONTACT, getString(R.string.edit_contact))
)
RadioGroupDialog(this@SettingsActivity, items, config.onContactClick) { RadioGroupDialog(this@SettingsActivity, items, config.onContactClick) {
config.onContactClick = it as Int config.onContactClick = it as Int
@ -181,11 +201,13 @@ class SettingsActivity : SimpleActivity() {
} }
} }
private fun getOnContactClickText() = getString(when (config.onContactClick) { private fun getOnContactClickText() = getString(
ON_CLICK_CALL_CONTACT -> R.string.call_contact when (config.onContactClick) {
ON_CLICK_VIEW_CONTACT -> R.string.view_contact ON_CLICK_CALL_CONTACT -> R.string.call_contact
else -> R.string.edit_contact ON_CLICK_VIEW_CONTACT -> R.string.view_contact
}) else -> R.string.edit_contact
}
)
private fun setupShowCallConfirmation() { private fun setupShowCallConfirmation() {
settings_show_call_confirmation.isChecked = config.showCallConfirmation settings_show_call_confirmation.isChecked = config.showCallConfirmation

View File

@ -66,10 +66,20 @@ open class SimpleActivity : BaseSimpleActivity() {
protected fun getTabIcon(position: Int): Drawable { protected fun getTabIcon(position: Int): Drawable {
val drawableId = when (position) { val drawableId = when (position) {
LOCATION_CONTACTS_TAB -> R.drawable.ic_person_vector LOCATION_CONTACTS_TAB -> R.drawable.ic_person_vector
LOCATION_FAVORITES_TAB -> R.drawable.ic_star_on_vector LOCATION_FAVORITES_TAB -> R.drawable.ic_star_vector
else -> R.drawable.ic_people_vector else -> R.drawable.ic_people_vector
} }
return resources.getColoredDrawableWithColor(drawableId, config.textColor) return resources.getColoredDrawableWithColor(drawableId, config.textColor)
} }
protected fun getTabContentDescription(position: Int): String {
val stringId = when (position) {
LOCATION_CONTACTS_TAB -> R.string.contacts_tab
LOCATION_FAVORITES_TAB -> R.string.favorites_tab
else -> R.string.groups_tab
}
return resources.getString(stringId)
}
} }

View File

@ -757,7 +757,7 @@ class ViewContactActivity : ContactActivity() {
} }
} }
private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_on_vector else R.drawable.ic_star_off_vector) private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_vector else R.drawable.ic_star_outline_vector)
private fun hideBigContactPhoto() { private fun hideBigContactPhoto() {
contact_photo_big.animate().alpha(0f).withEndAction { contact_photo_big.beGone() }.start() contact_photo_big.animate().alpha(0f).withEndAction { contact_photo_big.beGone() }.start()

View File

@ -19,13 +19,13 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey import com.bumptech.glide.signature.ObjectKey
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity
@ -38,10 +38,11 @@ import com.simplemobiletools.contacts.pro.interfaces.RemoveFromGroupListener
import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Contact
import java.util.* import java.util.*
class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Contact>, private val refreshListener: RefreshContactsListener?, class ContactsAdapter(
private val location: Int, private val removeListener: RemoveFromGroupListener?, recyclerView: MyRecyclerView, activity: SimpleActivity, var contactItems: ArrayList<Contact>, private val refreshListener: RefreshContactsListener?,
fastScroller: FastScroller?, highlightText: String = "", itemClick: (Any) -> Unit) : private val location: Int, private val removeListener: RemoveFromGroupListener?, recyclerView: MyRecyclerView,
MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { highlightText: String = "", itemClick: (Any) -> Unit
) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
private val NEW_GROUP_ID = -1 private val NEW_GROUP_ID = -1
private var config = activity.config private var config = activity.config
@ -66,10 +67,13 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
findItem(R.id.cab_remove).isVisible = location == LOCATION_FAVORITES_TAB || location == LOCATION_GROUP_CONTACTS findItem(R.id.cab_remove).isVisible = location == LOCATION_FAVORITES_TAB || location == LOCATION_GROUP_CONTACTS
findItem(R.id.cab_add_to_favorites).isVisible = location == LOCATION_CONTACTS_TAB findItem(R.id.cab_add_to_favorites).isVisible = location == LOCATION_CONTACTS_TAB
findItem(R.id.cab_add_to_group).isVisible = location == LOCATION_CONTACTS_TAB || location == LOCATION_FAVORITES_TAB findItem(R.id.cab_add_to_group).isVisible = location == LOCATION_CONTACTS_TAB || location == LOCATION_FAVORITES_TAB
findItem(R.id.cab_send_sms_to_contacts).isVisible = location == LOCATION_CONTACTS_TAB || location == LOCATION_FAVORITES_TAB || location == LOCATION_GROUP_CONTACTS findItem(R.id.cab_send_sms_to_contacts).isVisible =
findItem(R.id.cab_send_email_to_contacts).isVisible = location == LOCATION_CONTACTS_TAB || location == LOCATION_FAVORITES_TAB || location == LOCATION_GROUP_CONTACTS location == LOCATION_CONTACTS_TAB || location == LOCATION_FAVORITES_TAB || location == LOCATION_GROUP_CONTACTS
findItem(R.id.cab_send_email_to_contacts).isVisible =
location == LOCATION_CONTACTS_TAB || location == LOCATION_FAVORITES_TAB || location == LOCATION_GROUP_CONTACTS
findItem(R.id.cab_delete).isVisible = location == LOCATION_CONTACTS_TAB || location == LOCATION_GROUP_CONTACTS findItem(R.id.cab_delete).isVisible = location == LOCATION_CONTACTS_TAB || location == LOCATION_GROUP_CONTACTS
findItem(R.id.cab_create_shortcut).isVisible = isOreoPlus() && isOneItemSelected() && (location == LOCATION_FAVORITES_TAB || location == LOCATION_CONTACTS_TAB) findItem(R.id.cab_create_shortcut).isVisible =
isOreoPlus() && isOneItemSelected() && (location == LOCATION_FAVORITES_TAB || location == LOCATION_CONTACTS_TAB)
if (location == LOCATION_GROUP_CONTACTS) { if (location == LOCATION_GROUP_CONTACTS) {
findItem(R.id.cab_remove).title = activity.getString(R.string.remove_from_group) findItem(R.id.cab_remove).title = activity.getString(R.string.remove_from_group)
@ -133,7 +137,6 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
textToHighlight = highlightText textToHighlight = highlightText
notifyDataSetChanged() notifyDataSetChanged()
} }
fastScroller?.measureRecyclerView()
} }
private fun editContact() { private fun editContact() {
@ -170,7 +173,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
ensureBackgroundThread { ensureBackgroundThread {
contactsToRemove.forEach { contactsToRemove.forEach {
val contactToRemove = it val contactToRemove = it
val duplicates = allContacts.filter { it.id != contactToRemove.id && it.getHashToCompare() == contactToRemove.getHashToCompare() }.toMutableList() as ArrayList<Contact> val duplicates = allContacts.filter { it.id != contactToRemove.id && it.getHashToCompare() == contactToRemove.getHashToCompare() }
.toMutableList() as ArrayList<Contact>
duplicates.add(contactToRemove) duplicates.add(contactToRemove)
ContactsHelper(activity).deleteContacts(duplicates) ContactsHelper(activity).deleteContacts(duplicates)
} }
@ -392,4 +396,6 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
} }
} }
} }
override fun onChange(position: Int) = contactItems.getOrNull(position)?.getBubbleText() ?: ""
} }

View File

@ -4,6 +4,7 @@ import android.util.TypedValue
import android.view.Menu import android.view.Menu
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.beVisibleIf
@ -12,7 +13,6 @@ import com.simplemobiletools.commons.extensions.highlightTextPart
import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.helpers.TAB_GROUPS import com.simplemobiletools.commons.helpers.TAB_GROUPS
import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity
@ -25,8 +25,10 @@ import com.simplemobiletools.contacts.pro.models.Group
import kotlinx.android.synthetic.main.item_group.view.* import kotlinx.android.synthetic.main.item_group.view.*
import java.util.* import java.util.*
class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView, class GroupsAdapter(
fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { activity: SimpleActivity, var groups: ArrayList<Group>, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView,
itemClick: (Any) -> Unit
) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
private var textToHighlight = "" private var textToHighlight = ""
var showContactThumbnails = activity.config.showContactThumbnails var showContactThumbnails = activity.config.showContactThumbnails
@ -172,4 +174,6 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val
} }
} }
} }
override fun onChange(position: Int) = groups.getOrNull(position)?.getBubbleText() ?: ""
} }

View File

@ -12,7 +12,6 @@ import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.SimpleContactsHelper import com.simplemobiletools.commons.helpers.SimpleContactsHelper
import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity
@ -21,9 +20,11 @@ import com.simplemobiletools.contacts.pro.models.Contact
import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.* import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.*
import java.util.* import java.util.*
class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayList<Contact>, private val selectedContacts: ArrayList<Contact>, private val allowPickMultiple: Boolean, class SelectContactsAdapter(
recyclerView: MyRecyclerView, val fastScroller: FastScroller, private val itemClick: ((Contact) -> Unit)? = null) : val activity: SimpleActivity, var contacts: ArrayList<Contact>, private val selectedContacts: ArrayList<Contact>, private val allowPickMultiple: Boolean,
RecyclerView.Adapter<SelectContactsAdapter.ViewHolder>() { recyclerView: MyRecyclerView, private val itemClick: ((Contact) -> Unit)? = null
) :
RecyclerView.Adapter<SelectContactsAdapter.ViewHolder>() {
private val itemViews = SparseArray<View>() private val itemViews = SparseArray<View>()
private val selectedPositions = HashSet<Int>() private val selectedPositions = HashSet<Int>()
private val config = activity.config private val config = activity.config
@ -87,7 +88,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
textToHighlight = highlightText textToHighlight = highlightText
notifyDataSetChanged() notifyDataSetChanged()
} }
fastScroller.measureRecyclerView()
} }
override fun onViewRecycled(holder: ViewHolder) { override fun onViewRecycled(holder: ViewHolder) {
@ -124,7 +124,8 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
} }
val numberText = phoneNumberToUse?.value ?: "" val numberText = phoneNumberToUse?.value ?: ""
contact_number.text = if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true) contact_number.text =
if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true)
contact_number.setTextColor(textColor) contact_number.setTextColor(textColor)
contact_number.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) contact_number.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
} }

View File

@ -36,6 +36,7 @@ class RenameGroupDialog(val activity: BaseSimpleActivity, val group: Group, val
} }
group.title = newTitle group.title = newTitle
group.contactsCount = 0
ensureBackgroundThread { ensureBackgroundThread {
if (group.isPrivateSecretGroup()) { if (group.isPrivateSecretGroup()) {
activity.groupsDB.insertOrUpdate(group) activity.groupsDB.insertOrUpdate(group)

View File

@ -1,17 +1,23 @@
package com.simplemobiletools.contacts.pro.dialogs package com.simplemobiletools.contacts.pro.dialogs
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import com.simplemobiletools.commons.extensions.setupDialogStuff import com.reddit.indicatorfastscroll.FastScrollItemIndicator
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.helpers.ensureBackgroundThread
import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter
import com.simplemobiletools.contacts.pro.extensions.config
import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources
import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Contact
import kotlinx.android.synthetic.main.layout_select_contact.view.* import kotlinx.android.synthetic.main.layout_select_contact.view.*
import java.util.*
import kotlin.collections.ArrayList
class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayList<Contact>, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean, class SelectContactsDialog(
selectContacts: ArrayList<Contact>? = null, val callback: (addedContacts: ArrayList<Contact>, removedContacts: ArrayList<Contact>) -> Unit) { val activity: SimpleActivity, initialContacts: ArrayList<Contact>, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean,
selectContacts: ArrayList<Contact>? = null, val callback: (addedContacts: ArrayList<Contact>, removedContacts: ArrayList<Contact>) -> Unit
) {
private var dialog: AlertDialog? = null private var dialog: AlertDialog? = null
private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null) private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null)
private var initiallySelectedContacts = ArrayList<Contact>() private var initiallySelectedContacts = ArrayList<Contact>()
@ -31,32 +37,33 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
initiallySelectedContacts = selectContacts initiallySelectedContacts = selectContacts
} }
activity.runOnUiThread { // if selecting multiple contacts is disabled, react on first contact click and dismiss the dialog
// if selecting multiple contacts is disabled, react on first contact click and dismiss the dialog val contactClickCallback: ((Contact) -> Unit)? = if (allowSelectMultiple) null else { contact ->
val contactClickCallback: ((Contact) -> Unit)? = if (allowSelectMultiple) null else { contact -> callback(arrayListOf(contact), arrayListOf())
callback(arrayListOf(contact), arrayListOf()) dialog!!.dismiss()
dialog!!.dismiss() }
}
view.apply { view.apply {
select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, allowSelectMultiple, select_contact_list.adapter = SelectContactsAdapter(
select_contact_list, select_contact_fastscroller, contactClickCallback) activity, allContacts, initiallySelectedContacts, allowSelectMultiple,
select_contact_list, contactClickCallback
)
if (context.areSystemAnimationsEnabled) {
select_contact_list.scheduleLayoutAnimation() select_contact_list.scheduleLayoutAnimation()
select_contact_fastscroller.setViews(select_contact_list) {
select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText())
}
} }
}
val builder = AlertDialog.Builder(activity) setupFastscroller(allContacts)
if (allowSelectMultiple) {
builder.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
}
builder.setNegativeButton(R.string.cancel, null)
dialog = builder.create().apply { val builder = AlertDialog.Builder(activity)
activity.setupDialogStuff(view, this) if (allowSelectMultiple) {
} builder.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
}
builder.setNegativeButton(R.string.cancel, null)
dialog = builder.create().apply {
activity.setupDialogStuff(view, this)
} }
} }
@ -70,4 +77,26 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
callback(newlySelectedContacts, unselectedContacts) callback(newlySelectedContacts, unselectedContacts)
} }
} }
private fun setupFastscroller(allContacts: ArrayList<Contact>) {
val adjustedPrimaryColor = activity.getAdjustedPrimaryColor()
view.apply {
letter_fastscroller?.textColor = context.config.textColor.getColorStateList()
letter_fastscroller?.pressedTextColor = adjustedPrimaryColor
letter_fastscroller_thumb?.fontSize = context.getTextSize()
letter_fastscroller_thumb?.textColor = adjustedPrimaryColor.getContrastColor()
letter_fastscroller_thumb?.thumbColor = adjustedPrimaryColor.getColorStateList()
letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller)
}
view.letter_fastscroller.setupWithRecyclerView(view.select_contact_list, { position ->
try {
val name = allContacts[position].getNameToDisplay()
val character = if (name.isNotEmpty()) name.substring(0, 1) else ""
FastScrollItemIndicator.Text(character.normalizeString().toUpperCase(Locale.getDefault()))
} catch (e: Exception) {
FastScrollItemIndicator.Text("")
}
})
}
} }

View File

@ -1,9 +1,10 @@
package com.simplemobiletools.contacts.pro.extensions package com.simplemobiletools.contacts.pro.extensions
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.LauncherApps
import android.database.Cursor import android.database.Cursor
import android.graphics.*
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.net.Uri import android.net.Uri
import android.os.Handler import android.os.Handler
@ -26,6 +27,7 @@ import com.simplemobiletools.contacts.pro.models.Organization
import com.simplemobiletools.contacts.pro.models.SocialAction import com.simplemobiletools.contacts.pro.models.SocialAction
import java.io.File import java.io.File
val Context.config: Config get() = Config.newInstance(applicationContext) val Context.config: Config get() = Config.newInstance(applicationContext)
val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao()
@ -35,8 +37,10 @@ val Context.groupsDB: GroupsDao get() = ContactsDatabase.getInstance(application
fun Context.getEmptyContact(): Contact { fun Context.getEmptyContact(): Contact {
val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
val organization = Organization("", "") val organization = Organization("", "")
return Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "", return Contact(
null, "", ArrayList(), organization, ArrayList(), ArrayList(), DEFAULT_MIMETYPE, null) 0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "",
null, "", ArrayList(), organization, ArrayList(), ArrayList(), DEFAULT_MIMETYPE, null
)
} }
fun Context.viewContact(contact: Contact) { fun Context.viewContact(contact: Contact) {
@ -355,22 +359,15 @@ fun Context.getSocialActions(id: Int): ArrayList<SocialAction> {
return socialActions return socialActions
} }
fun Context.getPackageDrawable(packageName: String): Drawable? { @SuppressLint("UseCompatLoadingForDrawables")
var drawable: Drawable? = null fun Context.getPackageDrawable(packageName: String): Drawable {
try { return resources.getDrawable(
// try getting the properly colored launcher icons when (packageName) {
val launcher = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps TELEGRAM_PACKAGE -> R.drawable.ic_telegram_vector
val activityList = launcher.getActivityList(packageName, android.os.Process.myUserHandle())[0] SIGNAL_PACKAGE -> R.drawable.ic_signal_vector
drawable = activityList.getBadgedIcon(0) WHATSAPP_PACKAGE -> R.drawable.ic_whatsapp_vector
} catch (ignored: Exception) { VIBER_PACKAGE -> R.drawable.ic_viber_vector
} else -> R.drawable.ic_threema_vector
}, theme
if (drawable == null) { )
try {
drawable = packageManager.getApplicationIcon(packageName)
} catch (ignored: Exception) {
}
}
return drawable
} }

View File

@ -84,8 +84,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
} }
context.updateTextColors(fragment_wrapper.parent as ViewGroup) context.updateTextColors(fragment_wrapper.parent as ViewGroup)
fragment_fastscroller?.updatePrimaryColor() fragment_fastscroller?.updateColors(adjustedPrimaryColor, adjustedPrimaryColor.getContrastColor())
fragment_fastscroller?.updateBubblePrimaryColor()
fragment_placeholder_2?.setTextColor(adjustedPrimaryColor) fragment_placeholder_2?.setTextColor(adjustedPrimaryColor)
letter_fastscroller?.textColor = textColor.getColorStateList() letter_fastscroller?.textColor = textColor.getColorStateList()
@ -165,11 +164,11 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty()) fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty())
fragment_placeholder.beVisibleIf(storedGroups.isEmpty()) fragment_placeholder.beVisibleIf(storedGroups.isEmpty())
fragment_list.beVisibleIf(storedGroups.isNotEmpty()) fragment_fastscroller.beVisibleIf(storedGroups.isNotEmpty())
val currAdapter = fragment_list.adapter val currAdapter = fragment_list.adapter
if (currAdapter == null) { if (currAdapter == null) {
GroupsAdapter(activity as SimpleActivity, storedGroups, activity as RefreshContactsListener, fragment_list, fragment_fastscroller) { GroupsAdapter(activity as SimpleActivity, storedGroups, activity as RefreshContactsListener, fragment_list) {
Intent(activity, GroupContactsActivity::class.java).apply { Intent(activity, GroupContactsActivity::class.java).apply {
putExtra(GROUP, it as Group) putExtra(GROUP, it as Group)
activity!!.startActivity(this) activity!!.startActivity(this)
@ -178,11 +177,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_list.adapter = this fragment_list.adapter = this
} }
fragment_list.scheduleLayoutAnimation() if (context.areSystemAnimationsEnabled) {
fragment_fastscroller.setScrollToY(0) fragment_list.scheduleLayoutAnimation()
fragment_fastscroller.setViews(fragment_list) {
val item = (fragment_list.adapter as GroupsAdapter).groups.getOrNull(it)
fragment_fastscroller.updateBubbleText(item?.getBubbleText() ?: "")
} }
} else { } else {
(currAdapter as GroupsAdapter).apply { (currAdapter as GroupsAdapter).apply {
@ -206,12 +202,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
else -> LOCATION_CONTACTS_TAB else -> LOCATION_CONTACTS_TAB
} }
ContactsAdapter(activity as SimpleActivity, contacts, activity as RefreshContactsListener, location, null, fragment_list, null) { ContactsAdapter(activity as SimpleActivity, contacts, activity as RefreshContactsListener, location, null, fragment_list) {
(activity as RefreshContactsListener).contactClicked(it as Contact) (activity as RefreshContactsListener).contactClicked(it as Contact)
}.apply { }.apply {
fragment_list.adapter = this fragment_list.adapter = this
} }
fragment_list.scheduleLayoutAnimation()
if (context.areSystemAnimationsEnabled) {
fragment_list.scheduleLayoutAnimation()
}
} else { } else {
(currAdapter as ContactsAdapter).apply { (currAdapter as ContactsAdapter).apply {
startNameWithSurname = config.startNameWithSurname startNameWithSurname = config.startNameWithSurname
@ -237,14 +236,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
} }
private fun setupLetterFastscroller(contacts: ArrayList<Contact>) { private fun setupLetterFastscroller(contacts: ArrayList<Contact>) {
val sorting = context.config.sorting
letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> letter_fastscroller.setupWithRecyclerView(fragment_list, { position ->
try { try {
val contact = contacts[position] val contact = contacts[position]
var name = when { var name = when {
contact.isABusinessContact() -> contact.getFullCompany() contact.isABusinessContact() -> contact.getFullCompany()
context.config.sorting and SORT_BY_SURNAME != 0 && contact.surname.isNotEmpty() -> contact.surname sorting and SORT_BY_SURNAME != 0 && contact.surname.isNotEmpty() -> contact.surname
context.config.sorting and SORT_BY_MIDDLE_NAME != 0 && contact.middleName.isNotEmpty() -> contact.middleName sorting and SORT_BY_MIDDLE_NAME != 0 && contact.middleName.isNotEmpty() -> contact.middleName
context.config.sorting and SORT_BY_FIRST_NAME != 0 && contact.firstName.isNotEmpty() -> contact.firstName sorting and SORT_BY_FIRST_NAME != 0 && contact.firstName.isNotEmpty() -> contact.firstName
context.config.startNameWithSurname -> contact.surname context.config.startNameWithSurname -> contact.surname
else -> contact.firstName else -> contact.firstName
} }

View File

@ -28,7 +28,12 @@ class ContactsHelper(val context: Context) {
private val BATCH_SIZE = 50 private val BATCH_SIZE = 50
private var displayContactSources = ArrayList<String>() private var displayContactSources = ArrayList<String>()
fun getContacts(getAll: Boolean = false, gettingDuplicates: Boolean = false, ignoredContactSources: HashSet<String> = HashSet(), callback: (ArrayList<Contact>) -> Unit) { fun getContacts(
getAll: Boolean = false,
gettingDuplicates: Boolean = false,
ignoredContactSources: HashSet<String> = HashSet(),
callback: (ArrayList<Contact>) -> Unit
) {
ensureBackgroundThread { ensureBackgroundThread {
val contacts = SparseArray<Contact>() val contacts = SparseArray<Contact>()
displayContactSources = context.getVisibleContactSources() displayContactSources = context.getVisibleContactSources()
@ -187,8 +192,10 @@ class ContactsHelper(val context: Context) {
val organization = Organization("", "") val organization = Organization("", "")
val websites = ArrayList<String>() val websites = ArrayList<String>()
val ims = ArrayList<IM>() val ims = ArrayList<IM>()
val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses, val contact = Contact(
events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone) id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses,
events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone
)
contacts.put(id, contact) contacts.put(id, contact)
} }
@ -733,8 +740,10 @@ class ContactsHelper(val context: Context) {
val organization = getOrganizations(id)[id] ?: Organization("", "") val organization = getOrganizations(id)[id] ?: Organization("", "")
val websites = getWebsites(id)[id] ?: ArrayList() val websites = getWebsites(id)[id] ?: ArrayList()
val ims = getIMs(id)[id] ?: ArrayList() val ims = getIMs(id)[id] ?: ArrayList()
return Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events, return Contact(
accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone) id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events,
accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone
)
} }
} }
@ -1499,7 +1508,8 @@ class ContactsHelper(val context: Context) {
fun getDuplicatesOfContact(contact: Contact, addOriginal: Boolean, callback: (ArrayList<Contact>) -> Unit) { fun getDuplicatesOfContact(contact: Contact, addOriginal: Boolean, callback: (ArrayList<Contact>) -> Unit) {
ensureBackgroundThread { ensureBackgroundThread {
getContacts(true, true) { contacts -> getContacts(true, true) { contacts ->
val duplicates = contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList<Contact> val duplicates =
contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList<Contact>
if (addOriginal) { if (addOriginal) {
duplicates.add(contact) duplicates.add(contact)
} }

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
android:width="24dp" <path android:fillColor="#FFFFFFFF" android:pathData="M3 5v14c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2V5c0-1.1-0.9-2-2-2H5C3.89 3 3 3.9 3 5zm12 4c0 1.66-1.34 3-3 3s-3-1.34-3-3 1.34-3 3-3 3 1.34 3 3zm-9 8c0-2 4-3.1 6-3.1s6 1.1 6 3.1v1H6v-1z"/>
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3,5v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2L21,5c0,-1.1 -0.9,-2 -2,-2L5,3c-1.11,0 -2,0.9 -2,2zM15,9c0,1.66 -1.34,3 -3,3s-3,-1.34 -3,-3 1.34,-3 3,-3 3,1.34 3,3zM6,17c0,-2 4,-3.1 6,-3.1s6,1.1 6,3.1v1L6,18v-1z"/>
</vector> </vector>

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
android:width="24dp" <path android:fillColor="#FFFFFFFF" android:pathData="M12 6c1.11 0 2-0.9 2-2 0-0.38-0.1-0.73-0.29-1.03L12 0l-1.71 2.97C10.1 3.27 10 3.62 10 4c0 1.1 0.9 2 2 2zm4.6 9.99l-1.07-1.07-1.08 1.07c-1.3 1.3-3.58 1.31-4.89 0l-1.07-1.07-1.09 1.07C6.75 16.64 5.88 17 4.96 17c-0.73 0-1.4-0.23-1.96-0.61V21c0 0.55 0.45 1 1 1h16c0.55 0 1-0.45 1-1v-4.61C20.44 16.77 19.77 17 19.04 17c-0.92 0-1.79-0.36-2.44-1.01zM18 9h-5V7h-2v2H6c-1.66 0-3 1.34-3 3v1.54c0 1.08 0.88 1.96 1.96 1.96 0.52 0 1.02-0.2 1.38-0.57l2.14-2.13 2.13 2.13c0.74 0.74 2.03 0.74 2.77 0l2.14-2.13 2.13 2.13c0.37 0.37 0.86 0.57 1.38 0.57 1.08 0 1.96-0.88 1.96-1.96V12C21 10.34 19.66 9 18 9z"/>
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M12,6c1.11,0 2,-0.9 2,-2 0,-0.38 -0.1,-0.73 -0.29,-1.03L12,0l-1.71,2.97c-0.19,0.3 -0.29,0.65 -0.29,1.03 0,1.1 0.9,2 2,2zM16.6,15.99l-1.07,-1.07 -1.08,1.07c-1.3,1.3 -3.58,1.31 -4.89,0l-1.07,-1.07 -1.09,1.07C6.75,16.64 5.88,17 4.96,17c-0.73,0 -1.4,-0.23 -1.96,-0.61L3,21c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-4.61c-0.56,0.38 -1.23,0.61 -1.96,0.61 -0.92,0 -1.79,-0.36 -2.44,-1.01zM18,9h-5L13,7h-2v2L6,9c-1.66,0 -3,1.34 -3,3v1.54c0,1.08 0.88,1.96 1.96,1.96 0.52,0 1.02,-0.2 1.38,-0.57l2.14,-2.13 2.13,2.13c0.74,0.74 2.03,0.74 2.77,0l2.14,-2.13 2.13,2.13c0.37,0.37 0.86,0.57 1.38,0.57 1.08,0 1.96,-0.88 1.96,-1.96L20.99,12C21,10.34 19.66,9 18,9z"/>
</vector> </vector>

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="96dp" android:height="96dp" android:viewportWidth="24" android:viewportHeight="24">
android:width="96dp" <path android:fillColor="#FFFFFF" android:pathData="M8 10H5V7H3v3H0v2h3v3h2v-3h3v-2zm10 1c1.66 0 2.99-1.34 2.99-3S19.66 5 18 5c-0.32 0-0.63 0.05-0.91 0.14 0.57 0.81 0.9 1.79 0.9 2.86s-0.34 2.04-0.9 2.86C17.37 10.95 17.68 11 18 11zm-5 0c1.66 0 2.99-1.34 2.99-3S14.66 5 13 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm6.62 2.16C20.45 13.89 21 14.82 21 16v2h3v-2c0-1.54-2.37-2.49-4.38-2.84zM13 13c-2 0-6 1-6 3v2h12v-2c0-2-4-3-6-3z"/>
android:height="96dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M8,10L5,10L5,7L3,7v3L0,10v2h3v3h2v-3h3v-2zM18,11c1.66,0 2.99,-1.34 2.99,-3S19.66,5 18,5c-0.32,0 -0.63,0.05 -0.91,0.14 0.57,0.81 0.9,1.79 0.9,2.86s-0.34,2.04 -0.9,2.86c0.28,0.09 0.59,0.14 0.91,0.14zM13,11c1.66,0 2.99,-1.34 2.99,-3S14.66,5 13,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM19.62,13.16c0.83,0.73 1.38,1.66 1.38,2.84v2h3v-2c0,-1.54 -2.37,-2.49 -4.38,-2.84zM13,13c-2,0 -6,1 -6,3v2h12v-2c0,-2 -4,-3 -6,-3z" />
</vector> </vector>

View File

@ -1,9 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
android:width="24dp" <path android:pathData="M17 7h-3c-0.55 0-1 0.45-1 1s0.45 1 1 1h3c1.65 0 3 1.35 3 3s-1.35 3-3 3h-3c-0.55 0-1 0.45-1 1s0.45 1 1 1h3c2.76 0 5-2.24 5-5s-2.24-5-5-5zm-9 5c0 0.55 0.45 1 1 1h6c0.55 0 1-0.45 1-1s-0.45-1-1-1H9c-0.55 0-1 0.45-1 1zm2 3H7c-1.65 0-3-1.35-3-3s1.35-3 3-3h3c0.55 0 1-0.45 1-1s-0.45-1-1-1H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h3c0.55 0 1-0.45 1-1s-0.45-1-1-1z" android:fillColor="#FFFFFFFF"/>
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M3.9,12c0,-1.71 1.39,-3.1 3.1,-3.1h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-1.9L7,15.1c-1.71,0 -3.1,-1.39 -3.1,-3.1zM8,13h8v-2L8,11v2zM17,7h-4v1.9h4c1.71,0 3.1,1.39 3.1,3.1s-1.39,3.1 -3.1,3.1h-4L13,17h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5z"/>
</vector> </vector>

View File

@ -0,0 +1,4 @@
<vector android:height="24dp" android:viewportHeight="1024" android:viewportWidth="1024" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#3a76f0" android:pathData="M0 0v1024h1024V0H0z"/>
<path android:fillColor="#ffffff" android:pathData="M442.08 229.27l6.54 26.48a264.44 264.44 0 0 0-73.14 30.28l-13.99-23.41a287.61 287.61 0 0 1 80.59-33.34zm139.84 0l-6.54 26.48a264.44 264.44 0 0 1 73.14 30.28l14.15-23.41a289.68 289.68 0 0 0-80.75-33.35zm-319.3 132.14a289.18 289.18 0 0 0-33.34 80.67l26.48 6.54a264.44 264.44 0 0 1 30.28-73.14zM248.05 512a263.53 263.53 0 0 1 2.98-39.55l-26.97-4.14a291.25 291.25 0 0 0 0 87.29l26.97-4.05a264.36 264.36 0 0 1-2.98-39.55zm414.46 249.3l-13.99-23.33a262.95 262.95 0 0 1-73.06 30.28l6.54 26.48a289.84 289.84 0 0 0 80.51-33.43zM775.95 512a264.36 264.36 0 0 1-2.98 39.55l26.97 4.05a291.25 291.25 0 0 0 0-87.29l-26.97 4.14a263.53 263.53 0 0 1 2.98 39.55zm18.78 69.83l-26.48-6.53a263.95 263.95 0 0 1-30.28 73.23l23.42 14.07a288.68 288.68 0 0 0 33.34-80.77zM551.55 772.97a264.03 264.03 0 0 1-79.1 0l-4.05 26.97a290.67 290.67 0 0 0 87.21 0zm172.93-104.42a263.2 263.2 0 0 1-55.93 55.85l16.22 22.01a293.81 293.81 0 0 0 61.73-61.48zm-55.93-369.03a263.61 263.61 0 0 1 55.93 55.93l22.01-16.38a293.4 293.4 0 0 0-61.56-61.56zm-369.03 55.93a263.61 263.61 0 0 1 55.93-55.93l-16.38-22.01a293.4 293.4 0 0 0-61.56 61.56zm461.86 5.96l-23.41 14.07a262.95 262.95 0 0 1 30.28 73.06l26.48-6.54a288.68 288.68 0 0 0-33.35-80.59zM472.45 251.03a264.03 264.03 0 0 1 79.1 0l4.05-26.97a290.67 290.67 0 0 0-87.21 0zM313.5 753.69l-56.34 13.07 13.15-56.35-26.56-6.2-13.15 56.35a27.3 27.3 0 0 0 20.35 32.85 28.55 28.55 0 0 0 12.41 0l56.35-12.99zm-64.12-73.81l26.64 6.13 9.1-39.06a261.63 261.63 0 0 1-29.37-71.65l-26.48 6.54a292.33 292.33 0 0 0 26.81 69.25zm127.42 59.08l-39.05 9.1 6.2 26.64 28.71-6.7a288.77 288.77 0 0 0 69.25 26.81l6.54-26.48a262.04 262.04 0 0 1-71.41-29.54zM512 275.36c-130.73 0.08-236.56 106.07-236.56 236.72a237.22 237.22 0 0 0 36.32 125.77l-22.75 97.14 97.06-22.75c110.62 69.58 256.74 36.4 326.33-74.14 69.59-110.54 36.49-256.67-74.05-326.33A237.22 237.22 0 0 0 512 275.36" android:strokeWidth="0.82741475"/>
</vector>

View File

@ -0,0 +1,4 @@
<vector android:height="24dp" android:viewportHeight="455.731" android:viewportWidth="455.731" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#36a6de" android:pathData="M0 0h455.731v455.731H0z"/>
<path android:fillColor="#ffffff" android:pathData="M107.812 223.206l148.606-61.208c14.664-6.376 64.396-26.779 64.396-26.779s22.953-8.926 21.04 12.752c-0.638 8.926-5.738 40.168-10.839 74.009l-15.94 100.15s-1.275 14.664-12.114 17.215c-10.839 2.55-28.691-8.926-31.879-11.477-2.55-1.913-47.819-30.604-64.396-44.631-4.463-3.826-9.564-11.477 0.638-20.403 22.953-21.04 50.369-47.181 66.946-63.758 7.651-7.651 15.302-25.503-16.577-3.826l-89.948 60.472s-10.201 6.376-29.329 0.638-41.443-13.389-41.443-13.389-15.302-9.564 10.839-19.765z" android:strokeWidth="0.49044925"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:viewportHeight="512" android:viewportWidth="512" android:width="24dp" xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#3b3b3b" android:pathData="M0 0h512v512H0z"/>
<path android:fillColor="#ffffff" android:pathData="M193.916 316.176l-70.308 17.36 14.756-59.892c-14.756-19.096-23.436-43.4-23.436-68.572 0-68.572 63.364-124.123 141.483-124.123s141.483 55.552 141.483 124.123c0 68.572-63.364 124.123-141.483 124.123-21.7 0-43.4-4.34-61.628-12.152zm21.7-122.388h-1.736c-3.472 0-6.076 2.604-5.208 6.076v56.42c0 3.472 2.604 6.076 6.076 6.076h83.327c3.472 0 6.076-2.604 6.076-6.076v-56.42c0-3.472-2.604-6.076-6.076-6.076h-1.736v-15.624c0-21.7-18.228-39.928-39.928-39.928-21.7 0-39.928 18.228-39.928 39.928v15.624zm64.232 0h-47.74v-15.624c0-13.02 10.416-24.304 24.304-24.304 13.02 0 24.304 10.416 24.304 24.304v15.624z" android:strokeWidth="0.86799389"/>
<path android:fillColor="#3fe669" android:pathData="M144.951 384.747a24.304 24.304 0 1 1 48.608 0 24.304 24.304 0 1 1-48.608 0m86.799 0a24.304 24.304 0 1 1 48.608 0 24.304 24.304 0 1 1-48.608 0m86.8 0a24.304 24.304 0 1 1 48.608 0 24.304 24.304 0 1 1-48.608 0" android:strokeWidth="0.86799389"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector android:height="24dp" android:viewportHeight="512" android:viewportWidth="512" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#7b519d" android:pathData="M0 0h512v512H0z"/>
<path android:fillColor="#ffffff" android:pathData="M407.294 186.94l-0.092-0.369c-7.477-30.229-41.188-62.664-72.145-69.412l-0.349-0.072c-50.073-9.552-100.844-9.552-150.905 0l-0.36 0.072c-30.947 6.748-64.658 39.186-72.145 69.412l-0.083 0.369c-9.244 42.214-9.244 85.026 0 127.24l0.083 0.369c7.169 28.938 38.368 59.885 68.171 68.395v33.743c0 12.214 14.883 18.212 23.346 9.398l34.188-35.537c7.416 0.414 14.835 0.646 22.252 0.646 25.205 0 50.421-2.384 75.452-7.159l0.349-0.072c30.958-6.748 64.668-39.186 72.145-69.412l0.092-0.369c9.244-42.215 9.244-85.025 0.001-127.241zm-27.056 121.12c-4.992 19.721-30.587 44.238-50.924 48.768-26.624 5.063-53.459 7.227-80.267 6.484-0.533-0.016-1.046 0.192-1.417 0.575l-24.962 25.625-26.55 27.25c-1.941 2.025-5.352 0.646-5.352-2.147v-55.899c0-0.924-0.659-1.707-1.566-1.887-0.005-0.002-0.011-0.002-0.016-0.003-20.337-4.53-45.923-29.047-50.924-48.768-8.32-38.157-8.32-76.839 0-114.996 5.001-19.721 30.587-44.238 50.924-48.768 46.498-8.844 93.643-8.844 140.131 0 20.347 4.53 45.932 29.047 50.924 48.768 8.329 38.158 8.329 76.84-0.001 114.998z" android:strokeWidth="1.09314275"/>
<path android:fillColor="#ffffff" android:pathData="M303.493 333.862c-3.126-0.95-6.105-1.587-8.874-2.734-28.674-11.897-55.063-27.244-75.965-50.77-11.887-13.378-21.191-28.482-29.055-44.466-3.73-7.58-6.873-15.456-10.077-23.283-2.921-7.136 1.382-14.508 5.912-19.886 4.251-5.047 9.722-8.908 15.647-11.756 4.624-2.221 9.185-0.94 12.562 2.979 7.3 8.474 14.008 17.381 19.436 27.204 3.34 6.042 2.423 13.427-3.629 17.538-1.471 0.999-2.812 2.173-4.181 3.301-1.202 0.989-2.333 1.988-3.157 3.328-1.505 2.45-1.577 5.341-0.609 8.005 7.463 20.508 20.042 36.457 40.686 45.048 3.303 1.374 6.62 2.973 10.426 2.531 6.373-0.744 8.437-7.736 12.903-11.388 4.365-3.569 9.944-3.616 14.646-0.641 4.704 2.978 9.262 6.172 13.794 9.402 4.449 3.17 8.877 6.269 12.98 9.884 3.946 3.475 5.305 8.034 3.083 12.748-4.067 8.637-9.986 15.82-18.522 20.407-2.41 1.292-5.29 1.711-8.007 2.548-3.126-0.95 2.718-0.837 0 0zm-44.162-162.77c37.505 1.052 68.31 25.941 74.912 63.021 1.125 6.318 1.525 12.777 2.026 19.19 0.211 2.697-1.317 5.259-4.227 5.295-3.006 0.037-4.358-2.48-4.555-5.175-0.386-5.337-0.654-10.699-1.389-15.989-3.882-27.94-26.16-51.054-53.97-56.014-4.186-0.747-8.466-0.942-12.707-1.387-2.679-0.281-6.188-0.442-6.782-3.775-0.497-2.793 1.859-5.016 4.519-5.16 0.72-0.043 1.447-0.011 2.173-0.005 37.507 1.052-0.726-0.002 0 0z" android:strokeWidth="1.09314275"/>
<path android:fillColor="#ffffff" android:pathData="M316.328 244.981c-0.063 0.469-0.094 1.57-0.369 2.606-0.995 3.765-6.705 4.236-8.018 0.437-0.39-1.127-0.448-2.41-0.45-3.624-0.011-7.943-1.739-15.879-5.746-22.791-4.118-7.104-10.41-13.074-17.788-16.689-4.462-2.184-9.286-3.543-14.177-4.351-2.137-0.354-4.297-0.567-6.445-0.867-2.603-0.362-3.993-2.02-3.869-4.585 0.115-2.403 1.871-4.133 4.491-3.983 8.606 0.487 16.921 2.35 24.574 6.401 15.56 8.241 24.449 21.247 27.044 38.616 0.117 0.788 0.305 1.566 0.365 2.356 0.146 1.948 0.239 3.899 0.388 6.472-0.063 0.467-0.149-2.573 0 0z" android:strokeWidth="1.09314275"/>
<path android:fillColor="#ffffff" android:pathData="M293.001 244.072c-3.137 0.057-4.816-1.681-5.141-4.556-0.224-2.005-0.404-4.038-0.882-5.99-0.942-3.845-2.985-7.406-6.219-9.762-1.526-1.112-3.256-1.922-5.068-2.446-2.301-0.666-4.693-0.482-6.987-1.044-2.493-0.611-3.873-2.631-3.481-4.969 0.357-2.129 2.427-3.791 4.754-3.622 14.541 1.049 24.933 8.567 26.417 25.686 0.106 1.208 0.228 2.484-0.037 3.641-0.461 1.975-1.926 2.967-3.354 3.063-3.138 0.056 1.428-0.096 0 0zm10.492 89.79c2.718-0.837-3.126-0.95 0 0z" android:strokeWidth="1.09314275"/>
<path android:fillColor="#ffffff" android:pathData="M259.427 171.097c-0.032 0-0.062-0.003-0.094-0.003-0.031-0.002 0.009 0 0.094 0.003zm-0.095-0.005c0.032 0 0.062 0.003 0.094 0.003 2.081 0.074 35.934 1.007-0.094-0.003zm56.996 73.889c-0.149-2.573-0.062 0.467 0 0zm-23.327-0.909c0.049-0.003 0.096-0.028 0.143-0.034-0.132 0-0.336 0.003-0.544 0.011 0.136 0.003 0.259 0.024 0.401 0.023z"/>
<path android:fillColor="#ffffff" android:pathData="M293.001 244.072c-0.141 0.002-0.266-0.019-0.401-0.023-0.679 0.019-1.38 0.055 0.401 0.023zm0.143-0.033c-0.049 0.005-0.096 0.031-0.143 0.034 0.367-0.025 0.336-0.034 0.143-0.034z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:viewportHeight="455.731" android:viewportWidth="455.731" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#1BD741" android:pathData="M0 0h455.731v455.731H0z"/>
<path android:fillColor="#ffffff" android:pathData="M89.713 366.168l19.351-68.728c-12.444-21.14-18.996-45.193-18.996-69.902 0-76.08 61.896-137.976 137.976-137.976s137.975 61.896 137.975 137.976-61.895 137.976-137.975 137.976c-23.706 0-46.919-6.068-67.454-17.59zm74.5-43.346l4.224 2.579c17.904 10.93 38.516 16.708 59.607 16.708 63.174 0 114.569-51.396 114.569-114.57 0-63.174-51.395-114.57-114.569-114.57s-114.57 51.396-114.57 114.57c0 22.012 6.256 43.388 18.091 61.817l2.844 4.429-11.143 39.579z"/>
<path android:fillColor="#ffffff" android:pathData="M189.285 163.32l-8.953-0.488c-2.812-0.153-5.57 0.786-7.696 2.633-4.34 3.769-11.28 11.056-13.412 20.552-3.179 14.158 1.734 31.496 14.448 48.833s36.408 45.077 78.306 56.924c13.501 3.818 24.122 1.244 32.317-3.998 6.49-4.151 10.964-10.815 12.576-18.348l1.429-6.677c0.454-2.122-0.623-4.275-2.595-5.184l-30.257-13.947c-1.964-0.905-4.294-0.333-5.615 1.379l-11.879 15.399c-0.897 1.163-2.433 1.624-3.82 1.137-8.135-2.859-35.383-14.271-50.335-43.072-0.648-1.249-0.487-2.765 0.433-3.831l11.352-13.133c1.16-1.341 1.453-3.226 0.756-4.856l-13.043-30.514c-0.694-1.624-2.25-2.713-4.013-2.809z"/>
</vector>

View File

@ -43,7 +43,7 @@
android:layout_marginBottom="@dimen/medium_margin" android:layout_marginBottom="@dimen/medium_margin"
android:background="?attr/selectableItemBackgroundBorderless" android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/tiny_margin" android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_star_off_vector" /> android:src="@drawable/ic_star_outline_vector" />
<ImageView <ImageView
android:id="@+id/contact_change_photo" android:id="@+id/contact_change_photo"
@ -217,7 +217,7 @@
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_email_vector" /> android:src="@drawable/ic_mail_vector" />
<LinearLayout <LinearLayout
android:id="@+id/contact_emails_holder" android:id="@+id/contact_emails_holder"

View File

@ -38,25 +38,21 @@
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
android:visibility="gone" /> android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView <com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
android:id="@+id/group_contacts_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/group_contacts_fastscroller" android:id="@+id/group_contacts_fastscroller"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical" /> <com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/group_contacts_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
</com.simplemobiletools.commons.views.FastScroller> </com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
</RelativeLayout> </RelativeLayout>
<com.simplemobiletools.commons.views.MyFloatingActionButton <com.simplemobiletools.commons.views.MyFloatingActionButton

View File

@ -42,16 +42,21 @@
android:scrollbars="none" android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" /> app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller <com.reddit.indicatorfastscroll.FastScrollerView
android:id="@+id/select_contact_fastscroller" android:id="@+id/letter_fastscroller"
android:layout_width="wrap_content" android:layout_width="32dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_alignTop="@+id/select_contact_list"
android:layout_alignBottom="@+id/select_contact_list"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin"> android:paddingTop="@dimen/big_margin"
android:paddingBottom="@dimen/big_margin" />
<include layout="@layout/fastscroller_handle_vertical" /> <com.reddit.indicatorfastscroll.FastScrollerThumbView
android:id="@+id/letter_fastscroller_thumb"
android:layout_width="@dimen/fab_size"
android:layout_height="match_parent"
android:layout_alignTop="@+id/letter_fastscroller"
android:layout_alignBottom="@+id/letter_fastscroller"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_toStartOf="@+id/letter_fastscroller" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout> </RelativeLayout>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/settings_scrollview" android:id="@+id/settings_scrollview"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -11,348 +11,317 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<RelativeLayout <TextView
android:id="@+id/settings_customize_colors_holder" android:id="@+id/settings_color_customization_label"
style="@style/SettingsSectionLabelStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:text="@string/color_customization" />
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <LinearLayout
android:id="@+id/settings_customize_colors" android:id="@+id/settings_color_customization_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:text="@string/customize_colors" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_use_english_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_margin="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="@drawable/section_holder_stroke"
android:paddingStart="@dimen/normal_margin" android:orientation="vertical">
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <RelativeLayout
android:id="@+id/settings_use_english" android:id="@+id/settings_customize_colors_holder"
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@drawable/ripple_all_corners">
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/use_english_language"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout> <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_customize_colors_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/customize_colors" />
<RelativeLayout </RelativeLayout>
android:id="@+id/settings_manage_contact_fields_holder" </LinearLayout>
<TextView
android:id="@+id/settings_general_settings_label"
style="@style/SettingsSectionLabelStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:text="@string/general_settings" />
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <LinearLayout
android:id="@+id/settings_manage_contact_fields" android:id="@+id/settings_general_settings_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingStart="@dimen/medium_margin"
android:text="@string/manage_shown_contact_fields" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_manage_tabs_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_margin="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="@drawable/section_holder_stroke"
android:paddingStart="@dimen/normal_margin" android:orientation="vertical">
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <RelativeLayout
android:id="@+id/settings_manage_tabs" android:id="@+id/settings_use_english_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:background="@drawable/ripple_top_corners">
android:paddingStart="@dimen/medium_margin"
android:text="@string/manage_shown_tabs" />
</RelativeLayout> <com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_use_english"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/use_english_language" />
<RelativeLayout </RelativeLayout>
android:id="@+id/settings_default_tab_holder"
<RelativeLayout
android:id="@+id/settings_font_size_holder"
style="@style/SettingsHolderTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_font_size_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/font_size" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_font_size"
style="@style/SettingsTextValueStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/settings_font_size_label"
tools:text="@string/medium" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_manage_contact_fields_holder"
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_manage_contact_fields_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/manage_shown_contact_fields" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_call_confirmation_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_show_call_confirmation"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_call_confirmation_dialog" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_private_contacts_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_bottom_corners">
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_show_private_contacts"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_private_contacts" />
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/settings_main_screen_label"
style="@style/SettingsSectionLabelStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:text="@string/main_screen" />
android:background="?attr/selectableItemBackground"
android:paddingLeft="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <LinearLayout
android:id="@+id/settings_default_tab_label" android:id="@+id/settings_main_screen_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_default_tab"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/default_tab_to_open" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_default_tab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/medium_margin"
android:background="@null"
android:clickable="false" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_font_size_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_margin="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="@drawable/section_holder_stroke"
android:paddingLeft="@dimen/normal_margin" android:orientation="vertical">
android:paddingTop="@dimen/activity_margin"
android:paddingRight="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MyTextView <RelativeLayout
android:id="@+id/settings_font_size_label" android:id="@+id/settings_manage_shown_tabs_holder"
style="@style/SettingsHolderTextViewOneLinerStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:background="@drawable/ripple_top_corners">
android:layout_toStartOf="@+id/settings_font_size"
android:paddingLeft="@dimen/medium_margin"
android:paddingRight="@dimen/medium_margin"
android:text="@string/font_size" />
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_font_size" android:id="@+id/settings_manage_shown_tabs_label"
android:layout_width="wrap_content" style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/manage_shown_tabs" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_default_tab_holder"
style="@style/SettingsHolderTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:background="@drawable/ripple_background">
android:layout_marginEnd="@dimen/medium_margin"
android:background="@null"
android:clickable="false" />
</RelativeLayout> <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_default_tab_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/default_tab_to_open" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_default_tab"
style="@style/SettingsTextValueStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/settings_default_tab_label"
tools:text="@string/contacts_tab" />
<RelativeLayout </RelativeLayout>
android:id="@+id/settings_on_contact_click_holder"
<RelativeLayout
android:id="@+id/settings_on_contact_click_holder"
style="@style/SettingsHolderTextViewStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_on_contact_click_label"
style="@style/SettingsTextLabelStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/on_contact_click" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_on_contact_click"
style="@style/SettingsTextValueStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/settings_on_contact_click_label"
tools:text="@string/contacts_tab" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_dialpad_button_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_background">
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_show_dialpad_button"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_dialpad_button" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_only_contacts_with_numbers_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple_bottom_corners">
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_show_only_contacts_with_numbers"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_only_contacts_with_numbers" />
</RelativeLayout>
</LinearLayout>
<TextView
android:id="@+id/settings_list_view_label"
style="@style/SettingsSectionLabelStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:text="@string/list_view" />
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/bigger_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/bigger_margin">
<com.simplemobiletools.commons.views.MyTextView <LinearLayout
android:id="@+id/settings_on_contact_click_label" android:id="@+id/settings_list_view_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/settings_on_contact_click"
android:paddingStart="@dimen/medium_margin"
android:paddingEnd="@dimen/medium_margin"
android:text="@string/on_contact_click" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/settings_on_contact_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_marginEnd="@dimen/small_margin"
android:background="@null"
android:clickable="false" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_contact_thumbnails_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin" android:layout_margin="@dimen/medium_margin"
android:background="?attr/selectableItemBackground" android:background="@drawable/section_holder_stroke"
android:paddingStart="@dimen/normal_margin" android:orientation="vertical">
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <RelativeLayout
android:id="@+id/settings_show_contact_thumbnails" android:id="@+id/settings_show_contact_thumbnails_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@drawable/ripple_top_corners">
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_contact_thumbnails"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout> <com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_show_contact_thumbnails"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_contact_thumbnails" />
<RelativeLayout </RelativeLayout>
android:id="@+id/settings_show_phone_numbers_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <RelativeLayout
android:id="@+id/settings_show_phone_numbers" android:id="@+id/settings_show_phone_numbers_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@drawable/ripple_background">
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_phone_numbers"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout> <com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_show_phone_numbers"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show_phone_numbers" />
<RelativeLayout </RelativeLayout>
android:id="@+id/settings_show_only_contacts_with_numbers_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat <RelativeLayout
android:id="@+id/settings_show_only_contacts_with_numbers" android:id="@+id/settings_start_name_with_surname_holder"
style="@style/SettingsHolderCheckboxStyle"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@null" android:background="@drawable/ripple_bottom_corners">
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_only_contacts_with_numbers"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout> <com.simplemobiletools.commons.views.MyAppCompatCheckbox
android:id="@+id/settings_start_name_with_surname"
style="@style/SettingsCheckboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/start_name_with_surname" />
<RelativeLayout </RelativeLayout>
android:id="@+id/settings_start_with_surname_holder" </LinearLayout>
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_start_with_surname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/start_name_with_surname"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_call_confirmation_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_call_confirmation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_call_confirmation_dialog"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_dialpad_button_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_dialpad_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_dialpad_button"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/settings_show_private_contacts_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/medium_margin"
android:background="?attr/selectableItemBackground"
android:paddingStart="@dimen/normal_margin"
android:paddingTop="@dimen/activity_margin"
android:paddingEnd="@dimen/normal_margin"
android:paddingBottom="@dimen/activity_margin">
<com.simplemobiletools.commons.views.MySwitchCompat
android:id="@+id/settings_show_private_contacts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:clickable="false"
android:paddingStart="@dimen/medium_margin"
android:text="@string/show_private_contacts"
app:switchPadding="@dimen/medium_margin" />
</RelativeLayout>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>

View File

@ -42,7 +42,7 @@
android:layout_margin="@dimen/medium_margin" android:layout_margin="@dimen/medium_margin"
android:background="?attr/selectableItemBackgroundBorderless" android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/tiny_margin" android:padding="@dimen/tiny_margin"
android:src="@drawable/ic_star_off_vector" android:src="@drawable/ic_star_outline_vector"
android:visibility="gone" /> android:visibility="gone" />
<LinearLayout <LinearLayout
@ -64,7 +64,7 @@
android:paddingStart="@dimen/small_margin" android:paddingStart="@dimen/small_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:scaleType="fitCenter" android:scaleType="fitCenter"
android:src="@drawable/ic_email_vector" /> android:src="@drawable/ic_mail_vector" />
<ImageView <ImageView
android:id="@+id/contact_start_call" android:id="@+id/contact_start_call"
@ -142,7 +142,7 @@
android:paddingTop="@dimen/medium_margin" android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin" android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/small_margin" android:paddingBottom="@dimen/small_margin"
android:src="@drawable/ic_email_vector" android:src="@drawable/ic_mail_vector"
android:visibility="gone" /> android:visibility="gone" />
<ImageView <ImageView

View File

@ -35,25 +35,21 @@
android:textSize="@dimen/bigger_text_size" android:textSize="@dimen/bigger_text_size"
android:visibility="gone" /> android:visibility="gone" />
<com.simplemobiletools.commons.views.MyRecyclerView <com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
android:id="@+id/fragment_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller
android:id="@+id/fragment_fastscroller" android:id="@+id/fragment_fastscroller"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content">
android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin">
<include layout="@layout/fastscroller_handle_vertical" /> <com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/fragment_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
</com.simplemobiletools.commons.views.FastScroller> </com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller>
</RelativeLayout> </RelativeLayout>
<com.simplemobiletools.commons.views.MyFloatingActionButton <com.simplemobiletools.commons.views.MyFloatingActionButton

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item_social_holder" android:id="@+id/item_social_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -7,12 +8,14 @@
android:background="?attr/selectableItemBackground" android:background="?attr/selectableItemBackground"
android:padding="@dimen/medium_margin"> android:padding="@dimen/medium_margin">
<ImageView <com.google.android.material.imageview.ShapeableImageView
android:id="@+id/item_social_image" android:id="@+id/item_social_image"
android:layout_width="@dimen/normal_icon_size" android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size" android:layout_height="@dimen/normal_icon_size"
android:padding="@dimen/medium_margin" android:padding="@dimen/small_margin"
android:src="@drawable/ic_phone_vector" /> android:scaleType="centerCrop"
app:shapeAppearanceOverlay="@style/roundedImageView"
tools:src="@drawable/ic_whatsapp_vector" />
<com.simplemobiletools.commons.views.MyTextView <com.simplemobiletools.commons.views.MyTextView
android:id="@+id/item_social_label" android:id="@+id/item_social_label"

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/contact_source_holder" android:id="@+id/contact_source_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -22,7 +23,7 @@
android:singleLine="true" android:singleLine="true"
android:textSize="@dimen/bigger_text_size" /> android:textSize="@dimen/bigger_text_size" />
<ImageView <com.google.android.material.imageview.ShapeableImageView
android:id="@+id/contact_source_image" android:id="@+id/contact_source_image"
android:layout_width="@dimen/normal_icon_size" android:layout_width="@dimen/normal_icon_size"
android:layout_height="@dimen/normal_icon_size" android:layout_height="@dimen/normal_icon_size"
@ -32,7 +33,8 @@
android:layout_marginEnd="@dimen/normal_margin" android:layout_marginEnd="@dimen/normal_margin"
android:background="?attr/selectableItemBackgroundBorderless" android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/small_margin" android:padding="@dimen/small_margin"
android:visibility="gone" android:scaleType="centerCrop"
tools:src="@drawable/ic_phone_vector" /> app:shapeAppearanceOverlay="@style/roundedImageView"
tools:src="@drawable/ic_whatsapp_vector" />
</RelativeLayout> </RelativeLayout>

View File

@ -11,19 +11,25 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipToPadding="false" android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation" android:layoutAnimation="@anim/layout_animation"
android:paddingEnd="@dimen/big_margin"
android:scrollbars="none" android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" /> app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
<com.simplemobiletools.commons.views.FastScroller <com.reddit.indicatorfastscroll.FastScrollerView
android:id="@+id/select_contact_fastscroller" android:id="@+id/letter_fastscroller"
android:layout_width="wrap_content" android:layout_width="32dp"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:layout_alignTop="@+id/select_contact_list"
android:layout_alignBottom="@+id/select_contact_list"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:paddingStart="@dimen/normal_margin"> android:paddingTop="@dimen/big_margin"
android:paddingBottom="@dimen/big_margin" />
<include layout="@layout/fastscroller_handle_vertical" /> <com.reddit.indicatorfastscroll.FastScrollerThumbView
android:id="@+id/letter_fastscroller_thumb"
android:layout_width="@dimen/fab_size"
android:layout_height="match_parent"
android:layout_alignTop="@+id/letter_fastscroller"
android:layout_alignBottom="@+id/letter_fastscroller"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_toStartOf="@+id/letter_fastscroller" />
</com.simplemobiletools.commons.views.FastScroller>
</RelativeLayout> </RelativeLayout>

View File

@ -8,7 +8,7 @@
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/cab_add_to_favorites" android:id="@+id/cab_add_to_favorites"
android:icon="@drawable/ic_star_on_vector" android:icon="@drawable/ic_star_vector"
android:title="@string/add_to_favorites" android:title="@string/add_to_favorites"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
@ -28,7 +28,7 @@
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/cab_send_email_to_contacts" android:id="@+id/cab_send_email_to_contacts"
android:icon="@drawable/ic_email_vector" android:icon="@drawable/ic_mail_vector"
android:title="@string/send_email_to_contacts" android:title="@string/send_email_to_contacts"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item

View File

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/cab_rename" android:id="@+id/cab_rename"
android:icon="@drawable/ic_rename_new" android:icon="@drawable/ic_rename_vector"
android:title="@string/rename" android:title="@string/rename"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/cab_select_all" android:id="@+id/cab_select_all"
android:icon="@drawable/ic_select_all_vector" android:icon="@drawable/ic_select_all_vector"
android:title="@string/select_all" android:title="@string/select_all"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/cab_delete" android:id="@+id/cab_delete"
android:icon="@drawable/ic_delete_vector" android:icon="@drawable/ic_delete_vector"
android:title="@string/delete" android:title="@string/delete"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@ -1,41 +1,43 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/search" android:id="@+id/search"
android:icon="@drawable/ic_search_vector" android:icon="@drawable/ic_search_vector"
android:title="@string/search" android:title="@string/search"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="collapseActionView|always"/> app:showAsAction="collapseActionView|always" />
<item <item
android:id="@+id/sort" android:id="@+id/sort"
android:icon="@drawable/ic_sort_vector" android:icon="@drawable/ic_sort_vector"
android:title="@string/sort_by" android:title="@string/sort_by"
app:showAsAction="always"/> app:showAsAction="always" />
<item <item
android:id="@+id/filter" android:id="@+id/filter"
android:icon="@drawable/ic_filter_vector" android:icon="@drawable/ic_filter_vector"
android:title="@string/filter" android:title="@string/filter"
app:showAsAction="always"/> app:showAsAction="always" />
<item <item
android:id="@+id/dialpad" android:id="@+id/dialpad"
android:icon="@drawable/ic_dialpad_vector" android:icon="@drawable/ic_dialpad_vector"
android:title="@string/dialpad" android:title="@string/dialpad"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/import_contacts" android:id="@+id/import_contacts"
android:title="@string/import_contacts_from_vcf" android:title="@string/import_contacts_from_vcf"
app:showAsAction="never"/> app:showAsAction="never" />
<item <item
android:id="@+id/export_contacts" android:id="@+id/export_contacts"
android:title="@string/export_contacts_to_vcf" android:title="@string/export_contacts_to_vcf"
app:showAsAction="never"/> app:showAsAction="never" />
<item <item
android:id="@+id/settings" android:id="@+id/settings"
android:icon="@drawable/ic_settings_cog_vector"
android:title="@string/settings" android:title="@string/settings"
app:showAsAction="never"/> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/about" android:id="@+id/about"
android:icon="@drawable/ic_info_vector"
android:title="@string/about" android:title="@string/about"
app:showAsAction="never"/> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@ -13,7 +13,7 @@
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
<item <item
android:id="@+id/send_email_to_group" android:id="@+id/send_email_to_group"
android:icon="@drawable/ic_email_vector" android:icon="@drawable/ic_mail_vector"
android:title="@string/send_email_to_group" android:title="@string/send_email_to_group"
app:showAsAction="ifRoom"/> app:showAsAction="ifRoom"/>
</menu> </menu>

View File

@ -42,7 +42,7 @@
<string name="remove_photo">Odstranit fotku</string> <string name="remove_photo">Odstranit fotku</string>
<!-- Settings --> <!-- Settings -->
<string name="show_phone_numbers">Zobrazit telefonní čísla na hlavní obrazovce</string> <string name="show_phone_numbers">Zobrazit telefonní čísla</string>
<string name="show_contact_thumbnails">Zobrazit obrázky kontaktů</string> <string name="show_contact_thumbnails">Zobrazit obrázky kontaktů</string>
<string name="show_dialpad_button">Zobrazit tlačítko číselníku na hlavní obrazovce</string> <string name="show_dialpad_button">Zobrazit tlačítko číselníku na hlavní obrazovce</string>
<string name="on_contact_click">Po klepnutí na kontakt</string> <string name="on_contact_click">Po klepnutí na kontakt</string>

View File

@ -12,7 +12,6 @@
<string name="send_email_to_contacts">Enviar e-mail aos contactos</string> <string name="send_email_to_contacts">Enviar e-mail aos contactos</string>
<string name="send_sms_to_group">Enviar SMS para o grupo</string> <string name="send_sms_to_group">Enviar SMS para o grupo</string>
<string name="send_email_to_group">Enviar e-mail para o grupo</string> <string name="send_email_to_group">Enviar e-mail para o grupo</string>
<string name="call_person">Ligar a %s</string>
<string name="create_new_contact">Criar novo contacto</string> <string name="create_new_contact">Criar novo contacto</string>
<string name="add_to_existing_contact">Adicionar a um contacto existente</string> <string name="add_to_existing_contact">Adicionar a um contacto existente</string>
@ -74,7 +73,6 @@
<!-- Favorites --> <!-- Favorites -->
<string name="no_favorites">Parece que aínda non engadiu contactos aos favoritos</string> <string name="no_favorites">Parece que aínda non engadiu contactos aos favoritos</string>
<string name="must_be_at_edit">Ten que estar na pantalla de edición para cambiar un contacto</string>
<!-- Search --> <!-- Search -->
<string name="search_contacts">Buscar nos contactos</string> <string name="search_contacts">Buscar nos contactos</string>
@ -106,6 +104,7 @@
<string name="groups">Grupos</string> <string name="groups">Grupos</string>
<string name="contact_source">Orixe do contacto</string> <string name="contact_source">Orixe do contacto</string>
<string name="instant_messaging">Mensaxe instantánea (IM)</string> <string name="instant_messaging">Mensaxe instantánea (IM)</string>
<string name="ringtone">Ringtone</string>
<!-- Confirmation dialog --> <!-- Confirmation dialog -->
<string name="delete_from_all_sources">O contacto será eliminado de todas as orixes.</string> <string name="delete_from_all_sources">O contacto será eliminado de todas as orixes.</string>
@ -132,7 +131,7 @@
Podes amosar os teus contactos ou grupos favoritos nunha lista separada. Os grupos pódense usar para enviar correos electrónicos por lotes ou SMS. Para aforrar tempo, podes renomealos facilmente. Podes amosar os teus contactos ou grupos favoritos nunha lista separada. Os grupos pódense usar para enviar correos electrónicos por lotes ou SMS. Para aforrar tempo, podes renomealos facilmente.
Contén botóns para chamar ou enviar mensaxes de texto aos teus contactos. Todos os campos visibles pódense personalizar como queiras e podes ocultar facilmente os que non uses. A función de busca buscará a cadea dada en todos os campos de contacto visibles para que poida atopar facilmente o contacto desexado. Contén botóns para chamar ou enviar mensaxes de texto aos teus contactos. Todos os campos visibles pódense personalizar como queiras e podes ocultar facilmente os que non uses. A función de busca buscará a cadea dada en todos os campos de contacto visibles para que poida atopar facilmente o contacto desexado.
Tamén hai un teclado de marcación lixeiro ao teu servizo e con suxestións de contactos intelixentes. Tamén hai un teclado de marcación lixeiro ao teu servizo e con suxestións de contactos intelixentes.
Dá soporte a exportación / importación de contactos en formato vCard a ficheiros .vcf e para migracións sinxelas ou facer copias de seguridade dos teus datos. Dá soporte a exportación / importación de contactos en formato vCard a ficheiros .vcf e para migracións sinxelas ou facer copias de seguridade dos teus datos.
@ -152,7 +151,7 @@
Vén cun deseño material e un tema escuro de xeito predeterminado, fornece unha excelente experiencia de usuario cun uso sinxelo. Como non necesita acceso a Internet, tes máis privacidade, seguridade e estabilidade. Vén cun deseño material e un tema escuro de xeito predeterminado, fornece unha excelente experiencia de usuario cun uso sinxelo. Como non necesita acceso a Internet, tes máis privacidade, seguridade e estabilidade.
Non contén anuncios nin permisos innecesarios. Dispón dun tema escuro e é totalmente de código aberto. Non contén anuncios nin permisos innecesarios. Dispón dun tema escuro e é totalmente de código aberto.
<b>Visita a páxina a través desta ligazón:</b> <b>Visita a páxina a través desta ligazón:</b>
https://www.simplemobiletools.com https://www.simplemobiletools.com

View File

@ -42,7 +42,7 @@
<string name="remove_photo">Remove photo</string> <string name="remove_photo">Remove photo</string>
<!-- Settings --> <!-- Settings -->
<string name="show_phone_numbers">Show phone numbers on the main screen</string> <string name="show_phone_numbers">Show phone numbers</string>
<string name="show_contact_thumbnails">Show contact thumbnails</string> <string name="show_contact_thumbnails">Show contact thumbnails</string>
<string name="show_dialpad_button">Show a dialpad button on the main screen</string> <string name="show_dialpad_button">Show a dialpad button on the main screen</string>
<string name="on_contact_click">On contact click</string> <string name="on_contact_click">On contact click</string>

View File

@ -42,7 +42,7 @@
<string name="remove_photo">Ukloni fotografiju</string> <string name="remove_photo">Ukloni fotografiju</string>
<!-- Settings --> <!-- Settings -->
<string name="show_phone_numbers">Prikaži telefonske brojeve na glavnom zaslonu</string> <string name="show_phone_numbers">Prikaži telefonske brojeve</string>
<string name="show_contact_thumbnails">Prikaži sličice kontakata</string> <string name="show_contact_thumbnails">Prikaži sličice kontakata</string>
<string name="show_dialpad_button">Show a dialpad button on the main screen</string> <string name="show_dialpad_button">Show a dialpad button on the main screen</string>
<string name="on_contact_click">Prilikom dodira kontakta</string> <string name="on_contact_click">Prilikom dodira kontakta</string>

View File

@ -42,7 +42,7 @@
<string name="remove_photo">Usuń zdjęcie</string> <string name="remove_photo">Usuń zdjęcie</string>
<!-- Settings --> <!-- Settings -->
<string name="show_phone_numbers">Pokazuj numery telefonów na ekranie głównym</string> <string name="show_phone_numbers">Pokazuj numery telefonów</string>
<string name="show_contact_thumbnails">Pokazuj miniaturki kontaktów</string> <string name="show_contact_thumbnails">Pokazuj miniaturki kontaktów</string>
<string name="show_dialpad_button">Pokazuj przycisk panelu wybierania numeru na ekranie głównym</string> <string name="show_dialpad_button">Pokazuj przycisk panelu wybierania numeru na ekranie głównym</string>
<string name="on_contact_click">Przy naciśnięciu kontaktu</string> <string name="on_contact_click">Przy naciśnięciu kontaktu</string>

View File

@ -103,7 +103,7 @@
<string name="groups">Grupos</string> <string name="groups">Grupos</string>
<string name="contact_source">Origem do contacto</string> <string name="contact_source">Origem do contacto</string>
<string name="instant_messaging">Mensagem instantânea (IM)</string> <string name="instant_messaging">Mensagem instantânea (IM)</string>
<string name="ringtone">Ringtone</string> <string name="ringtone">Toque de chamada</string>
<!-- Confirmation dialog --> <!-- Confirmation dialog -->
<string name="delete_from_all_sources">O contacto será apagado de todas as origens.</string> <string name="delete_from_all_sources">O contacto será apagado de todas as origens.</string>

View File

@ -42,7 +42,7 @@
<string name="remove_photo">Odstrániť foto</string> <string name="remove_photo">Odstrániť foto</string>
<!-- Settings --> <!-- Settings -->
<string name="show_phone_numbers">Zobraziť telefónne čísla na hlavnej obrazovke</string> <string name="show_phone_numbers">Zobraziť telefónne čísla</string>
<string name="show_contact_thumbnails">Zobraziť obrázky kontaktov</string> <string name="show_contact_thumbnails">Zobraziť obrázky kontaktov</string>
<string name="show_dialpad_button">Zobraziť tlačidlo pre číselník na hlavnej obrazovke</string> <string name="show_dialpad_button">Zobraziť tlačidlo pre číselník na hlavnej obrazovke</string>
<string name="on_contact_click">Po kliknutí na kontakt</string> <string name="on_contact_click">Po kliknutí na kontakt</string>

View File

@ -42,7 +42,7 @@
<string name="remove_photo">Remove photo</string> <string name="remove_photo">Remove photo</string>
<!-- Settings --> <!-- Settings -->
<string name="show_phone_numbers">Show phone numbers on the main screen</string> <string name="show_phone_numbers">Show phone numbers</string>
<string name="show_contact_thumbnails">Show contact thumbnails</string> <string name="show_contact_thumbnails">Show contact thumbnails</string>
<string name="show_dialpad_button">Show a dialpad button on the main screen</string> <string name="show_dialpad_button">Show a dialpad button on the main screen</string>
<string name="on_contact_click">On contact click</string> <string name="on_contact_click">On contact click</string>

View File

@ -2,4 +2,9 @@
<style name="AppTheme" parent="AppTheme.Base" /> <style name="AppTheme" parent="AppTheme.Base" />
<style name="roundedImageView">
<item name="cornerFamily">rounded</item>
<item name="cornerSize">50%</item>
</style>
</resources> </resources>

View File

@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.5.30' ext.kotlin_version = '1.5.31'
repositories { repositories {
google() google()
@ -9,7 +9,7 @@ buildscript {
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.2.2' classpath 'com.android.tools.build:gradle:7.0.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong

View File

@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip