diff --git a/android/app/build.gradle b/android/app/build.gradle index 87c532b9d3..f360f667e5 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -27,13 +27,6 @@ android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 - - // The use of desugar_jdk_libs causes warning noise at build time: - // https://github.com/zulip/zulip-flutter/pull/887#issuecomment-2287653388 - // https://issuetracker.google.com/issues/294273986 - // TODO(#351): Try removing core-library desugaring once we've - // removed flutter_local_notifications. - coreLibraryDesugaringEnabled true } kotlinOptions { @@ -103,5 +96,4 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" - coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.4" } diff --git a/android/app/src/main/kotlin/com/zulip/flutter/Notifications.g.kt b/android/app/src/main/kotlin/com/zulip/flutter/Notifications.g.kt index 5b64bead48..490c367beb 100644 --- a/android/app/src/main/kotlin/com/zulip/flutter/Notifications.g.kt +++ b/android/app/src/main/kotlin/com/zulip/flutter/Notifications.g.kt @@ -87,6 +87,40 @@ data class NotificationChannel ( } } +/** + * Corresponds to `android.content.Intent` + * + * See: + * https://developer.android.com/reference/android/content/Intent + * https://developer.android.com/reference/android/content/Intent#Intent(java.lang.String,%20android.net.Uri,%20android.content.Context,%20java.lang.Class%3C?%3E) + * + * Generated class from Pigeon that represents data sent in messages. + */ +data class AndroidIntent ( + val action: String, + val dataUrl: String, + /** A combination of flags from [IntentFlag]. */ + val flags: Long + +) { + companion object { + @Suppress("LocalVariableName") + fun fromList(__pigeon_list: List): AndroidIntent { + val action = __pigeon_list[0] as String + val dataUrl = __pigeon_list[1] as String + val flags = __pigeon_list[2].let { num -> if (num is Int) num.toLong() else num as Long } + return AndroidIntent(action, dataUrl, flags) + } + } + fun toList(): List { + return listOf( + action, + dataUrl, + flags, + ) + } +} + /** * Corresponds to `android.app.PendingIntent`. * @@ -96,11 +130,7 @@ data class NotificationChannel ( */ data class PendingIntent ( val requestCode: Long, - /** - * A value set on an extra on the Intent, and passed to - * the on-notification-opened callback. - */ - val intentPayload: String, + val intent: AndroidIntent, /** * A combination of flags from [PendingIntent.flags], and others associated * with `Intent`; see Android docs for `PendingIntent.getActivity`. @@ -112,15 +142,15 @@ data class PendingIntent ( @Suppress("LocalVariableName") fun fromList(__pigeon_list: List): PendingIntent { val requestCode = __pigeon_list[0].let { num -> if (num is Int) num.toLong() else num as Long } - val intentPayload = __pigeon_list[1] as String + val intent = __pigeon_list[1] as AndroidIntent val flags = __pigeon_list[2].let { num -> if (num is Int) num.toLong() else num as Long } - return PendingIntent(requestCode, intentPayload, flags) + return PendingIntent(requestCode, intent, flags) } } fun toList(): List { return listOf( requestCode, - intentPayload, + intent, flags, ) } @@ -325,35 +355,40 @@ private object NotificationsPigeonCodec : StandardMessageCodec() { } 130.toByte() -> { return (readValue(buffer) as? List)?.let { - PendingIntent.fromList(it) + AndroidIntent.fromList(it) } } 131.toByte() -> { return (readValue(buffer) as? List)?.let { - InboxStyle.fromList(it) + PendingIntent.fromList(it) } } 132.toByte() -> { return (readValue(buffer) as? List)?.let { - Person.fromList(it) + InboxStyle.fromList(it) } } 133.toByte() -> { return (readValue(buffer) as? List)?.let { - MessagingStyleMessage.fromList(it) + Person.fromList(it) } } 134.toByte() -> { return (readValue(buffer) as? List)?.let { - MessagingStyle.fromList(it) + MessagingStyleMessage.fromList(it) } } 135.toByte() -> { return (readValue(buffer) as? List)?.let { - Notification.fromList(it) + MessagingStyle.fromList(it) } } 136.toByte() -> { + return (readValue(buffer) as? List)?.let { + Notification.fromList(it) + } + } + 137.toByte() -> { return (readValue(buffer) as? List)?.let { StatusBarNotification.fromList(it) } @@ -367,34 +402,38 @@ private object NotificationsPigeonCodec : StandardMessageCodec() { stream.write(129) writeValue(stream, value.toList()) } - is PendingIntent -> { + is AndroidIntent -> { stream.write(130) writeValue(stream, value.toList()) } - is InboxStyle -> { + is PendingIntent -> { stream.write(131) writeValue(stream, value.toList()) } - is Person -> { + is InboxStyle -> { stream.write(132) writeValue(stream, value.toList()) } - is MessagingStyleMessage -> { + is Person -> { stream.write(133) writeValue(stream, value.toList()) } - is MessagingStyle -> { + is MessagingStyleMessage -> { stream.write(134) writeValue(stream, value.toList()) } - is Notification -> { + is MessagingStyle -> { stream.write(135) writeValue(stream, value.toList()) } - is StatusBarNotification -> { + is Notification -> { stream.write(136) writeValue(stream, value.toList()) } + is StatusBarNotification -> { + stream.write(137) + writeValue(stream, value.toList()) + } else -> super.writeValue(stream, value) } } diff --git a/android/app/src/main/kotlin/com/zulip/flutter/ZulipPlugin.kt b/android/app/src/main/kotlin/com/zulip/flutter/ZulipPlugin.kt index 4146e26e36..c0104153f4 100644 --- a/android/app/src/main/kotlin/com/zulip/flutter/ZulipPlugin.kt +++ b/android/app/src/main/kotlin/com/zulip/flutter/ZulipPlugin.kt @@ -3,6 +3,7 @@ package com.zulip.flutter import android.annotation.SuppressLint import android.content.Context import android.content.Intent +import android.net.Uri import android.os.Bundle import android.util.Log import androidx.annotation.Keep @@ -97,13 +98,14 @@ private class AndroidNotificationHost(val context: Context) contentIntent?.let { setContentIntent( android.app.PendingIntent.getActivity(context, it.requestCode.toInt(), - Intent(context, MainActivity::class.java).apply { - // This action name and extra name are special to - // FlutterLocalNotificationsPlugin, which handles receiving the Intent. - // TODO take care of receiving the notification-opened Intent ourselves - action = "SELECT_NOTIFICATION" - putExtra("payload", it.intentPayload) - }, + it.intent.let { intent -> Intent( + intent.action, + Uri.parse(intent.dataUrl), + context, + MainActivity::class.java + ).apply { + flags = intent.flags.toInt() + } }, it.flags.toInt()) ) } contentText?.let { setContentText(it) } diff --git a/android/app/src/main/res/raw/keep.xml b/android/app/src/main/res/raw/keep.xml index a88c32b2f7..2a75152d2e 100644 --- a/android/app/src/main/res/raw/keep.xml +++ b/android/app/src/main/res/raw/keep.xml @@ -1,7 +1,7 @@