Skip to content

Commit d25f50e

Browse files
gmackallTecHaxter
authored andcommitted
[quick_actions_android] Switch to Compat version of ShortcutManager to support Google surfaces (flutter#6638)
Fixes flutter/flutter#147519
1 parent b27a9e7 commit d25f50e

File tree

5 files changed

+20
-28
lines changed

5 files changed

+20
-28
lines changed

packages/quick_actions/quick_actions_android/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 1.0.12
2+
3+
* Switches from using `ShortcutManager` to `ShortcutManagerCompat`.
4+
15
## 1.0.11
26

37
* Updates minSdkVersion to 19.

packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActions.java

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
import android.app.Activity;
99
import android.content.Context;
1010
import android.content.Intent;
11-
import android.content.pm.ShortcutInfo;
12-
import android.content.pm.ShortcutManager;
1311
import android.content.res.Resources;
14-
import android.graphics.drawable.Icon;
1512
import android.os.Build;
1613
import android.os.Handler;
1714
import android.os.Looper;
1815
import androidx.annotation.ChecksSdkIntAtLeast;
1916
import androidx.annotation.NonNull;
2017
import androidx.annotation.Nullable;
18+
import androidx.core.content.pm.ShortcutInfoCompat;
19+
import androidx.core.content.pm.ShortcutManagerCompat;
20+
import androidx.core.graphics.drawable.IconCompat;
2121
import io.flutter.plugins.quickactions.Messages.AndroidQuickActionsApi;
2222
import io.flutter.plugins.quickactions.Messages.FlutterError;
2323
import io.flutter.plugins.quickactions.Messages.Result;
@@ -61,9 +61,7 @@ public void setShortcutItems(
6161
result.success(null);
6262
return;
6363
}
64-
ShortcutManager shortcutManager =
65-
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
66-
List<ShortcutInfo> shortcuts = shortcutItemMessageToShortcutInfo(itemsList);
64+
List<ShortcutInfoCompat> shortcuts = shortcutItemMessageToShortcutInfo(itemsList);
6765
Executor uiThreadExecutor = new UiThreadExecutor();
6866
ThreadPoolExecutor executor =
6967
new ThreadPoolExecutor(0, 1, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
@@ -72,7 +70,7 @@ public void setShortcutItems(
7270
() -> {
7371
boolean dynamicShortcutsSet = false;
7472
try {
75-
shortcutManager.setDynamicShortcuts(shortcuts);
73+
ShortcutManagerCompat.setDynamicShortcuts(context, shortcuts);
7674
dynamicShortcutsSet = true;
7775
} catch (Exception e) {
7876
// Leave dynamicShortcutsSet as false
@@ -101,18 +99,14 @@ public void clearShortcutItems() {
10199
if (!isVersionAllowed()) {
102100
return;
103101
}
104-
ShortcutManager shortcutManager =
105-
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
106-
shortcutManager.removeAllDynamicShortcuts();
102+
ShortcutManagerCompat.removeAllDynamicShortcuts(context);
107103
}
108104

109105
@Override
110106
public @Nullable String getLaunchAction() {
111107
if (!isVersionAllowed()) {
112108
return null;
113109
}
114-
ShortcutManager shortcutManager =
115-
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
116110
if (activity == null) {
117111
throw new FlutterError(
118112
"quick_action_getlaunchaction_no_activity",
@@ -122,31 +116,32 @@ public void clearShortcutItems() {
122116
final Intent intent = activity.getIntent();
123117
final String launchAction = intent.getStringExtra(EXTRA_ACTION);
124118
if (launchAction != null && !launchAction.isEmpty()) {
125-
shortcutManager.reportShortcutUsed(launchAction);
119+
ShortcutManagerCompat.reportShortcutUsed(context, launchAction);
126120
intent.removeExtra(EXTRA_ACTION);
127121
}
128122
return launchAction;
129123
}
130124

131125
@TargetApi(Build.VERSION_CODES.N_MR1)
132-
private List<ShortcutInfo> shortcutItemMessageToShortcutInfo(
126+
private List<ShortcutInfoCompat> shortcutItemMessageToShortcutInfo(
133127
@NonNull List<ShortcutItemMessage> shortcuts) {
134-
final List<ShortcutInfo> shortcutInfos = new ArrayList<>();
128+
final List<ShortcutInfoCompat> shortcutInfos = new ArrayList<>();
135129

136130
for (ShortcutItemMessage shortcut : shortcuts) {
137131
final String icon = shortcut.getIcon();
138132
final String type = shortcut.getType();
139133
final String title = shortcut.getLocalizedTitle();
140-
final ShortcutInfo.Builder shortcutBuilder = new ShortcutInfo.Builder(context, type);
134+
final ShortcutInfoCompat.Builder shortcutBuilder =
135+
new ShortcutInfoCompat.Builder(context, type);
141136

142137
final int resourceId = loadResourceId(context, icon);
143138
final Intent intent = getIntentToOpenMainActivity(type);
144139

145140
if (resourceId > 0) {
146-
shortcutBuilder.setIcon(Icon.createWithResource(context, resourceId));
141+
shortcutBuilder.setIcon(IconCompat.createWithResource(context, resourceId));
147142
}
148143

149-
final ShortcutInfo shortcutInfo =
144+
final ShortcutInfoCompat shortcutInfo =
150145
shortcutBuilder.setLongLabel(title).setShortLabel(title).setIntent(intent).build();
151146
shortcutInfos.add(shortcutInfo);
152147
}

packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
import android.app.Activity;
88
import android.content.Context;
99
import android.content.Intent;
10-
import android.content.pm.ShortcutManager;
1110
import android.os.Build;
1211
import android.util.Log;
1312
import androidx.annotation.ChecksSdkIntAtLeast;
1413
import androidx.annotation.NonNull;
1514
import androidx.annotation.VisibleForTesting;
15+
import androidx.core.content.pm.ShortcutManagerCompat;
1616
import io.flutter.embedding.engine.plugins.FlutterPlugin;
1717
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
1818
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
@@ -108,15 +108,13 @@ public boolean onNewIntent(@NonNull Intent intent) {
108108
// Notify the Dart side if the launch intent has the intent extra relevant to quick actions.
109109
if (intent.hasExtra(QuickActions.EXTRA_ACTION) && activity != null) {
110110
Context context = activity.getApplicationContext();
111-
ShortcutManager shortcutManager =
112-
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
113111
String shortcutId = intent.getStringExtra(QuickActions.EXTRA_ACTION);
114112
quickActionsFlutterApi.launchAction(
115113
shortcutId,
116114
value -> {
117115
// noop
118116
});
119-
shortcutManager.reportShortcutUsed(shortcutId);
117+
ShortcutManagerCompat.reportShortcutUsed(context, shortcutId);
120118
}
121119
return false;
122120
}

packages/quick_actions/quick_actions_android/android/src/test/java/io/flutter/plugins/quickactions/QuickActionsTest.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import android.app.Activity;
1414
import android.content.Context;
1515
import android.content.Intent;
16-
import android.content.pm.ShortcutManager;
1716
import androidx.annotation.NonNull;
1817
import androidx.annotation.Nullable;
1918
import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding;
@@ -76,8 +75,6 @@ public void onAttachedToActivity_buildVersionSupported_invokesLaunchMethod()
7675
when(mockActivityPluginBinding.getActivity()).thenReturn(mockMainActivity);
7776
final Context mockContext = mock(Context.class);
7877
when(mockMainActivity.getApplicationContext()).thenReturn(mockContext);
79-
final ShortcutManager mockShortcutManager = mock(ShortcutManager.class);
80-
when(mockContext.getSystemService(Context.SHORTCUT_SERVICE)).thenReturn(mockShortcutManager);
8178
plugin.onAttachedToActivity(mockActivityPluginBinding);
8279

8380
// Act
@@ -118,8 +115,6 @@ public void onNewIntent_buildVersionSupported_invokesLaunchMethod() {
118115
when(mockActivityPluginBinding.getActivity()).thenReturn(mockMainActivity);
119116
final Context mockContext = mock(Context.class);
120117
when(mockMainActivity.getApplicationContext()).thenReturn(mockContext);
121-
final ShortcutManager mockShortcutManager = mock(ShortcutManager.class);
122-
when(mockContext.getSystemService(Context.SHORTCUT_SERVICE)).thenReturn(mockShortcutManager);
123118
plugin.onAttachedToActivity(mockActivityPluginBinding);
124119

125120
// Act

packages/quick_actions/quick_actions_android/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: quick_actions_android
22
description: An implementation for the Android platform of the Flutter `quick_actions` plugin.
33
repository: https://github.com/flutter/packages/tree/main/packages/quick_actions/quick_actions_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
5-
version: 1.0.11
5+
version: 1.0.12
66

77
environment:
88
sdk: ^3.2.0

0 commit comments

Comments
 (0)