OSDN Git Service

Clear parent/child tab relationships when clearing history.
authorLeon Scroggins <scroggo@google.com>
Mon, 11 Jan 2010 18:06:21 +0000 (13:06 -0500)
committerLeon Scroggins <scroggo@google.com>
Mon, 11 Jan 2010 18:06:21 +0000 (13:06 -0500)
Fixes http://b/issue?id=2330279

src/com/android/browser/BrowserActivity.java
src/com/android/browser/BrowserBookmarksPage.java
src/com/android/browser/BrowserHistoryPage.java
src/com/android/browser/BrowserPreferencesPage.java
src/com/android/browser/CombinedBookmarkHistoryActivity.java
src/com/android/browser/TabControl.java

index 462e434..a5b805f 100644 (file)
@@ -3357,6 +3357,15 @@ public class BrowserActivity extends Activity
                         }
                     }
                 }
+                // 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:
index 25e364b..8ee6649 100644 (file)
@@ -682,12 +682,17 @@ public class BrowserBookmarksPage extends Activity implements
         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);
+        }
     }
 }
index 2eab181..831d63f 100644 (file)
@@ -134,7 +134,12 @@ public class BrowserHistoryPage extends ExpandableListActivity {
                 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 class BrowserHistoryPage extends ExpandableListActivity {
     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 @@ public class BrowserHistoryPage extends ExpandableListActivity {
         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 {
index b636f98..6426b99 100644 (file)
@@ -73,6 +73,9 @@ public class BrowserPreferencesPage extends PreferenceActivity
         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 @@ public class BrowserPreferencesPage extends PreferenceActivity
                 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;
index a611d79..af968ab 100644 (file)
@@ -34,6 +34,21 @@ import java.util.Vector;
 
 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 @@ public class CombinedBookmarkHistoryActivity extends TabActivity
         }
     }
 
-    
+    /**
+     * 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();
+    }
 }
index 07cf2ac..5dc6b6d 100644 (file)
@@ -174,6 +174,15 @@ class TabControl {
     }
 
     /**
+     * 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.