[quick_actions] Extract the Android implementation into a separate package (#4698)
diff --git a/packages/quick_actions/quick_actions/pubspec.yaml b/packages/quick_actions/quick_actions/pubspec.yaml
index 51cf642..b2a9f74 100644
--- a/packages/quick_actions/quick_actions/pubspec.yaml
+++ b/packages/quick_actions/quick_actions/pubspec.yaml
@@ -17,8 +17,7 @@
plugin:
platforms:
android:
- package: io.flutter.plugins.quickactions
- pluginClass: QuickActionsPlugin
+ default_package: quick_actions_android
ios:
default_package: quick_actions_ios
@@ -26,6 +25,8 @@
flutter:
sdk: flutter
# Temporary path dependencies to allow moving Android and iOS implementations.
+ quick_actions_android:
+ path: ../quick_actions_android
quick_actions_ios:
path: ../quick_actions_ios
quick_actions_platform_interface: ^1.0.0
diff --git a/packages/quick_actions/quick_actions_android/AUTHORS b/packages/quick_actions/quick_actions_android/AUTHORS
new file mode 100644
index 0000000..5f17b78
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/AUTHORS
@@ -0,0 +1,68 @@
+# Below is a list of people and organizations that have contributed
+# to the Flutter project. Names should be added to the list like so:
+#
+# Name/Organization <email address>
+
+Google Inc.
+The Chromium Authors
+German Saprykin <saprykin.h@gmail.com>
+Benjamin Sauer <sauer.benjamin@gmail.com>
+larsenthomasj@gmail.com
+Ali Bitek <alibitek@protonmail.ch>
+Pol Batlló <pol.batllo@gmail.com>
+Anatoly Pulyaevskiy
+Hayden Flinner <haydenflinner@gmail.com>
+Stefano Rodriguez <hlsroddy@gmail.com>
+Salvatore Giordano <salvatoregiordanoo@gmail.com>
+Brian Armstrong <brian@flutter.institute>
+Paul DeMarco <paulmdemarco@gmail.com>
+Fabricio Nogueira <feufeu@gmail.com>
+Simon Lightfoot <simon@devangels.london>
+Ashton Thomas <ashton@acrinta.com>
+Thomas Danner <thmsdnnr@gmail.com>
+Diego Velásquez <diego.velasquez.lopez@gmail.com>
+Hajime Nakamura <nkmrhj@gmail.com>
+Tuyển Vũ Xuân <netsoft1985@gmail.com>
+Miguel Ruivo <miguel@miguelruivo.com>
+Sarthak Verma <sarthak@artiosys.com>
+Mike Diarmid <mike@invertase.io>
+Invertase <oss@invertase.io>
+Elliot Hesp <elliot@invertase.io>
+Vince Varga <vince.varga@smaho.com>
+Aawaz Gyawali <awazgyawali@gmail.com>
+EUI Limited <ian.evans3@admiralgroup.co.uk>
+Katarina Sheremet <katarina@sheremet.ch>
+Thomas Stockx <thomas@stockxit.com>
+Sarbagya Dhaubanjar <sarbagyastha@gmail.com>
+Ozkan Eksi <ozeksi@gmail.com>
+Rishab Nayak <rishab@bu.edu>
+ko2ic <ko2ic.dev@gmail.com>
+Jonathan Younger <jonathan@daikini.com>
+Jose Sanchez <josesm82@gmail.com>
+Debkanchan Samadder <debu.samadder@gmail.com>
+Audrius Karosevicius <audrius.karosevicius@gmail.com>
+Lukasz Piliszczuk <lukasz@intheloup.io>
+SoundReply Solutions GmbH <ch@soundreply.com>
+Rafal Wachol <rwachol@gmail.com>
+Pau Picas <pau.picas@gmail.com>
+Christian Weder <chrstian.weder@yapeal.ch>
+Alexandru Tuca <salexandru.tuca@outlook.com>
+Christian Weder <chrstian.weder@yapeal.ch>
+Rhodes Davis Jr. <rody.davis.jr@gmail.com>
+Luigi Agosti <luigi@tengio.com>
+Quentin Le Guennec <quentin@tengio.com>
+Koushik Ravikumar <koushik@tengio.com>
+Nissim Dsilva <nissim@tengio.com>
+Giancarlo Rocha <giancarloiff@gmail.com>
+Ryo Miyake <ryo@miyake.id>
+Théo Champion <contact.theochampion@gmail.com>
+Kazuki Yamaguchi <y.kazuki0614n@gmail.com>
+Eitan Schwartz <eshvartz@gmail.com>
+Chris Rutkowski <chrisrutkowski89@gmail.com>
+Juan Alvarez <juan.alvarez@resideo.com>
+Aleksandr Yurkovskiy <sanekyy@gmail.com>
+Anton Borries <mail@antonborri.es>
+Alex Li <google@alexv525.com>
+Rahul Raj <64.rahulraj@gmail.com>
+Daniel Roek <daniel.roek@gmail.com>
+Maurits van Beusekom <maurits@baseflow.com>
diff --git a/packages/quick_actions/quick_actions_android/CHANGELOG.md b/packages/quick_actions/quick_actions_android/CHANGELOG.md
new file mode 100644
index 0000000..98e8cf5
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 0.6.0+9
+
+* Switches to a package-internal implementation of the platform interface.
\ No newline at end of file
diff --git a/packages/quick_actions/quick_actions_android/LICENSE b/packages/quick_actions/quick_actions_android/LICENSE
new file mode 100644
index 0000000..c6823b8
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/LICENSE
@@ -0,0 +1,25 @@
+Copyright 2013 The Flutter Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packages/quick_actions/quick_actions_android/README.md b/packages/quick_actions/quick_actions_android/README.md
new file mode 100644
index 0000000..caeb943
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/README.md
@@ -0,0 +1,17 @@
+# quick\_actions\_android
+
+The Android implementation of [`quick_actions`][1].
+
+## Usage
+
+This package is [endorsed][2], which means you can simply use `quick_actions`
+normally. This package will be automatically included in your app when you do.
+
+## Contributing
+
+If you would like to contribute to the plugin, check out our [contribution guide][3].
+
+[1]: https://pub.dev/packages/quick_actions
+[2]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin
+[3]: https://github.com/flutter/plugins/blob/master/CONTRIBUTING.md
+
diff --git a/packages/quick_actions/quick_actions/android/build.gradle b/packages/quick_actions/quick_actions_android/android/build.gradle
similarity index 100%
rename from packages/quick_actions/quick_actions/android/build.gradle
rename to packages/quick_actions/quick_actions_android/android/build.gradle
diff --git a/packages/quick_actions/quick_actions/android/settings.gradle b/packages/quick_actions/quick_actions_android/android/settings.gradle
similarity index 100%
rename from packages/quick_actions/quick_actions/android/settings.gradle
rename to packages/quick_actions/quick_actions_android/android/settings.gradle
diff --git a/packages/quick_actions/quick_actions/android/src/main/AndroidManifest.xml b/packages/quick_actions/quick_actions_android/android/src/main/AndroidManifest.xml
similarity index 100%
rename from packages/quick_actions/quick_actions/android/src/main/AndroidManifest.xml
rename to packages/quick_actions/quick_actions_android/android/src/main/AndroidManifest.xml
diff --git a/packages/quick_actions/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/MethodCallHandlerImpl.java b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/MethodCallHandlerImpl.java
similarity index 99%
rename from packages/quick_actions/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/MethodCallHandlerImpl.java
rename to packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/MethodCallHandlerImpl.java
index 34563cb..6316e84 100644
--- a/packages/quick_actions/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/MethodCallHandlerImpl.java
+++ b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/MethodCallHandlerImpl.java
@@ -27,7 +27,7 @@
class MethodCallHandlerImpl implements MethodChannel.MethodCallHandler {
protected static final String EXTRA_ACTION = "some unique action key";
- private static final String CHANNEL_ID = "plugins.flutter.io/quick_actions";
+ private static final String CHANNEL_ID = "plugins.flutter.io/quick_actions_android";
private final Context context;
private Activity activity;
diff --git a/packages/quick_actions/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
similarity index 98%
rename from packages/quick_actions/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
rename to packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
index b2f80ad..99ce0f8 100644
--- a/packages/quick_actions/quick_actions/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
+++ b/packages/quick_actions/quick_actions_android/android/src/main/java/io/flutter/plugins/quickactions/QuickActionsPlugin.java
@@ -17,7 +17,7 @@
/** QuickActionsPlugin */
public class QuickActionsPlugin implements FlutterPlugin, ActivityAware, NewIntentListener {
- private static final String CHANNEL_ID = "plugins.flutter.io/quick_actions";
+ private static final String CHANNEL_ID = "plugins.flutter.io/quick_actions_android";
private MethodChannel channel;
private MethodCallHandlerImpl handler;
diff --git a/packages/quick_actions/quick_actions/android/src/test/java/io/flutter/plugins/quickactions/QuickActionsTest.java b/packages/quick_actions/quick_actions_android/android/src/test/java/io/flutter/plugins/quickactions/QuickActionsTest.java
similarity index 98%
rename from packages/quick_actions/quick_actions/android/src/test/java/io/flutter/plugins/quickactions/QuickActionsTest.java
rename to packages/quick_actions/quick_actions_android/android/src/test/java/io/flutter/plugins/quickactions/QuickActionsTest.java
index 208a119..d2e63b6 100644
--- a/packages/quick_actions/quick_actions/android/src/test/java/io/flutter/plugins/quickactions/QuickActionsTest.java
+++ b/packages/quick_actions/quick_actions_android/android/src/test/java/io/flutter/plugins/quickactions/QuickActionsTest.java
@@ -43,7 +43,7 @@
@NonNull String channel,
@Nullable ByteBuffer message,
@Nullable final BinaryReply callback) {
- if (channel.equals("plugins.flutter.io/quick_actions")) {
+ if (channel.equals("plugins.flutter.io/quick_actions_android")) {
lastMethodCall =
StandardMethodCodec.INSTANCE.decodeMethodCall((ByteBuffer) message.position(0));
}
diff --git a/packages/quick_actions/quick_actions_android/example/README.md b/packages/quick_actions/quick_actions_android/example/README.md
new file mode 100644
index 0000000..d1b7289
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/README.md
@@ -0,0 +1,8 @@
+# quick_actions_example
+
+Demonstrates how to use the quick_actions plugin.
+
+## Getting Started
+
+For help getting started with Flutter, view our online
+[documentation](https://flutter.dev/).
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/build.gradle b/packages/quick_actions/quick_actions_android/example/android/app/build.gradle
new file mode 100644
index 0000000..54f2e59
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/build.gradle
@@ -0,0 +1,59 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+apply plugin: 'com.android.application'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+android {
+ compileSdkVersion 31
+
+ lintOptions {
+ disable 'InvalidPackage'
+ }
+
+ defaultConfig {
+ applicationId "io.flutter.plugins.quickactionsexample"
+ minSdkVersion 21
+ targetSdkVersion 28
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test:runner:1.2.0'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+ api 'androidx.test:core:1.2.0'
+}
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/gradle/wrapper/gradle-wrapper.properties b/packages/quick_actions/quick_actions_android/example/android/app/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..9a4163a
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/DartIntegrationTest.java b/packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/DartIntegrationTest.java
new file mode 100644
index 0000000..0f4298d
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/DartIntegrationTest.java
@@ -0,0 +1,14 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package io.flutter.plugins;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface DartIntegrationTest {}
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/quickactionsexample/FlutterActivityTest.java b/packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/quickactionsexample/FlutterActivityTest.java
new file mode 100644
index 0000000..e96548d
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/quickactionsexample/FlutterActivityTest.java
@@ -0,0 +1,19 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package io.flutter.plugins.quickactionsexample;
+
+import androidx.test.rule.ActivityTestRule;
+import dev.flutter.plugins.integration_test.FlutterTestRunner;
+import io.flutter.embedding.android.FlutterActivity;
+import io.flutter.plugins.DartIntegrationTest;
+import org.junit.Rule;
+import org.junit.runner.RunWith;
+
+@DartIntegrationTest
+@RunWith(FlutterTestRunner.class)
+public class FlutterActivityTest {
+ @Rule
+ public ActivityTestRule<FlutterActivity> rule = new ActivityTestRule<>(FlutterActivity.class);
+}
diff --git a/packages/quick_actions/quick_actions/example/android/app/src/androidTest/java/io/flutter/plugins/quickactionsexample/QuickActionsTest.java b/packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/quickactionsexample/QuickActionsTest.java
similarity index 100%
rename from packages/quick_actions/quick_actions/example/android/app/src/androidTest/java/io/flutter/plugins/quickactionsexample/QuickActionsTest.java
rename to packages/quick_actions/quick_actions_android/example/android/app/src/androidTest/java/io/flutter/plugins/quickactionsexample/QuickActionsTest.java
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/debug/AndroidManifest.xml b/packages/quick_actions/quick_actions_android/example/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..bee689d
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,17 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="io.flutter.plugins.quickactionsexample">
+ <!-- Flutter needs internet permission to communicate with the running application
+ to allow setting breakpoints, to provide hot reload, etc.
+ -->
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <application android:usesCleartextTraffic="true">
+ <activity
+ android:name=".QuickActionsTestActivity"
+ android:launchMode="singleTop"
+ android:theme="@style/LaunchTheme"
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
+ android:hardwareAccelerated="true"
+ android:windowSoftInputMode="adjustResize">
+ </activity>
+ </application>
+</manifest>
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/AndroidManifest.xml b/packages/quick_actions/quick_actions_android/example/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..4f384b7
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,22 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="io.flutter.plugins.quickactionsexample">
+
+ <uses-permission android:name="android.permission.INTERNET"/>
+
+ <application android:label="quick_actions_example" android:icon="@mipmap/ic_launcher">
+ <meta-data
+ android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
+ android:value="true"/>
+ <activity android:name="io.flutter.embedding.android.FlutterActivity"
+ android:theme="@style/LaunchTheme"
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection"
+ android:hardwareAccelerated="true"
+ android:windowSoftInputMode="adjustResize">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+ </activity>
+ <meta-data android:name="flutterEmbedding" android:value="2"/>
+ </application>
+</manifest>
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/java/io/flutter/plugins/quickactionsexample/QuickActionsTestActivity.java b/packages/quick_actions/quick_actions_android/example/android/app/src/main/java/io/flutter/plugins/quickactionsexample/QuickActionsTestActivity.java
new file mode 100644
index 0000000..4ff3a27
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/java/io/flutter/plugins/quickactionsexample/QuickActionsTestActivity.java
@@ -0,0 +1,20 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package io.flutter.plugins.quickactionsexample;
+
+import androidx.annotation.NonNull;
+import io.flutter.embedding.android.FlutterActivity;
+import io.flutter.embedding.engine.FlutterEngine;
+
+// Makes the FlutterEngine accessible for testing.
+public class QuickActionsTestActivity extends FlutterActivity {
+ public FlutterEngine engine;
+
+ @Override
+ public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
+ super.configureFlutterEngine(flutterEngine);
+ engine = flutterEngine;
+ }
+}
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/drawable/ic_launcher_background.xml b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..9ed3468
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector
+ android:height="108dp"
+ android:width="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <path android:fillColor="#FF2196F3"
+ android:pathData="M0,0h108v108h-108z"/>
+ <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+ <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+ android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+</vector>
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..db77bb4
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..17987b7
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..09d4391
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..d5f1c8d
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..4d6372e
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/values/styles.xml b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..6c1d1ec
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <style
+ name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
+ <item name="android:windowBackground">@drawable/ic_launcher_background</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/packages/quick_actions/quick_actions_android/example/android/build.gradle b/packages/quick_actions/quick_actions_android/example/android/build.gradle
new file mode 100644
index 0000000..e101ac0
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/build.gradle
@@ -0,0 +1,29 @@
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.3.0'
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/packages/quick_actions/quick_actions_android/example/android/gradle.properties b/packages/quick_actions/quick_actions_android/example/android/gradle.properties
new file mode 100644
index 0000000..38c8d45
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/gradle.properties
@@ -0,0 +1,4 @@
+org.gradle.jvmargs=-Xmx1536M
+android.enableR8=true
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/packages/quick_actions/quick_actions_android/example/android/gradle/wrapper/gradle-wrapper.properties b/packages/quick_actions/quick_actions_android/example/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..019065d
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
diff --git a/packages/quick_actions/quick_actions_android/example/android/settings.gradle b/packages/quick_actions/quick_actions_android/example/android/settings.gradle
new file mode 100644
index 0000000..115da6c
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/android/settings.gradle
@@ -0,0 +1,15 @@
+include ':app'
+
+def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
+
+def plugins = new Properties()
+def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
+if (pluginsFile.exists()) {
+ pluginsFile.withInputStream { stream -> plugins.load(stream) }
+}
+
+plugins.each { name, path ->
+ def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
+ include ":$name"
+ project(":$name").projectDir = pluginDirectory
+}
diff --git a/packages/quick_actions/quick_actions_android/example/integration_test/quick_actions_test.dart b/packages/quick_actions/quick_actions_android/example/integration_test/quick_actions_test.dart
new file mode 100644
index 0000000..f9c42ad
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/integration_test/quick_actions_test.dart
@@ -0,0 +1,24 @@
+// Copyright 2013 The Flutter 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 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+import 'package:quick_actions_platform_interface/quick_actions_platform_interface.dart';
+
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+ testWidgets('Can set shortcuts', (WidgetTester tester) async {
+ final QuickActionsPlatform quickActions = QuickActionsPlatform.instance;
+ await quickActions.initialize((String value) {});
+
+ const ShortcutItem shortCutItem = ShortcutItem(
+ type: 'action_one',
+ localizedTitle: 'Action one',
+ icon: 'AppIcon',
+ );
+ expect(
+ quickActions.setShortcutItems(<ShortcutItem>[shortCutItem]), completes);
+ });
+}
diff --git a/packages/quick_actions/quick_actions_android/example/lib/main.dart b/packages/quick_actions/quick_actions_android/example/lib/main.dart
new file mode 100644
index 0000000..06f1410
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/lib/main.dart
@@ -0,0 +1,82 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ignore_for_file: public_member_api_docs
+
+import 'package:flutter/material.dart';
+import 'package:quick_actions_android/quick_actions_android.dart';
+
+void main() {
+ runApp(MyApp());
+}
+
+class MyApp extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: 'Flutter Quick Actions Demo',
+ theme: ThemeData(
+ primarySwatch: Colors.blue,
+ ),
+ home: const MyHomePage(),
+ );
+ }
+}
+
+class MyHomePage extends StatefulWidget {
+ const MyHomePage({Key? key}) : super(key: key);
+
+ @override
+ _MyHomePageState createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State<MyHomePage> {
+ String shortcut = 'no action set';
+
+ @override
+ void initState() {
+ super.initState();
+
+ final QuickActionsAndroid quickActions = QuickActionsAndroid();
+ quickActions.initialize((String shortcutType) {
+ setState(() {
+ if (shortcutType != null) {
+ shortcut = shortcutType;
+ }
+ });
+ });
+
+ quickActions.setShortcutItems(<ShortcutItem>[
+ const ShortcutItem(
+ type: 'action_one',
+ localizedTitle: 'Action one',
+ icon: 'AppIcon',
+ ),
+ const ShortcutItem(
+ type: 'action_two',
+ localizedTitle: 'Action two',
+ icon: 'ic_launcher'),
+ ]).then((void _) {
+ setState(() {
+ if (shortcut == 'no action set') {
+ shortcut = 'actions ready';
+ }
+ });
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: Text(shortcut),
+ ),
+ body: const Center(
+ child: Text('On home screen, long press the app icon to '
+ 'get Action one or Action two options. Tapping on that action should '
+ 'set the toolbar title.'),
+ ),
+ );
+ }
+}
diff --git a/packages/quick_actions/quick_actions_android/example/pubspec.yaml b/packages/quick_actions/quick_actions_android/example/pubspec.yaml
new file mode 100644
index 0000000..5317097
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/pubspec.yaml
@@ -0,0 +1,28 @@
+name: quick_actions_example
+description: Demonstrates how to use the quick_actions plugin.
+publish_to: none
+
+environment:
+ sdk: ">=2.15.0 <3.0.0"
+ flutter: ">=2.8.0"
+
+dependencies:
+ flutter:
+ sdk: flutter
+ quick_actions_android:
+ # When depending on this package from a real application you should use:
+ # quick_actions_android: ^x.y.z
+ # See https://dart.dev/tools/pub/dependencies#version-constraints
+ # The example app is bundled with the plugin so we use a path dependency on
+ # the parent directory to use the current plugin's version.
+ path: ../
+
+dev_dependencies:
+ espresso: ^0.1.0+2
+ flutter_driver:
+ sdk: flutter
+ integration_test:
+ sdk: flutter
+
+flutter:
+ uses-material-design: true
diff --git a/packages/quick_actions/quick_actions_android/example/test_driver/integration_test.dart b/packages/quick_actions/quick_actions_android/example/test_driver/integration_test.dart
new file mode 100644
index 0000000..4f10f2a
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/example/test_driver/integration_test.dart
@@ -0,0 +1,7 @@
+// Copyright 2013 The Flutter 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 'package:integration_test/integration_test_driver.dart';
+
+Future<void> main() => integrationDriver();
diff --git a/packages/quick_actions/quick_actions_android/lib/quick_actions_android.dart b/packages/quick_actions/quick_actions_android/lib/quick_actions_android.dart
new file mode 100644
index 0000000..99a54e9
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/lib/quick_actions_android.dart
@@ -0,0 +1,56 @@
+// Copyright 2013 The Flutter 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 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:quick_actions_platform_interface/quick_actions_platform_interface.dart';
+
+export 'package:quick_actions_platform_interface/types/types.dart';
+
+const MethodChannel _channel =
+ MethodChannel('plugins.flutter.io/quick_actions_android');
+
+/// An implementation of [QuickActionsPlatform] that for Android.
+class QuickActionsAndroid extends QuickActionsPlatform {
+ /// Registers this class as the default instance of [QuickActionsPlatform].
+ static void registerWith() {
+ QuickActionsPlatform.instance = QuickActionsAndroid();
+ }
+
+ /// The MethodChannel that is being used by this implementation of the plugin.
+ @visibleForTesting
+ MethodChannel get channel => _channel;
+
+ @override
+ Future<void> initialize(QuickActionHandler handler) async {
+ channel.setMethodCallHandler((MethodCall call) async {
+ assert(call.method == 'launch');
+ handler(call.arguments as String);
+ });
+ final String? action =
+ await channel.invokeMethod<String?>('getLaunchAction');
+ if (action != null) {
+ handler(action);
+ }
+ }
+
+ @override
+ Future<void> setShortcutItems(List<ShortcutItem> items) async {
+ final List<Map<String, String?>> itemsList =
+ items.map(_serializeItem).toList();
+ await channel.invokeMethod<void>('setShortcutItems', itemsList);
+ }
+
+ @override
+ 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,
+ };
+ }
+}
diff --git a/packages/quick_actions/quick_actions_android/pubspec.yaml b/packages/quick_actions/quick_actions_android/pubspec.yaml
new file mode 100644
index 0000000..cf9971d
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/pubspec.yaml
@@ -0,0 +1,30 @@
+name: quick_actions_android
+description: An implementation for the Android platform of the Flutter `quick_actions` plugin.
+repository: https://github.com/flutter/plugins/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: 0.6.0+9
+
+environment:
+ sdk: ">=2.15.0 <3.0.0"
+ flutter: ">=2.8.0"
+
+flutter:
+ plugin:
+ implements: quick_actions
+ platforms:
+ android:
+ package: io.flutter.plugins.quickactions
+ pluginClass: QuickActionsPlugin
+ dartPluginClass: QuickActionsAndroid
+
+dependencies:
+ flutter:
+ sdk: flutter
+ quick_actions_platform_interface: ^1.0.0
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ integration_test:
+ sdk: flutter
+ plugin_platform_interface: ^2.1.2
diff --git a/packages/quick_actions/quick_actions_android/test/quick_actions_android_test.dart b/packages/quick_actions/quick_actions_android/test/quick_actions_android_test.dart
new file mode 100644
index 0000000..40cfe45
--- /dev/null
+++ b/packages/quick_actions/quick_actions_android/test/quick_actions_android_test.dart
@@ -0,0 +1,164 @@
+// Copyright 2013 The Flutter 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:flutter_test/flutter_test.dart';
+import 'package:quick_actions_android/quick_actions_android.dart';
+import 'package:quick_actions_platform_interface/quick_actions_platform_interface.dart';
+
+void main() {
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ group('$QuickActionsAndroid', () {
+ late List<MethodCall> log;
+
+ setUp(() {
+ log = <MethodCall>[];
+ });
+
+ QuickActionsAndroid buildQuickActionsPlugin() {
+ final QuickActionsAndroid quickActions = QuickActionsAndroid();
+ quickActions.channel
+ .setMockMethodCallHandler((MethodCall methodCall) async {
+ log.add(methodCall);
+ return '';
+ });
+
+ return quickActions;
+ }
+
+ test('registerWith() registers correct instance', () {
+ QuickActionsAndroid.registerWith();
+ expect(QuickActionsPlatform.instance, isA<QuickActionsAndroid>());
+ });
+
+ group('#initialize', () {
+ test('passes getLaunchAction on launch method', () {
+ final QuickActionsAndroid quickActions = buildQuickActionsPlugin();
+ quickActions.initialize((String type) {});
+
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall('getLaunchAction', arguments: null),
+ ],
+ );
+ });
+
+ test('initialize', () async {
+ final QuickActionsAndroid quickActions = buildQuickActionsPlugin();
+ final Completer<bool> quickActionsHandler = Completer<bool>();
+ await quickActions
+ .initialize((_) => quickActionsHandler.complete(true));
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall('getLaunchAction', arguments: null),
+ ],
+ );
+ log.clear();
+
+ expect(quickActionsHandler.future, completion(isTrue));
+ });
+ });
+
+ group('#setShortCutItems', () {
+ test('passes shortcutItem through channel', () {
+ final QuickActionsAndroid quickActions = buildQuickActionsPlugin();
+ quickActions.initialize((String type) {});
+ quickActions.setShortcutItems(<ShortcutItem>[
+ const ShortcutItem(
+ type: 'test', localizedTitle: 'title', icon: 'icon.svg')
+ ]);
+
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall('getLaunchAction', arguments: null),
+ isMethodCall('setShortcutItems', arguments: <Map<String, String>>[
+ <String, String>{
+ 'type': 'test',
+ 'localizedTitle': 'title',
+ 'icon': 'icon.svg',
+ }
+ ]),
+ ],
+ );
+ });
+
+ test('setShortcutItems with demo data', () async {
+ const String type = 'type';
+ const String localizedTitle = 'localizedTitle';
+ const String icon = 'icon';
+ final QuickActionsAndroid quickActions = buildQuickActionsPlugin();
+ await quickActions.setShortcutItems(
+ const <ShortcutItem>[
+ ShortcutItem(type: type, localizedTitle: localizedTitle, icon: icon)
+ ],
+ );
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall(
+ 'setShortcutItems',
+ arguments: <Map<String, String>>[
+ <String, String>{
+ 'type': type,
+ 'localizedTitle': localizedTitle,
+ 'icon': icon,
+ }
+ ],
+ ),
+ ],
+ );
+ log.clear();
+ });
+ });
+
+ group('#clearShortCutItems', () {
+ test('send clearShortcutItems through channel', () {
+ final QuickActionsAndroid quickActions = buildQuickActionsPlugin();
+ quickActions.initialize((String type) {});
+ quickActions.clearShortcutItems();
+
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall('getLaunchAction', arguments: null),
+ isMethodCall('clearShortcutItems', arguments: null),
+ ],
+ );
+ });
+
+ test('clearShortcutItems', () {
+ final QuickActionsAndroid quickActions = buildQuickActionsPlugin();
+ quickActions.clearShortcutItems();
+ expect(
+ log,
+ <Matcher>[
+ isMethodCall('clearShortcutItems', arguments: null),
+ ],
+ );
+ log.clear();
+ });
+ });
+ });
+
+ group('$ShortcutItem', () {
+ test('Shortcut item can be constructed', () {
+ const String type = 'type';
+ const String localizedTitle = 'title';
+ const String icon = 'foo';
+
+ const ShortcutItem item =
+ ShortcutItem(type: type, localizedTitle: localizedTitle, icon: icon);
+
+ expect(item.type, type);
+ expect(item.localizedTitle, localizedTitle);
+ expect(item.icon, icon);
+ });
+ });
+}