diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..1606d61f --- /dev/null +++ b/.editorconfig @@ -0,0 +1,23 @@ +# Copying and distribution of this file, with or without modification, +# are permitted in any medium without royalty provided this notice is +# preserved. This file is offered as-is, without any warranty. +# Names of contributors must not be used to endorse or promote products +# derived from this file without specific prior written permission. + +# EditorConfig +# http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# LF end-of-line, insert an empty new line and UTF-8 +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +continuation_indent_size = 8 + +[*.xml] +continuation_indent_size = 4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 68705eea..ae243527 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,20 @@ Changelog ========== +Version 6.7.0 *(2020-02-05)* +---------------------------- + + * Improved the side scrollbar by adding letters to it on some places + * Allow changing the font size in the app settings + * Trigger speed dial only if no number has been written yet + +Version 6.6.0 *(2020-01-22)* +---------------------------- + + * Added an initial Speed dial implementation, can be customized in the app settings + * Properly color the status bar icons at light themes + * Many different stability, translation and UX improvements + Version 6.5.2 *(2020-01-04)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index 17c28582..3a620072 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,15 +10,15 @@ if (keystorePropertiesFile.exists()) { } android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion 29 + buildToolsVersion "29.0.2" defaultConfig { applicationId "com.simplemobiletools.contacts.pro" minSdkVersion 21 - targetSdkVersion 28 - versionCode 55 - versionName "6.5.2" + targetSdkVersion 29 + versionCode 57 + versionName "6.7.0" setProperty("archivesBaseName", "contacts") } @@ -57,10 +57,11 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.21.24' + implementation 'com.simplemobiletools:commons:5.22.10' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5' + implementation 'com.github.tibbi:IndicatorFastScroll:d615a5c141' kapt "androidx.room:room-compiler:2.2.2" implementation "androidx.room:room-runtime:2.2.2" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9964f4cf..6eade4d5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,9 +30,10 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_launcher_name" + android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher" - android:theme="@style/AppTheme" - android:supportsRtl="true"> + android:supportsRtl="true" + android:theme="@style/AppTheme"> () + private var contacts = ArrayList() + private var speedDialValues = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -40,6 +42,8 @@ class DialpadActivity : SimpleActivity() { return } + speedDialValues = config.getSpeedDialValues() + dialpad_0_holder.setOnClickListener { dialpadPressed("0", it) } dialpad_1.setOnClickListener { dialpadPressed("1", it) } dialpad_2.setOnClickListener { dialpadPressed("2", it) } @@ -50,6 +54,17 @@ class DialpadActivity : SimpleActivity() { dialpad_7.setOnClickListener { dialpadPressed("7", it) } dialpad_8.setOnClickListener { dialpadPressed("8", it) } dialpad_9.setOnClickListener { dialpadPressed("9", it) } + + dialpad_1.setOnLongClickListener { speedDial(1); true } + dialpad_2.setOnLongClickListener { speedDial(2); true } + dialpad_3.setOnLongClickListener { speedDial(3); true } + dialpad_4.setOnLongClickListener { speedDial(4); true } + dialpad_5.setOnLongClickListener { speedDial(5); true } + dialpad_6.setOnLongClickListener { speedDial(6); true } + dialpad_7.setOnLongClickListener { speedDial(7); true } + dialpad_8.setOnLongClickListener { speedDial(8); true } + dialpad_9.setOnLongClickListener { speedDial(9); true } + dialpad_0_holder.setOnLongClickListener { dialpadPressed("+", null); true } dialpad_asterisk.setOnClickListener { dialpadPressed("*", it) } dialpad_hashtag.setOnClickListener { dialpadPressed("#", it) } @@ -204,8 +219,7 @@ class DialpadActivity : SimpleActivity() { } } - private fun initCall() { - val number = dialpad_input.value + private fun initCall(number: String = dialpad_input.value) { if (number.isNotEmpty()) { if (config.showCallConfirmation) { CallConfirmationDialog(this, number) { @@ -216,4 +230,13 @@ class DialpadActivity : SimpleActivity() { } } } + + private fun speedDial(id: Int) { + if (dialpad_input.value.isEmpty()) { + val speedDial = speedDialValues.firstOrNull { it.id == id } + if (speedDial?.isValid() == true) { + initCall(speedDial.number) + } + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt index 8d034e14..356cb380 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/GroupContactsActivity.kt @@ -70,7 +70,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh } private fun fabClicked() { - SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> + SelectContactsDialog(this, allContacts, true, false, groupContacts) { addedContacts, removedContacts -> ensureBackgroundThread { addContactsToGroup(addedContacts, group.id!!) removeContactsFromGroup(removedContacts, group.id!!) 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 b052eed5..d62568a0 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 @@ -59,6 +59,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private var storedShowContactThumbnails = false private var storedShowPhoneNumbers = false private var storedStartNameWithSurname = false + private var storedFontSize = 0 private var storedShowTabs = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -137,6 +138,13 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { favorites_fragment?.startNameWithSurnameChanged(configStartNameWithSurname) } + val configFontSize = config.fontSize + if (storedFontSize != configFontSize) { + getAllFragments().forEach { + it?.fontSizeChanged() + } + } + if (werePermissionsHandled && !isFirstResume) { if (viewpager.adapter == null) { initFragments() @@ -218,6 +226,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { storedShowPhoneNumbers = showPhoneNumbers storedStartNameWithSurname = startNameWithSurname storedShowTabs = showTabs + storedFontSize = fontSize } } @@ -512,7 +521,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } private fun launchAbout() { - val licenses = LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON + val licenses = LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_INDICATOR_FAST_SCROLL val faqItems = arrayListOf( FAQItem(R.string.faq_1_title, R.string.faq_1_text), @@ -578,6 +587,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { add(Release(39, R.string.release_39)) add(Release(40, R.string.release_40)) add(Release(47, R.string.release_47)) + add(Release(56, R.string.release_56)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageSpeedDialActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageSpeedDialActivity.kt index 4f12804e..ca1a3a9c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageSpeedDialActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ManageSpeedDialActivity.kt @@ -2,19 +2,67 @@ package com.simplemobiletools.contacts.pro.activities import android.os.Bundle import com.google.gson.Gson -import com.google.gson.reflect.TypeToken +import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.adapters.SpeedDialAdapter +import com.simplemobiletools.contacts.pro.dialogs.SelectContactsDialog import com.simplemobiletools.contacts.pro.extensions.config +import com.simplemobiletools.contacts.pro.helpers.ContactsHelper +import com.simplemobiletools.contacts.pro.interfaces.RemoveSpeedDialListener +import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.SpeedDial +import kotlinx.android.synthetic.main.activity_manage_speed_dial.* -class ManageSpeedDialActivity : SimpleActivity() { - var speedDialValues = ArrayList() +class ManageSpeedDialActivity : SimpleActivity(), RemoveSpeedDialListener { + private var allContacts = ArrayList() + private var speedDialValues = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_manage_speed_dial) - val speedDialType = object : TypeToken>() {}.type - speedDialValues = Gson().fromJson>(config.speedDial, speedDialType) ?: ArrayList(1) + speedDialValues = config.getSpeedDialValues() + updateAdapter() + ContactsHelper(this).getContacts { contacts -> + allContacts = contacts + } + + updateTextColors(manage_speed_dial_scrollview) + } + + override fun onStop() { + super.onStop() + config.speedDial = Gson().toJson(speedDialValues) + } + + private fun updateAdapter() { + SpeedDialAdapter(this, speedDialValues, this, speed_dial_list) { + val clickedContact = it as SpeedDial + if (allContacts.isEmpty()) { + return@SpeedDialAdapter + } + + SelectContactsDialog(this, allContacts, false, true) { addedContacts, removedContacts -> + val selectedContact = addedContacts.first() + speedDialValues.first { it.id == clickedContact.id }.apply { + displayName = selectedContact.getNameToDisplay() + number = selectedContact.phoneNumbers.first().value + } + updateAdapter() + } + }.apply { + speed_dial_list.adapter = this + } + } + + override fun removeSpeedDial(ids: ArrayList) { + ids.forEach { + val dialId = it + speedDialValues.first { it.id == dialId }.apply { + displayName = "" + number = "" + } + } + updateAdapter() } } 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 69db856b..af80e499 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 @@ -199,7 +199,7 @@ class SelectContactActivity : SimpleActivity() { select_contact_list.adapter = this } - select_contact_fastscroller.allowBubbleDisplay = baseConfig.showInfoBubble + select_contact_fastscroller.allowBubbleDisplay = true select_contact_fastscroller.setViews(select_contact_list) { select_contact_fastscroller.updateBubbleText(contacts[it].getBubbleText()) } 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 7280a79c..ba48de77 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 @@ -7,8 +7,9 @@ import android.os.Bundle import android.view.Menu import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.beVisibleIf +import com.simplemobiletools.commons.extensions.getFontSizeText import com.simplemobiletools.commons.extensions.updateTextColors -import com.simplemobiletools.commons.helpers.isNougatPlus +import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.ManageVisibleFieldsDialog @@ -34,8 +35,8 @@ class SettingsActivity : SimpleActivity() { setupManageShownTabs() setupManageBlockedNumbers() setupManageSpeedDial() + setupFontSize() setupUseEnglish() - setupShowInfoBubble() setupShowContactThumbnails() setupShowPhoneNumbers() setupShowContactsWithNumbers() @@ -86,6 +87,22 @@ class SettingsActivity : SimpleActivity() { } } + private fun setupFontSize() { + settings_font_size.text = getFontSizeText() + settings_font_size_holder.setOnClickListener { + val items = arrayListOf( + 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))) + + RadioGroupDialog(this@SettingsActivity, items, config.fontSize) { + config.fontSize = it as Int + settings_font_size.text = getFontSizeText() + } + } + } + private fun setupUseEnglish() { settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en") settings_use_english.isChecked = config.useEnglish @@ -96,14 +113,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupShowInfoBubble() { - settings_show_info_bubble.isChecked = config.showInfoBubble - settings_show_info_bubble_holder.setOnClickListener { - settings_show_info_bubble.toggle() - config.showInfoBubble = settings_show_info_bubble.isChecked - } - } - private fun setupShowContactThumbnails() { settings_show_contact_thumbnails.isChecked = config.showContactThumbnails settings_show_contact_thumbnails_holder.setOnClickListener { 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 7efcd46d..89f34622 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 @@ -36,7 +36,7 @@ class ViewContactActivity : ContactActivity() { private var showFields = 0 private var fullContact: Contact? = null // contact with all fields filled from duplicates - private val COMPARABLE_PHONE_NUMBER_LENGTH = 7 + private val COMPARABLE_PHONE_NUMBER_LENGTH = 9 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) 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 77e028a2..f3d9678b 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 @@ -1,6 +1,7 @@ package com.simplemobiletools.contacts.pro.adapters import android.graphics.drawable.Drawable +import android.util.TypedValue import android.view.Menu import android.view.View import android.view.ViewGroup @@ -12,10 +13,7 @@ import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog -import com.simplemobiletools.commons.extensions.beVisibleIf -import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor -import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor -import com.simplemobiletools.commons.extensions.highlightTextPart +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.FastScroller @@ -33,7 +31,7 @@ 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) : + fastScroller: FastScroller?, highlightText: String = "", itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private val NEW_GROUP_ID = -1 @@ -43,9 +41,12 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList @@ -290,7 +285,12 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList { val options = RequestOptions() - .signature(ObjectKey(contact.photo!!)) + .signature(ObjectKey(contact.hashCode())) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .error(placeholderImage) .centerCrop() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt index 86a590ac..cd3eeb82 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/GroupsAdapter.kt @@ -1,14 +1,12 @@ package com.simplemobiletools.contacts.pro.adapters +import android.util.TypedValue import android.view.Menu import android.view.View import android.view.ViewGroup import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog -import com.simplemobiletools.commons.extensions.applyColorFilter -import com.simplemobiletools.commons.extensions.beVisibleIf -import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor -import com.simplemobiletools.commons.extensions.highlightTextPart +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView @@ -33,6 +31,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val var adjustedPrimaryColor = activity.getAdjustedPrimaryColor() var showContactThumbnails = activity.config.showContactThumbnails + var fontSize = activity.getTextSize() init { setupDragListener(true) @@ -72,7 +71,7 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_group, parent) - override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) { + override fun onBindViewHolder(holder: ViewHolder, position: Int) { val group = groups[position] holder.bindView(group, true, true) { itemView, layoutPosition -> setupView(itemView, group) @@ -164,8 +163,14 @@ class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList, val group_name.apply { setTextColor(textColor) + setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) text = groupTitle - setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0) + + if (showContactThumbnails) { + setPadding(smallPadding, bigPadding, bigPadding, bigPadding) + } else { + setPadding(bigPadding, bigPadding, bigPadding, bigPadding) + } } group_tmb.beVisibleIf(showContactThumbnails) 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 f6ddffc0..e69b25fe 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 @@ -1,7 +1,7 @@ package com.simplemobiletools.contacts.pro.adapters -import android.graphics.drawable.Drawable import android.util.SparseArray +import android.util.TypedValue import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView @@ -10,16 +10,12 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.signature.ObjectKey -import com.simplemobiletools.commons.extensions.beVisibleIf -import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor -import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor -import com.simplemobiletools.commons.extensions.highlightTextPart +import com.simplemobiletools.commons.extensions.* 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 import com.simplemobiletools.contacts.pro.extensions.config -import com.simplemobiletools.contacts.pro.helpers.Config import com.simplemobiletools.contacts.pro.helpers.highlightTextFromNumbers import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.item_add_favorite_with_number.view.* @@ -33,13 +29,16 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis private val config = activity.config private val textColor = config.textColor private val adjustedPrimaryColor = activity.getAdjustedPrimaryColor() + private val fontSize = activity.getTextSize() private val contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person_vector, textColor) private val showContactThumbnails = config.showContactThumbnails - private val itemLayout = if (config.showPhoneNumbers) R.layout.item_add_favorite_with_number else R.layout.item_add_favorite_without_number + private val showPhoneNumbers = config.showPhoneNumbers + private val itemLayout = if (showPhoneNumbers) R.layout.item_add_favorite_with_number else R.layout.item_add_favorite_without_number private var textToHighlight = "" private var smallPadding = activity.resources.getDimension(R.dimen.small_margin).toInt() + private var mediumPadding = activity.resources.getDimension(R.dimen.medium_margin).toInt() private var bigPadding = activity.resources.getDimension(R.dimen.normal_margin).toInt() init { @@ -78,8 +77,8 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis } override fun onBindViewHolder(holder: ViewHolder, position: Int) { - val eventType = contacts[position] - itemViews.put(position, holder.bindView(eventType, contactDrawable, config, showContactThumbnails, smallPadding, bigPadding)) + val contact = contacts[position] + itemViews.put(position, holder.bindView(contact)) toggleItemSelection(selectedPositions.contains(position), position) } @@ -105,8 +104,7 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis } inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { - fun bindView(contact: Contact, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean, - smallPadding: Int, bigPadding: Int): View { + fun bindView(contact: Contact): View { itemView.apply { contact_checkbox.beVisibleIf(allowPickMultiple) contact_checkbox.setColors(config.textColor, context.getAdjustedPrimaryColor(), config.backgroundColor) @@ -122,7 +120,12 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis } contact_name.setTextColor(textColor) - contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0) + contact_name.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) + if (!showContactThumbnails && !showPhoneNumbers) { + contact_name.setPadding(bigPadding, bigPadding, bigPadding, bigPadding) + } else { + contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0) + } if (contact_number != null) { val phoneNumberToUse = if (textToHighlight.isEmpty()) { @@ -135,6 +138,7 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis contact_number.text = if (textToHighlight.isEmpty()) numberText else numberText.highlightTextPart(textToHighlight, adjustedPrimaryColor, false, true) contact_number.setTextColor(textColor) contact_number.setPadding(if (showContactThumbnails) smallPadding else bigPadding, 0, smallPadding, 0) + contact_number.setTextSize(TypedValue.COMPLEX_UNIT_PX, fontSize) } contact_frame.setOnClickListener { @@ -161,8 +165,24 @@ class SelectContactsAdapter(val activity: SimpleActivity, var contacts: ArrayLis .apply(options) .apply(RequestOptions.circleCropTransform()) .into(contact_tmb) + contact_tmb.setPadding(smallPadding, smallPadding, smallPadding, smallPadding) } + } else if (contact.photo != null) { + val options = RequestOptions() + .signature(ObjectKey(contact.hashCode())) + .diskCacheStrategy(DiskCacheStrategy.RESOURCE) + .error(contactDrawable) + .centerCrop() + + Glide.with(activity) + .load(contact.photo) + .transition(DrawableTransitionOptions.withCrossFade()) + .apply(options) + .apply(RequestOptions.circleCropTransform()) + .into(contact_tmb) + contact_tmb.setPadding(smallPadding, smallPadding, smallPadding, smallPadding) } else { + contact_tmb.setPadding(mediumPadding, mediumPadding, mediumPadding, mediumPadding) contact_tmb.setImageDrawable(contactDrawable) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SpeedDialAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SpeedDialAdapter.kt new file mode 100644 index 00000000..78e2fbfb --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/SpeedDialAdapter.kt @@ -0,0 +1,80 @@ +package com.simplemobiletools.contacts.pro.adapters + +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter +import com.simplemobiletools.commons.views.MyRecyclerView +import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.activities.SimpleActivity +import com.simplemobiletools.contacts.pro.interfaces.RemoveSpeedDialListener +import com.simplemobiletools.contacts.pro.models.SpeedDial +import kotlinx.android.synthetic.main.item_speed_dial.view.* +import java.util.* + +class SpeedDialAdapter(activity: SimpleActivity, var speedDialValues: ArrayList, private val removeListener: RemoveSpeedDialListener, + recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) { + + init { + setupDragListener(true) + } + + override fun getActionMenuId() = R.menu.cab_speed_dial + + override fun prepareActionMode(menu: Menu) {} + + override fun actionItemPressed(id: Int) { + if (selectedKeys.isEmpty()) { + return + } + + when (id) { + R.id.cab_delete -> deleteSpeedDial() + } + } + + override fun getSelectableItemCount() = speedDialValues.size + + override fun getIsItemSelectable(position: Int) = speedDialValues[position].isValid() + + override fun getItemSelectionKey(position: Int) = speedDialValues.getOrNull(position)?.hashCode() + + override fun getItemKeyPosition(key: Int) = speedDialValues.indexOfFirst { it.hashCode() == key } + + override fun onActionModeCreated() {} + + override fun onActionModeDestroyed() {} + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_speed_dial, parent) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val speedDial = speedDialValues[position] + holder.bindView(speedDial, true, true) { itemView, layoutPosition -> + setupView(itemView, speedDial) + } + bindViewHolder(holder) + } + + override fun getItemCount() = speedDialValues.size + + private fun getSelectedItems() = speedDialValues.filter { selectedKeys.contains(it.hashCode()) } as ArrayList + + private fun deleteSpeedDial() { + val ids = getSelectedItems().map { it.id }.toMutableList() as ArrayList + removeListener.removeSpeedDial(ids) + finishActMode() + } + + private fun setupView(view: View, speedDial: SpeedDial) { + view.apply { + var displayName = "${speedDial.id}. " + displayName += if (speedDial.isValid()) speedDial.displayName else "" + + speed_dial_label.apply { + text = displayName + isSelected = selectedKeys.contains(speedDial.hashCode()) + setTextColor(textColor) + } + } + } +} 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 3f8fc29d..a50ced34 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,7 +1,6 @@ package com.simplemobiletools.contacts.pro.dialogs import androidx.appcompat.app.AlertDialog -import com.simplemobiletools.commons.extensions.baseConfig import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.commons.helpers.ensureBackgroundThread import com.simplemobiletools.contacts.pro.R @@ -11,8 +10,9 @@ import com.simplemobiletools.contacts.pro.extensions.getVisibleContactSources import com.simplemobiletools.contacts.pro.models.Contact import kotlinx.android.synthetic.main.layout_select_contact.view.* -class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayList, 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() @@ -22,27 +22,42 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL val contactSources = activity.getVisibleContactSources() allContacts = allContacts.filter { contactSources.contains(it.source) } as ArrayList + if (showOnlyContactsWithNumber) { + allContacts = allContacts.filter { it.phoneNumbers.isNotEmpty() }.toMutableList() as ArrayList + } + initiallySelectedContacts = allContacts.filter { it.starred == 1 } as ArrayList } else { 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() + } + view.apply { - select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, true, select_contact_list, select_contact_fastscroller) - select_contact_fastscroller.allowBubbleDisplay = activity.baseConfig.showInfoBubble + select_contact_list.adapter = SelectContactsAdapter(activity, allContacts, initiallySelectedContacts, allowSelectMultiple, + select_contact_list, select_contact_fastscroller, contactClickCallback) + + select_contact_fastscroller.allowBubbleDisplay = true select_contact_fastscroller.setViews(select_contact_list) { select_contact_fastscroller.updateBubbleText(allContacts[it].getBubbleText()) } } - } - AlertDialog.Builder(activity) - .setPositiveButton(R.string.ok) { dialog, which -> dialogConfirmed() } - .setNegativeButton(R.string.cancel, null) - .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) + } + } } private fun dialogConfirmed() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt index 66be621f..2502edd8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/FavoritesFragment.kt @@ -19,7 +19,7 @@ class FavoritesFragment(context: Context, attributeSet: AttributeSet) : MyViewPa } private fun showAddFavoritesDialog() { - SelectContactsDialog(activity!!, allContacts) { addedContacts, removedContacts -> + SelectContactsDialog(activity!!, allContacts, true, false) { addedContacts, removedContacts -> ContactsHelper(activity as SimpleActivity).apply { addFavorites(addedContacts) removeFavorites(removedContacts) 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 85395447..6b20b68d 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 @@ -2,9 +2,11 @@ package com.simplemobiletools.contacts.pro.fragments import android.content.Context import android.content.Intent +import android.content.res.ColorStateList import android.util.AttributeSet import android.view.ViewGroup import androidx.coordinatorlayout.widget.CoordinatorLayout +import com.reddit.indicatorfastscroll.FastScrollItemIndicator import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME @@ -23,6 +25,14 @@ import com.simplemobiletools.contacts.pro.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.Group import kotlinx.android.synthetic.main.fragment_layout.view.* +import kotlinx.android.synthetic.main.fragment_layout.view.fragment_fab +import kotlinx.android.synthetic.main.fragment_layout.view.fragment_list +import kotlinx.android.synthetic.main.fragment_layout.view.fragment_placeholder +import kotlinx.android.synthetic.main.fragment_layout.view.fragment_placeholder_2 +import kotlinx.android.synthetic.main.fragment_layout.view.fragment_wrapper +import kotlinx.android.synthetic.main.fragment_letters_layout.view.* +import java.util.* +import kotlin.collections.ArrayList abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) : CoordinatorLayout(context, attributeSet) { protected var activity: SimpleActivity? = null @@ -35,6 +45,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) var skipHashComparing = false var forceListRedraw = false + var wasLetterFastScrollerSetup = false fun setupFragment(activity: SimpleActivity) { config = activity.config @@ -79,8 +90,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } fun primaryColorChanged() { - fragment_fastscroller.updatePrimaryColor() - fragment_fastscroller.updateBubblePrimaryColor() + fragment_fastscroller?.updatePrimaryColor() + fragment_fastscroller?.updateBubblePrimaryColor() (fragment_list.adapter as? ContactsAdapter)?.apply { adjustedPrimaryColor = context.getAdjustedPrimaryColor() } @@ -139,6 +150,39 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } else { setupContactsFavoritesAdapter(contacts) contactsIgnoringSearch = (fragment_list?.adapter as? ContactsAdapter)?.contactItems ?: ArrayList() + + if (!wasLetterFastScrollerSetup) { + wasLetterFastScrollerSetup = true + + val states = arrayOf(intArrayOf(android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_enabled), + intArrayOf(-android.R.attr.state_checked), + intArrayOf(android.R.attr.state_pressed) + ) + + val textColor = config.textColor + val colors = intArrayOf(textColor, textColor, textColor, textColor) + + val myList = ColorStateList(states, colors) + letter_fastscroller.textColor = myList + + letter_fastscroller.setupWithRecyclerView(fragment_list, { position -> + try { + val name = contacts[position].getNameToDisplay() + var character = if (name.isNotEmpty()) name.substring(0, 1) else "" + if (!character.areLettersOnly()) { + character = "#" + } + + FastScrollItemIndicator.Text(character.toUpperCase(Locale.getDefault())) + } catch (e: Exception) { + FastScrollItemIndicator.Text("") + } + }) + + letter_fastscroller_thumb.setupWithFastScroller(letter_fastscroller) + letter_fastscroller_thumb.textColor = config.primaryColor.getContrastColor() + } } } @@ -197,17 +241,11 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) else -> LOCATION_CONTACTS_TAB } - ContactsAdapter(activity as SimpleActivity, contacts, activity as RefreshContactsListener, location, null, fragment_list, fragment_fastscroller) { + ContactsAdapter(activity as SimpleActivity, contacts, activity as RefreshContactsListener, location, null, fragment_list, null) { (activity as RefreshContactsListener).contactClicked(it as Contact) }.apply { fragment_list.adapter = this } - - fragment_fastscroller.setScrollToY(0) - fragment_fastscroller.setViews(fragment_list) { - val item = (fragment_list.adapter as ContactsAdapter).contactItems.getOrNull(it) - fragment_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") - } } else { (currAdapter as ContactsAdapter).apply { startNameWithSurname = config.startNameWithSurname @@ -232,6 +270,20 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) } } + fun fontSizeChanged() { + if (this is GroupsFragment) { + (fragment_list.adapter as? GroupsAdapter)?.apply { + fontSize = activity.getTextSize() + notifyDataSetChanged() + } + } else { + (fragment_list.adapter as? ContactsAdapter)?.apply { + fontSize = activity.getTextSize() + notifyDataSetChanged() + } + } + } + fun onActivityResume() { updateViewStuff() } @@ -304,9 +356,10 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) private fun updateViewStuff() { context.updateTextColors(fragment_wrapper.parent as ViewGroup) - fragment_fastscroller.updateBubbleColors() - fragment_fastscroller.allowBubbleDisplay = config.showInfoBubble + fragment_fastscroller?.updateBubbleColors() + fragment_fastscroller?.allowBubbleDisplay = true fragment_placeholder_2?.setTextColor(context.getAdjustedPrimaryColor()) + letter_fastscroller_thumb?.fontSize = context.getTextSize() } private fun setupViewVisibility(hasItemsToShow: Boolean) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt index bf6f15b7..7905d19b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt @@ -1,7 +1,10 @@ package com.simplemobiletools.contacts.pro.helpers import android.content.Context +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.simplemobiletools.commons.helpers.BaseConfig +import com.simplemobiletools.contacts.pro.models.SpeedDial class Config(context: Context) : BaseConfig(context) { companion object { @@ -60,4 +63,18 @@ class Config(context: Context) : BaseConfig(context) { var speedDial: String get() = prefs.getString(SPEED_DIAL, "")!! set(speedDial) = prefs.edit().putString(SPEED_DIAL, speedDial).apply() + + fun getSpeedDialValues(): ArrayList { + val speedDialType = object : TypeToken>() {}.type + val speedDialValues = Gson().fromJson>(speedDial, speedDialType) ?: ArrayList(1) + + for (i in 1..9) { + val speedDial = SpeedDial(i, "", "") + if (speedDialValues.firstOrNull { it.id == i } == null) { + speedDialValues.add(speedDial) + } + } + + return speedDialValues + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveSpeedDialListener.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveSpeedDialListener.kt new file mode 100644 index 00000000..ccb59777 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/RemoveSpeedDialListener.kt @@ -0,0 +1,5 @@ +package com.simplemobiletools.contacts.pro.interfaces + +interface RemoveSpeedDialListener { + fun removeSpeedDial(ids: ArrayList) +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SpeedDial.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SpeedDial.kt index 59e15396..a54a10f1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SpeedDial.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SpeedDial.kt @@ -1,3 +1,5 @@ package com.simplemobiletools.contacts.pro.models -data class SpeedDial(val id: Int, var number: String, var displayName: String) +data class SpeedDial(val id: Int, var number: String, var displayName: String) { + fun isValid() = number.trim().isNotEmpty() +} diff --git a/app/src/main/res/layout/activity_manage_speed_dial.xml b/app/src/main/res/layout/activity_manage_speed_dial.xml index 927c961c..8f87e71a 100644 --- a/app/src/main/res/layout/activity_manage_speed_dial.xml +++ b/app/src/main/res/layout/activity_manage_speed_dial.xml @@ -1,5 +1,7 @@ - - - - - - - - - - - - - - - - - - + android:layout_height="match_parent" + android:clipToPadding="false" + android:scrollbars="none" + app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" /> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 225776f3..457755c9 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -117,6 +117,38 @@ + + + + + + + + - - - - - - - + diff --git a/app/src/main/res/layout/fragment_favorites.xml b/app/src/main/res/layout/fragment_favorites.xml index 03380853..8056e04d 100644 --- a/app/src/main/res/layout/fragment_favorites.xml +++ b/app/src/main/res/layout/fragment_favorites.xml @@ -5,6 +5,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + diff --git a/app/src/main/res/layout/fragment_letters_layout.xml b/app/src/main/res/layout/fragment_letters_layout.xml new file mode 100644 index 00000000..86ab1632 --- /dev/null +++ b/app/src/main/res/layout/fragment_letters_layout.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_contact_with_number.xml b/app/src/main/res/layout/item_contact_with_number.xml index 3a0dd8ca..b491454c 100644 --- a/app/src/main/res/layout/item_contact_with_number.xml +++ b/app/src/main/res/layout/item_contact_with_number.xml @@ -45,7 +45,7 @@ android:layout_toEndOf="@+id/contact_tmb" android:alpha="0.6" android:maxLines="1" - android:textSize="@dimen/bigger_text_size" + android:textSize="@dimen/big_text_size" tools:text="0123 456 789" /> diff --git a/app/src/main/res/layout/item_speed_dial.xml b/app/src/main/res/layout/item_speed_dial.xml new file mode 100644 index 00000000..6cdfb871 --- /dev/null +++ b/app/src/main/res/layout/item_speed_dial.xml @@ -0,0 +1,15 @@ + + diff --git a/app/src/main/res/menu/cab_speed_dial.xml b/app/src/main/res/menu/cab_speed_dial.xml new file mode 100644 index 00000000..abf9dbfa --- /dev/null +++ b/app/src/main/res/menu/cab_speed_dial.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 332e926a..662f7758 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -180,7 +180,17 @@ Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. - This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + Nenalezeny žádné kontakty. + Nenalezeny žádné kontakty s e-maily + Nenalezeny žádné kontakty s telefonními čísly + + Nový kontakt + Upravit kontakt + Zvolte kontakt + Zvolte kontakty + Křestní jméno + Prostřední jméno + Příjmení + Přezdívka + + + Žádné skupiny + Vytvořit novou skupinu + Odebrat ze skupiny + Skupina je prázdná + Přidat kontakty + Nemáte v zařízení vytvořeny žádné skupiny kontaktů + Vytvořit skupinu + Přidat do skupiny + Vytvořit skupinu pod účet + + + Pořídit fotku + Zvolit fotku + Odstranit fotku + + + Nejprve příjmení + Zobrazit telefonní čísla na hlavní obrazovce + Zobrazit obrázky kontaktů + Zobrazit tlačítko číselníku na hlavní obrazovce + Po klepnutí na kontakt + Zavolat kontakt + Zobrazit údaje kontaktu + Spravovat zobrazená pole kontaktů + Pokusit se vyfiltrovat duplicitní kontakty + Spravovat zobrazené karty + Kontakty + Oblíbené + Před zahájením hovoru zobrazit potvrzovací dialog + Zobrazit jen kontakty s telefonními čísly + Zobrazit na číselníku písmena + + + E-mail + Domov + Práce + Jiné + + + Číslo + Mobil + Hlavní + Pracovní fax + Domácí fax + Pager + Nenalezeno žádné telefonní číslo + + + Narozeniny + Výročí + + + Vypadá to, že jste ještě nepřidali žádné oblíbené kontakty. + Přidat oblíbené + Přidat mezi oblíbené + Odebrat z oblíbených + Pro úpravu kontaktu musíte být v Editoru kontaktu + + + Hledat v kontaktech + Hledat mezi oblíbenými + Hledat mezi skupinami + + + Importovat kontakty + Exportovat kontakty + Importovat kontakty z .vcf souboru + Exportovat kontakty do .vcf souboru + Cílový zdroj kontaktů + Zahrnout zdroje kontaktů + Název souboru (bez .vcf) + + + Číselník + Přidat číslo kontaktu + + + Telefon + Vytáčí se + Příchozí hovor + Příchozí hovor od… + Probíhající hovor + Ukončený hovor + Odmítnout + Přijmout + + + Rychlé vytáčení + Spravovat rychlé vytáčení + Pro přiřazení kontaktu klepněte na číslo. Následně můžete daný kontakt rychle vytočit dlouhým podržením čísla na číselníku. + + + Zvolte pole k zobrazení + Titul před jménem + Titul za příjmením + Telefonní čísla + E-maily + Adresy + Události (narozeniny, výročí) + Poznámky + Firma + Webové stránky + Skupiny + Zdroje kontaktů + Rychlé zprávy (IM) + + + Spravovat blokovaná čísla + Neblokujete nikoho. + Přidat blokované číslo + Blokovat číslo + Blokovat čísla + Blokovaná čísla + + + Opravdu chcete vymazat %s? + Kontakt bude vymazán ze všech zdrojů kontaktů. + + + + %d kontakt + %d kontakty + %d kontaktů + + + + %d skupinu + %d skupiny + %d skupin + + + + Chci upravit viditelná pole kontaktů. Lze to? + Ano, stačí jít do Nastavení -> Spravovat zobrazená pole kontaktů. Tam si můžete zvolit, která pole mají být viditelná. Některá jsou ve výchozím stavu vypnutá, takže tam můžete objevit i nová pole. + + + + Jednoduché kontakty Pro - Rychlá správa kontaktů + + Aplikace pro správu vašich kontaktů bez reklam, respektující vaše soukromí. + + Jednoduchá aplikace na vytváření nebo správu vašich kontaktů z různých zdrojů. Mohou být uloženy buď jen ve vašem zařízení, nebo je můžete i synchronizovat přes Google či jiný účet. Své oblíbené položky si můžete zobrazit ve vlastním seznamu. + + Můžete ji používat i na správu e-mailů a událostí kontaktů. Nabízí možnost řazení/filtrování pomocí různých parametrů, volitelné je zobrazování příjmení před jménem. + + Neobsahuje žádné reklamy, ani nepotřebná oprávnění. Má plně otevřený zdrojový kód a možnost změny barev. + + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index def1a143..2bb5ca15 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -180,7 +180,17 @@ Does dim hysbysebion na dim angen arno unrhyw ganiatâd diangen. Mae\'n gwbl cod agored ac mae modd addasu lliwiau\'r ap. - Mae\'r ap hwn yn un ymhlith nifer o apiau gennym. Mae\'r gweddill i\'w gweld ar https://www.simplemobiletools.com + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools - Speed dial - Manage speed dial - Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer. + Ταχεία Κλήση + Διαχείριση Ταχείας Κλήσης + Κάντε κλικ σε έναν αριθμό για να αντιστοιχίσετε μια επαφή σε αυτόν. Στη συνέχεια, μπορείτε να καλέσετε γρήγορα τη δεδομένη επαφή πατώντας τον αριθμό αυτόν στο πληκτρολόγιο. Επιλογή εμφάνισης πεδίων @@ -180,7 +180,17 @@ Δεν περιέχει διαφημίσεις ή περιττές άδειες. Έιναι όλη ανοιχτού κώδικα και παρέχει προσαρμόσιμα χρώματα για την εφαρμογή. - Αυτή η εφαρμογή είναι μέρος μιας σειράς εφαρμογών. Μπορείτε να βρείτε τις υπόλοιπες στο https://www.simplemobiletools.com + Δείτε την πλήρη σειρά των Απλών Εργαλείων εδώ: + https://www.simplemobiletools.com + + Αποκλειστική ιστοσελίδα της Απλές Επαφές Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools - Speed dial - Manage speed dial - Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer. + Snelkiezer + Snelkiezer bewerken + Klik op een cijfer om er een contact aan te koppelen. Vervolgens kan dit contact direct gebeld worden door in de kiezer lang op het gekoppelde cijfer te drukken. Kies zichtbare velden @@ -180,7 +180,17 @@ Bevat geen advertenties of onnodige machtigingen. Volledig open-source. Kleuren van de app kunnen worden aangepast. - Deze app is onderdeel van een grotere verzameling. Vind de andere apps op https://www.simplemobiletools.com + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools - Nie znaleziono kontaktów. - Nie znaleziono kontaktów z adresami e-mail - Nie znaleziono kontaktów z numerami telefonów - - Nowy kontakt - Edytuj kontakt - Wybierz kontakt - Wybierz kontakty - Pierwsze imię - Drugie imię - Nazwisko - Pseudonim - - - Brak grup - Utwórz nową grupę - Usuń z grupy - Ta grupa jest pusta - Dodaj kontakty - Nie ma grup kontaktów na urządzeniu - Utwórz grupę - Dodaj do grupy - Utwórz grupę na koncie - - - Zrób zdjęcie - Wybierz zdjęcie - Usuń zdjęcie - - - Zacznij nazwę od nazwiska - Pokazuj numery telefonów na ekranie głównym - Pokazuj miniatury kontaktów - Pokazuj przycisk panelu wybierania numeru na ekranie głównym - Przy naciśnięciu kontaktu - Zadzwoń do konataktu - Pokaż szczegóły kontaktu - Zarządzaj pokazywanymi polami kontaktu - Spróbuj odfiltrować zduplikowane kontakty - Zarządzaj pokazywanymi sekcjami - Kontakty - Ulubione - Pokazuj okno potwierdzenia zadzwonienia przed zainicjonowaniem połączenia - Pokazuj wyłącznie kontakty z numerami telefonów - Pokazuj litery na panelu wybierania - - - E-mail - Dom - Praca - Inny - - - Numer - Komórkowy - Główny - Służbowy faks - Domowy faks - Pager - Nie znaleziono numeru telefonu - - - Urodziny - Rocznica - - - Wygląda na to, że nie dodałeś jeszcze żadnego ulubionego kontaktu. - Dodaj ulubione - Dodaj do ulubionych - Usuń z ulubionych - Musisz wejść do ekranu edycji, aby zmodyfikować kontakt - - - Szukaj kontaktów - Szukaj ulubionych - Search groups - - - Importuj kontakty - Eksportuj kontakty - Importuj kontakty z pliku .vcf - Eksportuj kontakty do pliku .vcf - Wybierz miejsce przechowywania kontaktów - Obejmuj kontakty z następujących źródeł: - Nazwa pliku (bez .vcf) - - - Panel wybierania - Dodaj numer do kontaktu - - - Dialer - Dzwonienie - Połączenie przychodzące - Połączenie przychodzące od… - Połączenie wychodzące - Rozłączony - Odrzuć - Odpowiedz - - - Speed dial - Manage speed dial - Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer. - - - Wybierz pola do pokazywania - Prefiks - Sufiks - Numery telefonów - E-maile - Adresy - Wydarzenia (urodziny, rocznice) - Notatki - Organizacja - Strony internetowe - Grupy - Miejsce przechowywania kontaktu - Komunikator - - - Zarządzaj zablokowanymi numerami - Nie blokujesz nikogo. - Dodaj numer do blokowania - Zablokuj numer - Zablokuj numery - Zablokowane numery - - - Are you sure you want to delete %s? - The contact will be removed from all contact sources. - - - - %d contact - %d contacts - - - - %d group - %d groups - - - - Chcę zmienić, które pola są widoczne w kontaktach. Czy mogę to zrobić? - Tak, wszystko, co musisz zrobić, to wejść do Ustawień -> Zarządzaj pokazywanymi polami kontaktu. Możesz tam wybrać, które pola mają być wyświetlane. Niektóre z nich są nawet domyślnie wyłączone, więc możesz znaleźć tam wiele z nich nowych. - - - - Simple Contacts Pro - Manage your contacts easily - - Aplikacja do zarządzania Twoimi kontaktami, bez reklam, szanująca prywatność. - - Prosta aplikacja do tworzenia lub zarządzania Twoimi kontaktami przechowywanymi w różnych miejscach. Kontakty mogą być przechowywane tylko na Twoim urządzeniu, ale również synchronizowane przez konto Google lub inne konta. Możesz wyświetlać Twoje ulubione kontakty na oddzielnej liście. - - Możesz użyć jej także do zarządzania e-mailami użytkowników i wydarzeniami. Jest zdolna do sortowania/filtrowania według wielu parametrów, opcjonalnie do wyświetlania nazwiska jako imienia. - - Nie zawiera reklam oraz niekoniecznych uprawnień. Jest w pełni otwartoźródłowa i w pełni podatna na kolorowanie. - - Ta aplikacja jesst tylko częścią większej serii aplikacji. Możesz znaleźć pozostałe na https://www.simplemobiletools.com - - - - + + Proste Kontakty + Kontakty + Adres + Dodawanie… + Aktualizowanie… + Pamięć telefonu + Pamięć telefonu (niewidoczna dla innych aplikacji) + Firma + Stanowisko + Strona internetowa + Wyślij SMS-a do kontaktów + Wyślij e-maila do kontaktów + Wyślij SMS-a do grupy + Wyślij e-maila do grupy + Zadzwoń do: %s + Wymagaj koniecznych uprawnień + Utwórz nowy kontakt + Dodaj do istniejącego kontaktu + Musisz ustawić tę aplikację jako domyślną aplikację telefoniczną, aby móc korzystać z funkcji blokowania numerów. + Ustaw jako domyślną + + + Nie znaleziono kontaktów. + Nie znaleziono kontaktów z adresami e-mail + Nie znaleziono kontaktów z numerami telefonów + + Nowy kontakt + Edytuj kontakt + Wybierz kontakt + Wybierz kontakty + Pierwsze imię + Drugie imię + Nazwisko + Pseudonim + + + Brak grup + Utwórz nową grupę + Usuń z grupy + Ta grupa jest pusta + Dodaj kontakty + Nie ma grup kontaktów na urządzeniu + Utwórz grupę + Dodaj do grupy + Utwórz grupę na koncie + + + Zrób zdjęcie + Wybierz zdjęcie + Usuń zdjęcie + + + Zacznij nazwę od nazwiska + Pokazuj numery telefonów na ekranie głównym + Pokazuj miniatury kontaktów + Pokazuj przycisk panelu wybierania numeru na ekranie głównym + Przy naciśnięciu kontaktu + Zadzwoń do konataktu + Pokaż szczegóły kontaktu + Zarządzaj pokazywanymi polami kontaktu + Spróbuj odfiltrować zduplikowane kontakty + Zarządzaj pokazywanymi sekcjami + Kontakty + Ulubione + Pokazuj okno potwierdzenia zadzwonienia przed zainicjonowaniem połączenia + Pokazuj wyłącznie kontakty z numerami telefonów + Pokazuj litery na panelu wybierania + + + E-mail + Dom + Praca + Inny + + + Numer + Komórkowy + Główny + Służbowy faks + Domowy faks + Pager + Nie znaleziono numeru telefonu + + + Urodziny + Rocznica + + + Wygląda na to, że nie dodałeś jeszcze żadnego ulubionego kontaktu. + Dodaj ulubione + Dodaj do ulubionych + Usuń z ulubionych + Musisz wejść do ekranu edycji, aby zmodyfikować kontakt + + + Szukaj kontaktów + Szukaj ulubionych + Search groups + + + Importuj kontakty + Eksportuj kontakty + Importuj kontakty z pliku .vcf + Eksportuj kontakty do pliku .vcf + Wybierz miejsce przechowywania kontaktów + Obejmuj kontakty z następujących źródeł: + Nazwa pliku (bez .vcf) + + + Panel wybierania + Dodaj numer do kontaktu + + + Dialer + Dzwonienie + Połączenie przychodzące + Połączenie przychodzące od… + Połączenie wychodzące + Rozłączony + Odrzuć + Odpowiedz + + + Speed dial + Manage speed dial + Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer. + + + Wybierz pola do pokazywania + Prefiks + Sufiks + Numery telefonów + E-maile + Adresy + Wydarzenia (urodziny, rocznice) + Notatki + Organizacja + Strony internetowe + Grupy + Miejsce przechowywania kontaktu + Komunikator + + + Zarządzaj zablokowanymi numerami + Nie blokujesz nikogo. + Dodaj numer do blokowania + Zablokuj numer + Zablokuj numery + Zablokowane numery + + + Are you sure you want to delete %s? + The contact will be removed from all contact sources. + + + + %d contact + %d contacts + + + + %d group + %d groups + + + + Chcę zmienić, które pola są widoczne w kontaktach. Czy mogę to zrobić? + Tak, wszystko, co musisz zrobić, to wejść do Ustawień -> Zarządzaj pokazywanymi polami kontaktu. Możesz tam wybrać, które pola mają być wyświetlane. Niektóre z nich są nawet domyślnie wyłączone, więc możesz znaleźć tam wiele z nich nowych. + + + + Simple Contacts Pro - Manage your contacts easily + + Aplikacja do zarządzania Twoimi kontaktami, bez reklam, szanująca prywatność. + + Prosta aplikacja do tworzenia lub zarządzania Twoimi kontaktami przechowywanymi w różnych miejscach. Kontakty mogą być przechowywane tylko na Twoim urządzeniu, ale również synchronizowane przez konto Google lub inne konta. Możesz wyświetlać Twoje ulubione kontakty na oddzielnej liście. + + Możesz użyć jej także do zarządzania e-mailami użytkowników i wydarzeniami. Jest zdolna do sortowania/filtrowania według wielu parametrów, opcjonalnie do wyświetlania nazwiska jako imienia. + + Nie zawiera reklam oraz niekoniecznych uprawnień. Jest w pełni otwartoźródłowa i w pełni podatna na kolorowanie. + + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + + + + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 1b10f565..1211e84f 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -180,7 +180,17 @@ Não contém anúncios e permissões desnecessárias. É totalmente open source e permite a personalização das cores. - Este aplicativo é apenas uma parte de um enorme conjunto de aplicativos. Você poderá encontrar todos os outros em https://www.simplemobiletools.com + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools - Speed dial - Manage speed dial - Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer. + Ligação rápida + Gerir ligações rápidas + Clique no número para atribuir um contacto a uma ligação rápida. Posteriormente, poderá ligar diretamente ao contacto através da tecla de ligação rápida. Selecione os campos a mostrar @@ -180,7 +180,17 @@ Não contém anúncios ou permissões desnecessárias. É totalmente open source e permite personalização de cores. - Esta aplicação é apenas parte de um conjunto mais vasto de aplicações. Saiba mais em https://www.simplemobiletools.com + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools Çevirici - Çağırı yapılıyor + Çağrı yapılıyor Gelen çağrı Gelen çağrı şundan… Devam eden çağrı @@ -122,9 +122,9 @@ Cevapla - Speed dial - Manage speed dial - Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer. + Hızlı arama + Hızlı aramayı yönet + Bir kişiyi bir numaraya atamak için numaraya tıklayın. Daha sonra atanan kişiyi çeviricide atanan numaraya uzun basarak hızlıca arayabilirsiniz. Görüntülenecek alanları seç @@ -170,9 +170,9 @@ - Simple Contacts Pro - Manage your contacts easily + Basit Kişiler Pro - Kişilerinizi kolayca yönetin - An app for managing your contacts without ads, respecting your privacy. + Reklamsız, gizliliğinize saygı duyan, kişilerinizi yönetmek için bir uygulama. Kişilerinizi herhangi bir kaynaktan oluşturmak veya yönetmek için basit bir uygulama. Kişiler yalnızca cihazınızda saklanabilir, aynı zamanda Google veya diğer hesaplarla senkronize edilebilir. Favori kişilerinizi ayrı bir listede görüntüleyebilirsiniz. @@ -180,7 +180,17 @@ Reklam veya gereksiz izinler içermez. Tamamen açık kaynaktır, özelleştirilebilir renkler sağlar. - Bu uygulama, daha büyük bir uygulama serisinden sadece bir parça. Geri kalanı https://www.simplemobiletools.com adresinde bulabilirsiniz + Basit Araçlar paketinin tamamını buradan inceleyin: + https://www.simplemobiletools.com + + Basit Kişiler Pro'nun bağımsız web sitesi: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools - Speed dial - Manage speed dial - Click on a number to assign a contact to it. You can then quickly call the given contact by long pressing the given number at the dialer. + 快速撥號 + 管理快速撥號 + 點擊一個數字以分配一個聯絡人給它。然後你可以在撥號器上,長按指定的數字來快速撥號給指定的聯絡人。 選擇要顯示的欄位 @@ -180,7 +180,17 @@ 不包含廣告及非必要的權限,而且完全開放原始碼,並提供自訂顏色。 - 這程式只是一系列眾多應用程式的其中一項,你可以在這發現更多 https://www.simplemobiletools.com + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools + Added an initial implementation of Speed Dial, contacts can be set in the app settings Removed the setting for merging duplicate contacts, merge them always Removed the Recents tab due to Googles\' latest security policies being stricter than initiall thought\n diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml index 11ccda4a..63814b98 100644 --- a/app/src/main/res/values/integers.xml +++ b/app/src/main/res/values/integers.xml @@ -1,3 +1,4 @@ 128 + 2 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa4ce21e..12fe0982 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,7 +180,17 @@ Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors. - This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com + Check out the full suite of Simple Tools here: + https://www.simplemobiletools.com + + Standalone website of Simple Contacts Pro: + https://www.simplemobiletools.com/contacts + + Facebook: + https://www.facebook.com/simplemobiletools + + Reddit: + https://www.reddit.com/r/SimpleMobileTools