diff options
| author | Svetoslav Ganov <svetoslavganov@google.com> | 2013-09-03 00:11:58 -0700 |
|---|---|---|
| committer | Svetoslav Ganov <svetoslavganov@google.com> | 2013-09-03 08:42:17 -0700 |
| commit | 9186d0cb2bd325d9b52da15dbd513937c1e42caa (patch) | |
| tree | 8237bc1c648c916b670935d3f9bc0cd6c9d56965 /services/java/com/android/server/print/UserState.java | |
| parent | 6bd20bc46c762860cac852888df5adf718f2be24 (diff) | |
Bug fixes in the printer dialog activity and fused printer loader.
1. Fused printers loader was not using the discovered printers to update the
historical ones. Now if a historical printer is discovered we update its state
with the discovered, i.e. most recent, information.
2. Fixed a bug in the destination adapter of the print job config dialog that
was leading to a crash if all printers item is selected when there are no
discovered printers.
3. Updated the add printers asset in the all printers screen.
4. Historical printers were not persisted by the print dialog activity.
5. Reduced the number of printers we send per transation to avoid the binder
transaction size limit. Added sending of printers in chunks in a place
this was missing.
Change-Id: I88b54888360bc0e53b06bd260c2b832d0d6454b6
Diffstat (limited to 'services/java/com/android/server/print/UserState.java')
| -rw-r--r-- | services/java/com/android/server/print/UserState.java | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index 7d94a42b666b..b9c676d0e28d 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -62,7 +62,7 @@ final class UserState implements PrintSpoolerCallbacks { private static final boolean DEBUG = true && Build.IS_DEBUGGABLE; - private static final int MAX_ITEMS_PER_CALLBACK = 100; + private static final int MAX_ITEMS_PER_CALLBACK = 50; private static final char COMPONENT_NAME_SEPARATOR = ':'; @@ -576,10 +576,12 @@ final class UserState implements PrintSpoolerCallbacks { // Remember we got a start request to match with an end. mStartedPrinterDiscoveryTokens.add(observer.asBinder()); + // The service are already performing discovery - nothing to do. if (mStartedPrinterDiscoveryTokens.size() > 1) { return; } + List<RemotePrintService> services = new ArrayList<RemotePrintService>( mActiveServices.values()); SomeArgs args = SomeArgs.obtain(); @@ -858,11 +860,7 @@ final class UserState implements PrintSpoolerCallbacks { final int observerCount = mDiscoveryObservers.beginBroadcast(); for (int i = 0; i < observerCount; i++) { IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); - try { - observer.onPrintersAdded(addedPrinters); - } catch (RemoteException re) { - Log.i(LOG_TAG, "Error dispatching added printers", re); - } + handlePrintersAdded(observer, addedPrinters); } mDiscoveryObservers.finishBroadcast(); } @@ -871,11 +869,7 @@ final class UserState implements PrintSpoolerCallbacks { final int observerCount = mDiscoveryObservers.beginBroadcast(); for (int i = 0; i < observerCount; i++) { IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); - try { - observer.onPrintersRemoved(removedPrinterIds); - } catch (RemoteException re) { - Log.i(LOG_TAG, "Error dispatching removed printers", re); - } + handlePrintersRemoved(observer, removedPrinterIds); } mDiscoveryObservers.finishBroadcast(); } @@ -884,11 +878,7 @@ final class UserState implements PrintSpoolerCallbacks { final int observerCount = mDiscoveryObservers.beginBroadcast(); for (int i = 0; i < observerCount; i++) { IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); - try { - observer.onPrintersUpdated(updatedPrinters); - } catch (RemoteException re) { - Log.i(LOG_TAG, "Error dispatching updated printers", re); - } + handlePrintersUpdated(observer, updatedPrinters); } mDiscoveryObservers.finishBroadcast(); } @@ -957,7 +947,7 @@ final class UserState implements PrintSpoolerCallbacks { final int start = i * MAX_ITEMS_PER_CALLBACK; final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); List<PrinterInfo> subPrinters = printers.subList(start, end); - observer.onPrintersAdded(subPrinters); + observer.onPrintersAdded(subPrinters); } } } catch (RemoteException re) { @@ -986,6 +976,27 @@ final class UserState implements PrintSpoolerCallbacks { } } + private void handlePrintersUpdated(IPrinterDiscoveryObserver observer, + List<PrinterInfo> updatedPrinters) { + try { + final int printerCount = updatedPrinters.size(); + if (printerCount <= MAX_ITEMS_PER_CALLBACK) { + observer.onPrintersUpdated(updatedPrinters); + } else { + // Send the added printers in chunks avoiding the binder transaction limit. + final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1; + for (int i = 0; i < transactionCount; i++) { + final int start = i * MAX_ITEMS_PER_CALLBACK; + final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); + List<PrinterInfo> subPrinters = updatedPrinters.subList(start, end); + observer.onPrintersUpdated(subPrinters); + } + } + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error sending updated printers", re); + } + } + private final class SessionHandler extends Handler { public static final int MSG_PRINTERS_ADDED = 1; public static final int MSG_PRINTERS_REMOVED = 2; |
