Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DEV-3000 Android - Ringtone - Stops ringing after first play of ringtone; Stops when sliding down notification bar #275

Open
wants to merge 17 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
added voip call feature via fcm, fix trampoline issue, minor classes …
…refactoring
pppetrv committed Feb 15, 2024
commit d0c5cc7e1b9bc8af975bc678df4ac4ff16fb5da1
18 changes: 17 additions & 1 deletion plugin.xml
Original file line number Diff line number Diff line change
@@ -33,11 +33,17 @@
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
<uses-permission android:name="${applicationId}.permission.PushHandlerActivity"/>
<permission android:name="${applicationId}.permission.PushHandlerActivity" android:protectionLevel="signature"></permission>
</config-file>

<config-file target="AndroidManifest.xml" parent="/manifest/application">
<activity android:exported="true" android:launchMode="singleTop" android:showOnLockScreen="true" android:name="com.adobe.phonegap.push.IncomingCallActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity android:exported="true" android:name="com.adobe.phonegap.push.IncomingCallActionHandlerActivity" />
<activity android:name="com.adobe.phonegap.push.PushHandlerActivity" android:exported="true" android:permission="${applicationId}.permission.PushHandlerActivity"/>
<activity android:name="com.adobe.phonegap.push.BackgroundHandlerActivity" android:exported="true" android:permission="${applicationId}.permission.BackgroundHandlerActivity">
<intent-filter>
@@ -71,14 +77,24 @@
<framework src="androidx.core:core:$ANDROIDX_CORE_VERSION" />
<framework src="me.leolin:ShortcutBadger:1.1.22@aar"/>
<framework src="com.google.firebase:firebase-messaging:$FCM_VERSION"/>

<!-- Resources -->
<resource-file src="src/android/res/layout/activity_incoming_call.xml" target="res/layout/activity_incoming_call.xml" />
<resource-file src="src/android/res/drawable/circle_animation_avd.xml" target="res/drawable/circle_animation_avd.xml" />
<resource-file src="src/android/res/drawable/ic_accept.xml" target="res/drawable/ic_accept.xml" />
<resource-file src="src/android/res/drawable/ic_decline.xml" target="res/drawable/ic_decline.xml" />
<resource-file src="src/android/res/drawable/ic_trusted_care_logo_lang.xml" target="res/drawable/ic_trusted_care_logo_lang.xml" />
<resource-file src="src/android/res/font/nunito_regular.ttf" target="res/font/nunito_regular.ttf" />
<source-file src="src/android/com/adobe/phonegap/push/FCMService.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/IncomingCallActivity.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/OnNotificationReceiverActivity.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/PushConstants.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/PushHandlerActivity.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/BackgroundHandlerActivity.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/PushPlugin.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/BackgroundActionButtonHandler.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/PushDismissedHandler.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/IncomingCallActionHandlerActivity.kt" target-dir="java/com/adobe/phonegap/push/"/>
<source-file src="src/android/com/adobe/phonegap/push/IncomingCallHelper.kt" target-dir="java/com/adobe/phonegap/push/"/>
</platform>

<platform name="browser">
287 changes: 249 additions & 38 deletions src/android/com/adobe/phonegap/push/FCMService.kt
100644 → 100755

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.adobe.phonegap.push

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log

class IncomingCallActionHandlerActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(LOG_TAG, "onCreate()")
handleNotification(this, intent)
finish()
}

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
Log.d(LOG_TAG, "onNewIntent()")
handleNotification(this, intent)
finish()
}

companion object {
private const val LOG_TAG = "Push_IncomingCallActionHandlerActivity"

private fun handleNotification(context: Context, intent: Intent) {
val voipStatus = intent.getStringExtra(IncomingCallHelper.EXTRA_BUTTON_ACTION) ?: return
IncomingCallHelper.handleActionCall(context, intent, voipStatus)
}
}
}
217 changes: 217 additions & 0 deletions src/android/com/adobe/phonegap/push/IncomingCallActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,217 @@
package com.adobe.phonegap.push

