diff options
author | Svetoslav <svetoslavganov@google.com> | 2013-09-27 18:29:53 -0700 |
---|---|---|
committer | Svetoslav <svetoslavganov@google.com> | 2013-09-27 18:46:24 -0700 |
commit | d8dbc13b47bec3248a86a505a30af9d0474240dc (patch) | |
tree | 1eb730b9fc3d8455d9ebde9e2624adbb382c693e | |
parent | fb2e3c8d47c162166a029a97d68ad3bedff89cce (diff) | |
download | frameworks_base-d8dbc13b47bec3248a86a505a30af9d0474240dc.zip frameworks_base-d8dbc13b47bec3248a86a505a30af9d0474240dc.tar.gz frameworks_base-d8dbc13b47bec3248a86a505a30af9d0474240dc.tar.bz2 |
Ignore historical printer records for installed services
When loading historical records for previously used printers we
now ignore the ones whose target print service is not installed.
bug:10955652
Change-Id: Ib295e7d88ed3c308ef6d8a11bdc1792ebbb6d526
5 files changed, 76 insertions, 5 deletions
diff --git a/core/java/android/print/IPrintManager.aidl b/core/java/android/print/IPrintManager.aidl index 4044b31..3bd515b 100644 --- a/core/java/android/print/IPrintManager.aidl +++ b/core/java/android/print/IPrintManager.aidl @@ -45,6 +45,7 @@ interface IPrintManager { void removePrintJobStateChangeListener(in IPrintJobStateChangeListener listener, int userId); + List<PrintServiceInfo> getInstalledPrintServices(int userId); List<PrintServiceInfo> getEnabledPrintServices(int userId); void createPrinterDiscoverySession(in IPrinterDiscoveryObserver observer, int userId); diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java index a015388..0859fdd 100644 --- a/core/java/android/print/PrintManager.java +++ b/core/java/android/print/PrintManager.java @@ -289,7 +289,26 @@ public final class PrintManager { return enabledServices; } } catch (RemoteException re) { - Log.e(LOG_TAG, "Error getting the enalbed print services", re); + Log.e(LOG_TAG, "Error getting the enabled print services", re); + } + return Collections.emptyList(); + } + + /** + * Gets the list of installed print services. + * + * @return The installed service list or an empty list. + * + * @hide + */ + public List<PrintServiceInfo> getInstalledPrintServices() { + try { + List<PrintServiceInfo> installedServices = mService.getInstalledPrintServices(mUserId); + if (installedServices != null) { + return installedServices; + } + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error getting the installed print services", re); } return Collections.emptyList(); } diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java index 3a1a3c4..65af830 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java +++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java @@ -19,13 +19,16 @@ package com.android.printspooler; import android.content.ComponentName; import android.content.Context; import android.content.Loader; +import android.content.pm.ServiceInfo; import android.os.AsyncTask; import android.print.PrintManager; import android.print.PrinterDiscoverySession; import android.print.PrinterDiscoverySession.OnPrintersChangeListener; import android.print.PrinterId; import android.print.PrinterInfo; +import android.printservice.PrintServiceInfo; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.AtomicFile; import android.util.Log; import android.util.Slog; @@ -46,6 +49,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import libcore.io.IoUtils; @@ -384,6 +388,30 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { + FusedPrintersProvider.this.hashCode()); } + // Ignore printer records whose target services are not installed. + PrintManager printManager = (PrintManager) getContext() + .getSystemService(Context.PRINT_SERVICE); + List<PrintServiceInfo> services = printManager + .getInstalledPrintServices(); + + Set<ComponentName> installedComponents = new ArraySet<ComponentName>(); + final int installedServiceCount = services.size(); + for (int i = 0; i < installedServiceCount; i++) { + ServiceInfo serviceInfo = services.get(i).getResolveInfo().serviceInfo; + ComponentName componentName = new ComponentName( + serviceInfo.packageName, serviceInfo.name); + installedComponents.add(componentName); + } + + final int printerCount = printers.size(); + for (int i = printerCount - 1; i >= 0; i--) { + ComponentName printerServiceName = printers.get(i).getId().getServiceName(); + if (!installedComponents.contains(printerServiceName.getPackageName())) { + printers.remove(i); + } + } + + // Store the filtered list. mHistoricalPrinters = printers; // Compute the favorite printers. diff --git a/services/java/com/android/server/print/PrintManagerService.java b/services/java/com/android/server/print/PrintManagerService.java index d4583b5..b8e1b04 100644 --- a/services/java/com/android/server/print/PrintManagerService.java +++ b/services/java/com/android/server/print/PrintManagerService.java @@ -194,6 +194,21 @@ public final class PrintManagerService extends IPrintManager.Stub { } @Override + public List<PrintServiceInfo> getInstalledPrintServices(int userId) { + final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId); + final UserState userState; + synchronized (mLock) { + userState = getOrCreateUserStateLocked(resolvedUserId); + } + final long identity = Binder.clearCallingIdentity(); + try { + return userState.getInstalledPrintServices(); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override public void createPrinterDiscoverySession(IPrinterDiscoveryObserver observer, int userId) { final int resolvedUserId = resolveCallingUserEnforcingPermissions(userId); diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index 72acc53..bc70fe3 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -205,10 +205,12 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { // Add everything else the spooler knows about. List<PrintJobInfo> printJobs = mSpooler.getPrintJobInfos(null, PrintJobInfo.STATE_ANY, appId); - final int printJobCount = printJobs.size(); - for (int i = 0; i < printJobCount; i++) { - PrintJobInfo printJob = printJobs.get(i); - result.put(printJob.getId(), printJob); + if (printJobs != null) { + final int printJobCount = printJobs.size(); + for (int i = 0; i < printJobCount; i++) { + PrintJobInfo printJob = printJobs.get(i); + result.put(printJob.getId(), printJob); + } } return new ArrayList<PrintJobInfo>(result.values()); @@ -272,6 +274,12 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { } } + public List<PrintServiceInfo> getInstalledPrintServices() { + synchronized (mLock) { + return mInstalledServices; + } + } + public void createPrinterDiscoverySession(IPrinterDiscoveryObserver observer) { synchronized (mLock) { throwIfDestroyedLocked(); |