From 5763242ccf8fee058bce8961fd30acd99a6f1b42 Mon Sep 17 00:00:00 2001 From: Akash Date: Mon, 28 Jun 2021 23:24:54 +0530 Subject: [PATCH] android notif [nfc]: Use compat version for notification modules. Compat version of modules allow us to write code for the latest android version without worrying about backwards compatibility, all that will be handled by the compat modules. Specifically the changes are made for: * Notification -> NotificationCompat * NotificationManager -> NotificationCompatManager Some associated code is also changed as required. reference: - https://developer.android.com/guide/topics/ui/notifiers/notifications#compatibility --- .../notifications/FCMPushNotifications.kt | 36 +++++++++---------- .../notifications/NotificationHelper.kt | 4 +-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/android/app/src/main/java/com/zulipmobile/notifications/FCMPushNotifications.kt b/android/app/src/main/java/com/zulipmobile/notifications/FCMPushNotifications.kt index 2c07177da81..c900cbea087 100644 --- a/android/app/src/main/java/com/zulipmobile/notifications/FCMPushNotifications.kt +++ b/android/app/src/main/java/com/zulipmobile/notifications/FCMPushNotifications.kt @@ -2,20 +2,20 @@ package com.zulipmobile.notifications -import android.app.Notification +import android.annotation.SuppressLint import android.app.NotificationChannel -import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.Color -import android.media.AudioAttributes import android.net.Uri import android.os.Build import android.os.Bundle import android.provider.Settings import android.text.TextUtils import android.util.Log +import androidx.core.app.NotificationManagerCompat +import androidx.core.app.NotificationCompat import com.facebook.react.ReactApplication import me.leolin.shortcutbadger.ShortcutBadger @@ -31,14 +31,19 @@ val ACTION_CLEAR = "ACTION_CLEAR" @JvmField val EXTRA_NOTIFICATION_DATA = "data" -private fun getNotificationManager(context: Context): NotificationManager { - return context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager +private fun getNotificationManager(context: Context): NotificationManagerCompat { + return NotificationManagerCompat.from(context) } fun createNotificationChannel(context: Context) { if (Build.VERSION.SDK_INT >= 26) { val name = context.getString(R.string.notification_channel_name) - val channel = NotificationChannel(CHANNEL_ID, name, NotificationManager.IMPORTANCE_HIGH) + + @SuppressLint("WrongConstant") + // Android Studio's linter demands NotificationManager.IMPORTANCE_* and rejects any other + // value, hence using "SupressLint". + val channel = + NotificationChannel(CHANNEL_ID, name, NotificationManagerCompat.IMPORTANCE_HIGH) getNotificationManager(context).createNotificationChannel(channel) } } @@ -92,11 +97,8 @@ private fun getNotificationSoundUri(context: Context): Uri { } private fun getNotificationBuilder( - context: Context, conversations: ConversationMap, fcmMessage: MessageFcmMessage): Notification.Builder { - val builder = if (Build.VERSION.SDK_INT >= 26) - Notification.Builder(context, CHANNEL_ID) - else - Notification.Builder(context) + context: Context, conversations: ConversationMap, fcmMessage: MessageFcmMessage): NotificationCompat.Builder { + val builder = NotificationCompat.Builder(context, CHANNEL_ID) val uri = Uri.fromParts("zulip", "msgid:${fcmMessage.zulipMessageId}", "") val viewIntent = Intent(Intent.ACTION_VIEW, uri, context, NotificationIntentService::class.java) @@ -133,13 +135,13 @@ private fun getNotificationBuilder( } fetchBitmap(sizedURL(context, fcmMessage.sender.avatarURL, 64f)) ?.let { builder.setLargeIcon(it) } - builder.setStyle(Notification.BigTextStyle().bigText(fcmMessage.content)) + builder.setStyle(NotificationCompat.BigTextStyle().bigText(fcmMessage.content)) } else { val numConversations = context.resources.getQuantityString( R.plurals.numConversations, conversations.size, conversations.size) builder.setContentTitle("$totalMessagesCount messages in $numConversations") builder.setContentText("Messages from ${TextUtils.join(",", nameList)}") - val inboxStyle = Notification.InboxStyle(builder) + val inboxStyle = NotificationCompat.InboxStyle(builder) inboxStyle.setSummaryText(numConversations) buildNotificationContent(conversations, inboxStyle) builder.setStyle(inboxStyle) @@ -159,18 +161,16 @@ private fun getNotificationBuilder( // TODO: choose a vibration pattern we like, and unset DEFAULT_VIBRATE. builder.setVibrate(vPattern) - builder.setDefaults(Notification.DEFAULT_VIBRATE or Notification.DEFAULT_LIGHTS) + builder.setDefaults(NotificationCompat.DEFAULT_VIBRATE or NotificationCompat.DEFAULT_LIGHTS) val dismissIntent = Intent(context, NotificationIntentService::class.java) dismissIntent.action = ACTION_CLEAR val piDismiss = PendingIntent.getService(context, 0, dismissIntent, 0) - val action = Notification.Action(android.R.drawable.ic_menu_close_clear_cancel, "Clear", piDismiss) + val action = NotificationCompat.Action(android.R.drawable.ic_menu_close_clear_cancel, "Clear", piDismiss) builder.addAction(action) val soundUri = getNotificationSoundUri(context) - val audioAttr = AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_NOTIFICATION).build() - builder.setSound(soundUri, audioAttr) + builder.setSound(soundUri) return builder } diff --git a/android/app/src/main/java/com/zulipmobile/notifications/NotificationHelper.kt b/android/app/src/main/java/com/zulipmobile/notifications/NotificationHelper.kt index 7f388eae8ea..1049248ee94 100644 --- a/android/app/src/main/java/com/zulipmobile/notifications/NotificationHelper.kt +++ b/android/app/src/main/java/com/zulipmobile/notifications/NotificationHelper.kt @@ -2,7 +2,6 @@ package com.zulipmobile.notifications -import android.app.Notification import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -12,6 +11,7 @@ import android.text.TextUtils import android.text.style.StyleSpan import android.util.Log import android.util.TypedValue +import androidx.core.app.NotificationCompat import java.io.IOException import java.io.InputStream import java.net.URL @@ -64,7 +64,7 @@ fun sizedURL(context: Context, url: URL, dpSize: Float): URL { return URL(url, "?$query") } -fun buildNotificationContent(conversations: ByConversationMap, inboxStyle: Notification.InboxStyle) { +fun buildNotificationContent(conversations: ByConversationMap, inboxStyle: NotificationCompat.InboxStyle) { for (conversation in conversations.values) { // TODO ensure latest sender is shown last? E.g. Gmail-style A, B, ..., A. val seenSenders = HashSet()