import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.app.KeyguardManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.WindowManager
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.vectordrawable.graphics.drawable.Animatable2Compat
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
import com.trusted.care.staging.R

private const val POST_NOTIFICATIONS_REQUEST_CODE = 8234

class IncomingCallActivity : Activity() {

var caller: String = ""

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
showWhenLockedAndTurnScreenOn()
setContentView(
resources.getIdentifier("activity_incoming_call", "layout", packageName)
)

instance = this

caller = intent?.extras?.getString("caller") ?: ""
(findViewById<TextView>(R.id.tvCaller)).text = caller
val btnAccept: Button = findViewById(R.id.btnAccept)
val btnDecline: Button = findViewById(R.id.btnDecline)
btnAccept.setOnClickListener { v -> requestPhoneUnlock() }
btnDecline.setOnClickListener { v -> declineIncomingVoIP() }

val animatedCircle: ImageView = findViewById(R.id.ivAnimatedCircle)
val drawableCompat = AnimatedVectorDrawableCompat.create(this, R.drawable.circle_animation_avd)
animatedCircle.setImageDrawable(drawableCompat)
drawableCompat?.registerAnimationCallback(object : Animatable2Compat.AnimationCallback() {
private val fHandler = Handler(Looper.getMainLooper())
override fun onAnimationEnd(drawable: Drawable?) {
super.onAnimationEnd(drawable)
if (instance != null) {
fHandler.post(drawableCompat::start)
}
}
})
drawableCompat?.start()
}

private fun showWhenLockedAndTurnScreenOn() {
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true)
setTurnScreenOn(true)
} else {
window.addFlags(
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
or WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
)
}
}

override fun onBackPressed() {
// Do nothing on back button
}

private fun requestPhoneUnlock() {
val km = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
val context = this.applicationContext
if (km.isKeyguardLocked) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
km.requestDismissKeyguard(this, object : KeyguardManager.KeyguardDismissCallback() {
override fun onDismissSucceeded() {
super.onDismissSucceeded()
acceptIncomingVoIP()
}

override fun onDismissCancelled() {
super.onDismissCancelled()
}

override fun onDismissError() {
super.onDismissError()
}
})
} else {
acceptIncomingVoIP()
if (km.isKeyguardSecure) {
// Register receiver for dismissing "Unlock Screen" notification
phoneUnlockBR = PhoneUnlockBroadcastReceiver()
val filter = IntentFilter()
filter.addAction(Intent.ACTION_USER_PRESENT)
phoneUnlockBR?.apply {
context?.registerReceiver(this as BroadcastReceiver, filter)
}
showUnlockScreenNotification()
} else {
val myLock: KeyguardManager.KeyguardLock = km.newKeyguardLock("AnswerCall")
myLock?.disableKeyguard()
}
}
} else {
acceptIncomingVoIP()
}
}

fun acceptIncomingVoIP() {
Log.d("IC", "acceptIncomingVoIP")
IncomingCallHelper.handleActionCall(applicationContext, intent, VOIP_ACCEPT)
}

private fun declineIncomingVoIP() {
Log.d("IC", "declineIncomingVoIP")
IncomingCallHelper.handleActionCall(applicationContext, intent, VOIP_DECLINE)
}

@SuppressLint("MissingPermission")
private fun showUnlockScreenNotification() {
val notificationBuilder = NotificationCompat.Builder(this, PushConstants.DEFAULT_CHANNEL_ID)
.setSmallIcon(resources.getIdentifier("pushicon", "drawable", packageName))
.setContentTitle("Ongoing call with $caller")
.setContentText("Please unlock your device to continue")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setAutoCancel(false)
.setOngoing(true)
.setStyle(NotificationCompat.BigTextStyle())
.setSound(null)
val ongoingCallNotification = notificationBuilder.build()
val notificationManager = NotificationManagerCompat.from(this.applicationContext)
// Display notification
if (!isPostNotificationsGranted()) {
requestPostNotifications()
} else {
notificationManager.notify(NOTIFICATION_MESSAGE_ID, ongoingCallNotification)
}
}

