Merge "'Lock Screen Message' option is in enable state for 'None'."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e7442ed..e7a7711 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3841,6 +3841,15 @@
 
     <!-- Title in main settings screen for printing settings [CHAR LIMIT=15] -->
     <string name="print_settings">Printing</string>
+
+    <!-- Summary in settings screen [CHAR LIMIT=25] -->
+    <plurals name="print_settings_title">
+        <item quantity="one">1 print job</item>
+        <item quantity="other">%d print jobs</item>
+    </plurals>
+
+    <string name="print_settings_title"><xliff:g id="printJonCount">%1$s</xliff:g> print job</string>
+
     <!-- Title for print service settings screen [CHAR LIMIT=25] -->
     <string name="print_settings_title">Print services</string>
 
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index d1a030b..a332632 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -1969,12 +1969,7 @@
     static class SystemPropPoker extends AsyncTask<Void, Void, Void> {
         @Override
         protected Void doInBackground(Void... params) {
-            String[] services;
-            try {
-                services = ServiceManager.listServices();
-            } catch (RemoteException e) {
-                return null;
-            }
+            String[] services = ServiceManager.listServices();
             for (String service : services) {
                 IBinder obj = ServiceManager.checkService(service);
                 if (obj != null) {
diff --git a/src/com/android/settings/print/PrintServiceSettingsFragment.java b/src/com/android/settings/print/PrintServiceSettingsFragment.java
index 722be0e..5d20f65 100644
--- a/src/com/android/settings/print/PrintServiceSettingsFragment.java
+++ b/src/com/android/settings/print/PrintServiceSettingsFragment.java
@@ -191,13 +191,13 @@
 
     private void onPreferenceToggled(String preferenceKey, boolean enabled) {
         ComponentName service = ComponentName.unflattenFromString(preferenceKey);
-        List<ComponentName> services = PrintSettingsUtils.readEnabledPrintServices(getActivity());
+        List<ComponentName> services = PrintSettingsUtils.readDisabledPrintServices(getActivity());
         if (enabled) {
-            services.add(service);
-        } else {
             services.remove(service);
+        } else {
+            services.add(service);
         }
-        PrintSettingsUtils.writeEnabledPrintServices(getActivity(), services);
+        PrintSettingsUtils.writeDisabledPrintServices(getActivity(), services);
     }
 
     private ListView getBackupListView() {
@@ -253,8 +253,9 @@
     }
 
     private void updateUiForServiceState() {
-        List<ComponentName> services = PrintSettingsUtils.readEnabledPrintServices(getActivity());
-        mServiceEnabled = services.contains(mComponentName);
+        List<ComponentName> disabledServices = PrintSettingsUtils
+                .readDisabledPrintServices(getActivity());
+        mServiceEnabled = !disabledServices.contains(mComponentName);
         if (mServiceEnabled) {
             mSwitchBar.setCheckedInternal(true);
             mPrintersAdapter.enable();
@@ -431,7 +432,7 @@
 
         public void register(ContentResolver contentResolver) {
             contentResolver.registerContentObserver(android.provider.Settings.Secure.getUriFor(
-                    android.provider.Settings.Secure.ENABLED_PRINT_SERVICES), false, this);
+                    android.provider.Settings.Secure.DISABLED_PRINT_SERVICES), false, this);
         }
 
         public void unregister(ContentResolver contentResolver) {
diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java
index c2d3ac2..d5cd9c5 100644
--- a/src/com/android/settings/print/PrintSettingsFragment.java
+++ b/src/com/android/settings/print/PrintSettingsFragment.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.print;
 
+import android.app.Activity;
 import android.app.LoaderManager.LoaderCallbacks;
 import android.content.ActivityNotFoundException;
 import android.content.AsyncTaskLoader;
@@ -56,11 +57,13 @@
 import android.widget.Button;
 import android.widget.Spinner;
 import android.widget.TextView;
+
 import com.android.internal.content.PackageMonitor;
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.DialogCreatable;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.dashboard.SummaryLoader;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
@@ -204,8 +207,8 @@
             mPrintServicesCategory.removeAll();
         }
 
-        List<ComponentName> enabledServices = PrintSettingsUtils
-                .readEnabledPrintServices(getActivity());
+        List<ComponentName> disabledServices = PrintSettingsUtils
+                .readDisabledPrintServices(getActivity());
 
         final PackageManager pm = getActivity().getPackageManager();
 
@@ -233,7 +236,7 @@
             preference.setFragment(PrintServiceSettingsFragment.class.getName());
             preference.setPersistent(false);
 
-            final boolean serviceEnabled = enabledServices.contains(componentName);
+            final boolean serviceEnabled = !disabledServices.contains(componentName);
             if (serviceEnabled) {
                 preference.setSummary(getString(R.string.print_feature_state_on));
             } else {
@@ -385,7 +388,7 @@
 
         public void register(ContentResolver contentResolver) {
             contentResolver.registerContentObserver(Settings.Secure.getUriFor(
-                    Settings.Secure.ENABLED_PRINT_SERVICES), false, this);
+                    Settings.Secure.DISABLED_PRINT_SERVICES), false, this);
         }
 
         public void unregister(ContentResolver contentResolver) {
@@ -587,20 +590,88 @@
             }
             return printJobInfos;
         }
+    }
 
-        private static boolean shouldShowToUser(PrintJobInfo printJob) {
-            switch (printJob.getState()) {
-                case PrintJobInfo.STATE_QUEUED:
-                case PrintJobInfo.STATE_STARTED:
-                case PrintJobInfo.STATE_BLOCKED:
-                case PrintJobInfo.STATE_FAILED: {
-                    return true;
+    /**
+     * Should the print job the shown to the user in the settings app.
+     *
+     * @param printJob The print job in question.
+     * @return true iff the print job should be shown.
+     */
+    private static boolean shouldShowToUser(PrintJobInfo printJob) {
+        switch (printJob.getState()) {
+            case PrintJobInfo.STATE_QUEUED:
+            case PrintJobInfo.STATE_STARTED:
+            case PrintJobInfo.STATE_BLOCKED:
+            case PrintJobInfo.STATE_FAILED: {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Provider for the print settings summary
+     */
+    private static class PrintSummaryProvider
+            implements SummaryLoader.SummaryProvider, PrintJobStateChangeListener {
+        private final Context mContext;
+        private final PrintManager mPrintManager;
+        private final SummaryLoader mSummaryLoader;
+
+        /**
+         * Create a new {@link PrintSummaryProvider}.
+         *
+         * @param context The context this provider is for
+         * @param summaryLoader The summary load using this provider
+         */
+        public PrintSummaryProvider(Context context, SummaryLoader summaryLoader) {
+            mContext = context;
+            mSummaryLoader = summaryLoader;
+            mPrintManager = ((PrintManager) context.getSystemService(Context.PRINT_SERVICE))
+                    .getGlobalPrintManagerForUser(context.getUserId());
+        }
+
+        @Override
+        public void setListening(boolean isListening) {
+            if (isListening) {
+                mPrintManager.addPrintJobStateChangeListener(this);
+                onPrintJobStateChanged(null);
+            } else {
+                mPrintManager.removePrintJobStateChangeListener(this);
+            }
+        }
+
+        @Override
+        public void onPrintJobStateChanged(PrintJobId printJobId) {
+            List<PrintJob> printJobs = mPrintManager.getPrintJobs();
+
+            int numActivePrintJobs = 0;
+            final int numPrintJobs = printJobs.size();
+            for (int i = 0; i < numPrintJobs; i++) {
+                if (shouldShowToUser(printJobs.get(i).getInfo())) {
+                    numActivePrintJobs++;
                 }
             }
-            return false;
+
+            mSummaryLoader.setSummary(this, mContext.getResources().getQuantityString(
+                    R.plurals.print_settings_title, numActivePrintJobs, numActivePrintJobs));
         }
     }
 
+    /**
+     * A factory for {@link PrintSummaryProvider providers} the settings app can use to read the
+     * print summary.
+     */
+    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
+            = new SummaryLoader.SummaryProviderFactory() {
+        @Override
+        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
+                SummaryLoader summaryLoader) {
+            return new PrintSummaryProvider(activity, summaryLoader);
+        }
+    };
+
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
             new BaseSearchIndexProvider() {
         @Override
diff --git a/src/com/android/settings/print/PrintSettingsUtils.java b/src/com/android/settings/print/PrintSettingsUtils.java
index d09f345..87f26be 100644
--- a/src/com/android/settings/print/PrintSettingsUtils.java
+++ b/src/com/android/settings/print/PrintSettingsUtils.java
@@ -30,50 +30,50 @@
  */
 public class PrintSettingsUtils {
 
-    private static final char ENABLED_PRINT_SERVICES_SEPARATOR = ':';
+    private static final char DISABLED_PRINT_SERVICES_SEPARATOR = ':';
 
     private PrintSettingsUtils() {
         /* do nothing */
     }
 
-    public static List<ComponentName> readEnabledPrintServices(Context context) {
-        List<ComponentName> enabledServices = new ArrayList<ComponentName>();
+    public static List<ComponentName> readDisabledPrintServices(Context context) {
+        List<ComponentName> disabledServices = new ArrayList<ComponentName>();
 
-        String enabledServicesSetting = Settings.Secure.getString(context
-                .getContentResolver(), Settings.Secure.ENABLED_PRINT_SERVICES);
-        if (TextUtils.isEmpty(enabledServicesSetting)) {
-            return enabledServices;
+        String disabledServicesSetting = Settings.Secure.getString(context
+                .getContentResolver(), Settings.Secure.DISABLED_PRINT_SERVICES);
+        if (TextUtils.isEmpty(disabledServicesSetting)) {
+            return disabledServices;
         }
 
         SimpleStringSplitter colonSplitter = new SimpleStringSplitter(
-                ENABLED_PRINT_SERVICES_SEPARATOR);
-        colonSplitter.setString(enabledServicesSetting);
+                DISABLED_PRINT_SERVICES_SEPARATOR);
+        colonSplitter.setString(disabledServicesSetting);
 
         while (colonSplitter.hasNext()) {
             String componentNameString = colonSplitter.next();
-            ComponentName enabledService = ComponentName.unflattenFromString(
+            ComponentName disabledService = ComponentName.unflattenFromString(
                     componentNameString);
-            if (enabledService != null) {
-                enabledServices.add(enabledService);
+            if (disabledService != null) {
+                disabledServices.add(disabledService);
             }
         }
 
-        return enabledServices;
+        return disabledServices;
     }
 
-    public static void writeEnabledPrintServices(Context context,
+    public static void writeDisabledPrintServices(Context context,
             List<ComponentName> services) {
         StringBuilder builder = new StringBuilder();
         final int serviceCount = services.size();
         for (int i = 0; i < serviceCount; i++) {
             ComponentName service = services.get(i);
             if (builder.length() > 0) {
-                builder.append(ENABLED_PRINT_SERVICES_SEPARATOR);
+                builder.append(DISABLED_PRINT_SERVICES_SEPARATOR);
             }
             builder.append(service.flattenToString());
         }
         Settings.Secure.putString(context.getContentResolver(),
-                Settings.Secure.ENABLED_PRINT_SERVICES,
+                Settings.Secure.DISABLED_PRINT_SERVICES,
                 builder.toString());
     }
 }