From c8443f7187877b1ed6c48a1a30c9a23b2e547295 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 2 May 2020 09:35:54 +0200 Subject: [PATCH] implement the first version of SIM picker --- .../contacts/pro/activities/CallActivity.kt | 21 -------- .../contacts/pro/activities/DialerActivity.kt | 31 +++++++++-- .../contacts/pro/dialogs/SelectSIMDialog.kt | 51 +++++++++++++++++++ app/src/main/res/layout/dialog_select_sim.xml | 23 +++++++++ 4 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt create mode 100644 app/src/main/res/layout/dialog_select_sim.xml 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..358d0bae 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,10 +16,8 @@ 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.contacts.pro.R import com.simplemobiletools.contacts.pro.extensions.audioManager import com.simplemobiletools.contacts.pro.extensions.config @@ -202,29 +200,10 @@ class CallActivity : SimpleActivity() { 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) { - - } } private fun endCall() { 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..fc131c55 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 @@ -5,14 +5,17 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import android.telecom.PhoneAccount +import android.telecom.PhoneAccountHandle import android.telecom.TelecomManager import android.view.Menu import com.simplemobiletools.commons.extensions.isDefaultDialer import com.simplemobiletools.commons.extensions.showErrorToast import com.simplemobiletools.commons.extensions.telecomManager import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.helpers.PERMISSION_READ_PHONE_STATE import com.simplemobiletools.commons.helpers.REQUEST_CODE_SET_DEFAULT_DIALER import com.simplemobiletools.contacts.pro.R +import com.simplemobiletools.contacts.pro.dialogs.SelectSIMDialog class DialerActivity : SimpleActivity() { private var callNumber: Uri? = null @@ -43,11 +46,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 { + Bundle().apply { + putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, it) + 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) { @@ -56,6 +61,22 @@ class DialerActivity : SimpleActivity() { } } + @SuppressLint("MissingPermission") + private fun getHandleToUse(callback: (PhoneAccountHandle) -> Unit) { + val defaultHandle = telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL) + if (defaultHandle != null) { + callback(defaultHandle) + } else { + handlePermission(PERMISSION_READ_PHONE_STATE) { + if (it) { + SelectSIMDialog(this) { handle -> + callback(handle) + } + } + } + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { super.onActivityResult(requestCode, resultCode, resultData) if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER) { 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..c3cb2e47 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/dialogs/SelectSIMDialog.kt @@ -0,0 +1,51 @@ +package com.simplemobiletools.contacts.pro.dialogs + +import android.annotation.SuppressLint +import android.net.Uri +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.commons.extensions.telecomManager +import com.simplemobiletools.contacts.pro.R +import kotlinx.android.synthetic.main.dialog_select_sim.view.* + +@SuppressLint("MissingPermission") +class SelectSIMDialog(val activity: BaseSimpleActivity, val callback: (handle: PhoneAccountHandle) -> Unit) { + private var dialog: AlertDialog? = null + + init { + val view = activity.layoutInflater.inflate(R.layout.dialog_select_sim, null) + val radioGroup = view.select_sim_radio_group + + activity.telecomManager.callCapablePhoneAccounts.forEachIndexed { index, account -> + val phoneAccount = activity.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 radioButton = (activity.layoutInflater.inflate(R.layout.radio_button, null) as RadioButton).apply { + text = label + id = index + setOnClickListener { selectedSIM(phoneAccount.accountHandle) } + } + 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) { + callback(handle) + dialog?.dismiss() + } +} 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..7a8f7b14 --- /dev/null +++ b/app/src/main/res/layout/dialog_select_sim.xml @@ -0,0 +1,23 @@ + + + + + + + +