1c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann/*
2c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * Copyright (C) 2017 The Android Open Source Project
3c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann *
4c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * Licensed under the Apache License, Version 2.0 (the "License");
5c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * you may not use this file except in compliance with the License.
6c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * You may obtain a copy of the License at
7c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann *
8c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann *      http://www.apache.org/licenses/LICENSE-2.0
9c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann *
10c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * Unless required by applicable law or agreed to in writing, software
11c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * distributed under the License is distributed on an "AS IS" BASIS,
12c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * See the License for the specific language governing permissions and
14c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * limitations under the License.
15c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann */
16c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
17c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannpackage com.android.internal.print;
18c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
19371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport static com.android.internal.util.dump.DumpUtils.writeComponentName;
20371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann
21c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.annotation.NonNull;
22c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.content.Context;
23c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PageRange;
24c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PrintAttributes;
25c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PrintDocumentInfo;
26c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PrintJobId;
27c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PrintJobInfo;
28c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PrinterCapabilitiesInfo;
29c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PrinterId;
30c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.print.PrinterInfo;
31c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.MarginsProto;
32c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.MediaSizeProto;
33c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PageRangeProto;
34c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PrintAttributesProto;
35c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PrintDocumentInfoProto;
36c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PrintJobInfoProto;
37c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PrinterCapabilitiesProto;
38c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PrinterIdProto;
39c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.PrinterInfoProto;
40c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannimport android.service.print.ResolutionProto;
41c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
42371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmannimport com.android.internal.util.dump.DualDumpOutputStream;
43371a3b879ba82bbe5a4d914328a20659131d0220Philip P. Moltmann
44c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann/**
45c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann * Utilities for dumping print related proto buffer
46c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann */
47c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmannpublic class DumpUtils {
48c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
49c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrinterId} to a proto.
50c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
51c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
529a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
53c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
54c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param printerId The printer id to write
55c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
569a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writePrinterId(@NonNull DualDumpOutputStream proto, String idName, long id,
57c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann            @NonNull PrinterId printerId) {
589a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
599a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        writeComponentName(proto, "service_name", PrinterIdProto.SERVICE_NAME,
609a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                printerId.getServiceName());
619a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("local_id", PrinterIdProto.LOCAL_ID, printerId.getLocalId());
62c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
63c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
64c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
65c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
66c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrinterCapabilitiesInfo} to a proto.
67c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
68c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
699a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
70c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
71c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param cap The capabilities to write
72c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
73c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    public static void writePrinterCapabilities(@NonNull Context context,
749a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull DualDumpOutputStream proto, String idName, long id,
759a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull PrinterCapabilitiesInfo cap) {
769a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
779a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        writeMargins(proto, "min_margins", PrinterCapabilitiesProto.MIN_MARGINS,
789a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                cap.getMinMargins());
79c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
80c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        int numMediaSizes = cap.getMediaSizes().size();
81c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        for (int i = 0; i < numMediaSizes; i++) {
829a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writeMediaSize(context, proto, "media_sizes", PrinterCapabilitiesProto.MEDIA_SIZES,
83c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                    cap.getMediaSizes().get(i));
84c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
85c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
86c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        int numResolutions = cap.getResolutions().size();
87c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        for (int i = 0; i < numResolutions; i++) {
889a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writeResolution(proto, "resolutions", PrinterCapabilitiesProto.RESOLUTIONS,
89c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                    cap.getResolutions().get(i));
90c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
91c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
92c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if ((cap.getColorModes() & PrintAttributes.COLOR_MODE_MONOCHROME) != 0) {
939a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("color_modes", PrinterCapabilitiesProto.COLOR_MODES,
94c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                    PrintAttributesProto.COLOR_MODE_MONOCHROME);
95c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
96c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if ((cap.getColorModes() & PrintAttributes.COLOR_MODE_COLOR) != 0) {
979a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("color_modes", PrinterCapabilitiesProto.COLOR_MODES,
98c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                    PrintAttributesProto.COLOR_MODE_COLOR);
99c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
100c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
101c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if ((cap.getDuplexModes() & PrintAttributes.DUPLEX_MODE_NONE) != 0) {
1029a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("duplex_modes", PrinterCapabilitiesProto.DUPLEX_MODES,
103c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                    PrintAttributesProto.DUPLEX_MODE_NONE);
104c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
105c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if ((cap.getDuplexModes() & PrintAttributes.DUPLEX_MODE_LONG_EDGE) != 0) {
1069a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("duplex_modes", PrinterCapabilitiesProto.DUPLEX_MODES,
107c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                    PrintAttributesProto.DUPLEX_MODE_LONG_EDGE);
108c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
109c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if ((cap.getDuplexModes() & PrintAttributes.DUPLEX_MODE_SHORT_EDGE) != 0) {
1109a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("duplex_modes", PrinterCapabilitiesProto.DUPLEX_MODES,
111c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                    PrintAttributesProto.DUPLEX_MODE_SHORT_EDGE);
112c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
113c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
114c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
115c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
116c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
117c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
118c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrinterInfo} to a proto.
119c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
120c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param context The context used to resolve resources
121c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
1229a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
123c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
124c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param info The printer info to write
125c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
1269a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writePrinterInfo(@NonNull Context context,
1279a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull DualDumpOutputStream proto, String idName, long id,
1289a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull PrinterInfo info) {
1299a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
1309a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        writePrinterId(proto, "id", PrinterInfoProto.ID, info.getId());
1319a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("name", PrinterInfoProto.NAME, info.getName());
1329a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("status", PrinterInfoProto.STATUS, info.getStatus());
1339a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("description", PrinterInfoProto.DESCRIPTION, info.getDescription());
134c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
135c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrinterCapabilitiesInfo cap = info.getCapabilities();
136c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (cap != null) {
1379a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writePrinterCapabilities(context, proto, "capabilities", PrinterInfoProto.CAPABILITIES,
1389a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                    cap);
139c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
140c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
141c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
142c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
143c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
144c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
145c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrintAttributes.MediaSize} to a proto.
146c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
147c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param context The context used to resolve resources
148c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
1499a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
150c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
151c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param mediaSize The media size to write
152c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
1539a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writeMediaSize(@NonNull Context context, @NonNull DualDumpOutputStream proto,
1549a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            String idName, long id, @NonNull PrintAttributes.MediaSize mediaSize) {
1559a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
1569a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("id", MediaSizeProto.ID, mediaSize.getId());
1579a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("label", MediaSizeProto.LABEL, mediaSize.getLabel(context.getPackageManager()));
1589a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("height_mils", MediaSizeProto.HEIGHT_MILS, mediaSize.getHeightMils());
1599a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("width_mils", MediaSizeProto.WIDTH_MILS, mediaSize.getWidthMils());
160c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
161c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
162c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
163c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
164c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrintAttributes.Resolution} to a proto.
165c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
166c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
1679a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
168c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
169c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param res The resolution to write
170c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
1719a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writeResolution(@NonNull DualDumpOutputStream proto, String idName, long id,
172c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann            @NonNull PrintAttributes.Resolution res) {
1739a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
1749a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("id", ResolutionProto.ID, res.getId());
1759a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("label", ResolutionProto.LABEL, res.getLabel());
1769a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("horizontal_DPI", ResolutionProto.HORIZONTAL_DPI, res.getHorizontalDpi());
1779a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("veritical_DPI", ResolutionProto.VERTICAL_DPI, res.getVerticalDpi());
178c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
179c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
180c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
181c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
182c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrintAttributes.Margins} to a proto.
183c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
184c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
1859a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
186c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
187c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param margins The margins to write
188c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
1899a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writeMargins(@NonNull DualDumpOutputStream proto, String idName, long id,
190c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann            @NonNull PrintAttributes.Margins margins) {
1919a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
1929a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("top_mils", MarginsProto.TOP_MILS, margins.getTopMils());
1939a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("left_mils", MarginsProto.LEFT_MILS, margins.getLeftMils());
1949a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("right_mils", MarginsProto.RIGHT_MILS, margins.getRightMils());
1959a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("bottom_mils", MarginsProto.BOTTOM_MILS, margins.getBottomMils());
196c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
197c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
198c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
199c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
200c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrintAttributes} to a proto.
201c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
202c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param context The context used to resolve resources
203c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
2049a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
205c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
206c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param attributes The attributes to write
207c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
208c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    public static void writePrintAttributes(@NonNull Context context,
2099a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull DualDumpOutputStream proto, String idName, long id,
2109a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull PrintAttributes attributes) {
2119a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
212c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
213c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrintAttributes.MediaSize mediaSize = attributes.getMediaSize();
214c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (mediaSize != null) {
2159a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writeMediaSize(context, proto, "media_size", PrintAttributesProto.MEDIA_SIZE, mediaSize);
2162ec6657362523a409c91ce8a7ec0a316e33d8851Philip P. Moltmann            proto.write("is_portrait", PrintAttributesProto.IS_PORTRAIT, attributes.isPortrait());
217c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
218c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
219c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrintAttributes.Resolution res = attributes.getResolution();
220c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (res != null) {
2219a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writeResolution(proto, "resolution", PrintAttributesProto.RESOLUTION, res);
222c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
223c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
224c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrintAttributes.Margins minMargins = attributes.getMinMargins();
225c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (minMargins != null) {
2269a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writeMargins(proto, "min_margings", PrintAttributesProto.MIN_MARGINS, minMargins);
227c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
228c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
2299a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("color_mode", PrintAttributesProto.COLOR_MODE, attributes.getColorMode());
2309a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("duplex_mode", PrintAttributesProto.DUPLEX_MODE, attributes.getDuplexMode());
231c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
232c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
233c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
234c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
235c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrintDocumentInfo} to a proto.
236c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
237c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
2389a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
239c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
240c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param info The info to write
241c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
2429a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writePrintDocumentInfo(@NonNull DualDumpOutputStream proto, String idName,
2439a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            long id, @NonNull PrintDocumentInfo info) {
2449a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
2459a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("name", PrintDocumentInfoProto.NAME, info.getName());
246c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
247c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        int pageCount = info.getPageCount();
248c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (pageCount != PrintDocumentInfo.PAGE_COUNT_UNKNOWN) {
2499a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("page_count", PrintDocumentInfoProto.PAGE_COUNT, pageCount);
250c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
251c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
2529a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("content_type", PrintDocumentInfoProto.CONTENT_TYPE, info.getContentType());
2539a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("data_size", PrintDocumentInfoProto.DATA_SIZE, info.getDataSize());
254c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
255c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
256c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
257c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
258c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PageRange} to a proto.
259c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
260c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
2619a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
262c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
263c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param range The range to write
264c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
2659a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writePageRange(@NonNull DualDumpOutputStream proto, String idName, long id,
266c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann            @NonNull PageRange range) {
2679a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
2689a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("start", PageRangeProto.START, range.getStart());
2699a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("end", PageRangeProto.END, range.getEnd());
270c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
271c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
272c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
273c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    /**
274c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * Write a {@link PrintJobInfo} to a proto.
275c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     *
276c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param context The context used to resolve resources
277c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param proto The proto to write to
2789a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann     * @param idName Clear text name of the proto-id
279c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param id The proto-id of the component name
280c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     * @param printJobInfo The print job info to write
281c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann     */
2829a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann    public static void writePrintJobInfo(@NonNull Context context,
2839a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull DualDumpOutputStream proto, String idName, long id,
2849a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            @NonNull PrintJobInfo printJobInfo) {
2859a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        long token = proto.start(idName, id);
2869a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("label", PrintJobInfoProto.LABEL, printJobInfo.getLabel());
287c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
288c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrintJobId printJobId = printJobInfo.getId();
289c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (printJobId != null) {
2909a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("print_job_id", PrintJobInfoProto.PRINT_JOB_ID,
2919a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                    printJobId.flattenToString());
292c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
293c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
294c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        int state = printJobInfo.getState();
295c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (state >= PrintJobInfoProto.STATE_CREATED && state <= PrintJobInfoProto.STATE_CANCELED) {
2969a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("state", PrintJobInfoProto.STATE, state);
297c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        } else {
2989a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("state", PrintJobInfoProto.STATE, PrintJobInfoProto.STATE_UNKNOWN);
299c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
300c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
301c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrinterId printer = printJobInfo.getPrinterId();
302c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (printer != null) {
3039a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writePrinterId(proto, "printer", PrintJobInfoProto.PRINTER, printer);
304c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
305c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
306c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        String tag = printJobInfo.getTag();
307c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (tag != null) {
3089a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("tag", PrintJobInfoProto.TAG, tag);
309c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
310c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
3119a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("creation_time", PrintJobInfoProto.CREATION_TIME,
3129a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                printJobInfo.getCreationTime());
313c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
314c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrintAttributes attributes = printJobInfo.getAttributes();
315c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (attributes != null) {
3169a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writePrintAttributes(context, proto, "attributes", PrintJobInfoProto.ATTRIBUTES,
3179a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                    attributes);
318c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
319c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
320c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PrintDocumentInfo docInfo = printJobInfo.getDocumentInfo();
321c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (docInfo != null) {
3229a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            writePrintDocumentInfo(proto, "document_info", PrintJobInfoProto.DOCUMENT_INFO,
3239a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                    docInfo);
324c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
325c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
3269a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("is_canceling", PrintJobInfoProto.IS_CANCELING, printJobInfo.isCancelling());
327c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
328c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        PageRange[] pages = printJobInfo.getPages();
329c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (pages != null) {
330c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann            for (int i = 0; i < pages.length; i++) {
3319a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann                writePageRange(proto, "pages", PrintJobInfoProto.PAGES, pages[i]);
332c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann            }
333c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
334c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
3359a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("has_advanced_options", PrintJobInfoProto.HAS_ADVANCED_OPTIONS,
336c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann                printJobInfo.getAdvancedOptions() != null);
3379a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann        proto.write("progress", PrintJobInfoProto.PROGRESS, printJobInfo.getProgress());
338c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
339c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        CharSequence status = printJobInfo.getStatus(context.getPackageManager());
340c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        if (status != null) {
3419a534c01ecd4a1442856c1b709e23b61f1baf9baPhilip P. Moltmann            proto.write("status", PrintJobInfoProto.STATUS, status.toString());
342c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        }
343c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann
344c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann        proto.end(token);
345c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann    }
346c0a128dc2b3e7af35cb39d5157ca4de9147aa3c8Philip P. Moltmann}
347