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 -Get it on Google Play -Get it on F-Droid +Get it on Google Play +Get it on F-Droid
App image 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" /> + xmlns:app="http://schemas.android.com/apk/res-auto"> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> + 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 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + app:showAsAction="collapseActionView|always" /> + app:showAsAction="always" /> + app:showAsAction="always" /> + app:showAsAction="ifRoom" /> + app:showAsAction="never" /> + app:showAsAction="never" /> + app:showAsAction="ifRoom" /> + app:showAsAction="ifRoom" /> 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