Toast on broadcast receiver notification trampolines
Show a warning toast when an app starts an activity inside a broadcast receiver in response to a notification or notification action click. This is to gather dogfood feedback in preparation for blocking such activity starts. See go/notification-trampolines for more info. For now, only taking care of broadcast receivers, the services case will be in a future CL. The toast is only shown once per package. This is to avoid annoying dogfooders. The actual block will be gated on targetSdk, however since very few apps (any?) will be targeting the latest SDK on dogfood and we are still allowing the activity start, we're going to show a toast regardless of targetSdk to collect more feedback. A side-effect of the way we implemented the rule that allowed notification trampolines in BAL is that in the case that the user clicks on a broadcast/service-trampoline notification of an app that also happens to be in the foreground (on top for example) we can't differentiate if an activity start came from the broadcast/service or from the activity itself (or some other part of the app). Because of this, in this case, we won't show the warning toast (and I'd say we might not block the launch in the future, but this discussion can wait). Implementation: We determine at PendingIntent fire time if the receiver is allowed to start activities. However, we pass a boolean to represent the grant to start activities and this boolean also takes into account another case that allows such starts. To correctly identify at activity start time that it was allowed due to notification-click scenario we pass in the token that was embeded in the PendingIntent (and was validated in the PendingIntentRecord) by notification manager. The set of components in ProcessRecord becomes a map to contain the originating tokens. Since now WindowProcessController needs to have the token to trace back the grant, I've replaced the boolean flag with the map from ProcessRecord. We move the grant rule to the bottom of the method areBackgroundActivityStartsAllowed() to make sure the start was allowed exclusively due to notification-click interaction. We then let notification manager register a callback with activity task manager that will be called whenever a background activity start is allowed exclusively due to a token provided in that callback. In that callback we show the warning toast. Test: atest BroadcastRecordTest BackgroundActivityLaunchTest ActivityStartControllerTests ActivityStarterTests RecentsAnimationTest WindowProcessControllerMapTests WindowProcessControllerMapTests Test: Posted a broadcast-trampoline notification, clicked on it and observed the toast was shown. Change-Id: Ica479d7d2f6b5f2ddaac4c59e12d0b25cd637717
Loading
Please register or sign in to comment