Skip to content

Conversation

@ashiagr
Copy link
Contributor

@ashiagr ashiagr commented Mar 10, 2022

Closes #16065

References: Automattic/stories-android#721

This PR includes the following changes:

  1. Update PendingIntent flags to include the mutability flag as part of Android 12 migration changes for notifications and widgets (see Details section).
  2. Upgrade androidxWorkVersion to 2.7.0 that fixes a platform bug causing pending intent crash on targetSdkVersion 31 (2a2f7f0, 3441794)
  3. Two refactoring commits (faa4288, 38f57bb) that formats files and removes unnecessary version check at places where pending intent flags were introduced.

Details:

List of all the notification types used in the app and classes setting pending intent mutability for them:

Class NotificationType Notes
GCMMessageHandler (via NotificationHelper.handleDefaultPush) COMMENT Supports direct reply actions
  LIKE  
  COMMENT_LIKE  
  AUTOMATTCHER  
  FOLLOW  
  REBLOG  
  BADGE_RESET  
  NOTE_DELETE  
  TEST_NOTE  
  ZENDESK  
  UNKNOWN_NOTE  
  AUTHENTICATION  
  GROUP_NOTIFICATION  
NotificationsProcessingService ACTIONS_RESULT  
  ACTIONS_PROGRESS  
NotificationsPendingDraftsReceiver, PendingDraftsNotificationsUtils (draft posts) PENDING_DRAFTS Uses AlarmManager
QuickStartReminderReceiver, QuickStartUtils QUICK_START_REMINDER Uses AlarmManager
PostUploadNotifier POST_UPLOAD_SUCCESS  
  POST_UPLOAD_ERROR  
  MEDIA_UPLOAD_SUCCESS  
  MEDIA_UPLOAD_ERROR  
PublishSettingsFragment (scheduled posts) POST_PUBLISHED Uses AlarmManager
FrameSaveNotifier (storis lib) STORY_SAVE_SUCCESS  
  STORY_SAVE_ERROR  
  STORY_FRAME_SAVE_SUCCESS  
  STORY_FRAME_SAVE_ERROR  
ReminderNotifier BLOGGING_REMINDERS Uses WorkManager
LocalNotificationWorker CREATE_SITE Uses WorkManager
  WEEKLY_ROUNDUP Uses WorkManager

Additionally, WidgetUtils sets pending intent mutability for Stats widgets.

It is important that pending intents mutability for all notifications and widgets are correctly set. Quoting the doc:

In most cases, your app should create immutable PendingIntent objects,....
However, certain use cases require mutable PendingIntent objects instead:

  • Supporting direct reply actions in notifications.
    ....
  • Scheduling alarms using AlarmManager. The mutable PendingIntent object allows the system to add the EXTRA_ALARM_COUNT intent extra. This extra represents the number of times that a repeating alarm has been triggered. By containing this extra, the intent can accurately notify an app as to whether a repeating alarm was triggered multiple times, such as when the device was asleep.

For the reasons above, all pending intents are made immutable (8176ba3) except for comments notifications that allow direct replies and voice remote input (76d8c36).

For the notifications using AlarmManager (PENDING_DRAFTS, QUICK_START_REMINDER, POST_PUBLISHED), it seems we do not need a mutable pending intent as they're not repeating alarms.

To test:

Make sure that at least the special notifications have their pending intent mutability set correctly.

Test.1 Comments

  1. Login using a wpcom account having sites on your device
  2. Comment on a site post using another account from Calypso
  3. Wait for the comment notification to arrive on the device
  4. Expand the notification and direct reply to the comment from the notification
  5. Notice that the comment is posted properly

