diff options
Diffstat (limited to 'mobile/android/geckoview_example')
10 files changed, 331 insertions, 0 deletions
diff --git a/mobile/android/geckoview_example/build.gradle b/mobile/android/geckoview_example/build.gradle new file mode 100644 index 000000000..33f8d8583 --- /dev/null +++ b/mobile/android/geckoview_example/build.gradle @@ -0,0 +1,63 @@ +buildDir "${topobjdir}/gradle/build/mobile/android/geckoview_example" + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 23 + buildToolsVersion mozconfig.substs.ANDROID_BUILD_TOOLS_VERSION + + defaultConfig { + applicationId "org.mozilla.geckoview_example" + minSdkVersion 15 + targetSdkVersion 23 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + // This is extremely frustrating, but the only way to do it automation for + // now. Without this, we only get a "debugAndroidTest" configuration; we + // have no "withoutGeckoBinariesAndroidTest" configuration. + testBuildType "withoutGeckoBinaries" + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + withGeckoBinaries { // For consistency with :geckoview project in Task Cluster invocations. + initWith debug + } + withoutGeckoBinaries { // Logical negation of withGeckoBinaries. + initWith debug + } + } +} + +dependencies { + testCompile 'junit:junit:4.12' + + compile 'com.android.support:support-annotations:23.4.0' + + androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' + androidTestCompile 'com.android.support.test:runner:0.5' + // Not defining this library again results in test-app assuming 23.1.1, and the following errors: + // "Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (23.4.0) and test app (23.1.1) differ." + androidTestCompile 'com.android.support:support-annotations:23.4.0' + + compile project(':geckoview') +} + +apply from: "${topsrcdir}/mobile/android/gradle/with_gecko_binaries.gradle" + +android.applicationVariants.all { variant -> + // Like 'debug', 'release', or 'withoutGeckoBinaries'. + def buildType = variant.buildType.name + + // It would be most natural for :geckoview to always include the Gecko + // binaries, but that's difficult; see the notes in + // mobile/android/gradle/with_gecko_binaries.gradle. Instead we handle our + // own Gecko binary inclusion. + if (!buildType.equals('withoutGeckoBinaries')) { + configureVariantWithGeckoBinaries(variant) + } +} diff --git a/mobile/android/geckoview_example/proguard-rules.pro b/mobile/android/geckoview_example/proguard-rules.pro new file mode 100644 index 000000000..46fbee549 --- /dev/null +++ b/mobile/android/geckoview_example/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/nalexander/.mozbuild/android-sdk-macosx/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/mobile/android/geckoview_example/src/androidTest/java/org/mozilla/geckoview_example/ApplicationTest.java b/mobile/android/geckoview_example/src/androidTest/java/org/mozilla/geckoview_example/ApplicationTest.java new file mode 100644 index 000000000..88630b197 --- /dev/null +++ b/mobile/android/geckoview_example/src/androidTest/java/org/mozilla/geckoview_example/ApplicationTest.java @@ -0,0 +1,13 @@ +package org.mozilla.geckoview_example; + +import android.app.Application; +import android.test.ApplicationTestCase; + +/** + * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a> + */ +public class ApplicationTest extends ApplicationTestCase<Application> { + public ApplicationTest() { + super(Application.class); + } +}
\ No newline at end of file diff --git a/mobile/android/geckoview_example/src/androidTest/java/org/mozilla/geckoview_example/GeckoViewActivityTest.java b/mobile/android/geckoview_example/src/androidTest/java/org/mozilla/geckoview_example/GeckoViewActivityTest.java new file mode 100644 index 000000000..aca127351 --- /dev/null +++ b/mobile/android/geckoview_example/src/androidTest/java/org/mozilla/geckoview_example/GeckoViewActivityTest.java @@ -0,0 +1,32 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * 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; + +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withId; + +@RunWith(AndroidJUnit4.class) +public class GeckoViewActivityTest { + + @Rule + public ActivityTestRule<GeckoViewActivity> mActivityRule = new ActivityTestRule(GeckoViewActivity.class); + + @Test + public void testA() throws InterruptedException { + onView(withId(R.id.gecko_view)) + .check(matches(isDisplayed())); + } +} diff --git a/mobile/android/geckoview_example/src/main/AndroidManifest.xml b/mobile/android/geckoview_example/src/main/AndroidManifest.xml new file mode 100644 index 000000000..551a4a7db --- /dev/null +++ b/mobile/android/geckoview_example/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="org.mozilla.geckoview_example"> + + <application android:allowBackup="true" + android:label="@string/app_name" + android:supportsRtl="true"> + + <uses-library android:name="android.test.runner" /> + + <activity android:name="org.mozilla.geckoview_example.GeckoViewActivity" + android:label="GeckoViewActivity"> + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.DEFAULT" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + + </application> + +</manifest> diff --git a/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java b/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java new file mode 100644 index 000000000..071f7ed25 --- /dev/null +++ b/mobile/android/geckoview_example/src/main/java/org/mozilla/geckoview_example/GeckoViewActivity.java @@ -0,0 +1,148 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * 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; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.os.Bundle; +import android.util.Log; +import android.widget.Toast; + +import org.mozilla.gecko.BaseGeckoInterface; +import org.mozilla.gecko.GeckoProfile; +import org.mozilla.gecko.GeckoThread; +import org.mozilla.gecko.GeckoView; +import org.mozilla.gecko.PrefsHelper; + +import static org.mozilla.gecko.GeckoView.setGeckoInterface; + +public class GeckoViewActivity extends Activity { + private static final String LOGTAG = "GeckoViewActivity"; + + GeckoView mGeckoView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setGeckoInterface(new BaseGeckoInterface(getApplicationContext())); + + setContentView(R.layout.geckoview_activity); + + mGeckoView = (GeckoView) findViewById(R.id.gecko_view); + mGeckoView.setChromeDelegate(new MyGeckoViewChrome()); + mGeckoView.setContentDelegate(new MyGeckoViewContent()); + } + + @Override + protected void onStart() { + super.onStart(); + + final GeckoProfile profile = GeckoProfile.get(getApplicationContext()); + + GeckoThread.init(profile, /* args */ null, /* action */ null, /* debugging */ false); + GeckoThread.launch(); + } + + private class MyGeckoViewChrome implements GeckoView.ChromeDelegate { + @Override + public void onReady(GeckoView view) { + Log.i(LOGTAG, "Gecko is ready"); + // // Inject a script that adds some code to the content window + // mGeckoView.importScript("resource://android/assets/script.js"); + + // Set up remote debugging to a port number + PrefsHelper.setPref("layers.dump", true); + PrefsHelper.setPref("devtools.debugger.remote-port", 6000); + PrefsHelper.setPref("devtools.debugger.unix-domain-socket", ""); + PrefsHelper.setPref("devtools.debugger.remote-enabled", true); + + // The Gecko libraries have finished loading and we can use the rendering engine. + // Let's add a browser (required) and load a page into it. + // mGeckoView.addBrowser(getResources().getString(R.string.default_url)); + } + + @Override + public void onAlert(GeckoView view, GeckoView.Browser browser, String message, GeckoView.PromptResult result) { + Log.i(LOGTAG, "Alert!"); + result.confirm(); + Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); + } + + @Override + public void onConfirm(GeckoView view, GeckoView.Browser browser, String message, final GeckoView.PromptResult result) { + Log.i(LOGTAG, "Confirm!"); + new AlertDialog.Builder(GeckoViewActivity.this) + .setTitle("javaScript dialog") + .setMessage(message) + .setPositiveButton(android.R.string.ok, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.confirm(); + } + }) + .setNegativeButton(android.R.string.cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + result.cancel(); + } + }) + .create() + .show(); + } + + @Override + public void onPrompt(GeckoView view, GeckoView.Browser browser, String message, String defaultValue, GeckoView.PromptResult result) { + result.cancel(); + } + + @Override + public void onDebugRequest(GeckoView view, GeckoView.PromptResult result) { + Log.i(LOGTAG, "Remote Debug!"); + result.confirm(); + } + + @Override + public void onScriptMessage(GeckoView view, Bundle data, GeckoView.MessageResult result) { + Log.i(LOGTAG, "Got Script Message: " + data.toString()); + String type = data.getString("type"); + if ("fetch".equals(type)) { + Bundle ret = new Bundle(); + ret.putString("name", "Mozilla"); + ret.putString("url", "https://mozilla.org"); + result.success(ret); + } + } + } + + private class MyGeckoViewContent implements GeckoView.ContentDelegate { + @Override + public void onPageStart(GeckoView view, GeckoView.Browser browser, String url) { + + } + + @Override + public void onPageStop(GeckoView view, GeckoView.Browser browser, boolean success) { + + } + + @Override + public void onPageShow(GeckoView view, GeckoView.Browser browser) { + + } + + @Override + public void onReceivedTitle(GeckoView view, GeckoView.Browser browser, String title) { + Log.i(LOGTAG, "Received a title: " + title); + } + + @Override + public void onReceivedFavicon(GeckoView view, GeckoView.Browser browser, String url, int size) { + Log.i(LOGTAG, "Received a favicon URL: " + url); + } + } +} diff --git a/mobile/android/geckoview_example/src/main/res/layout/geckoview_activity.xml b/mobile/android/geckoview_example/src/main/res/layout/geckoview_activity.xml new file mode 100644 index 000000000..eb4281fc6 --- /dev/null +++ b/mobile/android/geckoview_example/src/main/res/layout/geckoview_activity.xml @@ -0,0 +1,13 @@ +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:orientation="vertical"> + + <org.mozilla.gecko.GeckoView + android:id="@+id/gecko_view" + android:layout_width="fill_parent" + android:layout_height="match_parent" + android:scrollbars="none" + /> + +</LinearLayout> diff --git a/mobile/android/geckoview_example/src/main/res/values/colors.xml b/mobile/android/geckoview_example/src/main/res/values/colors.xml new file mode 100644 index 000000000..3ab3e9cbc --- /dev/null +++ b/mobile/android/geckoview_example/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="colorPrimary">#3F51B5</color> + <color name="colorPrimaryDark">#303F9F</color> + <color name="colorAccent">#FF4081</color> +</resources> diff --git a/mobile/android/geckoview_example/src/main/res/values/strings.xml b/mobile/android/geckoview_example/src/main/res/values/strings.xml new file mode 100644 index 000000000..1f5f447b2 --- /dev/null +++ b/mobile/android/geckoview_example/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ +<resources> + <string name="app_name">geckoview_example</string> +</resources> diff --git a/mobile/android/geckoview_example/src/test/java/org/mozilla/geckoview_example/ExampleUnitTest.java b/mobile/android/geckoview_example/src/test/java/org/mozilla/geckoview_example/ExampleUnitTest.java new file mode 100644 index 000000000..14f82340b --- /dev/null +++ b/mobile/android/geckoview_example/src/test/java/org/mozilla/geckoview_example/ExampleUnitTest.java @@ -0,0 +1,15 @@ +package org.mozilla.geckoview_example; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * To work on unit tests, switch the Test Artifact in the Build Variants view. + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() throws Exception { + assertEquals(4, 2 + 2); + } +}
\ No newline at end of file |