diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7227b9c9..18a2b4ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,21 @@
Changelog
==========
+Version 6.10.1 *(2020-05-04)*
+----------------------------
+
+ * Show the multi-SIM picker only if the app is set as the default dialer
+ * Added a couple other stability and UX improvements
+
+Version 6.10.0 *(2020-05-03)*
+----------------------------
+
+ * Adding a first implementation of a Dialer, to really allow the app handle calls
+ * Increased the minimal required Android OS version to 6 Marshmallow to allow handling calls
+ * Try fixing the glitch with some saved contacts disappearing
+ * Properly handle inserting bigger resolution contact images in some cases
+ * Added a few other UX and UI improvements here and there
+
Version 6.9.0 *(2020-04-16)*
----------------------------
diff --git a/app/build.gradle b/app/build.gradle
index 01a77f74..754c13d0 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -17,8 +17,8 @@ android {
applicationId "com.simplemobiletools.contacts.pro"
minSdkVersion 23
targetSdkVersion 29
- versionCode 60
- versionName "6.9.0"
+ versionCode 62
+ versionName "6.10.1"
setProperty("archivesBaseName", "contacts")
}
@@ -57,7 +57,7 @@ android {
}
dependencies {
- implementation 'com.simplemobiletools:commons:5.27.2'
+ implementation 'com.simplemobiletools:commons:5.27.5'
implementation 'joda-time:joda-time:2.10.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index eb8dfaa4..b6a708e9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -15,7 +15,9 @@
+
+
-
+
-
-
+
+
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/CallActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/CallActivity.kt
index 9f28ec2f..5e635837 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/CallActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/CallActivity.kt
@@ -16,19 +16,23 @@ import android.util.Size
import android.view.WindowManager
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
-import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.*
-import com.simplemobiletools.commons.models.RadioItem
+import com.simplemobiletools.commons.helpers.MINUTE_SECONDS
+import com.simplemobiletools.commons.helpers.isOreoMr1Plus
+import com.simplemobiletools.commons.helpers.isOreoPlus
+import com.simplemobiletools.commons.helpers.isQPlus
import com.simplemobiletools.contacts.pro.R
+import com.simplemobiletools.contacts.pro.extensions.addCharacter
import com.simplemobiletools.contacts.pro.extensions.audioManager
import com.simplemobiletools.contacts.pro.extensions.config
+import com.simplemobiletools.contacts.pro.extensions.startCallIntent
import com.simplemobiletools.contacts.pro.helpers.ACCEPT_CALL
import com.simplemobiletools.contacts.pro.helpers.CallManager
import com.simplemobiletools.contacts.pro.helpers.DECLINE_CALL
import com.simplemobiletools.contacts.pro.models.CallContact
import com.simplemobiletools.contacts.pro.receivers.CallActionReceiver
import kotlinx.android.synthetic.main.activity_call.*
+import kotlinx.android.synthetic.main.dialpad.*
import java.util.*
class CallActivity : SimpleActivity() {
@@ -51,11 +55,17 @@ class CallActivity : SimpleActivity() {
updateTextColors(call_holder)
initButtons()
- callContact = CallManager.getCallContact(applicationContext)
- callContactAvatar = getCallContactAvatar()
+ audioManager.mode = AudioManager.MODE_IN_CALL
+ CallManager.getCallContact(applicationContext) { contact ->
+ callContact = contact
+ callContactAvatar = getCallContactAvatar()
+ runOnUiThread {
+ setupNotification()
+ updateOtherPersonsInfo()
+ }
+ }
+
addLockScreenFlags()
- setupNotification()
- updateOtherPersonsInfo()
initProximitySensor()
CallManager.registerCallback(callCallback)
@@ -118,7 +128,30 @@ class CallActivity : SimpleActivity() {
endCall()
}
+ dialpad_0_holder.setOnClickListener { dialpadPressed('0') }
+ dialpad_1.setOnClickListener { dialpadPressed('1') }
+ dialpad_2.setOnClickListener { dialpadPressed('2') }
+ dialpad_3.setOnClickListener { dialpadPressed('3') }
+ dialpad_4.setOnClickListener { dialpadPressed('4') }
+ dialpad_5.setOnClickListener { dialpadPressed('5') }
+ dialpad_6.setOnClickListener { dialpadPressed('6') }
+ dialpad_7.setOnClickListener { dialpadPressed('7') }
+ dialpad_8.setOnClickListener { dialpadPressed('8') }
+ dialpad_9.setOnClickListener { dialpadPressed('9') }
+
+ dialpad_0_holder.setOnLongClickListener { dialpadPressed('+'); true }
+ dialpad_asterisk.setOnClickListener { dialpadPressed('*') }
+ dialpad_hashtag.setOnClickListener { dialpadPressed('#') }
+
dialpad_wrapper.setBackgroundColor(config.backgroundColor)
+ arrayOf(call_toggle_microphone, call_toggle_speaker, call_dialpad, dialpad_close).forEach {
+ it.applyColorFilter(config.textColor)
+ }
+ }
+
+ private fun dialpadPressed(char: Char) {
+ CallManager.keypad(char)
+ dialpad_input.addCharacter(char)
}
private fun toggleSpeaker() {
@@ -148,8 +181,7 @@ class CallActivity : SimpleActivity() {
return
}
- val callContact = CallManager.getCallContact(applicationContext) ?: return
- caller_name_label.text = if (callContact.name.isNotEmpty()) callContact.name else getString(R.string.unknown_caller)
+ caller_name_label.text = if (callContact!!.name.isNotEmpty()) callContact!!.name else getString(R.string.unknown_caller)
if (callContactAvatar != null) {
caller_avatar.setImageBitmap(callContactAvatar)
@@ -161,7 +193,7 @@ class CallActivity : SimpleActivity() {
Call.STATE_RINGING -> callRinging()
Call.STATE_ACTIVE -> callStarted()
Call.STATE_DISCONNECTED -> endCall()
- Call.STATE_CONNECTING -> initOutgoingCallUI()
+ Call.STATE_CONNECTING, Call.STATE_DIALING -> initOutgoingCallUI()
Call.STATE_SELECT_PHONE_ACCOUNT -> showPhoneAccountPicker()
}
@@ -198,32 +230,14 @@ class CallActivity : SimpleActivity() {
private fun callStarted() {
incoming_call_holder.beGone()
ongoing_call_holder.beVisible()
- audioManager.mode = AudioManager.MODE_IN_CALL
callTimer.scheduleAtFixedRate(getCallTimerUpdateTask(), 1000, 1000)
}
- @SuppressLint("MissingPermission")
private fun showPhoneAccountPicker() {
- if (!hasPermission(PERMISSION_READ_PHONE_STATE)) {
- return
- }
-
- val items = ArrayList()
- telecomManager.callCapablePhoneAccounts.forEachIndexed { index, account ->
- val phoneAccount = telecomManager.getPhoneAccount(account)
- var label = phoneAccount.label.toString()
- var address = phoneAccount.address.toString()
- if (address.startsWith("tel:") && address.substringAfter("tel:").isNotEmpty()) {
- address = Uri.decode(address.substringAfter("tel:"))
- label += " ($address)"
- }
-
- val radioItem = RadioItem(index, label, phoneAccount.accountHandle)
- items.add(radioItem)
- }
-
- RadioGroupDialog(this, items, titleId = R.string.select_sim) {
-
+ if (callContact == null || callContact!!.number.isEmpty()) {
+ toast(R.string.unknown_error_occurred)
+ } else {
+ startCallIntent(callContact!!.number)
}
}
@@ -303,6 +317,7 @@ class CallActivity : SimpleActivity() {
val name = "call_notification_channel"
NotificationChannel(channelId, name, importance).apply {
+ setSound(null, null)
notificationManager.createNotificationChannel(this)
}
}
@@ -348,6 +363,7 @@ class CallActivity : SimpleActivity() {
.setCategory(Notification.CATEGORY_CALL)
.setCustomContentView(collapsedView)
.setOngoing(true)
+ .setSound(null)
.setUsesChronometer(callState == Call.STATE_ACTIVE)
.setChannelId(channelId)
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt
index 15a03894..28671ddb 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt
@@ -31,7 +31,7 @@ abstract class ContactActivity : SimpleActivity() {
protected var currentContactPhotoPath = ""
fun showPhotoPlaceholder(photoView: ImageView) {
- val placeholder = BitmapDrawable(resources, getContactLetterIcon(contact?.getNameToDisplay() ?: "S"))
+ val placeholder = BitmapDrawable(resources, getContactLetterIcon(contact?.getNameToDisplay() ?: "A"))
photoView.setImageDrawable(placeholder)
currentContactPhotoPath = ""
contact?.photo = null
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt
index 7f5aee0e..7d3b1a78 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialerActivity.kt
@@ -4,7 +4,6 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Bundle
-import android.telecom.PhoneAccount
import android.telecom.TelecomManager
import android.view.Menu
import com.simplemobiletools.commons.extensions.isDefaultDialer
@@ -13,6 +12,7 @@ import com.simplemobiletools.commons.extensions.telecomManager
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.REQUEST_CODE_SET_DEFAULT_DIALER
import com.simplemobiletools.contacts.pro.R
+import com.simplemobiletools.contacts.pro.extensions.getHandleToUse
class DialerActivity : SimpleActivity() {
private var callNumber: Uri? = null
@@ -43,11 +43,13 @@ class DialerActivity : SimpleActivity() {
@SuppressLint("MissingPermission")
private fun initOutgoingCall() {
try {
- Bundle().apply {
- putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL))
- putBoolean(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, false)
- putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false)
- telecomManager.placeCall(callNumber, this)
+ getHandleToUse(intent, callNumber.toString()) { handle ->
+ Bundle().apply {
+ putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle)
+ putBoolean(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, false)
+ putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false)
+ telecomManager.placeCall(callNumber, this)
+ }
finish()
}
} catch (e: Exception) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt
index aa2c198e..a7e09793 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/DialpadActivity.kt
@@ -19,9 +19,7 @@ import com.simplemobiletools.commons.helpers.isOreoPlus
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.adapters.ContactsAdapter
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
-import com.simplemobiletools.contacts.pro.extensions.callContact
-import com.simplemobiletools.contacts.pro.extensions.config
-import com.simplemobiletools.contacts.pro.extensions.startCallIntent
+import com.simplemobiletools.contacts.pro.extensions.*
import com.simplemobiletools.contacts.pro.helpers.ContactsHelper
import com.simplemobiletools.contacts.pro.helpers.KEY_PHONE
import com.simplemobiletools.contacts.pro.helpers.LOCATION_DIALPAD
@@ -45,16 +43,16 @@ class DialpadActivity : SimpleActivity() {
speedDialValues = config.getSpeedDialValues()
- 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.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_1.setOnLongClickListener { speedDial(1); true }
dialpad_2.setOnLongClickListener { speedDial(2); true }
@@ -66,9 +64,9 @@ class DialpadActivity : SimpleActivity() {
dialpad_8.setOnLongClickListener { speedDial(8); true }
dialpad_9.setOnLongClickListener { speedDial(9); true }
- dialpad_0_holder.setOnLongClickListener { dialpadPressed("+", null); true }
- dialpad_asterisk.setOnClickListener { dialpadPressed("*", it) }
- dialpad_hashtag.setOnClickListener { dialpadPressed("#", it) }
+ 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() }
@@ -130,13 +128,13 @@ class DialpadActivity : SimpleActivity() {
}
}
- private fun dialpadPressed(char: String, view: View?) {
- dialpad_input.dispatchKeyEvent(getKeyEvent(getCharKeyCode(char)))
+ private fun dialpadPressed(char: Char, view: View?) {
+ dialpad_input.addCharacter(char)
view?.performHapticFeedback()
}
private fun clearChar(view: View) {
- dialpad_input.dispatchKeyEvent(getKeyEvent(KeyEvent.KEYCODE_DEL))
+ dialpad_input.dispatchKeyEvent(dialpad_input.getKeyEvent(KeyEvent.KEYCODE_DEL))
view.performHapticFeedback()
}
@@ -144,24 +142,6 @@ class DialpadActivity : SimpleActivity() {
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
- }
-
private fun disableKeyboardPopping() {
dialpad_input.showSoftInputOnFocus = false
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt
new file mode 100644
index 00000000..c621ceae
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt
@@ -0,0 +1,47 @@
+package com.simplemobiletools.contacts.pro.dialogs
+
+import android.annotation.SuppressLint
+import android.telecom.PhoneAccountHandle
+import android.view.ViewGroup
+import android.widget.RadioButton
+import android.widget.RadioGroup
+import androidx.appcompat.app.AlertDialog
+import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.contacts.pro.R
+import com.simplemobiletools.contacts.pro.extensions.config
+import com.simplemobiletools.contacts.pro.extensions.getAvailableSIMCardLabels
+import kotlinx.android.synthetic.main.dialog_select_sim.view.*
+
+@SuppressLint("MissingPermission")
+class SelectSIMDialog(val activity: BaseSimpleActivity, val phoneNumber: String, val callback: (handle: PhoneAccountHandle) -> Unit) {
+ private var dialog: AlertDialog? = null
+ private val view = activity.layoutInflater.inflate(R.layout.dialog_select_sim, null)
+
+ init {
+ val radioGroup = view.select_sim_radio_group
+
+ activity.getAvailableSIMCardLabels().forEachIndexed { index, SIMAccount ->
+ val radioButton = (activity.layoutInflater.inflate(R.layout.radio_button, null) as RadioButton).apply {
+ text = SIMAccount.label
+ id = index
+ setOnClickListener { selectedSIM(SIMAccount.handle, SIMAccount.label) }
+ }
+ radioGroup!!.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
+ }
+
+ dialog = AlertDialog.Builder(activity)
+ .create().apply {
+ activity.setupDialogStuff(view, this)
+ }
+ }
+
+ private fun selectedSIM(handle: PhoneAccountHandle, label: String) {
+ if (view.select_sim_remember.isChecked) {
+ activity.config.saveCustomSIM(phoneNumber, label)
+ }
+
+ callback(handle)
+ dialog?.dismiss()
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt
index 19d4ef1e..99f13307 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt
@@ -1,24 +1,45 @@
package com.simplemobiletools.contacts.pro.extensions
+import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
+import android.telecom.PhoneAccount
+import android.telecom.PhoneAccountHandle
+import android.telecom.TelecomManager
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.PERMISSION_CALL_PHONE
+import com.simplemobiletools.commons.helpers.PERMISSION_READ_PHONE_STATE
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.contacts.pro.BuildConfig
import com.simplemobiletools.contacts.pro.R
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
+import com.simplemobiletools.contacts.pro.dialogs.SelectSIMDialog
import com.simplemobiletools.contacts.pro.helpers.*
import com.simplemobiletools.contacts.pro.models.Contact
fun SimpleActivity.startCallIntent(recipient: String) {
+ if (isDefaultDialer()) {
+ getHandleToUse(null, recipient) { handle ->
+ launchCallIntent(recipient, handle)
+ }
+ } else {
+ launchCallIntent(recipient, null)
+ }
+}
+
+fun SimpleActivity.launchCallIntent(recipient: String, handle: PhoneAccountHandle?) {
handlePermission(PERMISSION_CALL_PHONE) {
val action = if (it) Intent.ACTION_CALL else Intent.ACTION_DIAL
Intent(action).apply {
data = Uri.fromParts("tel", recipient, null)
+
+ if (handle != null) {
+ putExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle)
+ }
+
if (resolveActivity(packageManager) != null) {
startActivity(this)
} else {
@@ -109,3 +130,28 @@ fun SimpleActivity.callContact(contact: Contact) {
toast(R.string.no_phone_number_found)
}
}
+
+// used at devices with multiple SIM cards
+@SuppressLint("MissingPermission")
+fun SimpleActivity.getHandleToUse(intent: Intent?, phoneNumber: String, callback: (PhoneAccountHandle) -> Unit) {
+ handlePermission(PERMISSION_READ_PHONE_STATE) {
+ if (it) {
+ val defaultHandle = telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL)
+ when {
+ intent?.hasExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE) == true -> callback(intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE)!!)
+ config.getCustomSIM(phoneNumber)?.isNotEmpty() == true -> {
+ val storedLabel = Uri.decode(config.getCustomSIM(phoneNumber))
+ val availableSIMs = getAvailableSIMCardLabels()
+ val firstornull = availableSIMs.firstOrNull { it.label == storedLabel }?.handle ?: availableSIMs.first().handle
+ callback(firstornull)
+ }
+ defaultHandle != null -> callback(defaultHandle)
+ else -> {
+ SelectSIMDialog(this, phoneNumber) { handle ->
+ callback(handle)
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
index e9cafbc2..ca8dd026 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt
@@ -1,5 +1,6 @@
package com.simplemobiletools.contacts.pro.extensions
+import android.annotation.SuppressLint
import android.content.Context
import android.content.Context.AUDIO_SERVICE
import android.content.Intent
@@ -12,6 +13,7 @@ import android.provider.ContactsContract
import androidx.core.content.FileProvider
import com.simplemobiletools.commons.extensions.getIntValue
import com.simplemobiletools.commons.extensions.hasPermission
+import com.simplemobiletools.commons.extensions.telecomManager
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
@@ -26,6 +28,7 @@ import com.simplemobiletools.contacts.pro.interfaces.GroupsDao
import com.simplemobiletools.contacts.pro.models.Contact
import com.simplemobiletools.contacts.pro.models.ContactSource
import com.simplemobiletools.contacts.pro.models.Organization
+import com.simplemobiletools.contacts.pro.models.SIMAccount
import java.io.File
val Context.config: Config get() = Config.newInstance(applicationContext)
@@ -326,3 +329,20 @@ fun Context.getAllContactSources(): ArrayList {
}
fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden))
+
+@SuppressLint("MissingPermission")
+fun Context.getAvailableSIMCardLabels(): ArrayList {
+ val SIMAccounts = ArrayList()
+ telecomManager.callCapablePhoneAccounts.forEach { account ->
+ val phoneAccount = telecomManager.getPhoneAccount(account)
+ var label = phoneAccount.label.toString()
+ var address = phoneAccount.address.toString()
+ if (address.startsWith("tel:") && address.substringAfter("tel:").isNotEmpty()) {
+ address = Uri.decode(address.substringAfter("tel:"))
+ label += " ($address)"
+ }
+ val SIM = SIMAccount(phoneAccount.accountHandle, label)
+ SIMAccounts.add(SIM)
+ }
+ return SIMAccounts
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/EditText.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/EditText.kt
new file mode 100644
index 00000000..f4362f14
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/EditText.kt
@@ -0,0 +1,26 @@
+package com.simplemobiletools.contacts.pro.extensions
+
+import android.view.KeyEvent
+import android.widget.EditText
+
+fun EditText.addCharacter(char: Char) {
+ dispatchKeyEvent(getKeyEvent(getCharKeyCode(char)))
+}
+
+fun EditText.getKeyEvent(keyCode: Int) = KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0)
+
+private fun getCharKeyCode(char: Char) = 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
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
index 6bfca4a4..2d108fb2 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/fragments/MyViewPagerFragment.kt
@@ -85,11 +85,16 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
updateTextColor(color)
}
}
+
+ letter_fastscroller?.textColor = color.getColorStateList()
}
fun primaryColorChanged() {
fragment_fastscroller?.updatePrimaryColor()
fragment_fastscroller?.updateBubblePrimaryColor()
+ letter_fastscroller_thumb?.thumbColor = config.primaryColor.getColorStateList()
+ letter_fastscroller_thumb?.textColor = config.primaryColor.getContrastColor()
+
(fragment_list.adapter as? ContactsAdapter)?.apply {
adjustedPrimaryColor = context.getAdjustedPrimaryColor()
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/CallManager.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/CallManager.kt
index 3be9e194..eebc769d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/CallManager.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/CallManager.kt
@@ -7,6 +7,8 @@ import android.telecom.Call
import android.telecom.VideoProfile
import com.simplemobiletools.commons.extensions.getNameFromPhoneNumber
import com.simplemobiletools.commons.extensions.getPhotoUriFromPhoneNumber
+import com.simplemobiletools.commons.helpers.ensureBackgroundThread
+import com.simplemobiletools.contacts.pro.extensions.contactsDB
import com.simplemobiletools.contacts.pro.models.CallContact
// inspired by https://github.com/Chooloo/call_manage
@@ -45,20 +47,41 @@ class CallManager {
call!!.state
}
- fun getCallContact(context: Context): CallContact? {
- val callContact = CallContact("", "")
- if (call == null) {
- return callContact
+ fun keypad(c: Char) {
+ call?.playDtmfTone(c)
+ call?.stopDtmfTone()
+ }
+
+ fun getCallContact(context: Context, callback: (CallContact?) -> Unit) {
+ val callContact = CallContact("", "", "")
+ if (call == null || call!!.details == null || call!!.details!!.handle == null) {
+ callback(callContact)
+ return
}
val uri = Uri.decode(call!!.details.handle.toString())
if (uri.startsWith("tel:")) {
val number = uri.substringAfter("tel:")
+ callContact.number = number
callContact.name = context.getNameFromPhoneNumber(number)
callContact.photoUri = context.getPhotoUriFromPhoneNumber(number)
- }
- return callContact
+ if (callContact.name == callContact.number) {
+ ensureBackgroundThread {
+ val localContact = context.contactsDB.getContactWithNumber("%$number%")
+ if (localContact != null) {
+ val storedGroups = ContactsHelper(context).getStoredGroupsSync()
+ val newContact = LocalContactsHelper(context).convertLocalContactToContact(localContact, storedGroups)
+ callContact.name = newContact!!.getNameToDisplay()
+ callContact.photoUri = newContact.photoUri
+ }
+
+ callback(callContact)
+ }
+ } else {
+ callback(callContact)
+ }
+ }
}
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt
index 76b047a7..b931a9ee 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt
@@ -1,6 +1,7 @@
package com.simplemobiletools.contacts.pro.helpers
import android.content.Context
+import android.net.Uri
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.simplemobiletools.commons.helpers.BaseConfig
@@ -72,6 +73,12 @@ class Config(context: Context) : BaseConfig(context) {
get() = prefs.getString(SPEED_DIAL, "")!!
set(speedDial) = prefs.edit().putString(SPEED_DIAL, speedDial).apply()
+ fun saveCustomSIM(number: String, SIMlabel: String) {
+ prefs.edit().putString(REMEMBER_SIM_PREFIX + number, Uri.encode(SIMlabel)).apply()
+ }
+
+ fun getCustomSIM(number: String) = prefs.getString(REMEMBER_SIM_PREFIX + number, "")
+
fun getSpeedDialValues(): ArrayList {
val speedDialType = object : TypeToken>() {}.type
val speedDialValues = Gson().fromJson>(speedDial, speedDialType) ?: ArrayList(1)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt
index 5de1e921..dedf47b3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt
@@ -24,6 +24,7 @@ const val SHOW_DIALPAD_LETTERS = "show_dialpad_letters"
const val SPEED_DIAL = "speed_dial"
const val LAST_EXPORT_PATH = "last_export_path"
const val WAS_LOCAL_ACCOUNT_INITIALIZED = "was_local_account_initialized"
+const val REMEMBER_SIM_PREFIX = "remember_sim_"
const val CONTACT_ID = "contact_id"
const val SMT_PRIVATE = "smt_private" // used at the contact source of local contacts hidden from other apps
@@ -56,8 +57,8 @@ const val GROUPS_TAB_MASK = 8
const val ALL_TABS_MASK = CONTACTS_TAB_MASK or FAVORITES_TAB_MASK or GROUPS_TAB_MASK
val tabsList = arrayListOf(CONTACTS_TAB_MASK,
- FAVORITES_TAB_MASK,
- GROUPS_TAB_MASK
+ FAVORITES_TAB_MASK,
+ GROUPS_TAB_MASK
)
// contact photo changes
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt
index ce5007ea..d4bf5d95 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/LocalContactsHelper.kt
@@ -81,7 +81,7 @@ class LocalContactsHelper(val context: Context) {
return scaledSizePhotoData
}
- private fun convertLocalContactToContact(localContact: LocalContact?, storedGroups: ArrayList): Contact? {
+ fun convertLocalContactToContact(localContact: LocalContact?, storedGroups: ArrayList): Contact? {
if (localContact == null) {
return null
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt
index cc869362..42621e76 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/interfaces/ContactsDao.kt
@@ -14,6 +14,9 @@ interface ContactsDao {
@Query("SELECT * FROM contacts WHERE id = :id")
fun getContactWithId(id: Int): LocalContact?
+ @Query("SELECT * FROM contacts WHERE phone_numbers LIKE :number")
+ fun getContactWithNumber(number: String): LocalContact?
+
@Query("UPDATE contacts SET starred = :isStarred WHERE id = :id")
fun updateStarred(isStarred: Int, id: Int)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/CallContact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/CallContact.kt
index 86a3ae69..2390f8b7 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/CallContact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/CallContact.kt
@@ -1,4 +1,4 @@
package com.simplemobiletools.contacts.pro.models
// a simpler Contact model containing just info needed at the call screen
-data class CallContact(var name: String, var photoUri: String)
+data class CallContact(var name: String, var photoUri: String, var number: String)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SIMAccount.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SIMAccount.kt
new file mode 100644
index 00000000..aca810f4
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/SIMAccount.kt
@@ -0,0 +1,5 @@
+package com.simplemobiletools.contacts.pro.models
+
+import android.telecom.PhoneAccountHandle
+
+data class SIMAccount(val handle: PhoneAccountHandle, val label: String)
diff --git a/app/src/main/res/layout/dialog_select_sim.xml b/app/src/main/res/layout/dialog_select_sim.xml
new file mode 100644
index 00000000..6c51bb4b
--- /dev/null
+++ b/app/src/main/res/layout/dialog_select_sim.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/dialpad.xml b/app/src/main/res/layout/dialpad.xml
index 28561ddf..e6235d65 100644
--- a/app/src/main/res/layout/dialpad.xml
+++ b/app/src/main/res/layout/dialpad.xml
@@ -7,6 +7,7 @@
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:focusableInTouchMode="true"
+ android:paddingBottom="@dimen/normal_margin"
tools:ignore="HardcodedText">
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 6135e086..26166ffb 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 92052208..5b58addb 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml
index d49922ab..6c11898e 100644
--- a/app/src/main/res/values-cy/strings.xml
+++ b/app/src/main/res/values-cy/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 1b2a90a0..20b1af55 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 65b24c63..603e1fd8 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 565bf54c..e36487ae 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -106,8 +106,8 @@
Αποδοχή
Απόρριψη
Άγνωστος
- Καλεί
- Πληκτρολόγηση
+ Καλεί…
+ Πληκτρολόγηση…
Τέλος Κλήσης
Τερματισμός Κλήσης
Τρέχουσα κλήση
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index cc1d78ef..28219ab0 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index f65c3e45..70777aa1 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index 149de07b..6270f323 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index cfe05b8c..01ff191a 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 33393fd5..67d126fb 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index 15fc551c..9f272f10 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
index 6e48e75c..f64593b0 100644
--- a/app/src/main/res/values-id/strings.xml
+++ b/app/src/main/res/values-id/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 6e48e75c..f64593b0 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index b0651f6d..c81acb12 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index 1f70c3f5..9945786f 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index e54ac1e1..abb1ed36 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index c0e16ec1..6680468e 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index ed725d5a..99bd60ad 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index d98bbba5..761d3e48 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index 31b446c9..1a51a7e8 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 349a9303..e639fe65 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index a8691fd5..325c3ad5 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -106,8 +106,8 @@
Принять
Отклонить
Неизвестный абонент
- Вызывает
- Набор номера
+ Вызывает…
+ Набор номера…
Вызов завершён
Завершение вызова
Текущий вызов
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 01e7c5e2..8b06696d 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -106,8 +106,8 @@
Prijať
Odmietnuť
Neznámy volajúci
- Vám volá
- Vytáčanie
+ Vám volá…
+ Vytáčanie…
Hovor ukončený
Hovor končí
Prebiehajúci hovor
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 36a0a321..ce22c968 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 64524035..e66379a7 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -106,8 +106,8 @@
Kabul Et
Reddet
Bilinmeyen Arama
- Arıyor
- Çevriliyor
+ Arıyor…
+ Çevriliyor…
Arama Sonlandırıldı
Arama Sonlandırılıyor
Devam Eden Arama
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 21f36bb2..037d23e1 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index 051174a5..bce9e7d8 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index fbcc4374..f6ee1c27 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ee20b9dc..1af45d01 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -106,8 +106,8 @@
Accept
Decline
Unknown Caller
- Is Calling
- Dialing
+ Is Calling…
+ Dialing…
Call Ended
Call Ending
Ongoing Call
diff --git a/fastlane/metadata/android/en-US/changelogs/61.txt b/fastlane/metadata/android/en-US/changelogs/61.txt
new file mode 100644
index 00000000..d323a1bd
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/61.txt
@@ -0,0 +1,5 @@
+ * Adding a first implementation of a Dialer, to really allow the app handle calls
+ * Increased the minimal required Android OS version to 6 Marshmallow to allow handling calls
+ * Try fixing the glitch with some saved contacts disappearing
+ * Properly handle inserting bigger resolution contact images in some cases
+ * Added a few other UX and UI improvements here and there
diff --git a/fastlane/metadata/android/en-US/changelogs/62.txt b/fastlane/metadata/android/en-US/changelogs/62.txt
new file mode 100644
index 00000000..4c1f6e73
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/62.txt
@@ -0,0 +1,2 @@
+ * Show the multi-SIM picker only if the app is set as the default dialer
+ * Added a couple other stability and UX improvements