private fun isPostNotificationsGranted(): Boolean {
return ActivityCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS
) == PackageManager.PERMISSION_GRANTED
}

private fun requestPostNotifications() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissions(
arrayOf(Manifest.permission.POST_NOTIFICATIONS),
POST_NOTIFICATIONS_REQUEST_CODE
)
}
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode == POST_NOTIFICATIONS_REQUEST_CODE &&
grantResults.getOrNull(0) == PackageManager.PERMISSION_GRANTED
) {
showUnlockScreenNotification()
}
}

override fun onDestroy() {
super.onDestroy()
instance = null
}

class PhoneUnlockBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action.equals(Intent.ACTION_USER_PRESENT)) {
dismissUnlockScreenNotification(context.applicationContext)
}
}
}

companion object {

const val VOIP_CONNECTED = "connected"
const val VOIP_ACCEPT = "pickup"
const val VOIP_DECLINE = "declined_callee"
private const val NOTIFICATION_MESSAGE_ID = 1337

var instance: IncomingCallActivity? = null

var phoneUnlockBR: PhoneUnlockBroadcastReceiver? = null
fun dismissUnlockScreenNotification(applicationContext: Context) {
NotificationManagerCompat.from(applicationContext).cancel(NOTIFICATION_MESSAGE_ID)
if (phoneUnlockBR != null) {
applicationContext.unregisterReceiver(phoneUnlockBR)
phoneUnlockBR = null
}
}
}
}
73 changes: 73 additions & 0 deletions src/android/com/adobe/phonegap/push/IncomingCallHelper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.adobe.phonegap.push

import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.core.app.NotificationManagerCompat
import okhttp3.Call
import okhttp3.Callback
import okhttp3.HttpUrl
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.io.IOException

object IncomingCallHelper {

const val EXTRA_BUTTON_ACTION = "extra_button_action"
const val EXTRA_CALLBACK_URL = "extra_callback_url"
const val EXTRA_CALL_ID = "extra_call_id"

fun updateWebhookVOIPStatus(url: String?, callId: String?, status: String, callback: ((Boolean) -> Unit)? = null) {

val client = OkHttpClient()
val urlBuilder = HttpUrl.parse(url)?.newBuilder()
urlBuilder?.addQueryParameter("id", callId)
urlBuilder?.addQueryParameter("input", status)
val urlBuilt: String = urlBuilder?.build().toString()
val request = Request.Builder().url(urlBuilt).build()
client.newCall(request)
.enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.d("", "Update For CallId $callId and Status $status failed")
callback?.invoke(false)
}
override fun onResponse(call: Call, response: Response) {
Log.d("", "Update For CallId $callId and Status $status successful")
callback?.invoke(true)
}
})
}

fun dismissVOIPNotification(context: Context) {
NotificationManagerCompat.from(context).cancel(FCMService.VOIP_NOTIFICATION_ID)
IncomingCallActivity.instance?.finish()
}

fun handleActionCall(context: Context, intent: Intent, voipStatus: String) {
val callbackUrl = intent.getStringExtra(EXTRA_CALLBACK_URL)
val callId = intent.getStringExtra(EXTRA_CALL_ID)

// Handle actiontest
dismissVOIPNotification(context)

// Update Webhook status to CONNECTED
updateWebhookVOIPStatus(callbackUrl, callId, voipStatus) { result ->
if (result) { checkRedirectIfNext(context, voipStatus) }
}
}

private fun checkRedirectIfNext(context: Context, voipStatus: String) {
// Start cordova activity on answer
if (voipStatus == IncomingCallActivity.VOIP_ACCEPT) {
context.startActivity(intentForLaunchActivity(context))
}
}

// VoIP implementation
private fun intentForLaunchActivity(context: Context): Intent? {
val pm = context.packageManager
val packageName = context.packageName
return pm?.getLaunchIntentForPackage(packageName)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.adobe.phonegap.push

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log

class OnNotificationReceiverActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(LOG_TAG, "OnNotificationReceiverActivity.onCreate()")
handleNotification(this, getIntent())
finish()
}

