diff options
author | Philip P. Moltmann <moltmann@google.com> | 2017-06-19 10:55:09 -0700 |
---|---|---|
committer | Philip P. Moltmann <moltmann@google.com> | 2017-07-25 11:32:24 -0700 |
commit | c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8 (patch) | |
tree | 7487e91db8af6ea68d13e89a75e26af7ce881c49 /services/print | |
parent | 6eb4d48817ed6ad5b6298bd5820185a3ae61692d (diff) |
Dump print manager as proto
Test: incident_report print. Having no entries
Change-Id: I3c7d611e44c0d3bf8e00775b1708bd82a334121a
Diffstat (limited to 'services/print')
4 files changed, 311 insertions, 88 deletions
diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index 6c417a9baf93..33d1fed4ef56 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -50,8 +50,10 @@ import android.printservice.PrintServiceInfo; import android.printservice.recommendation.IRecommendationsChangeListener; import android.printservice.recommendation.RecommendationInfo; import android.provider.Settings; +import android.service.print.PrintServiceDumpProto; import android.util.Log; import android.util.SparseArray; +import android.util.proto.ProtoOutputStream; import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; @@ -638,19 +640,32 @@ public final class PrintManagerService extends SystemService { @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { fd = Preconditions.checkNotNull(fd); - pw = Preconditions.checkNotNull(pw); if (!DumpUtils.checkDumpPermission(mContext, LOG_TAG, pw)) return; + int opti = 0; + boolean dumpAsProto = false; + int user = UserHandle.USER_ALL; + while (opti < args.length) { + String opt = args[opti]; + if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') { + break; + } + opti++; + if ("--proto".equals(opt)) { + dumpAsProto = true; + } else { + pw.println("Unknown argument: " + opt + "; use -h for help"); + } + } + synchronized (mLock) { final long identity = Binder.clearCallingIdentity(); try { - pw.println("PRINT MANAGER STATE (dumpsys print)"); - final int userStateCount = mUserStates.size(); - for (int i = 0; i < userStateCount; i++) { - UserState userState = mUserStates.valueAt(i); - userState.dump(fd, pw, ""); - pw.println(); + if (dumpAsProto) { + dumpLocked(new ProtoOutputStream(fd), UserHandle.of(user)); + } else { + dumpLocked(fd, pw, UserHandle.of(user)); } } finally { Binder.restoreCallingIdentity(identity); @@ -658,6 +673,37 @@ public final class PrintManagerService extends SystemService { } } + private void dumpLocked(@NonNull ProtoOutputStream proto, @NonNull UserHandle user) { + final int userStateCount = mUserStates.size(); + for (int i = 0; i < userStateCount; i++) { + UserState userState = mUserStates.valueAt(i); + + if (user.equals(UserHandle.ALL) || mUserStates.keyAt(i) == user.getIdentifier()) { + long token = proto.start(PrintServiceDumpProto.USER_STATES); + userState.dump(proto); + proto.end(token); + } + } + + proto.flush(); + } + + private void dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, + @NonNull UserHandle user) { + pw = Preconditions.checkNotNull(pw); + + pw.println("PRINT MANAGER STATE (dumpsys print)"); + final int userStateCount = mUserStates.size(); + for (int i = 0; i < userStateCount; i++) { + UserState userState = mUserStates.valueAt(i); + + if (user.equals(UserHandle.ALL) || mUserStates.keyAt(i) == user.getIdentifier()) { + userState.dump(fd, pw, ""); + pw.println(); + } + } + } + private void registerContentObservers() { final Uri enabledPrintServicesUri = Settings.Secure.getUriFor( Settings.Secure.DISABLED_PRINT_SERVICES); diff --git a/services/print/java/com/android/server/print/RemotePrintService.java b/services/print/java/com/android/server/print/RemotePrintService.java index fb78457538be..13462cd3e3e4 100644 --- a/services/print/java/com/android/server/print/RemotePrintService.java +++ b/services/print/java/com/android/server/print/RemotePrintService.java @@ -16,6 +16,9 @@ package com.android.server.print; +import static com.android.internal.print.DumpUtils.writeComponentName; +import static com.android.internal.print.DumpUtils.writePrinterId; + import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -42,7 +45,11 @@ import android.print.PrinterId; import android.print.PrinterInfo; import android.printservice.IPrintService; import android.printservice.IPrintServiceClient; +import android.service.print.ActivePrintServiceProto; import android.util.Slog; +import android.util.proto.ProtoOutputStream; + +import com.android.internal.annotations.GuardedBy; import java.io.PrintWriter; import java.lang.ref.WeakReference; @@ -60,6 +67,8 @@ final class RemotePrintService implements DeathRecipient { private static final boolean DEBUG = false; + private final Object mLock = new Object(); + private final Context mContext; private final ComponentName mComponentName; @@ -94,6 +103,7 @@ final class RemotePrintService implements DeathRecipient { private List<PrinterId> mDiscoveryPriorityList; + @GuardedBy("mLock") private List<PrinterId> mTrackedPrinterList; public static interface PrintServiceCallbacks { @@ -443,11 +453,14 @@ final class RemotePrintService implements DeathRecipient { } private void handleStartPrinterStateTracking(final @NonNull PrinterId printerId) { - // Take a note we are tracking the printer. - if (mTrackedPrinterList == null) { - mTrackedPrinterList = new ArrayList<PrinterId>(); + synchronized (mLock) { + // Take a note we are tracking the printer. + if (mTrackedPrinterList == null) { + mTrackedPrinterList = new ArrayList<PrinterId>(); + } + mTrackedPrinterList.add(printerId); } - mTrackedPrinterList.add(printerId); + if (!isBound()) { ensureBound(); mPendingCommands.add(new Runnable() { @@ -474,13 +487,16 @@ final class RemotePrintService implements DeathRecipient { } private void handleStopPrinterStateTracking(final PrinterId printerId) { - // We are no longer tracking the printer. - if (mTrackedPrinterList == null || !mTrackedPrinterList.remove(printerId)) { - return; - } - if (mTrackedPrinterList.isEmpty()) { - mTrackedPrinterList = null; + synchronized (mLock) { + // We are no longer tracking the printer. + if (mTrackedPrinterList == null || !mTrackedPrinterList.remove(printerId)) { + return; + } + if (mTrackedPrinterList.isEmpty()) { + mTrackedPrinterList = null; + } } + if (!isBound()) { ensureBound(); mPendingCommands.add(new Runnable() { @@ -502,14 +518,37 @@ final class RemotePrintService implements DeathRecipient { } private void stopTrackingAllPrinters() { - if (mTrackedPrinterList == null) { - return; + synchronized (mLock) { + if (mTrackedPrinterList == null) { + return; + } + final int trackedPrinterCount = mTrackedPrinterList.size(); + for (int i = trackedPrinterCount - 1; i >= 0; i--) { + PrinterId printerId = mTrackedPrinterList.get(i); + if (printerId.getServiceName().equals(mComponentName)) { + handleStopPrinterStateTracking(printerId); + } + } } - final int trackedPrinterCount = mTrackedPrinterList.size(); - for (int i = trackedPrinterCount - 1; i >= 0; i--) { - PrinterId printerId = mTrackedPrinterList.get(i); - if (printerId.getServiceName().equals(mComponentName)) { - handleStopPrinterStateTracking(printerId); + } + + public void dump(@NonNull ProtoOutputStream proto) { + writeComponentName(proto, ActivePrintServiceProto.COMPONENT_NAME, mComponentName); + + proto.write(ActivePrintServiceProto.IS_DESTROYED, mDestroyed); + proto.write(ActivePrintServiceProto.IS_BOUND, isBound()); + proto.write(ActivePrintServiceProto.HAS_DISCOVERY_SESSION, mHasPrinterDiscoverySession); + proto.write(ActivePrintServiceProto.HAS_ACTIVE_PRINT_JOBS, mHasActivePrintJobs); + proto.write(ActivePrintServiceProto.IS_DISCOVERING_PRINTERS, + mDiscoveryPriorityList != null); + + synchronized (mLock) { + if (mTrackedPrinterList != null) { + int numTrackedPrinters = mTrackedPrinterList.size(); + for (int i = 0; i < numTrackedPrinters; i++) { + writePrinterId(proto, ActivePrintServiceProto.TRACKED_PRINTERS, + mTrackedPrinterList.get(i)); + } } } } @@ -529,8 +568,11 @@ final class RemotePrintService implements DeathRecipient { .append(String.valueOf(mHasActivePrintJobs)).println(); pw.append(prefix).append(tab).append("isDiscoveringPrinters=") .append(String.valueOf(mDiscoveryPriorityList != null)).println(); - pw.append(prefix).append(tab).append("trackedPrinters=") - .append((mTrackedPrinterList != null) ? mTrackedPrinterList.toString() : "null"); + + synchronized (mLock) { + pw.append(prefix).append(tab).append("trackedPrinters=").append( + (mTrackedPrinterList != null) ? mTrackedPrinterList.toString() : "null"); + } } private boolean isBound() { @@ -574,7 +616,11 @@ final class RemotePrintService implements DeathRecipient { mHasActivePrintJobs = false; mHasPrinterDiscoverySession = false; mDiscoveryPriorityList = null; - mTrackedPrinterList = null; + + synchronized (mLock) { + mTrackedPrinterList = null; + } + if (isBound()) { try { mPrintService.setClient(null); @@ -617,11 +663,13 @@ final class RemotePrintService implements DeathRecipient { if (mServiceDied && mDiscoveryPriorityList != null) { handleStartPrinterDiscovery(mDiscoveryPriorityList); } - // If the service died and printers were tracked, start tracking. - if (mServiceDied && mTrackedPrinterList != null) { - final int trackedPrinterCount = mTrackedPrinterList.size(); - for (int i = 0; i < trackedPrinterCount; i++) { - handleStartPrinterStateTracking(mTrackedPrinterList.get(i)); + synchronized (mLock) { + // If the service died and printers were tracked, start tracking. + if (mServiceDied && mTrackedPrinterList != null) { + final int trackedPrinterCount = mTrackedPrinterList.size(); + for (int i = 0; i < trackedPrinterCount; i++) { + handleStartPrinterStateTracking(mTrackedPrinterList.get(i)); + } } } // Finally, do all the pending work. diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java index abd2244959cf..f654fcb60750 100644 --- a/services/print/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java @@ -40,8 +40,10 @@ import android.print.PrintJobInfo; import android.print.PrintManager; import android.print.PrinterId; import android.printservice.PrintService; +import android.service.print.PrintSpoolerStateProto; import android.util.Slog; import android.util.TimedRemoteCaller; +import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; import com.android.internal.os.TransferPipe; @@ -363,7 +365,7 @@ final class RemotePrintSpooler { * * @param printerId the id of the printer the icon belongs to * @param icon the icon that was loaded - * @see android.print.PrinterInfo.Builder#setHasCustomPrinterIcon() + * @see android.print.PrinterInfo.Builder#setHasCustomPrinterIcon */ public final void onCustomPrinterIconLoaded(@NonNull PrinterId printerId, @Nullable Icon icon) { @@ -396,7 +398,7 @@ final class RemotePrintSpooler { * @param printerId the id of the printer the icon should be loaded for * @return the custom icon to be used for the printer or null if the icon is * not yet available - * @see android.print.PrinterInfo.Builder#setHasCustomPrinterIcon() + * @see android.print.PrinterInfo.Builder#setHasCustomPrinterIcon */ public final @Nullable Icon getCustomPrinterIcon(@NonNull PrinterId printerId) { throwIfCalledOnMainThread(); @@ -556,6 +558,20 @@ final class RemotePrintSpooler { } } + public void dump(@NonNull ProtoOutputStream proto) { + synchronized (mLock) { + proto.write(PrintSpoolerStateProto.IS_DESTROYED, mDestroyed); + proto.write(PrintSpoolerStateProto.IS_BOUND, mRemoteInstance != null); + } + + try { + proto.write(PrintSpoolerStateProto.INTERNAL_STATE, + TransferPipe.dumpAsync(getRemoteInstanceLazy().asBinder(), "--proto")); + } catch (IOException | TimeoutException | RemoteException | InterruptedException e) { + Slog.e(LOG_TAG, "Failed to dump remote instance", e); + } + } + public void dump(FileDescriptor fd, PrintWriter pw, String prefix) { synchronized (mLock) { pw.append(prefix).append("destroyed=") diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index 5770c5079d94..58833bee1b98 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -20,6 +20,12 @@ import static android.content.pm.PackageManager.GET_META_DATA; import static android.content.pm.PackageManager.GET_SERVICES; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; +import static com.android.internal.print.DumpUtils.writeComponentName; +import static com.android.internal.print.DumpUtils.writePrintJobInfo; +import static com.android.internal.print.DumpUtils.writePrinterId; +import static com.android.internal.print.DumpUtils.writePrinterInfo; +import static com.android.internal.print.DumpUtils.writeStringIfNotNull; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; @@ -58,6 +64,10 @@ import android.printservice.recommendation.IRecommendationsChangeListener; import android.printservice.recommendation.RecommendationInfo; import android.provider.DocumentsContract; import android.provider.Settings; +import android.service.print.CachedPrintJobProto; +import android.service.print.InstalledPrintServiceProto; +import android.service.print.PrintUserStateProto; +import android.service.print.PrinterDiscoverySessionProto; import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.util.ArrayMap; @@ -65,6 +75,7 @@ import android.util.ArraySet; import android.util.Log; import android.util.Slog; import android.util.SparseArray; +import android.util.proto.ProtoOutputStream; import com.android.internal.R; import com.android.internal.logging.MetricsLogger; @@ -803,55 +814,107 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, mDestroyed = true; } + public void dump(@NonNull ProtoOutputStream proto) { + synchronized (mLock) { + proto.write(PrintUserStateProto.USER_ID, mUserId); + + final int installedServiceCount = mInstalledServices.size(); + for (int i = 0; i < installedServiceCount; i++) { + long token = proto.start(PrintUserStateProto.INSTALLED_SERVICES); + PrintServiceInfo installedService = mInstalledServices.get(i); + + ResolveInfo resolveInfo = installedService.getResolveInfo(); + writeComponentName(proto, InstalledPrintServiceProto.COMPONENT_NAME, + new ComponentName(resolveInfo.serviceInfo.packageName, + resolveInfo.serviceInfo.name)); + + writeStringIfNotNull(proto, InstalledPrintServiceProto.SETTINGS_ACTIVITY, + installedService.getSettingsActivityName()); + writeStringIfNotNull(proto, InstalledPrintServiceProto.ADD_PRINTERS_ACTIVITY, + installedService.getAddPrintersActivityName()); + writeStringIfNotNull(proto, InstalledPrintServiceProto.ADVANCED_OPTIONS_ACTIVITY, + installedService.getAdvancedOptionsActivityName()); + + proto.end(token); + } + + for (ComponentName disabledService : mDisabledServices) { + writeComponentName(proto, PrintUserStateProto.DISABLED_SERVICES, disabledService); + } + + final int activeServiceCount = mActiveServices.size(); + for (int i = 0; i < activeServiceCount; i++) { + long token = proto.start(PrintUserStateProto.ACTIVE_SERVICES); + mActiveServices.valueAt(i).dump(proto); + proto.end(token); + } + + mPrintJobForAppCache.dumpLocked(proto); + + if (mPrinterDiscoverySession != null) { + long token = proto.start(PrintUserStateProto.DISCOVERY_SESSIONS); + mPrinterDiscoverySession.dumpLocked(proto); + proto.end(token); + } + + } + + long token = proto.start(PrintUserStateProto.PRINT_SPOOLER_STATE); + mSpooler.dump(proto); + proto.end(token); + } + public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String prefix) { pw.append(prefix).append("user state ").append(String.valueOf(mUserId)).append(":"); pw.println(); String tab = " "; - pw.append(prefix).append(tab).append("installed services:").println(); - final int installedServiceCount = mInstalledServices.size(); - for (int i = 0; i < installedServiceCount; i++) { - PrintServiceInfo installedService = mInstalledServices.get(i); - String installedServicePrefix = prefix + tab + tab; - pw.append(installedServicePrefix).append("service:").println(); - ResolveInfo resolveInfo = installedService.getResolveInfo(); - ComponentName componentName = new ComponentName( - resolveInfo.serviceInfo.packageName, - resolveInfo.serviceInfo.name); - pw.append(installedServicePrefix).append(tab).append("componentName=") - .append(componentName.flattenToString()).println(); - pw.append(installedServicePrefix).append(tab).append("settingsActivity=") - .append(installedService.getSettingsActivityName()).println(); - pw.append(installedServicePrefix).append(tab).append("addPrintersActivity=") - .append(installedService.getAddPrintersActivityName()).println(); - pw.append(installedServicePrefix).append(tab).append("avancedOptionsActivity=") - .append(installedService.getAdvancedOptionsActivityName()).println(); - } - - pw.append(prefix).append(tab).append("disabled services:").println(); - for (ComponentName disabledService : mDisabledServices) { - String disabledServicePrefix = prefix + tab + tab; - pw.append(disabledServicePrefix).append("service:").println(); - pw.append(disabledServicePrefix).append(tab).append("componentName=") - .append(disabledService.flattenToString()); - pw.println(); - } + synchronized (mLock) { + pw.append(prefix).append(tab).append("installed services:").println(); + final int installedServiceCount = mInstalledServices.size(); + for (int i = 0; i < installedServiceCount; i++) { + PrintServiceInfo installedService = mInstalledServices.get(i); + String installedServicePrefix = prefix + tab + tab; + pw.append(installedServicePrefix).append("service:").println(); + ResolveInfo resolveInfo = installedService.getResolveInfo(); + ComponentName componentName = new ComponentName( + resolveInfo.serviceInfo.packageName, + resolveInfo.serviceInfo.name); + pw.append(installedServicePrefix).append(tab).append("componentName=") + .append(componentName.flattenToString()).println(); + pw.append(installedServicePrefix).append(tab).append("settingsActivity=") + .append(installedService.getSettingsActivityName()).println(); + pw.append(installedServicePrefix).append(tab).append("addPrintersActivity=") + .append(installedService.getAddPrintersActivityName()).println(); + pw.append(installedServicePrefix).append(tab).append("avancedOptionsActivity=") + .append(installedService.getAdvancedOptionsActivityName()).println(); + } + + pw.append(prefix).append(tab).append("disabled services:").println(); + for (ComponentName disabledService : mDisabledServices) { + String disabledServicePrefix = prefix + tab + tab; + pw.append(disabledServicePrefix).append("service:").println(); + pw.append(disabledServicePrefix).append(tab).append("componentName=") + .append(disabledService.flattenToString()); + pw.println(); + } - pw.append(prefix).append(tab).append("active services:").println(); - final int activeServiceCount = mActiveServices.size(); - for (int i = 0; i < activeServiceCount; i++) { - RemotePrintService activeService = mActiveServices.valueAt(i); - activeService.dump(pw, prefix + tab + tab); - pw.println(); - } + pw.append(prefix).append(tab).append("active services:").println(); + final int activeServiceCount = mActiveServices.size(); + for (int i = 0; i < activeServiceCount; i++) { + RemotePrintService activeService = mActiveServices.valueAt(i); + activeService.dump(pw, prefix + tab + tab); + pw.println(); + } - pw.append(prefix).append(tab).append("cached print jobs:").println(); - mPrintJobForAppCache.dump(pw, prefix + tab + tab); + pw.append(prefix).append(tab).append("cached print jobs:").println(); + mPrintJobForAppCache.dumpLocked(pw, prefix + tab + tab); - pw.append(prefix).append(tab).append("discovery mediator:").println(); - if (mPrinterDiscoverySession != null) { - mPrinterDiscoverySession.dump(pw, prefix + tab + tab); + pw.append(prefix).append(tab).append("discovery mediator:").println(); + if (mPrinterDiscoverySession != null) { + mPrinterDiscoverySession.dumpLocked(pw, prefix + tab + tab); + } } pw.append(prefix).append(tab).append("print spooler:").println(); @@ -1611,7 +1674,40 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } } - public void dump(PrintWriter pw, String prefix) { + public void dumpLocked(@NonNull ProtoOutputStream proto) { + proto.write(PrinterDiscoverySessionProto.IS_DESTROYED, mDestroyed); + proto.write(PrinterDiscoverySessionProto.IS_PRINTER_DISCOVERY_IN_PROGRESS, + !mStartedPrinterDiscoveryTokens.isEmpty()); + + final int observerCount = mDiscoveryObservers.beginBroadcast(); + for (int i = 0; i < observerCount; i++) { + IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); + proto.write(PrinterDiscoverySessionProto.PRINTER_DISCOVERY_OBSERVERS, + observer.toString()); + } + mDiscoveryObservers.finishBroadcast(); + + final int tokenCount = this.mStartedPrinterDiscoveryTokens.size(); + for (int i = 0; i < tokenCount; i++) { + IBinder token = mStartedPrinterDiscoveryTokens.get(i); + proto.write(PrinterDiscoverySessionProto.DISCOVERY_REQUESTS, token.toString()); + } + + final int trackedPrinters = mStateTrackedPrinters.size(); + for (int i = 0; i < trackedPrinters; i++) { + PrinterId printer = mStateTrackedPrinters.get(i); + writePrinterId(proto, PrinterDiscoverySessionProto.TRACKED_PRINTER_REQUESTS, + printer); + } + + final int printerCount = mPrinters.size(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = mPrinters.valueAt(i); + writePrinterInfo(mContext, proto, PrinterDiscoverySessionProto.PRINTER, printer); + } + } + + public void dumpLocked(PrintWriter pw, String prefix) { pw.append(prefix).append("destroyed=") .append(String.valueOf(mDestroyed)).println(); @@ -1989,19 +2085,36 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } } - public void dump(PrintWriter pw, String prefix) { - synchronized (mLock) { - String tab = " "; - final int bucketCount = mPrintJobsForRunningApp.size(); - for (int i = 0; i < bucketCount; i++) { - final int appId = mPrintJobsForRunningApp.keyAt(i); - pw.append(prefix).append("appId=" + appId).append(':').println(); - List<PrintJobInfo> bucket = mPrintJobsForRunningApp.valueAt(i); - final int printJobCount = bucket.size(); - for (int j = 0; j < printJobCount; j++) { - PrintJobInfo printJob = bucket.get(j); - pw.append(prefix).append(tab).append(printJob.toString()).println(); - } + public void dumpLocked(PrintWriter pw, String prefix) { + String tab = " "; + final int bucketCount = mPrintJobsForRunningApp.size(); + for (int i = 0; i < bucketCount; i++) { + final int appId = mPrintJobsForRunningApp.keyAt(i); + pw.append(prefix).append("appId=" + appId).append(':').println(); + List<PrintJobInfo> bucket = mPrintJobsForRunningApp.valueAt(i); + final int printJobCount = bucket.size(); + for (int j = 0; j < printJobCount; j++) { + PrintJobInfo printJob = bucket.get(j); + pw.append(prefix).append(tab).append(printJob.toString()).println(); + } + } + } + + public void dumpLocked(@NonNull ProtoOutputStream proto) { + final int bucketCount = mPrintJobsForRunningApp.size(); + for (int i = 0; i < bucketCount; i++) { + final int appId = mPrintJobsForRunningApp.keyAt(i); + List<PrintJobInfo> bucket = mPrintJobsForRunningApp.valueAt(i); + final int printJobCount = bucket.size(); + for (int j = 0; j < printJobCount; j++) { + long token = proto.start(PrintUserStateProto.CACHED_PRINT_JOBS); + + proto.write(CachedPrintJobProto.APP_ID, appId); + + writePrintJobInfo(mContext, proto, CachedPrintJobProto.PRINT_JOB, + bucket.get(j)); + + proto.end(token); } } } |