Skip to content

Commit

Permalink
[quick_actions_android] Switch to Compat version of `ShortcutManage…
Browse files Browse the repository at this point in the history
…r` to support Google surfaces (#6638)

Fixes flutter/flutter#147519
  • Loading branch information
gmackall committed May 10, 2024
1 parent 4d4567a commit a22381f
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 28 deletions.
4 changes: 4 additions & 0 deletions packages/quick_actions/quick_actions_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.0.12

* Switches from using `ShortcutManager` to `ShortcutManagerCompat`.

## 1.0.11

* Updates minSdkVersion to 19.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.content.res.Resources;
import android.graphics.drawable.Icon;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.ChecksSdkIntAtLeast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
import io.flutter.plugins.quickactions.Messages.AndroidQuickActionsApi;
import io.flutter.plugins.quickactions.Messages.FlutterError;
import io.flutter.plugins.quickactions.Messages.Result;
Expand Down Expand Up @@ -61,9 +61,7 @@ public void setShortcutItems(
result.success(null);
return;
}
ShortcutManager shortcutManager =
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
List<ShortcutInfo> shortcuts = shortcutItemMessageToShortcutInfo(itemsList);
List<ShortcutInfoCompat> shortcuts = shortcutItemMessageToShortcutInfo(itemsList);
Executor uiThreadExecutor = new UiThreadExecutor();
ThreadPoolExecutor executor =
new ThreadPoolExecutor(0, 1, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
Expand All @@ -72,7 +70,7 @@ public void setShortcutItems(
() -> {
boolean dynamicShortcutsSet = false;
try {
shortcutManager.setDynamicShortcuts(shortcuts);
ShortcutManagerCompat.setDynamicShortcuts(context, shortcuts);
dynamicShortcutsSet = true;
} catch (Exception e) {
// Leave dynamicShortcutsSet as false
Expand Down Expand Up @@ -101,18 +99,14 @@ public void clearShortcutItems() {
if (!isVersionAllowed()) {
return;
}
ShortcutManager shortcutManager =
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
shortcutManager.removeAllDynamicShortcuts();
ShortcutManagerCompat.removeAllDynamicShortcuts(context);
}

@Override
public @Nullable String getLaunchAction() {
if (!isVersionAllowed()) {
return null;
}
ShortcutManager shortcutManager =
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
if (activity == null) {
throw new FlutterError(
"quick_action_getlaunchaction_no_activity",
Expand All @@ -122,31 +116,32 @@ public void clearShortcutItems() {
final Intent intent = activity.getIntent();
final String launchAction = intent.getStringExtra(EXTRA_ACTION);
if (launchAction != null && !launchAction.isEmpty()) {
shortcutManager.reportShortcutUsed(launchAction);
ShortcutManagerCompat.reportShortcutUsed(context, launchAction);
intent.removeExtra(EXTRA_ACTION);
}
return launchAction;
}

@TargetApi(Build.VERSION_CODES.N_MR1)
private List<ShortcutInfo> shortcutItemMessageToShortcutInfo(
private List<ShortcutInfoCompat> shortcutItemMessageToShortcutInfo(
@NonNull List<ShortcutItemMessage> shortcuts) {
final List<ShortcutInfo> shortcutInfos = new ArrayList<>();
final List<ShortcutInfoCompat> shortcutInfos = new ArrayList<>();

for (ShortcutItemMessage shortcut : shortcuts) {
final String icon = shortcut.getIcon();
final String type = shortcut.getType();
final String title = shortcut.getLocalizedTitle();
final ShortcutInfo.Builder shortcutBuilder = new ShortcutInfo.Builder(context, type);
final ShortcutInfoCompat.Builder shortcutBuilder =
new ShortcutInfoCompat.Builder(context, type);

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

if (resourceId > 0) {
shortcutBuilder.setIcon(Icon.createWithResource(context, resourceId));
shortcutBuilder.setIcon(IconCompat.createWithResource(context, resourceId));
}

final ShortcutInfo shortcutInfo =
final ShortcutInfoCompat shortcutInfo =
shortcutBuilder.setLongLabel(title).setShortLabel(title).setIntent(intent).build();
shortcutInfos.add(shortcutInfo);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutManager;
import android.os.Build;
import android.util.Log;
import androidx.annotation.ChecksSdkIntAtLeast;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.pm.ShortcutManagerCompat;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
Expand Down Expand Up @@ -108,15 +108,13 @@ public boolean onNewIntent(@NonNull Intent intent) {
// Notify the Dart side if the launch intent has the intent extra relevant to quick actions.
if (intent.hasExtra(QuickActions.EXTRA_ACTION) && activity != null) {
Context context = activity.getApplicationContext();
ShortcutManager shortcutManager =
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
String shortcutId = intent.getStringExtra(QuickActions.EXTRA_ACTION);
quickActionsFlutterApi.launchAction(
shortcutId,
value -> {
// noop
});
shortcutManager.reportShortcutUsed(shortcutId);
ShortcutManagerCompat.reportShortcutUsed(context, shortcutId);
}
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ShortcutManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding;
Expand Down Expand Up @@ -76,8 +75,6 @@ public void onAttachedToActivity_buildVersionSupported_invokesLaunchMethod()
when(mockActivityPluginBinding.getActivity()).thenReturn(mockMainActivity);
final Context mockContext = mock(Context.class);
when(mockMainActivity.getApplicationContext()).thenReturn(mockContext);
final ShortcutManager mockShortcutManager = mock(ShortcutManager.class);
when(mockContext.getSystemService(Context.SHORTCUT_SERVICE)).thenReturn(mockShortcutManager);
plugin.onAttachedToActivity(mockActivityPluginBinding);

// Act
Expand Down Expand Up @@ -118,8 +115,6 @@ public void onNewIntent_buildVersionSupported_invokesLaunchMethod() {
when(mockActivityPluginBinding.getActivity()).thenReturn(mockMainActivity);
final Context mockContext = mock(Context.class);
when(mockMainActivity.getApplicationContext()).thenReturn(mockContext);
final ShortcutManager mockShortcutManager = mock(ShortcutManager.class);
when(mockContext.getSystemService(Context.SHORTCUT_SERVICE)).thenReturn(mockShortcutManager);
plugin.onAttachedToActivity(mockActivityPluginBinding);

// Act
Expand Down
2 changes: 1 addition & 1 deletion packages/quick_actions/quick_actions_android/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: quick_actions_android
description: An implementation for the Android platform of the Flutter `quick_actions` plugin.
repository: https://github.com/flutter/packages/tree/main/packages/quick_actions/quick_actions_android
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22
version: 1.0.11
version: 1.0.12

environment:
sdk: ^3.2.0
Expand Down

0 comments on commit a22381f

Please sign in to comment.