override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
Log.d(LOG_TAG, "OnNotificationReceiverActivity.onNewIntent()")
handleNotification(this, intent)
finish()
}

companion object {
private const val LOG_TAG = "Push_OnNotificationReceiverActivity"
private fun handleNotification(context: Context, intent: Intent) {
try {
val pm = context.packageManager
val launchIntent = pm.getLaunchIntentForPackage(context.getPackageName())
launchIntent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
val data = intent.extras
if (data?.containsKey("messageType") == false ) { data?.putString("messageType", "notification") }
data?.putString("tap", if (PushPlugin.isInBackground) "background" else "foreground")
Log.d(LOG_TAG, "OnNotificationReceiverActivity.handleNotification(): " + data.toString())
PushPlugin.sendExtras(data)
data?.apply {
launchIntent?.putExtras(data)
}
context.startActivity(launchIntent)
} catch (e: Exception) {
Log.e(LOG_TAG, e.localizedMessage, e)
}
}
}
}
1,612 changes: 810 additions & 802 deletions src/android/com/adobe/phonegap/push/PushPlugin.kt

Large diffs are not rendered by default.

170 changes: 170 additions & 0 deletions src/android/res/drawable/circle_animation_avd.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<animated-vector
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr
name="android:drawable">
<vector
android:width="500dp"
android:height="500dp"
android:viewportWidth="500"
android:viewportHeight="500">
<group
android:name="Circle_t"
android:translateX="250"
android:translateY="250"
android:scaleX="1"
android:scaleY="1">
<path
android:name="Circle_p"
android:fillColor="#96b7db"
android:strokeWidth="1"
android:pathData="M0,-250C138.071,-250,250,-138.071,250,0C250,138.071,138.071,250,0,250C-138.071,250,-250,138.071,-250,0C-250,-138.071,-138.071,-250,0,-250z"/>
</group>
<group
android:name="ring_t"
android:translateX="250"
android:translateY="250"
android:scaleX="0"
android:scaleY="0">
<path
android:name="ring_p"
android:strokeColor="#96b7db"
android:strokeWidth="10"
android:strokeAlpha="0"
android:pathData="M0,-250C138.071,-250,250,-138.071,250,0C250,138.071,138.071,250,0,250C-138.071,250,-250,138.071,-250,0C-250,-138.071,-138.071,-250,0,-250z"/>
</group>
</vector>
</aapt:attr>
<target
android:name="Circle_t">
<aapt:attr
name="android:animation">
<set>
<objectAnimator
android:propertyName="scaleX"
android:duration="1500"
android:valueFrom="0.8"
android:valueTo="0"
android:valueType="floatType">
<aapt:attr
name="android:interpolator">
<pathInterpolator
android:pathData="M0,0 C0.215,0.61 0.355,1 1,1"/>
</aapt:attr>
</objectAnimator>
<objectAnimator
android:propertyName="scaleX"
android:duration="1200"
android:valueFrom="0"
android:valueTo="0"
android:startOffset="1500"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
<objectAnimator
android:propertyName="scaleY"
android:duration="1500"
android:valueFrom="0.8"
android:valueTo="0"
android:valueType="floatType">
<aapt:attr
name="android:interpolator">
<pathInterpolator
android:pathData="M0,0 C0.215,0.61 0.355,1 1,1"/>
</aapt:attr>
</objectAnimator>
<objectAnimator
android:propertyName="scaleY"
android:duration="1200"
android:valueFrom="0"
android:valueTo="0"
android:startOffset="1500"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
</set>
</aapt:attr>
</target>
<target
android:name="Circle_p">
<aapt:attr
name="android:animation">
<set>
<objectAnimator
android:propertyName="fillAlpha"
android:duration="100"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
<objectAnimator
android:propertyName="fillAlpha"
android:duration="1200"
android:valueFrom="1"
android:valueTo="1"
android:startOffset="1500"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
</set>
</aapt:attr>
</target>
<target
android:name="ring_t">
<aapt:attr
name="android:animation">
<set>
<objectAnimator
android:propertyName="scaleX"
android:duration="1200"
android:valueFrom="0"
android:valueTo="0"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
<objectAnimator
android:propertyName="scaleX"
android:duration="1500"
android:valueFrom="0"
android:valueTo="1"
android:startOffset="1200"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
<objectAnimator
android:propertyName="scaleY"
android:duration="1200"
android:valueFrom="0"
android:valueTo="0"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
<objectAnimator
android:propertyName="scaleY"
android:duration="1500"
android:valueFrom="0"
android:valueTo="1"
android:startOffset="1200"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
</set>
</aapt:attr>
</target>
<target
android:name="ring_p">
<aapt:attr
name="android:animation">
<set>
<objectAnimator
android:propertyName="strokeAlpha"
android:duration="1200"
android:valueFrom="1"
android:valueTo="1"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
<objectAnimator
android:propertyName="strokeAlpha"
android:duration="1500"
android:valueFrom="1"
android:valueTo="0"
android:startOffset="1200"
android:valueType="floatType"
android:interpolator="@android:interpolator/linear"/>
</set>
</aapt:attr>
</target>
</animated-vector>
26 changes: 26 additions & 0 deletions src/android/res/drawable/ic_accept.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="74dp"
android:height="74dp"
android:viewportWidth="74"
android:viewportHeight="74">
<path
android:pathData="M37,37m-36,0a36,36 0,1 1,72 0a36,36 0,1 1,-72 0"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#000057"
android:fillType="evenOdd"/>
<path
android:pathData="M21.5,38.5L31.5,48.5"
android:strokeWidth="3"
android:fillColor="#00000000"
android:strokeColor="#000057"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
<path
android:pathData="M53.5,26.5L31.5,48.5"
android:strokeWidth="3"
android:fillColor="#00000000"
android:strokeColor="#000057"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
</vector>
26 changes: 26 additions & 0 deletions src/android/res/drawable/ic_decline.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="74dp"
android:height="74dp"
android:viewportWidth="74"
android:viewportHeight="74">
<path
android:pathData="M37,37m-36,0a36,36 0,1 1,72 0a36,36 0,1 1,-72 0"
android:strokeWidth="2"
android:fillColor="#00000000"
android:strokeColor="#EA3939"
android:fillType="evenOdd"/>
<path
android:pathData="M24.5,23.5L50.5,50.5"
android:strokeWidth="3"
android:fillColor="#00000000"
android:strokeColor="#EA3939"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
<path
android:pathData="M51,24L24,50"
android:strokeWidth="3"
android:fillColor="#00000000"
android:strokeColor="#EA3939"
android:fillType="evenOdd"
android:strokeLineCap="round"/>
</vector>
24 changes: 24 additions & 0 deletions src/android/res/drawable/ic_trusted_care_logo_lang.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="306dp"
android:height="123dp"
android:viewportWidth="306"
android:viewportHeight="123">
<path
android:pathData="M129.146,106.046L129.146,119.286C129.146,119.797 129.146,120.173 128.931,120.468C128.69,120.764 128.233,120.951 127.669,120.951C127.078,120.951 126.622,120.764 126.38,120.468C126.165,120.173 126.165,119.797 126.165,119.286L126.165,106.046L122.029,106.046C121.573,106.046 121.25,106.046 120.955,105.831C120.686,105.644 120.498,105.294 120.498,104.73C120.498,104.166 120.686,103.844 120.955,103.656C121.25,103.441 121.573,103.414 122.029,103.414L133.309,103.414C133.738,103.414 134.061,103.441 134.356,103.656C134.625,103.844 134.813,104.166 134.813,104.73C134.813,105.294 134.625,105.644 134.356,105.831C134.061,106.046 133.738,106.046 133.309,106.046L129.146,106.046ZM141.07,113.754L141.07,119.286C141.07,119.797 141.07,120.173 140.855,120.468C140.614,120.764 140.211,120.951 139.647,120.951C139.056,120.951 138.599,120.764 138.358,120.468C138.143,120.173 138.143,119.797 138.143,119.286L138.143,105.321C138.143,104.489 138.143,103.871 139.432,103.522C140.023,103.361 140.99,103.226 142.225,103.226C143.595,103.226 145.179,103.388 146.441,104.032C148.053,104.865 148.966,106.342 148.966,108.329C148.966,110.531 147.838,112.223 145.797,113.11L150.309,119.34C150.819,120.038 150.658,120.951 149.1,120.951C147.892,120.951 147.516,120.441 146.979,119.662L144.212,115.58C143.595,114.667 143.084,113.754 143.084,113.754C143.084,113.754 142.628,113.808 141.983,113.808C141.339,113.808 141.07,113.754 141.07,113.754ZM141.07,105.858L141.07,111.364C141.07,111.364 141.419,111.391 141.876,111.391C144.32,111.391 145.904,110.666 145.904,108.49C145.904,106.342 144.373,105.751 142.494,105.751C141.715,105.751 141.07,105.858 141.07,105.858ZM161.696,118.615C163.334,118.615 164.516,118.132 165.268,117.245C166.208,116.091 166.208,114.587 166.208,113.432L166.208,104.865C166.208,104.354 166.208,103.978 166.422,103.683C166.664,103.388 167.067,103.226 167.685,103.226C168.302,103.226 168.705,103.388 168.947,103.683C169.162,103.978 169.162,104.354 169.162,104.865L169.162,113.244C169.162,114.936 169.162,117.138 167.577,118.937C166.396,120.307 164.516,121.139 161.669,121.139C158.661,121.139 156.888,120.226 155.76,118.937C154.176,117.138 154.176,115.151 154.176,113.244L154.176,104.865C154.176,104.354 154.176,103.978 154.391,103.683C154.633,103.388 155.035,103.226 155.68,103.226C156.298,103.226 156.7,103.388 156.942,103.683C157.157,103.978 157.157,104.354 157.157,104.865L157.157,113.432C157.157,114.587 157.157,116.091 158.097,117.245C158.849,118.132 160.057,118.615 161.696,118.615ZM176.493,107.604C176.493,109.564 179.152,110.263 181.005,111.391C182.536,112.331 183.798,113.727 183.798,115.983C183.798,119.286 181.113,121.086 178.105,121.086C176.896,121.086 175.419,120.764 174.372,120.173C173.647,119.77 173.083,119.206 173.083,118.561C173.083,117.917 173.593,117.138 174.291,117.138C175.204,117.138 176.037,118.561 178.024,118.561C179.636,118.561 180.817,117.648 180.817,116.117C180.817,114.613 179.689,113.861 178.561,113.271C176.977,112.438 173.512,111.203 173.512,107.765C173.512,104.945 175.822,103.065 178.964,103.065C181.247,103.065 183.449,104.113 183.449,105.294C183.449,105.885 182.912,106.691 182.214,106.691C181.381,106.691 180.549,105.59 178.937,105.59C177.46,105.59 176.493,106.422 176.493,107.604ZM194.433,106.046L194.433,119.286C194.433,119.797 194.433,120.173 194.218,120.468C193.977,120.764 193.52,120.951 192.956,120.951C192.365,120.951 191.909,120.764 191.667,120.468C191.452,120.173 191.452,119.797 191.452,119.286L191.452,106.046L187.316,106.046C186.86,106.046 186.538,106.046 186.242,105.831C185.974,105.644 185.786,105.294 185.786,104.73C185.786,104.166 185.974,103.844 186.242,103.656C186.538,103.441 186.86,103.414 187.316,103.414L198.596,103.414C199.026,103.414 199.348,103.441 199.643,103.656C199.912,103.844 200.1,104.166 200.1,104.73C200.1,105.294 199.912,105.644 199.643,105.831C199.348,106.046 199.026,106.046 198.596,106.046L194.433,106.046ZM206.357,106.046L206.357,110.182L210.09,110.182C210.52,110.182 210.842,110.209 211.138,110.424C211.406,110.612 211.594,110.934 211.594,111.498C211.594,112.062 211.406,112.411 211.138,112.599C210.842,112.814 210.52,112.814 210.09,112.814L206.357,112.814L206.357,118.158L211.782,118.158C212.212,118.158 212.534,118.185 212.83,118.4C213.098,118.588 213.286,118.91 213.286,119.474C213.286,120.038 213.098,120.388 212.83,120.576C212.534,120.79 212.212,120.79 211.782,120.79L204.854,120.79C203.779,120.79 203.43,120.361 203.43,119.367L203.43,104.838C203.43,103.79 203.833,103.414 204.854,103.414L211.084,103.414C211.514,103.414 211.836,103.441 212.132,103.656C212.4,103.844 212.588,104.166 212.588,104.73C212.588,105.294 212.4,105.644 212.132,105.831C211.836,106.046 211.514,106.046 211.084,106.046L206.357,106.046ZM232.945,111.982C232.945,115.822 231.253,117.997 229.427,119.206C227.332,120.576 224.7,120.951 222.015,120.951C220.484,120.951 219.168,120.817 218.416,120.549C217.637,120.28 217.503,119.824 217.503,118.937L217.503,105.268C217.503,104.247 217.744,103.764 219.007,103.495C219.812,103.334 221.101,103.226 222.659,103.226C225.345,103.226 227.762,103.602 229.669,104.918C231.495,106.181 232.945,108.41 232.945,111.982ZM220.484,105.912L220.484,118.32C220.484,118.32 221.289,118.427 222.525,118.427C224.781,118.427 229.883,118.105 229.883,112.143C229.883,109.591 228.943,107.98 227.735,107.04C226.526,106.1 224.969,105.751 222.767,105.751C221.316,105.751 220.484,105.912 220.484,105.912ZM239.31,119.26C239.31,120.307 238.612,121.032 237.564,121.032C236.49,121.032 235.792,120.307 235.792,119.26C235.792,118.212 236.49,117.487 237.564,117.487C238.612,117.487 239.31,118.212 239.31,119.26ZM245.218,111.901C245.218,116.386 248.065,118.481 251.046,118.481C251.932,118.481 252.792,118.293 253.571,117.97C254.618,117.541 255.048,117.111 255.558,117.111C256.31,117.111 256.74,117.997 256.74,118.561C256.74,119.125 256.31,119.555 255.665,119.958C254.403,120.737 252.631,121.113 250.992,121.113C246.319,121.113 242.157,118.051 242.157,111.982C242.157,105.912 246.346,103.038 250.992,103.038C252.738,103.038 254.43,103.441 255.665,104.193C256.364,104.623 256.74,105.026 256.74,105.59C256.74,106.154 256.31,107.094 255.558,107.094C255.048,107.094 254.537,106.664 253.49,106.234C252.711,105.912 251.932,105.67 250.885,105.67C248.065,105.67 245.218,107.416 245.218,111.901ZM271.296,119.501L269.872,115.715L263.561,115.715L262.111,119.501C261.762,120.361 261.493,120.951 260.285,120.951C259.345,120.951 258.942,120.602 258.942,120.012C258.942,119.797 258.995,119.582 259.183,119.125L265.038,104.945C265.468,103.871 265.817,103.146 266.891,103.146C267.939,103.146 268.261,103.871 268.691,104.945L274.303,119.125C274.438,119.448 274.518,119.77 274.518,120.012C274.518,120.602 274.062,120.951 273.122,120.951C272.021,120.951 271.672,120.468 271.296,119.501ZM266.757,107.523L264.555,113.136L268.905,113.136L266.757,107.523ZM280.991,113.754L280.991,119.286C280.991,119.797 280.991,120.173 280.776,120.468C280.534,120.764 280.131,120.951 279.567,120.951C278.976,120.951 278.52,120.764 278.278,120.468C278.063,120.173 278.063,119.797 278.063,119.286L278.063,105.321C278.063,104.489 278.063,103.871 279.352,103.522C279.943,103.361 280.91,103.226 282.145,103.226C283.515,103.226 285.1,103.388 286.362,104.032C287.973,104.865 288.886,106.342 288.886,108.329C288.886,110.531 287.758,112.223 285.717,113.11L290.229,119.34C290.739,120.038 290.578,120.951 289.021,120.951C287.812,120.951 287.436,120.441 286.899,119.662L284.133,115.58C283.515,114.667 283.005,113.754 283.005,113.754C283.005,113.754 282.548,113.808 281.904,113.808C281.259,113.808 280.991,113.754 280.991,113.754ZM280.991,105.858L280.991,111.364C280.991,111.364 281.34,111.391 281.796,111.391C284.24,111.391 285.825,110.666 285.825,108.49C285.825,106.342 284.294,105.751 282.414,105.751C281.635,105.751 280.991,105.858 280.991,105.858ZM297.024,106.046L297.024,110.182L300.757,110.182C301.186,110.182 301.509,110.209 301.804,110.424C302.073,110.612 302.261,110.934 302.261,111.498C302.261,112.062 302.073,112.411 301.804,112.599C301.509,112.814 301.186,112.814 300.757,112.814L297.024,112.814L297.024,118.158L302.449,118.158C302.878,118.158 303.201,118.185 303.496,118.4C303.765,118.588 303.953,118.91 303.953,119.474C303.953,120.038 303.765,120.388 303.496,120.576C303.201,120.79 302.878,120.79 302.449,120.79L295.52,120.79C294.446,120.79 294.096,120.361 294.096,119.367L294.096,104.838C294.096,103.79 294.499,103.414 295.52,103.414L301.75,103.414C302.18,103.414 302.502,103.441 302.798,103.656C303.066,103.844 303.254,104.166 303.254,104.73C303.254,105.294 303.066,105.644 302.798,105.831C302.502,106.046 302.18,106.046 301.75,106.046L297.024,106.046Z"
android:strokeWidth="1"
android:fillColor="#000057"
android:fillType="nonZero"
android:strokeColor="#00000000"/>
<path
android:pathData="M0.5,21.969C0.5,5.709 0.5,-1.111 0.5,1.51L92.808,1.51C61.722,1.51 36.523,26.184 36.523,56.622C36.523,87.059 61.722,111.734 92.808,111.734C41.827,111.734 0.5,71.545 0.5,21.969Z"
android:strokeWidth="1"
android:fillColor="#000057"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
<path
android:pathData="M90.5,56.885m-30,0a30,30 0,1 1,60 0a30,30 0,1 1,-60 0"
android:strokeWidth="1"
android:fillColor="#000057"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
</vector>
Binary file added src/android/res/font/nunito_regular.ttf
Binary file not shown.
83 changes: 83 additions & 0 deletions src/android/res/layout/activity_incoming_call.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context="com.adobe.phonegap.push.IncomingCallActivity">

