Merge "Cross fade escalation card when content changes." into nyc-mr1-dev
diff --git a/res/layout/support_offline_escalation_options.xml b/res/layout/support_offline_escalation_options.xml
index d1e77a3..4f6940c 100644
--- a/res/layout/support_offline_escalation_options.xml
+++ b/res/layout/support_offline_escalation_options.xml
@@ -64,6 +64,5 @@
         style="@style/SupportSecondaryButton"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_marginBottom="16dp"
         android:minHeight="48dp"/>
 </LinearLayout>
diff --git a/src/com/android/settings/dashboard/DashboardAdapter.java b/src/com/android/settings/dashboard/DashboardAdapter.java
index 7c76794..b49bb7b 100644
--- a/src/com/android/settings/dashboard/DashboardAdapter.java
+++ b/src/com/android/settings/dashboard/DashboardAdapter.java
@@ -20,6 +20,7 @@
 import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.Icon;
+import android.os.Bundle;
 import android.support.v7.widget.PopupMenu;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
@@ -45,10 +46,13 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.DashboardItemHolder>
         implements View.OnClickListener {
     public static final String TAG = "DashboardAdapter";
+    private static final String STATE_SUGGESTION_LIST = "suggestion_list";
+    private static final String STATE_CATEGORY_LIST = "category_list";
     private static final int NS_SPACER = 0;
     private static final int NS_SUGGESTION = 1000;
     private static final int NS_ITEMS = 2000;
@@ -80,13 +84,20 @@
     private Condition mExpandedCondition = null;
     private SuggestionParser mSuggestionParser;
 
-    public DashboardAdapter(Context context, SuggestionParser parser) {
+    public DashboardAdapter(Context context, SuggestionParser parser, Bundle savedInstanceState,
+                List<Condition> conditions) {
         mContext = context;
         mCache = new IconCache(context);
         mSuggestionParser = parser;
+        mConditions = conditions;
 
         setHasStableIds(true);
         setShowingAll(true);
+
+        if (savedInstanceState != null) {
+            mSuggestions = savedInstanceState.getParcelableArrayList(STATE_SUGGESTION_LIST);
+            mCategories = savedInstanceState.getParcelableArrayList(STATE_CATEGORY_LIST);
+        }
     }
 
     public List<Tile> getSuggestions() {
@@ -94,8 +105,10 @@
     }
 
     public void setSuggestions(List<Tile> suggestions) {
-        mSuggestions = suggestions;
-        recountItems();
+        if (!Objects.equals(mSuggestions, suggestions)) {
+            mSuggestions = suggestions;
+            recountItems();
+        }
     }
 
     public Tile getTile(ComponentName component) {
@@ -111,6 +124,9 @@
     }
 
     public void setCategories(List<DashboardCategory> categories) {
+        if (Objects.equals(mCategories, categories)) {
+            return;
+        }
         mCategories = categories;
 
         // TODO: Better place for tinting?
@@ -133,8 +149,10 @@
     }
 
     public void setConditions(List<Condition> conditions) {
-        mConditions = conditions;
-        recountItems();
+        if (!Objects.equals(mConditions, conditions)) {
+            mConditions = conditions;
+            recountItems();
+        }
     }
 
     public boolean isShowingAll() {
@@ -422,6 +440,12 @@
         return packageName;
     }
 
+    void onSaveInstanceState(Bundle outState) {
+        outState.putParcelableArrayList(STATE_SUGGESTION_LIST, new ArrayList<Tile>(mSuggestions));
+        outState.putParcelableArrayList(STATE_CATEGORY_LIST,
+                new ArrayList<DashboardCategory>(mCategories));
+    }
+
     private static class IconCache {
 
         private final Context mContext;
diff --git a/src/com/android/settings/dashboard/DashboardSummary.java b/src/com/android/settings/dashboard/DashboardSummary.java
index e04b255..24b5aee 100644
--- a/src/com/android/settings/dashboard/DashboardSummary.java
+++ b/src/com/android/settings/dashboard/DashboardSummary.java
@@ -165,6 +165,9 @@
         super.onSaveInstanceState(outState);
         if (mLayoutManager == null) return;
         outState.putInt(EXTRA_SCROLL_POSITION, mLayoutManager.findFirstVisibleItemPosition());
+        if (mAdapter != null) {
+            mAdapter.onSaveInstanceState(outState);
+        }
     }
 
     @Override
@@ -181,14 +184,13 @@
         mDashboard.setHasFixedSize(true);
         mDashboard.setListener(this);
         mDashboard.addItemDecoration(new DashboardDecorator(getContext()));
-        mAdapter = new DashboardAdapter(getContext(), mSuggestionParser);
-        mAdapter.setConditions(mConditionManager.getConditions());
+        mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, bundle,
+                mConditionManager.getConditions());
         mDashboard.setAdapter(mAdapter);
         mSummaryLoader.setAdapter(mAdapter);
         ConditionAdapterUtils.addDismiss(mDashboard);
         if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took "
                 + (System.currentTimeMillis() - startTime) + " ms");
-
         rebuildUI();
     }
 
diff --git a/src/com/android/settings/dashboard/SupportItemAdapter.java b/src/com/android/settings/dashboard/SupportItemAdapter.java
index a0ba57b..d0c5398 100644
--- a/src/com/android/settings/dashboard/SupportItemAdapter.java
+++ b/src/com/android/settings/dashboard/SupportItemAdapter.java
@@ -314,11 +314,13 @@
         }
         if (holder.summary1View != null) {
             holder.summary1View.setText(data.summary1);
-            holder.summary1View.setVisibility(mHasInternet ? View.VISIBLE : View.GONE);
+            holder.summary1View.setVisibility(mHasInternet && !TextUtils.isEmpty(data.summary1)
+                    ? View.VISIBLE : View.GONE);
         }
         if (holder.summary2View != null) {
             holder.summary2View.setText(data.summary2);
-            holder.summary2View.setVisibility(mHasInternet ? View.VISIBLE : View.GONE);
+            holder.summary2View.setVisibility(mHasInternet && !TextUtils.isEmpty(data.summary2)
+                    ? View.VISIBLE : View.GONE);
         }
     }