Skip to content

Commit ffad58b

Browse files
committed
Work around dumb Android 12+ notification trampoline restrictions
1 parent 8edc5e9 commit ffad58b

File tree

4 files changed

+27
-114
lines changed

4 files changed

+27
-114
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,7 @@
5151
android:value="This foreground service is required because the app\'s core functionality relies on broadcast receivers that listen to app install events, which are hosted inside of a service instead of an activity"/>
5252
</service>
5353

54-
<receiver android:name=".receivers.InstallNotificationClickedReceiver"/>
5554
<receiver android:name=".receivers.InstallNotificationDismissedReceiver"/>
56-
<receiver android:name=".receivers.UpdateNotificationClickedReceiver"/>
5755
<receiver android:name=".receivers.UpdateNotificationDismissedReceiver"/>
5856

5957
<receiver

app/src/main/java/com/farmerbb/appnotifier/NotificationController.kt

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ import android.os.Build
2828
import androidx.core.app.NotificationCompat
2929
import androidx.core.content.ContextCompat
3030
import com.farmerbb.appnotifier.models.AppUpdateInfo
31-
import com.farmerbb.appnotifier.receivers.InstallNotificationClickedReceiver
3231
import com.farmerbb.appnotifier.receivers.InstallNotificationDismissedReceiver
33-
import com.farmerbb.appnotifier.receivers.UpdateNotificationClickedReceiver
3432
import com.farmerbb.appnotifier.receivers.UpdateNotificationDismissedReceiver
3533
import com.farmerbb.appnotifier.room.AppUpdateDAO
3634
import dagger.hilt.android.qualifiers.ApplicationContext
@@ -112,15 +110,14 @@ class NotificationController @Inject constructor(
112110
val channelId = "app_updates"
113111
context.createNotificationChannel(channelId)
114112

115-
val contentIntent = Intent(context, UpdateNotificationClickedReceiver::class.java).apply {
116-
setPackage(BuildConfig.APPLICATION_ID)
113+
val pendingContentIntent = getAppUpdateContentIntent()?.let { contentIntent ->
114+
PendingIntent.getActivity(context, 0, contentIntent, FLAGS)
117115
}
118116

119117
val deleteIntent = Intent(context, UpdateNotificationDismissedReceiver::class.java).apply {
120118
setPackage(BuildConfig.APPLICATION_ID)
121119
}
122120

123-
val pendingContentIntent = PendingIntent.getBroadcast(context, 0, contentIntent, FLAGS)
124121
val pendingDeleteIntent = PendingIntent.getBroadcast(context, 0, deleteIntent, FLAGS)
125122

126123
val builder = NotificationCompat.Builder(context, channelId)
@@ -140,7 +137,7 @@ class NotificationController @Inject constructor(
140137
}
141138
})
142139
.setColor(ContextCompat.getColor(context, R.color.colorPrimary))
143-
.setAutoCancel(true)
140+
// .setAutoCancel(true)
144141
.setDeleteIntent(pendingDeleteIntent)
145142
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
146143

@@ -176,17 +173,15 @@ class NotificationController @Inject constructor(
176173

177174
val code = packageName.hashCode()
178175

179-
val contentIntent = Intent(context, InstallNotificationClickedReceiver::class.java).apply {
180-
setPackage(BuildConfig.APPLICATION_ID)
181-
putExtra(PACKAGE_NAME, packageName)
176+
val pendingContentIntent = getAppInstallContentIntent(packageName)?.let { contentIntent ->
177+
PendingIntent.getActivity(context, code, contentIntent, FLAGS)
182178
}
183179

184180
val deleteIntent = Intent(context, InstallNotificationDismissedReceiver::class.java).apply {
185181
setPackage(BuildConfig.APPLICATION_ID)
186182
putExtra(PACKAGE_NAME, packageName)
187183
}
188184

189-
val pendingContentIntent = PendingIntent.getBroadcast(context, code, contentIntent, FLAGS)
190185
val pendingDeleteIntent = PendingIntent.getBroadcast(context, code, deleteIntent, FLAGS)
191186

192187
val builder = NotificationCompat.Builder(context, channelId)
@@ -197,7 +192,7 @@ class NotificationController @Inject constructor(
197192
.setStyle(NotificationCompat.BigTextStyle())
198193
.setLargeIcon(icon)
199194
.setColor(ContextCompat.getColor(context, R.color.colorPrimary))
200-
.setAutoCancel(true)
195+
// .setAutoCancel(true)
201196
.setDeleteIntent(pendingDeleteIntent)
202197
.setGroup(APP_INSTALL_GROUP)
203198
.setPriority(NotificationCompat.PRIORITY_LOW)
@@ -278,4 +273,25 @@ class NotificationController @Inject constructor(
278273
}
279274
}
280275
}
276+
277+
fun getAppUpdateContentIntent(): Intent? {
278+
if (!context.isPlayStoreInstalled()) return null
279+
280+
val intent = Intent("com.google.android.finsky.VIEW_MY_DOWNLOADS")
281+
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
282+
283+
with(context.packageManager) {
284+
return intent.resolveActivity(this)?.let { intent }
285+
?: getLaunchIntentForPackage(PLAY_STORE_PACKAGE)
286+
}
287+
}
288+
289+
fun getAppInstallContentIntent(packageName: String): Intent? {
290+
with(context.packageManager) {
291+
val intent = getLaunchIntentForPackage(packageName)
292+
return intent?.resolveActivity(this)?.let { intent }
293+
?: getPlayStoreLaunchIntent(packageName)
294+
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
295+
}
296+
}
281297
}

app/src/main/java/com/farmerbb/appnotifier/receivers/InstallNotificationClickedReceiver.kt

Lines changed: 0 additions & 50 deletions
This file was deleted.

app/src/main/java/com/farmerbb/appnotifier/receivers/UpdateNotificationClickedReceiver.kt

Lines changed: 0 additions & 51 deletions
This file was deleted.

0 commit comments

Comments
 (0)