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);
 
