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