Skip to content

Commit 548e50c

Browse files
committed
Update Shortcut Item
1 parent f45bd49 commit 548e50c

File tree

5 files changed

+77
-25
lines changed

5 files changed

+77
-25
lines changed

android/src/main/java/com/divyanshushekhar/flutter_shortcuts/MethodCallImplementation.java

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,32 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
4646
(ShortcutManager) context.getSystemService(Context.SHORTCUT_SERVICE);
4747
switch (call.method) {
4848
case "setShortcutItems":
49-
List<Map<String, String>> arg = call.arguments();
50-
List<ShortcutInfo> shortcuts = processShortcuts(arg);
49+
List<Map<String, String>> setShortcutItemsArgs = call.arguments();
50+
List<ShortcutInfo> shortcuts = processShortcuts(setShortcutItemsArgs);
5151
shortcutManager.setDynamicShortcuts(shortcuts);
5252
Toast.makeText(context, "Shortcut Created", Toast.LENGTH_SHORT).show();
5353
break;
54-
case "updateShortcutItems":
55-
List<Map<String, String>> updateShortcutArgs = call.arguments();
56-
List<ShortcutInfo> updateShortcuts = processShortcuts(updateShortcutArgs);
54+
case "updateAllShortcutItems":
55+
List<Map<String, String>> updateAllShortcutArgs = call.arguments();
56+
List<ShortcutInfo> updateShortcuts = processShortcuts(updateAllShortcutArgs);
5757
boolean updated = shortcutManager.updateShortcuts(updateShortcuts);
5858
Toast.makeText(context, "Shortcut Updated: " + updated, Toast.LENGTH_SHORT).show();
5959
break;
60+
case "updateShortcutItem":
61+
final List<Map<String, String>> updateShortcutItemArgs = call.arguments();
62+
Map<String, String> info = updateShortcutItemArgs.get(0);
63+
List<ShortcutInfo> previousDynamicShortcuts = shortcutManager.getDynamicShortcuts();
64+
final List<ShortcutInfo> shortcutList = new ArrayList<>();
65+
for(ShortcutInfo si : previousDynamicShortcuts) {
66+
if(si.getId().equalsIgnoreCase(info.get("id"))) {
67+
ShortcutInfo shortcutInfo = createShortcutInfo(info);
68+
shortcutList.add(shortcutInfo);
69+
continue;
70+
}
71+
shortcutList.add(si);
72+
}
73+
shortcutManager.updateShortcuts(shortcutList);
74+
break;
6075
case "clearShortcutItems":
6176
shortcutManager.removeAllDynamicShortcuts();
6277
break;
@@ -84,32 +99,41 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result
8499
}
85100

86101
@RequiresApi(api = Build.VERSION_CODES.N_MR1)
87-
@TargetApi(Build.VERSION_CODES.N_MR1)
88102
private List<ShortcutInfo> processShortcuts(List<Map<String, String>> shortcuts) {
89103
final List<ShortcutInfo> shortcutList = new ArrayList<>();
90104

91105
for (Map<String, String> shortcut : shortcuts) {
92-
final String id = shortcut.get("id");
93-
final String icon = shortcut.get("icon");
94-
final String action = shortcut.get("action");
95-
final String title = shortcut.get("title");
96-
final ShortcutInfo.Builder shortcutBuilder = new ShortcutInfo.Builder(context, id);
106+
ShortcutInfo shortcutInfo = createShortcutInfo(shortcut);
107+
shortcutList.add(shortcutInfo);
108+
}
109+
return shortcutList;
110+
}
111+
112+
@RequiresApi(api = Build.VERSION_CODES.N_MR1)
113+
private ShortcutInfo createShortcutInfo(Map<String, String> shortcut) {
114+
final String id = shortcut.get("id");
115+
final String icon = shortcut.get("icon");
116+
final String action = shortcut.get("action");
117+
final String title = shortcut.get("title");
118+
final ShortcutInfo.Builder shortcutBuilder;
119+
120+
shortcutBuilder = new ShortcutInfo.Builder(context, id);
97121

98-
final int resourceId = loadResourceId(context, icon);
99-
final Intent intent = getIntentToOpenMainActivity(action);
100122

101-
if (resourceId > 0) {
123+
final int resourceId = loadResourceId(context, icon);
124+
final Intent intent = getIntentToOpenMainActivity(action);
125+
126+
if (resourceId > 0) {
127+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
102128
shortcutBuilder.setIcon(Icon.createWithResource(context, resourceId));
103129
}
104-
105-
final ShortcutInfo shortcutInfo = shortcutBuilder
106-
.setLongLabel(title)
107-
.setShortLabel(title)
108-
.setIntent(intent)
109-
.build();
110-
shortcutList.add(shortcutInfo);
111130
}
112-
return shortcutList;
131+
132+
return shortcutBuilder
133+
.setLongLabel(title)
134+
.setShortLabel(title)
135+
.setIntent(intent)
136+
.build();
113137
}
114138

115139
private int loadResourceId(Context context, String icon) {

example/lib/main.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,20 @@ class _MyAppState extends State<MyApp> {
100100
]);
101101
},
102102
),
103+
ElevatedButton(
104+
child: Text("Update 2nd Shortcut"),
105+
onPressed: () {
106+
flutterShortcuts.updateShortcutItem(
107+
id: "1",
108+
shortcut: FlutterShortcutItem(
109+
id: "1",
110+
action: 'Fourthpage',
111+
title: 'Fourth Page 4',
112+
icon: 'ic_launcher',
113+
),
114+
);
115+
},
116+
),
103117
ElevatedButton(
104118
child: Text("Change icon of 2nd Shortcut"),
105119
onPressed: () {

lib/flutter_shortcuts.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ class FlutterShortcuts {
2727
}
2828

2929
/// updateShortcutItems() will update a single shortcut item based on id.
30-
Future<void> updateShortcutItem(
30+
Future<void> updateShortcutItem({
3131
String id,
3232
FlutterShortcutItem shortcut,
33-
) async {}
33+
}) async {
34+
return FlutterShortcutsPlatform.instance.updateShortcutItem(id, shortcut);
35+
}
3436
}

lib/src/method_call/flutter_shortcuts_method_call_handler.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,14 @@ class FlutterShortcutsMethodCallHandler extends FlutterShortcutsPlatform {
3636
Future<void> updateAllShortcutItems(List<FlutterShortcutItem> items) async {
3737
final List<Map<String, String>> itemsList =
3838
items.map(_serializeItem).toList();
39-
await channel.invokeMethod<void>('updateShortcutItems', itemsList);
39+
await channel.invokeMethod<void>('updateAllShortcutItems', itemsList);
40+
}
41+
42+
@override
43+
Future<void> updateShortcutItem(
44+
String id, FlutterShortcutItem shortcut) async {
45+
final Map<String, String> item = _serializeItem(shortcut);
46+
await channel.invokeMethod<void>('updateShortcutItem', [item]);
4047
}
4148

4249
Map<String, String> _serializeItem(FlutterShortcutItem item) {

lib/src/platform/flutter_shortcuts_platform.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,9 @@ abstract class FlutterShortcutsPlatform extends PlatformInterface {
3333
Future<void> updateAllShortcutItems(List<FlutterShortcutItem> items) async {
3434
throw UnimplementedError("updateShortcutItems() has not been implemented.");
3535
}
36+
37+
Future<void> updateShortcutItem(
38+
String id, FlutterShortcutItem shortcut) async {
39+
throw UnimplementedError("updateShortcutItems() has not been implemented.");
40+
}
3641
}

0 commit comments

Comments
 (0)