diff --git a/CHANGELOG.md b/CHANGELOG.md index e6beac38..ae86dd8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Changelog ========== +Version 4.5.0 *(2018-09-28)* +---------------------------- + + * Added a simple dialpad + * Do not allow creating contacts under Signal or Telegram contact source + * Allow copying phone numbers into clipboard by long pressing them on the View screen + * Properly handle intents adding numbers to existing contacts + * Many other smaller improvements and bugfixes + Version 4.4.0 *(2018-09-04)* ---------------------------- diff --git a/app/build.gradle b/app/build.gradle index 3896c72e..63ebf515 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,14 +4,14 @@ apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 - buildToolsVersion "28.0.2" + buildToolsVersion "28.0.3" defaultConfig { applicationId "com.simplemobiletools.contacts" minSdkVersion 16 targetSdkVersion 28 - versionCode 31 - versionName "4.4.0" + versionCode 32 + versionName "4.5.0" setProperty("archivesBaseName", "contacts") } @@ -41,7 +41,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:4.7.3' + implementation 'com.simplemobiletools:commons:4.8.0' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 133f9d70..998d518a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -118,15 +118,6 @@ android:name=".activities.EditContactActivity" android:parentActivityName=".activities.MainActivity"> - - - - - - - - - @@ -163,6 +154,20 @@ + + + + + + + + + + + + + + () + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_dialpad) + + dialpad_0_holder.setOnClickListener { dialpadPressed("0", it) } + dialpad_1.setOnClickListener { dialpadPressed("1", it) } + dialpad_2.setOnClickListener { dialpadPressed("2", it) } + dialpad_3.setOnClickListener { dialpadPressed("3", it) } + dialpad_4.setOnClickListener { dialpadPressed("4", it) } + dialpad_5.setOnClickListener { dialpadPressed("5", it) } + dialpad_6.setOnClickListener { dialpadPressed("6", it) } + dialpad_7.setOnClickListener { dialpadPressed("7", it) } + dialpad_8.setOnClickListener { dialpadPressed("8", it) } + dialpad_9.setOnClickListener { dialpadPressed("9", it) } + dialpad_0_holder.setOnLongClickListener { dialpadPressed("+", null); true } + dialpad_asterisk.setOnClickListener { dialpadPressed("*", it) } + dialpad_hashtag.setOnClickListener { dialpadPressed("#", it) } + dialpad_clear_char.setOnClickListener { clearChar(it) } + dialpad_clear_char.setOnLongClickListener { clearInput(); true } + dialpad_call_button.setOnClickListener { initCall() } + dialpad_input.afterTextChanged { dialpadValueChanged(it) } + ContactsHelper(this).getContacts { gotContacts(it) } + disableKeyboardPopping() + + val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_big, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + dialpad_call_button.setImageDrawable(callIcon) + dialpad_call_button.background.applyColorFilter(getAdjustedPrimaryColor()) + } + + override fun onResume() { + super.onResume() + updateTextColors(dialpad_holder) + dialpad_clear_char.applyColorFilter(config.textColor) + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_dialpad, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.add_number_to_contact -> addNumberToContact() + else -> return super.onOptionsItemSelected(item) + } + return true + } + + private fun addNumberToContact() { + Intent().apply { + action = Intent.ACTION_INSERT_OR_EDIT + type = "vnd.android.cursor.item/contact" + putExtra(KEY_PHONE, dialpad_input.value) + if (resolveActivity(packageManager) != null) { + startActivity(this) + } else { + toast(R.string.no_app_found) + } + } + } + + private fun dialpadPressed(char: String, view: View?) { + dialpad_input.dispatchKeyEvent(getKeyEvent(getCharKeyCode(char))) + view?.performHapticFeedback() + } + + private fun clearChar(view: View) { + dialpad_input.dispatchKeyEvent(getKeyEvent(KeyEvent.KEYCODE_DEL)) + view.performHapticFeedback() + } + + private fun clearInput() { + dialpad_input.setText("") + } + + private fun getKeyEvent(keyCode: Int) = KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0) + + private fun getCharKeyCode(char: String) = when (char) { + "0" -> KeyEvent.KEYCODE_0 + "1" -> KeyEvent.KEYCODE_1 + "2" -> KeyEvent.KEYCODE_2 + "3" -> KeyEvent.KEYCODE_3 + "4" -> KeyEvent.KEYCODE_4 + "5" -> KeyEvent.KEYCODE_5 + "6" -> KeyEvent.KEYCODE_6 + "7" -> KeyEvent.KEYCODE_7 + "8" -> KeyEvent.KEYCODE_8 + "9" -> KeyEvent.KEYCODE_9 + "*" -> KeyEvent.KEYCODE_STAR + "+" -> KeyEvent.KEYCODE_PLUS + else -> KeyEvent.KEYCODE_POUND + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private fun disableKeyboardPopping() { + if (isLollipopPlus()) { + dialpad_input.showSoftInputOnFocus = false + } else { + dialpad_input.inputType = InputType.TYPE_NULL + } + } + + private fun gotContacts(newContacts: ArrayList) { + contacts = newContacts + Contact.sorting = config.sorting + Contact.startWithSurname = config.startNameWithSurname + contacts.sort() + } + + private fun dialpadValueChanged(text: String) { + (dialpad_list.adapter as? ContactsAdapter)?.finishActMode() + val filtered = contacts.filter { it.doesContainPhoneNumber(text) } as ArrayList + + ContactsAdapter(this, filtered, null, LOCATION_DIALPAD, null, dialpad_list, dialpad_fastscroller, text) { + callContact(it as Contact) + }.apply { + addVerticalDividers(true) + dialpad_list.adapter = this + } + + dialpad_fastscroller.setScrollToY(0) + dialpad_fastscroller.setViews(dialpad_list) { + val item = (dialpad_list.adapter as ContactsAdapter).contactItems.getOrNull(it) + dialpad_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } + } + + private fun initCall() { + val number = dialpad_input.value + if (number.isNotEmpty()) { + if (config.showCallConfirmation) { + CallConfirmationDialog(this, number) { + startCallIntent(number) + } + } else { + startCallIntent(number) + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index dcd70766..385f155a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.activities +import android.app.Activity import android.app.DatePickerDialog import android.content.ClipData import android.content.ContentValues @@ -13,6 +14,7 @@ import android.view.Menu import android.view.MenuItem import android.view.ViewGroup import android.view.WindowManager +import android.widget.EditText import android.widget.ImageView import android.widget.TextView import com.simplemobiletools.commons.dialogs.RadioGroupDialog @@ -50,6 +52,8 @@ class EditContactActivity : ContactActivity() { private var lastPhotoIntentUri: Uri? = null private var isSaving = false private var isThirdPartyIntent = false + private var highlightLastPhoneNumber = false + private var numberViewToColor: EditText? = null private var originalContactSource = "" override fun onCreate(savedInstanceState: Bundle?) { @@ -58,7 +62,7 @@ class EditContactActivity : ContactActivity() { supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_cross) val action = intent.action - isThirdPartyIntent = action == Intent.ACTION_EDIT || action == Intent.ACTION_INSERT_OR_EDIT || action == Intent.ACTION_INSERT + isThirdPartyIntent = action == Intent.ACTION_EDIT || action == Intent.ACTION_INSERT || action == ADD_NEW_CONTACT_NUMBER val isFromSimpleContacts = intent.getBooleanExtra(IS_FROM_SIMPLE_CONTACTS, false) if (isThirdPartyIntent && !isFromSimpleContacts) { handlePermission(PERMISSION_READ_CONTACTS) { @@ -119,7 +123,7 @@ class EditContactActivity : ContactActivity() { private fun initContact() { var contactId = intent.getIntExtra(CONTACT_ID, 0) val action = intent.action - if (contactId == 0 && action == Intent.ACTION_EDIT) { + if (contactId == 0 && (action == Intent.ACTION_EDIT || action == ADD_NEW_CONTACT_NUMBER)) { val data = intent.data if (data != null) { val rawId = if (data.path.contains("lookup")) { @@ -149,11 +153,20 @@ class EditContactActivity : ContactActivity() { setupEditContact() } - if (contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && (action == Intent.ACTION_INSERT_OR_EDIT || action == Intent.ACTION_INSERT)) { - val phoneNumber = intent.extras.get(KEY_PHONE)?.toString() ?: "" - contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) + if ((contact!!.id == 0 && intent.extras != null && intent.extras.containsKey(KEY_PHONE) && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { + val phone = intent.extras.get(KEY_PHONE) + if (phone != null) { + val phoneNumber = phone.toString() + contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) + if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { + highlightLastPhoneNumber = true + } + } - contact!!.firstName = intent.extras.get(KEY_NAME)?.toString() ?: "" + val firstName = intent.extras.get(KEY_NAME) + if (firstName != null) { + contact!!.firstName = firstName.toString() + } val data = intent.extras.getParcelableArrayList("data") if (data != null) { @@ -230,6 +243,7 @@ class EditContactActivity : ContactActivity() { } updateTextColors(contact_scrollview) + numberViewToColor?.setTextColor(getAdjustedPrimaryColor()) wasActivityInitialized = true invalidateOptionsMenu() } @@ -373,6 +387,9 @@ class EditContactActivity : ContactActivity() { numberHolder!!.apply { contact_number.setText(number.value) setupPhoneNumberTypePicker(contact_number_type, number.type, number.label) + if (highlightLastPhoneNumber && index == contact!!.phoneNumbers.size - 1) { + numberViewToColor = contact_number + } } } } @@ -938,6 +955,7 @@ class EditContactActivity : ContactActivity() { contact!!.source = originalContactSource ContactsHelper(this).deleteContact(contact!!) } + setResult(Activity.RESULT_OK) finish() } else { toast(R.string.unknown_error_occurred) @@ -947,6 +965,7 @@ class EditContactActivity : ContactActivity() { private fun updateContact(photoUpdateStatus: Int) { isSaving = true if (ContactsHelper(this@EditContactActivity).updateContact(contact!!, photoUpdateStatus)) { + setResult(Activity.RESULT_OK) finish() } else { toast(R.string.unknown_error_occurred) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt new file mode 100644 index 00000000..16430225 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt @@ -0,0 +1,90 @@ +package com.simplemobiletools.contacts.activities + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.provider.ContactsContract +import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor +import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor +import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.updateTextColors +import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS +import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.adapters.ContactsAdapter +import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.extensions.getContactPublicUri +import com.simplemobiletools.contacts.helpers.ADD_NEW_CONTACT_NUMBER +import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.KEY_PHONE +import com.simplemobiletools.contacts.helpers.LOCATION_INSERT_OR_EDIT +import com.simplemobiletools.contacts.models.Contact +import kotlinx.android.synthetic.main.activity_insert_edit_contact.* + +class InsertOrEditContactActivity : SimpleActivity() { + private val START_INSERT_ACTIVITY = 1 + private val START_EDIT_ACTIVITY = 2 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_insert_edit_contact) + title = getString(R.string.select_contact) + setupViews() + + handlePermission(PERMISSION_READ_CONTACTS) { + // we do not really care about the permission request result. Even if it was denied, load private contacts + ContactsHelper(this).getContacts { + gotContacts(it) + } + } + } + + private fun setupViews() { + updateTextColors(insert_edit_contact_holder) + new_contact_tmb.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_new_contact, config.textColor)) + new_contact_holder.setOnClickListener { + Intent().apply { + action = Intent.ACTION_INSERT + data = ContactsContract.Contacts.CONTENT_URI + putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) + if (resolveActivity(packageManager) != null) { + startActivityForResult(this, START_INSERT_ACTIVITY) + } else { + toast(R.string.no_app_found) + } + } + } + + existing_contact_label.setTextColor(getAdjustedPrimaryColor()) + } + + private fun gotContacts(contacts: ArrayList) { + Contact.sorting = config.sorting + Contact.startWithSurname = config.startNameWithSurname + contacts.sort() + + ContactsAdapter(this, contacts, null, LOCATION_INSERT_OR_EDIT, null, existing_contact_list, existing_contact_fastscroller) { + Intent(applicationContext, EditContactActivity::class.java).apply { + data = getContactPublicUri(it as Contact) + action = ADD_NEW_CONTACT_NUMBER + putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) + startActivityForResult(this, START_EDIT_ACTIVITY) + } + }.apply { + addVerticalDividers(true) + existing_contact_list.adapter = this + } + + existing_contact_fastscroller.setScrollToY(0) + existing_contact_fastscroller.setViews(existing_contact_list) { + val item = (existing_contact_list.adapter as ContactsAdapter).contactItems.getOrNull(it) + existing_contact_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (resultCode == Activity.RESULT_OK) { + finish() + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 31f4ed0f..0cb2281b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.contacts.activities import android.app.SearchManager import android.content.Context import android.content.Intent +import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.net.Uri @@ -163,6 +164,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } } isFirstResume = false + + val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + main_dialpad_button.setImageDrawable(dialpadIcon) + main_dialpad_button.background.applyColorFilter(getAdjustedPrimaryColor()) } override fun onPause() { @@ -369,6 +374,11 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } main_tabs_holder.beVisibleIf(skippedTabs < 3) + + main_dialpad_button.setOnClickListener { + val intent = Intent(applicationContext, DialpadActivity::class.java) + startActivity(intent) + } } private fun getTabIcon(position: Int): Drawable { @@ -540,6 +550,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { add(Release(27, R.string.release_27)) add(Release(29, R.string.release_29)) add(Release(31, R.string.release_31)) + add(Release(32, R.string.release_32)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index 886d86c5..a7995535 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -235,6 +235,12 @@ class ViewContactActivity : ContactActivity() { startCallIntent(phoneNumber.value) } } + + setOnLongClickListener { + copyToClipboard(phoneNumber.value) + toast(R.string.value_copied_to_clipboard) + true + } } } contact_numbers_image.beVisible() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 39bd3220..4372437e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -29,12 +29,12 @@ 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, itemClick: (Any) -> Unit) : + fastScroller: FastScroller, highlightText: String = "", itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private lateinit var contactDrawable: Drawable private var config = activity.config - private var textToHighlight = "" + private var textToHighlight = highlightText var adjustedPrimaryColor = activity.getAdjustedPrimaryColor() var startNameWithSurname: Boolean @@ -63,6 +63,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList + val allowLongClick = location != LOCATION_INSERT_OR_EDIT + val view = holder.bindView(contact, true, allowLongClick) { itemView, layoutPosition -> setupView(itemView, contact) } bindViewHolder(holder, position, view) @@ -260,7 +263,13 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Unit) { ContactsHelper(this).getContactSources { + val ignoredTypes = arrayListOf( + "org.thoughtcrime.securesms", // Signal + "org.telegram.messenger" // Telegram + ) + val items = ArrayList() - val sources = it.map { it.name } + val sources = it.filter { !ignoredTypes.contains(it.type) }.map { it.name } var currentSourceIndex = -1 sources.forEachIndexed { index, account -> var publicAccount = account @@ -203,14 +208,16 @@ fun Activity.getVisibleContactSources(): ArrayList { fun SimpleActivity.contactClicked(contact: Contact) { when (config.onContactClick) { - ON_CLICK_CALL_CONTACT -> { - if (contact.phoneNumbers.isNotEmpty()) { - tryStartCall(contact) - } else { - toast(R.string.no_phone_number_found) - } - } + ON_CLICK_CALL_CONTACT -> callContact(contact) ON_CLICK_VIEW_CONTACT -> viewContact(contact) ON_CLICK_EDIT_CONTACT -> editContact(contact) } } + +fun SimpleActivity.callContact(contact: Contact) { + if (contact.phoneNumbers.isNotEmpty()) { + tryStartCall(contact) + } else { + toast(R.string.no_phone_number_found) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/EditText.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/EditText.kt new file mode 100644 index 00000000..65f826c2 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/EditText.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.contacts.extensions + +import android.text.Editable +import android.text.TextWatcher +import android.widget.EditText + +fun EditText.afterTextChanged(callback: (String) -> Unit) = addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} + + override fun afterTextChanged(text: Editable) = callback(text.toString()) +}) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt index 6134b1ad..f6d41a2b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.contacts.extensions import android.widget.TextView import com.simplemobiletools.commons.helpers.getDateFormats +import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import java.text.DateFormat @@ -32,3 +33,5 @@ fun String.getDateTimeFromDateString(viewToUpdate: TextView? = null): DateTime { } return date } + +fun String.applyRegexFiltering() = replace(PHONE_NUMBER_PATTERN.toRegex(), "") diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index 0419aa25..208c7715 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -241,7 +241,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) val filtered = contactsIgnoringSearch.filter { getProperText(it.getFullName(), shouldNormalize).contains(text, true) || getProperText(it.nickname, shouldNormalize).contains(text, true) || - it.phoneNumbers.any { it.value.contains(text, true) } || + it.doesContainPhoneNumber(text) || it.emails.any { it.value.contains(text, true) } || it.addresses.any { getProperText(it.value, shouldNormalize).contains(text, true) } || it.IMs.any { it.value.contains(text, true) } || diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt index c1319997..d4b30ab9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt @@ -10,10 +10,10 @@ import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG import com.simplemobiletools.contacts.activities.EditContactActivity import com.simplemobiletools.contacts.adapters.RecentCallsAdapter +import com.simplemobiletools.contacts.extensions.applyRegexFiltering import com.simplemobiletools.contacts.extensions.contactClicked import com.simplemobiletools.contacts.helpers.IS_FROM_SIMPLE_CONTACTS import com.simplemobiletools.contacts.helpers.KEY_PHONE -import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN import com.simplemobiletools.contacts.helpers.RECENTS_TAB_MASK import com.simplemobiletools.contacts.models.Contact import com.simplemobiletools.contacts.models.RecentCall @@ -44,10 +44,10 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage val currAdapter = fragment_list.adapter if (currAdapter == null) { RecentCallsAdapter(activity!!, recentCalls, activity, fragment_list, fragment_fastscroller) { - val recentCall = (it as RecentCall).number.replace(PHONE_NUMBER_PATTERN.toRegex(), "") + val recentCall = (it as RecentCall).number.applyRegexFiltering() var selectedContact: Contact? = null for (contact in allContacts) { - if (contact.phoneNumbers.any { it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), "") == recentCall }) { + if (contact.phoneNumbers.any { it.value.applyRegexFiltering() == recentCall }) { selectedContact = contact break } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 34cf1ca8..58309511 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -21,8 +21,9 @@ const val SMT_PRIVATE = "smt_private" // used at the contact source of local c const val IS_PRIVATE = "is_private" const val GROUP = "group" const val FIRST_GROUP_ID = 10000 -const val PHONE_NUMBER_PATTERN = "\\D+" +const val PHONE_NUMBER_PATTERN = "[^0-9#*+]" const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" +const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" // extras used at third party intents const val KEY_PHONE = "phone" @@ -33,6 +34,8 @@ const val LOCATION_FAVORITES_TAB = 1 const val LOCATION_RECENTS_TAB = 2 const val LOCATION_GROUPS_TAB = 3 const val LOCATION_GROUP_CONTACTS = 4 +const val LOCATION_DIALPAD = 5 +const val LOCATION_INSERT_OR_EDIT = 6 const val CONTACTS_TAB_MASK = 1 const val FAVORITES_TAB_MASK = 2 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 090c2a07..88e3b7d7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -166,7 +166,7 @@ class ContactsHelper(val activity: Activity) { if (filterDuplicates) { // remove all spaces, dashes etc from numbers for easier comparing, used only at list views numbers.forEach { - numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 508a4c80..b73283c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.commons.extensions.getBlobValue import com.simplemobiletools.commons.extensions.getIntValue import com.simplemobiletools.commons.extensions.getLongValue import com.simplemobiletools.commons.extensions.getStringValue +import com.simplemobiletools.contacts.extensions.applyRegexFiltering import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.getByteArray import com.simplemobiletools.contacts.extensions.getPhotoThumbnailSize @@ -349,7 +350,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val cleanPhoneNumbers = ArrayList() if (filterDuplicates) { - phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } } val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses, diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index f186505b..9cc27af8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -138,6 +138,11 @@ class VcfImporter(val activity: SimpleActivity) { val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events, targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) + // if there is no N and ORG fields at the given contact, only FN, treat it as an organization + if (contact.getFullName().isEmpty() && contact.organization.isEmpty() && ezContact.formattedName.value.isNotEmpty()) { + contact.organization.company = ezContact.formattedName.value + } + if (ContactsHelper(activity).insertContact(contact)) { contactsImported++ } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt index de579144..c710d572 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt @@ -5,6 +5,7 @@ import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_DESCENDING +import com.simplemobiletools.contacts.extensions.applyRegexFiltering data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, @@ -104,4 +105,22 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m } fun getHashToCompare() = getStringToCompare().hashCode() + + // do a more advanced phone number check here, compare numbers and and search query with dashes, spaces and everything but numbers removed + fun doesContainPhoneNumber(text: String): Boolean { + if (text.isNotEmpty()) { + if (phoneNumbers.any { it.value.contains(text) } || cleanPhoneNumbers.any { it.value.contains(text) }) { + return true + } + } + + val filteredNumber = text.applyRegexFiltering() + if (filteredNumber.isNotEmpty()) { + if (phoneNumbers.any { it.value.contains(filteredNumber) } || cleanPhoneNumbers.any { it.value.contains(filteredNumber) }) { + return true + } + } + + return false + } } diff --git a/app/src/main/res/drawable-hdpi/ic_clear_char.png b/app/src/main/res/drawable-hdpi/ic_clear_char.png new file mode 100644 index 00000000..3fd9c535 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_clear_char.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_dialpad.png b/app/src/main/res/drawable-hdpi/ic_dialpad.png new file mode 100644 index 00000000..f600b5b7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_dialpad.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_new_contact.png b/app/src/main/res/drawable-hdpi/ic_new_contact.png new file mode 100644 index 00000000..ded0ae92 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_new_contact.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_clear_char.png b/app/src/main/res/drawable-xhdpi/ic_clear_char.png new file mode 100644 index 00000000..b51790d1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_clear_char.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_dialpad.png b/app/src/main/res/drawable-xhdpi/ic_dialpad.png new file mode 100644 index 00000000..793da560 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_dialpad.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_new_contact.png b/app/src/main/res/drawable-xhdpi/ic_new_contact.png new file mode 100644 index 00000000..5637f091 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_new_contact.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_clear_char.png b/app/src/main/res/drawable-xxhdpi/ic_clear_char.png new file mode 100644 index 00000000..e049a108 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_clear_char.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_dialpad.png b/app/src/main/res/drawable-xxhdpi/ic_dialpad.png new file mode 100644 index 00000000..1f6bf856 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_dialpad.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_new_contact.png b/app/src/main/res/drawable-xxhdpi/ic_new_contact.png new file mode 100644 index 00000000..d33121aa Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_new_contact.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_clear_char.png b/app/src/main/res/drawable-xxxhdpi/ic_clear_char.png new file mode 100644 index 00000000..ea552fd3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_clear_char.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_dialpad.png b/app/src/main/res/drawable-xxxhdpi/ic_dialpad.png new file mode 100644 index 00000000..7754a7c9 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_dialpad.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_new_contact.png b/app/src/main/res/drawable-xxxhdpi/ic_new_contact.png new file mode 100644 index 00000000..07435b94 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_new_contact.png differ diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml new file mode 100644 index 00000000..6378918f --- /dev/null +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_insert_edit_contact.xml b/app/src/main/res/layout/activity_insert_edit_contact.xml new file mode 100644 index 00000000..50edfe57 --- /dev/null +++ b/app/src/main/res/layout/activity_insert_edit_contact.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 1c26ff25..f3b5d8e9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -22,4 +22,16 @@ android:layout_height="match_parent" android:layout_below="@+id/main_tabs_holder"/> + + 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 e08b13ee..4ecf2645 100644 --- a/app/src/main/res/layout/item_contact_with_number.xml +++ b/app/src/main/res/layout/item_contact_with_number.xml @@ -13,13 +13,14 @@ @@ -31,15 +32,15 @@ android:layout_toRightOf="@+id/contact_tmb" android:ellipsize="end" android:maxLines="1" - android:textSize="@dimen/bigger_text_size" + android:textSize="@dimen/big_text_size" tools:text="John Doe"/> + + + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 961704de..8f2f3892 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -15,6 +15,8 @@ Grupa e-poçt göndər %s şəxsinə zng et Lazım olan icazələri istə + Create new contact + Add to an existing contact Yeni kontakt Redaktə et @@ -95,6 +97,10 @@ Kontakt köklərini daxil et Fayl adı (.vcf olmadan) + + Dialpad + Add number to contact + Göstərmək üçün sahəni seç Ön şəkilçi diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 849c7b58..ec3adbe4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -15,6 +15,8 @@ Sende E-Mail an Gruppe %s anrufen Benötigte Berechtigungen anfordern + Create new contact + Add to an existing contact Neuer Kontakt Kontakt bearbeiten @@ -95,6 +97,10 @@ Kontaktquellen einschließen Dateiname (ohne .vcf) + + Dialpad + Add number to contact + Sichtbare Felder auswählen Titel diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6b962c3a..b548d329 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -15,6 +15,8 @@ Αποστολή email σε ομάδες Κλήση %s Ζητούνται τα απαιτούμενα δικαιώματα + Create new contact + Add to an existing contact Νέα επαφή Επεξεργασία επαφής @@ -95,6 +97,10 @@ Συμπερίληψη πηγών επαφών Όνομα αρχείου (χωρίς .vcf) + + Dialpad + Add number to contact + Επιλογή εμφάνισης πεδίων Πρόθεμα diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 91dfd482..80cd0a79 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -123,7 +123,15 @@ Une appli de contacts pour gérer vos contacts sans pubs. - Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com + + Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. + + Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. + + Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. + + Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com + + Dialpad + Add number to contact + Odaberi polja za prikaz Prefiks diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml new file mode 100644 index 00000000..517038be --- /dev/null +++ b/app/src/main/res/values-it/strings.xml @@ -0,0 +1,140 @@ + + Simple Contacts + Contatti + Indirizzo + Inserimento in corso… + Aggiornamento in corso… + Memoria del telefono + Memoria del telfono (non visibile alle altre applicazioni) + Compagnia + Posizione lavorativa + Sito web + Invia un SMS ai contatti + Invia un\'email ai contatti + Invia un SMS al gruppo + Invia un\'email al gruppo + Chiama %s + Richiedi le permissioni necessarie + Crea un nuovo contatto + Aggiungi ad un contatto esistente + + Nuovo contatto + Modifica contatto + Seleziona contatto + Seleziona contatti + Nome + Secondo nome + Cognome + Soprannome + + + Nessun gruppo + Crea un nuovo gruppo + Rimuovi dal gruppo + Questo gruppo è vuoto + Aggiungi contatti + Non ci sono gruppi con contatti nel dispositivo + Crea gruppo + Aggiungi al gruppo + Crea un gruppo con un account + + + Scatta un foto + Scegli una foto + Rimuovi foto + + + Prima il nome poi il cognome + Mostra i numeri di telefono nella schermata principale + Mostra le anteprime dei contatti + Al click sul contatto + Chiama contatto + Visualizza i dettagli del contatto + Gestisci i campi mostrati + Prova a filetrare i contatti duplicati + Gestisci le schede mostrate + Contatti + Preferiti + Chiamate recenti + Mostra un dialogo di conferma prima di iniziare una chiamata + + + Email + Casa + Lavoro + Altro + + + Numero + Cellulare + Principale + Fax di lavoro + Fax di casa + Cercapersone + Non è stato trovato alcun numero di telefono + + + Compleanno + Anniversario + + + Sembra che ancora non si ha nessun contatto preferito. + Aggiungi preferito + Aggiungi ai preferiti + Rimuovi dai preferiti + Devi stare nella schermata di modifica per modificare un contatto + + + Cerca contatti + Cerca preferiti + + + Importa contatti + Esporta contatti + Importa contatti da un file .vcf + Esporta contatti in un file .vcf + Individua la provenienza del contatto + Includi la provenienza del contatto + Nome del file (senza .vcf) + + + Tastiera + Aggiungi numero ai contatti + + + Seleziona i campi da mostrare + Prefisso + Suffisso + Numeri di telefono + Email + Indirizzi + Eventi (compleanni, anniversari) + Note + Organizazione + Siti web + Gruppi + Provenienza del contatto + Messaggistica istantanea (IM) + + + Voglio cambiare i campi visibili ai contatti. Come posso fare? + Puoi farlo andando in Impostazioni -> Gestisci i campi mostrati. Qui puoi selezionare i campi che saranno visibili. Alcuni sono anche disabilitati in maniera predefinita, quindi potresti trovare qualche nuovo campo. + + + + Un\'applicazioni contatti per gestire i propri contatti senza pubblicità. + + Una semplice applicazione per creare o gestire i propri contatti da qualsiasi provenienza. I contatti saranno salvati solamente nel dispositivo, ma possono essere sincronizzati con Google, o con altri servizi. Si possono visualizzare i contatti preferiti in una list separata. + + Si può utilizzare l\'applicazione anche per gestire le email e gli eventi. Può ordinare e filtrare per parametri multipli, ed opzionalmente visualizzare il cognome come nome + + Non contiene pubblicità nè chiede permessi non necessari. È completamente open source ed offre colori personalizzabili. + + Quest\'app fa parte di una serie più grande. Puoi trovare le altre su https://www.simplemobiletools.com + + + + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2eec9101..6e65f80f 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -15,6 +15,8 @@ グループにメールを送信 Call %s Request the required permissions + 新しい連絡先を作成 + 既存の連絡先に追加 新しい連絡先 連絡先を編集 @@ -95,6 +97,10 @@ Include contact sources ファイル名 (.vcfを含めない) + + ダイヤルパッド + 連絡先に番号を追加 + 表示する項目を選択 敬称(名前の前) diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index f6fdee3a..4c7bbb68 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -15,6 +15,8 @@ Send email to group Call %s Request the required permissions + Create new contact + Add to an existing contact 새로운 연락처 연락처 수정 @@ -95,6 +97,10 @@ 가져오기 대상 파일이름 (.vcf 확장자 생략) + + Dialpad + Add number to contact + Select fields to show Prefix diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 7d211427..e99c1beb 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -15,6 +15,8 @@ Send email to group Call %s Request the required permissions + Create new contact + Add to an existing contact Naujas kontaktas Redaguoti kontaktą @@ -95,6 +97,10 @@ Įtraukti kontaktų šaltinius Bylos vardas (be .vcf) + + Dialpad + Add number to contact + Pasirinkti rodomus laukelius Priešdėlis diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b1a2e6c0..de97bde8 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -15,6 +15,8 @@ Enviar e-mail para o grupo Ligar a %s Pedir a permissão necessária + Create new contact + Add to an existing contact Novo contacto Editar contacto @@ -95,6 +97,10 @@ Incluir fontes dos contactos Nome do ficheiro (sem .vcf) + + Dialpad + Add number to contact + Selecione os campos a mostrar Prefixo diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e26bfa89..98b0eebb 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -15,6 +15,8 @@ Отправить письмо группе Вызов %s Запрос необходимых разрешений + Создать новый контакт + Добавить к существующему контакту Новый контакт Редактировать контакт @@ -34,7 +36,7 @@ На устройстве нет групп контактов Создать группу Добавить в группу - Создать группу под учётной записью + Создать группу в учётной записи Снять фото @@ -89,12 +91,16 @@ Импортировать контакты Экспортировать контакты - Импортировать контакты из vcf-файла - Экспортировать контакты в vcf-файл + Импортировать из vcf-файла + Экспортировать в vcf-файл Назначенный к обновлению источник контактов Включить источники контактов Имя файла (без .vcf) + + Набор номера + Добавить номер к контакту + Выберите отображаемые поля Префикс diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d4a23b33..ac542986 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -15,6 +15,8 @@ Poslať skupine email Zavolať %s Vyžiadať potrebné oprávnenia + Vytvoriť nový kontakt + Pridať k existujúcemu kontaktu Nový kontakt Upraviť kontakt @@ -95,6 +97,10 @@ Zahrnúť zdroje kontaktov Názov súboru (bez .vcf) + + Číselník + Pridať číslo kontaktu + Zvoľte polia na zobrazenie Titul pred menom diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 480be2fc..b2198c6e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -15,6 +15,8 @@ Skicka e-post till grupp Ring %s Begär de behörigheter som krävs + Create new contact + Add to an existing contact Ny kontakt Redigera kontakt @@ -95,6 +97,10 @@ Inkludera kontaktkällor Filnamn (utan .vcf) + + Dialpad + Add number to contact + Välj vilka fält som ska visas Prefix diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index ba9cfd93..583219d7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -15,6 +15,8 @@ Gruba e-posta gönder Call %s Request the required permissions + Create new contact + Add to an existing contact Yeni kişi Kişiyi düzenle @@ -95,6 +97,10 @@ Kişi kaynaklarını dahil et Dosya adı (.vcf olmadan) + + Dialpad + Add number to contact + Görüntülenecek alanları seç Önek diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml new file mode 100644 index 00000000..afdc4448 --- /dev/null +++ b/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 362ba455..afab4bfc 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -15,6 +15,8 @@ 發送電子郵件給群組 打電話給 %s 請求必要的權限 + 建立新聯絡人 + 添加至已存在的聯絡人 新聯絡人 編輯聯絡人 @@ -23,7 +25,7 @@ 名字 中間名 姓氏 - Nickname + 暱稱 沒有群組 @@ -95,6 +97,10 @@ 包含聯絡人來源 檔案名稱 (不含.vcf) + + 撥號畫面 + 添加號碼至通訊錄 + 選擇要顯示的欄位 前缀 @@ -108,7 +114,7 @@ 網站 群組 聯絡人來源 - Instant messaging (IM) + 即時通訊 (IM) 我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎? diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 4061e3b5..b0496177 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,4 +4,8 @@ 45dp 40dp 52dp + 56dp + 68dp + 60dp + 34sp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 59a112ff..c3d9f092 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -12,6 +12,7 @@ Jabber + Added a simple dialpad, dialer will come soon Added an optional IM field\n Added support for custom phone number/email/address types diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb065320..53be90a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,8 @@ Send email to group Call %s Request the required permissions + Create new contact + Add to an existing contact New contact Edit contact @@ -95,6 +97,10 @@ Include contact sources Filename (without .vcf) + + Dialpad + Add number to contact + Select fields to show Prefix diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0be50415..b7e0377a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,4 +2,15 @@ + + + diff --git a/build.gradle b/build.gradle index 1b8fb3c3..76ac6173 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.2.61' + ext.kotlin_version = '1.2.71' repositories { google() @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.0' 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 7d73f3c2..503fd67b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Dec 10 10:08:39 CET 2017 +#Tue Sep 25 13:09:34 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip