Merge "Fix print settings crash."
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 18f311f..a71821f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1932,16 +1932,6 @@
                 android:value="com.android.settings.wfd.WifiDisplaySettings" />
         </activity>
 
-
-        <!-- Development settings -->
-
-        <!-- DeviceInfo adds the user's requested build to stats upload.  -->
-        <receiver android:name=".DeviceInfo$StatsReportReceiver">
-            <intent-filter>
-                <action android:name="android.intent.action.STATISTICS_REPORT" />
-            </intent-filter>
-        </receiver>
-
         <activity android:name="Display" android:label="@string/display_label"
                 android:configChanges="fontScale"
                 android:taskAffinity="com.android.settings"
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a1f77cc..ecc465e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7019,4 +7019,25 @@
 
     <!-- Summary of display with adaptive brightness off [CHAR LIMIT=NONE] -->
     <string name="display_summary_off">Adaptive brightness is OFF</string>
+
+    <!-- Summary of memory screen [CHAR LIMIT=NONE] -->
+    <string name="memory_summary">Avg <xliff:g id="used_memory" example="1.7GB">%1$s</xliff:g> of <xliff:g id="total_memory" example="2GB">%2$s</xliff:g> memory used</string>
+
+    <!-- Summary of user screen [CHAR LIMIT=NONE] -->
+    <string name="user_summary">Signed in as <xliff:g id="user_name" example="Jason">%1$s</xliff:g></string>
+
+    <!-- Summary of payment screen [CHAR LIMIT=NONE] -->
+    <string name="payment_summary"><xliff:g id="app_name" example="Payment App">%1$s</xliff:g> is default</string>
+
+    <!-- Summary of location screen [CHAR LIMIT=NONE] -->
+    <string name="location_on_summary">ON / <xliff:g id="location_mode" example="High accuracy">%1$s</xliff:g></string>
+
+    <!-- Location off [CHAR LIMIT=NONE] -->
+    <string name="location_off_summary">OFF</string>
+
+    <!-- Backup disabled summary [CHAR LIMIT=NONE] -->
+    <string name="backup_disabled">Back up disabled</string>
+
+    <!-- Summary of device info page [CHAR LIMIT=NONE] -->
+    <string name="about_summary">Android <xliff:g id="version" example="6.0">%1$s</xliff:g></string>
 </resources>
diff --git a/res/xml/accessibility_autoclick_settings.xml b/res/xml/accessibility_autoclick_settings.xml
index 1eb4dc1..39b9736 100644
--- a/res/xml/accessibility_autoclick_settings.xml
+++ b/res/xml/accessibility_autoclick_settings.xml
@@ -18,7 +18,7 @@
     android:title="@string/accessibility_autoclick_preference_title" >
 
 
-    <SeekBarPreference
+    <com.android.settings.SeekBarPreference
         android:key="autoclick_delay"
         android:title="@string/accessibility_autoclick_delay_preference_title"
         android:layout="@layout/preference_iconless_slider" />
diff --git a/src/com/android/settings/DateTimeSettings.java b/src/com/android/settings/DateTimeSettings.java
index 0540575..d92d610 100644
--- a/src/com/android/settings/DateTimeSettings.java
+++ b/src/com/android/settings/DateTimeSettings.java
@@ -38,6 +38,7 @@
 import android.widget.TimePicker;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settingslib.datetime.ZoneGetter;
 
 import java.util.Calendar;
@@ -353,4 +354,33 @@
             }
         }
     };
+
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                final Calendar now = Calendar.getInstance();
+                mSummaryLoader.setSummary(this, ZoneGetter.getTimeZoneOffsetAndName(
+                        now.getTimeZone(), now.getTime()));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
 }
diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 40be2e7..95f1a83 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -36,6 +36,7 @@
 import android.widget.Toast;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Index;
 import com.android.settings.search.Indexable;
@@ -337,6 +338,34 @@
         startActivityForResult(intent, 0);
     }
 
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                mSummaryLoader.setSummary(this, mContext.getString(R.string.about_summary,
+                        Build.VERSION.RELEASE));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
     /**
      * For Search.
      */
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index 14e45be..2344a33 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import android.app.Activity;
 import android.app.backup.IBackupManager;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -34,6 +35,7 @@
 import android.util.Log;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 