<ImageView
android:layout_width="240dp"
android:layout_height="1dp"
android:layout_gravity="center"
android:scaleType="fitEnd"
android:layout_weight="1"
android:src="@drawable/ic_trusted_care_logo_lang" />

<ImageView
android:id="@+id/ivAnimatedCircle"
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/nunito_regular"
android:gravity="center"
android:text="Eingehender Videoanruf"
android:textColor="#00054b"
android:textSize="20sp" />

<TextView
android:id="@+id/tvCaller"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/nunito_regular"
android:gravity="center"
android:text="Unknown caller"
android:textColor="#00054b"
android:textSize="20sp" />

<RelativeLayout
android:layout_width="260dp"
android:layout_height="1dp"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:layout_marginBottom="20dp"
android:layout_weight="1"
android:orientation="horizontal">

<Button
android:id="@+id/btnDecline"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:background="@android:color/transparent"
android:drawableTop="@drawable/ic_decline"
android:drawablePadding="8dp"
android:fontFamily="@font/nunito_regular"
android:text="Ablehnen"
android:textAllCaps="false"
android:textColor="#00054b" />

<Button
android:id="@+id/btnAccept"
android:layout_width="110dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:background="@android:color/transparent"
android:drawableTop="@drawable/ic_accept"
android:drawablePadding="8dp"
android:fontFamily="@font/nunito_regular"
android:text="Annehmen"
android:textAllCaps="false"
android:textColor="#00054b" />

</RelativeLayout>

</LinearLayout>