[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);
+    });
+  });
+}