@@ -180,6 +182,51 @@
         return R.string.help_url_backup_reset;
     }
 
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                IBackupManager backupManager = IBackupManager.Stub.asInterface(
+                        ServiceManager.getService(Context.BACKUP_SERVICE));
+                try {
+                    boolean backupEnabled = backupManager.isBackupEnabled();
+                    if (backupEnabled) {
+                        String transport = backupManager.getCurrentTransport();
+                        String configSummary = backupManager.getDestinationString(transport);
+                        if (configSummary != null) {
+                            mSummaryLoader.setSummary(this, configSummary);
+                        } else {
+                            mSummaryLoader.setSummary(this, mContext.getString(
+                                    R.string.backup_configure_account_default_summary));
+                        }
+                    } else {
+                        mSummaryLoader.setSummary(this, mContext.getString(
+                                R.string.backup_disabled));
+                    }
+                } catch (RemoteException e) {
+                }
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
     /**
      * For Search.
      */
diff --git a/src/com/android/settings/applications/ProcessStatsSummary.java b/src/com/android/settings/applications/ProcessStatsSummary.java
index 399558b..09fea89 100644
--- a/src/com/android/settings/applications/ProcessStatsSummary.java
+++ b/src/com/android/settings/applications/ProcessStatsSummary.java
@@ -15,6 +15,8 @@
  */
 package com.android.settings.applications;
 
+import android.app.Activity;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
@@ -28,6 +30,7 @@
 import com.android.settings.R;
 import com.android.settings.Utils;
 import com.android.settings.applications.ProcStatsData.MemInfo;
+import com.android.settings.dashboard.SummaryLoader;
 
 public class ProcessStatsSummary extends ProcessStatsBase implements OnPreferenceClickListener {
 
@@ -123,4 +126,39 @@
         return false;
     }
 
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                ProcStatsData statsManager = new ProcStatsData(mContext, false);
+                statsManager.setDuration(sDurations[0]);
+                MemInfo memInfo = statsManager.getMemInfo();
+                String usedResult = Formatter.formatShortFileSize(mContext,
+                        (long) memInfo.realUsedRam);
+                String totalResult = Formatter.formatShortFileSize(mContext,
+                        (long) memInfo.realTotalRam);
+                mSummaryLoader.setSummary(this, mContext.getString(R.string.memory_summary,
+                        usedResult, totalResult));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
 }
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index 779944b..fff5a78 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -60,6 +60,7 @@
 import com.android.settings.UserDictionarySettings;
 import com.android.settings.Utils;
 import com.android.settings.VoiceInputOutputSettings;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
@@ -648,6 +649,34 @@
         }
     }
 
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                String localeName = getLocaleName(mContext);
+                mSummaryLoader.setSummary(this, localeName);
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
         @Override
diff --git a/src/com/android/settings/location/LocationSettings.java b/src/com/android/settings/location/LocationSettings.java
index 38647bd..0c8ea66 100644
--- a/src/com/android/settings/location/LocationSettings.java
+++ b/src/com/android/settings/location/LocationSettings.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.location;
 
+import android.app.Activity;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -24,6 +25,7 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceCategory;
 import android.support.v7.preference.PreferenceGroup;
@@ -33,14 +35,13 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.widget.Switch;
-
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.DimmableIconPreference;
-import com.android.settings.PreferenceActivity;
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 import com.android.settings.applications.InstalledAppDetails;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.widget.SwitchBar;
 import com.android.settingslib.location.RecentLocationApps;
 
@@ -331,23 +332,25 @@
         return R.string.help_url_location_access;
     }
 
