diff --git a/README.md b/README.md
index 7549c8af..bfc4c93d 100644
--- a/README.md
+++ b/README.md
@@ -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
-
-
+
+

diff --git a/app/build.gradle b/app/build.gradle
index a707d080..e7da8848 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -56,7 +56,7 @@ android {
}
dependencies {
- implementation 'com.github.SimpleMobileTools:Simple-Commons:c1388a0721'
+ implementation 'com.github.SimpleMobileTools:Simple-Commons:f86699e092'
implementation 'joda-time:joda-time:2.10.3'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5'
implementation 'com.github.tibbi:IndicatorFastScroll:c3de1d040a'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1cde8a1e..bc9514d1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -199,21 +199,11 @@
android:label="@string/about"
android:parentActivityName=".activities.MainActivity"/>
-
-
-
-
group_contacts_placeholder_2.beVisibleIf(groupContacts.isEmpty())
group_contacts_placeholder.beVisibleIf(groupContacts.isEmpty())
- group_contacts_list.beVisibleIf(groupContacts.isNotEmpty())
+ group_contacts_fastscroller.beVisibleIf(groupContacts.isNotEmpty())
updateContacts(groupContacts)
}
}
@@ -133,17 +135,14 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
private fun updateContacts(contacts: ArrayList) {
val currAdapter = group_contacts_list.adapter
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)
}.apply {
group_contacts_list.adapter = this
}
- group_contacts_list.scheduleLayoutAnimation()
- group_contacts_fastscroller.setScrollToY(0)
- group_contacts_fastscroller.setViews(group_contacts_list) {
- val item = (group_contacts_list.adapter as ContactsAdapter).contactItems.getOrNull(it)
- group_contacts_fastscroller.updateBubbleText(item?.getBubbleText() ?: "")
+ if (areSystemAnimationsEnabled) {
+ group_contacts_list.scheduleLayoutAnimation()
}
} else {
(currAdapter as ContactsAdapter).updateItems(contacts)
@@ -180,9 +179,9 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, defaultRingtoneUri)
}
}
-
+
private fun setRingtoneOnSelected(uri: Uri) {
- groupContacts.forEach{
+ groupContacts.forEach {
ContactsHelper(this).updateRingtone(it.contactId.toString(), uri.toString())
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt
index 416ed2de..1c0a69eb 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt
@@ -386,6 +386,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
skippedTabs++
} else {
val tab = main_tabs_holder.newTab().setIcon(getTabIcon(index))
+ tab.contentDescription = getTabContentDescription(index)
main_tabs_holder.addTab(tab, index - skippedTabs, getDefaultTab() == index - skippedTabs)
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt
index bd877bc8..2bd5dd11 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt
@@ -12,9 +12,9 @@ import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.core.view.MenuItemCompat
+import com.reddit.indicatorfastscroll.FastScrollItemIndicator
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
-import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
+import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.adapters.SelectContactsAdapter
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.models.Contact
import kotlinx.android.synthetic.main.activity_select_contact.*
+import java.util.*
+import kotlin.collections.ArrayList
class SelectContactActivity : SimpleActivity() {
private var specialMimeType: String? = null
@@ -41,7 +43,7 @@ class SelectContactActivity : SimpleActivity() {
return
}
- setupPlaceholders()
+ setupViews()
handlePermission(PERMISSION_READ_CONTACTS) {
if (it) {
@@ -195,16 +197,25 @@ class SelectContactActivity : SimpleActivity() {
runOnUiThread {
updatePlaceholderVisibility(contacts)
- SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list, select_contact_fastscroller) {
+ SelectContactsAdapter(this, contacts, ArrayList(), false, select_contact_list) {
confirmSelection(it)
}.apply {
select_contact_list.adapter = this
}
- select_contact_list.scheduleLayoutAnimation()
- select_contact_fastscroller.setViews(select_contact_list) {
- select_contact_fastscroller.updateBubbleText(contacts[it].getBubbleText())
+ if (areSystemAnimationsEnabled) {
+ select_contact_list.scheduleLayoutAnimation()
}
+
+ 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_2.setTextColor(getAdjustedPrimaryColor())
+ select_contact_placeholder_2.setTextColor(adjustedPrimaryColor)
select_contact_placeholder_2.underlineText()
select_contact_placeholder_2.setOnClickListener {
FilterContactSourcesDialog(this) {
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) {
select_contact_list.beVisibleIf(contacts.isNotEmpty())
select_contact_placeholder_2.beVisibleIf(contacts.isEmpty())
select_contact_placeholder.beVisibleIf(contacts.isEmpty())
- select_contact_placeholder.setText(when (specialMimeType) {
- Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails
- Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers
- else -> R.string.no_contacts_found
- })
+ select_contact_placeholder.setText(
+ when (specialMimeType) {
+ Email.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_emails
+ Phone.CONTENT_ITEM_TYPE -> R.string.no_contacts_with_phone_numbers
+ else -> R.string.no_contacts_found
+ }
+ )
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt
index 24c2c69d..dc20665d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt
@@ -3,10 +3,7 @@ package com.simplemobiletools.contacts.pro.activities
import android.os.Bundle
import android.view.Menu
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
-import com.simplemobiletools.commons.extensions.baseConfig
-import com.simplemobiletools.commons.extensions.beVisibleIf
-import com.simplemobiletools.commons.extensions.getFontSizeText
-import com.simplemobiletools.commons.extensions.updateTextColors
+import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.R
@@ -44,6 +41,19 @@ class SettingsActivity : SimpleActivity() {
setupDefaultTab()
updateTextColors(settings_holder)
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 {
@@ -64,7 +74,7 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupManageShownTabs() {
- settings_manage_tabs_holder.setOnClickListener {
+ settings_manage_shown_tabs_holder.setOnClickListener {
ManageVisibleTabsDialog(this)
}
}
@@ -76,7 +86,8 @@ class SettingsActivity : SimpleActivity() {
RadioItem(TAB_CONTACTS, getString(R.string.contacts_tab)),
RadioItem(TAB_FAVORITES, getString(R.string.favorites_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) {
config.defaultTab = it as Int
@@ -85,12 +96,14 @@ class SettingsActivity : SimpleActivity() {
}
}
- private fun getDefaultTabText() = getString(when (baseConfig.defaultTab) {
- TAB_CONTACTS -> R.string.contacts_tab
- TAB_FAVORITES -> R.string.favorites_tab
- TAB_GROUPS -> R.string.groups_tab
- else -> R.string.last_used_tab
- })
+ private fun getDefaultTabText() = getString(
+ when (baseConfig.defaultTab) {
+ TAB_CONTACTS -> R.string.contacts_tab
+ TAB_FAVORITES -> R.string.favorites_tab
+ TAB_GROUPS -> R.string.groups_tab
+ else -> R.string.last_used_tab
+ }
+ )
private fun setupFontSize() {
settings_font_size.text = getFontSizeText()
@@ -99,7 +112,8 @@ class SettingsActivity : SimpleActivity() {
RadioItem(FONT_SIZE_SMALL, getString(R.string.small)),
RadioItem(FONT_SIZE_MEDIUM, getString(R.string.medium)),
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) {
config.fontSize = it as Int
@@ -111,6 +125,11 @@ class SettingsActivity : SimpleActivity() {
private fun setupUseEnglish() {
settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en")
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.toggle()
config.useEnglish = settings_use_english.isChecked
@@ -143,10 +162,10 @@ class SettingsActivity : SimpleActivity() {
}
private fun setupStartNameWithSurname() {
- settings_start_with_surname.isChecked = config.startNameWithSurname
- settings_start_with_surname_holder.setOnClickListener {
- settings_start_with_surname.toggle()
- config.startNameWithSurname = settings_start_with_surname.isChecked
+ settings_start_name_with_surname.isChecked = config.startNameWithSurname
+ settings_start_name_with_surname_holder.setOnClickListener {
+ settings_start_name_with_surname.toggle()
+ config.startNameWithSurname = settings_start_name_with_surname.isChecked
}
}
@@ -172,7 +191,8 @@ class SettingsActivity : SimpleActivity() {
val items = arrayListOf(
RadioItem(ON_CLICK_CALL_CONTACT, getString(R.string.call_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) {
config.onContactClick = it as Int
@@ -181,11 +201,13 @@ class SettingsActivity : SimpleActivity() {
}
}
- private fun getOnContactClickText() = getString(when (config.onContactClick) {
- ON_CLICK_CALL_CONTACT -> R.string.call_contact
- ON_CLICK_VIEW_CONTACT -> R.string.view_contact
- else -> R.string.edit_contact
- })
+ private fun getOnContactClickText() = getString(
+ when (config.onContactClick) {
+ ON_CLICK_CALL_CONTACT -> R.string.call_contact
+ ON_CLICK_VIEW_CONTACT -> R.string.view_contact
+ else -> R.string.edit_contact
+ }
+ )
private fun setupShowCallConfirmation() {
settings_show_call_confirmation.isChecked = config.showCallConfirmation
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt
index a6ac0829..7d48248f 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SimpleActivity.kt
@@ -66,10 +66,20 @@ open class SimpleActivity : BaseSimpleActivity() {
protected fun getTabIcon(position: Int): Drawable {
val drawableId = when (position) {
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
}
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)
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt
index e0d02a37..d0161872 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt
@@ -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() {
contact_photo_big.animate().alpha(0f).withEndAction { contact_photo_big.beGone() }.start()
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt
index 7465d5cc..207cd67a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt
@@ -19,13 +19,13 @@ import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey
+import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem
-import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.pro.R
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 java.util.*
-class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, private val refreshListener: RefreshContactsListener?,
- private val location: Int, private val removeListener: RemoveFromGroupListener?, recyclerView: MyRecyclerView,
- fastScroller: FastScroller?, highlightText: String = "", itemClick: (Any) -> Unit) :
- MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
+class ContactsAdapter(
+ activity: SimpleActivity, var contactItems: ArrayList, private val refreshListener: RefreshContactsListener?,
+ private val location: Int, private val removeListener: RemoveFromGroupListener?, recyclerView: MyRecyclerView,
+ highlightText: String = "", itemClick: (Any) -> Unit
+) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
private val NEW_GROUP_ID = -1
private var config = activity.config
@@ -66,10 +67,13 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList
+ val duplicates = allContacts.filter { it.id != contactToRemove.id && it.getHashToCompare() == contactToRemove.getHashToCompare() }
+ .toMutableList() as ArrayList
duplicates.add(contactToRemove)
ContactsHelper(activity).deleteContacts(duplicates)
}
@@ -392,4 +396,6 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView,
- fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
+class GroupsAdapter(
+ activity: SimpleActivity, var groups: ArrayList, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView,
+ itemClick: (Any) -> Unit
+) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick), RecyclerViewFastScroller.OnPopupTextUpdate {
private var textToHighlight = ""
var showContactThumbnails = activity.config.showContactThumbnails
@@ -172,4 +174,6 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val
}
}
}
+
+ override fun onChange(position: Int) = groups.getOrNull(position)?.getBubbleText() ?: ""
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt
index 451cdb68..64caebb5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SelectContactsAdapter.kt
@@ -12,7 +12,6 @@ import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.signature.ObjectKey
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
-import com.simplemobiletools.commons.views.FastScroller
import com.simplemobiletools.commons.views.MyRecyclerView
import com.simplemobiletools.contacts.pro.R
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 java.util.*
-class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayList, private val selectedContacts: ArrayList, private val allowPickMultiple: Boolean,
- recyclerView: MyRecyclerView, val fastScroller: FastScroller, private val itemClick: ((Contact) -> Unit)? = null) :
- RecyclerView.Adapter() {
+class SelectContactsAdapter(
+ val activity: SimpleActivity, var contacts: ArrayList, private val selectedContacts: ArrayList, private val allowPickMultiple: Boolean,
+ recyclerView: MyRecyclerView, private val itemClick: ((Contact) -> Unit)? = null
+) :
+ RecyclerView.Adapter() {
private val itemViews = SparseArray()
private val selectedPositions = HashSet()
private val config = activity.config
@@ -87,7 +88,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
textToHighlight = highlightText
notifyDataSetChanged()
}
- fastScroller.measureRecyclerView()
}
override fun onViewRecycled(holder: ViewHolder) {
@@ -124,7 +124,8 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis
}
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.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize)
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt
index 2f81ec1c..6ba6e361 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/RenameGroupDialog.kt
@@ -36,6 +36,7 @@ class RenameGroupDialog(val activity: BaseSimpleActivity, val group: Group, val
}
group.title = newTitle
+ group.contactsCount = 0
ensureBackgroundThread {
if (group.isPrivateSecretGroup()) {
activity.groupsDB.insertOrUpdate(group)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt
index 0a014cb7..914d6175 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectContactsDialog.kt
@@ -1,17 +1,23 @@
package com.simplemobiletools.contacts.pro.dialogs
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.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
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.models.Contact
import kotlinx.android.synthetic.main.layout_select_contact.view.*
+import java.util.*
+import kotlin.collections.ArrayList
-class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayList, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean,
- selectContacts: ArrayList? = null, val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit) {
+class SelectContactsDialog(
+ val activity: SimpleActivity, initialContacts: ArrayList, val allowSelectMultiple: Boolean, val showOnlyContactsWithNumber: Boolean,
+ selectContacts: ArrayList? = null, val callback: (addedContacts: ArrayList, removedContacts: ArrayList) -> Unit
+) {
private var dialog: AlertDialog? = null
private var view = activity.layoutInflater.inflate(R.layout.layout_select_contact, null)
private var initiallySelectedContacts = ArrayList()
@@ -31,32 +37,33 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
initiallySelectedContacts = selectContacts
}
- activity.runOnUiThread {
- // if selecting multiple contacts is disabled, react on first contact click and dismiss the dialog
- val contactClickCallback: ((Contact) -> Unit)? = if (allowSelectMultiple) null else { contact ->
- callback(arrayListOf(contact), arrayListOf())
- dialog!!.dismiss()
- }
+ // if selecting multiple contacts is disabled, react on first contact click and dismiss the dialog
+ val contactClickCallback: ((Contact) -> Unit)? = if (allowSelectMultiple) null else { contact ->
+ callback(arrayListOf(contact), arrayListOf())
+ dialog!!.dismiss()
+ }
- view.apply {
- select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, allowSelectMultiple,
- select_contact_list, select_contact_fastscroller, contactClickCallback)
+ view.apply {
+ select_contact_list.adapter = SelectContactsAdapter(
+ activity, allContacts, initiallySelectedContacts, allowSelectMultiple,
+ select_contact_list, contactClickCallback
+ )
+ if (context.areSystemAnimationsEnabled) {
select_contact_list.scheduleLayoutAnimation()
- select_contact_fastscroller.setViews(select_contact_list) {
- select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText())
- }
}
+ }
- val builder = AlertDialog.Builder(activity)
- if (allowSelectMultiple) {
- builder.setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() }
- }
- builder.setNegativeButton(R.string.cancel, null)
+ setupFastscroller(allContacts)
- dialog = builder.create().apply {
- activity.setupDialogStuff(view, this)
- }
+ val builder = AlertDialog.Builder(activity)
+ 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)
}
}
+
+ private fun setupFastscroller(allContacts: ArrayList) {
+ 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("")
+ }
+ })
+ }
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
index 05ca1913..d9294ff9 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
@@ -1,9 +1,10 @@
package com.simplemobiletools.contacts.pro.extensions
+import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
-import android.content.pm.LauncherApps
import android.database.Cursor
+import android.graphics.*
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Handler
@@ -26,6 +27,7 @@ import com.simplemobiletools.contacts.pro.models.Organization
import com.simplemobiletools.contacts.pro.models.SocialAction
import java.io.File
+
val Context.config: Config get() = Config.newInstance(applicationContext)
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 {
val originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
val organization = Organization("", "")
- return Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "",
- null, "", ArrayList(), organization, ArrayList(), ArrayList(), DEFAULT_MIMETYPE, null)
+ return Contact(
+ 0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "",
+ null, "", ArrayList(), organization, ArrayList(), ArrayList(), DEFAULT_MIMETYPE, null
+ )
}
fun Context.viewContact(contact: Contact) {
@@ -355,22 +359,15 @@ fun Context.getSocialActions(id: Int): ArrayList {
return socialActions
}
-fun Context.getPackageDrawable(packageName: String): Drawable? {
- var drawable: Drawable? = null
- try {
- // try getting the properly colored launcher icons
- val launcher = getSystemService(Context.LAUNCHER_APPS_SERVICE) as LauncherApps
- val activityList = launcher.getActivityList(packageName, android.os.Process.myUserHandle())[0]
- drawable = activityList.getBadgedIcon(0)
- } catch (ignored: Exception) {
- }
-
- if (drawable == null) {
- try {
- drawable = packageManager.getApplicationIcon(packageName)
- } catch (ignored: Exception) {
- }
- }
-
- return drawable
+@SuppressLint("UseCompatLoadingForDrawables")
+fun Context.getPackageDrawable(packageName: String): Drawable {
+ return resources.getDrawable(
+ when (packageName) {
+ TELEGRAM_PACKAGE -> R.drawable.ic_telegram_vector
+ SIGNAL_PACKAGE -> R.drawable.ic_signal_vector
+ WHATSAPP_PACKAGE -> R.drawable.ic_whatsapp_vector
+ VIBER_PACKAGE -> R.drawable.ic_viber_vector
+ else -> R.drawable.ic_threema_vector
+ }, theme
+ )
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
index b6f0294c..fd5415f4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
@@ -84,8 +84,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
}
context.updateTextColors(fragment_wrapper.parent as ViewGroup)
- fragment_fastscroller?.updatePrimaryColor()
- fragment_fastscroller?.updateBubblePrimaryColor()
+ fragment_fastscroller?.updateColors(adjustedPrimaryColor, adjustedPrimaryColor.getContrastColor())
fragment_placeholder_2?.setTextColor(adjustedPrimaryColor)
letter_fastscroller?.textColor = textColor.getColorStateList()
@@ -165,11 +164,11 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_placeholder_2.beVisibleIf(storedGroups.isEmpty())
fragment_placeholder.beVisibleIf(storedGroups.isEmpty())
- fragment_list.beVisibleIf(storedGroups.isNotEmpty())
+ fragment_fastscroller.beVisibleIf(storedGroups.isNotEmpty())
val currAdapter = fragment_list.adapter
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 {
putExtra(GROUP, it as Group)
activity!!.startActivity(this)
@@ -178,11 +177,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
fragment_list.adapter = this
}
- fragment_list.scheduleLayoutAnimation()
- fragment_fastscroller.setScrollToY(0)
- fragment_fastscroller.setViews(fragment_list) {
- val item = (fragment_list.adapter as GroupsAdapter).groups.getOrNull(it)
- fragment_fastscroller.updateBubbleText(item?.getBubbleText() ?: "")
+ if (context.areSystemAnimationsEnabled) {
+ fragment_list.scheduleLayoutAnimation()
}
} else {
(currAdapter as GroupsAdapter).apply {
@@ -206,12 +202,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
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)
}.apply {
fragment_list.adapter = this
}
- fragment_list.scheduleLayoutAnimation()
+
+ if (context.areSystemAnimationsEnabled) {
+ fragment_list.scheduleLayoutAnimation()
+ }
} else {
(currAdapter as ContactsAdapter).apply {
startNameWithSurname = config.startNameWithSurname
@@ -237,14 +236,15 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
}
private fun setupLetterFastscroller(contacts: ArrayList) {
+ val sorting = context.config.sorting
letter_fastscroller.setupWithRecyclerView(fragment_list, { position ->
try {
val contact = contacts[position]
var name = when {
contact.isABusinessContact() -> contact.getFullCompany()
- context.config.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
- context.config.sorting and SORT_BY_FIRST_NAME != 0 && contact.firstName.isNotEmpty() -> contact.firstName
+ sorting and SORT_BY_SURNAME != 0 && contact.surname.isNotEmpty() -> contact.surname
+ sorting and SORT_BY_MIDDLE_NAME != 0 && contact.middleName.isNotEmpty() -> contact.middleName
+ sorting and SORT_BY_FIRST_NAME != 0 && contact.firstName.isNotEmpty() -> contact.firstName
context.config.startNameWithSurname -> contact.surname
else -> contact.firstName
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt
index d87d92de..c45eaffa 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt
@@ -28,7 +28,12 @@ class ContactsHelper(val context: Context) {
private val BATCH_SIZE = 50
private var displayContactSources = ArrayList()
- fun getContacts(getAll: Boolean = false, gettingDuplicates: Boolean = false, ignoredContactSources: HashSet = HashSet(), callback: (ArrayList) -> Unit) {
+ fun getContacts(
+ getAll: Boolean = false,
+ gettingDuplicates: Boolean = false,
+ ignoredContactSources: HashSet = HashSet(),
+ callback: (ArrayList) -> Unit
+ ) {
ensureBackgroundThread {
val contacts = SparseArray()
displayContactSources = context.getVisibleContactSources()
@@ -187,8 +192,10 @@ class ContactsHelper(val context: Context) {
val organization = Organization("", "")
val websites = ArrayList()
val ims = ArrayList()
- val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses,
- events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone)
+ val contact = Contact(
+ 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)
}
@@ -733,8 +740,10 @@ class ContactsHelper(val context: Context) {
val organization = getOrganizations(id)[id] ?: Organization("", "")
val websites = getWebsites(id)[id] ?: ArrayList()
val ims = getIMs(id)[id] ?: ArrayList()
- return Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events,
- accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ims, mimetype, ringtone)
+ return Contact(
+ 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) -> Unit) {
ensureBackgroundThread {
getContacts(true, true) { contacts ->
- val duplicates = contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList
+ val duplicates =
+ contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList
if (addOriginal) {
duplicates.add(contact)
}
diff --git a/app/src/main/res/drawable/ic_account_box_vector.xml b/app/src/main/res/drawable/ic_account_box_vector.xml
index 751db47d..5c7ea5f8 100644
--- a/app/src/main/res/drawable/ic_account_box_vector.xml
+++ b/app/src/main/res/drawable/ic_account_box_vector.xml
@@ -1,9 +1,3 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_cake_vector.xml b/app/src/main/res/drawable/ic_cake_vector.xml
index acceada8..440a2c4d 100644
--- a/app/src/main/res/drawable/ic_cake_vector.xml
+++ b/app/src/main/res/drawable/ic_cake_vector.xml
@@ -1,9 +1,3 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_group_add_vector.xml b/app/src/main/res/drawable/ic_group_add_vector.xml
index 6d4dab73..6722c4e4 100644
--- a/app/src/main/res/drawable/ic_group_add_vector.xml
+++ b/app/src/main/res/drawable/ic_group_add_vector.xml
@@ -1,9 +1,3 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_link_vector.xml b/app/src/main/res/drawable/ic_link_vector.xml
index 8e04bd9e..51aa75eb 100644
--- a/app/src/main/res/drawable/ic_link_vector.xml
+++ b/app/src/main/res/drawable/ic_link_vector.xml
@@ -1,9 +1,3 @@
-
-
+
+
diff --git a/app/src/main/res/drawable/ic_signal_vector.xml b/app/src/main/res/drawable/ic_signal_vector.xml
new file mode 100644
index 00000000..08658680
--- /dev/null
+++ b/app/src/main/res/drawable/ic_signal_vector.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_telegram_vector.xml b/app/src/main/res/drawable/ic_telegram_vector.xml
new file mode 100644
index 00000000..1262e68f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_telegram_vector.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_threema_vector.xml b/app/src/main/res/drawable/ic_threema_vector.xml
new file mode 100644
index 00000000..4e806b25
--- /dev/null
+++ b/app/src/main/res/drawable/ic_threema_vector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_viber_vector.xml b/app/src/main/res/drawable/ic_viber_vector.xml
new file mode 100644
index 00000000..52baa287
--- /dev/null
+++ b/app/src/main/res/drawable/ic_viber_vector.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_whatsapp_vector.xml b/app/src/main/res/drawable/ic_whatsapp_vector.xml
new file mode 100644
index 00000000..55577cae
--- /dev/null
+++ b/app/src/main/res/drawable/ic_whatsapp_vector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index a0fe6bc2..6cd78135 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -43,7 +43,7 @@
android:layout_marginBottom="@dimen/medium_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/tiny_margin"
- android:src="@drawable/ic_star_off_vector" />
+ android:src="@drawable/ic_star_outline_vector" />
+ android:src="@drawable/ic_mail_vector" />
-
-
-
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
-
+
-
+
-
+ android:paddingTop="@dimen/big_margin"
+ android:paddingBottom="@dimen/big_margin" />
-
+
-
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index a75ed952..5ff9a0de 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -1,6 +1,6 @@
@@ -11,348 +11,317 @@
android:layout_height="wrap_content"
android:orientation="vertical">
-
+ android:text="@string/color_customization" />
-
-
-
-
-
+ android:layout_margin="@dimen/medium_margin"
+ android:background="@drawable/section_holder_stroke"
+ android:orientation="vertical">
-
+ android:background="@drawable/ripple_all_corners">
-
+
-
+
+
+
+ android:text="@string/general_settings" />
-
-
-
-
-
+ android:layout_margin="@dimen/medium_margin"
+ android:background="@drawable/section_holder_stroke"
+ android:orientation="vertical">
-
+ android:background="@drawable/ripple_top_corners">
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:text="@string/main_screen" />
-
-
-
-
-
-
-
+ android:layout_margin="@dimen/medium_margin"
+ android:background="@drawable/section_holder_stroke"
+ android:orientation="vertical">
-
+ android:background="@drawable/ripple_top_corners">
-
+
+
+
+
+ android:background="@drawable/ripple_background">
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:text="@string/list_view" />
-
-
-
-
-
-
-
+ android:layout_margin="@dimen/medium_margin"
+ android:background="@drawable/section_holder_stroke"
+ android:orientation="vertical">
-
+ android:background="@drawable/ripple_top_corners">
-
+
-
+
-
+ android:background="@drawable/ripple_background">
-
+
-
+
-
+ android:background="@drawable/ripple_bottom_corners">
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml
index 88e644d1..f00cfd7a 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -42,7 +42,7 @@
android:layout_margin="@dimen/medium_margin"
android:background="?attr/selectableItemBackgroundBorderless"
android:padding="@dimen/tiny_margin"
- android:src="@drawable/ic_star_off_vector"
+ android:src="@drawable/ic_star_outline_vector"
android:visibility="gone" />
+ android:src="@drawable/ic_mail_vector" />
-
-
-
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
-
+
-
+
-
+ android:padding="@dimen/small_margin"
+ android:scaleType="centerCrop"
+ app:shapeAppearanceOverlay="@style/roundedImageView"
+ tools:src="@drawable/ic_whatsapp_vector" />
-
+ android:scaleType="centerCrop"
+ app:shapeAppearanceOverlay="@style/roundedImageView"
+ tools:src="@drawable/ic_whatsapp_vector" />
diff --git a/app/src/main/res/layout/layout_select_contact.xml b/app/src/main/res/layout/layout_select_contact.xml
index c0b20909..166ecd1d 100644
--- a/app/src/main/res/layout/layout_select_contact.xml
+++ b/app/src/main/res/layout/layout_select_contact.xml
@@ -11,19 +11,25 @@
android:layout_height="wrap_content"
android:clipToPadding="false"
android:layoutAnimation="@anim/layout_animation"
+ android:paddingEnd="@dimen/big_margin"
android:scrollbars="none"
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" />
-
+ android:paddingTop="@dimen/big_margin"
+ android:paddingBottom="@dimen/big_margin" />
-
+
-
diff --git a/app/src/main/res/menu/cab.xml b/app/src/main/res/menu/cab.xml
index 692144c1..a151413c 100644
--- a/app/src/main/res/menu/cab.xml
+++ b/app/src/main/res/menu/cab.xml
@@ -8,7 +8,7 @@
app:showAsAction="ifRoom" />
-
diff --git a/app/src/main/res/menu/menu.xml b/app/src/main/res/menu/menu.xml
index ac7e1b82..077b741a 100644
--- a/app/src/main/res/menu/menu.xml
+++ b/app/src/main/res/menu/menu.xml
@@ -1,41 +1,43 @@
diff --git a/app/src/main/res/menu/menu_group.xml b/app/src/main/res/menu/menu_group.xml
index 24ef4864..bdc6b6a2 100644
--- a/app/src/main/res/menu/menu_group.xml
+++ b/app/src/main/res/menu/menu_group.xml
@@ -13,7 +13,7 @@
app:showAsAction="ifRoom"/>
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index dc60072b..4a5e2202 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -42,7 +42,7 @@
Odstranit fotku
- Zobrazit telefonní čísla na hlavní obrazovce
+ Zobrazit telefonní čísla
Zobrazit obrázky kontaktů
Zobrazit tlačítko číselníku na hlavní obrazovce
Po klepnutí na kontakt
diff --git a/app/src/main/res/values-gl b/app/src/main/res/values-gl/strings.xml
similarity index 98%
rename from app/src/main/res/values-gl
rename to app/src/main/res/values-gl/strings.xml
index 5c5b73f7..ab458bec 100644
--- a/app/src/main/res/values-gl
+++ b/app/src/main/res/values-gl/strings.xml
@@ -12,7 +12,6 @@
Enviar e-mail aos contactos
Enviar SMS para o grupo
Enviar e-mail para o grupo
- Ligar a %s
Criar novo contacto
Adicionar a um contacto existente
@@ -74,7 +73,6 @@
Parece que aínda non engadiu contactos aos favoritos
- Ten que estar na pantalla de edición para cambiar un contacto
Buscar nos contactos
@@ -106,6 +104,7 @@
Grupos
Orixe do contacto
Mensaxe instantánea (IM)
+ Ringtone
O contacto será eliminado de todas as orixes.
@@ -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.
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.
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.
Non contén anuncios nin permisos innecesarios. Dispón dun tema escuro e é totalmente de código aberto.
-
+
Visita a páxina a través desta ligazón:
https://www.simplemobiletools.com
diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml
index 63b23bd0..851b56fc 100644
--- a/app/src/main/res/values-hi-rIN/strings.xml
+++ b/app/src/main/res/values-hi-rIN/strings.xml
@@ -42,7 +42,7 @@
Remove photo
- Show phone numbers on the main screen
+ Show phone numbers
Show contact thumbnails
Show a dialpad button on the main screen
On contact click
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index f275daa6..4291c4cd 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -42,7 +42,7 @@
Ukloni fotografiju
- Prikaži telefonske brojeve na glavnom zaslonu
+ Prikaži telefonske brojeve
Prikaži sličice kontakata
Show a dialpad button on the main screen
Prilikom dodira kontakta
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index 5ec5d260..873de417 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -42,7 +42,7 @@
Usuń zdjęcie
- Pokazuj numery telefonów na ekranie głównym
+ Pokazuj numery telefonów
Pokazuj miniaturki kontaktów
Pokazuj przycisk panelu wybierania numeru na ekranie głównym
Przy naciśnięciu kontaktu
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 4fc5029f..cd052400 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -103,7 +103,7 @@
Grupos
Origem do contacto
Mensagem instantânea (IM)
- Ringtone
+ Toque de chamada
O contacto será apagado de todas as origens.
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index b48f9b2f..0d4573ae 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -42,7 +42,7 @@
Odstrániť foto
- Zobraziť telefónne čísla na hlavnej obrazovke
+ Zobraziť telefónne čísla
Zobraziť obrázky kontaktov
Zobraziť tlačidlo pre číselník na hlavnej obrazovke
Po kliknutí na kontakt
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 63b23bd0..851b56fc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -42,7 +42,7 @@
Remove photo
- Show phone numbers on the main screen
+ Show phone numbers
Show contact thumbnails
Show a dialpad button on the main screen
On contact click
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 9c3b80f3..7c4d1a23 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -2,4 +2,9 @@
+
+
diff --git a/build.gradle b/build.gradle
index 5166e667..187851b8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.5.30'
+ ext.kotlin_version = '1.5.31'
repositories {
google()
@@ -9,7 +9,7 @@ buildscript {
}
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"
// NOTE: Do not place your application dependencies here; they belong
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 78b02040..bc0757c0 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
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