diff --git a/embedding/android/Favicons.java b/embedding/android/Favicons.java index 9f43ba0bb2a0..3181a21fb4a4 100644 --- a/embedding/android/Favicons.java +++ b/embedding/android/Favicons.java @@ -170,7 +170,7 @@ public class Favicons { mDbHelper.close(); } - private class LoadFaviconTask extends AsyncTask { + private class LoadFaviconTask extends GeckoAsyncTask { private String mPageUrl; private String mFaviconUrl; private OnFaviconLoadedListener mListener; diff --git a/embedding/android/GeckoApp.java b/embedding/android/GeckoApp.java index 1c6bf1377c53..5e79542b812b 100644 --- a/embedding/android/GeckoApp.java +++ b/embedding/android/GeckoApp.java @@ -341,81 +341,14 @@ abstract public class GeckoApp if (!checkAndSetLaunchState(LaunchState.Launching, LaunchState.Launched)) return false; - class GeckoTask extends AsyncTask { - protected Void doInBackground(Intent... intents) { - Intent intent = intents[0]; - File cacheFile = GeckoAppShell.getCacheDir(); - File libxulFile = new File(cacheFile, "libxul.so"); - - if ((!libxulFile.exists() || - new File(getApplication().getPackageResourcePath()).lastModified() >= libxulFile.lastModified())) { - File[] libs = cacheFile.listFiles(new FilenameFilter() { - public boolean accept(File dir, String name) { - return name.endsWith(".so"); - } - }); - if (libs != null) { - for (int i = 0; i < libs.length; i++) { - libs[i].delete(); - } - } - } - - // At some point while loading the gecko libs our default locale gets set - // so just save it to locale here and reset it as default after the join - Locale locale = Locale.getDefault(); - GeckoAppShell.loadGeckoLibs( - getApplication().getPackageResourcePath()); - Locale.setDefault(locale); - Resources res = getBaseContext().getResources(); - Configuration config = res.getConfiguration(); - config.locale = locale; - res.updateConfiguration(config, res.getDisplayMetrics()); - - Log.w(LOGTAG, "zerdatime " + new Date().getTime() + " - runGecko"); String args = intent.getStringExtra("args"); if (args != null && args.contains("-profile")) mUserDefinedProfile = true; - // and then fire us up - try { - String uri = intent.getDataString(); - String title = uri; - if (!mUserDefinedProfile && - (uri == null || uri.length() == 0)) { - SharedPreferences prefs = getSharedPreferences("GeckoApp", MODE_PRIVATE); - uri = prefs.getString("last-uri", ""); - title = prefs.getString("last-title", uri); - } - - final String awesomeTitle = title; - mMainHandler.post(new Runnable() { - public void run() { - mBrowserToolbar.setTitle(awesomeTitle); - } - }); - - Log.w(LOGTAG, "RunGecko - URI = " + uri); - - GeckoAppShell.runGecko(getApplication().getPackageResourcePath(), - args, - uri); - } catch (Exception e) { - Log.e(LOG_NAME, "top level exception", e); - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - pw.flush(); - GeckoAppShell.reportJavaCrash(sw.toString()); - } - return null; - } - } - if (intent == null) intent = getIntent(); - new GeckoTask().execute(intent); + new GeckoThread(intent).start(); return true; } @@ -1726,20 +1659,23 @@ abstract public class GeckoApp GeckoAppShell.sendEventToGecko(new GeckoEvent(event)); } - private class GeocoderTask extends AsyncTask { - protected Void doInBackground(Location... location) { + private class GeocoderRunnable implements Runnable { + Location mLocation; + GeocoderRunnable (Location location) { + mLocation = location; + } + public void run() { try { - List
addresses = mGeocoder.getFromLocation(location[0].getLatitude(), - location[0].getLongitude(), 1); + List
addresses = mGeocoder.getFromLocation(mLocation.getLatitude(), + mLocation.getLongitude(), 1); // grab the first address. in the future, // may want to expose multiple, or filter // for best. mLastGeoAddress = addresses.get(0); - GeckoAppShell.sendEventToGecko(new GeckoEvent(location[0], mLastGeoAddress)); + GeckoAppShell.sendEventToGecko(new GeckoEvent(mLocation, mLastGeoAddress)); } catch (Exception e) { Log.w(LOGTAG, "GeocoderTask "+e); } - return null; } } @@ -1751,7 +1687,7 @@ abstract public class GeckoApp mGeocoder = new Geocoder(mLayerController.getView().getContext(), Locale.getDefault()); if (mLastGeoAddress == null) { - new GeocoderTask().execute(location); + GeckoAppShell.getHandler().post(new GeocoderRunnable(location)); } else { float[] results = new float[1]; @@ -1764,7 +1700,7 @@ abstract public class GeckoApp // geocoder with very similar values, so // only call after about 100m if (results[0] > 100) - new GeocoderTask().execute(location); + GeckoAppShell.getHandler().post(new GeocoderRunnable(location)); } GeckoAppShell.sendEventToGecko(new GeckoEvent(location, mLastGeoAddress)); diff --git a/embedding/android/GeckoAsyncTask.java b/embedding/android/GeckoAsyncTask.java new file mode 100644 index 000000000000..597038a612a5 --- /dev/null +++ b/embedding/android/GeckoAsyncTask.java @@ -0,0 +1,57 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Android code. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brad Lassey + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +package org.mozilla.gecko; + +// AsyncTask runs onPostExecute on the thread it is constructed on +// We construct these off of the main thread, and we want that to run +// on the main UI thread, so this is a convenience class to do that +public abstract class GeckoAsyncTask { + public void execute(final Params... params) { + GeckoAppShell.getHandler().post(new Runnable() { + public void run() { + final Result result = doInBackground(params); + GeckoApp.mAppContext.runOnUiThread(new Runnable() { + public void run() { + onPostExecute(result); + }}); + }}); + } + + protected abstract Result doInBackground(Params... params); + protected abstract void onPostExecute(Result result); +} diff --git a/embedding/android/GeckoThread.java b/embedding/android/GeckoThread.java new file mode 100644 index 000000000000..5804f489ffb9 --- /dev/null +++ b/embedding/android/GeckoThread.java @@ -0,0 +1,128 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*- + * ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla Android code. + * + * The Initial Developer of the Original Code is Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2011 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Brad Lassey + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +package org.mozilla.gecko; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.res.Resources; +import android.content.res.Configuration; +import android.util.Log; +import android.widget.AbsoluteLayout; +import java.io.File; +import java.io.FilenameFilter; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Date; +import java.util.Locale; + +public class GeckoThread extends Thread { + + private static final String LOGTAG = "GeckoThread"; + + Intent mIntent; + + GeckoThread (Intent intent) { + mIntent = intent; + } + + public void run() { + final GeckoApp app = GeckoApp.mAppContext; + Intent intent = mIntent; + File cacheFile = GeckoAppShell.getCacheDir(); + File libxulFile = new File(cacheFile, "libxul.so"); + + if ((!libxulFile.exists() || + new File(app.getApplication().getPackageResourcePath()).lastModified() >= libxulFile.lastModified())) { + File[] libs = cacheFile.listFiles(new FilenameFilter() { + public boolean accept(File dir, String name) { + return name.endsWith(".so"); + } + }); + if (libs != null) { + for (int i = 0; i < libs.length; i++) { + libs[i].delete(); + } + } + } + + // At some point while loading the gecko libs our default locale gets set + // so just save it to locale here and reset it as default after the join + Locale locale = Locale.getDefault(); + GeckoAppShell.loadGeckoLibs( + app.getApplication().getPackageResourcePath()); + Locale.setDefault(locale); + Resources res = app.getBaseContext().getResources(); + Configuration config = res.getConfiguration(); + config.locale = locale; + res.updateConfiguration(config, res.getDisplayMetrics()); + + Log.w(LOGTAG, "zerdatime " + new Date().getTime() + " - runGecko"); + + // and then fire us up + try { + String uri = intent.getDataString(); + String title = uri; + if (!app.mUserDefinedProfile && + (uri == null || uri.length() == 0)) { + SharedPreferences prefs = app.getSharedPreferences("GeckoApp", app.MODE_PRIVATE); + uri = prefs.getString("last-uri", ""); + title = prefs.getString("last-title", uri); + } + + final String awesomeTitle = title; + app.mMainHandler.post(new Runnable() { + public void run() { + app.mBrowserToolbar.setTitle(awesomeTitle); + } + }); + + Log.w(LOGTAG, "RunGecko - URI = " + uri); + + GeckoAppShell.runGecko(app.getApplication().getPackageResourcePath(), + intent.getStringExtra("args"), + uri); + } catch (Exception e) { + Log.e(LOGTAG, "top level exception", e); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + pw.flush(); + GeckoAppShell.reportJavaCrash(sw.toString()); + } + } +} diff --git a/embedding/android/Makefile.in b/embedding/android/Makefile.in index df8e600e3841..79e2d64055aa 100644 --- a/embedding/android/Makefile.in +++ b/embedding/android/Makefile.in @@ -68,6 +68,8 @@ JAVAFILES = \ Tabs.java \ TabsTray.java \ GeckoBatteryManager.java \ + GeckoThread.java \ + GeckoAsyncTask.java \ gfx/BufferedCairoImage.java \ gfx/CairoImage.java \ gfx/CairoUtils.java \ diff --git a/embedding/android/Tab.java b/embedding/android/Tab.java index 6210c17a1804..f81ac32e3485 100644 --- a/embedding/android/Tab.java +++ b/embedding/android/Tab.java @@ -42,7 +42,6 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.graphics.drawable.Drawable; -import android.os.AsyncTask; import android.provider.Browser; import android.util.Log; @@ -162,10 +161,10 @@ public class Tab { if (he != null) { he.mTitle = mTitle; GeckoAppShell.getHandler().post(new Runnable() { - public void run() { - GlobalHistory.getInstance().update(he.mUri, he.mTitle); - } - }); + public void run() { + GlobalHistory.getInstance().update(he.mUri, he.mTitle); + } + }); } else { Log.e(LOG_NAME, "Requested title update on empty history stack"); } @@ -189,7 +188,7 @@ public class Tab { mFavicon = favicon; Log.i(LOG_NAME, "Updated favicon for tab with id: " + mId); } - + public void updateFaviconURL(String faviconUrl) { mFaviconUrl = mFaviconUrl; Log.i(LOG_NAME, "Updated favicon URL for tab with id: " + mId); @@ -280,10 +279,10 @@ public class Tab { HistoryEntry he = new HistoryEntry(uri, null); mHistory.add(he); GeckoAppShell.getHandler().post(new Runnable() { - public void run() { - GlobalHistory.getInstance().add(uri); - } - }); + public void run() { + GlobalHistory.getInstance().add(uri); + } + }); } else if (event.equals("Back")) { if (mHistoryIndex - 1 < 0) { Log.e(LOG_NAME, "Received unexpected back notification"); @@ -309,7 +308,7 @@ public class Tab { } } - private class CheckBookmarkTask extends AsyncTask { + private class CheckBookmarkTask extends GeckoAsyncTask { @Override protected Boolean doInBackground(Void... unused) { ContentResolver resolver = Tabs.getInstance().getContentResolver(); @@ -332,7 +331,7 @@ public class Tab { } } - private class AddBookmarkTask extends AsyncTask { + private class AddBookmarkTask extends GeckoAsyncTask { @Override protected Void doInBackground(Void... unused) { ContentResolver resolver = Tabs.getInstance().getContentResolver(); @@ -370,7 +369,7 @@ public class Tab { } } - private class RemoveBookmarkTask extends AsyncTask { + private class RemoveBookmarkTask extends GeckoAsyncTask { @Override protected Void doInBackground(Void... unused) { ContentResolver resolver = Tabs.getInstance().getContentResolver(); @@ -388,4 +387,4 @@ public class Tab { setBookmark(false); } } -} +}