Add # of active print jobs back to print setting summary

Change-Id: Iefdde7d9e5f13a892bceff7c676c4c7b9aa8d206
Fix: 37640842
Test: make RunSettingsRoboTests
diff --git a/src/com/android/settings/print/PrintSettingsFragment.java b/src/com/android/settings/print/PrintSettingsFragment.java
index a1c1660..26e760c 100644
--- a/src/com/android/settings/print/PrintSettingsFragment.java
+++ b/src/com/android/settings/print/PrintSettingsFragment.java
@@ -164,8 +164,7 @@
     /**
      * Adds preferences for all print services to the {@value PRINT_SERVICES_CATEGORY} cathegory.
      */
-    private final class PrintServicesController implements
-           LoaderCallbacks<List<PrintServiceInfo>> {
+    private final class PrintServicesController implements LoaderCallbacks<List<PrintServiceInfo>> {
         @Override
         public Loader<List<PrintServiceInfo>> onCreateLoader(int id, Bundle args) {
             PrintManager printManager =
@@ -290,7 +289,7 @@
         }
     }
 
-     private final class PrintJobsController implements LoaderCallbacks<List<PrintJobInfo>> {
+    private final class PrintJobsController implements LoaderCallbacks<List<PrintJobInfo>> {
 
         @Override
         public Loader<List<PrintJobInfo>> onCreateLoader(int id, Bundle args) {
@@ -326,7 +325,7 @@
 
                     switch (printJob.getState()) {
                         case PrintJobInfo.STATE_QUEUED:
-                        case PrintJobInfo.STATE_STARTED: {
+                        case PrintJobInfo.STATE_STARTED:
                             if (!printJob.isCancelling()) {
                                 preference.setTitle(getString(
                                         R.string.print_printing_state_title_template,
@@ -336,15 +335,13 @@
                                         R.string.print_cancelling_state_title_template,
                                         printJob.getLabel()));
                             }
-                        } break;
-
-                        case PrintJobInfo.STATE_FAILED: {
+                            break;
+                        case PrintJobInfo.STATE_FAILED:
                             preference.setTitle(getString(
                                     R.string.print_failed_state_title_template,
                                     printJob.getLabel()));
-                        } break;
-
-                        case PrintJobInfo.STATE_BLOCKED: {
+                            break;
+                        case PrintJobInfo.STATE_BLOCKED:
                             if (!printJob.isCancelling()) {
                                 preference.setTitle(getString(
                                         R.string.print_blocked_state_title_template,
@@ -354,7 +351,7 @@
                                         R.string.print_cancelling_state_title_template,
                                         printJob.getLabel()));
                             }
-                        } break;
+                            break;
                     }
 
                     preference.setSummary(getString(R.string.print_job_summary,
@@ -364,14 +361,13 @@
 
                     switch (printJob.getState()) {
                         case PrintJobInfo.STATE_QUEUED:
-                        case PrintJobInfo.STATE_STARTED: {
+                        case PrintJobInfo.STATE_STARTED:
                             preference.setIcon(R.drawable.ic_print);
-                        } break;
-
+                            break;
                         case PrintJobInfo.STATE_FAILED:
-                        case PrintJobInfo.STATE_BLOCKED: {
+                        case PrintJobInfo.STATE_BLOCKED:
                             preference.setIcon(R.drawable.ic_print_error);
-                        } break;
+                            break;
                     }
 
                     Bundle extras = preference.getExtras();
@@ -475,7 +471,7 @@
                 PrintJobInfo printJob = printJobs.get(i).getInfo();
                 if (shouldShowToUser(printJob)) {
                     if (printJobInfos == null) {
-                        printJobInfos = new ArrayList<PrintJobInfo>();
+                        printJobInfos = new ArrayList<>();
                     }
                     printJobInfos.add(printJob);
                 }
@@ -505,8 +501,9 @@
     /**
      * Provider for the print settings summary
      */
-    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    static class PrintSummaryProvider implements SummaryLoader.SummaryProvider {
+    @VisibleForTesting
+    static class PrintSummaryProvider
+            implements SummaryLoader.SummaryProvider, PrintJobStateChangeListener {
         private final Context mContext;
         private final PrintManagerWrapper mPrintManager;
         private final SummaryLoader mSummaryLoader;
@@ -528,19 +525,43 @@
         public void setListening(boolean isListening) {
             if (mPrintManager != null) {
                 if (isListening) {
-                    List<PrintServiceInfo> services =
-                            mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES);
-                    if (services == null || services.isEmpty()) {
-                        mSummaryLoader.setSummary(this,
-                                mContext.getString(R.string.print_settings_summary_no_service));
-                    } else {
-                        final int count = services.size();
-                        mSummaryLoader.setSummary(this,
-                                mContext.getResources().getQuantityString(
-                                        R.plurals.print_settings_summary, count, count));
+                    mPrintManager.addPrintJobStateChanegListner(this);
+                    onPrintJobStateChanged(null);
+                } else {
+                    mPrintManager.removePrintJobStateChangeListener(this);
+                }
+            }
+        }
+
+        @Override
+        public void onPrintJobStateChanged(PrintJobId printJobId) {
+            final List<PrintJob> printJobs = mPrintManager.getPrintJobs();
+
+            int numActivePrintJobs = 0;
+            if (printJobs != null) {
+                for (PrintJob job : printJobs) {
+                    if (shouldShowToUser(job.getInfo())) {
+                        numActivePrintJobs++;
                     }
                 }
             }
+
+            if (numActivePrintJobs > 0) {
+                mSummaryLoader.setSummary(this, mContext.getResources().getQuantityString(
+                        R.plurals.print_jobs_summary, numActivePrintJobs, numActivePrintJobs));
+            } else {
+                List<PrintServiceInfo> services =
+                        mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES);
+                if (services == null || services.isEmpty()) {
+                    mSummaryLoader.setSummary(this,
+                            mContext.getString(R.string.print_settings_summary_no_service));
+                } else {
+                    final int count = services.size();
+                    mSummaryLoader.setSummary(this,
+                            mContext.getResources().getQuantityString(
+                                    R.plurals.print_settings_summary, count, count));
+                }
+            }
         }
 
         static class PrintManagerWrapper {
@@ -555,6 +576,18 @@
             public List<PrintServiceInfo> getPrintServices(int selectionFlags) {
                 return mPrintManager.getPrintServices(selectionFlags);
             }
+
+            public void addPrintJobStateChanegListner(PrintJobStateChangeListener listener) {
+                mPrintManager.addPrintJobStateChangeListener(listener);
+            }
+
+            public void removePrintJobStateChangeListener(PrintJobStateChangeListener listener) {
+                mPrintManager.removePrintJobStateChangeListener(listener);
+            }
+
+            public List<PrintJob> getPrintJobs() {
+                return mPrintManager.getPrintJobs();
+            }
         }
     }
 
diff --git a/tests/robotests/src/com/android/settings/print/PrintSettingsFragmentTest.java b/tests/robotests/src/com/android/settings/print/PrintSettingsFragmentTest.java
index 0e2a2f6..57219d4 100644
--- a/tests/robotests/src/com/android/settings/print/PrintSettingsFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/print/PrintSettingsFragmentTest.java
@@ -22,6 +22,8 @@
 
 import android.app.Activity;
 import android.content.res.Resources;
+import android.print.PrintJob;
+import android.print.PrintJobInfo;
 import android.print.PrintManager;
 import android.printservice.PrintServiceInfo;
 
@@ -34,9 +36,11 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
+import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
 
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -63,13 +67,26 @@
     }
 
     @Test
+    public void testSummary_hasActiveJob_shouldSetSummaryToNumberOfJobs() {
+        final List<PrintJob> printJobs = new ArrayList<>();
+        final PrintJob job = mock(PrintJob.class, Mockito.RETURNS_DEEP_STUBS);
+        printJobs.add(job);
+        when(job.getInfo().getState()).thenReturn(PrintJobInfo.STATE_STARTED);
+        when(mPrintManager.getPrintJobs()).thenReturn(printJobs);
+
+        mSummaryProvider.setListening(true);
+
+        verify(mRes).getQuantityString(R.plurals.print_jobs_summary, 1, 1);
+    }
+
+    @Test
     public void testSummary_shouldSetSummaryToNumberOfPrintServices() {
         final List<PrintServiceInfo> printServices = mock(List.class);
         when(printServices.isEmpty()).thenReturn(false);
         when(printServices.size()).thenReturn(2);
         // 2 services
         when(mPrintManager.getPrintServices(PrintManager.ENABLED_SERVICES))
-            .thenReturn(printServices);
+                .thenReturn(printServices);
 
         mSummaryProvider.setListening(true);