@@ -41,6 +41,7 @@ import autodagger.AutoInjector
4141import com.bluelinelabs.logansquare.LoganSquare
4242import com.nextcloud.talk.BuildConfig
4343import com.nextcloud.talk.R
44+ import com.nextcloud.talk.activities.CallActivity
4445import com.nextcloud.talk.activities.MainActivity
4546import com.nextcloud.talk.api.NcApi
4647import com.nextcloud.talk.application.NextcloudTalkApplication
@@ -57,6 +58,7 @@ import com.nextcloud.talk.models.json.participants.Participant
5758import com.nextcloud.talk.models.json.participants.ParticipantsOverall
5859import com.nextcloud.talk.models.json.push.DecryptedPushMessage
5960import com.nextcloud.talk.models.json.push.NotificationUser
61+ import com.nextcloud.talk.receivers.DeclineCallReceiver
6062import com.nextcloud.talk.receivers.DirectReplyReceiver
6163import com.nextcloud.talk.receivers.DismissRecordingAvailableReceiver
6264import com.nextcloud.talk.receivers.MarkAsReadReceiver
@@ -90,7 +92,6 @@ import com.nextcloud.talk.utils.bundle.BundleKeys.KEY_OPENED_VIA_NOTIFICATION
9092import com.nextcloud.talk.utils.preferences.AppPreferences
9193import io.reactivex.Observable
9294import io.reactivex.Observer
93- import io.reactivex.android.schedulers.AndroidSchedulers
9495import io.reactivex.disposables.Disposable
9596import io.reactivex.schedulers.Schedulers
9697import okhttp3.JavaNetCookieJar
@@ -261,11 +262,64 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
261262 }
262263 )
263264
265+ val pendingIntentFlags = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
266+ PendingIntent .FLAG_IMMUTABLE or PendingIntent .FLAG_UPDATE_CURRENT
267+ } else {
268+ PendingIntent .FLAG_UPDATE_CURRENT
269+ }
270+
271+ val answerVoiceBundle = Bundle (bundle).apply { putBoolean(BundleKeys .KEY_CALL_VOICE_ONLY , true ) }
272+ val answerVoicePendingIntent = PendingIntent .getActivity(
273+ applicationContext,
274+ requestCode + ANSWER_VOICE_REQUEST_OFFSET ,
275+ Intent (applicationContext, CallActivity ::class .java).apply {
276+ putExtras(answerVoiceBundle)
277+ addFlags(Intent .FLAG_ACTIVITY_NEW_TASK )
278+ },
279+ pendingIntentFlags
280+ )
281+
282+ val answerVideoBundle = Bundle (bundle).apply { putBoolean(BundleKeys .KEY_CALL_VOICE_ONLY , false ) }
283+ val answerVideoPendingIntent = PendingIntent .getActivity(
284+ applicationContext,
285+ requestCode + ANSWER_VIDEO_REQUEST_OFFSET ,
286+ Intent (applicationContext, CallActivity ::class .java).apply {
287+ putExtras(answerVideoBundle)
288+ addFlags(Intent .FLAG_ACTIVITY_NEW_TASK )
289+ },
290+ pendingIntentFlags
291+ )
292+
293+ val declinePendingIntent = PendingIntent .getBroadcast(
294+ applicationContext,
295+ requestCode + DECLINE_CALL_REQUEST_OFFSET ,
296+ Intent (applicationContext, DeclineCallReceiver ::class .java).apply {
297+ putExtra(KEY_NOTIFICATION_TIMESTAMP , pushMessage.timestamp.toInt())
298+ },
299+ pendingIntentFlags
300+ )
301+
264302 val soundUri = getCallRingtoneUri(applicationContext, appPreferences)
265303 val notificationChannelId = NotificationUtils .NotificationChannels .NOTIFICATION_CHANNEL_CALLS_V4 .name
266304 val uri = signatureVerification.user!! .baseUrl!! .toUri()
267305 val baseUrl = uri.host
268306
307+ val callerPersonBuilder = Person .Builder ()
308+ .setName(conversation.displayName)
309+ .setImportant(true )
310+ if (conversation.type == ConversationEnums .ConversationType .ROOM_TYPE_ONE_TO_ONE_CALL ) {
311+ val avatarUrl = ApiUtils .getUrlForAvatar(
312+ signatureVerification.user!! .baseUrl!! ,
313+ conversation.name,
314+ false
315+ )
316+ loadAvatarSync(avatarUrl, applicationContext)?.let { callerPersonBuilder.setIcon(it) }
317+ }
318+ val callerPerson = callerPersonBuilder.build()
319+
320+ val isVideoCall = (conversation.callFlag and Participant .InCallFlags .WITH_VIDEO ) > 0
321+ val primaryAnswerIntent = if (isVideoCall) answerVideoPendingIntent else answerVoicePendingIntent
322+
269323 val notification =
270324 NotificationCompat .Builder (applicationContext, notificationChannelId)
271325 .setPriority(NotificationCompat .PRIORITY_HIGH )
@@ -282,6 +336,11 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
282336 .setContentIntent(fullScreenPendingIntent)
283337 .setFullScreenIntent(fullScreenPendingIntent, true )
284338 .setSound(soundUri)
339+ .setStyle(
340+ NotificationCompat .CallStyle
341+ .forIncomingCall(callerPerson, declinePendingIntent, primaryAnswerIntent)
342+ .setIsVideo(isVideoCall)
343+ )
285344 .build()
286345 notification.flags = notification.flags or Notification .FLAG_INSISTENT
287346
@@ -292,7 +351,7 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
292351
293352 chatNetworkDataSource?.getRoom(userBeingCalled, roomToken = pushMessage.id!! )
294353 ?.subscribeOn(Schedulers .io())
295- ?.observeOn(AndroidSchedulers .mainThread ())
354+ ?.observeOn(Schedulers .io ())
296355 ?.subscribe(object : Observer <ConversationModel > {
297356 override fun onSubscribe (d : Disposable ) {
298357 // unused atm
@@ -1037,5 +1096,8 @@ class NotificationWorker(context: Context, workerParams: WorkerParameters) : Wor
10371096 private const val TIMER_COUNT = 12
10381097 private const val TIMER_DELAY : Long = 5
10391098 private const val LINEBREAK : String = " \n "
1099+ private const val ANSWER_VOICE_REQUEST_OFFSET = 1
1100+ private const val ANSWER_VIDEO_REQUEST_OFFSET = 2
1101+ private const val DECLINE_CALL_REQUEST_OFFSET = 3
10401102 }
10411103}
0 commit comments