Skip to content

[quick_actions_android] Switch to Compat version of ShortcutManager to support Google surfaces #6638

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
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