Clear parent/child tab relationships when clearing history.
Fixes http://b/issue?id=2330279
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 462e434..a5b805f 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -3357,6 +3357,15 @@
}
}
}
+ // Deliberately fall through to PREFERENCES_PAGE, since the
+ // same extra may be attached to the COMBO_PAGE
+ case PREFERENCES_PAGE:
+ if (resultCode == RESULT_OK && intent != null) {
+ String action = intent.getStringExtra(Intent.EXTRA_TEXT);
+ if (BrowserSettings.PREF_CLEAR_HISTORY.equals(action)) {
+ mTabControl.removeParentChildRelationShips();
+ }
+ }
break;
// Choose a file from the file picker.
case FILE_SELECTED:
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 25e364b..8ee6649 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -682,12 +682,17 @@
super.onBackPressed();
}
- // This Activity is generally a sub-Activity of CombinedHistoryActivity. In
- // that situation, we need to pass our result code up to our parent.
- // However, if someone calls this Activity directly, then this has no
- // parent, and it needs to set it on itself.
+ // This Activity is generally a sub-Activity of
+ // CombinedBookmarkHistoryActivity. In that situation, we need to pass our
+ // result code up to our parent. However, if someone calls this Activity
+ // directly, then this has no parent, and it needs to set it on itself.
private void setResultToParent(int resultCode, Intent data) {
- Activity a = getParent() == null ? this : getParent();
- a.setResult(resultCode, data);
+ Activity parent = getParent();
+ if (parent == null) {
+ setResult(resultCode, data);
+ } else {
+ ((CombinedBookmarkHistoryActivity) parent).setResultFromChild(
+ resultCode, data);
+ }
}
}
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 2eab181..831d63f 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -134,7 +134,12 @@
false);
CombinedBookmarkHistoryActivity.getIconListenerSet()
.addListener(mIconReceiver);
-
+ Activity parent = getParent();
+ if (null == parent
+ || !(parent instanceof CombinedBookmarkHistoryActivity)) {
+ throw new AssertionError("history page can only be viewed as a tab"
+ + "in CombinedBookmarkHistoryActivity");
+ }
// initialize the result to canceled, so that if the user just presses
// back then it will have the correct result
setResultToParent(RESULT_CANCELED, null);
@@ -165,9 +170,11 @@
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.clear_history_menu_id:
- // FIXME: Need to clear the tab control in browserActivity
- // as well
Browser.clearHistory(getContentResolver());
+ // BrowserHistoryPage is always a child of
+ // CombinedBookmarkHistoryActivity
+ ((CombinedBookmarkHistoryActivity) getParent())
+ .removeParentChildRelationShips();
mAdapter.refreshData();
return true;
@@ -275,13 +282,12 @@
return false;
}
- // This Activity is generally a sub-Activity of CombinedHistoryActivity. In
- // that situation, we need to pass our result code up to our parent.
- // However, if someone calls this Activity directly, then this has no
- // parent, and it needs to set it on itself.
+ // This Activity is always a sub-Activity of
+ // CombinedBookmarkHistoryActivity. Therefore, we need to pass our
+ // result code up to our parent.
private void setResultToParent(int resultCode, Intent data) {
- Activity a = getParent() == null ? this : getParent();
- a.setResult(resultCode, data);
+ ((CombinedBookmarkHistoryActivity) getParent()).setResultFromChild(
+ resultCode, data);
}
private class ChangeObserver extends ContentObserver {
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index b636f98..6426b99 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -73,6 +73,9 @@
e = findPreference(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING);
e.setOnPreferenceChangeListener(this);
+ e = findPreference(BrowserSettings.PREF_CLEAR_HISTORY);
+ e.setOnPreferenceChangeListener(this);
+
if (BrowserSettings.getInstance().showDebugSettings()) {
addPreferencesFromResource(R.xml.debug_preferences);
}
@@ -159,6 +162,13 @@
BrowserSettings.PREF_DEFAULT_TEXT_ENCODING)) {
pref.setSummary((String) objValue);
return true;
+ } else if (pref.getKey().equals(BrowserSettings.PREF_CLEAR_HISTORY)
+ && ((Boolean) objValue).booleanValue() == true) {
+ // Need to tell the browser to remove the parent/child relationship
+ // between tabs
+ setResult(RESULT_OK, (new Intent()).putExtra(Intent.EXTRA_TEXT,
+ pref.getKey()));
+ return true;
}
return false;
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
index a611d79..af968ab 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryActivity.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
@@ -34,6 +34,21 @@
public class CombinedBookmarkHistoryActivity extends TabActivity
implements TabHost.OnTabChangeListener {
+ /**
+ * Used to inform BrowserActivity to remove the parent/child relationships
+ * from all the tabs.
+ */
+ private String mExtraData;
+ /**
+ * Intent to be passed to calling Activity when finished. Keep a pointer to
+ * it locally so mExtraData can be added.
+ */
+ private Intent mResultData;
+ /**
+ * Result code to pass back to calling Activity when finished.
+ */
+ private int mResultCode;
+
/* package */ static String BOOKMARKS_TAB = "bookmark";
/* package */ static String VISITED_TAB = "visited";
/* package */ static String HISTORY_TAB = "history";
@@ -132,5 +147,33 @@
}
}
-
+ /**
+ * Store extra data in the Intent to return to the calling Activity to tell
+ * it to clear the parent/child relationships from all tabs.
+ */
+ /* package */ void removeParentChildRelationShips() {
+ mExtraData = BrowserSettings.PREF_CLEAR_HISTORY;
+ }
+
+ /**
+ * Custom setResult() method so that the Intent can have extra data attached
+ * if necessary.
+ * @param resultCode Uses same codes as Activity.setResult
+ * @param data Intent returned to onActivityResult.
+ */
+ /* package */ void setResultFromChild(int resultCode, Intent data) {
+ mResultCode = resultCode;
+ mResultData = data;
+ }
+
+ @Override
+ public void finish() {
+ if (mExtraData != null) {
+ mResultCode = RESULT_OK;
+ if (mResultData == null) mResultData = new Intent();
+ mResultData.putExtra(Intent.EXTRA_TEXT, mExtraData);
+ }
+ setResult(mResultCode, mResultData);
+ super.finish();
+ }
}
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 07cf2ac..5dc6b6d 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -174,6 +174,15 @@
}
/**
+ * Remove the parent child relationships from all tabs.
+ */
+ void removeParentChildRelationShips() {
+ for (Tab tab : mTabs) {
+ tab.removeFromTree();
+ }
+ }
+
+ /**
* 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.