Merge "Multiple printer discovery session instances and other bugs." into klp-dev
diff --git a/core/java/android/printservice/PrintService.java b/core/java/android/printservice/PrintService.java
index e5ebf77..e73a53b 100644
--- a/core/java/android/printservice/PrintService.java
+++ b/core/java/android/printservice/PrintService.java
@@ -383,6 +383,10 @@
             final int action = message.what;
             switch (action) {
                 case MSG_CREATE_PRINTER_DISCOVERY_SESSION: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_CREATE_PRINTER_DISCOVERY_SESSION "
+                                + getPackageName());
+                    }
                     PrinterDiscoverySession session = onCreatePrinterDiscoverySession();
                     if (session == null) {
                         throw new NullPointerException("session cannot be null");
@@ -396,6 +400,10 @@
                 } break;
 
                 case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_DESTROY_PRINTER_DISCOVERY_SESSION "
+                                + getPackageName());
+                    }
                     if (mDiscoverySession != null) {
                         mDiscoverySession.destroy();
                         mDiscoverySession = null;
@@ -403,6 +411,10 @@
                 } break;
 
                 case MSG_START_PRINTER_DISCOVERY: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_START_PRINTER_DISCOVERY "
+                                + getPackageName());
+                    }
                     if (mDiscoverySession != null) {
                         List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj;
                         mDiscoverySession.startPrinterDiscovery(priorityList);
@@ -410,12 +422,20 @@
                 } break;
 
                 case MSG_STOP_PRINTER_DISCOVERY: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_STOP_PRINTER_DISCOVERY "
+                                + getPackageName());
+                    }
                     if (mDiscoverySession != null) {
                         mDiscoverySession.stopPrinterDiscovery();
                     }
                 } break;
 
                 case MSG_VALIDATE_PRINTERS: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_VALIDATE_PRINTERS "
+                                + getPackageName());
+                    }
                     if (mDiscoverySession != null) {
                         List<PrinterId> printerIds = (List<PrinterId>) message.obj;
                         mDiscoverySession.validatePrinters(printerIds);
@@ -423,6 +443,10 @@
                 } break;
 
                 case MSG_START_PRINTER_STATE_TRACKING: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_START_PRINTER_STATE_TRACKING "
+                                + getPackageName());
+                    }
                     if (mDiscoverySession != null) {
                         PrinterId printerId = (PrinterId) message.obj;
                         mDiscoverySession.startPrinterStateTracking(printerId);
@@ -430,6 +454,10 @@
                 } break;
 
                 case MSG_STOP_PRINTER_STATE_TRACKING: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_STOP_PRINTER_STATE_TRACKING "
+                                + getPackageName());
+                    }
                     if (mDiscoverySession != null) {
                         PrinterId printerId = (PrinterId) message.obj;
                         mDiscoverySession.stopPrinterStateTracking(printerId);
@@ -437,11 +465,19 @@
                 } break;
 
                 case MSG_ON_REQUEST_CANCEL_PRINTJOB: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_ON_REQUEST_CANCEL_PRINTJOB "
+                                + getPackageName());
+                    }
                     PrintJobInfo printJobInfo = (PrintJobInfo) message.obj;
                     onRequestCancelPrintJob(new PrintJob(printJobInfo, mClient));
                 } break;
 
                 case MSG_ON_PRINTJOB_QUEUED: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_ON_PRINTJOB_QUEUED "
