1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.internal.print; 18 19 import static com.android.internal.util.dump.DumpUtils.writeComponentName; 20 21 import android.annotation.NonNull; 22 import android.content.Context; 23 import android.print.PageRange; 24 import android.print.PrintAttributes; 25 import android.print.PrintDocumentInfo; 26 import android.print.PrintJobId; 27 import android.print.PrintJobInfo; 28 import android.print.PrinterCapabilitiesInfo; 29 import android.print.PrinterId; 30 import android.print.PrinterInfo; 31 import android.service.print.MarginsProto; 32 import android.service.print.MediaSizeProto; 33 import android.service.print.PageRangeProto; 34 import android.service.print.PrintAttributesProto; 35 import android.service.print.PrintDocumentInfoProto; 36 import android.service.print.PrintJobInfoProto; 37 import android.service.print.PrinterCapabilitiesProto; 38 import android.service.print.PrinterIdProto; 39 import android.service.print.PrinterInfoProto; 40 import android.service.print.ResolutionProto; 41 42 import com.android.internal.util.dump.DualDumpOutputStream; 43 44 /** 45 * Utilities for dumping print related proto buffer 46 */ 47 public class DumpUtils { 48 /** 49 * Write a {@link PrinterId} to a proto. 50 * 51 * @param proto The proto to write to 52 * @param idName Clear text name of the proto-id 53 * @param id The proto-id of the component name 54 * @param printerId The printer id to write 55 */ writePrinterId(@onNull DualDumpOutputStream proto, String idName, long id, @NonNull PrinterId printerId)56 public static void writePrinterId(@NonNull DualDumpOutputStream proto, String idName, long id, 57 @NonNull PrinterId printerId) { 58 long token = proto.start(idName, id); 59 writeComponentName(proto, "service_name", PrinterIdProto.SERVICE_NAME, 60 printerId.getServiceName()); 61 proto.write("local_id", PrinterIdProto.LOCAL_ID, printerId.getLocalId()); 62 proto.end(token); 63 } 64 65 /** 66 * Write a {@link PrinterCapabilitiesInfo} to a proto. 67 * 68 * @param proto The proto to write to 69 * @param idName Clear text name of the proto-id 70 * @param id The proto-id of the component name 71 * @param cap The capabilities to write 72 */ writePrinterCapabilities(@onNull Context context, @NonNull DualDumpOutputStream proto, String idName, long id, @NonNull PrinterCapabilitiesInfo cap)73 public static void writePrinterCapabilities(@NonNull Context context, 74 @NonNull DualDumpOutputStream proto, String idName, long id, 75 @NonNull PrinterCapabilitiesInfo cap) { 76 long token = proto.start(idName, id); 77 writeMargins(proto, "min_margins", PrinterCapabilitiesProto.MIN_MARGINS, 78 cap.getMinMargins()); 79 80 int numMediaSizes = cap.getMediaSizes().size(); 81 for (int i = 0; i < numMediaSizes; i++) { 82 writeMediaSize(context, proto, "media_sizes", PrinterCapabilitiesProto.MEDIA_SIZES, 83 cap.getMediaSizes().get(i)); 84 } 85 86 int numResolutions = cap.getResolutions().size(); 87 for (int i = 0; i < numResolutions; i++) { 88 writeResolution(proto, "resolutions", PrinterCapabilitiesProto.RESOLUTIONS, 89 cap.getResolutions().get(i)); 90 } 91 92 if ((cap.getColorModes() & PrintAttributes.COLOR_MODE_MONOCHROME) != 0) { 93 proto.write("color_modes", PrinterCapabilitiesProto.COLOR_MODES, 94 PrintAttributesProto.COLOR_MODE_MONOCHROME); 95 } 96 if ((cap.getColorModes() & PrintAttributes.COLOR_MODE_COLOR) != 0) { 97 proto.write("color_modes", PrinterCapabilitiesProto.COLOR_MODES, 98 PrintAttributesProto.COLOR_MODE_COLOR); 99 } 100 101 if ((cap.getDuplexModes() & PrintAttributes.DUPLEX_MODE_NONE) != 0) { 102 proto.write("duplex_modes", PrinterCapabilitiesProto.DUPLEX_MODES, 103 PrintAttributesProto.DUPLEX_MODE_NONE); 104 } 105 if ((cap.getDuplexModes() & PrintAttributes.DUPLEX_MODE_LONG_EDGE) != 0) { 106 proto.write("duplex_modes", PrinterCapabilitiesProto.DUPLEX_MODES, 107 PrintAttributesProto.DUPLEX_MODE_LONG_EDGE); 108 } 109 if ((cap.getDuplexModes() & PrintAttributes.DUPLEX_MODE_SHORT_EDGE) != 0) { 110 proto.write("duplex_modes", PrinterCapabilitiesProto.DUPLEX_MODES, 111 PrintAttributesProto.DUPLEX_MODE_SHORT_EDGE); 112 } 113 114 proto.end(token); 115 } 116 117 /** 118 * Write a {@link PrinterInfo} to a proto. 119 * 120 * @param context The context used to resolve resources 121 * @param proto The proto to write to 122 * @param idName Clear text name of the proto-id 123 * @param id The proto-id of the component name 124 * @param info The printer info to write 125 */ writePrinterInfo(@onNull Context context, @NonNull DualDumpOutputStream proto, String idName, long id, @NonNull PrinterInfo info)126 public static void writePrinterInfo(@NonNull Context context, 127 @NonNull DualDumpOutputStream proto, String idName, long id, 128 @NonNull PrinterInfo info) { 129 long token = proto.start(idName, id); 130 writePrinterId(proto, "id", PrinterInfoProto.ID, info.getId()); 131 proto.write("name", PrinterInfoProto.NAME, info.getName()); 132 proto.write("status", PrinterInfoProto.STATUS, info.getStatus()); 133 proto.write("description", PrinterInfoProto.DESCRIPTION, info.getDescription()); 134 135 PrinterCapabilitiesInfo cap = info.getCapabilities(); 136 if (cap != null) { 137 writePrinterCapabilities(context, proto, "capabilities", PrinterInfoProto.CAPABILITIES, 138 cap); 139 } 140 141 proto.end(token); 142 } 143 144 /** 145 * Write a {@link PrintAttributes.MediaSize} to a proto. 146 * 147 * @param context The context used to resolve resources 148 * @param proto The proto to write to 149 * @param idName Clear text name of the proto-id 150 * @param id The proto-id of the component name 151 * @param mediaSize The media size to write 152 */ writeMediaSize(@onNull Context context, @NonNull DualDumpOutputStream proto, String idName, long id, @NonNull PrintAttributes.MediaSize mediaSize)153 public static void writeMediaSize(@NonNull Context context, @NonNull DualDumpOutputStream proto, 154 String idName, long id, @NonNull PrintAttributes.MediaSize mediaSize) { 155 long token = proto.start(idName, id); 156 proto.write("id", MediaSizeProto.ID, mediaSize.getId()); 157 proto.write("label", MediaSizeProto.LABEL, mediaSize.getLabel(context.getPackageManager())); 158 proto.write("height_mils", MediaSizeProto.HEIGHT_MILS, mediaSize.getHeightMils()); 159 proto.write("width_mils", MediaSizeProto.WIDTH_MILS, mediaSize.getWidthMils()); 160 proto.end(token); 161 } 162 163 /** 164 * Write a {@link PrintAttributes.Resolution} to a proto. 165 * 166 * @param proto The proto to write to 167 * @param idName Clear text name of the proto-id 168 * @param id The proto-id of the component name 169 * @param res The resolution to write 170 */ writeResolution(@onNull DualDumpOutputStream proto, String idName, long id, @NonNull PrintAttributes.Resolution res)171 public static void writeResolution(@NonNull DualDumpOutputStream proto, String idName, long id, 172 @NonNull PrintAttributes.Resolution res) { 173 long token = proto.start(idName, id); 174 proto.write("id", ResolutionProto.ID, res.getId()); 175 proto.write("label", ResolutionProto.LABEL, res.getLabel()); 176 proto.write("horizontal_DPI", ResolutionProto.HORIZONTAL_DPI, res.getHorizontalDpi()); 177 proto.write("veritical_DPI", ResolutionProto.VERTICAL_DPI, res.getVerticalDpi()); 178 proto.end(token); 179 } 180 181 /** 182 * Write a {@link PrintAttributes.Margins} to a proto. 183 * 184 * @param proto The proto to write to 185 * @param idName Clear text name of the proto-id 186 * @param id The proto-id of the component name 187 * @param margins The margins to write 188 */ writeMargins(@onNull DualDumpOutputStream proto, String idName, long id, @NonNull PrintAttributes.Margins margins)189 public static void writeMargins(@NonNull DualDumpOutputStream proto, String idName, long id, 190 @NonNull PrintAttributes.Margins margins) { 191 long token = proto.start(idName, id); 192 proto.write("top_mils", MarginsProto.TOP_MILS, margins.getTopMils()); 193 proto.write("left_mils", MarginsProto.LEFT_MILS, margins.getLeftMils()); 194 proto.write("right_mils", MarginsProto.RIGHT_MILS, margins.getRightMils()); 195 proto.write("bottom_mils", MarginsProto.BOTTOM_MILS, margins.getBottomMils()); 196 proto.end(token); 197 } 198 199 /** 200 * Write a {@link PrintAttributes} to a proto. 201 * 202 * @param context The context used to resolve resources 203 * @param proto The proto to write to 204 * @param idName Clear text name of the proto-id 205 * @param id The proto-id of the component name 206 * @param attributes The attributes to write 207 */ writePrintAttributes(@onNull Context context, @NonNull DualDumpOutputStream proto, String idName, long id, @NonNull PrintAttributes attributes)208 public static void writePrintAttributes(@NonNull Context context, 209 @NonNull DualDumpOutputStream proto, String idName, long id, 210 @NonNull PrintAttributes attributes) { 211 long token = proto.start(idName, id); 212 213 PrintAttributes.MediaSize mediaSize = attributes.getMediaSize(); 214 if (mediaSize != null) { 215 writeMediaSize(context, proto, "media_size", PrintAttributesProto.MEDIA_SIZE, mediaSize); 216 proto.write("is_portrait", PrintAttributesProto.IS_PORTRAIT, attributes.isPortrait()); 217 } 218 219 PrintAttributes.Resolution res = attributes.getResolution(); 220 if (res != null) { 221 writeResolution(proto, "resolution", PrintAttributesProto.RESOLUTION, res); 222 } 223 224 PrintAttributes.Margins minMargins = attributes.getMinMargins(); 225 if (minMargins != null) { 226 writeMargins(proto, "min_margings", PrintAttributesProto.MIN_MARGINS, minMargins); 227 } 228 229 proto.write("color_mode", PrintAttributesProto.COLOR_MODE, attributes.getColorMode()); 230 proto.write("duplex_mode", PrintAttributesProto.DUPLEX_MODE, attributes.getDuplexMode()); 231 proto.end(token); 232 } 233 234 /** 235 * Write a {@link PrintDocumentInfo} to a proto. 236 * 237 * @param proto The proto to write to 238 * @param idName Clear text name of the proto-id 239 * @param id The proto-id of the component name 240 * @param info The info to write 241 */ writePrintDocumentInfo(@onNull DualDumpOutputStream proto, String idName, long id, @NonNull PrintDocumentInfo info)242 public static void writePrintDocumentInfo(@NonNull DualDumpOutputStream proto, String idName, 243 long id, @NonNull PrintDocumentInfo info) { 244 long token = proto.start(idName, id); 245 proto.write("name", PrintDocumentInfoProto.NAME, info.getName()); 246 247 int pageCount = info.getPageCount(); 248 if (pageCount != PrintDocumentInfo.PAGE_COUNT_UNKNOWN) { 249 proto.write("page_count", PrintDocumentInfoProto.PAGE_COUNT, pageCount); 250 } 251 252 proto.write("content_type", PrintDocumentInfoProto.CONTENT_TYPE, info.getContentType()); 253 proto.write("data_size", PrintDocumentInfoProto.DATA_SIZE, info.getDataSize()); 254 proto.end(token); 255 } 256 257 /** 258 * Write a {@link PageRange} to a proto. 259 * 260 * @param proto The proto to write to 261 * @param idName Clear text name of the proto-id 262 * @param id The proto-id of the component name 263 * @param range The range to write 264 */ writePageRange(@onNull DualDumpOutputStream proto, String idName, long id, @NonNull PageRange range)265 public static void writePageRange(@NonNull DualDumpOutputStream proto, String idName, long id, 266 @NonNull PageRange range) { 267 long token = proto.start(idName, id); 268 proto.write("start", PageRangeProto.START, range.getStart()); 269 proto.write("end", PageRangeProto.END, range.getEnd()); 270 proto.end(token); 271 } 272 273 /** 274 * Write a {@link PrintJobInfo} to a proto. 275 * 276 * @param context The context used to resolve resources 277 * @param proto The proto to write to 278 * @param idName Clear text name of the proto-id 279 * @param id The proto-id of the component name 280 * @param printJobInfo The print job info to write 281 */ writePrintJobInfo(@onNull Context context, @NonNull DualDumpOutputStream proto, String idName, long id, @NonNull PrintJobInfo printJobInfo)282 public static void writePrintJobInfo(@NonNull Context context, 283 @NonNull DualDumpOutputStream proto, String idName, long id, 284 @NonNull PrintJobInfo printJobInfo) { 285 long token = proto.start(idName, id); 286 proto.write("label", PrintJobInfoProto.LABEL, printJobInfo.getLabel()); 287 288 PrintJobId printJobId = printJobInfo.getId(); 289 if (printJobId != null) { 290 proto.write("print_job_id", PrintJobInfoProto.PRINT_JOB_ID, 291 printJobId.flattenToString()); 292 } 293 294 int state = printJobInfo.getState(); 295 if (state >= PrintJobInfoProto.STATE_CREATED && state <= PrintJobInfoProto.STATE_CANCELED) { 296 proto.write("state", PrintJobInfoProto.STATE, state); 297 } else { 298 proto.write("state", PrintJobInfoProto.STATE, PrintJobInfoProto.STATE_UNKNOWN); 299 } 300 301 PrinterId printer = printJobInfo.getPrinterId(); 302 if (printer != null) { 303 writePrinterId(proto, "printer", PrintJobInfoProto.PRINTER, printer); 304 } 305 306 String tag = printJobInfo.getTag(); 307 if (tag != null) { 308 proto.write("tag", PrintJobInfoProto.TAG, tag); 309 } 310 311 proto.write("creation_time", PrintJobInfoProto.CREATION_TIME, 312 printJobInfo.getCreationTime()); 313 314 PrintAttributes attributes = printJobInfo.getAttributes(); 315 if (attributes != null) { 316 writePrintAttributes(context, proto, "attributes", PrintJobInfoProto.ATTRIBUTES, 317 attributes); 318 } 319 320 PrintDocumentInfo docInfo = printJobInfo.getDocumentInfo(); 321 if (docInfo != null) { 322 writePrintDocumentInfo(proto, "document_info", PrintJobInfoProto.DOCUMENT_INFO, 323 docInfo); 324 } 325 326 proto.write("is_canceling", PrintJobInfoProto.IS_CANCELING, printJobInfo.isCancelling()); 327 328 PageRange[] pages = printJobInfo.getPages(); 329 if (pages != null) { 330 for (int i = 0; i < pages.length; i++) { 331 writePageRange(proto, "pages", PrintJobInfoProto.PAGES, pages[i]); 332 } 333 } 334 335 proto.write("has_advanced_options", PrintJobInfoProto.HAS_ADVANCED_OPTIONS, 336 printJobInfo.getAdvancedOptions() != null); 337 proto.write("progress", PrintJobInfoProto.PROGRESS, printJobInfo.getProgress()); 338 339 CharSequence status = printJobInfo.getStatus(context.getPackageManager()); 340 if (status != null) { 341 proto.write("status", PrintJobInfoProto.STATUS, status.toString()); 342 } 343 344 proto.end(token); 345 } 346 } 347