From f68e311176943d51f87f042e46477a4b798bd7a9 Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Thu, 30 May 2013 00:31:43 -0400 Subject: [PATCH] bug 867517 - Gecko-based WebView for Android, add GeckoView r=mfinkle --- mobile/android/base/GeckoView.java | 96 +++++++++++++++++++ mobile/android/base/Makefile.in | 1 + .../android/base/resources/values/attrs.xml | 4 + 3 files changed, 101 insertions(+) create mode 100644 mobile/android/base/GeckoView.java diff --git a/mobile/android/base/GeckoView.java b/mobile/android/base/GeckoView.java new file mode 100644 index 000000000000..414e85369e64 --- /dev/null +++ b/mobile/android/base/GeckoView.java @@ -0,0 +1,96 @@ +/* -*- 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.gecko; + +import org.mozilla.gecko.db.BrowserDB; +import org.mozilla.gecko.gfx.LayerView; +import org.mozilla.gecko.util.GeckoEventListener; +import org.mozilla.gecko.util.ThreadUtils; + +import org.json.JSONObject; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.net.Uri; +import android.os.Bundle; +import android.util.AttributeSet; +import android.util.Log; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.os.Handler; + +public class GeckoView extends LayerView + implements GeckoEventListener, ContextGetter { + static GeckoThread sGeckoThread; + + public GeckoView(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GeckoView); + String url = a.getString(R.styleable.GeckoView_url); + a.recycle(); + + Intent intent; + if (url == null) { + intent = new Intent(Intent.ACTION_MAIN); + } else { + intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + GeckoAppShell.sendEventToGecko(GeckoEvent.createURILoadEvent(url)); + } + GeckoAppShell.setContextGetter(this); + if (context instanceof Activity) { + Tabs tabs = Tabs.getInstance(); + tabs.attachToActivity((Activity) context); + } + GeckoProfile profile = GeckoProfile.get(context); + BrowserDB.initialize(profile.getName()); + GeckoAppShell.registerEventListener("Gecko:Ready", this); + + sGeckoThread = new GeckoThread(intent, url); + ThreadUtils.setGeckoThread(sGeckoThread); + ThreadUtils.setUiThread(Thread.currentThread(), new Handler()); + initializeView(GeckoAppShell.getEventDispatcher()); + if (GeckoThread.checkAndSetLaunchState(GeckoThread.LaunchState.Launching, GeckoThread.LaunchState.Launched)) { + GeckoAppShell.setLayerView(this); + sGeckoThread.start(); + } + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + + if (hasFocus) { + setBackgroundDrawable(null); + } + } + + public void loadUrl(String uri) { + Tabs.getInstance().loadUrl(uri); + } + + public void handleMessage(String event, JSONObject message) { + if (event.equals("Gecko:Ready")) { + GeckoThread.setLaunchState(GeckoThread.LaunchState.GeckoRunning); + Tab selectedTab = Tabs.getInstance().getSelectedTab(); + if (selectedTab != null) + Tabs.getInstance().notifyListeners(selectedTab, Tabs.TabEvents.SELECTED); + geckoConnected(); + GeckoAppShell.setLayerClient(getLayerClient()); + GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Viewport:Flush", null)); + show(); + requestRender(); + } + } + + public static void setGeckoInterface(GeckoAppShell.GeckoInterface aGeckoInterface) { + GeckoAppShell.setGeckoInterface(aGeckoInterface); + } +} diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index 609633ba92cf..038421fd824f 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -110,6 +110,7 @@ FENNEC_JAVA_FILES = \ GeckoJavaSampler.java \ GlobalHistory.java \ GeckoViewsFactory.java \ + GeckoView.java \ health/BrowserHealthRecorder.java \ InputMethods.java \ JavaAddonManager.java \ diff --git a/mobile/android/base/resources/values/attrs.xml b/mobile/android/base/resources/values/attrs.xml index 3d1052fb348c..94dc42c3d828 100644 --- a/mobile/android/base/resources/values/attrs.xml +++ b/mobile/android/base/resources/values/attrs.xml @@ -164,5 +164,9 @@ + + + +