Merge "Clarify restore dialog, prevent spam"
diff --git a/res/values-sw600dp/strings.xml b/res/values-sw600dp/strings.xml
index 82ba301..cb0d8a4 100644
--- a/res/values-sw600dp/strings.xml
+++ b/res/values-sw600dp/strings.xml
@@ -35,5 +35,5 @@
     <!-- Recover tabs after a crash dialog title [CHAR LIMIT=32] -->
     <string name="recover_title">Restore tabs?</string>
     <!-- Recover tabs after a crash dialog prompt [CHAR LIMIT=none] -->
-    <string name="recover_prompt">Would you like to restore your tabs from last time?</string>
+    <string name="recover_prompt">Would you like to restore your browser tabs from last time?</string>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c846965..8df4642 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -994,7 +994,7 @@
     <!-- Recover tabs after a crash dialog title [CHAR LIMIT=32] -->
     <string name="recover_title">Restore windows?</string>
     <!-- Recover tabs after a crash dialog prompt [CHAR LIMIT=none] -->
-    <string name="recover_prompt">Would you like to restore your windows from last time?</string>
+    <string name="recover_prompt">Would you like to restore your browser windows from last time?</string>
     <!-- Yes, recover windows from last time [CHAR LIMIT=10] -->
     <string name="recover_yes">Restore</string>
     <!-- No, don't recover windows from last time [CHAR LIMIT=10] -->
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 911f724..e3ca09a 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -640,8 +640,10 @@
 
         // Save all the tabs
         mTabControl.saveState(outState, saveImages);
-        // Save time so that we know how old incognito tabs (if any) are.
-        outState.putSerializable("lastActiveDate", Calendar.getInstance());
+        if (!outState.isEmpty()) {
+            // Save time so that we know how old incognito tabs (if any) are.
+            outState.putSerializable("lastActiveDate", Calendar.getInstance());
+        }
     }
 
     void onResume() {
diff --git a/src/com/android/browser/CrashRecoveryHandler.java b/src/com/android/browser/CrashRecoveryHandler.java
index 7ee9cee..acc2a30 100644
--- a/src/com/android/browser/CrashRecoveryHandler.java
+++ b/src/com/android/browser/CrashRecoveryHandler.java
@@ -103,6 +103,10 @@
 
         @Override
         public void run() {
+            if (mState.isEmpty()) {
+                clearState(mContext);
+                return;
+            }
             Parcel p = Parcel.obtain();
             try {
                 mState.writeToParcel(p, 0);
@@ -119,8 +123,7 @@
 
     }
 
-    private void clearState() {
-        Context context = mController.getActivity();
+    private static void clearState(Context context) {
         context.deleteFile(STATE_FILE);
     }
 
@@ -128,6 +131,7 @@
         new AlertDialog.Builder(mController.getActivity())
                 .setTitle(R.string.recover_title)
                 .setMessage(R.string.recover_prompt)
+                .setIcon(R.mipmap.ic_launcher_browser)
                 .setPositiveButton(R.string.recover_yes, new OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
@@ -137,7 +141,7 @@
                 .setNegativeButton(R.string.recover_no, new OnClickListener() {
                     @Override
                     public void onClick(DialogInterface dialog, int which) {
-                        clearState();
+                        clearState(mController.getActivity());
                         mController.doStart(null, intent);
                     }
                 })
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index bb200d8..58a7491 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -37,6 +37,7 @@
 import android.security.KeyChain;
 import android.security.KeyChainAliasCallback;
 import android.speech.RecognizerResultsIntent;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
@@ -1776,6 +1777,12 @@
         if (mMainView == null) {
             return mSavedState != null;
         }
+        // If the tab is the homepage or has no URL, don't save it
+        String homepage = BrowserSettings.getInstance().getHomePage();
+        if (TextUtils.equals(homepage, mCurrentState.mUrl)
+                || TextUtils.isEmpty(mCurrentState.mUrl)) {
+            return false;
+        }
 
         mSavedState = new Bundle();
         mMainView.saveState(mSavedState);
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 6566ac8..1367ba2 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -288,6 +288,9 @@
      */
     void saveState(Bundle outState, boolean saveImages) {
         final int numTabs = getTabCount();
+        if (numTabs == 0) {
+            return;
+        }
         long[] ids = new long[numTabs];
         int i = 0;
         for (Tab tab : mTabs) {
@@ -297,13 +300,15 @@
                         tab.getSavedState(saveImages));
             }
         }
-        outState.putLongArray(POSITIONS, ids);
-        Tab current = getCurrentTab();
-        long cid = -1;
-        if (current != null) {
-            cid = current.getId();
+        if (!outState.isEmpty()) {
+            outState.putLongArray(POSITIONS, ids);
+            Tab current = getCurrentTab();
+            long cid = -1;
+            if (current != null) {
+                cid = current.getId();
+            }
+            outState.putLong(CURRENT, cid);
         }
-        outState.putLong(CURRENT, cid);
     }
 
     /**