From feb8de34b63d38d221580e50a45f90d003e411dd Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Thu, 13 Oct 2011 07:18:33 -0700 Subject: [PATCH] Evacuate the session history stuff from GeckoApp for better encapsulation, and to make fewer things static --- embedding/android/GeckoApp.java | 65 +++----------- embedding/android/GeckoAppShell.java | 2 +- embedding/android/Makefile.in | 1 + embedding/android/SessionHistory.java | 125 ++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 56 deletions(-) create mode 100644 embedding/android/SessionHistory.java diff --git a/embedding/android/GeckoApp.java b/embedding/android/GeckoApp.java index bcb7203897b4..35d4c689ab17 100644 --- a/embedding/android/GeckoApp.java +++ b/embedding/android/GeckoApp.java @@ -89,9 +89,7 @@ abstract public class GeckoApp private BroadcastReceiver mConnectivityReceiver; public static Button mAwesomeBar; public static ProgressBar mProgressBar; - private static SQLiteDatabase mDb; - private static DatabaseHelper mDbHelper; - private static Stack sessionHistory; + private SessionHistory mSessionHistory; enum LaunchState {Launching, WaitButton, Launched, GeckoRunning, GeckoExiting}; @@ -101,15 +99,6 @@ abstract public class GeckoApp private static final int FILE_PICKER_REQUEST = 1; private static final int AWESOMEBAR_REQUEST = 2; - public static class HistoryEntry { - public String uri; - public String title; - public HistoryEntry(String uri, String title) { - this.uri = uri; - this.title = title; - } - } - static boolean checkLaunchState(LaunchState checkState) { synchronized(sLaunchState) { return sLaunchState == checkState; @@ -391,6 +380,10 @@ abstract public class GeckoApp System.exit(0); } + SessionHistory getSessionHistory() { + return mSessionHistory; + } + /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) @@ -424,9 +417,7 @@ abstract public class GeckoApp if (sGREDir == null) sGREDir = new File(this.getApplicationInfo().dataDir); - mDbHelper = new DatabaseHelper(this); - - sessionHistory = new Stack(); + mSessionHistory = new SessionHistory(this); mMainHandler = new Handler(); @@ -499,30 +490,6 @@ abstract public class GeckoApp }, 50); } - - public static void addHistoryEntry(final HistoryEntry entry) { - - class HistoryEntryTask extends AsyncTask { - protected Void doInBackground(HistoryEntry... entries) { - HistoryEntry entry = entries[0]; - Log.d("GeckoApp", "adding uri=" + entry.uri + ", title=" + entry.title + " to history"); - ContentValues values = new ContentValues(); - values.put("url", entry.uri); - values.put("title", entry.title); - if (sessionHistory.empty() || !sessionHistory.peek().uri.equals(entry.uri)) - sessionHistory.push(entry); - mDb = mDbHelper.getWritableDatabase(); - long id = mDb.insertWithOnConflict("moz_places", null, values, SQLiteDatabase.CONFLICT_REPLACE); - values = new ContentValues(); - values.put("place_id", id); - mDb.insertWithOnConflict("moz_historyvisits", null, values, SQLiteDatabase.CONFLICT_REPLACE); - return null; - } - } - - new HistoryEntryTask().execute(entry); - } - @Override protected void onNewIntent(Intent intent) { Log.w(LOGTAG, "zerdatime " + new Date().getTime() + " - onNewIntent"); @@ -652,8 +619,7 @@ abstract public class GeckoApp { Log.i(LOG_FILE_NAME, "destroy"); - if (mDb != null) - mDb.close(); + mSessionHistory.cleanup(); // Tell Gecko to shutting down; we'll end up calling System.exit() // in onXreExit. @@ -818,30 +784,19 @@ abstract public class GeckoApp public boolean onSearchRequested() { Intent searchIntent = new Intent(getBaseContext(), AwesomeBar.class); searchIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_NO_HISTORY); - if (!sessionHistory.empty()) - searchIntent.putExtra(AwesomeBar.CURRENT_URL_KEY, sessionHistory.peek().uri); - + mSessionHistory.searchRequested(searchIntent); startActivityForResult(searchIntent, AWESOMEBAR_REQUEST); return true; } public boolean doReload() { Log.i("GeckoApp", "Reload requested"); - if (sessionHistory.empty()) - return false; - String currUri = sessionHistory.peek().uri; - GeckoAppShell.sendEventToGecko(new GeckoEvent(currUri)); - return true; + return mSessionHistory.doReload(); } @Override public void onBackPressed() { - if (sessionHistory.size() > 1) { - sessionHistory.pop(); - String uri = sessionHistory.peek().uri; - Log.i("GeckoApp", "going back to page: " + uri); - loadUrl(uri); - } else { + if (!mSessionHistory.doBack()) { finish(); } } diff --git a/embedding/android/GeckoAppShell.java b/embedding/android/GeckoAppShell.java index 442dd05cb7bf..6e76baeec06f 100644 --- a/embedding/android/GeckoAppShell.java +++ b/embedding/android/GeckoAppShell.java @@ -1646,7 +1646,7 @@ public class GeckoAppShell getMainHandler().post(new Runnable() { public void run() { GeckoApp.mAwesomeBar.setText(titleText); - GeckoApp.addHistoryEntry(new GeckoApp.HistoryEntry(uri, title)); + GeckoApp.mAppContext.getSessionHistory().add(new SessionHistory.HistoryEntry(uri, title)); GeckoApp.mProgressBar.setVisibility(View.GONE); } }); diff --git a/embedding/android/Makefile.in b/embedding/android/Makefile.in index ece77123627e..63e4b9e81c7c 100644 --- a/embedding/android/Makefile.in +++ b/embedding/android/Makefile.in @@ -56,6 +56,7 @@ JAVAFILES = \ SurfaceLockInfo.java \ AwesomeBar.java \ DatabaseHelper.java \ + SessionHistory.java \ $(NULL) PROCESSEDJAVAFILES = \ diff --git a/embedding/android/SessionHistory.java b/embedding/android/SessionHistory.java new file mode 100644 index 000000000000..0c2e0e774945 --- /dev/null +++ b/embedding/android/SessionHistory.java @@ -0,0 +1,125 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; 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) 2009-2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Vladimir Vukicevic + * Matt Brubeck + * Vivien Nicolas + * Kartikaya Gupta + * + * 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 java.util.Stack; + +import android.content.*; +import android.database.sqlite.SQLiteDatabase; +import android.os.AsyncTask; +import android.util.Log; + +class SessionHistory +{ + private final GeckoApp mApp; + private final DatabaseHelper mDbHelper; + private final Stack mHistory; + private SQLiteDatabase mDb; + + SessionHistory(GeckoApp app) { + mApp = app; + mDbHelper = new DatabaseHelper(app); + mHistory = new Stack(); + } + + void add(HistoryEntry entry) { + new HistoryEntryTask().execute(entry); + } + + void searchRequested(Intent searchIntent) { + if (!mHistory.empty()) { + searchIntent.putExtra(AwesomeBar.CURRENT_URL_KEY, mHistory.peek().mUri); + } + } + + boolean doReload() { + if (mHistory.empty()) + return false; + String currUri = mHistory.peek().mUri; + GeckoAppShell.sendEventToGecko(new GeckoEvent(currUri)); + return true; + } + + boolean doBack() { + if (mHistory.size() <= 1) { + return false; + } + mHistory.pop(); + String uri = mHistory.peek().mUri; + Log.i("GeckoApp", "going back to page: " + uri); + mApp.loadUrl(uri); + return true; + } + + void cleanup() { + if (mDb != null) { + mDb.close(); + } + } + + static class HistoryEntry { + public final String mUri; + public final String mTitle; + + public HistoryEntry(String uri, String title) { + mUri = uri; + mTitle = title; + } + } + + private class HistoryEntryTask extends AsyncTask { + protected Void doInBackground(HistoryEntry... entries) { + HistoryEntry entry = entries[0]; + Log.d("GeckoApp", "adding uri=" + entry.mUri + ", title=" + entry.mTitle + " to history"); + ContentValues values = new ContentValues(); + values.put("url", entry.mUri); + values.put("title", entry.mTitle); + if (mHistory.empty() || !mHistory.peek().mUri.equals(entry.mUri)) + mHistory.push(entry); + mDb = mDbHelper.getWritableDatabase(); + long id = mDb.insertWithOnConflict("moz_places", null, values, SQLiteDatabase.CONFLICT_REPLACE); + values = new ContentValues(); + values.put("place_id", id); + mDb.insertWithOnConflict("moz_historyvisits", null, values, SQLiteDatabase.CONFLICT_REPLACE); + return null; + } + } +}