mirror of
https://github.com/SimpleMobileTools/Simple-Dialer.git
synced 2025-03-14 02:10:10 +01:00
copying some Call screen related things from Simple Contacts
This commit is contained in:
parent
d6fc7bbcbd
commit
a34307ef18
@ -8,6 +8,12 @@
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.READ_CALL_LOG" />
|
||||
<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
|
||||
android:name="android.permission.USE_FINGERPRINT"
|
||||
@ -52,6 +58,12 @@
|
||||
android:label="@string/settings"
|
||||
android:parentActivityName=".activities.MainActivity" />
|
||||
|
||||
<activity
|
||||
android:name=".activities.CallActivity"
|
||||
android:label="@string/ongoing_call"
|
||||
android:screenOrientation="portrait"
|
||||
android:showOnLockScreen="true" />
|
||||
|
||||
<activity
|
||||
android:name=".activities.DialpadActivity"
|
||||
android:label="@string/dialpad"
|
||||
@ -84,6 +96,28 @@
|
||||
</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>
|
||||
|
||||
<activity-alias
|
||||
android:name=".activities.SplashActivity.Red"
|
||||
android:enabled="false"
|
||||
|
@ -0,0 +1,407 @@
|
||||
package com.simplemobiletools.dialer.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.dialer.R
|
||||
import com.simplemobiletools.dialer.extensions.addCharacter
|
||||
import com.simplemobiletools.dialer.extensions.audioManager
|
||||
import com.simplemobiletools.dialer.extensions.config
|
||||
import com.simplemobiletools.dialer.extensions.startCallIntent
|
||||
import com.simplemobiletools.dialer.helpers.ACCEPT_CALL
|
||||
import com.simplemobiletools.dialer.helpers.CallManager
|
||||
import com.simplemobiletools.dialer.helpers.DECLINE_CALL
|
||||
import com.simplemobiletools.dialer.models.CallContact
|
||||
import com.simplemobiletools.dialer.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.list_avatar_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
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@ package com.simplemobiletools.dialer.extensions
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.media.AudioManager
|
||||
import android.net.Uri
|
||||
import com.simplemobiletools.commons.extensions.telecomManager
|
||||
import com.simplemobiletools.dialer.helpers.Config
|
||||
@ -9,6 +10,8 @@ import com.simplemobiletools.dialer.models.SIMAccount
|
||||
|
||||
val Context.config: Config get() = Config.newInstance(applicationContext)
|
||||
|
||||
val Context.audioManager: AudioManager get() = getSystemService(Context.AUDIO_SERVICE) as AudioManager
|
||||
|
||||
@SuppressLint("MissingPermission")
|
||||
fun Context.getAvailableSIMCardLabels(): ArrayList<SIMAccount> {
|
||||
val SIMAccounts = ArrayList<SIMAccount>()
|
||||
|
@ -0,0 +1,70 @@
|
||||
package com.simplemobiletools.dialer.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.dialer.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)
|
||||
|
||||
callback(callContact)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -12,3 +12,7 @@ const val ALL_TABS_MASK = CONTACTS_TAB_MASK or FAVORITES_TAB_MASK or RECENTS_TAB
|
||||
val tabsList = arrayListOf(CONTACTS_TAB_MASK, RECENTS_TAB_MASK)
|
||||
|
||||
const val KEY_PHONE = "phone"
|
||||
|
||||
private const val PATH = "com.simplemobiletools.contacts.action."
|
||||
const val ACCEPT_CALL = PATH + "accept_call"
|
||||
const val DECLINE_CALL = PATH + "decline_call"
|
||||
|
@ -0,0 +1,4 @@
|
||||
package com.simplemobiletools.dialer.models
|
||||
|
||||
// a simpler Contact model containing just info needed at the call screen
|
||||
data class CallContact(var name: String, var photoUri: String, var number: String)
|
@ -0,0 +1,17 @@
|
||||
package com.simplemobiletools.dialer.receivers
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import com.simplemobiletools.dialer.helpers.ACCEPT_CALL
|
||||
import com.simplemobiletools.dialer.helpers.CallManager
|
||||
import com.simplemobiletools.dialer.helpers.DECLINE_CALL
|
||||
|
||||
class CallActionReceiver : BroadcastReceiver() {
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
when (intent.action) {
|
||||
ACCEPT_CALL -> CallManager.accept()
|
||||
DECLINE_CALL -> CallManager.reject()
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.simplemobiletools.dialer.services
|
||||
|
||||
import android.content.Intent
|
||||
import android.telecom.Call
|
||||
import android.telecom.InCallService
|
||||
import com.simplemobiletools.dialer.activities.CallActivity
|
||||
import com.simplemobiletools.dialer.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
|
||||
}
|
||||
}
|
16
app/src/main/res/drawable/ic_call_accept.xml
Normal file
16
app/src/main/res/drawable/ic_call_accept.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/ripple_foreground">
|
||||
<item android:id="@+id/shortcut_dialpad_background">
|
||||
<shape android:shape="oval">
|
||||
<solid android:color="@color/md_green_700" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
<item
|
||||
android:bottom="@dimen/medium_margin"
|
||||
android:drawable="@drawable/ic_phone_vector"
|
||||
android:left="@dimen/medium_margin"
|
||||
android:right="@dimen/medium_margin"
|
||||
android:top="@dimen/medium_margin" />
|
||||
</ripple>
|
16
app/src/main/res/drawable/ic_call_decline.xml
Normal file
16
app/src/main/res/drawable/ic_call_decline.xml
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/ripple_foreground">
|
||||
<item android:id="@+id/shortcut_dialpad_background">
|
||||
<shape android:shape="oval">
|
||||
<solid android:color="@color/md_red_700" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
<item
|
||||
android:bottom="@dimen/medium_margin"
|
||||
android:drawable="@drawable/ic_phone_down_vector"
|
||||
android:left="@dimen/medium_margin"
|
||||
android:right="@dimen/medium_margin"
|
||||
android:top="@dimen/medium_margin" />
|
||||
</ripple>
|
9
app/src/main/res/drawable/ic_microphone_off_vector.xml
Normal file
9
app/src/main/res/drawable/ic_microphone_off_vector.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M19,11C19,11 19.0088,9.8569 18.1571,9.8714 17.362,9.885 17.3,11 17.3,11c0,0.74 -0.16,1.43 -0.43,2.05l1.23,1.23C18.66,13.3 19,12.19 19,11ZM14.98,11.17C14.98,11.11 15,11.06 15,11L15,5C15,3.34 13.66,2 12,2 10.34,2 9,3.34 9,5L9,5.18ZM4.27,3 L3,4.27l6.01,6.01 0,0.72c0,1.66 1.33,3 2.99,3 0.22,0 0.44,-0.03 0.65,-0.08l1.66,1.66C13.6,15.91 12.81,16.1 12,16.1 9.24,16.1 6.7,14 6.7,11 6.7,11 6.6686,9.9807 5.8435,9.992 5.0185,10.0033 5,11 5,11c0,3.41 2.72,6.23 6,6.72L11,21c0,0 -0.0013,1.036 1.0127,1.0169C12.9886,21.9987 13,21 13,21l0,-3.28c0.91,-0.13 1.77,-0.45 2.54,-0.9L19.73,21 21,19.73Z" />
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_phone_down_red_vector.xml
Normal file
9
app/src/main/res/drawable/ic_phone_down_red_vector.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@color/md_red_700"
|
||||
android:pathData="M23.4267,12.2343C20.4492,9.413 16.4272,7.6753 11.9951,7.6753c-4.4321,0 -8.4541,1.7377 -11.4316,4.559 -0.1757,0.1757 -0.2831,0.4198 -0.2831,0.6931 0,0.2733 0.1074,0.5174 0.2831,0.6931l2.421,2.421c0.1757,0.1757 0.4198,0.2831 0.6931,0.2831 0.2636,0 0.5076,-0.1074 0.6834,-0.2733 0.7712,-0.7224 1.6498,-1.3277 2.5968,-1.806 0.3222,-0.1562 0.5467,-0.4881 0.5467,-0.8786l0,-3.0263C8.92,9.8718 10.4332,9.6278 11.9951,9.6278c1.562,0 3.0751,0.2441 4.4906,0.7029l0,3.0263c0,0.3807 0.2245,0.7224 0.5467,0.8786 0.9567,0.4783 1.8255,1.0934 2.6065,1.806 0.1757,0.1757 0.4198,0.2733 0.6834,0.2733 0.2733,0 0.5174,-0.1074 0.6931,-0.2831l2.421,-2.421c0.1757,-0.1757 0.2831,-0.4198 0.2831,-0.6931 0,-0.2733 -0.1171,-0.5076 -0.2929,-0.6834z" />
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_phone_down_vector.xml
Normal file
9
app/src/main/res/drawable/ic_phone_down_vector.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M23.4267,12.2343C20.4492,9.413 16.4272,7.6753 11.9951,7.6753c-4.4321,0 -8.4541,1.7377 -11.4316,4.559 -0.1757,0.1757 -0.2831,0.4198 -0.2831,0.6931 0,0.2733 0.1074,0.5174 0.2831,0.6931l2.421,2.421c0.1757,0.1757 0.4198,0.2831 0.6931,0.2831 0.2636,0 0.5076,-0.1074 0.6834,-0.2733 0.7712,-0.7224 1.6498,-1.3277 2.5968,-1.806 0.3222,-0.1562 0.5467,-0.4881 0.5467,-0.8786l0,-3.0263C8.92,9.8718 10.4332,9.6278 11.9951,9.6278c1.562,0 3.0751,0.2441 4.4906,0.7029l0,3.0263c0,0.3807 0.2245,0.7224 0.5467,0.8786 0.9567,0.4783 1.8255,1.0934 2.6065,1.806 0.1757,0.1757 0.4198,0.2733 0.6834,0.2733 0.2733,0 0.5174,-0.1074 0.6931,-0.2831l2.421,-2.421c0.1757,-0.1757 0.2831,-0.4198 0.2831,-0.6931 0,-0.2733 -0.1171,-0.5076 -0.2929,-0.6834z" />
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_phone_green_vector.xml
Normal file
9
app/src/main/res/drawable/ic_phone_green_vector.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@color/md_green_700"
|
||||
android:pathData="M6.62,10.79c1.44,2.83 3.76,5.14 6.59,6.59l2.2,-2.2c0.27,-0.27 0.67,-0.36 1.02,-0.24 1.12,0.37 2.33,0.57 3.57,0.57 0.55,0 1,0.45 1,1V20c0,0.55 -0.45,1 -1,1 -9.39,0 -17,-7.61 -17,-17 0,-0.55 0.45,-1 1,-1h3.5c0.55,0 1,0.45 1,1 0,1.25 0.2,2.45 0.57,3.57 0.11,0.35 0.03,0.74 -0.25,1.02l-2.2,2.2z" />
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_speaker_off_vector.xml
Normal file
9
app/src/main/res/drawable/ic_speaker_off_vector.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v2.21l2.45,2.45c0.03,-0.2 0.05,-0.41 0.05,-0.63zM19,12c0,0.94 -0.2,1.82 -0.54,2.64l1.51,1.51C20.63,14.91 21,13.5 21,12c0,-4.28 -2.99,-7.86 -7,-8.77v2.06c2.89,0.86 5,3.54 5,6.71zM4.27,3L3,4.27 7.73,9L3,9v6h4l5,5v-6.73l4.25,4.25c-0.67,0.52 -1.42,0.93 -2.25,1.18v2.06c1.38,-0.31 2.63,-0.95 3.69,-1.81L19.73,21 21,19.73l-9,-9L4.27,3zM12,4L9.91,6.09 12,8.18L12,4z" />
|
||||
</vector>
|
9
app/src/main/res/drawable/ic_speaker_on_vector.xml
Normal file
9
app/src/main/res/drawable/ic_speaker_on_vector.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#FFFFFF"
|
||||
android:pathData="M3,9v6h4l5,5L12,4L7,9L3,9zM16.5,12c0,-1.77 -1.02,-3.29 -2.5,-4.03v8.05c1.48,-0.73 2.5,-2.25 2.5,-4.02zM14,3.23v2.06c2.89,0.86 5,3.54 5,6.71s-2.11,5.85 -5,6.71v2.06c4.01,-0.91 7,-4.49 7,-8.77s-2.99,-7.86 -7,-8.77z" />
|
||||
</vector>
|
6
app/src/main/res/drawable/ripple_background.xml
Normal file
6
app/src/main/res/drawable/ripple_background.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:color="@color/md_grey">
|
||||
<item
|
||||
android:id="@android:id/mask"
|
||||
android:drawable="@android:color/white" />
|
||||
</ripple>
|
202
app/src/main/res/layout/activity_call.xml
Normal file
202
app/src/main/res/layout/activity_call.xml
Normal file
@ -0,0 +1,202 @@
|
||||
<?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/bigger_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/bigger_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>
|
58
app/src/main/res/layout/call_notification.xml
Normal file
58
app/src/main/res/layout/call_notification.xml
Normal file
@ -0,0 +1,58 @@
|
||||
<?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/list_avatar_size"
|
||||
android:layout_height="@dimen/list_avatar_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,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<color name="ripple_foreground">#33FFFFFF</color>
|
||||
</resources>
|
||||
|
@ -1,6 +1,10 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<dimen name="dialpad_button_size">60dp</dimen>
|
||||
<dimen name="incoming_call_button_size">72dp</dimen>
|
||||
<dimen name="call_notification_button_size">30dp</dimen>
|
||||
|
||||
<dimen name="dialpad_text_size">34sp</dimen>
|
||||
<dimen name="caller_name_text_size">34sp</dimen>
|
||||
<dimen name="call_status_text_size">20sp</dimen>
|
||||
</resources>
|
||||
|
Loading…
x
Reference in New Issue
Block a user