mirror of
https://github.com/SimpleMobileTools/Simple-Dialer.git
synced 2025-06-05 21:49:23 +02:00
Merge branch 'master' into patch-2
This commit is contained in:
@ -82,6 +82,12 @@
|
|||||||
android:label="@string/speed_dial"
|
android:label="@string/speed_dial"
|
||||||
android:parentActivityName=".activities.SettingsActivity" />
|
android:parentActivityName=".activities.SettingsActivity" />
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".activities.ConferenceActivity"
|
||||||
|
android:exported="false"
|
||||||
|
android:label="@string/conference"
|
||||||
|
android:parentActivityName=".activities.CallActivity" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.SettingsActivity"
|
android:name=".activities.SettingsActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
@ -99,6 +105,7 @@
|
|||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:label="@string/ongoing_call"
|
android:label="@string/ongoing_call"
|
||||||
|
android:launchMode="singleTask"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
android:showOnLockScreen="true" />
|
android:showOnLockScreen="true" />
|
||||||
|
|
||||||
|
@ -18,14 +18,13 @@ import android.view.MotionEvent
|
|||||||
import android.view.WindowManager
|
import android.view.WindowManager
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.*
|
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||||
|
import com.simplemobiletools.commons.helpers.MINUTE_SECONDS
|
||||||
|
import com.simplemobiletools.commons.helpers.isOreoMr1Plus
|
||||||
|
import com.simplemobiletools.commons.helpers.isOreoPlus
|
||||||
import com.simplemobiletools.dialer.R
|
import com.simplemobiletools.dialer.R
|
||||||
import com.simplemobiletools.dialer.extensions.addCharacter
|
import com.simplemobiletools.dialer.extensions.*
|
||||||
import com.simplemobiletools.dialer.extensions.audioManager
|
import com.simplemobiletools.dialer.helpers.*
|
||||||
import com.simplemobiletools.dialer.extensions.config
|
|
||||||
import com.simplemobiletools.dialer.extensions.getHandleToUse
|
|
||||||
import com.simplemobiletools.dialer.helpers.CallContactAvatarHelper
|
|
||||||
import com.simplemobiletools.dialer.helpers.CallManager
|
|
||||||
import com.simplemobiletools.dialer.models.CallContact
|
import com.simplemobiletools.dialer.models.CallContact
|
||||||
import kotlinx.android.synthetic.main.activity_call.*
|
import kotlinx.android.synthetic.main.activity_call.*
|
||||||
import kotlinx.android.synthetic.main.dialpad.*
|
import kotlinx.android.synthetic.main.dialpad.*
|
||||||
@ -34,7 +33,7 @@ class CallActivity : SimpleActivity() {
|
|||||||
companion object {
|
companion object {
|
||||||
fun getStartIntent(context: Context): Intent {
|
fun getStartIntent(context: Context): Intent {
|
||||||
val openAppIntent = Intent(context, CallActivity::class.java)
|
val openAppIntent = Intent(context, CallActivity::class.java)
|
||||||
openAppIntent.flags = Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT or Intent.FLAG_ACTIVITY_NEW_TASK
|
openAppIntent.flags = Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT
|
||||||
return openAppIntent
|
return openAppIntent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -55,29 +54,36 @@ class CallActivity : SimpleActivity() {
|
|||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(R.layout.activity_call)
|
setContentView(R.layout.activity_call)
|
||||||
|
|
||||||
|
if (CallManager.getPhoneState() == NoCall) {
|
||||||
|
finish()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
updateTextColors(call_holder)
|
updateTextColors(call_holder)
|
||||||
initButtons()
|
initButtons()
|
||||||
|
|
||||||
audioManager.mode = AudioManager.MODE_IN_CALL
|
audioManager.mode = AudioManager.MODE_IN_CALL
|
||||||
|
|
||||||
CallManager.getCallContact(applicationContext) { contact ->
|
|
||||||
callContact = contact
|
|
||||||
val avatar = callContactAvatarHelper.getCallContactAvatar(contact)
|
|
||||||
runOnUiThread {
|
|
||||||
updateOtherPersonsInfo(avatar)
|
|
||||||
checkCalledSIMCard()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addLockScreenFlags()
|
addLockScreenFlags()
|
||||||
|
|
||||||
CallManager.registerCallback(callCallback)
|
CallManager.addListener(callCallback)
|
||||||
updateCallState(CallManager.getState())
|
|
||||||
|
updateCallContactInfo(CallManager.getPrimaryCall())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNewIntent(intent: Intent?) {
|
||||||
|
super.onNewIntent(intent)
|
||||||
|
updateState()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
updateState()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
CallManager.unregisterCallback(callCallback)
|
CallManager.removeListener(callCallback)
|
||||||
disableProximitySensor()
|
disableProximitySensor()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,6 +139,25 @@ class CallActivity : SimpleActivity() {
|
|||||||
toggleHold()
|
toggleHold()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
call_add.setOnClickListener {
|
||||||
|
Intent(applicationContext, DialpadActivity::class.java).apply {
|
||||||
|
addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
|
||||||
|
startActivity(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
call_swap.setOnClickListener {
|
||||||
|
CallManager.swap()
|
||||||
|
}
|
||||||
|
|
||||||
|
call_merge.setOnClickListener {
|
||||||
|
CallManager.merge()
|
||||||
|
}
|
||||||
|
|
||||||
|
call_manage.setOnClickListener {
|
||||||
|
startActivity(Intent(this, ConferenceActivity::class.java))
|
||||||
|
}
|
||||||
|
|
||||||
call_end.setOnClickListener {
|
call_end.setOnClickListener {
|
||||||
endCall()
|
endCall()
|
||||||
}
|
}
|
||||||
@ -153,7 +178,10 @@ class CallActivity : SimpleActivity() {
|
|||||||
dialpad_hashtag_holder.setOnClickListener { dialpadPressed('#') }
|
dialpad_hashtag_holder.setOnClickListener { dialpadPressed('#') }
|
||||||
|
|
||||||
dialpad_wrapper.setBackgroundColor(getProperBackgroundColor())
|
dialpad_wrapper.setBackgroundColor(getProperBackgroundColor())
|
||||||
arrayOf(call_toggle_microphone, call_toggle_speaker, call_dialpad, dialpad_close, call_sim_image).forEach {
|
arrayOf(
|
||||||
|
call_toggle_microphone, call_toggle_speaker, call_dialpad, dialpad_close,
|
||||||
|
call_sim_image, call_toggle_hold, call_add, call_swap, call_merge, call_manage
|
||||||
|
).forEach {
|
||||||
it.applyColorFilter(getProperTextColor())
|
it.applyColorFilter(getProperTextColor())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,6 +362,16 @@ class CallActivity : SimpleActivity() {
|
|||||||
|
|
||||||
if (avatar != null) {
|
if (avatar != null) {
|
||||||
caller_avatar.setImageBitmap(avatar)
|
caller_avatar.setImageBitmap(avatar)
|
||||||
|
} else {
|
||||||
|
caller_avatar.setImageDrawable(null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getContactNameOrNumber(contact: CallContact): String {
|
||||||
|
return contact.name.ifEmpty {
|
||||||
|
contact.number.ifEmpty {
|
||||||
|
getString(R.string.unknown_caller)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -343,7 +381,7 @@ class CallActivity : SimpleActivity() {
|
|||||||
val accounts = telecomManager.callCapablePhoneAccounts
|
val accounts = telecomManager.callCapablePhoneAccounts
|
||||||
if (accounts.size > 1) {
|
if (accounts.size > 1) {
|
||||||
accounts.forEachIndexed { index, account ->
|
accounts.forEachIndexed { index, account ->
|
||||||
if (account == CallManager.call?.details?.accountHandle) {
|
if (account == CallManager.getPrimaryCall()?.details?.accountHandle) {
|
||||||
call_sim_id.text = "${index + 1}"
|
call_sim_id.text = "${index + 1}"
|
||||||
call_sim_id.beVisible()
|
call_sim_id.beVisible()
|
||||||
call_sim_image.beVisible()
|
call_sim_image.beVisible()
|
||||||
@ -365,7 +403,8 @@ class CallActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateCallState(state: Int) {
|
private fun updateCallState(call: Call) {
|
||||||
|
val state = call.getStateCompat()
|
||||||
when (state) {
|
when (state) {
|
||||||
Call.STATE_RINGING -> callRinging()
|
Call.STATE_RINGING -> callRinging()
|
||||||
Call.STATE_ACTIVE -> callStarted()
|
Call.STATE_ACTIVE -> callStarted()
|
||||||
@ -376,7 +415,7 @@ class CallActivity : SimpleActivity() {
|
|||||||
|
|
||||||
val statusTextId = when (state) {
|
val statusTextId = when (state) {
|
||||||
Call.STATE_RINGING -> R.string.is_calling
|
Call.STATE_RINGING -> R.string.is_calling
|
||||||
Call.STATE_DIALING -> R.string.dialing
|
Call.STATE_CONNECTING, Call.STATE_DIALING -> R.string.dialing
|
||||||
else -> 0
|
else -> 0
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -384,9 +423,53 @@ class CallActivity : SimpleActivity() {
|
|||||||
call_status_label.text = getString(statusTextId)
|
call_status_label.text = getString(statusTextId)
|
||||||
}
|
}
|
||||||
|
|
||||||
val isActiveCall = state == Call.STATE_ACTIVE || state == Call.STATE_HOLDING
|
call_manage.beVisibleIf(call.hasCapability(Call.Details.CAPABILITY_MANAGE_CONFERENCE))
|
||||||
call_toggle_hold.isEnabled = isActiveCall
|
setActionButtonEnabled(call_swap, state == Call.STATE_ACTIVE)
|
||||||
call_toggle_hold.alpha = if (isActiveCall) 1.0f else LOWER_ALPHA
|
setActionButtonEnabled(call_merge, state == Call.STATE_ACTIVE)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateState() {
|
||||||
|
val phoneState = CallManager.getPhoneState()
|
||||||
|
if (phoneState is SingleCall) {
|
||||||
|
updateCallState(phoneState.call)
|
||||||
|
updateCallOnHoldState(null)
|
||||||
|
val state = phoneState.call.getStateCompat()
|
||||||
|
val isSingleCallActionsEnabled = (state == Call.STATE_ACTIVE || state == Call.STATE_DISCONNECTED
|
||||||
|
|| state == Call.STATE_DISCONNECTING || state == Call.STATE_HOLDING)
|
||||||
|
setActionButtonEnabled(call_toggle_hold, isSingleCallActionsEnabled)
|
||||||
|
setActionButtonEnabled(call_add, isSingleCallActionsEnabled)
|
||||||
|
} else if (phoneState is TwoCalls) {
|
||||||
|
updateCallState(phoneState.active)
|
||||||
|
updateCallOnHoldState(phoneState.onHold)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateCallOnHoldState(call: Call?) {
|
||||||
|
val hasCallOnHold = call != null
|
||||||
|
if (hasCallOnHold) {
|
||||||
|
getCallContact(applicationContext, call) { contact ->
|
||||||
|
runOnUiThread {
|
||||||
|
on_hold_caller_name.text = getContactNameOrNumber(contact)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
on_hold_status_holder.beVisibleIf(hasCallOnHold)
|
||||||
|
controls_single_call.beVisibleIf(!hasCallOnHold)
|
||||||
|
controls_two_calls.beVisibleIf(hasCallOnHold)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateCallContactInfo(call: Call?) {
|
||||||
|
getCallContact(applicationContext, call) { contact ->
|
||||||
|
if (call != CallManager.getPrimaryCall()) {
|
||||||
|
return@getCallContact
|
||||||
|
}
|
||||||
|
callContact = contact
|
||||||
|
val avatar = if (!call.isConference()) callContactAvatarHelper.getCallContactAvatar(contact) else null
|
||||||
|
runOnUiThread {
|
||||||
|
updateOtherPersonsInfo(avatar)
|
||||||
|
checkCalledSIMCard()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun acceptCall() {
|
private fun acceptCall() {
|
||||||
@ -407,13 +490,14 @@ class CallActivity : SimpleActivity() {
|
|||||||
enableProximitySensor()
|
enableProximitySensor()
|
||||||
incoming_call_holder.beGone()
|
incoming_call_holder.beGone()
|
||||||
ongoing_call_holder.beVisible()
|
ongoing_call_holder.beVisible()
|
||||||
|
callDurationHandler.removeCallbacks(updateCallDurationTask)
|
||||||
callDurationHandler.post(updateCallDurationTask)
|
callDurationHandler.post(updateCallDurationTask)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun showPhoneAccountPicker() {
|
private fun showPhoneAccountPicker() {
|
||||||
if (callContact != null) {
|
if (callContact != null) {
|
||||||
getHandleToUse(intent, callContact!!.number) { handle ->
|
getHandleToUse(intent, callContact!!.number) { handle ->
|
||||||
CallManager.call?.phoneAccountSelected(handle, false)
|
CallManager.getPrimaryCall()?.phoneAccountSelected(handle, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -446,16 +530,21 @@ class CallActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val callCallback = object : Call.Callback() {
|
private val callCallback = object : CallManagerListener {
|
||||||
override fun onStateChanged(call: Call, state: Int) {
|
override fun onStateChanged() {
|
||||||
super.onStateChanged(call, state)
|
updateState()
|
||||||
updateCallState(state)
|
}
|
||||||
|
|
||||||
|
override fun onPrimaryCallChanged(call: Call) {
|
||||||
|
callDurationHandler.removeCallbacks(updateCallDurationTask)
|
||||||
|
updateCallContactInfo(call)
|
||||||
|
updateState()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val updateCallDurationTask = object : Runnable {
|
private val updateCallDurationTask = object : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
callDuration = CallManager.getCallDuration()
|
callDuration = CallManager.getPrimaryCall().getCallDuration()
|
||||||
if (!isCallEnded) {
|
if (!isCallEnded) {
|
||||||
call_status_label.text = callDuration.getFormattedDuration()
|
call_status_label.text = callDuration.getFormattedDuration()
|
||||||
callDurationHandler.postDelayed(this, 1000)
|
callDurationHandler.postDelayed(this, 1000)
|
||||||
@ -497,4 +586,11 @@ class CallActivity : SimpleActivity() {
|
|||||||
proximityWakeLock!!.release()
|
proximityWakeLock!!.release()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setActionButtonEnabled(button: ImageView, enabled: Boolean) {
|
||||||
|
button.apply {
|
||||||
|
isEnabled = enabled
|
||||||
|
alpha = if (enabled) 1.0f else LOWER_ALPHA
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
package com.simplemobiletools.dialer.activities
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import com.simplemobiletools.dialer.R
|
||||||
|
import com.simplemobiletools.dialer.adapters.ConferenceCallsAdapter
|
||||||
|
import com.simplemobiletools.dialer.helpers.CallManager
|
||||||
|
import kotlinx.android.synthetic.main.activity_conference.*
|
||||||
|
|
||||||
|
class ConferenceActivity : SimpleActivity() {
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.activity_conference)
|
||||||
|
|
||||||
|
conference_calls_list.adapter = ConferenceCallsAdapter(this, conference_calls_list, ArrayList(CallManager.getConferenceCalls())) {}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
package com.simplemobiletools.dialer.adapters
|
||||||
|
|
||||||
|
import android.telecom.Call
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import com.bumptech.glide.Glide
|
||||||
|
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
|
||||||
|
import com.simplemobiletools.commons.helpers.LOWER_ALPHA
|
||||||
|
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
||||||
|
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
|
import com.simplemobiletools.dialer.R
|
||||||
|
import com.simplemobiletools.dialer.activities.SimpleActivity
|
||||||
|
import com.simplemobiletools.dialer.extensions.hasCapability
|
||||||
|
import com.simplemobiletools.dialer.helpers.getCallContact
|
||||||
|
import kotlinx.android.synthetic.main.item_conference_call.view.*
|
||||||
|
|
||||||
|
class ConferenceCallsAdapter(
|
||||||
|
activity: SimpleActivity, recyclerView: MyRecyclerView, val data: ArrayList<Call>, itemClick: (Any) -> Unit
|
||||||
|
) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
|
||||||
|
|
||||||
|
override fun actionItemPressed(id: Int) {}
|
||||||
|
|
||||||
|
override fun getActionMenuId(): Int = 0
|
||||||
|
|
||||||
|
override fun getIsItemSelectable(position: Int): Boolean = false
|
||||||
|
|
||||||
|
override fun getItemCount(): Int = data.size
|
||||||
|
|
||||||
|
override fun getItemKeyPosition(key: Int): Int = -1
|
||||||
|
|
||||||
|
override fun getItemSelectionKey(position: Int): Int? = null
|
||||||
|
|
||||||
|
override fun getSelectableItemCount(): Int = data.size
|
||||||
|
|
||||||
|
override fun onActionModeCreated() {}
|
||||||
|
|
||||||
|
override fun onActionModeDestroyed() {}
|
||||||
|
|
||||||
|
override fun prepareActionMode(menu: Menu) {}
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_conference_call, parent)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
val call = data[position]
|
||||||
|
holder.bindView(call, allowSingleClick = false, allowLongClick = false) { itemView, _ ->
|
||||||
|
getCallContact(itemView.context, call) { callContact ->
|
||||||
|
itemView.post {
|
||||||
|
itemView.item_conference_call_name.text = callContact.name.ifEmpty { itemView.context.getString(R.string.unknown_caller) }
|
||||||
|
SimpleContactsHelper(activity).loadContactImage(
|
||||||
|
callContact.photoUri,
|
||||||
|
itemView.item_conference_call_image,
|
||||||
|
callContact.name,
|
||||||
|
activity.getDrawable(R.drawable.ic_person_vector)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val canSeparate = call.hasCapability(Call.Details.CAPABILITY_SEPARATE_FROM_CONFERENCE)
|
||||||
|
val canDisconnect = call.hasCapability(Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE)
|
||||||
|
itemView.item_conference_call_split.isEnabled = canSeparate
|
||||||
|
itemView.item_conference_call_split.alpha = if (canSeparate) 1.0f else LOWER_ALPHA
|
||||||
|
itemView.item_conference_call_split.setOnClickListener {
|
||||||
|
call.splitFromConference()
|
||||||
|
data.removeAt(position)
|
||||||
|
notifyItemRemoved(position)
|
||||||
|
if (data.size == 1) {
|
||||||
|
activity.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
itemView.item_conference_call_end.isEnabled = canDisconnect
|
||||||
|
itemView.item_conference_call_end.alpha = if (canDisconnect) 1.0f else LOWER_ALPHA
|
||||||
|
itemView.item_conference_call_end.setOnClickListener {
|
||||||
|
call.disconnect()
|
||||||
|
data.removeAt(position)
|
||||||
|
notifyItemRemoved(position)
|
||||||
|
if (data.size == 1) {
|
||||||
|
activity.finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bindViewHolder(holder)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewRecycled(holder: ViewHolder) {
|
||||||
|
super.onViewRecycled(holder)
|
||||||
|
if (!activity.isDestroyed && !activity.isFinishing) {
|
||||||
|
Glide.with(activity).clear(holder.itemView.item_conference_call_image)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,14 +9,32 @@ import com.simplemobiletools.commons.helpers.isSPlus
|
|||||||
private val OUTGOING_CALL_STATES = arrayOf(STATE_CONNECTING, STATE_DIALING, STATE_SELECT_PHONE_ACCOUNT)
|
private val OUTGOING_CALL_STATES = arrayOf(STATE_CONNECTING, STATE_DIALING, STATE_SELECT_PHONE_ACCOUNT)
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
fun Call.getStateCompat(): Int {
|
fun Call?.getStateCompat(): Int {
|
||||||
return if (isSPlus()) {
|
return if (this == null) {
|
||||||
|
Call.STATE_DISCONNECTED
|
||||||
|
} else if (isSPlus()) {
|
||||||
details.state
|
details.state
|
||||||
} else {
|
} else {
|
||||||
state
|
state
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Call?.getCallDuration(): Int {
|
||||||
|
return if (this != null) {
|
||||||
|
val connectTimeMillis = details.connectTimeMillis
|
||||||
|
if (connectTimeMillis == 0L) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
((System.currentTimeMillis() - connectTimeMillis) / 1000).toInt()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun Call.isOutgoing(): Boolean {
|
fun Call.isOutgoing(): Boolean {
|
||||||
return OUTGOING_CALL_STATES.contains(getStateCompat())
|
return OUTGOING_CALL_STATES.contains(getStateCompat())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Call.hasCapability(capability: Int): Boolean = (details.callCapabilities and capability) != 0
|
||||||
|
|
||||||
|
fun Call?.isConference(): Boolean = this?.details?.hasProperty(Call.Details.PROPERTY_CONFERENCE) == true
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
package com.simplemobiletools.dialer.helpers
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.net.Uri
|
||||||
|
import android.telecom.Call
|
||||||
|
import com.simplemobiletools.commons.extensions.getMyContactsCursor
|
||||||
|
import com.simplemobiletools.commons.extensions.getPhoneNumberTypeText
|
||||||
|
import com.simplemobiletools.commons.helpers.MyContactsContentProvider
|
||||||
|
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
||||||
|
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
||||||
|
import com.simplemobiletools.dialer.R
|
||||||
|
import com.simplemobiletools.dialer.extensions.isConference
|
||||||
|
import com.simplemobiletools.dialer.models.CallContact
|
||||||
|
|
||||||
|
fun getCallContact(context: Context, call: Call?, callback: (CallContact) -> Unit) {
|
||||||
|
if (call.isConference()) {
|
||||||
|
callback(CallContact(context.getString(R.string.conference), "", "", ""))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val privateCursor = context.getMyContactsCursor(false, true)
|
||||||
|
ensureBackgroundThread {
|
||||||
|
val callContact = CallContact("", "", "", "")
|
||||||
|
val handle = try {
|
||||||
|
call?.details?.handle?.toString()
|
||||||
|
} catch (e: NullPointerException) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handle == null) {
|
||||||
|
callback(callContact)
|
||||||
|
return@ensureBackgroundThread
|
||||||
|
}
|
||||||
|
|
||||||
|
val uri = Uri.decode(handle)
|
||||||
|
if (uri.startsWith("tel:")) {
|
||||||
|
val number = uri.substringAfter("tel:")
|
||||||
|
SimpleContactsHelper(context).getAvailableContacts(false) { contacts ->
|
||||||
|
val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor)
|
||||||
|
if (privateContacts.isNotEmpty()) {
|
||||||
|
contacts.addAll(privateContacts)
|
||||||
|
}
|
||||||
|
|
||||||
|
val contactsWithMultipleNumbers = contacts.filter { it.phoneNumbers.size > 1 }
|
||||||
|
val numbersToContactIDMap = HashMap<String, Int>()
|
||||||
|
contactsWithMultipleNumbers.forEach { contact ->
|
||||||
|
contact.phoneNumbers.forEach { phoneNumber ->
|
||||||
|
numbersToContactIDMap[phoneNumber.value] = contact.contactId
|
||||||
|
numbersToContactIDMap[phoneNumber.normalizedNumber] = contact.contactId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
callContact.number = number
|
||||||
|
val contact = contacts.firstOrNull { it.doesHavePhoneNumber(number) }
|
||||||
|
if (contact != null) {
|
||||||
|
callContact.name = contact.name
|
||||||
|
callContact.photoUri = contact.photoUri
|
||||||
|
|
||||||
|
if (contact.phoneNumbers.size > 1) {
|
||||||
|
val specificPhoneNumber = contact.phoneNumbers.firstOrNull { it.value == number }
|
||||||
|
if (specificPhoneNumber != null) {
|
||||||
|
callContact.numberLabel = context.getPhoneNumberTypeText(specificPhoneNumber.type, specificPhoneNumber.label)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
callContact.name = number
|
||||||
|
}
|
||||||
|
callback(callContact)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,23 +1,120 @@
|
|||||||
package com.simplemobiletools.dialer.helpers
|
package com.simplemobiletools.dialer.helpers
|
||||||
|
|
||||||
import android.content.Context
|
import android.annotation.SuppressLint
|
||||||
import android.net.Uri
|
|
||||||
import android.telecom.Call
|
import android.telecom.Call
|
||||||
import android.telecom.InCallService
|
import android.telecom.InCallService
|
||||||
import android.telecom.VideoProfile
|
import android.telecom.VideoProfile
|
||||||
import com.simplemobiletools.commons.extensions.getMyContactsCursor
|
|
||||||
import com.simplemobiletools.commons.extensions.getPhoneNumberTypeText
|
|
||||||
import com.simplemobiletools.commons.helpers.MyContactsContentProvider
|
|
||||||
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
|
||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
|
||||||
import com.simplemobiletools.dialer.extensions.getStateCompat
|
import com.simplemobiletools.dialer.extensions.getStateCompat
|
||||||
import com.simplemobiletools.dialer.models.CallContact
|
import com.simplemobiletools.dialer.extensions.hasCapability
|
||||||
|
import com.simplemobiletools.dialer.extensions.isConference
|
||||||
|
import java.util.concurrent.CopyOnWriteArraySet
|
||||||
|
|
||||||
// inspired by https://github.com/Chooloo/call_manage
|
// inspired by https://github.com/Chooloo/call_manage
|
||||||
class CallManager {
|
class CallManager {
|
||||||
companion object {
|
companion object {
|
||||||
var call: Call? = null
|
@SuppressLint("StaticFieldLeak")
|
||||||
var inCallService: InCallService? = null
|
var inCallService: InCallService? = null
|
||||||
|
private var call: Call? = null
|
||||||
|
private val calls = mutableListOf<Call>()
|
||||||
|
private val listeners = CopyOnWriteArraySet<CallManagerListener>()
|
||||||
|
|
||||||
|
fun onCallAdded(call: Call) {
|
||||||
|
this.call = call
|
||||||
|
calls.add(call)
|
||||||
|
for (listener in listeners) {
|
||||||
|
listener.onPrimaryCallChanged(call)
|
||||||
|
}
|
||||||
|
call.registerCallback(object : Call.Callback() {
|
||||||
|
override fun onStateChanged(call: Call, state: Int) {
|
||||||
|
updateState()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDetailsChanged(call: Call, details: Call.Details) {
|
||||||
|
updateState()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onConferenceableCallsChanged(call: Call, conferenceableCalls: MutableList<Call>) {
|
||||||
|
updateState()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onCallRemoved(call: Call) {
|
||||||
|
calls.remove(call)
|
||||||
|
updateState()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getPhoneState(): PhoneState {
|
||||||
|
return when (calls.size) {
|
||||||
|
0 -> NoCall
|
||||||
|
1 -> SingleCall(calls.first())
|
||||||
|
2 -> {
|
||||||
|
val active = calls.find { it.getStateCompat() == Call.STATE_ACTIVE }
|
||||||
|
val newCall = calls.find { it.getStateCompat() == Call.STATE_CONNECTING || it.getStateCompat() == Call.STATE_DIALING }
|
||||||
|
val onHold = calls.find { it.getStateCompat() == Call.STATE_HOLDING }
|
||||||
|
if (active != null && newCall != null) {
|
||||||
|
TwoCalls(newCall, active)
|
||||||
|
} else if (newCall != null && onHold != null) {
|
||||||
|
TwoCalls(newCall, onHold)
|
||||||
|
} else if (active != null && onHold != null) {
|
||||||
|
TwoCalls(active, onHold)
|
||||||
|
} else {
|
||||||
|
TwoCalls(calls[0], calls[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
val conference = calls.find { it.isConference() }!!
|
||||||
|
val secondCall = if (conference.children.size + 1 != calls.size) {
|
||||||
|
calls.filter { !it.isConference() }
|
||||||
|
.subtract(conference.children.toSet())
|
||||||
|
.firstOrNull()
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
if (secondCall == null) {
|
||||||
|
SingleCall(conference)
|
||||||
|
} else {
|
||||||
|
val newCallState = secondCall.getStateCompat()
|
||||||
|
if (newCallState == Call.STATE_ACTIVE || newCallState == Call.STATE_CONNECTING || newCallState == Call.STATE_DIALING) {
|
||||||
|
TwoCalls(secondCall, conference)
|
||||||
|
} else {
|
||||||
|
TwoCalls(conference, secondCall)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateState() {
|
||||||
|
val primaryCall = when (val phoneState = getPhoneState()) {
|
||||||
|
is NoCall -> null
|
||||||
|
is SingleCall -> phoneState.call
|
||||||
|
is TwoCalls -> phoneState.active
|
||||||
|
}
|
||||||
|
var notify = true
|
||||||
|
if (primaryCall == null) {
|
||||||
|
call = null
|
||||||
|
} else if (primaryCall != call) {
|
||||||
|
call = primaryCall
|
||||||
|
for (listener in listeners) {
|
||||||
|
listener.onPrimaryCallChanged(primaryCall)
|
||||||
|
}
|
||||||
|
notify = false
|
||||||
|
}
|
||||||
|
if (notify) {
|
||||||
|
for (listener in listeners) {
|
||||||
|
listener.onStateChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getPrimaryCall(): Call? {
|
||||||
|
return call
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getConferenceCalls(): List<Call> {
|
||||||
|
return calls.find { it.isConference() }?.children ?: emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
fun accept() {
|
fun accept() {
|
||||||
call?.answer(VideoProfile.STATE_AUDIO_ONLY)
|
call?.answer(VideoProfile.STATE_AUDIO_ONLY)
|
||||||
@ -43,85 +140,46 @@ class CallManager {
|
|||||||
return !isOnHold
|
return !isOnHold
|
||||||
}
|
}
|
||||||
|
|
||||||
fun registerCallback(callback: Call.Callback) {
|
fun swap() {
|
||||||
call?.registerCallback(callback)
|
if (calls.size > 1) {
|
||||||
|
calls.find { it.getStateCompat() == Call.STATE_HOLDING }?.unhold()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun unregisterCallback(callback: Call.Callback) {
|
fun merge() {
|
||||||
call?.unregisterCallback(callback)
|
val conferenceableCalls = call!!.conferenceableCalls
|
||||||
}
|
if (conferenceableCalls.isNotEmpty()) {
|
||||||
|
call!!.conference(conferenceableCalls.first())
|
||||||
fun getState() = if (call == null) {
|
|
||||||
Call.STATE_DISCONNECTED
|
|
||||||
} else {
|
} else {
|
||||||
call!!.getStateCompat()
|
if (call!!.hasCapability(Call.Details.CAPABILITY_MERGE_CONFERENCE)) {
|
||||||
|
call!!.mergeConference()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addListener(listener: CallManagerListener) {
|
||||||
|
listeners.add(listener)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun removeListener(listener: CallManagerListener) {
|
||||||
|
listeners.remove(listener)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getState() = getPrimaryCall()?.getStateCompat()
|
||||||
|
|
||||||
fun keypad(c: Char) {
|
fun keypad(c: Char) {
|
||||||
call?.playDtmfTone(c)
|
call?.playDtmfTone(c)
|
||||||
call?.stopDtmfTone()
|
call?.stopDtmfTone()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getCallContact(context: Context, callback: (CallContact?) -> Unit) {
|
|
||||||
val privateCursor = context.getMyContactsCursor(false, true)
|
|
||||||
ensureBackgroundThread {
|
|
||||||
val callContact = CallContact("", "", "", "")
|
|
||||||
val handle = try {
|
|
||||||
call?.details?.handle?.toString()
|
|
||||||
} catch (e: NullPointerException) {
|
|
||||||
null
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle == null) {
|
|
||||||
callback(callContact)
|
|
||||||
return@ensureBackgroundThread
|
|
||||||
}
|
|
||||||
|
|
||||||
val uri = Uri.decode(handle)
|
|
||||||
if (uri.startsWith("tel:")) {
|
|
||||||
val number = uri.substringAfter("tel:")
|
|
||||||
SimpleContactsHelper(context).getAvailableContacts(false) { contacts ->
|
|
||||||
val privateContacts = MyContactsContentProvider.getSimpleContacts(context, privateCursor)
|
|
||||||
if (privateContacts.isNotEmpty()) {
|
|
||||||
contacts.addAll(privateContacts)
|
|
||||||
}
|
|
||||||
|
|
||||||
val contactsWithMultipleNumbers = contacts.filter { it.phoneNumbers.size > 1 }
|
|
||||||
val numbersToContactIDMap = HashMap<String, Int>()
|
|
||||||
contactsWithMultipleNumbers.forEach { contact ->
|
|
||||||
contact.phoneNumbers.forEach { phoneNumber ->
|
|
||||||
numbersToContactIDMap[phoneNumber.value] = contact.contactId
|
|
||||||
numbersToContactIDMap[phoneNumber.normalizedNumber] = contact.contactId
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
callContact.number = number
|
interface CallManagerListener {
|
||||||
val contact = contacts.firstOrNull { it.doesHavePhoneNumber(number) }
|
fun onStateChanged()
|
||||||
if (contact != null) {
|
fun onPrimaryCallChanged(call: Call)
|
||||||
callContact.name = contact.name
|
|
||||||
callContact.photoUri = contact.photoUri
|
|
||||||
|
|
||||||
if (contact.phoneNumbers.size > 1) {
|
|
||||||
val specificPhoneNumber = contact.phoneNumbers.firstOrNull { it.value == number }
|
|
||||||
if (specificPhoneNumber != null) {
|
|
||||||
callContact.numberLabel = context.getPhoneNumberTypeText(specificPhoneNumber.type, specificPhoneNumber.label)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
callContact.name = number
|
|
||||||
}
|
|
||||||
callback(callContact)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getCallDuration(): Int {
|
sealed class PhoneState
|
||||||
return if (call != null) {
|
object NoCall : PhoneState()
|
||||||
((System.currentTimeMillis() - call!!.details.connectTimeMillis) / 1000).toInt()
|
class SingleCall(val call: Call) : PhoneState()
|
||||||
} else {
|
class TwoCalls(val active: Call, val onHold: Call) : PhoneState()
|
||||||
0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -28,7 +28,7 @@ class CallNotificationManager(private val context: Context) {
|
|||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
fun setupNotification() {
|
fun setupNotification() {
|
||||||
CallManager.getCallContact(context.applicationContext) { callContact ->
|
getCallContact(context.applicationContext, CallManager.getPrimaryCall()) { callContact ->
|
||||||
val callContactAvatar = callContactAvatarHelper.getCallContactAvatar(callContact)
|
val callContactAvatar = callContactAvatarHelper.getCallContactAvatar(callContact)
|
||||||
val callState = CallManager.getState()
|
val callState = CallManager.getState()
|
||||||
val isHighPriority = context.powerManager.isInteractive && callState == Call.STATE_RINGING
|
val isHighPriority = context.powerManager.isInteractive && callState == Call.STATE_RINGING
|
||||||
|
@ -10,6 +10,7 @@ import com.simplemobiletools.dialer.extensions.isOutgoing
|
|||||||
import com.simplemobiletools.dialer.extensions.powerManager
|
import com.simplemobiletools.dialer.extensions.powerManager
|
||||||
import com.simplemobiletools.dialer.helpers.CallManager
|
import com.simplemobiletools.dialer.helpers.CallManager
|
||||||
import com.simplemobiletools.dialer.helpers.CallNotificationManager
|
import com.simplemobiletools.dialer.helpers.CallNotificationManager
|
||||||
|
import com.simplemobiletools.dialer.helpers.NoCall
|
||||||
|
|
||||||
class CallService : InCallService() {
|
class CallService : InCallService() {
|
||||||
private val callNotificationManager by lazy { CallNotificationManager(this) }
|
private val callNotificationManager by lazy { CallNotificationManager(this) }
|
||||||
@ -25,9 +26,9 @@ class CallService : InCallService() {
|
|||||||
|
|
||||||
override fun onCallAdded(call: Call) {
|
override fun onCallAdded(call: Call) {
|
||||||
super.onCallAdded(call)
|
super.onCallAdded(call)
|
||||||
CallManager.call = call
|
CallManager.onCallAdded(call)
|
||||||
CallManager.inCallService = this
|
CallManager.inCallService = this
|
||||||
CallManager.registerCallback(callListener)
|
call.registerCallback(callListener)
|
||||||
|
|
||||||
val isScreenLocked = (getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).isDeviceLocked
|
val isScreenLocked = (getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).isDeviceLocked
|
||||||
if (!powerManager.isInteractive || call.isOutgoing() || isScreenLocked) {
|
if (!powerManager.isInteractive || call.isOutgoing() || isScreenLocked) {
|
||||||
@ -42,14 +43,22 @@ class CallService : InCallService() {
|
|||||||
|
|
||||||
override fun onCallRemoved(call: Call) {
|
override fun onCallRemoved(call: Call) {
|
||||||
super.onCallRemoved(call)
|
super.onCallRemoved(call)
|
||||||
CallManager.call = null
|
call.unregisterCallback(callListener)
|
||||||
|
val wasPrimaryCall = call == CallManager.getPrimaryCall()
|
||||||
|
CallManager.onCallRemoved(call)
|
||||||
|
if (CallManager.getPhoneState() == NoCall) {
|
||||||
CallManager.inCallService = null
|
CallManager.inCallService = null
|
||||||
callNotificationManager.cancelNotification()
|
callNotificationManager.cancelNotification()
|
||||||
|
} else {
|
||||||
|
callNotificationManager.setupNotification()
|
||||||
|
if (wasPrimaryCall) {
|
||||||
|
startActivity(CallActivity.getStartIntent(this))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
CallManager.unregisterCallback(callListener)
|
|
||||||
callNotificationManager.cancelNotification()
|
callNotificationManager.cancelNotification()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
5
app/src/main/res/drawable/ic_add_call_vector.xml
Normal file
5
app/src/main/res/drawable/ic_add_call_vector.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M20,15.5c-1.25,0 -2.45,-0.2 -3.57,-0.57 -0.35,-0.11 -0.74,-0.03 -1.02,0.24l-2.2,2.2c-2.83,-1.44 -5.15,-3.75 -6.59,-6.59l2.2,-2.21c0.28,-0.26 0.36,-0.65 0.25,-1C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1H4c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.5c0,-0.55 -0.45,-1 -1,-1zM21,6h-3V3h-2v3h-3v2h3v3h2V8h3z"/>
|
||||||
|
</vector>
|
5
app/src/main/res/drawable/ic_call_merge_vector.xml
Normal file
5
app/src/main/res/drawable/ic_call_merge_vector.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M17,20.41L18.41,19 15,15.59 13.59,17 17,20.41zM7.5,8H11v5.59L5.59,19 7,20.41l6,-6V8h3.5L12,3.5 7.5,8z"/>
|
||||||
|
</vector>
|
5
app/src/main/res/drawable/ic_call_split_vector.xml
Normal file
5
app/src/main/res/drawable/ic_call_split_vector.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:autoMirrored="true" android:height="24dp"
|
||||||
|
android:tint="#FFFFFF" android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M14,4l2.29,2.29 -2.88,2.88 1.42,1.42 2.88,-2.88L20,10L20,4zM10,4L4,4v6l2.29,-2.29 4.71,4.7L11,20h2v-8.41l-5.29,-5.3z"/>
|
||||||
|
</vector>
|
5
app/src/main/res/drawable/ic_call_swap_vector.xml
Normal file
5
app/src/main/res/drawable/ic_call_swap_vector.xml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<vector android:height="24dp" android:tint="#FFFFFF"
|
||||||
|
android:viewportHeight="24" android:viewportWidth="24"
|
||||||
|
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M18,4l-4,4h3v7c0,1.1 -0.9,2 -2,2s-2,-0.9 -2,-2V8c0,-2.21 -1.79,-4 -4,-4S5,5.79 5,8v7H2l4,4 4,-4H7V8c0,-1.1 0.9,-2 2,-2s2,0.9 2,2v7c0,2.21 1.79,4 4,4s4,-1.79 4,-4V8h3l-4,-4z"/>
|
||||||
|
</vector>
|
@ -102,6 +102,55 @@
|
|||||||
app:layout_constraintTop_toTopOf="@+id/call_sim_image"
|
app:layout_constraintTop_toTopOf="@+id/call_sim_image"
|
||||||
tools:text="1" />
|
tools:text="1" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
android:id="@+id/on_hold_status_holder"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@color/cardview_shadow_start_color"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:visibility="visible">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/imageView"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/normal_margin"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_phone_vector" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/on_hold_caller_name"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/normal_margin"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textSize="@dimen/call_status_text_size"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/on_hold_label"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/imageView"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
tools:text="0912 345 678" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/on_hold_label"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/normal_margin"
|
||||||
|
android:text="@string/call_on_hold"
|
||||||
|
android:textSize="@dimen/call_status_text_size"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/imageView"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/imageView" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:id="@+id/ongoing_call_holder"
|
android:id="@+id/ongoing_call_holder"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@ -117,8 +166,7 @@
|
|||||||
android:padding="@dimen/medium_margin"
|
android:padding="@dimen/medium_margin"
|
||||||
android:src="@drawable/ic_microphone_vector"
|
android:src="@drawable/ic_microphone_vector"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toStartOf="@+id/call_toggle_speaker"
|
||||||
app:layout_constraintHorizontal_bias="0.15"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_bias="0.6" />
|
app:layout_constraintVertical_bias="0.6" />
|
||||||
@ -131,8 +179,8 @@
|
|||||||
android:padding="@dimen/medium_margin"
|
android:padding="@dimen/medium_margin"
|
||||||
android:src="@drawable/ic_speaker_off_vector"
|
android:src="@drawable/ic_speaker_off_vector"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toStartOf="@+id/call_dialpad"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toEndOf="@+id/call_toggle_microphone"
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_bias="0.6" />
|
app:layout_constraintVertical_bias="0.6" />
|
||||||
|
|
||||||
@ -146,8 +194,7 @@
|
|||||||
android:src="@drawable/ic_dialpad_vector"
|
android:src="@drawable/ic_dialpad_vector"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintHorizontal_bias="0.85"
|
app:layout_constraintStart_toEndOf="@+id/call_toggle_speaker"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_bias="0.6" />
|
app:layout_constraintVertical_bias="0.6" />
|
||||||
|
|
||||||
@ -157,11 +204,67 @@
|
|||||||
android:layout_height="@dimen/dialpad_button_size"
|
android:layout_height="@dimen/dialpad_button_size"
|
||||||
android:layout_marginTop="@dimen/bigger_margin"
|
android:layout_marginTop="@dimen/bigger_margin"
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:contentDescription="@string/hold_call"
|
||||||
android:padding="@dimen/medium_margin"
|
android:padding="@dimen/medium_margin"
|
||||||
android:src="@drawable/ic_pause_vector"
|
android:src="@drawable/ic_pause_vector"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="@+id/call_toggle_microphone"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/call_toggle_microphone"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/call_toggle_microphone" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/call_add"
|
||||||
|
android:layout_width="@dimen/dialpad_button_size"
|
||||||
|
android:layout_height="@dimen/dialpad_button_size"
|
||||||
|
android:layout_marginTop="@dimen/bigger_margin"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:contentDescription="@string/call_add"
|
||||||
|
android:padding="@dimen/medium_margin"
|
||||||
|
android:src="@drawable/ic_add_call_vector"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/call_toggle_speaker"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/call_toggle_speaker"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/call_toggle_speaker" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/call_manage"
|
||||||
|
android:layout_width="@dimen/dialpad_button_size"
|
||||||
|
android:layout_height="@dimen/dialpad_button_size"
|
||||||
|
android:layout_marginTop="@dimen/bigger_margin"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:contentDescription="@string/conference_manage"
|
||||||
|
android:padding="@dimen/medium_margin"
|
||||||
|
android:src="@drawable/ic_people_vector"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/call_dialpad"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/call_dialpad"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/call_dialpad"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/call_swap"
|
||||||
|
android:layout_width="@dimen/dialpad_button_size"
|
||||||
|
android:layout_height="@dimen/dialpad_button_size"
|
||||||
|
android:layout_marginTop="@dimen/bigger_margin"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:contentDescription="@string/call_swap"
|
||||||
|
android:padding="@dimen/medium_margin"
|
||||||
|
android:src="@drawable/ic_call_swap_vector"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/call_toggle_microphone"
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
app:layout_constraintHorizontal_bias="0.5"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="@+id/call_toggle_microphone"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/call_toggle_microphone" />
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/call_merge"
|
||||||
|
android:layout_width="@dimen/dialpad_button_size"
|
||||||
|
android:layout_height="@dimen/dialpad_button_size"
|
||||||
|
android:layout_marginTop="@dimen/bigger_margin"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:contentDescription="@string/call_merge"
|
||||||
|
android:padding="@dimen/medium_margin"
|
||||||
|
android:src="@drawable/ic_call_merge_vector"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/call_toggle_speaker"
|
||||||
|
app:layout_constraintHorizontal_bias="0.5"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/call_toggle_speaker"
|
||||||
app:layout_constraintTop_toBottomOf="@+id/call_toggle_speaker" />
|
app:layout_constraintTop_toBottomOf="@+id/call_toggle_speaker" />
|
||||||
|
|
||||||
<ImageView
|
<ImageView
|
||||||
@ -176,6 +279,21 @@
|
|||||||
app:layout_constraintTop_toTopOf="parent"
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
app:layout_constraintVertical_bias="0.9" />
|
app:layout_constraintVertical_bias="0.9" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Group
|
||||||
|
android:id="@+id/controls_single_call"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:constraint_referenced_ids="call_toggle_hold,call_add"
|
||||||
|
tools:visibility="visible" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Group
|
||||||
|
android:id="@+id/controls_two_calls"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:constraint_referenced_ids="call_swap,call_merge" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
|
17
app/src/main/res/layout/activity_conference.xml
Normal file
17
app/src/main/res/layout/activity_conference.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
|
android:id="@+id/conference_calls_list"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:scrollbars="none"
|
||||||
|
app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"
|
||||||
|
tools:listitem="@layout/item_conference_call" />
|
||||||
|
|
||||||
|
</FrameLayout>
|
60
app/src/main/res/layout/item_conference_call.xml
Normal file
60
app/src/main/res/layout/item_conference_call.xml
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/item_conference_call_image"
|
||||||
|
android:layout_width="@dimen/normal_icon_size"
|
||||||
|
android:layout_height="@dimen/normal_icon_size"
|
||||||
|
android:layout_centerVertical="true"
|
||||||
|
android:layout_margin="@dimen/medium_margin"
|
||||||
|
android:contentDescription="@null"
|
||||||
|
android:padding="@dimen/small_margin"
|
||||||
|
android:src="@drawable/ic_person_vector"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent" />
|
||||||
|
|
||||||
|
<com.simplemobiletools.commons.views.MyTextView
|
||||||
|
android:id="@+id/item_conference_call_name"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/medium_margin"
|
||||||
|
android:layout_toEndOf="@+id/item_conference_call_image"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textSize="@dimen/bigger_text_size"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/item_conference_call_image"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/item_conference_call_split"
|
||||||
|
app:layout_constraintStart_toEndOf="@+id/item_conference_call_image"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/item_conference_call_image"
|
||||||
|
tools:text="John Doe" />
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/item_conference_call_end"
|
||||||
|
android:layout_width="@dimen/normal_icon_size"
|
||||||
|
android:layout_height="@dimen/normal_icon_size"
|
||||||
|
android:layout_margin="@dimen/medium_margin"
|
||||||
|
android:background="?actionBarItemBackground"
|
||||||
|
android:contentDescription="@string/end_call"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_phone_down_vector" />
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/item_conference_call_split"
|
||||||
|
android:layout_width="@dimen/normal_icon_size"
|
||||||
|
android:layout_height="@dimen/normal_icon_size"
|
||||||
|
android:layout_margin="@dimen/medium_margin"
|
||||||
|
android:background="?actionBarItemBackground"
|
||||||
|
android:contentDescription="@string/call_split"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@+id/item_conference_call_end"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:srcCompat="@drawable/ic_call_split_vector" />
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Бързо набиране</string>
|
<string name="speed_dial">Бързо набиране</string>
|
||||||
<string name="manage_speed_dial">Управление на бързото набиране</string>
|
<string name="manage_speed_dial">Управление на бързото набиране</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Trucada en espera</string>
|
<string name="hold_call">Trucada en espera</string>
|
||||||
<string name="resume_call">Reprèn la trucada</string>
|
<string name="resume_call">Reprèn la trucada</string>
|
||||||
<string name="call_on_hold">En espera</string>
|
<string name="call_on_hold">En espera</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Marcatge ràpid</string>
|
<string name="speed_dial">Marcatge ràpid</string>
|
||||||
<string name="manage_speed_dial">Gestiona el marcatge ràpid</string>
|
<string name="manage_speed_dial">Gestiona el marcatge ràpid</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Rychlé vytáčení</string>
|
<string name="speed_dial">Rychlé vytáčení</string>
|
||||||
<string name="manage_speed_dial">Spravujte rychlou volbu</string>
|
<string name="manage_speed_dial">Spravujte rychlou volbu</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Hurtigopkald</string>
|
<string name="speed_dial">Hurtigopkald</string>
|
||||||
<string name="manage_speed_dial">Administrér hurtigopkald</string>
|
<string name="manage_speed_dial">Administrér hurtigopkald</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Anruf halten</string>
|
<string name="hold_call">Anruf halten</string>
|
||||||
<string name="resume_call">Anruf fortsetzen</string>
|
<string name="resume_call">Anruf fortsetzen</string>
|
||||||
<string name="call_on_hold">In der Warteschleife</string>
|
<string name="call_on_hold">In der Warteschleife</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Kurzwahl</string>
|
<string name="speed_dial">Kurzwahl</string>
|
||||||
<string name="manage_speed_dial">Kurzwahlnummern verwalten</string>
|
<string name="manage_speed_dial">Kurzwahlnummern verwalten</string>
|
||||||
|
@ -50,6 +50,12 @@
|
|||||||
<string name="hold_call">Αναμονή Κλήσης</string>
|
<string name="hold_call">Αναμονή Κλήσης</string>
|
||||||
<string name="resume_call">Συνέχιση Κλήσης</string>
|
<string name="resume_call">Συνέχιση Κλήσης</string>
|
||||||
<string name="call_on_hold">Σε Αναμονή</string>
|
<string name="call_on_hold">Σε Αναμονή</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
|
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Ταχεία κλήση</string>
|
<string name="speed_dial">Ταχεία κλήση</string>
|
||||||
|
@ -51,6 +51,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
|
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Speed dial</string>
|
<string name="speed_dial">Speed dial</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Marcado rápido</string>
|
<string name="speed_dial">Marcado rápido</string>
|
||||||
<string name="manage_speed_dial">Administrar marcado rápido</string>
|
<string name="manage_speed_dial">Administrar marcado rápido</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Kiirvalimine</string>
|
<string name="speed_dial">Kiirvalimine</string>
|
||||||
<string name="speed_dial_label">Klõpsa numbrit ja seosta ta konkreetse telefoniraamatu kirjega. Hiljem saad samale numbrile pikalt vajutades alustada kõnet määratud telefoninumbrile.</string>
|
<string name="speed_dial_label">Klõpsa numbrit ja seosta ta konkreetse telefoniraamatu kirjega. Hiljem saad samale numbrile pikalt vajutades alustada kõnet määratud telefoninumbrile.</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Pikavalinta</string>
|
<string name="speed_dial">Pikavalinta</string>
|
||||||
<string name="manage_speed_dial">Pikavalinnan asetukset</string>
|
<string name="manage_speed_dial">Pikavalinnan asetukset</string>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Simple Dialer</string>
|
<string name="app_name">Simple Téléphone</string>
|
||||||
<string name="app_launcher_name">Téléphone</string>
|
<string name="app_launcher_name">Téléphone</string>
|
||||||
<string name="default_phone_app_prompt">Veuillez faire de cette application votre application de téléphone par défaut</string>
|
<string name="default_phone_app_prompt">Veuillez faire de cette application votre application de téléphone par défaut</string>
|
||||||
<string name="allow_displaying_over_other_apps">Veuillez permettre l\'affichage sur d\'autres applications pour un comportement fiable</string>
|
<string name="allow_displaying_over_other_apps">Veuillez permettre l\'affichage sur d\'autres applications pour un comportement fiable</string>
|
||||||
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Mettre l\'appel en attente</string>
|
<string name="hold_call">Mettre l\'appel en attente</string>
|
||||||
<string name="resume_call">Reprendre l\'appel</string>
|
<string name="resume_call">Reprendre l\'appel</string>
|
||||||
<string name="call_on_hold">En attente</string>
|
<string name="call_on_hold">En attente</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Numérotation rapide</string>
|
<string name="speed_dial">Numérotation rapide</string>
|
||||||
<string name="manage_speed_dial">Gérer la numérotation rapide</string>
|
<string name="manage_speed_dial">Gérer la numérotation rapide</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Marcación rápida</string>
|
<string name="speed_dial">Marcación rápida</string>
|
||||||
<string name="manage_speed_dial">Xestionar marcacións rápidas</string>
|
<string name="manage_speed_dial">Xestionar marcacións rápidas</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Brzo biranje</string>
|
<string name="speed_dial">Brzo biranje</string>
|
||||||
<string name="manage_speed_dial">Upravljajte brzim biranjem</string>
|
<string name="manage_speed_dial">Upravljajte brzim biranjem</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Gyors tárcsázó</string>
|
<string name="speed_dial">Gyors tárcsázó</string>
|
||||||
<string name="manage_speed_dial">Gyors tárcsázó kezelése</string>
|
<string name="manage_speed_dial">Gyors tárcsázó kezelése</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Panggilan cepat</string>
|
<string name="speed_dial">Panggilan cepat</string>
|
||||||
<string name="manage_speed_dial">Kelola panggilan cepat</string>
|
<string name="manage_speed_dial">Kelola panggilan cepat</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Metti in attesa la chiamata</string>
|
<string name="hold_call">Metti in attesa la chiamata</string>
|
||||||
<string name="resume_call">Riprendi la chiamata</string>
|
<string name="resume_call">Riprendi la chiamata</string>
|
||||||
<string name="call_on_hold">In attesa</string>
|
<string name="call_on_hold">In attesa</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Contatti veloci</string>
|
<string name="speed_dial">Contatti veloci</string>
|
||||||
<string name="manage_speed_dial">Gestisci i contatti veloci</string>
|
<string name="manage_speed_dial">Gestisci i contatti veloci</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">スピードダイヤル</string>
|
<string name="speed_dial">スピードダイヤル</string>
|
||||||
<string name="manage_speed_dial">スピードダイヤルの管理</string>
|
<string name="manage_speed_dial">スピードダイヤルの管理</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Spartusis rinkimas</string>
|
<string name="speed_dial">Spartusis rinkimas</string>
|
||||||
<string name="manage_speed_dial">Tvarkyti spartųjį rinkimą</string>
|
<string name="manage_speed_dial">Tvarkyti spartųjį rinkimą</string>
|
||||||
|
@ -50,6 +50,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
|
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">സ്പീഡ് ഡയൽ</string>
|
<string name="speed_dial">സ്പീഡ് ഡയൽ</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Hurtigvalg</string>
|
<string name="speed_dial">Hurtigvalg</string>
|
||||||
<string name="manage_speed_dial">Administrer hurtigvalg</string>
|
<string name="manage_speed_dial">Administrer hurtigvalg</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">In wacht</string>
|
<string name="hold_call">In wacht</string>
|
||||||
<string name="resume_call">Hervatten</string>
|
<string name="resume_call">Hervatten</string>
|
||||||
<string name="call_on_hold">In de wacht</string>
|
<string name="call_on_hold">In de wacht</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Snelkiesnummer</string>
|
<string name="speed_dial">Snelkiesnummer</string>
|
||||||
<string name="manage_speed_dial">Snelkiezen beheren</string>
|
<string name="manage_speed_dial">Snelkiezen beheren</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Wstrzymaj połączenie</string>
|
<string name="hold_call">Wstrzymaj połączenie</string>
|
||||||
<string name="resume_call">Wznów połączenie</string>
|
<string name="resume_call">Wznów połączenie</string>
|
||||||
<string name="call_on_hold">Wstrzymane</string>
|
<string name="call_on_hold">Wstrzymane</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Szybkie wybieranie</string>
|
<string name="speed_dial">Szybkie wybieranie</string>
|
||||||
<string name="manage_speed_dial">Zarządzaj szybkim wybieraniem</string>
|
<string name="manage_speed_dial">Zarządzaj szybkim wybieraniem</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Ligação rápida</string>
|
<string name="speed_dial">Ligação rápida</string>
|
||||||
<string name="manage_speed_dial">Gerenciar ligações rápidas</string>
|
<string name="manage_speed_dial">Gerenciar ligações rápidas</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Marcação rápida</string>
|
<string name="speed_dial">Marcação rápida</string>
|
||||||
<string name="manage_speed_dial">Gerir marcações rápidas</string>
|
<string name="manage_speed_dial">Gerir marcações rápidas</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Apelare rapidă</string>
|
<string name="speed_dial">Apelare rapidă</string>
|
||||||
<string name="manage_speed_dial">Gestionați apelarea rapidă</string>
|
<string name="manage_speed_dial">Gestionați apelarea rapidă</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Быстрый вызов</string>
|
<string name="speed_dial">Быстрый вызов</string>
|
||||||
<string name="manage_speed_dial">Управление быстрым вызовом</string>
|
<string name="manage_speed_dial">Управление быстрым вызовом</string>
|
||||||
|
@ -51,6 +51,12 @@
|
|||||||
<string name="hold_call">Podržať hovor</string>
|
<string name="hold_call">Podržať hovor</string>
|
||||||
<string name="resume_call">Obnoviť hovor</string>
|
<string name="resume_call">Obnoviť hovor</string>
|
||||||
<string name="call_on_hold">Podržaný hovor</string>
|
<string name="call_on_hold">Podržaný hovor</string>
|
||||||
|
<string name="call_swap">Prehodiť hovory</string>
|
||||||
|
<string name="call_merge">Zlúčiť hovory</string>
|
||||||
|
<string name="call_split">Rozdeliť call</string>
|
||||||
|
<string name="call_add">Pridať hovor</string>
|
||||||
|
<string name="conference_manage">Spravovať konferenčný hovor</string>
|
||||||
|
<string name="conference">Konferencia</string>
|
||||||
|
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Rýchle vytáčanie</string>
|
<string name="speed_dial">Rýchle vytáčanie</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Parkera samtal</string>
|
<string name="hold_call">Parkera samtal</string>
|
||||||
<string name="resume_call">Återuppta samtal</string>
|
<string name="resume_call">Återuppta samtal</string>
|
||||||
<string name="call_on_hold">Parkerat</string>
|
<string name="call_on_hold">Parkerat</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Snabbuppringning</string>
|
<string name="speed_dial">Snabbuppringning</string>
|
||||||
<string name="manage_speed_dial">Hantera snabbuppringning</string>
|
<string name="manage_speed_dial">Hantera snabbuppringning</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Aramayı beklet</string>
|
<string name="hold_call">Aramayı beklet</string>
|
||||||
<string name="resume_call">Aramayı devam ettir</string>
|
<string name="resume_call">Aramayı devam ettir</string>
|
||||||
<string name="call_on_hold">Beklemede</string>
|
<string name="call_on_hold">Beklemede</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Hızlı arama</string>
|
<string name="speed_dial">Hızlı arama</string>
|
||||||
<string name="manage_speed_dial">Hızlı aramayı yönet</string>
|
<string name="manage_speed_dial">Hızlı aramayı yönet</string>
|
||||||
|
@ -46,7 +46,13 @@
|
|||||||
<string name="end_call">Завершити виклик</string>
|
<string name="end_call">Завершити виклик</string>
|
||||||
<string name="hold_call">Перевести в утримання</string>
|
<string name="hold_call">Перевести в утримання</string>
|
||||||
<string name="resume_call">Зняти з утримання</string>
|
<string name="resume_call">Зняти з утримання</string>
|
||||||
<string name="call_on_hold">Дзвінок утримується</string>
|
<string name="call_on_hold">Утримується</string>
|
||||||
|
<string name="call_swap">Поміняти</string>
|
||||||
|
<string name="call_merge">З\'єднати</string>
|
||||||
|
<string name="call_split">Роз\'єднати</string>
|
||||||
|
<string name="call_add">Додати дзвінок</string>
|
||||||
|
<string name="conference_manage">Керувати конференц-викликом</string>
|
||||||
|
<string name="conference">Конференц-виклик</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Швидкий виклик</string>
|
<string name="speed_dial">Швидкий виклик</string>
|
||||||
<string name="manage_speed_dial">Управління швидким викликом</string>
|
<string name="manage_speed_dial">Управління швидким викликом</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">保持通话</string>
|
<string name="hold_call">保持通话</string>
|
||||||
<string name="resume_call">继续通话</string>
|
<string name="resume_call">继续通话</string>
|
||||||
<string name="call_on_hold">暂停</string>
|
<string name="call_on_hold">暂停</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">快速拨号</string>
|
<string name="speed_dial">快速拨号</string>
|
||||||
<string name="manage_speed_dial">管理快速拨号</string>
|
<string name="manage_speed_dial">管理快速拨号</string>
|
||||||
|
@ -47,6 +47,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
|
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Speed dial</string>
|
<string name="speed_dial">Speed dial</string>
|
||||||
|
@ -51,6 +51,12 @@
|
|||||||
<string name="hold_call">Hold call</string>
|
<string name="hold_call">Hold call</string>
|
||||||
<string name="resume_call">Resume call</string>
|
<string name="resume_call">Resume call</string>
|
||||||
<string name="call_on_hold">On Hold</string>
|
<string name="call_on_hold">On Hold</string>
|
||||||
|
<string name="call_swap">Swap calls</string>
|
||||||
|
<string name="call_merge">Merge calls</string>
|
||||||
|
<string name="call_split">Split call</string>
|
||||||
|
<string name="call_add">Add call</string>
|
||||||
|
<string name="conference_manage">Manage conference call</string>
|
||||||
|
<string name="conference">Conference</string>
|
||||||
|
|
||||||
<!-- Speed dial -->
|
<!-- Speed dial -->
|
||||||
<string name="speed_dial">Speed dial</string>
|
<string name="speed_dial">Speed dial</string>
|
||||||
|
Reference in New Issue
Block a user