-    @Override
-    public void onModeChanged(int mode, boolean restricted) {
+    private static int getLocationString(int mode) {
         switch (mode) {
             case android.provider.Settings.Secure.LOCATION_MODE_OFF:
-                mLocationMode.setSummary(R.string.location_mode_location_off_title);
-                break;
+                return R.string.location_mode_location_off_title;
             case android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY:
-                mLocationMode.setSummary(R.string.location_mode_sensors_only_title);
-                break;
+                return R.string.location_mode_sensors_only_title;
             case android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING:
-                mLocationMode.setSummary(R.string.location_mode_battery_saving_title);
-                break;
+                return R.string.location_mode_battery_saving_title;
             case android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY:
-                mLocationMode.setSummary(R.string.location_mode_high_accuracy_title);
-                break;
-            default:
-                break;
+                return R.string.location_mode_high_accuracy_title;
+        }
+        return 0;
+    }
+
+    @Override
+    public void onModeChanged(int mode, boolean restricted) {
+        int modeDescription = getLocationString(mode);
+        if (modeDescription != 0) {
+            mLocationMode.setSummary(modeDescription);
         }
 
         // Restricted user can't change the location mode, so disable the master switch. But in some
@@ -416,10 +419,45 @@
             // start new fragment to display extended information
             Bundle args = new Bundle();
             args.putString(InstalledAppDetails.ARG_PACKAGE_NAME, mPackage);
-            ((PreferenceActivity) getActivity()).startPreferencePanelAsUser(
+            ((SettingsActivity) getActivity()).startPreferencePanelAsUser(
                     InstalledAppDetails.class.getName(), args,
                     R.string.application_info_label, null, mUserHandle);
             return true;
         }
     }
+
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                int mode = Settings.Secure.getInt(mContext.getContentResolver(),
+                        Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
+                if (mode != Settings.Secure.LOCATION_MODE_OFF) {
+                    mSummaryLoader.setSummary(this, mContext.getString(R.string.location_on_summary,
+                            mContext.getString(getLocationString(mode))));
+                } else {
+                    mSummaryLoader.setSummary(this,
+                            mContext.getString(R.string.location_off_summary));
+                }
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
 }
diff --git a/src/com/android/settings/nfc/NfcPaymentPreference.java b/src/com/android/settings/nfc/NfcPaymentPreference.java
index c918d2f..4738728 100644
--- a/src/com/android/settings/nfc/NfcPaymentPreference.java
+++ b/src/com/android/settings/nfc/NfcPaymentPreference.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.nfc;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.ActivityNotFoundException;
 import android.content.Context;
@@ -32,6 +33,7 @@
 
 import com.android.settings.CustomDialogPreference;
 import com.android.settings.R;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.nfc.PaymentBackend.PaymentAppInfo;
 
 import java.util.List;
diff --git a/src/com/android/settings/nfc/PaymentSettings.java b/src/com/android/settings/nfc/PaymentSettings.java
index b03a9ef..42545b9 100644
--- a/src/com/android/settings/nfc/PaymentSettings.java
+++ b/src/com/android/settings/nfc/PaymentSettings.java
@@ -16,6 +16,8 @@
 
 package com.android.settings.nfc;
 
+import android.app.Activity;
+import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceManager;
@@ -25,9 +27,12 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.dashboard.SummaryLoader;
+import com.android.settings.nfc.PaymentBackend.PaymentAppInfo;
 
 import java.util.List;
 
@@ -93,4 +98,35 @@
         menuItem.setIntent(howItWorksIntent);
         menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_NEVER);
     }
+
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                PaymentBackend paymentBackend = new PaymentBackend(mContext);
+                paymentBackend.refresh();
+                PaymentAppInfo app = paymentBackend.getDefaultApp();
+                mSummaryLoader.setSummary(this, mContext.getString(R.string.payment_summary,
+                        app.label));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
 }
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 59ab901..3e2ac87 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -61,6 +61,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
@@ -1052,6 +1053,36 @@
         }
     }
 
+    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
+
+        private final Context mContext;
+        private final SummaryLoader mSummaryLoader;
+
+        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+        }
+
+        @Override
+        public void setListening(boolean listening) {
+            if (listening) {
+                UserInfo info = mContext.getSystemService(UserManager.class).getUserInfo(
+                        UserHandle.myUserId());
+                mSummaryLoader.setSummary(this, mContext.getString(R.string.user_summary,
+                        info.name));
+            }
+        }
+    }
+
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                                                                   SummaryLoader summaryLoader) {
+            return new SummaryProvider(activity, summaryLoader);
+        }
+    };
+
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
                 @Override