| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| |
| import 'package:flutter/services.dart'; |
| import 'package:meta/meta.dart'; |
| |
| const MethodChannel _kChannel = |
| MethodChannel('plugins.flutter.io/quick_actions'); |
| |
| /// Handler for a quick action launch event. |
| /// |
| /// The argument [type] corresponds to the [ShortcutItem]'s field. |
| typedef void QuickActionHandler(String type); |
| |
| /// Home screen quick-action shortcut item. |
| class ShortcutItem { |
| /// Constructs an instance with the given [type], [localizedTitle], and |
| /// [icon]. |
| /// |
| /// Only [icon] should be nullable. It will remain `null` if unset. |
| const ShortcutItem({ |
| required this.type, |
| required this.localizedTitle, |
| this.icon, |
| }); |
| |
| /// The identifier of this item; should be unique within the app. |
| final String type; |
| |
| /// Localized title of the item. |
| final String localizedTitle; |
| |
| /// Name of native resource (xcassets etc; NOT a Flutter asset) to be |
| /// displayed as the icon for this item. |
| final String? icon; |
| } |
| |
| /// Quick actions plugin. |
| class QuickActions { |
| /// Gets an instance of the plugin with the default methodChannel. |
| /// |
| /// [initialize] should be called before using any other methods. |
| factory QuickActions() => _instance; |
| |
| /// This is a test-only constructor. Do not call this, it can break at any |
| /// time. |
| @visibleForTesting |
| QuickActions.withMethodChannel(this.channel); |
| |
| static final QuickActions _instance = |
| QuickActions.withMethodChannel(_kChannel); |
| |
| /// This is a test-only accessor. Do not call this, it can break at any time. |
| @visibleForTesting |
| final MethodChannel channel; |
| |
| /// Initializes this plugin. |
| /// |
| /// Call this once before any further interaction with the the plugin. |
| void initialize(QuickActionHandler handler) async { |
| channel.setMethodCallHandler((MethodCall call) async { |
| assert(call.method == 'launch'); |
| handler(call.arguments); |
| }); |
| final String? action = |
| await channel.invokeMethod<String?>('getLaunchAction'); |
| if (action != null) { |
| handler(action); |
| } |
| } |
| |
| /// Sets the [ShortcutItem]s to become the app's quick actions. |
| Future<void> setShortcutItems(List<ShortcutItem> items) async { |
| final List<Map<String, String?>> itemsList = |
| items.map(_serializeItem).toList(); |
| await channel.invokeMethod<void>('setShortcutItems', itemsList); |
| } |
| |
| /// Removes all [ShortcutItem]s registered for the app. |
| Future<void> clearShortcutItems() => |
| channel.invokeMethod<void>('clearShortcutItems'); |
| |
| Map<String, String?> _serializeItem(ShortcutItem item) { |
| return <String, String?>{ |
| 'type': item.type, |
| 'localizedTitle': item.localizedTitle, |
| 'icon': item.icon, |
| }; |
| } |
| } |