summaryrefslogtreecommitdiffstats
path: root/src/com/android/browser/TabControl.java
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2009-03-13 13:04:24 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2009-03-13 13:04:24 -0700
commitf59ec877363eaf43118677f249008eddc7a9ce11 (patch)
tree1ad656054b6207bff725c939613fdb08a27079f9 /src/com/android/browser/TabControl.java
parentcb9a0bbc3a00a044fbfdabda920d3be80b0747f0 (diff)
downloadpackages_apps_browser-f59ec877363eaf43118677f249008eddc7a9ce11.zip
packages_apps_browser-f59ec877363eaf43118677f249008eddc7a9ce11.tar.gz
packages_apps_browser-f59ec877363eaf43118677f249008eddc7a9ce11.tar.bz2
auto import from //branches/cupcake_rel/...@138607
Diffstat (limited to 'src/com/android/browser/TabControl.java')
-rw-r--r--src/com/android/browser/TabControl.java150
1 files changed, 125 insertions, 25 deletions
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 57e55c4..d58ee22 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -174,11 +174,19 @@ class TabControl {
private Vector<Tab> mChildTabs;
private Boolean mCloseOnExit;
+ // Application identifier used to find tabs that another application
+ // wants to reuse.
+ private String mAppId;
+ // Keep the original url around to avoid killing the old WebView if the
+ // url has not changed.
+ private String mOriginalUrl;
// Construct a new tab
- private Tab(WebView w, boolean closeOnExit) {
+ private Tab(WebView w, boolean closeOnExit, String appId, String url) {
mMainView = w;
mCloseOnExit = closeOnExit;
+ mAppId = appId;
+ mOriginalUrl = url;
}
/**
@@ -403,25 +411,19 @@ class TabControl {
}
/**
- * Create a new tab and display the new tab immediately.
+ * Create a new tab.
* @return The newly createTab or null if we have reached the maximum
* number of open tabs.
*/
- Tab createNewTab(boolean closeOnExit) {
+ Tab createNewTab(boolean closeOnExit, String appId, String url) {
int size = mTabs.size();
// Return false if we have maxed out on tabs
if (MAX_TABS == size) {
return null;
}
- // Create a new WebView
- WebView w = new WebView(mActivity);
- w.setMapTrackballToArrowKeys(false); // use trackball directly
- // Add this WebView to the settings observer list and update the
- // settings
- final BrowserSettings s = BrowserSettings.getInstance();
- s.addObserver(w.getSettings()).update(s, null);
+ final WebView w = createNewWebView();
// Create a new tab and add it to the tab list
- Tab t = new Tab(w, closeOnExit);
+ Tab t = new Tab(w, closeOnExit, appId, url);
mTabs.add(t);
// Initially put the tab in the background.
putTabInBackground(t);
@@ -429,6 +431,14 @@ class TabControl {
}
/**
+ * Create a new tab with default values for closeOnExit(false),
+ * appId(null), and url(null).
+ */
+ Tab createNewTab() {
+ return createNewTab(false, null, null);
+ }
+
+ /**
* Remove the tab from the list. If the tab is the current tab shown, the
* last created tab will be shown.
* @param t The tab to be removed.
@@ -536,6 +546,8 @@ class TabControl {
private static final String CURRTITLE = "currentTitle";
private static final String CLOSEONEXIT = "closeonexit";
private static final String PARENTTAB = "parentTab";
+ private static final String APPID = "appid";
+ private static final String ORIGINALURL = "originalUrl";
/**
* Save the state of all the Tabs.
@@ -569,7 +581,7 @@ class TabControl {
final int currentTab = inState.getInt(CURRTAB, -1);
for (int i = 0; i < numTabs; i++) {
if (i == currentTab) {
- Tab t = createNewTab(false);
+ Tab t = createNewTab();
// Me must set the current tab before restoring the state
// so that all the client classes are set.
setCurrentTab(t);
@@ -581,11 +593,15 @@ class TabControl {
} else {
// Create a new tab and don't restore the state yet, add it
// to the tab list
- Tab t = new Tab(null, false);
+ Tab t = new Tab(null, false, null, null);
t.mSavedState = inState.getBundle(WEBVIEW + i);
if (t.mSavedState != null) {
t.mUrl = t.mSavedState.getString(CURRURL);
t.mTitle = t.mSavedState.getString(CURRTITLE);
+ // Need to maintain the app id and original url so we
+ // can possibly reuse this tab.
+ t.mAppId = t.mSavedState.getString(APPID);
+ t.mOriginalUrl = t.mSavedState.getString(ORIGINALURL);
}
mTabs.add(t);
mTabQueue.add(t);
@@ -727,13 +743,92 @@ class TabControl {
}
/**
+ * Return the tab with the matching application id.
+ * @param id The application identifier.
+ */
+ Tab getTabFromId(String id) {
+ if (id == null) {
+ return null;
+ }
+ final int size = getTabCount();
+ for (int i = 0; i < size; i++) {
+ final Tab t = getTab(i);
+ if (id.equals(t.mAppId)) {
+ return t;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Recreate the main WebView of the given tab. Returns true if the WebView
+ * was deleted.
+ */
+ boolean recreateWebView(Tab t, String url) {
+ final WebView w = t.mMainView;
+ if (w != null) {
+ if (url != null && url.equals(t.mOriginalUrl)) {
+ // The original url matches the current url. Just go back to the
+ // first history item so we can load it faster than if we
+ // rebuilt the WebView.
+ final WebBackForwardList list = w.copyBackForwardList();
+ if (list != null) {
+ w.goBackOrForward(-list.getCurrentIndex());
+ w.clearHistory(); // maintains the current page.
+ return false;
+ }
+ }
+ // Remove the settings object from the global settings and destroy
+ // the WebView.
+ BrowserSettings.getInstance().deleteObserver(
+ t.mMainView.getSettings());
+ t.mMainView.destroy();
+ }
+ // Create a new WebView. If this tab is the current tab, we need to put
+ // back all the clients so force it to be the current tab.
+ t.mMainView = createNewWebView();
+ if (getCurrentTab() == t) {
+ setCurrentTab(t, true);
+ }
+ // Clear the saved state except for the app id and close-on-exit
+ // values.
+ t.mSavedState = null;
+ t.mUrl = null;
+ t.mTitle = null;
+ // Save the new url in order to avoid deleting the WebView.
+ t.mOriginalUrl = url;
+ return true;
+ }
+
+ /**
+ * Creates a new WebView and registers it with the global settings.
+ */
+ private WebView createNewWebView() {
+ // Create a new WebView
+ WebView w = new WebView(mActivity);
+ w.setMapTrackballToArrowKeys(false); // use trackball directly
+ // Add this WebView to the settings observer list and update the
+ // settings
+ final BrowserSettings s = BrowserSettings.getInstance();
+ s.addObserver(w.getSettings()).update(s, null);
+ return w;
+ }
+
+ /**
* Put the current tab in the background and set newTab as the current tab.
* @param newTab The new tab. If newTab is null, the current tab is not
* set.
*/
boolean setCurrentTab(Tab newTab) {
+ return setCurrentTab(newTab, false);
+ }
+
+ /**
+ * If force is true, this method skips the check for newTab == current.
+ */
+ private boolean setCurrentTab(Tab newTab, boolean force) {
Tab current = getTab(mCurrentTab);
- if (current == newTab) {
+ if (current == newTab && !force) {
return true;
}
if (current != null) {
@@ -761,13 +856,7 @@ class TabControl {
boolean needRestore = (mainView == null);
if (needRestore) {
// Same work as in createNewTab() except don't do new Tab()
- newTab.mMainView = mainView = new WebView(mActivity);
- mainView.setMapTrackballToArrowKeys(false); // use t-ball directly
-
- // Add this WebView to the settings observer list and update the
- // settings
- final BrowserSettings s = BrowserSettings.getInstance();
- s.addObserver(mainView.getSettings()).update(s, null);
+ newTab.mMainView = mainView = createNewWebView();
}
mainView.setWebViewClient(mActivity.getWebViewClient());
mainView.setWebChromeClient(mActivity.getWebChromeClient());
@@ -900,6 +989,12 @@ class TabControl {
b.putString(CURRTITLE, t.mTitle);
}
b.putBoolean(CLOSEONEXIT, t.mCloseOnExit);
+ if (t.mAppId != null) {
+ b.putString(APPID, t.mAppId);
+ }
+ if (t.mOriginalUrl != null) {
+ b.putString(ORIGINALURL, t.mOriginalUrl);
+ }
// Remember the parent tab so the relationship can be restored.
if (t.mParentTab != null) {
@@ -920,6 +1015,15 @@ class TabControl {
if (b == null) {
return false;
}
+ // Restore the internal state even if the WebView fails to restore.
+ // This will maintain the app id, original url and close-on-exit values.
+ t.mSavedState = null;
+ t.mUrl = null;
+ t.mTitle = null;
+ t.mCloseOnExit = b.getBoolean(CLOSEONEXIT);
+ t.mAppId = b.getString(APPID);
+ t.mOriginalUrl = b.getString(ORIGINALURL);
+
final WebView w = t.mMainView;
final WebBackForwardList list = w.restoreState(b);
if (list == null) {
@@ -930,10 +1034,6 @@ class TabControl {
w.restorePicture(b, f);
f.delete();
}
- t.mSavedState = null;
- t.mUrl = null;
- t.mTitle = null;
- t.mCloseOnExit = b.getBoolean(CLOSEONEXIT);
return true;
}
}