From 9bc2901255beedeb861d9b5e2ea9a43a6d8798e8 Mon Sep 17 00:00:00 2001 From: Dinis Vieira Date: Mon, 11 Mar 2024 21:06:37 +0000 Subject: [PATCH] [PM-6726] Fix for Android 14 devices crashing when using the Tiles (#3069) * Fix for Android 14 devices crashing when using the TileService. Also added fix for an "hidden" crash in accessibility autofill * Shared StartActivityAndCollapseFromTileService in AndroidHelpers * Update src/App/Platforms/Android/Utilities/AndroidHelpers.cs Co-authored-by: Federico Maccaroni * Updated name of StartActivityAndCollapseWithIntent method name used by TileService --------- Co-authored-by: Federico Maccaroni --- .../Android/Autofill/AutofillHelpers.cs | 2 +- .../Android/Tiles/AutofillTileService.cs | 3 ++- .../Android/Tiles/GeneratorTileService.cs | 13 +++-------- .../Android/Tiles/MyVaultTileService.cs | 13 +++-------- .../Android/Utilities/AndroidHelpers.cs | 22 +++++++++++++++++++ 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/App/Platforms/Android/Autofill/AutofillHelpers.cs b/src/App/Platforms/Android/Autofill/AutofillHelpers.cs index fbbf3209e..e2983af99 100644 --- a/src/App/Platforms/Android/Autofill/AutofillHelpers.cs +++ b/src/App/Platforms/Android/Autofill/AutofillHelpers.cs @@ -347,7 +347,7 @@ namespace Bit.Droid.Autofill // InlinePresentation requires nonNull pending intent (even though we only utilize one for the // "my vault" presentation) so we're including an empty one here pendingIntent = PendingIntent.GetService(context, 0, new Intent(), - AndroidHelpers.AddPendingIntentMutabilityFlag(PendingIntentFlags.OneShot | PendingIntentFlags.UpdateCurrent, true)); + AndroidHelpers.AddPendingIntentMutabilityFlag(PendingIntentFlags.OneShot | PendingIntentFlags.UpdateCurrent, false)); } var slice = CreateInlinePresentationSlice( inlinePresentationSpec, diff --git a/src/App/Platforms/Android/Tiles/AutofillTileService.cs b/src/App/Platforms/Android/Tiles/AutofillTileService.cs index 6fac17225..c448e1427 100644 --- a/src/App/Platforms/Android/Tiles/AutofillTileService.cs +++ b/src/App/Platforms/Android/Tiles/AutofillTileService.cs @@ -8,6 +8,7 @@ using Bit.Core.Abstractions; using Bit.Core.Utilities; using Bit.Droid.Accessibility; using Java.Lang; +using Bit.App.Droid.Utilities; namespace Bit.Droid.Tile { @@ -76,7 +77,7 @@ namespace Bit.Droid.Tile var intent = new Intent(this, typeof(AccessibilityActivity)); intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop); intent.PutExtra("autofillTileClicked", true); - StartActivityAndCollapse(intent); + this.StartActivityAndCollapseWithIntent(intent, isMutable: true); } private void ShowConfigErrorDialog() diff --git a/src/App/Platforms/Android/Tiles/GeneratorTileService.cs b/src/App/Platforms/Android/Tiles/GeneratorTileService.cs index b76f034b7..cf892c978 100644 --- a/src/App/Platforms/Android/Tiles/GeneratorTileService.cs +++ b/src/App/Platforms/Android/Tiles/GeneratorTileService.cs @@ -1,15 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using Android.App; +using Android.App; using Android.Content; -using Android.OS; using Android.Runtime; using Android.Service.QuickSettings; -using Android.Views; -using Android.Widget; +using Bit.App.Droid.Utilities; using Java.Lang; namespace Bit.Droid.Tile @@ -62,7 +55,7 @@ namespace Bit.Droid.Tile var intent = new Intent(this, typeof(MainActivity)); intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop); intent.PutExtra("generatorTile", true); - StartActivityAndCollapse(intent); + this.StartActivityAndCollapseWithIntent(intent, isMutable: false); } } } diff --git a/src/App/Platforms/Android/Tiles/MyVaultTileService.cs b/src/App/Platforms/Android/Tiles/MyVaultTileService.cs index d685e06ab..502ed8fc7 100644 --- a/src/App/Platforms/Android/Tiles/MyVaultTileService.cs +++ b/src/App/Platforms/Android/Tiles/MyVaultTileService.cs @@ -1,15 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using Android.App; +using Android.App; using Android.Content; -using Android.OS; using Android.Runtime; using Android.Service.QuickSettings; -using Android.Views; -using Android.Widget; +using Bit.App.Droid.Utilities; using Java.Lang; namespace Bit.Droid.Tile @@ -63,7 +56,7 @@ namespace Bit.Droid.Tile var intent = new Intent(this, typeof(MainActivity)); intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.SingleTop | ActivityFlags.ClearTop); intent.PutExtra("myVaultTile", true); - StartActivityAndCollapse(intent); + this.StartActivityAndCollapseWithIntent(intent, isMutable: false); } } } diff --git a/src/App/Platforms/Android/Utilities/AndroidHelpers.cs b/src/App/Platforms/Android/Utilities/AndroidHelpers.cs index b2b617b75..db8c7dbcd 100644 --- a/src/App/Platforms/Android/Utilities/AndroidHelpers.cs +++ b/src/App/Platforms/Android/Utilities/AndroidHelpers.cs @@ -2,6 +2,7 @@ using Android.Content; using Android.OS; using Android.Provider; +using Android.Service.QuickSettings; using Bit.App.Utilities; namespace Bit.App.Droid.Utilities @@ -64,5 +65,26 @@ namespace Bit.App.Droid.Utilities return pendingIntentFlags; } + + public static void StartActivityAndCollapseWithIntent(this TileService service, Intent intent, bool isMutable) + { + //For Android 14+ We need to use PendingIntent instead of Intent directly. Older versions still need to use Intent. + if (Build.VERSION.SdkInt < BuildVersionCodes.UpsideDownCake) + { + service.StartActivityAndCollapse(intent); + return; + } + var pendingIntent = PendingIntent.GetActivity( + service.ApplicationContext, + 0, + intent, + AddPendingIntentMutabilityFlag(PendingIntentFlags.UpdateCurrent, isMutable) + ); + if (pendingIntent == null) + { + return; + } + service.StartActivityAndCollapse(pendingIntent); + } } }