Test.2 Quick Start Reminders

  1. Fresh launch the app
  2. Select a site from the epilogue view
  3. When the Quick Start Prompt is shown, tap the "Show me around" option
  4. Tap the Customize your site row to launch the QS dialog
  5. Tap on Check your site title (the dialog will close and you'll be brought back to My Site)
  6. Tap on the blue flashing icon on site title and change the text
  7. Notifications are set for two days in the future, so you have to change the date/time on the device for testing
  8. Navigate out of the app to the Settings area of your device and locate the area that manages the time.
  9. Disable the "use network-provided time"
  10. Manually set the date/time for 2 days and 2 minutes from now
  11. NOTE: The notification should arrive at the device within a couple of minutes
  12. After the notification is shown - don't forget to enable "use network-provided time"

Test.3 Post Published

  1. Launch the app
  2. Click FAB to create a post to schedule it for a future time
  3. Go to Post Settings
  4. Go to Publish Date
  5. Set Publish Date two minutes in the future
  6. Set Notification to when published
  7. Navigate out of the app
  8. The notification should arrive at the device within a couple of minutes

Test.4 Adhoc Notification

If you suspect any other notification (from the notifications table above) should have a pending intent mutability other than what is set, test it out or test for a random notification type.

Note that PENDING_DRAFTS notifications are not displayed due to an existing bug: #14240

Test.5 Stats Widgets

  1. Go to your Home and try to add a Widget
  2. Scroll to the WordPress
  3. Add Stats widget (you'll need to select a site as an intermediate step)
  4. Interact with the widget
  5. Make sure everything works as expected

Merge Instructions

  • Make sure that referenced Stories Lib PR is merged to trunk
  • Update Stories Lib version from trunk
  • Remove Not Ready for Merge label
  • Merge the PR

Regression Notes

  1. Potential unintended areas of impact
    Push notifications

  2. What I did to test those areas of impact (or what existing automated tests I relied on)
    See To Test section

  3. What automated tests I added (or what prevented me from doing so) - N/A

PR submission checklist:

  • I have completed the Regression Notes.
  • I have considered adding accessibility improvements for my changes.
  • I have considered if this change warrants user-facing release notes and have added them to RELEASE-NOTES.txt if necessary.

ashiagr added 7 commits March 10, 2022 16:58
PendingIntent that contains a RemoteInput requires a mutable flag. Comments can have voice reply enabled which will come through the remoteInput (EXTRA_VOICE_OR_INLINE_REPLY)

For more details, see: https://issuetracker.google.com/issues/204328125
This version fixes a platform bug causing pending intent crash on targetSdkVersion 31.

For more details, see: https://issuetracker.google.com/issues/194108978
This commit updates immutable pending intent flag to stories lib > FrameSaveNotifier
@ashiagr ashiagr added this to the Future milestone Mar 10, 2022
@ashiagr ashiagr self-assigned this Mar 10, 2022
@peril-wordpress-mobile
Copy link

peril-wordpress-mobile bot commented Mar 10, 2022

You can trigger optional UI/connected tests for these changes by visiting CircleCI here.

@peril-wordpress-mobile
Copy link

peril-wordpress-mobile bot commented Mar 10, 2022

You can test the changes on this Pull Request by downloading the APKs:

@ashiagr ashiagr requested a review from develric March 11, 2022 10:18
@malinajirka malinajirka removed their request for review March 16, 2022 04:12
@ashiagr ashiagr requested review from zwarm and removed request for mzorz, planarvoid and renanferrari March 16, 2022 04:46
Copy link
Contributor

@ravishanker ravishanker left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did a quick smoke test of flows and notifications.
Great effort. Thanks for making this happen! 🙇🏻‍♂️

@ravishanker
Copy link
Contributor

ravishanker commented Mar 21, 2022

Please feel free to merge this after resolving conflicts. Make sure to pull-in latest trunk as I noticed it required me to uninstall the previous due to database upgrade.

@peril-wordpress-mobile
Copy link

Warnings
⚠️ PR has more than 300 lines of code changing. Consider splitting into smaller PRs if possible.

Generated by 🚫 dangerJS

Revert androidxWorkVersion
@wpmobilebot
Copy link
Contributor

Found 1 violations:

The PR caused the following dependency changes:

-+--- com.automattic:stories:1.2.1
-|    +--- androidx.databinding:viewbinding:4.2.2 (*)
-|    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.4.20 -> 1.5.32 (*)
-|    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20 -> 1.5.32 (*)
-|    +--- org.jetbrains.kotlinx:kotlinx-serialization-runtime:1.0-M1-1.4.0-rc
-|    |    \--- org.jetbrains.kotlinx:kotlinx-serialization-runtime-jvm:1.0-M1-1.4.0-rc
-|    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0-rc -> 1.6.0 (*)
-|    |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0-rc -> 1.6.0
-|    +--- org.jetbrains.kotlin:kotlin-reflect:1.4.20
-|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.6.0 (*)
-|    +--- androidx.appcompat:appcompat:1.0.2 -> 1.3.1 (*)
-|    +--- androidx.constraintlayout:constraintlayout:1.1.3 -> 2.0.4 (*)
-|    +--- androidx.core:core-ktx:1.2.0 -> 1.7.0 (*)
-|    +--- androidx.navigation:navigation-fragment-ktx:2.0.0 -> 2.3.5
-|    |    +--- androidx.navigation:navigation-fragment:2.3.5
-|    |    |    +--- androidx.fragment:fragment:1.2.4 -> 1.3.6 (*)
-|    |    |    \--- androidx.navigation:navigation-runtime:2.3.5 -> 2.4.0-beta02 (*)
-|    |    +--- androidx.navigation:navigation-runtime-ktx:2.3.5 -> 2.4.0-beta02 (*)
-|    |    +--- androidx.fragment:fragment-ktx:1.2.4
-|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.50 -> 1.6.0 (*)
-|    |    |    +--- androidx.fragment:fragment:1.2.4 -> 1.3.6 (*)
-|    |    |    +--- androidx.activity:activity-ktx:1.1.0 -> 1.3.1 (*)
-|    |    |    +--- androidx.core:core-ktx:1.1.0 -> 1.7.0 (*)
-|    |    |    +--- androidx.collection:collection-ktx:1.1.0 (*)
-|    |    |    +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0
-|    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.50 -> 1.6.0 (*)
-|    |    |    |    \--- androidx.lifecycle:lifecycle-livedata-core:2.2.0 -> 2.3.1 (*)
-|    |    |    \--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.3.1 (*)
-|    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.3.1 (*)
-|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.6.0 (*)
-|    +--- androidx.navigation:navigation-ui-ktx:2.0.0 -> 2.3.5
-|    |    +--- androidx.navigation:navigation-ui:2.3.5
-|    |    |    +--- androidx.navigation:navigation-runtime:2.3.5 -> 2.4.0-beta02 (*)
-|    |    |    +--- androidx.customview:customview:1.1.0 (*)
-|    |    |    +--- androidx.drawerlayout:drawerlayout:1.1.1 (*)
-|    |    |    +--- com.google.android.material:material:1.0.0 -> 1.6.0-alpha01 (*)
-|    |    |    \--- androidx.transition:transition:1.3.0 (*)
-|    |    +--- androidx.navigation:navigation-runtime-ktx:2.3.5 -> 2.4.0-beta02 (*)
-|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.6.0 (*)
-|    +--- androidx.emoji:emoji:1.0.0
-|    |    \--- androidx.core:core:1.0.0 -> 1.7.0 (*)
-|    +--- androidx.recyclerview:recyclerview:1.1.0 (*)
-|    +--- com.google.android.material:material:1.2.1 -> 1.6.0-alpha01 (*)
-|    +--- com.github.bumptech.glide:glide:4.10.0 -> 4.11.0
-|    |    +--- com.github.bumptech.glide:gifdecoder:4.11.0
-|    |    |    \--- androidx.annotation:annotation:1.0.0 -> 1.2.0
-|    |    +--- com.github.bumptech.glide:disklrucache:4.11.0
-|    |    +--- com.github.bumptech.glide:annotations:4.11.0
-|    |    +--- androidx.fragment:fragment:1.0.0 -> 1.3.6 (*)
-|    |    +--- androidx.vectordrawable:vectordrawable-animated:1.0.0 -> 1.1.0 (*)
-|    |    \--- androidx.exifinterface:exifinterface:1.0.0 -> 1.1.0-beta01
-|    |         \--- androidx.annotation:annotation:1.1.0 -> 1.2.0
-|    +--- jp.wasabeef:glide-transformations:4.3.0
-|    |    \--- com.github.bumptech.glide:glide:4.11.0 (*)
-|    +--- org.greenrobot:eventbus:3.3.1
-|    |    \--- org.greenrobot:eventbus-java:3.3.1
-|    +--- com.automattic.stories:photoeditor:1.2.1
-|    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20 -> 1.5.32 (*)
-|    |    +--- org.jetbrains.kotlinx:kotlinx-serialization-runtime:1.0-M1-1.4.0-rc (*)
-|    |    +--- androidx.appcompat:appcompat:1.0.2 -> 1.3.1 (*)
-|    |    +--- androidx.core:core-ktx:1.2.0 -> 1.7.0 (*)
-|    |    +--- androidx.camera:camera-core:1.0.0-alpha06
-|    |    |    +--- com.google.auto.value:auto-value-annotations:1.6.3
-|    |    |    +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
-|    |    |    +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.2.0 (*)
-|    |    |    +--- androidx.lifecycle:lifecycle-common:2.1.0 -> 2.3.1 (*)
-|    |    |    +--- androidx.exifinterface:exifinterface:1.0.0 -> 1.1.0-beta01 (*)
-|    |    |    +--- androidx.annotation:annotation:1.0.0 -> 1.2.0
-|    |    |    +--- androidx.core:core:1.1.0 -> 1.7.0 (*)
-|    |    |    \--- androidx.concurrent:concurrent-futures:1.0.0-alpha03 -> 1.0.0 (*)
-|    |    +--- androidx.camera:camera-camera2:1.0.0-alpha06
-|    |    |    +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
-|    |    |    +--- androidx.camera:camera-core:1.0.0-alpha06 (*)
-|    |    |    +--- androidx.core:core:1.1.0 -> 1.7.0 (*)
-|    |    |    +--- androidx.annotation:annotation:1.0.0 -> 1.2.0
-|    |    |    \--- androidx.concurrent:concurrent-futures:1.0.0-alpha03 -> 1.0.0 (*)
-|    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9 -> 1.5.2 (*)
-|    |    +--- com.google.android.material:material:1.2.1 -> 1.6.0-alpha01 (*)
-|    |    +--- com.github.bumptech.glide:glide:4.10.0 -> 4.11.0 (*)
-|    |    +--- jp.wasabeef:glide-transformations:4.3.0 (*)
-|    |    +--- com.github.chrisbanes:PhotoView:2.3.0
-|    |    |    \--- androidx.appcompat:appcompat:1.0.0 -> 1.3.1 (*)
-|    |    +--- com.automattic.stories:mp4compose:1.2.1
-|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20 -> 1.5.32 (*)
-|    |    |    \--- com.github.bumptech.glide:glide:4.10.0 -> 4.11.0 (*)
-|    |    \--- androidx.emoji:emoji:1.0.0 (*)
-|    +--- androidx.lifecycle:lifecycle-common-java8:2.2.0 -> 2.3.0 (*)
-|    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.3.1 (*)
-|    +--- androidx.lifecycle:lifecycle-livedata-ktx:2.2.0
-|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.50 -> 1.6.0 (*)
-|    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0 -> 1.5.2 (*)
-|    |    +--- androidx.lifecycle:lifecycle-livedata:2.2.0 (*)
-|    |    \--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0 (*)
-|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9 -> 1.5.2 (*)
-|    \--- com.github.chrisbanes:PhotoView:2.3.0 (*)
++--- com.automattic:stories:trunk-2f8aaff7fb03bdbd0e2efbe111626bf3c6a7aa44
+|    +--- androidx.databinding:viewbinding:4.2.2 (*)
+|    +--- org.jetbrains.kotlin:kotlin-parcelize-runtime:1.4.20 -> 1.5.32 (*)
+|    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20 -> 1.5.32 (*)
+|    +--- org.jetbrains.kotlinx:kotlinx-serialization-runtime:1.0-M1-1.4.0-rc
+|    |    \--- org.jetbrains.kotlinx:kotlinx-serialization-runtime-jvm:1.0-M1-1.4.0-rc
+|    |         +--- org.jetbrains.kotlin:kotlin-stdlib:1.4.0-rc -> 1.6.0 (*)
+|    |         \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.4.0-rc -> 1.6.0
+|    +--- org.jetbrains.kotlin:kotlin-reflect:1.4.20
+|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.4.20 -> 1.6.0 (*)
+|    +--- androidx.appcompat:appcompat:1.0.2 -> 1.3.1 (*)
+|    +--- androidx.constraintlayout:constraintlayout:1.1.3 -> 2.0.4 (*)
+|    +--- androidx.core:core-ktx:1.2.0 -> 1.7.0 (*)
+|    +--- androidx.navigation:navigation-fragment-ktx:2.0.0 -> 2.3.5
+|    |    +--- androidx.navigation:navigation-fragment:2.3.5
+|    |    |    +--- androidx.fragment:fragment:1.2.4 -> 1.3.6 (*)
+|    |    |    \--- androidx.navigation:navigation-runtime:2.3.5 -> 2.4.0-beta02 (*)
+|    |    +--- androidx.navigation:navigation-runtime-ktx:2.3.5 -> 2.4.0-beta02 (*)
+|    |    +--- androidx.fragment:fragment-ktx:1.2.4
+|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.50 -> 1.6.0 (*)
+|    |    |    +--- androidx.fragment:fragment:1.2.4 -> 1.3.6 (*)
+|    |    |    +--- androidx.activity:activity-ktx:1.1.0 -> 1.3.1 (*)
+|    |    |    +--- androidx.core:core-ktx:1.1.0 -> 1.7.0 (*)
+|    |    |    +--- androidx.collection:collection-ktx:1.1.0 (*)
+|    |    |    +--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0
+|    |    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.50 -> 1.6.0 (*)
+|    |    |    |    \--- androidx.lifecycle:lifecycle-livedata-core:2.2.0 -> 2.3.1 (*)
+|    |    |    \--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.3.1 (*)
+|    |    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.3.1 (*)
+|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.6.0 (*)
+|    +--- androidx.navigation:navigation-ui-ktx:2.0.0 -> 2.3.5
+|    |    +--- androidx.navigation:navigation-ui:2.3.5
+|    |    |    +--- androidx.navigation:navigation-runtime:2.3.5 -> 2.4.0-beta02 (*)
+|    |    |    +--- androidx.customview:customview:1.1.0 (*)
+|    |    |    +--- androidx.drawerlayout:drawerlayout:1.1.1 (*)
+|    |    |    +--- com.google.android.material:material:1.0.0 -> 1.6.0-alpha01 (*)
+|    |    |    \--- androidx.transition:transition:1.3.0 (*)
+|    |    +--- androidx.navigation:navigation-runtime-ktx:2.3.5 -> 2.4.0-beta02 (*)
+|    |    \--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.6.0 (*)
+|    +--- androidx.emoji:emoji:1.0.0
+|    |    \--- androidx.core:core:1.0.0 -> 1.7.0 (*)
+|    +--- androidx.recyclerview:recyclerview:1.1.0 (*)
+|    +--- com.google.android.material:material:1.2.1 -> 1.6.0-alpha01 (*)
+|    +--- com.github.bumptech.glide:glide:4.10.0 -> 4.11.0
+|    |    +--- com.github.bumptech.glide:gifdecoder:4.11.0
+|    |    |    \--- androidx.annotation:annotation:1.0.0 -> 1.2.0
+|    |    +--- com.github.bumptech.glide:disklrucache:4.11.0
+|    |    +--- com.github.bumptech.glide:annotations:4.11.0
+|    |    +--- androidx.fragment:fragment:1.0.0 -> 1.3.6 (*)
+|    |    +--- androidx.vectordrawable:vectordrawable-animated:1.0.0 -> 1.1.0 (*)
+|    |    \--- androidx.exifinterface:exifinterface:1.0.0 -> 1.1.0-beta01
+|    |         \--- androidx.annotation:annotation:1.1.0 -> 1.2.0
+|    +--- jp.wasabeef:glide-transformations:4.3.0
+|    |    \--- com.github.bumptech.glide:glide:4.11.0 (*)
+|    +--- org.greenrobot:eventbus:3.3.1
+|    |    \--- org.greenrobot:eventbus-java:3.3.1
+|    +--- com.automattic.stories:photoeditor:trunk-2f8aaff7fb03bdbd0e2efbe111626bf3c6a7aa44
+|    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20 -> 1.5.32 (*)
+|    |    +--- org.jetbrains.kotlinx:kotlinx-serialization-runtime:1.0-M1-1.4.0-rc (*)
+|    |    +--- androidx.appcompat:appcompat:1.0.2 -> 1.3.1 (*)
+|    |    +--- androidx.core:core-ktx:1.2.0 -> 1.7.0 (*)
+|    |    +--- androidx.camera:camera-core:1.0.0-alpha06
+|    |    |    +--- com.google.auto.value:auto-value-annotations:1.6.3
+|    |    |    +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+|    |    |    +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.2.0 (*)
+|    |    |    +--- androidx.lifecycle:lifecycle-common:2.1.0 -> 2.3.1 (*)
+|    |    |    +--- androidx.exifinterface:exifinterface:1.0.0 -> 1.1.0-beta01 (*)
+|    |    |    +--- androidx.annotation:annotation:1.0.0 -> 1.2.0
+|    |    |    +--- androidx.core:core:1.1.0 -> 1.7.0 (*)
+|    |    |    \--- androidx.concurrent:concurrent-futures:1.0.0-alpha03 -> 1.0.0 (*)
+|    |    +--- androidx.camera:camera-camera2:1.0.0-alpha06
+|    |    |    +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+|    |    |    +--- androidx.camera:camera-core:1.0.0-alpha06 (*)
+|    |    |    +--- androidx.core:core:1.1.0 -> 1.7.0 (*)
+|    |    |    +--- androidx.annotation:annotation:1.0.0 -> 1.2.0
+|    |    |    \--- androidx.concurrent:concurrent-futures:1.0.0-alpha03 -> 1.0.0 (*)
+|    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9 -> 1.5.2 (*)
+|    |    +--- com.google.android.material:material:1.2.1 -> 1.6.0-alpha01 (*)
+|    |    +--- com.github.bumptech.glide:glide:4.10.0 -> 4.11.0 (*)
+|    |    +--- jp.wasabeef:glide-transformations:4.3.0 (*)
+|    |    +--- com.github.chrisbanes:PhotoView:2.3.0
+|    |    |    \--- androidx.appcompat:appcompat:1.0.0 -> 1.3.1 (*)
+|    |    +--- com.automattic.stories:mp4compose:trunk-2f8aaff7fb03bdbd0e2efbe111626bf3c6a7aa44
+|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20 -> 1.5.32 (*)
+|    |    |    \--- com.github.bumptech.glide:glide:4.10.0 -> 4.11.0 (*)
+|    |    \--- androidx.emoji:emoji:1.0.0 (*)
+|    +--- androidx.lifecycle:lifecycle-common-java8:2.2.0 -> 2.3.0 (*)
+|    +--- androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0 -> 2.3.1 (*)
+|    +--- androidx.lifecycle:lifecycle-livedata-ktx:2.2.0
+|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.50 -> 1.6.0 (*)
+|    |    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0 -> 1.5.2 (*)
+|    |    +--- androidx.lifecycle:lifecycle-livedata:2.2.0 (*)
+|    |    \--- androidx.lifecycle:lifecycle-livedata-core-ktx:2.2.0 (*)
+|    +--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9 -> 1.5.2 (*)
+|    \--- com.github.chrisbanes:PhotoView:2.3.0 (*)
-+--- com.automattic.stories:mp4compose:1.2.1 (*)
++--- com.automattic.stories:mp4compose:trunk-2f8aaff7fb03bdbd0e2efbe111626bf3c6a7aa44 (*)
-+--- androidx.work:work-runtime:2.4.0
-|    +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
-|    +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.2.0 (*)
-|    +--- androidx.room:room-runtime:2.2.5 -> 2.3.0
-|    |    +--- androidx.room:room-common:2.3.0
-|    |    |    \--- androidx.annotation:annotation:1.1.0 -> 1.2.0
-|    |    +--- androidx.sqlite:sqlite-framework:2.1.0
-|    |    |    +--- androidx.annotation:annotation:1.0.0 -> 1.2.0
-|    |    |    \--- androidx.sqlite:sqlite:2.1.0
-|    |    |         \--- androidx.annotation:annotation:1.0.0 -> 1.2.0
-|    |    +--- androidx.sqlite:sqlite:2.1.0 (*)
-|    |    +--- androidx.arch.core:core-runtime:2.0.1 -> 2.1.0 (*)
-|    |    \--- androidx.annotation:annotation-experimental:1.1.0
-|    +--- androidx.sqlite:sqlite:2.1.0 (*)
-|    +--- androidx.sqlite:sqlite-framework:2.1.0 (*)
-|    +--- androidx.core:core:1.1.0 -> 1.7.0 (*)
-|    \--- androidx.lifecycle:lifecycle-service:2.1.0 -> 2.2.0 (*)
++--- androidx.work:work-runtime:2.7.0
+|    +--- androidx.annotation:annotation-experimental:1.0.0 -> 1.1.0
+|    +--- com.google.guava:listenablefuture:1.0 -> 9999.0-empty-to-avoid-conflict-with-guava
+|    +--- androidx.lifecycle:lifecycle-livedata:2.1.0 -> 2.2.0 (*)
+|    +--- androidx.startup:startup-runtime:1.0.0 (*)
+|    +--- androidx.core:core:1.6.0 -> 1.7.0 (*)
+|    +--- androidx.room:room-runtime:2.2.5 -> 2.3.0
+|    |    +--- androidx.room:room-common:2.3.0
+|    |    |    \--- androidx.annotation:annotation:1.1.0 -> 1.2.0
+|    |    +--- androidx.sqlite:sqlite-framework:2.1.0
+|    |    |    +--- androidx.annotation:annotation:1.0.0 -> 1.2.0
+|    |    |    \--- androidx.sqlite:sqlite:2.1.0
+|    |    |         \--- androidx.annotation:annotation:1.0.0 -> 1.2.0
+|    |    +--- androidx.sqlite:sqlite:2.1.0 (*)
+|    |    +--- androidx.arch.core:core-runtime:2.0.1 -> 2.1.0 (*)
+|    |    \--- androidx.annotation:annotation-experimental:1.1.0
+|    +--- androidx.sqlite:sqlite:2.1.0 (*)
+|    +--- androidx.sqlite:sqlite-framework:2.1.0 (*)
+|    +--- androidx.core:core:1.1.0 -> 1.7.0 (*)
+|    \--- androidx.lifecycle:lifecycle-service:2.1.0 -> 2.2.0 (*)
-+--- androidx.work:work-runtime-ktx:2.4.0
-|    +--- androidx.work:work-runtime:2.4.0 (*)
-|    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.71 -> 1.6.0 (*)
-|    \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.4 -> 1.5.2 (*)
++--- androidx.work:work-runtime-ktx:2.7.0
+|    +--- androidx.work:work-runtime:2.7.0 (*)
+|    +--- org.jetbrains.kotlin:kotlin-stdlib:1.5.30 -> 1.6.0 (*)
+|    \--- org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0 -> 1.5.2 (*)
-\--- androidx.work:work-gcm:2.4.0
-     +--- androidx.work:work-runtime:2.4.0 (*)
-     +--- com.google.android.gms:play-services-gcm:17.0.0
-     |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
-     |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
-     |    +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*)
-     |    +--- com.google.android.gms:play-services-base:17.0.0 -> 17.1.0
-     |    |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
-     |    |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
-     |    |    +--- androidx.fragment:fragment:1.0.0 -> 1.3.6 (*)
-     |    |    +--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1
-     |    |    |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
-     |    |    |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
-     |    |    |    \--- androidx.fragment:fragment:1.0.0 -> 1.3.6 (*)
-     |    |    \--- com.google.android.gms:play-services-tasks:17.0.0
-     |    |         \--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
-     |    +--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
-     |    +--- com.google.android.gms:play-services-iid:17.0.0
-     |    |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
-     |    |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
-     |    |    +--- com.google.android.gms:play-services-base:17.0.0 -> 17.1.0 (*)
-     |    |    +--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
-     |    |    +--- com.google.android.gms:play-services-stats:17.0.0
-     |    |    |    +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*)
-     |    |    |    \--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
-     |    |    \--- com.google.android.gms:play-services-tasks:17.0.0 (*)
-     |    \--- com.google.android.gms:play-services-stats:17.0.0 (*)
-     \--- androidx.room:room-runtime:2.2.5 -> 2.3.0 (*)
+\--- androidx.work:work-gcm:2.7.0
+     +--- androidx.work:work-runtime:2.7.0 (*)
+     +--- com.google.android.gms:play-services-gcm:17.0.0
+     |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+     |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
+     |    +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*)
+     |    +--- com.google.android.gms:play-services-base:17.0.0 -> 17.1.0
+     |    |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+     |    |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
+     |    |    +--- androidx.fragment:fragment:1.0.0 -> 1.3.6 (*)
+     |    |    +--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1
+     |    |    |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+     |    |    |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
+     |    |    |    \--- androidx.fragment:fragment:1.0.0 -> 1.3.6 (*)
+     |    |    \--- com.google.android.gms:play-services-tasks:17.0.0
+     |    |         \--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
+     |    +--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
+     |    +--- com.google.android.gms:play-services-iid:17.0.0
+     |    |    +--- androidx.collection:collection:1.0.0 -> 1.1.0 (*)
+     |    |    +--- androidx.core:core:1.0.0 -> 1.7.0 (*)
+     |    |    +--- com.google.android.gms:play-services-base:17.0.0 -> 17.1.0 (*)
+     |    |    +--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
+     |    |    +--- com.google.android.gms:play-services-stats:17.0.0
+     |    |    |    +--- androidx.legacy:legacy-support-core-utils:1.0.0 (*)
+     |    |    |    \--- com.google.android.gms:play-services-basement:17.0.0 -> 17.1.1 (*)
+     |    |    \--- com.google.android.gms:play-services-tasks:17.0.0 (*)
+     |    \--- com.google.android.gms:play-services-stats:17.0.0 (*)
+     \--- androidx.room:room-runtime:2.2.5 -> 2.3.0 (*)

Please review and act accordingly

@ashiagr ashiagr merged commit 681aa43 into trunk Mar 22, 2022
@ashiagr ashiagr deleted the issue/16065-pending-intent-mutability branch March 22, 2022 05:03
@ashiagr ashiagr modified the milestones: Future, 19.6 Mar 22, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Android 12: Security and privacy - Pending intents mutability

4 participants