summaryrefslogtreecommitdiffstats
path: root/mobile/android/examples
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--mobile/android/examples/messaging_example/app/build.gradle53
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/AndroidManifest.xml28
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/assets/messaging/.eslintrc.js11
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/assets/messaging/manifest.json22
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/assets/messaging/messaging.js13
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java83
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml38
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/drawable/ic_launcher_background.xml174
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/layout/activity_main.xml18
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml9
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml9
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.pngbin0 -> 2963 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.pngbin0 -> 4905 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.pngbin0 -> 2060 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.pngbin0 -> 2783 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.pngbin0 -> 4490 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.pngbin0 -> 6895 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.pngbin0 -> 6387 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.pngbin0 -> 10413 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.pngbin0 -> 9128 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.pngbin0 -> 15132 bytes
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/values/colors.xml10
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/values/strings.xml7
-rw-r--r--mobile/android/examples/messaging_example/app/src/main/res/values/styles.xml15
-rw-r--r--mobile/android/examples/port_messaging_example/app/build.gradle52
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/AndroidManifest.xml28
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/.eslintrc.js11
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/background.js11
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/manifest.json15
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java98
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml38
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/drawable/ic_launcher_background.xml174
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/layout/activity_main.xml18
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml9
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml9
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.pngbin0 -> 2963 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.pngbin0 -> 4905 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.pngbin0 -> 2060 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.pngbin0 -> 2783 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.pngbin0 -> 4490 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.pngbin0 -> 6895 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.pngbin0 -> 6387 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.pngbin0 -> 10413 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.pngbin0 -> 9128 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.pngbin0 -> 15132 bytes
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/values/colors.xml10
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/values/strings.xml7
-rw-r--r--mobile/android/examples/port_messaging_example/app/src/main/res/values/styles.xml15
48 files changed, 985 insertions, 0 deletions
diff --git a/mobile/android/examples/messaging_example/app/build.gradle b/mobile/android/examples/messaging_example/app/build.gradle
new file mode 100644
index 0000000000..546b4da2f1
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/build.gradle
@@ -0,0 +1,53 @@
+buildDir "${topobjdir}/gradle/build/mobile/android/examples/messaging_example"
+
+apply plugin: 'com.android.application'
+
+apply from: "${topsrcdir}/mobile/android/gradle/product_flavors.gradle"
+
+android {
+ buildToolsVersion project.ext.buildToolsVersion
+ compileSdkVersion project.ext.compileSdkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
+ }
+ defaultConfig {
+ applicationId "org.mozilla.geckoview.example.messaging"
+ targetSdkVersion project.ext.targetSdkVersion
+ minSdkVersion project.ext.minSdkVersion
+ versionCode 1
+ versionName "1.0"
+ multiDexEnabled true
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ // By default the android plugins ignores folders that start with `_`, but
+ // we need those in web extensions.
+ // See also:
+ // - https://issuetracker.google.com/issues/36911326
+ // - https://stackoverflow.com/questions/9206117/how-to-workaround-autoomitting-fiiles-folders-starting-with-underscore-in
+ aaptOptions {
+ ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
+ noCompress 'ja'
+ }
+
+ project.configureProductFlavors.delegate = it
+ project.configureProductFlavors()
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "androidx.annotation:annotation:1.6.0"
+ implementation "androidx.appcompat:appcompat:1.6.1"
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation 'androidx.multidex:multidex:2.0.1'
+ testImplementation 'junit:junit:4.13.2'
+ // Replace this with implementation "org.mozilla.geckoview:geckoview-${geckoviewChannel}:${geckoviewVersion}"
+ implementation project(path: ':geckoview')
+}
diff --git a/mobile/android/examples/messaging_example/app/src/main/AndroidManifest.xml b/mobile/android/examples/messaging_example/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..76e5b41a83
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.mozilla.geckoview.example.messaging">
+
+ <application
+ android:allowBackup="true"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:name="androidx.multidex.MultiDexApplication"
+ android:roundIcon="@mipmap/ic_launcher_round"
+ android:supportsRtl="true"
+ android:theme="@style/AppTheme">
+ <activity
+ android:exported="true"
+ android:name=".MainActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/mobile/android/examples/messaging_example/app/src/main/assets/messaging/.eslintrc.js b/mobile/android/examples/messaging_example/app/src/main/assets/messaging/.eslintrc.js
new file mode 100644
index 0000000000..c5fda00676
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/assets/messaging/.eslintrc.js
@@ -0,0 +1,11 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+module.exports = {
+ env: {
+ webextensions: true,
+ },
+};
diff --git a/mobile/android/examples/messaging_example/app/src/main/assets/messaging/manifest.json b/mobile/android/examples/messaging_example/app/src/main/assets/messaging/manifest.json
new file mode 100644
index 0000000000..28e02ff816
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/assets/messaging/manifest.json
@@ -0,0 +1,22 @@
+{
+ "manifest_version": 2,
+ "name": "messaging",
+ "version": "1.0",
+ "description": "Example messaging web extension.",
+ "browser_specific_settings": {
+ "gecko": {
+ "id": "messaging@example.com"
+ }
+ },
+ "content_scripts": [
+ {
+ "matches": ["*://*.twitter.com/*"],
+ "js": ["messaging.js"]
+ }
+ ],
+ "permissions": [
+ "nativeMessaging",
+ "nativeMessagingFromContent",
+ "geckoViewAddons"
+ ]
+}
diff --git a/mobile/android/examples/messaging_example/app/src/main/assets/messaging/messaging.js b/mobile/android/examples/messaging_example/app/src/main/assets/messaging/messaging.js
new file mode 100644
index 0000000000..f092f2096d
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/assets/messaging/messaging.js
@@ -0,0 +1,13 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const manifest = document.querySelector("head > link[rel=manifest]");
+if (manifest) {
+ fetch(manifest.href)
+ .then(response => response.json())
+ .then(json => {
+ const message = { type: "WPAManifest", manifest: json };
+ browser.runtime.sendNativeMessage("browser", message);
+ });
+}
diff --git a/mobile/android/examples/messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java b/mobile/android/examples/messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java
new file mode 100644
index 0000000000..759951c819
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java
@@ -0,0 +1,83 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.geckoview.example.messaging;
+
+import android.os.Bundle;
+import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.mozilla.geckoview.GeckoResult;
+import org.mozilla.geckoview.GeckoRuntime;
+import org.mozilla.geckoview.GeckoRuntimeSettings;
+import org.mozilla.geckoview.GeckoSession;
+import org.mozilla.geckoview.GeckoView;
+import org.mozilla.geckoview.WebExtension;
+
+public class MainActivity extends AppCompatActivity {
+ private static GeckoRuntime sRuntime;
+
+ private static final String EXTENSION_LOCATION = "resource://android/assets/messaging/";
+ private static final String EXTENSION_ID = "messaging@example.com";
+ // If you make changes to the extension you need to update this
+ private static final String EXTENSION_VERSION = "1.0";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ GeckoView view = findViewById(R.id.geckoview);
+ GeckoSession session = new GeckoSession();
+
+ if (sRuntime == null) {
+ GeckoRuntimeSettings settings =
+ new GeckoRuntimeSettings.Builder().remoteDebuggingEnabled(true).build();
+ sRuntime = GeckoRuntime.create(this, settings);
+ }
+
+ WebExtension.MessageDelegate messageDelegate =
+ new WebExtension.MessageDelegate() {
+ @Nullable
+ @Override
+ public GeckoResult<Object> onMessage(
+ final @NonNull String nativeApp,
+ final @NonNull Object message,
+ final @NonNull WebExtension.MessageSender sender) {
+ if (message instanceof JSONObject) {
+ JSONObject json = (JSONObject) message;
+ try {
+ if (json.has("type") && "WPAManifest".equals(json.getString("type"))) {
+ JSONObject manifest = json.getJSONObject("manifest");
+ Log.d("MessageDelegate", "Found WPA manifest: " + manifest);
+ }
+ } catch (JSONException ex) {
+ Log.e("MessageDelegate", "Invalid manifest", ex);
+ }
+ }
+ return null;
+ }
+ };
+
+ // Let's make sure the extension is installed
+ sRuntime
+ .getWebExtensionController()
+ .ensureBuiltIn(EXTENSION_LOCATION, "messaging@example.com")
+ .accept(
+ // Set delegate that will receive messages coming from this extension.
+ extension ->
+ session
+ .getWebExtensionController()
+ .setMessageDelegate(extension, messageDelegate, "browser"),
+ // Something bad happened, let's log an error
+ e -> Log.e("MessageDelegate", "Error registering extension", e));
+
+ session.open(sRuntime);
+ view.setSession(session);
+ session.loadUri("https://mobile.twitter.com");
+ }
+}
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/mobile/android/examples/messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000000..6e4009f3e7
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,38 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path
+ android:fillType="evenOdd"
+ android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
+ android:strokeWidth="1"
+ android:strokeColor="#00000000">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:endX="78.5885"
+ android:endY="90.9159"
+ android:startX="48.7653"
+ android:startY="61.0927"
+ android:type="linear">
+ <item
+ android:color="#44000000"
+ android:offset="0.0" />
+ <item
+ android:color="#00000000"
+ android:offset="1.0" />
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillType="nonZero"
+ android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
+ android:strokeWidth="1"
+ android:strokeColor="#00000000" />
+</vector>
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/drawable/ic_launcher_background.xml b/mobile/android/examples/messaging_example/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000000..bcab90d6ae
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path
+ android:fillColor="#008577"
+ android:pathData="M0,0h108v108h-108z" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M9,0L9,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,0L19,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,0L29,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,0L39,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,0L49,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,0L59,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,0L69,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,0L79,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M89,0L89,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M99,0L99,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,9L108,9"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,19L108,19"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,29L108,29"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,39L108,39"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,49L108,49"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,59L108,59"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,69L108,69"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,79L108,79"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,89L108,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,99L108,99"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,29L89,29"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,39L89,39"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,49L89,49"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,59L89,59"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,69L89,69"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,79L89,79"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,19L29,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,19L39,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,19L49,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,19L59,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,19L69,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,19L79,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+</vector>
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/layout/activity_main.xml b/mobile/android/examples/messaging_example/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000000..87e7c0ae72
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity">
+
+ <org.mozilla.geckoview.GeckoView
+ android:id="@+id/geckoview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000000..f39d507313
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon> \ No newline at end of file
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000000..f39d507313
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon> \ No newline at end of file
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..898f3ed59a
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..dffca3601e
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..64ba76f75e
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..dae5e08234
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e5ed46597e
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..14ed0af350
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b0907cac3b
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..d8ae031549
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2c18de9e66
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..beed3cdd2c
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/values/colors.xml b/mobile/android/examples/messaging_example/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..8c84b9a3fc
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<resources>
+ <color name="colorPrimary">#008577</color>
+ <color name="colorPrimaryDark">#00574B</color>
+ <color name="colorAccent">#D81B60</color>
+</resources>
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/values/strings.xml b/mobile/android/examples/messaging_example/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..88982ec38c
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/values/strings.xml
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<resources>
+ <string name="app_name">MessagingExample</string>
+</resources>
diff --git a/mobile/android/examples/messaging_example/app/src/main/res/values/styles.xml b/mobile/android/examples/messaging_example/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..436c5ab087
--- /dev/null
+++ b/mobile/android/examples/messaging_example/app/src/main/res/values/styles.xml
@@ -0,0 +1,15 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<resources>
+
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <!-- Customize your theme here. -->
+ <item name="colorPrimary">@color/colorPrimary</item>
+ <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+ <item name="colorAccent">@color/colorAccent</item>
+ </style>
+
+</resources>
diff --git a/mobile/android/examples/port_messaging_example/app/build.gradle b/mobile/android/examples/port_messaging_example/app/build.gradle
new file mode 100644
index 0000000000..24966400cf
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/build.gradle
@@ -0,0 +1,52 @@
+buildDir "${topobjdir}/gradle/build/mobile/android/examples/port_messaging_example"
+
+apply plugin: 'com.android.application'
+
+apply from: "${topsrcdir}/mobile/android/gradle/product_flavors.gradle"
+
+android {
+ buildToolsVersion project.ext.buildToolsVersion
+ compileSdkVersion project.ext.compileSdkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
+ }
+ defaultConfig {
+ applicationId "org.mozilla.geckoview.example.messaging"
+ targetSdkVersion project.ext.targetSdkVersion
+ minSdkVersion project.ext.minSdkVersion
+ versionCode 1
+ versionName "1.0"
+ multiDexEnabled true
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ // By default the android plugins ignores folders that start with `_`, but
+ // we need those in web extensions.
+ // See also:
+ // - https://issuetracker.google.com/issues/36911326
+ // - https://stackoverflow.com/questions/9206117/how-to-workaround-autoomitting-fiiles-folders-starting-with-underscore-in
+ aaptOptions {
+ ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
+ noCompress 'ja'
+ }
+
+ project.configureProductFlavors.delegate = it
+ project.configureProductFlavors()
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "androidx.annotation:annotation:1.6.0"
+ implementation "androidx.appcompat:appcompat:1.6.1"
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation 'androidx.multidex:multidex:2.0.1'
+ testImplementation 'junit:junit:4.13.2'
+ implementation project(path: ':geckoview')
+}
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/AndroidManifest.xml b/mobile/android/examples/port_messaging_example/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..76e5b41a83
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/AndroidManifest.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.mozilla.geckoview.example.messaging">
+
+ <application
+ android:allowBackup="true"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:name="androidx.multidex.MultiDexApplication"
+ android:roundIcon="@mipmap/ic_launcher_round"
+ android:supportsRtl="true"
+ android:theme="@style/AppTheme">
+ <activity
+ android:exported="true"
+ android:name=".MainActivity">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/.eslintrc.js b/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/.eslintrc.js
new file mode 100644
index 0000000000..c5fda00676
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/.eslintrc.js
@@ -0,0 +1,11 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+module.exports = {
+ env: {
+ webextensions: true,
+ },
+};
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/background.js b/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/background.js
new file mode 100644
index 0000000000..0929ee35a5
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/background.js
@@ -0,0 +1,11 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// Establish connection with app
+const port = browser.runtime.connectNative("browser");
+port.onMessage.addListener(response => {
+ // Let's just echo the message back
+ port.postMessage(`Received: ${JSON.stringify(response)}`);
+});
+port.postMessage("Hello from WebExtension!");
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/manifest.json b/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/manifest.json
new file mode 100644
index 0000000000..c7deb57a94
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/assets/messaging/manifest.json
@@ -0,0 +1,15 @@
+{
+ "manifest_version": 2,
+ "name": "messaging",
+ "version": "1.0",
+ "description": "Example messaging web extension.",
+ "browser_specific_settings": {
+ "gecko": {
+ "id": "messaging@example.com"
+ }
+ },
+ "background": {
+ "scripts": ["background.js"]
+ },
+ "permissions": ["nativeMessaging", "geckoViewAddons"]
+}
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java b/mobile/android/examples/port_messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java
new file mode 100644
index 0000000000..920d8fedf6
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/java/org/mozilla/geckoview/example/messaging/MainActivity.java
@@ -0,0 +1,98 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+package org.mozilla.geckoview.example.messaging;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.mozilla.geckoview.GeckoRuntime;
+import org.mozilla.geckoview.GeckoRuntimeSettings;
+import org.mozilla.geckoview.GeckoSession;
+import org.mozilla.geckoview.GeckoView;
+import org.mozilla.geckoview.WebExtension;
+
+public class MainActivity extends AppCompatActivity {
+ private static GeckoRuntime sRuntime;
+
+ private WebExtension.Port mPort;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ GeckoView view = findViewById(R.id.geckoview);
+ GeckoSession session = new GeckoSession();
+
+ if (sRuntime == null) {
+ GeckoRuntimeSettings settings =
+ new GeckoRuntimeSettings.Builder().remoteDebuggingEnabled(true).build();
+ sRuntime = GeckoRuntime.create(this, settings);
+ }
+
+ WebExtension.PortDelegate portDelegate =
+ new WebExtension.PortDelegate() {
+ @Override
+ public void onPortMessage(
+ final @NonNull Object message, final @NonNull WebExtension.Port port) {
+ Log.d("PortDelegate", "Received message from extension: " + message);
+ }
+
+ @Override
+ public void onDisconnect(final @NonNull WebExtension.Port port) {
+ // This port is not usable anymore.
+ if (port == mPort) {
+ mPort = null;
+ }
+ }
+ };
+
+ WebExtension.MessageDelegate messageDelegate =
+ new WebExtension.MessageDelegate() {
+ @Override
+ @Nullable
+ public void onConnect(final @NonNull WebExtension.Port port) {
+ mPort = port;
+ mPort.setDelegate(portDelegate);
+ }
+ };
+
+ sRuntime
+ .getWebExtensionController()
+ .ensureBuiltIn("resource://android/assets/messaging/", "messaging@example.com")
+ .accept(
+ // Register message delegate for background script
+ extension -> extension.setMessageDelegate(messageDelegate, "browser"),
+ e -> Log.e("MessageDelegate", "Error registering WebExtension", e));
+
+ session.open(sRuntime);
+ view.setSession(session);
+ session.loadUri("https://mobile.twitter.com");
+ }
+
+ @Override
+ public boolean onKeyLongPress(int keyCode, KeyEvent event) {
+ if (mPort == null) {
+ // No extension registered yet, let's ignore this message
+ return false;
+ }
+
+ JSONObject message = new JSONObject();
+ try {
+ message.put("keyCode", keyCode);
+ message.put("event", KeyEvent.keyCodeToString(event.getKeyCode()));
+ } catch (JSONException ex) {
+ throw new RuntimeException(ex);
+ }
+
+ mPort.postMessage(message);
+ return true;
+ }
+}
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000000..6e4009f3e7
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,38 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path
+ android:fillType="evenOdd"
+ android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
+ android:strokeWidth="1"
+ android:strokeColor="#00000000">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:endX="78.5885"
+ android:endY="90.9159"
+ android:startX="48.7653"
+ android:startY="61.0927"
+ android:type="linear">
+ <item
+ android:color="#44000000"
+ android:offset="0.0" />
+ <item
+ android:color="#00000000"
+ android:offset="1.0" />
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillType="nonZero"
+ android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
+ android:strokeWidth="1"
+ android:strokeColor="#00000000" />
+</vector>
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/drawable/ic_launcher_background.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000000..bcab90d6ae
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportWidth="108"
+ android:viewportHeight="108">
+ <path
+ android:fillColor="#008577"
+ android:pathData="M0,0h108v108h-108z" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M9,0L9,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,0L19,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,0L29,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,0L39,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,0L49,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,0L59,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,0L69,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,0L79,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M89,0L89,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M99,0L99,108"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,9L108,9"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,19L108,19"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,29L108,29"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,39L108,39"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,49L108,49"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,59L108,59"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,69L108,69"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,79L108,79"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,89L108,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,99L108,99"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,29L89,29"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,39L89,39"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,49L89,49"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,59L89,59"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,69L89,69"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,79L89,79"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,19L29,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,19L39,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,19L49,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,19L59,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,19L69,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,19L79,89"
+ android:strokeWidth="0.8"
+ android:strokeColor="#33FFFFFF" />
+</vector>
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/layout/activity_main.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000000..87e7c0ae72
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity">
+
+ <org.mozilla.geckoview.GeckoView
+ android:id="@+id/geckoview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000000..f39d507313
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon> \ No newline at end of file
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000000..f39d507313
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon> \ No newline at end of file
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..898f3ed59a
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..dffca3601e
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..64ba76f75e
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..dae5e08234
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e5ed46597e
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..14ed0af350
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b0907cac3b
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..d8ae031549
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2c18de9e66
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..beed3cdd2c
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/values/colors.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..8c84b9a3fc
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<resources>
+ <color name="colorPrimary">#008577</color>
+ <color name="colorPrimaryDark">#00574B</color>
+ <color name="colorAccent">#D81B60</color>
+</resources>
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/values/strings.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..88982ec38c
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/values/strings.xml
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<resources>
+ <string name="app_name">MessagingExample</string>
+</resources>
diff --git a/mobile/android/examples/port_messaging_example/app/src/main/res/values/styles.xml b/mobile/android/examples/port_messaging_example/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..436c5ab087
--- /dev/null
+++ b/mobile/android/examples/port_messaging_example/app/src/main/res/values/styles.xml
@@ -0,0 +1,15 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<resources>
+
+ <!-- Base application theme. -->
+ <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+ <!-- Customize your theme here. -->
+ <item name="colorPrimary">@color/colorPrimary</item>
+ <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+ <item name="colorAccent">@color/colorAccent</item>
+ </style>
+
+</resources>