summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/android/browser/ActiveTabsPage.java3
-rw-r--r--src/com/android/browser/Controller.java70
-rw-r--r--src/com/android/browser/IntentHandler.java4
-rw-r--r--src/com/android/browser/NavScreen.java4
-rw-r--r--src/com/android/browser/PieControl.java5
-rw-r--r--src/com/android/browser/Tab.java89
-rw-r--r--src/com/android/browser/TabBar.java9
-rw-r--r--src/com/android/browser/TabControl.java194
-rw-r--r--src/com/android/browser/UiController.java2
-rw-r--r--src/com/android/browser/UrlHandler.java2
-rw-r--r--src/com/android/browser/WebViewController.java2
11 files changed, 186 insertions, 198 deletions
diff --git a/src/com/android/browser/ActiveTabsPage.java b/src/com/android/browser/ActiveTabsPage.java
index 52d943f..0feba9a 100644
--- a/src/com/android/browser/ActiveTabsPage.java
+++ b/src/com/android/browser/ActiveTabsPage.java
@@ -83,7 +83,8 @@ public class ActiveTabsPage extends LinearLayout implements OnClickListener,
@Override
public void onItemClick(
AdapterView<?> parent, View view, int position, long id) {
- boolean needToAttach = !mController.switchToTab(position);
+ final Tab tab = mTabControl.getTab(position);
+ boolean needToAttach = !mController.switchToTab(tab);
mController.removeActiveTabsPage(needToAttach);
}
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 4b72ce3..2a7e8eb 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -281,10 +281,10 @@ public class Controller
|| lastActiveDate.after(today));
// Find out if we will restore any state and remember the tab.
- final int currentTab =
+ final long currentTabId =
mTabControl.canRestoreState(icicle, restoreIncognitoTabs);
- if (currentTab == -1) {
+ if (currentTabId == -1) {
// Not able to restore so we go ahead and clear session cookies. We
// must do this before trying to login the user as we don't want to
// clear any session cookies set during login.
@@ -294,14 +294,14 @@ public class Controller
GoogleAccountLogin.startLoginIfNeeded(mActivity,
new Runnable() {
@Override public void run() {
- onPreloginFinished(icicle, intent, currentTab, restoreIncognitoTabs);
+ onPreloginFinished(icicle, intent, currentTabId, restoreIncognitoTabs);
}
});
}
- private void onPreloginFinished(Bundle icicle, Intent intent, int currentTab,
+ private void onPreloginFinished(Bundle icicle, Intent intent, long currentTabId,
boolean restoreIncognitoTabs) {
- if (currentTab == -1) {
+ if (currentTabId == -1) {
final Bundle extra = intent.getExtras();
// Create an initial tab.
// If the intent is ACTION_VIEW and data is not null, the Browser is
@@ -325,7 +325,7 @@ public class Controller
}
}
} else {
- mTabControl.restoreState(icicle, currentTab, restoreIncognitoTabs,
+ mTabControl.restoreState(icicle, currentTabId, restoreIncognitoTabs,
mUi.needsRestoreAllTabs());
mUi.updateTabs(mTabControl.getTabs());
// TabControl.restoreState() will create a new tab even if
@@ -1711,7 +1711,7 @@ public class Controller
Tab desiredTab = mTabControl.getTab(id);
if (desiredTab != null &&
desiredTab != mTabControl.getCurrentTab()) {
- switchToTab(id);
+ switchToTab(desiredTab);
}
break;
}
@@ -2144,9 +2144,9 @@ public class Controller
Tab current = mTabControl.getCurrentTab();
if (current != null
&& current.getWebView().copyBackForwardList().getSize() == 0) {
- Tab parent = current.getParentTab();
+ Tab parent = current.getParent();
if (parent != null) {
- switchToTab(mTabControl.getTabIndex(parent));
+ switchToTab(parent);
closeTab(current);
}
}
@@ -2163,7 +2163,7 @@ public class Controller
// TODO: analyze why the remove and add are necessary
mUi.attachTab(appTab);
if (mTabControl.getCurrentTab() != appTab) {
- switchToTab(mTabControl.getTabIndex(appTab));
+ switchToTab(appTab);
loadUrlDataIn(appTab, urlData);
} else {
// If the tab was the current tab, we have to attach
@@ -2256,17 +2256,15 @@ public class Controller
}
/**
- * @param index Index of the tab to change to, as defined by
- * mTabControl.getTabIndex(Tab t).
+ * @param tab the tab to switch to
* @return boolean True if we successfully switched to a different tab. If
* the indexth tab is null, or if that tab is the same as
* the current one, return false.
*/
@Override
- public boolean switchToTab(int index) {
+ public boolean switchToTab(Tab tab) {
// hide combo view if open
removeComboView();
- Tab tab = mTabControl.getTab(index);
Tab currentTab = mTabControl.getCurrentTab();
if (tab == null || tab == currentTab) {
return false;
@@ -2279,25 +2277,20 @@ public class Controller
public void closeCurrentTab() {
// hide combo view if open
removeComboView();
- final Tab current = mTabControl.getCurrentTab();
if (mTabControl.getTabCount() == 1) {
mActivity.finish();
return;
}
- final Tab parent = current.getParentTab();
- int indexToShow = -1;
- if (parent != null) {
- indexToShow = mTabControl.getTabIndex(parent);
- } else {
- final int currentIndex = mTabControl.getCurrentIndex();
- // Try to move to the tab to the right
- indexToShow = currentIndex + 1;
- if (indexToShow > mTabControl.getTabCount() - 1) {
- // Try to move to the tab to the left
- indexToShow = currentIndex - 1;
+ final Tab current = mTabControl.getCurrentTab();
+ final int pos = mTabControl.getCurrentPosition();
+ Tab newTab = current.getParent();
+ if (newTab == null) {
+ newTab = mTabControl.getTab(pos + 1);
+ if (newTab == null) {
+ newTab = mTabControl.getTab(pos - 1);
}
}
- if (switchToTab(indexToShow)) {
+ if (switchToTab(newTab)) {
// Close window
closeTab(current);
}
@@ -2311,10 +2304,6 @@ public class Controller
public void closeTab(Tab tab) {
// hide combo view if open
removeComboView();
- int currentIndex = mTabControl.getCurrentIndex();
- int removeIndex = mTabControl.getTabIndex(tab);
- Tab newtab = mTabControl.getTab(currentIndex);
- setActiveTab(newtab);
removeTab(tab);
}
@@ -2382,9 +2371,9 @@ public class Controller
} else {
// Check to see if we are closing a window that was created by
// another window. If so, we switch back to that window.
- Tab parent = current.getParentTab();
+ Tab parent = current.getParent();
if (parent != null) {
- switchToTab(mTabControl.getTabIndex(parent));
+ switchToTab(parent);
// Now we close the other tab
closeTab(current);
} else {
@@ -2445,17 +2434,18 @@ public class Controller
* helper method for key handler
* returns the current tab if it can't advance
*/
- private int getNextTabIndex() {
- return Math.min(mTabControl.getTabCount() - 1,
- mTabControl.getCurrentIndex() + 1);
+ private Tab getNextTab() {
+ return mTabControl.getTab(Math.min(mTabControl.getTabCount() - 1,
+ mTabControl.getCurrentPosition() + 1));
}
/**
* helper method for key handler
* returns the current tab if it can't advance
*/
- private int getPrevTabIndex() {
- return Math.max(0, mTabControl.getCurrentIndex() - 1);
+ private Tab getPrevTab() {
+ return mTabControl.getTab(Math.max(0,
+ mTabControl.getCurrentPosition() - 1));
}
/**
@@ -2489,10 +2479,10 @@ public class Controller
if (event.isCtrlPressed()) {
if (event.isShiftPressed()) {
// prev tab
- switchToTab(getPrevTabIndex());
+ switchToTab(getPrevTab());
} else {
// next tab
- switchToTab(getNextTabIndex());
+ switchToTab(getNextTab());
}
return true;
}
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index 40db29f..8d1b784 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -146,7 +146,7 @@ public class IntentHandler {
&& !mActivity.getPackageName().equals(appId)
&& (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
if (activateVoiceSearch) {
- Tab appTab = mTabControl.getTabFromId(appId);
+ Tab appTab = mTabControl.getTabFromAppId(appId);
if (appTab != null) {
mController.reuseTab(appTab, appId, urlData);
return;
@@ -162,7 +162,7 @@ public class IntentHandler {
Tab appTab = mTabControl.findUnusedTabWithUrl(urlData.mUrl);
if (appTab != null) {
if (current != appTab) {
- mController.switchToTab(mTabControl.getTabIndex(appTab));
+ mController.switchToTab(appTab);
}
// Otherwise, we are already viewing the correct tab.
} else {
diff --git a/src/com/android/browser/NavScreen.java b/src/com/android/browser/NavScreen.java
index 9f2d4ae..a5090fa 100644
--- a/src/com/android/browser/NavScreen.java
+++ b/src/com/android/browser/NavScreen.java
@@ -206,7 +206,7 @@ public class NavScreen extends LinearLayout implements OnClickListener {
: R.drawable.ic_forward_disabled_holo_dark);
}
if (updateFlipper) {
- mFlipper.setSelection(mUiController.getTabControl().getTabIndex(tab));
+ mFlipper.setSelection(mUiController.getTabControl().getTabPosition(tab));
}
}
@@ -249,7 +249,7 @@ public class NavScreen extends LinearLayout implements OnClickListener {
if (tab != null) {
// set tab as the selected in flipper, then hide
- final int tix = mUi.mTabControl.getTabIndex(tab);
+ final int tix = mUi.mTabControl.getTabPosition(tab);
post(new Runnable() {
public void run() {
if (tix != -1) {
diff --git a/src/com/android/browser/PieControl.java b/src/com/android/browser/PieControl.java
index 684cd1a..8bcd972 100644
--- a/src/com/android/browser/PieControl.java
+++ b/src/com/android/browser/PieControl.java
@@ -142,7 +142,7 @@ public class PieControl implements OnClickListener, PieMenu.PieController {
mUi.captureTab(mUi.getActiveTab());
mTabAdapter.setTabs(tabs);
PieStackView sym = (PieStackView) mShowTabs.getPieView();
- sym.setCurrent(mUiController.getTabControl().getCurrentIndex());
+ sym.setCurrent(mUiController.getTabControl().getCurrentPosition());
}
@@ -281,8 +281,7 @@ public class PieControl implements OnClickListener, PieMenu.PieController {
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- mUiController.switchToTab(mUiController.getTabControl()
- .getTabIndex(tab));
+ mUiController.switchToTab(tab);
}
});
return view;
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index c217e6e..e1dd1ca 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -88,6 +88,9 @@ class Tab {
Activity mActivity;
private WebViewController mWebViewController;
+ // The tab ID
+ private long mId;
+
// The Geolocation permissions prompt
private GeolocationPermissionsPrompt mGeolocationPermissionsPrompt;
// Main WebView wrapper
@@ -104,10 +107,10 @@ class Tab {
private Bundle mSavedState;
// Parent Tab. This is the Tab that created this Tab, or null if the Tab was
// created by the UI
- private Tab mParentTab;
+ private Tab mParent;
// Tab that constructed by this Tab. This is used when this Tab is
// destroyed, it clears all mParentTab values in the children.
- private Vector<Tab> mChildTabs;
+ private Vector<Tab> mChildren;
// If true, the tab is in the foreground of the current activity.
private boolean mInForeground;
// If true, the tab is in page loading state (after onPageStarted,
@@ -181,17 +184,11 @@ class Tab {
private PageState mCurrentState;
// Used for saving and restoring each Tab
- // TODO: Figure out who uses what and where
- // Some of these aren't use in this class, and some are only used in
- // restoring state but not saving it - FIX THIS
- static final String WEBVIEW = "webview";
- static final String NUMTABS = "numTabs";
- static final String CURRTAB = "currentTab";
+ static final String ID = "ID";
static final String CURRURL = "currentUrl";
static final String CURRTITLE = "currentTitle";
static final String PARENTTAB = "parentTab";
static final String APPID = "appid";
- static final String ORIGINALURL = "originalUrl";
static final String INCOGNITO = "privateBrowsingEnabled";
static final String SCREENSHOT = "screenshot";
@@ -935,18 +932,16 @@ class Tab {
@Override
public void onRequestFocus(WebView view) {
if (!mInForeground) {
- mWebViewController.switchToTab(mWebViewController.getTabControl().getTabIndex(
- Tab.this));
+ mWebViewController.switchToTab(Tab.this);
}
}
@Override
public void onCloseWindow(WebView window) {
- if (mParentTab != null) {
+ if (mParent != null) {
// JavaScript can only close popup window.
if (mInForeground) {
- mWebViewController.switchToTab(mWebViewController.getTabControl()
- .getTabIndex(mParentTab));
+ mWebViewController.switchToTab(mParent);
}
mWebViewController.closeTab(Tab.this);
}
@@ -1324,6 +1319,14 @@ class Tab {
setWebView(w);
}
+ public void setId(long id) {
+ mId = id;
+ }
+
+ public long getId() {
+ return mId;
+ }
+
/**
* Sets the WebView for this tab, correctly removing the old WebView from
* the container view.
@@ -1374,14 +1377,14 @@ class Tab {
*/
void removeFromTree() {
// detach the children
- if (mChildTabs != null) {
- for(Tab t : mChildTabs) {
- t.setParentTab(null);
+ if (mChildren != null) {
+ for(Tab t : mChildren) {
+ t.setParent(null);
}
}
// remove itself from the parent list
- if (mParentTab != null) {
- mParentTab.mChildTabs.remove(this);
+ if (mParent != null) {
+ mParent.mChildren.remove(this);
}
}
@@ -1433,37 +1436,45 @@ class Tab {
/**
* Set the parent tab of this tab.
*/
- void setParentTab(Tab parent) {
- mParentTab = parent;
+ void setParent(Tab parent) {
+ mParent = parent;
// This tab may have been freed due to low memory. If that is the case,
- // the parent tab index is already saved. If we are changing that index
+ // the parent tab id is already saved. If we are changing that id
// (most likely due to removing the parent tab) we must update the
- // parent tab index in the saved Bundle.
+ // parent tab id in the saved Bundle.
if (mSavedState != null) {
if (parent == null) {
mSavedState.remove(PARENTTAB);
} else {
- mSavedState.putInt(PARENTTAB, mWebViewController.getTabControl()
- .getTabIndex(parent));
+ mSavedState.putLong(PARENTTAB, parent.getId());
}
}
}
/**
+ * If this Tab was created through another Tab, then this method returns
+ * that Tab.
+ * @return the Tab parent or null
+ */
+ public Tab getParent() {
+ return mParent;
+ }
+
+ /**
* When a Tab is created through the content of another Tab, then we
* associate the Tabs.
* @param child the Tab that was created from this Tab
*/
void addChildTab(Tab child) {
- if (mChildTabs == null) {
- mChildTabs = new Vector<Tab>();
+ if (mChildren == null) {
+ mChildren = new Vector<Tab>();
}
- mChildTabs.add(child);
- child.setParentTab(this);
+ mChildren.add(child);
+ child.setParent(this);
}
- Vector<Tab> getChildTabs() {
- return mChildTabs;
+ Vector<Tab> getChildren() {
+ return mChildren;
}
void resume() {
@@ -1651,15 +1662,6 @@ class Tab {
return mErrorConsole;
}
- /**
- * If this Tab was created through another Tab, then this method returns
- * that Tab.
- * @return the Tab parent or null
- */
- public Tab getParentTab() {
- return mParentTab;
- }
-
private void setLockIconType(LockIcon icon) {
mCurrentState.mLockIcon = icon;
mWebViewController.onUpdatedLockIcon(this);
@@ -1724,15 +1726,15 @@ class Tab {
// Store some extra info for displaying the tab in the picker.
final WebHistoryItem item = list != null ? list.getCurrentItem() : null;
+ mSavedState.putLong(ID, mId);
mSavedState.putString(CURRURL, mCurrentState.mUrl);
mSavedState.putString(CURRTITLE, mCurrentState.mTitle);
if (mAppId != null) {
mSavedState.putString(APPID, mAppId);
}
// Remember the parent tab so the relationship can be restored.
- if (mParentTab != null) {
- mSavedState.putInt(PARENTTAB, mWebViewController.getTabControl().getTabIndex(
- mParentTab));
+ if (mParent != null) {
+ mSavedState.putLong(PARENTTAB, mParent.mId);
}
if (mScreenshot != null) {
mSavedState.putParcelable(SCREENSHOT, mScreenshot);
@@ -1750,6 +1752,7 @@ class Tab {
// Restore the internal state even if the WebView fails to restore.
// This will maintain the app id, original url and close-on-exit values.
mSavedState = null;
+ mId = b.getLong(ID);
mAppId = b.getString(APPID);
mScreenshot = b.getParcelable(SCREENSHOT);
diff --git a/src/com/android/browser/TabBar.java b/src/com/android/browser/TabBar.java
index 31c0740..a574d26 100644
--- a/src/com/android/browser/TabBar.java
+++ b/src/com/android/browser/TabBar.java
@@ -155,7 +155,7 @@ public class TabBar extends LinearLayout
TabView tv = buildTabView(tab);
mTabs.addTab(tv);
}
- mTabs.setSelectedTab(mTabControl.getCurrentIndex());
+ mTabs.setSelectedTab(mTabControl.getCurrentPosition());
}
@Override
@@ -210,11 +210,12 @@ public class TabBar extends LinearLayout
} else {
showUrlBar();
}
- } else {
+ } else if (view instanceof TabView) {
+ final Tab tab = ((TabView) view).mTab;
int ix = mTabs.getChildIndex(view);
if (ix >= 0) {
mTabs.setSelectedTab(ix);
- mUiController.switchToTab(ix);
+ mUiController.switchToTab(tab);
}
}
}
@@ -601,7 +602,7 @@ public class TabBar extends LinearLayout
// TabChangeListener implementation
public void onSetActiveTab(Tab tab) {
- mTabs.setSelectedTab(mTabControl.getTabIndex(tab));
+ mTabs.setSelectedTab(mTabControl.getTabPosition(tab));
TabView tv = mTabMap.get(tab);
if (tv != null) {
tv.setProgress(tv.mTab.getLoadProgress());
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 8be3041..1fe9053 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -29,6 +29,13 @@ import java.util.Vector;
class TabControl {
// Log Tag
private static final String LOGTAG = "TabControl";
+
+ // next Tab ID
+ private static long sNextId = 0;
+
+ private static final String POSITIONS = "positions";
+ private static final String CURRENT = "current";
+
// Maximum number of tabs.
private int mMaxTabs;
// Private array of WebViews that are used as tabs.
@@ -54,6 +61,10 @@ class TabControl {
mTabQueue = new ArrayList<Tab>(mMaxTabs);
}
+ static long getNextId() {
+ return sNextId++;
+ }
+
File getThumbnailDir() {
return mThumbnailDir;
}
@@ -104,13 +115,13 @@ class TabControl {
}
/**
- * Return the tab at the specified index.
- * @return The Tab for the specified index or null if the tab does not
+ * Return the tab at the specified position.
+ * @return The Tab for the specified position or null if the tab does not
* exist.
*/
- Tab getTab(int index) {
- if (index >= 0 && index < mTabs.size()) {
- return mTabs.get(index);
+ Tab getTab(int position) {
+ if (position >= 0 && position < mTabs.size()) {
+ return mTabs.get(position);
}
return null;
}
@@ -124,19 +135,19 @@ class TabControl {
}
/**
- * Return the current tab index.
- * @return The current tab index
+ * Return the current tab position.
+ * @return The current tab position
*/
- int getCurrentIndex() {
+ int getCurrentPosition() {
return mCurrentTab;
}
/**
- * Given a Tab, find it's index
+ * Given a Tab, find it's position
* @param Tab to find
- * @return index of Tab or -1 if not found
+ * @return position of Tab or -1 if not found
*/
- int getTabIndex(Tab tab) {
+ int getTabPosition(Tab tab) {
if (tab == null) {
return -1;
}
@@ -153,7 +164,8 @@ class TabControl {
*/
boolean hasAnyOpenIncognitoTabs() {
for (Tab tab : mTabs) {
- if (tab.getWebView() != null && tab.getWebView().isPrivateBrowsingEnabled()) {
+ if (tab.getWebView() != null
+ && tab.getWebView().isPrivateBrowsingEnabled()) {
return true;
}
}
@@ -175,6 +187,7 @@ class TabControl {
// Create a new tab and add it to the tab list
Tab t = new Tab(mController, w);
+ t.setId(getNextId());
mTabs.add(t);
// Initially put the tab in the background.
t.putInBackground();
@@ -221,7 +234,7 @@ class TabControl {
} else {
// If a tab that is earlier in the list gets removed, the current
// index no longer points to the correct tab.
- mCurrentTab = getTabIndex(current);
+ mCurrentTab = getTabPosition(current);
}
// destroy the tab
@@ -229,17 +242,6 @@ class TabControl {
// clear it's references to parent and children
t.removeFromTree();
- // The tab indices have shifted, update all the saved state so we point
- // to the correct index.
- for (Tab tab : mTabs) {
- Vector<Tab> children = tab.getChildTabs();
- if (children != null) {
- for (Tab child : children) {
- child.setParentTab(tab);
- }
- }
- }
-
// Remove it from the queue of viewed tabs.
mTabQueue.remove(t);
return true;
@@ -264,61 +266,59 @@ class TabControl {
return mTabs.size();
}
-
/**
- * Save the state of all the Tabs.
- * @param outState The Bundle to save the state to.
+ * save the tab state:
+ * current position
+ * position sorted array of tab ids
+ * for each tab id, save the tab state
+ * @param outState
*/
void saveState(Bundle outState) {
final int numTabs = getTabCount();
- outState.putInt(Tab.NUMTABS, numTabs);
- final int index = getCurrentIndex();
- outState.putInt(Tab.CURRTAB, (index >= 0 && index < numTabs) ? index : 0);
- for (int i = 0; i < numTabs; i++) {
- final Tab t = getTab(i);
- if (t.saveState()) {
- outState.putBundle(Tab.WEBVIEW + i, t.getSavedState());
+ long[] ids = new long[numTabs];
+ int i = 0;
+ for (Tab tab : mTabs) {
+ ids[i++] = tab.getId();
+ if (tab.saveState()) {
+ outState.putBundle(Long.toString(tab.getId()), tab.getSavedState());
}
}
+ outState.putLongArray(POSITIONS, ids);
+ final long cid = getCurrentTab().getId();
+ outState.putLong(CURRENT, cid);
}
/**
* Check if the state can be restored. If the state can be restored, the
- * current tab index is returned. This can be passed to restoreState below
+ * current tab id is returned. This can be passed to restoreState below
* in order to restore the correct tab. Otherwise, -1 is returned and the
* state cannot be restored.
*/
- int canRestoreState(Bundle inState, boolean restoreIncognitoTabs) {
- final int numTabs = (inState == null)
- ? - 1 : inState.getInt(Tab.NUMTABS, -1);
- if (numTabs == -1) {
+ long canRestoreState(Bundle inState, boolean restoreIncognitoTabs) {
+ final long[] ids = (inState == null) ? null : inState.getLongArray(POSITIONS);
+ if (ids == null) {
return -1;
}
- final int oldCurrentTab = inState.getInt(Tab.CURRTAB, -1);
-
- // Determine whether the saved current tab can be restored, and if not,
- // which tab will take its place.
- int currentTab = -1;
+ final long oldcurrent = inState.getLong(CURRENT);
+ long current = -1;
if (restoreIncognitoTabs ||
- !inState.getBundle(Tab.WEBVIEW + oldCurrentTab)
- .getBoolean(Tab.INCOGNITO)) {
- currentTab = oldCurrentTab;
+ !inState.getBundle(Long.toString(oldcurrent)).getBoolean(Tab.INCOGNITO)) {
+ current = oldcurrent;
} else {
- for (int i = 0; i < numTabs; i++) {
- if (!inState.getBundle(Tab.WEBVIEW + i)
- .getBoolean(Tab.INCOGNITO)) {
- currentTab = i;
+ // pick first non incognito tab
+ for (long id : ids) {
+ if (!inState.getBundle(Long.toString(id)).getBoolean(Tab.INCOGNITO)) {
+ current = id;
break;
}
}
}
-
- return currentTab;
+ return current;
}
/**
* Restore the state of all the tabs.
- * @param currentTab The tab index to restore.
+ * @param currentId The tab id to restore.
* @param inState The saved state of all the tabs.
* @param restoreIncognitoTabs Restoring private browsing tabs
* @param restoreAll All webviews get restored, not just the current tab
@@ -326,29 +326,29 @@ class TabControl {
* @return True if there were previous tabs that were restored. False if
* there was no saved state or restoring the state failed.
*/
- void restoreState(Bundle inState, int currentTab,
+ void restoreState(Bundle inState, long currentId,
boolean restoreIncognitoTabs, boolean restoreAll) {
- if (currentTab == -1) {
+ if (currentId == -1) {
return;
}
-
- // If currentTab is valid, numTabs must be present.
- final int numTabs = inState.getInt(Tab.NUMTABS, -1);
-
- // Map saved tab indices to new indices, in case any incognito tabs
- // need to not be restored.
- HashMap<Integer, Integer> originalTabIndices = new HashMap<Integer, Integer>();
- originalTabIndices.put(-1, -1);
- for (int i = 0; i < numTabs; i++) {
- Bundle state = inState.getBundle(Tab.WEBVIEW + i);
-
- if (!restoreIncognitoTabs && state != null && state.getBoolean(Tab.INCOGNITO)) {
- originalTabIndices.put(i, -1);
- } else if (i == currentTab || restoreAll) {
+ long[] ids = inState.getLongArray(POSITIONS);
+ long maxId = -Long.MAX_VALUE;
+ HashMap<Long, Tab> tabMap = new HashMap<Long, Tab>();
+ for (long id : ids) {
+ if (id > maxId) {
+ maxId = id;
+ }
+ final String idkey = Long.toString(id);
+ Bundle state = inState.getBundle(idkey);
+ if (!restoreIncognitoTabs && state != null
+ && state.getBoolean(Tab.INCOGNITO)) {
+ // ignore tab
+ } else if (id == currentId || restoreAll) {
Tab t = createNewTab();
+ tabMap.put(id, t);
// Me must set the current tab before restoring the state
// so that all the client classes are set.
- if (i == currentTab) {
+ if (id == currentId) {
setCurrentTab(t);
}
if (!t.restoreState(state)) {
@@ -356,11 +356,12 @@ class TabControl {
t.getWebView().loadUrl(BrowserSettings.getInstance()
.getHomePage());
}
- originalTabIndices.put(i, getTabCount() - 1);
} else {
// Create a new tab and don't restore the state yet, add it
// to the tab list
Tab t = new Tab(mController, null);
+ t.setId(id);
+ tabMap.put(id, t);
if (state != null) {
t.setSavedState(state);
// Need to maintain the app id and original url so we
@@ -370,21 +371,22 @@ class TabControl {
mTabs.add(t);
// added the tab to the front as they are not current
mTabQueue.add(0, t);
- originalTabIndices.put(i, getTabCount() - 1);
}
- }
-
- // Rebuild the tree of tabs. Do this after all tabs have been
- // created/restored so that the parent tab exists.
- for (int i = 0; i < numTabs; i++) {
- final Bundle b = inState.getBundle(Tab.WEBVIEW + i);
- final Tab t = getTab(i);
- if (b != null && t != null) {
- final Integer parentIndex = originalTabIndices.get(b.getInt(Tab.PARENTTAB, -1));
- if (parentIndex != -1) {
- final Tab parent = getTab(parentIndex);
+ // make sure that there is no id overlap between the restored
+ // and new tabs
+ sNextId = maxId + 1;
+
+ }
+ // restore parent/child relationships
+ for (long id : ids) {
+ final Tab tab = tabMap.get(id);
+ final Bundle b = inState.getBundle(Long.toString(id));
+ if ((b != null) && (tab != null)) {
+ final long parentId = b.getLong(Tab.PARENTTAB, -1);
+ if (parentId != -1) {
+ final Tab parent = tabMap.get(parentId);
if (parent != null) {
- parent.addChildTab(t);
+ parent.addChildTab(tab);
}
}
}
@@ -439,7 +441,7 @@ class TabControl {
for (Tab t : mTabQueue) {
if (t != null && t.getWebView() != null) {
openTabCount++;
- if (t != current && t != current.getParentTab()) {
+ if (t != current && t != current.getParent()) {
tabsToGo.add(t);
}
}
@@ -458,9 +460,7 @@ class TabControl {
* @param view The WebView used to find the tab.
*/
Tab getTabFromView(WebView view) {
- final int size = getTabCount();
- for (int i = 0; i < size; i++) {
- final Tab t = getTab(i);
+ for (Tab t : mTabs) {
if (t.getSubWebView() == view || t.getWebView() == view) {
return t;
}
@@ -472,13 +472,11 @@ class TabControl {
* Return the tab with the matching application id.
* @param id The application identifier.
*/
- Tab getTabFromId(String id) {
+ Tab getTabFromAppId(String id) {
if (id == null) {
return null;
}
- final int size = getTabCount();
- for (int i = 0; i < size; i++) {
- final Tab t = getTab(i);
+ for (Tab t : mTabs) {
if (id.equals(t.getAppId())) {
return t;
}
@@ -490,9 +488,7 @@ class TabControl {
* Stop loading in all opened WebView including subWindows.
*/
void stopAllLoading() {
- final int size = getTabCount();
- for (int i = 0; i < size; i++) {
- final Tab t = getTab(i);
+ for (Tab t : mTabs) {
final WebView webview = t.getWebView();
if (webview != null) {
webview.stopLoading();
@@ -535,10 +531,8 @@ class TabControl {
return t;
}
// Now check all the rest.
- final int size = getTabCount();
- for (int i = 0; i < size; i++) {
- t = getTab(i);
- if (tabMatchesUrl(t, url)) {
+ for (Tab tab : mTabs) {
+ if (tabMatchesUrl(tab, url)) {
return t;
}
}
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index a2de1d7..4fc37af 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -49,7 +49,7 @@ public interface UiController extends BookmarksHistoryCallbacks {
void setActiveTab(Tab tab);
- boolean switchToTab(int tabIndex);
+ boolean switchToTab(Tab tab);
void closeCurrentTab();
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
index c76eee8..02a080f 100644
--- a/src/com/android/browser/UrlHandler.java
+++ b/src/com/android/browser/UrlHandler.java
@@ -258,7 +258,7 @@ public class UrlHandler {
protected void onPostExecute(String result) {
// Make sure the Tab was not closed while handling the task
- if (mController.getTabControl().getTabIndex(mTab) != -1) {
+ if (mController.getTabControl().getTabPosition(mTab) != -1) {
// If the Activity Manager is not invoked, load the URL directly
if (!startActivityForUrl(result)) {
if (!handleMenuClick(mTab, result)) {
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index 6028a97..bf3bdba 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -104,7 +104,7 @@ public interface WebViewController {
Tab openTab(String url, boolean incognito, boolean setActive,
boolean useCurrent);
- boolean switchToTab(int tabindex);
+ boolean switchToTab(Tab tab);
void closeTab(Tab tab);