mirror of
https://github.com/SimpleMobileTools/Simple-Contacts.git
synced 2025-06-05 21:59:27 +02:00
removing some more calling related files
This commit is contained in:
@ -5,18 +5,10 @@
|
|||||||
package="com.simplemobiletools.contacts.pro"
|
package="com.simplemobiletools.contacts.pro"
|
||||||
android:installLocation="auto">
|
android:installLocation="auto">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.CALL_PHONE"/>
|
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
|
||||||
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
<uses-permission android:name="android.permission.READ_CONTACTS"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
|
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
|
||||||
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
|
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
|
||||||
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
|
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
|
||||||
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
|
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
|
||||||
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
|
|
||||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
|
||||||
<uses-permission android:name="android.telecom.action.CONFIGURE_PHONE_ACCOUNT" />
|
|
||||||
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
@ -64,12 +56,6 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name=".activities.CallActivity"
|
|
||||||
android:label="@string/ongoing_call"
|
|
||||||
android:screenOrientation="portrait"
|
|
||||||
android:showOnLockScreen="true"/>
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".activities.SettingsActivity"
|
android:name=".activities.SettingsActivity"
|
||||||
android:label="@string/settings"
|
android:label="@string/settings"
|
||||||
@ -225,41 +211,6 @@
|
|||||||
android:label="@string/frequently_asked_questions"
|
android:label="@string/frequently_asked_questions"
|
||||||
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
|
android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
|
||||||
|
|
||||||
<activity
|
|
||||||
android:name=".activities.DialerActivity"
|
|
||||||
android:label="@string/dialer"
|
|
||||||
android:theme="@style/Theme.Transparent">
|
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.intent.action.CALL"/>
|
|
||||||
<category android:name="android.intent.category.DEFAULT"/>
|
|
||||||
|
|
||||||
<data android:scheme="tel"/>
|
|
||||||
</intent-filter>
|
|
||||||
</activity>
|
|
||||||
|
|
||||||
<service
|
|
||||||
android:name=".services.CallService"
|
|
||||||
android:permission="android.permission.BIND_INCALL_SERVICE">
|
|
||||||
<meta-data
|
|
||||||
android:name="android.telecom.IN_CALL_SERVICE_UI"
|
|
||||||
android:value="true" />
|
|
||||||
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.telecom.InCallService"/>
|
|
||||||
</intent-filter>
|
|
||||||
</service>
|
|
||||||
|
|
||||||
<receiver
|
|
||||||
android:name=".receivers.CallActionReceiver"
|
|
||||||
android:enabled="true"
|
|
||||||
android:exported="true">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="com.simplemobiletools.contacts.action.ACCEPT_CALL" />
|
|
||||||
<action android:name="com.simplemobiletools.contacts.action.DECLINE_CALL" />
|
|
||||||
</intent-filter>
|
|
||||||
</receiver>
|
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="androidx.core.content.FileProvider"
|
android:name="androidx.core.content.FileProvider"
|
||||||
android:authorities="${applicationId}.provider"
|
android:authorities="${applicationId}.provider"
|
||||||
|
@ -1,407 +0,0 @@
|
|||||||
package com.simplemobiletools.contacts.pro.activities
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.*
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import android.graphics.*
|
|
||||||
import android.media.AudioManager
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.os.Handler
|
|
||||||
import android.os.PowerManager
|
|
||||||
import android.provider.MediaStore
|
|
||||||
import android.telecom.Call
|
|
||||||
import android.util.Size
|
|
||||||
import android.view.WindowManager
|
|
||||||
import android.widget.RemoteViews
|
|
||||||
import androidx.core.app.NotificationCompat
|
|
||||||
import com.simplemobiletools.commons.extensions.*
|
|
||||||
import com.simplemobiletools.commons.helpers.MINUTE_SECONDS
|
|
||||||
import com.simplemobiletools.commons.helpers.isOreoMr1Plus
|
|
||||||
import com.simplemobiletools.commons.helpers.isOreoPlus
|
|
||||||
import com.simplemobiletools.commons.helpers.isQPlus
|
|
||||||
import com.simplemobiletools.contacts.pro.R
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.addCharacter
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.audioManager
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.config
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.startCallIntent
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.ACCEPT_CALL
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.CallManager
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.DECLINE_CALL
|
|
||||||
import com.simplemobiletools.contacts.pro.models.CallContact
|
|
||||||
import com.simplemobiletools.contacts.pro.receivers.CallActionReceiver
|
|
||||||
import kotlinx.android.synthetic.main.activity_call.*
|
|
||||||
import kotlinx.android.synthetic.main.dialpad.*
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class CallActivity : SimpleActivity() {
|
|
||||||
private val CALL_NOTIFICATION_ID = 1
|
|
||||||
|
|
||||||
private var isSpeakerOn = false
|
|
||||||
private var isMicrophoneOn = true
|
|
||||||
private var isCallEnded = false
|
|
||||||
private var callDuration = 0
|
|
||||||
private var callContact: CallContact? = null
|
|
||||||
private var callContactAvatar: Bitmap? = null
|
|
||||||
private var proximityWakeLock: PowerManager.WakeLock? = null
|
|
||||||
private var callTimer = Timer()
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
supportActionBar?.hide()
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setContentView(R.layout.activity_call)
|
|
||||||
|
|
||||||
updateTextColors(call_holder)
|
|
||||||
initButtons()
|
|
||||||
|
|
||||||
audioManager.mode = AudioManager.MODE_IN_CALL
|
|
||||||
CallManager.getCallContact(applicationContext) { contact ->
|
|
||||||
callContact = contact
|
|
||||||
callContactAvatar = getCallContactAvatar()
|
|
||||||
runOnUiThread {
|
|
||||||
setupNotification()
|
|
||||||
updateOtherPersonsInfo()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addLockScreenFlags()
|
|
||||||
initProximitySensor()
|
|
||||||
|
|
||||||
CallManager.registerCallback(callCallback)
|
|
||||||
updateCallState(CallManager.getState())
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onDestroy() {
|
|
||||||
super.onDestroy()
|
|
||||||
notificationManager.cancel(CALL_NOTIFICATION_ID)
|
|
||||||
CallManager.unregisterCallback(callCallback)
|
|
||||||
callTimer.cancel()
|
|
||||||
if (proximityWakeLock?.isHeld == true) {
|
|
||||||
proximityWakeLock!!.release()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CallManager.getState() == Call.STATE_DIALING) {
|
|
||||||
endCall()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onBackPressed() {
|
|
||||||
if (dialpad_wrapper.isVisible()) {
|
|
||||||
dialpad_wrapper.beGone()
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
super.onBackPressed()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CallManager.getState() == Call.STATE_DIALING) {
|
|
||||||
endCall()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initButtons() {
|
|
||||||
call_decline.setOnClickListener {
|
|
||||||
endCall()
|
|
||||||
}
|
|
||||||
|
|
||||||
call_accept.setOnClickListener {
|
|
||||||
acceptCall()
|
|
||||||
}
|
|
||||||
|
|
||||||
call_toggle_microphone.setOnClickListener {
|
|
||||||
toggleMicrophone()
|
|
||||||
}
|
|
||||||
|
|
||||||
call_toggle_speaker.setOnClickListener {
|
|
||||||
toggleSpeaker()
|
|
||||||
}
|
|
||||||
|
|
||||||
call_dialpad.setOnClickListener {
|
|
||||||
toggleDialpadVisibility()
|
|
||||||
}
|
|
||||||
|
|
||||||
dialpad_close.setOnClickListener {
|
|
||||||
dialpad_wrapper.beGone()
|
|
||||||
}
|
|
||||||
|
|
||||||
call_end.setOnClickListener {
|
|
||||||
endCall()
|
|
||||||
}
|
|
||||||
|
|
||||||
dialpad_0_holder.setOnClickListener { dialpadPressed('0') }
|
|
||||||
dialpad_1.setOnClickListener { dialpadPressed('1') }
|
|
||||||
dialpad_2.setOnClickListener { dialpadPressed('2') }
|
|
||||||
dialpad_3.setOnClickListener { dialpadPressed('3') }
|
|
||||||
dialpad_4.setOnClickListener { dialpadPressed('4') }
|
|
||||||
dialpad_5.setOnClickListener { dialpadPressed('5') }
|
|
||||||
dialpad_6.setOnClickListener { dialpadPressed('6') }
|
|
||||||
dialpad_7.setOnClickListener { dialpadPressed('7') }
|
|
||||||
dialpad_8.setOnClickListener { dialpadPressed('8') }
|
|
||||||
dialpad_9.setOnClickListener { dialpadPressed('9') }
|
|
||||||
|
|
||||||
dialpad_0_holder.setOnLongClickListener { dialpadPressed('+'); true }
|
|
||||||
dialpad_asterisk.setOnClickListener { dialpadPressed('*') }
|
|
||||||
dialpad_hashtag.setOnClickListener { dialpadPressed('#') }
|
|
||||||
|
|
||||||
dialpad_wrapper.setBackgroundColor(config.backgroundColor)
|
|
||||||
arrayOf(call_toggle_microphone, call_toggle_speaker, call_dialpad, dialpad_close).forEach {
|
|
||||||
it.applyColorFilter(config.textColor)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun dialpadPressed(char: Char) {
|
|
||||||
CallManager.keypad(char)
|
|
||||||
dialpad_input.addCharacter(char)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun toggleSpeaker() {
|
|
||||||
isSpeakerOn = !isSpeakerOn
|
|
||||||
val drawable = if (isSpeakerOn) R.drawable.ic_speaker_on_vector else R.drawable.ic_speaker_off_vector
|
|
||||||
call_toggle_speaker.setImageDrawable(getDrawable(drawable))
|
|
||||||
audioManager.isSpeakerphoneOn = isSpeakerOn
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun toggleMicrophone() {
|
|
||||||
isMicrophoneOn = !isMicrophoneOn
|
|
||||||
val drawable = if (isMicrophoneOn) R.drawable.ic_microphone_vector else R.drawable.ic_microphone_off_vector
|
|
||||||
call_toggle_microphone.setImageDrawable(getDrawable(drawable))
|
|
||||||
audioManager.isMicrophoneMute = !isMicrophoneOn
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun toggleDialpadVisibility() {
|
|
||||||
if (dialpad_wrapper.isVisible()) {
|
|
||||||
dialpad_wrapper.beGone()
|
|
||||||
} else {
|
|
||||||
dialpad_wrapper.beVisible()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateOtherPersonsInfo() {
|
|
||||||
if (callContact == null) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
caller_name_label.text = if (callContact!!.name.isNotEmpty()) callContact!!.name else getString(R.string.unknown_caller)
|
|
||||||
|
|
||||||
if (callContactAvatar != null) {
|
|
||||||
caller_avatar.setImageBitmap(callContactAvatar)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun updateCallState(state: Int) {
|
|
||||||
when (state) {
|
|
||||||
Call.STATE_RINGING -> callRinging()
|
|
||||||
Call.STATE_ACTIVE -> callStarted()
|
|
||||||
Call.STATE_DISCONNECTED -> endCall()
|
|
||||||
Call.STATE_CONNECTING, Call.STATE_DIALING -> initOutgoingCallUI()
|
|
||||||
Call.STATE_SELECT_PHONE_ACCOUNT -> showPhoneAccountPicker()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state == Call.STATE_DISCONNECTED || state == Call.STATE_DISCONNECTING) {
|
|
||||||
callTimer.cancel()
|
|
||||||
}
|
|
||||||
|
|
||||||
val statusTextId = when (state) {
|
|
||||||
Call.STATE_RINGING -> R.string.is_calling
|
|
||||||
Call.STATE_DIALING -> R.string.dialing
|
|
||||||
else -> 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if (statusTextId != 0) {
|
|
||||||
call_status_label.text = getString(statusTextId)
|
|
||||||
}
|
|
||||||
|
|
||||||
setupNotification()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun acceptCall() {
|
|
||||||
CallManager.accept()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initOutgoingCallUI() {
|
|
||||||
incoming_call_holder.beGone()
|
|
||||||
ongoing_call_holder.beVisible()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun callRinging() {
|
|
||||||
incoming_call_holder.beVisible()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun callStarted() {
|
|
||||||
incoming_call_holder.beGone()
|
|
||||||
ongoing_call_holder.beVisible()
|
|
||||||
callTimer.scheduleAtFixedRate(getCallTimerUpdateTask(), 1000, 1000)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun showPhoneAccountPicker() {
|
|
||||||
if (callContact == null || callContact!!.number.isEmpty()) {
|
|
||||||
toast(R.string.unknown_error_occurred)
|
|
||||||
} else {
|
|
||||||
startCallIntent(callContact!!.number)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun endCall() {
|
|
||||||
CallManager.reject()
|
|
||||||
if (proximityWakeLock?.isHeld == true) {
|
|
||||||
proximityWakeLock!!.release()
|
|
||||||
}
|
|
||||||
|
|
||||||
audioManager.mode = AudioManager.MODE_NORMAL
|
|
||||||
if (isCallEnded) {
|
|
||||||
finish()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
isCallEnded = true
|
|
||||||
if (callDuration > 0) {
|
|
||||||
runOnUiThread {
|
|
||||||
call_status_label.text = "${callDuration.getFormattedDuration()} (${getString(R.string.call_ended)})"
|
|
||||||
Handler().postDelayed({
|
|
||||||
finish()
|
|
||||||
}, 3000)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
call_status_label.text = getString(R.string.call_ended)
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCallTimerUpdateTask() = object : TimerTask() {
|
|
||||||
override fun run() {
|
|
||||||
callDuration++
|
|
||||||
runOnUiThread {
|
|
||||||
if (!isCallEnded) {
|
|
||||||
call_status_label.text = callDuration.getFormattedDuration()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
private val callCallback = object : Call.Callback() {
|
|
||||||
override fun onStateChanged(call: Call, state: Int) {
|
|
||||||
super.onStateChanged(call, state)
|
|
||||||
updateCallState(state)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
private fun addLockScreenFlags() {
|
|
||||||
if (isOreoMr1Plus()) {
|
|
||||||
setShowWhenLocked(true)
|
|
||||||
setTurnScreenOn(true)
|
|
||||||
} else {
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isOreoPlus()) {
|
|
||||||
(getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager).requestDismissKeyguard(this, null)
|
|
||||||
} else {
|
|
||||||
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initProximitySensor() {
|
|
||||||
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
|
|
||||||
proximityWakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "com.simplemobiletools.contacts.pro:wake_lock")
|
|
||||||
proximityWakeLock!!.acquire(10 * MINUTE_SECONDS * 1000L)
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
private fun setupNotification() {
|
|
||||||
val callState = CallManager.getState()
|
|
||||||
val channelId = "simple_contacts_call"
|
|
||||||
if (isOreoPlus()) {
|
|
||||||
val importance = NotificationManager.IMPORTANCE_DEFAULT
|
|
||||||
val name = "call_notification_channel"
|
|
||||||
|
|
||||||
NotificationChannel(channelId, name, importance).apply {
|
|
||||||
setSound(null, null)
|
|
||||||
notificationManager.createNotificationChannel(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val openAppIntent = Intent(this, CallActivity::class.java)
|
|
||||||
openAppIntent.flags = Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT
|
|
||||||
val openAppPendingIntent = PendingIntent.getActivity(this, 0, openAppIntent, 0)
|
|
||||||
|
|
||||||
val acceptCallIntent = Intent(this, CallActionReceiver::class.java)
|
|
||||||
acceptCallIntent.action = ACCEPT_CALL
|
|
||||||
val acceptPendingIntent = PendingIntent.getBroadcast(this, 0, acceptCallIntent, PendingIntent.FLAG_CANCEL_CURRENT)
|
|
||||||
|
|
||||||
val declineCallIntent = Intent(this, CallActionReceiver::class.java)
|
|
||||||
declineCallIntent.action = DECLINE_CALL
|
|
||||||
val declinePendingIntent = PendingIntent.getBroadcast(this, 1, declineCallIntent, PendingIntent.FLAG_CANCEL_CURRENT)
|
|
||||||
|
|
||||||
val callerName = if (callContact != null && callContact!!.name.isNotEmpty()) callContact!!.name else getString(R.string.unknown_caller)
|
|
||||||
val contentTextId = when (callState) {
|
|
||||||
Call.STATE_RINGING -> R.string.is_calling
|
|
||||||
Call.STATE_DIALING -> R.string.dialing
|
|
||||||
Call.STATE_DISCONNECTED -> R.string.call_ended
|
|
||||||
Call.STATE_DISCONNECTING -> R.string.call_ending
|
|
||||||
else -> R.string.ongoing_call
|
|
||||||
}
|
|
||||||
|
|
||||||
val collapsedView = RemoteViews(packageName, R.layout.call_notification).apply {
|
|
||||||
setText(R.id.notification_caller_name, callerName)
|
|
||||||
setText(R.id.notification_call_status, getString(contentTextId))
|
|
||||||
setVisibleIf(R.id.notification_accept_call, callState == Call.STATE_RINGING)
|
|
||||||
|
|
||||||
setOnClickPendingIntent(R.id.notification_decline_call, declinePendingIntent)
|
|
||||||
setOnClickPendingIntent(R.id.notification_accept_call, acceptPendingIntent)
|
|
||||||
|
|
||||||
if (callContactAvatar != null) {
|
|
||||||
setImageViewBitmap(R.id.notification_thumbnail, getCircularBitmap(callContactAvatar!!))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val builder = NotificationCompat.Builder(this, channelId)
|
|
||||||
.setSmallIcon(R.drawable.ic_phone_vector)
|
|
||||||
.setContentIntent(openAppPendingIntent)
|
|
||||||
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
|
|
||||||
.setCategory(Notification.CATEGORY_CALL)
|
|
||||||
.setCustomContentView(collapsedView)
|
|
||||||
.setOngoing(true)
|
|
||||||
.setSound(null)
|
|
||||||
.setUsesChronometer(callState == Call.STATE_ACTIVE)
|
|
||||||
.setChannelId(channelId)
|
|
||||||
.setStyle(NotificationCompat.DecoratedCustomViewStyle())
|
|
||||||
|
|
||||||
val notification = builder.build()
|
|
||||||
notificationManager.notify(CALL_NOTIFICATION_ID, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
private fun getCallContactAvatar(): Bitmap? {
|
|
||||||
var bitmap: Bitmap? = null
|
|
||||||
if (callContact?.photoUri?.isNotEmpty() == true) {
|
|
||||||
val photoUri = Uri.parse(callContact!!.photoUri)
|
|
||||||
bitmap = if (isQPlus()) {
|
|
||||||
val tmbSize = resources.getDimension(R.dimen.contact_icons_size).toInt()
|
|
||||||
contentResolver.loadThumbnail(photoUri, Size(tmbSize, tmbSize), null)
|
|
||||||
} else {
|
|
||||||
MediaStore.Images.Media.getBitmap(contentResolver, photoUri)
|
|
||||||
}
|
|
||||||
|
|
||||||
bitmap = getCircularBitmap(bitmap!!)
|
|
||||||
}
|
|
||||||
|
|
||||||
return bitmap
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCircularBitmap(bitmap: Bitmap): Bitmap {
|
|
||||||
val output = Bitmap.createBitmap(bitmap.width, bitmap.width, Bitmap.Config.ARGB_8888)
|
|
||||||
val canvas = Canvas(output)
|
|
||||||
val paint = Paint()
|
|
||||||
val rect = Rect(0, 0, bitmap.width, bitmap.height)
|
|
||||||
val radius = bitmap.width / 2.toFloat()
|
|
||||||
|
|
||||||
paint.isAntiAlias = true
|
|
||||||
canvas.drawARGB(0, 0, 0, 0)
|
|
||||||
canvas.drawCircle(radius, radius, radius, paint)
|
|
||||||
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
|
|
||||||
canvas.drawBitmap(bitmap, rect, rect, paint)
|
|
||||||
return output
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
package com.simplemobiletools.contacts.pro.activities
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Intent
|
|
||||||
import android.net.Uri
|
|
||||||
import android.os.Bundle
|
|
||||||
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.REQUEST_CODE_SET_DEFAULT_DIALER
|
|
||||||
import com.simplemobiletools.contacts.pro.R
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.getHandleToUse
|
|
||||||
|
|
||||||
class DialerActivity : SimpleActivity() {
|
|
||||||
private var callNumber: Uri? = null
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
|
|
||||||
if (intent.action == Intent.ACTION_CALL && intent.data != null) {
|
|
||||||
callNumber = intent.data
|
|
||||||
|
|
||||||
// make sure Simple Contacts is the default Phone app before initiating an outgoing call
|
|
||||||
if (!isDefaultDialer()) {
|
|
||||||
launchSetDefaultDialerIntent()
|
|
||||||
} else {
|
|
||||||
initOutgoingCall()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
toast(R.string.unknown_error_occurred)
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
|
||||||
updateMenuItemColors(menu)
|
|
||||||
return super.onCreateOptionsMenu(menu)
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("MissingPermission")
|
|
||||||
private fun initOutgoingCall() {
|
|
||||||
try {
|
|
||||||
getHandleToUse(intent, callNumber.toString()) { handle ->
|
|
||||||
Bundle().apply {
|
|
||||||
putParcelable(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE, handle)
|
|
||||||
putBoolean(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, false)
|
|
||||||
putBoolean(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, false)
|
|
||||||
telecomManager.placeCall(callNumber, this)
|
|
||||||
}
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
showErrorToast(e)
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
|
|
||||||
super.onActivityResult(requestCode, resultCode, resultData)
|
|
||||||
if (requestCode == REQUEST_CODE_SET_DEFAULT_DIALER) {
|
|
||||||
if (!isDefaultDialer()) {
|
|
||||||
finish()
|
|
||||||
} else {
|
|
||||||
initOutgoingCall()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,47 +0,0 @@
|
|||||||
package com.simplemobiletools.contacts.pro.dialogs
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.telecom.PhoneAccountHandle
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.RadioButton
|
|
||||||
import android.widget.RadioGroup
|
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
|
||||||
import com.simplemobiletools.commons.extensions.setupDialogStuff
|
|
||||||
import com.simplemobiletools.contacts.pro.R
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.config
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.getAvailableSIMCardLabels
|
|
||||||
import kotlinx.android.synthetic.main.dialog_select_sim.view.*
|
|
||||||
|
|
||||||
@SuppressLint("MissingPermission")
|
|
||||||
class SelectSIMDialog(val activity: BaseSimpleActivity, val phoneNumber: String, val callback: (handle: PhoneAccountHandle) -> Unit) {
|
|
||||||
private var dialog: AlertDialog? = null
|
|
||||||
private val view = activity.layoutInflater.inflate(R.layout.dialog_select_sim, null)
|
|
||||||
|
|
||||||
init {
|
|
||||||
val radioGroup = view.select_sim_radio_group
|
|
||||||
|
|
||||||
activity.getAvailableSIMCardLabels().forEachIndexed { index, SIMAccount ->
|
|
||||||
val radioButton = (activity.layoutInflater.inflate(R.layout.radio_button, null) as RadioButton).apply {
|
|
||||||
text = SIMAccount.label
|
|
||||||
id = index
|
|
||||||
setOnClickListener { selectedSIM(SIMAccount.handle, SIMAccount.label) }
|
|
||||||
}
|
|
||||||
radioGroup!!.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
|
|
||||||
}
|
|
||||||
|
|
||||||
dialog = AlertDialog.Builder(activity)
|
|
||||||
.create().apply {
|
|
||||||
activity.setupDialogStuff(view, this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun selectedSIM(handle: PhoneAccountHandle, label: String) {
|
|
||||||
if (view.select_sim_remember.isChecked) {
|
|
||||||
activity.config.saveCustomSIM(phoneNumber, label)
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(handle)
|
|
||||||
dialog?.dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +1,18 @@
|
|||||||
package com.simplemobiletools.contacts.pro.extensions
|
package com.simplemobiletools.contacts.pro.extensions
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Intent
|
|
||||||
import android.net.Uri
|
|
||||||
import android.telecom.PhoneAccount
|
|
||||||
import android.telecom.PhoneAccountHandle
|
|
||||||
import android.telecom.TelecomManager
|
|
||||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
|
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
|
||||||
import com.simplemobiletools.commons.extensions.*
|
import com.simplemobiletools.commons.extensions.*
|
||||||
import com.simplemobiletools.commons.helpers.PERMISSION_READ_PHONE_STATE
|
|
||||||
import com.simplemobiletools.commons.models.RadioItem
|
import com.simplemobiletools.commons.models.RadioItem
|
||||||
import com.simplemobiletools.contacts.pro.BuildConfig
|
import com.simplemobiletools.contacts.pro.BuildConfig
|
||||||
import com.simplemobiletools.contacts.pro.R
|
import com.simplemobiletools.contacts.pro.R
|
||||||
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
|
import com.simplemobiletools.contacts.pro.activities.SimpleActivity
|
||||||
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
|
import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog
|
||||||
import com.simplemobiletools.contacts.pro.dialogs.SelectSIMDialog
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.*
|
import com.simplemobiletools.contacts.pro.helpers.*
|
||||||
import com.simplemobiletools.contacts.pro.models.Contact
|
import com.simplemobiletools.contacts.pro.models.Contact
|
||||||
|
|
||||||
fun SimpleActivity.startCallIntent(recipient: String) {
|
fun SimpleActivity.startCallIntent(recipient: String) {
|
||||||
if (isDefaultDialer()) {
|
launchCallIntent(recipient, null)
|
||||||
getHandleToUse(null, recipient) { handle ->
|
|
||||||
launchCallIntent(recipient, handle)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
launchCallIntent(recipient, null)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun SimpleActivity.tryStartCall(contact: Contact) {
|
fun SimpleActivity.tryStartCall(contact: Contact) {
|
||||||
@ -110,28 +96,3 @@ fun SimpleActivity.callContact(contact: Contact) {
|
|||||||
toast(R.string.no_phone_number_found)
|
toast(R.string.no_phone_number_found)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// used at devices with multiple SIM cards
|
|
||||||
@SuppressLint("MissingPermission")
|
|
||||||
fun SimpleActivity.getHandleToUse(intent: Intent?, phoneNumber: String, callback: (PhoneAccountHandle) -> Unit) {
|
|
||||||
handlePermission(PERMISSION_READ_PHONE_STATE) {
|
|
||||||
if (it) {
|
|
||||||
val defaultHandle = telecomManager.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL)
|
|
||||||
when {
|
|
||||||
intent?.hasExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE) == true -> callback(intent.getParcelableExtra(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE)!!)
|
|
||||||
config.getCustomSIM(phoneNumber)?.isNotEmpty() == true -> {
|
|
||||||
val storedLabel = Uri.decode(config.getCustomSIM(phoneNumber))
|
|
||||||
val availableSIMs = getAvailableSIMCardLabels()
|
|
||||||
val firstornull = availableSIMs.firstOrNull { it.label == storedLabel }?.handle ?: availableSIMs.first().handle
|
|
||||||
callback(firstornull)
|
|
||||||
}
|
|
||||||
defaultHandle != null -> callback(defaultHandle)
|
|
||||||
else -> {
|
|
||||||
SelectSIMDialog(this, phoneNumber) { handle ->
|
|
||||||
callback(handle)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package com.simplemobiletools.contacts.pro.extensions
|
package com.simplemobiletools.contacts.pro.extensions
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Context.AUDIO_SERVICE
|
import android.content.Context.AUDIO_SERVICE
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
@ -13,7 +12,6 @@ import android.provider.ContactsContract
|
|||||||
import androidx.core.content.FileProvider
|
import androidx.core.content.FileProvider
|
||||||
import com.simplemobiletools.commons.extensions.getIntValue
|
import com.simplemobiletools.commons.extensions.getIntValue
|
||||||
import com.simplemobiletools.commons.extensions.hasPermission
|
import com.simplemobiletools.commons.extensions.hasPermission
|
||||||
import com.simplemobiletools.commons.extensions.telecomManager
|
|
||||||
import com.simplemobiletools.commons.extensions.toast
|
import com.simplemobiletools.commons.extensions.toast
|
||||||
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
|
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
|
||||||
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
|
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
|
||||||
@ -29,7 +27,6 @@ import com.simplemobiletools.contacts.pro.interfaces.GroupsDao
|
|||||||
import com.simplemobiletools.contacts.pro.models.Contact
|
import com.simplemobiletools.contacts.pro.models.Contact
|
||||||
import com.simplemobiletools.contacts.pro.models.ContactSource
|
import com.simplemobiletools.contacts.pro.models.ContactSource
|
||||||
import com.simplemobiletools.contacts.pro.models.Organization
|
import com.simplemobiletools.contacts.pro.models.Organization
|
||||||
import com.simplemobiletools.contacts.pro.models.SIMAccount
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
val Context.config: Config get() = Config.newInstance(applicationContext)
|
val Context.config: Config get() = Config.newInstance(applicationContext)
|
||||||
@ -330,20 +327,3 @@ fun Context.getAllContactSources(): ArrayList<ContactSource> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden))
|
fun Context.getPrivateContactSource() = ContactSource(SMT_PRIVATE, SMT_PRIVATE, getString(R.string.phone_storage_hidden))
|
||||||
|
|
||||||
@SuppressLint("MissingPermission")
|
|
||||||
fun Context.getAvailableSIMCardLabels(): ArrayList<SIMAccount> {
|
|
||||||
val SIMAccounts = ArrayList<SIMAccount>()
|
|
||||||
telecomManager.callCapablePhoneAccounts.forEach { account ->
|
|
||||||
val phoneAccount = telecomManager.getPhoneAccount(account)
|
|
||||||
var label = phoneAccount.label.toString()
|
|
||||||
var address = phoneAccount.address.toString()
|
|
||||||
if (address.startsWith("tel:") && address.substringAfter("tel:").isNotEmpty()) {
|
|
||||||
address = Uri.decode(address.substringAfter("tel:"))
|
|
||||||
label += " ($address)"
|
|
||||||
}
|
|
||||||
val SIM = SIMAccount(phoneAccount.accountHandle, label)
|
|
||||||
SIMAccounts.add(SIM)
|
|
||||||
}
|
|
||||||
return SIMAccounts
|
|
||||||
}
|
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
package com.simplemobiletools.contacts.pro.helpers
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.content.Context
|
|
||||||
import android.net.Uri
|
|
||||||
import android.telecom.Call
|
|
||||||
import android.telecom.VideoProfile
|
|
||||||
import com.simplemobiletools.commons.helpers.SimpleContactsHelper
|
|
||||||
import com.simplemobiletools.commons.helpers.ensureBackgroundThread
|
|
||||||
import com.simplemobiletools.contacts.pro.extensions.contactsDB
|
|
||||||
import com.simplemobiletools.contacts.pro.models.CallContact
|
|
||||||
|
|
||||||
// inspired by https://github.com/Chooloo/call_manage
|
|
||||||
@SuppressLint("NewApi")
|
|
||||||
class CallManager {
|
|
||||||
companion object {
|
|
||||||
var call: Call? = null
|
|
||||||
|
|
||||||
fun accept() {
|
|
||||||
call?.answer(VideoProfile.STATE_AUDIO_ONLY)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun reject() {
|
|
||||||
if (call != null) {
|
|
||||||
if (call!!.state == Call.STATE_RINGING) {
|
|
||||||
call!!.reject(false, null)
|
|
||||||
} else {
|
|
||||||
call!!.disconnect()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun registerCallback(callback: Call.Callback) {
|
|
||||||
if (call != null) {
|
|
||||||
call!!.registerCallback(callback)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun unregisterCallback(callback: Call.Callback) {
|
|
||||||
call?.unregisterCallback(callback)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getState() = if (call == null) {
|
|
||||||
Call.STATE_DISCONNECTED
|
|
||||||
} else {
|
|
||||||
call!!.state
|
|
||||||
}
|
|
||||||
|
|
||||||
fun keypad(c: Char) {
|
|
||||||
call?.playDtmfTone(c)
|
|
||||||
call?.stopDtmfTone()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getCallContact(context: Context, callback: (CallContact?) -> Unit) {
|
|
||||||
val callContact = CallContact("", "", "")
|
|
||||||
if (call == null || call!!.details == null || call!!.details!!.handle == null) {
|
|
||||||
callback(callContact)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val uri = Uri.decode(call!!.details.handle.toString())
|
|
||||||
if (uri.startsWith("tel:")) {
|
|
||||||
val number = uri.substringAfter("tel:")
|
|
||||||
callContact.number = number
|
|
||||||
callContact.name = SimpleContactsHelper(context).getNameFromPhoneNumber(number)
|
|
||||||
callContact.photoUri = SimpleContactsHelper(context).getPhotoUriFromPhoneNumber(number)
|
|
||||||
|
|
||||||
if (callContact.name == callContact.number) {
|
|
||||||
ensureBackgroundThread {
|
|
||||||
val localContact = context.contactsDB.getContactWithNumber("%$number%")
|
|
||||||
if (localContact != null) {
|
|
||||||
val storedGroups = ContactsHelper(context).getStoredGroupsSync()
|
|
||||||
val newContact = LocalContactsHelper(context).convertLocalContactToContact(localContact, storedGroups)
|
|
||||||
callContact.name = newContact!!.getNameToDisplay()
|
|
||||||
callContact.photoUri = newContact.photoUri
|
|
||||||
}
|
|
||||||
|
|
||||||
callback(callContact)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
callback(callContact)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -35,10 +35,6 @@ const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number"
|
|||||||
const val FIRST_CONTACT_ID = 1000000
|
const val FIRST_CONTACT_ID = 1000000
|
||||||
const val FIRST_GROUP_ID = 10000L
|
const val FIRST_GROUP_ID = 10000L
|
||||||
|
|
||||||
private const val PATH = "com.simplemobiletools.contacts.action."
|
|
||||||
const val ACCEPT_CALL = PATH + "accept_call"
|
|
||||||
const val DECLINE_CALL = PATH + "decline_call"
|
|
||||||
|
|
||||||
// extras used at third party intents
|
// extras used at third party intents
|
||||||
const val KEY_NAME = "name"
|
const val KEY_NAME = "name"
|
||||||
const val KEY_EMAIL = "email"
|
const val KEY_EMAIL = "email"
|
||||||
|
@ -1,5 +0,0 @@
|
|||||||
package com.simplemobiletools.contacts.pro.models
|
|
||||||
|
|
||||||
import android.telecom.PhoneAccountHandle
|
|
||||||
|
|
||||||
data class SIMAccount(val handle: PhoneAccountHandle, val label: String)
|
|
@ -1,17 +0,0 @@
|
|||||||
package com.simplemobiletools.contacts.pro.receivers
|
|
||||||
|
|
||||||
import android.content.BroadcastReceiver
|
|
||||||
import android.content.Context
|
|
||||||
import android.content.Intent
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.ACCEPT_CALL
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.CallManager
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.DECLINE_CALL
|
|
||||||
|
|
||||||
class CallActionReceiver : BroadcastReceiver() {
|
|
||||||
override fun onReceive(context: Context, intent: Intent) {
|
|
||||||
when (intent.action) {
|
|
||||||
ACCEPT_CALL -> CallManager.accept()
|
|
||||||
DECLINE_CALL -> CallManager.reject()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
package com.simplemobiletools.contacts.pro.services
|
|
||||||
|
|
||||||
import android.content.Intent
|
|
||||||
import android.telecom.Call
|
|
||||||
import android.telecom.InCallService
|
|
||||||
import com.simplemobiletools.contacts.pro.activities.CallActivity
|
|
||||||
import com.simplemobiletools.contacts.pro.helpers.CallManager
|
|
||||||
|
|
||||||
class CallService : InCallService() {
|
|
||||||
override fun onCallAdded(call: Call) {
|
|
||||||
super.onCallAdded(call)
|
|
||||||
val intent = Intent(this, CallActivity::class.java)
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
||||||
startActivity(intent)
|
|
||||||
CallManager.call = call
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCallRemoved(call: Call) {
|
|
||||||
super.onCallRemoved(call)
|
|
||||||
CallManager.call = null
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,202 +0,0 @@
|
|||||||
<?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:id="@+id/call_holder"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/caller_avatar"
|
|
||||||
android:layout_width="@dimen/incoming_call_button_size"
|
|
||||||
android:layout_height="@dimen/incoming_call_button_size"
|
|
||||||
android:contentDescription="@string/accept"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0.2"
|
|
||||||
tools:src="@drawable/ic_call_accept" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/caller_name_label"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/normal_margin"
|
|
||||||
android:textSize="@dimen/caller_name_text_size"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/caller_avatar"
|
|
||||||
tools:text="Caller name" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/call_status_label"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/normal_margin"
|
|
||||||
android:alpha="0.8"
|
|
||||||
android:textSize="@dimen/call_status_text_size"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/caller_name_label"
|
|
||||||
tools:text="Is Calling" />
|
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
android:id="@+id/ongoing_call_holder"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:visibility="gone">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/call_toggle_microphone"
|
|
||||||
android:layout_width="@dimen/dialpad_button_size"
|
|
||||||
android:layout_height="@dimen/dialpad_button_size"
|
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
|
||||||
android:padding="@dimen/medium_margin"
|
|
||||||
android:src="@drawable/ic_microphone_vector"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.15"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0.75" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/call_toggle_speaker"
|
|
||||||
android:layout_width="@dimen/dialpad_button_size"
|
|
||||||
android:layout_height="@dimen/dialpad_button_size"
|
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
|
||||||
android:padding="@dimen/medium_margin"
|
|
||||||
android:src="@drawable/ic_speaker_off_vector"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0.75" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/call_dialpad"
|
|
||||||
android:layout_width="@dimen/dialpad_button_size"
|
|
||||||
android:layout_height="@dimen/dialpad_button_size"
|
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
|
||||||
android:padding="@dimen/medium_margin"
|
|
||||||
android:src="@drawable/ic_dialpad_vector"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.85"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0.75" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/call_end"
|
|
||||||
android:layout_width="@dimen/dialpad_button_size"
|
|
||||||
android:layout_height="@dimen/dialpad_button_size"
|
|
||||||
android:contentDescription="@string/decline"
|
|
||||||
android:src="@drawable/ic_call_decline"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0.9" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
android:id="@+id/incoming_call_holder"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:visibility="gone">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/call_decline"
|
|
||||||
android:layout_width="@dimen/incoming_call_button_size"
|
|
||||||
android:layout_height="@dimen/incoming_call_button_size"
|
|
||||||
android:contentDescription="@string/decline"
|
|
||||||
android:src="@drawable/ic_call_decline"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.15"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0.85" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/call_decline_label"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/normal_margin"
|
|
||||||
android:text="@string/decline"
|
|
||||||
android:textSize="@dimen/big_text_size"
|
|
||||||
app:layout_constraintEnd_toEndOf="@+id/call_decline"
|
|
||||||
app:layout_constraintStart_toStartOf="@+id/call_decline"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/call_decline" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/call_accept"
|
|
||||||
android:layout_width="@dimen/incoming_call_button_size"
|
|
||||||
android:layout_height="@dimen/incoming_call_button_size"
|
|
||||||
android:contentDescription="@string/accept"
|
|
||||||
android:src="@drawable/ic_call_accept"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.85"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:layout_constraintVertical_bias="0.85" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/call_accept_label"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/normal_margin"
|
|
||||||
android:text="@string/accept"
|
|
||||||
android:textSize="@dimen/big_text_size"
|
|
||||||
app:layout_constraintEnd_toEndOf="@+id/call_accept"
|
|
||||||
app:layout_constraintStart_toStartOf="@+id/call_accept"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/call_accept" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:id="@+id/dialpad_wrapper"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="0dp"
|
|
||||||
android:layout_marginBottom="@dimen/activity_margin"
|
|
||||||
android:visibility="gone"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/call_status_label">
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyEditText
|
|
||||||
android:id="@+id/dialpad_input"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_above="@+id/dialpad_include"
|
|
||||||
android:layout_marginStart="@dimen/dialpad_button_size"
|
|
||||||
android:layout_marginEnd="@dimen/medium_margin"
|
|
||||||
android:layout_toStartOf="@+id/dialpad_close"
|
|
||||||
android:gravity="center"
|
|
||||||
android:inputType="phone"
|
|
||||||
android:textCursorDrawable="@null"
|
|
||||||
android:textSize="@dimen/dialpad_text_size" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/dialpad_close"
|
|
||||||
android:layout_width="@dimen/normal_icon_size"
|
|
||||||
android:layout_height="@dimen/normal_icon_size"
|
|
||||||
android:layout_alignTop="@+id/dialpad_input"
|
|
||||||
android:layout_alignBottom="@+id/dialpad_input"
|
|
||||||
android:layout_alignParentEnd="true"
|
|
||||||
android:layout_centerVertical="true"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
|
||||||
android:padding="@dimen/medium_margin"
|
|
||||||
android:src="@drawable/ic_cross_vector" />
|
|
||||||
|
|
||||||
<include
|
|
||||||
android:id="@+id/dialpad_include"
|
|
||||||
layout="@layout/dialpad" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:id="@+id/notification_holder"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/notification_caller_name"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="@color/md_grey_black"
|
|
||||||
android:textSize="@dimen/bigger_text_size"
|
|
||||||
android:textStyle="bold"
|
|
||||||
tools:text="Caller name" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/notification_call_status"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_below="@+id/notification_caller_name"
|
|
||||||
android:alpha="0.8"
|
|
||||||
android:textColor="@color/md_grey_black"
|
|
||||||
tools:text="123 456 789" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/notification_thumbnail"
|
|
||||||
android:layout_width="@dimen/contact_icons_size"
|
|
||||||
android:layout_height="@dimen/contact_icons_size"
|
|
||||||
android:layout_alignParentTop="true"
|
|
||||||
android:layout_alignParentEnd="true" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/notification_actions_holder"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_below="@+id/notification_call_status"
|
|
||||||
android:layout_marginTop="@dimen/activity_margin"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/notification_decline_call"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="@dimen/call_notification_button_size"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:background="@drawable/ripple_background"
|
|
||||||
android:src="@drawable/ic_phone_down_red_vector" />
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/notification_accept_call"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="@dimen/call_notification_button_size"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:background="@drawable/ripple_background"
|
|
||||||
android:src="@drawable/ic_phone_green_vector" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</RelativeLayout>
|
|
@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@+id/select_sim_holder"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="@dimen/activity_margin">
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/select_sim_label"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingStart="@dimen/small_margin"
|
|
||||||
android:paddingBottom="@dimen/activity_margin"
|
|
||||||
android:text="@string/select_sim"
|
|
||||||
android:textSize="@dimen/normal_text_size" />
|
|
||||||
|
|
||||||
<RadioGroup
|
|
||||||
android:id="@+id/select_sim_radio_group"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="@dimen/small_margin" />
|
|
||||||
|
|
||||||
<include layout="@layout/divider" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyAppCompatCheckbox
|
|
||||||
android:id="@+id/select_sim_remember"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/small_margin"
|
|
||||||
android:paddingTop="@dimen/activity_margin"
|
|
||||||
android:paddingBottom="@dimen/activity_margin"
|
|
||||||
android:text="@string/always_use_this_sim" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
@ -1,269 +0,0 @@
|
|||||||
<?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:id="@+id/dialpad_holder"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentBottom="true"
|
|
||||||
android:focusableInTouchMode="true"
|
|
||||||
android:paddingBottom="@dimen/normal_margin"
|
|
||||||
tools:ignore="HardcodedText">
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_1"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="@dimen/activity_margin"
|
|
||||||
android:text="1"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_4"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_2"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_2"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="2"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_5"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_3"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_1" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_2_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="ABC"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_5"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_3"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_1" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_3"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:text="3"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_6"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_2" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_3_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:text="DEF"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_6"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_2" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_4"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="@dimen/activity_margin"
|
|
||||||
android:text="4"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_7"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_5"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_4_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="@dimen/activity_margin"
|
|
||||||
android:text="GHI"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_7"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_5"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_5"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="5"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_8"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_6"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_4" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_5_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="JKL"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_8"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_6"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_4" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_6"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:text="6"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_9"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_5" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_6_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:text="MNO"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_9"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_5" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_7"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="@dimen/activity_margin"
|
|
||||||
android:text="7"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_asterisk"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_8"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_7_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="@dimen/activity_margin"
|
|
||||||
android:text="PQRS"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_asterisk"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_8"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_8"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="8"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_0_holder"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_9"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_7" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_8_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="TUV"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_0_holder"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_9"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_7" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_9"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:text="9"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_hashtag"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_8" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_9_letters"
|
|
||||||
style="@style/DialpadLetterStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:text="WXYZ"
|
|
||||||
app:layout_constraintBottom_toTopOf="@+id/dialpad_hashtag"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_8" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_asterisk"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginStart="@dimen/activity_margin"
|
|
||||||
android:text="*"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_0_holder"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@+id/dialpad_7" />
|
|
||||||
|
|
||||||
<RelativeLayout
|
|
||||||
android:id="@+id/dialpad_0_holder"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
|
||||||
app:layout_constraintEnd_toStartOf="@+id/dialpad_hashtag"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_asterisk"
|
|
||||||
app:layout_constraintTop_toTopOf="@+id/dialpad_asterisk">
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_0"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:text="0" />
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_plus"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignTop="@+id/dialpad_0"
|
|
||||||
android:layout_alignBottom="@+id/dialpad_0"
|
|
||||||
android:layout_centerHorizontal="true"
|
|
||||||
android:layout_toEndOf="@+id/dialpad_0"
|
|
||||||
android:gravity="center"
|
|
||||||
android:paddingStart="@dimen/small_margin"
|
|
||||||
android:paddingTop="@dimen/small_margin"
|
|
||||||
android:text="+"
|
|
||||||
android:textSize="@dimen/actionbar_text_size" />
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
<com.simplemobiletools.commons.views.MyTextView
|
|
||||||
android:id="@+id/dialpad_hashtag"
|
|
||||||
style="@style/DialpadNumberStyle"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginEnd="@dimen/activity_margin"
|
|
||||||
android:text="#"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintHorizontal_bias="0.5"
|
|
||||||
app:layout_constraintStart_toEndOf="@+id/dialpad_0_holder"
|
|
||||||
app:layout_constraintTop_toTopOf="@+id/dialpad_0_holder" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
Reference in New Issue
Block a user