+                                + getPackageName());
+                    }
                     PrintJobInfo printJobInfo = (PrintJobInfo) message.obj;
                     if (DEBUG) {
                         Log.i(LOG_TAG, "Queued: " + printJobInfo);
@@ -450,6 +486,10 @@
                 } break;
 
                 case MSG_SET_CLEINT: {
+                    if (DEBUG) {
+                        Log.i(LOG_TAG, "MSG_SET_CLEINT "
+                                + getPackageName());
+                    }
                     mClient = (IPrintServiceClient) message.obj;
                     if (mClient != null) {
                         onConnected();
diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
index 72f6f0a..b4eb08a 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
@@ -86,10 +86,6 @@
     }
 
     private void computeAndDeliverResult(Map<PrinterId, PrinterInfo> discoveredPrinters) {
-        if (!isStarted()) {
-            return;
-        }
-
         List<PrinterInfo> printers = new ArrayList<PrinterInfo>();
 
         // Add the updated favorite printers.
@@ -123,8 +119,10 @@
         mPrinters.clear();
         mPrinters.addAll(printers);
 
-        // Deliver the printers.
-        deliverResult(printers);
+        if (isStarted()) {
+            // Deliver the printers.
+            deliverResult(printers);
+        }
     }
 
     @Override
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index fb2c935..ce1f6ec 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -74,7 +74,7 @@
 
     private static final String LOG_TAG = "PrintSpoolerService";
 
-    private static final boolean DEBUG_PRINT_JOB_LIFECYCLE = true;
+    private static final boolean DEBUG_PRINT_JOB_LIFECYCLE = false;
 
     private static final boolean DEBUG_PERSISTENCE = false;
 
diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java
index a20973e..5b9dc28 100644
--- a/services/java/com/android/server/print/RemotePrintService.java
+++ b/services/java/com/android/server/print/RemotePrintService.java
@@ -85,7 +85,7 @@
 
     private boolean mHasPrinterDiscoverySession;
 
-    private boolean mServiceDead;
+    private boolean mServiceDied;
 
     private List<PrinterId> mDiscoveryPriorityList;
 
@@ -107,7 +107,6 @@
         mSpooler = spooler;
         mHandler = new MyHandler(context.getMainLooper());
         mPrintServiceClient = new RemotePrintServiceClient(this);
-        mServiceDead = true;
     }
 
     public ComponentName getComponentName() {
@@ -157,7 +156,7 @@
     private void handleBinderDied() {
         mPrintService.asBinder().unlinkToDeath(this, 0);
         mPrintService = null;
-        mServiceDead = true;
+        mServiceDied = true;
         mCallbacks.onServiceDied(this);
     }
 
@@ -171,7 +170,7 @@
         if (!isBound()) {
             // The service is dead and neither has active jobs nor discovery
             // session, so ensure we are unbound since the service has no work.
-            if (mServiceDead && !mHasPrinterDiscoverySession) {
+            if (mServiceDied && !mHasPrinterDiscoverySession) {
                 ensureUnbound();
                 return;
             }
@@ -286,7 +285,7 @@
         if (!isBound()) {
             // The service is dead and neither has active jobs nor discovery
             // session, so ensure we are unbound since the service has no work.
-            if (mServiceDead && !mHasActivePrintJobs) {
+            if (mServiceDied && !mHasActivePrintJobs) {
                 ensureUnbound();
                 return;
             }
@@ -556,15 +555,15 @@
                 return;
             }
             // If the service died and there is a discovery session, recreate it.
-            if (mServiceDead && mHasPrinterDiscoverySession) {
+            if (mServiceDied && mHasPrinterDiscoverySession) {
                 handleCreatePrinterDiscoverySession();
             }
             // If the service died and there is discovery started, restart it.
-            if (mServiceDead && mDiscoveryPriorityList != null) {
+            if (mServiceDied && mDiscoveryPriorityList != null) {
                 handleStartPrinterDiscovery(mDiscoveryPriorityList);
             }
             // If the service died and printers were tracked, start tracking.
-            if (mServiceDead && mTrackedPrinterList != null) {
+            if (mServiceDied && mTrackedPrinterList != null) {
                 final int trackedPrinterCount = mTrackedPrinterList.size();
                 for (int i = 0; i < trackedPrinterCount; i++) {
                     handleStartPrinterStateTracking(mTrackedPrinterList.get(i));
@@ -581,7 +580,7 @@
             if (!mHasPrinterDiscoverySession && !mHasActivePrintJobs) {
                 ensureUnbound();
             }
-            mServiceDead = false;
+            mServiceDied = false;
         }
 
         @Override
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index fd4a3a4..8c21827 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -1007,12 +1007,25 @@
             mHandler.obtainMessage(
                     SessionHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION,
                     service).sendToTarget();
-            // If there are some observers that started discovery - tell the service.
-            if (mDiscoveryObservers.getRegisteredCallbackCount() > 0) {
+            // Start printer discovery if necessary.
+            if (!mStartedPrinterDiscoveryTokens.isEmpty()) {
                 mHandler.obtainMessage(
                         SessionHandler.MSG_START_PRINTER_DISCOVERY,
                         service).sendToTarget();
             }
+            // Start tracking printers if necessary
+            final int trackedPrinterCount = mStateTrackedPrinters.size();
+            for (int i = 0; i < trackedPrinterCount; i++) {
+                PrinterId printerId = mStateTrackedPrinters.get(i);
+                if (printerId.getServiceName().equals(service.getComponentName())) {
+                    SomeArgs args = SomeArgs.obtain();
+                    args.arg1 = service;
+                    args.arg2 = printerId;
+                    mHandler.obtainMessage(SessionHandler
+                            .MSG_START_PRINTER_STATE_TRACKING, args)
+                            .sendToTarget();
+                }
+            }
         }
 
         public void dump(PrintWriter pw, String prefix) {