1fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean/*
2fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Copyright (C) 2017 The Android Open Source Project
3fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *
4fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Licensed under the Apache License, Version 2.0 (the "License");
5fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * you may not use this file except in compliance with the License.
6fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * You may obtain a copy of the License at
7fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *
8fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *      http://www.apache.org/licenses/LICENSE-2.0
9fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean *
10fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Unless required by applicable law or agreed to in writing, software
11fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * distributed under the License is distributed on an "AS IS" BASIS,
12fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * See the License for the specific language governing permissions and
14fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * limitations under the License.
15fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean */
16fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanpackage com.android.server.usb.descriptors.report;
17fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
189d84fee2eaa54b6e229d165e380c35ccc559de72Paul Mcleanimport com.android.server.usb.descriptors.UsbDescriptorParser;
19fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
20fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean/**
21fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * @hide
22fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean * Defines a class for generating report data in a variety of potential formats.
23fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean */
24fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanpublic abstract class ReportCanvas {
25fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private static final String TAG = "ReportCanvas";
26fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
279d84fee2eaa54b6e229d165e380c35ccc559de72Paul Mclean    private final UsbDescriptorParser mParser;
28fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
29fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
30fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Constructor.
31fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param connection    The USB connection object used to retrieve strings
32fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * from the USB device.
33fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
349d84fee2eaa54b6e229d165e380c35ccc559de72Paul Mclean    public ReportCanvas(UsbDescriptorParser parser) {
359d84fee2eaa54b6e229d165e380c35ccc559de72Paul Mclean        mParser = parser;
36fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
37fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
389d84fee2eaa54b6e229d165e380c35ccc559de72Paul Mclean    public UsbDescriptorParser getParser() {
399d84fee2eaa54b6e229d165e380c35ccc559de72Paul Mclean        return mParser;
40fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
41fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
42fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
43fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a plain string to the output.
44fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
45fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void write(String text);
46fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
47fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
48fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a "header" formatted section in the output.
49fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param level Specifies the logical level of the header.
50fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
51fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openHeader(int level);
52fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
53fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
54fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a "header" formatted section in the output.
55fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param level Specifies the logical level of the header.
56fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
57fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeHeader(int level);
58fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
59fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
60fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a "header" formatted string to the output.
61fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param level Specifies the logical level of the header.
62fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param text  Specifies the text to display in the header.
63fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
64fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void writeHeader(int level, String text) {
65fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        openHeader(level);
66fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        write(text);
67fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        closeHeader(level);
68fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
69fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
70fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
71fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a paragraph construct in the output.
72fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param emphasis Specifies whether the text in the paragraph should
73fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * be displayed with "emphasis" formatting.
74fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
75fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openParagraph(boolean emphasis);
76fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
77fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
78fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a paragraph construct in the output.
79fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
80fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeParagraph();
81fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
82fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
83fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a paragraph construct to the output.
84fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param text  The text to display with "paragraph" formatting.
85fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param emphasis Specifies whether the text in the paragraph should
86fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * be displayed with "emphasis" formatting.
87fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
88fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void writeParagraph(String text, boolean emphasis);
89fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
90fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
91fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a "list" formatted section in the output.
92fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
93fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openList();
94fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
95fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
96fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a "list" formatted section in the output.
97fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
98fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeList();
99fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
100fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
101fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a "list item" formatted section in the output.
102fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
103fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openListItem();
104fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
105fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
106fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a "list item" formatted section in the output.
107fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
108fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeListItem();
109fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
110fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
111fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a "list item" formatted section in the output.
112fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param text  Specifies the text of the list item.
113fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
114fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void writeListItem(String text) {
115fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        openListItem();
116fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        write(text);
117fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        closeListItem();
118fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
119fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
120fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /*
121fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Data Formating Helpers
122fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
123fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
124fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Generates a hex representation of the specified byte value.
125fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param value The value to format.
126fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
127fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    //TODO Look into renaming the "getHexString()" functions to be more
128fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    // representative of the types they handle.
129fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public static String getHexString(byte value) {
130fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return "0x" + Integer.toHexString(((int) value) & 0xFF).toUpperCase();
131fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
132fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
133fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
134fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Generates a string representing a USB Binary-Coded Decimal value.
135fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param valueBCD The value to format.
136fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
137fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public static String getBCDString(int valueBCD) {
138fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int major = (valueBCD >> 8) & 0x0F;
139fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int minor = (valueBCD >> 4) & 0x0F;
140fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int subminor = valueBCD & 0x0F;
141fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
142fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return "" + major + "." + minor + subminor;
143fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
144fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
145fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
146fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Generates a hex representation of the specified 16-bit integer value.
147fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param value The value to format.
148fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
149fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    //TODO Look into renaming the "getHexString()" functions to be more
150fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    // representative of the types they handle.
151fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public static String getHexString(int value) {
152fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int intValue = value & 0xFFFF;
153fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return "0x" + Integer.toHexString(intValue).toUpperCase();
154fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
155fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
156fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
157fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes out the specified byte array to the provided StringBuilder.
158fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param rawData   The byte values.
159fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param builder The StringBuilder to write text into.
160fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
161fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void dumpHexArray(byte[] rawData, StringBuilder builder) {
162fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        if (rawData != null) {
163fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            // Assume the type and Length and perhaps sub-type have been displayed
164fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            openParagraph(false);
165fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            for (int index = 0; index < rawData.length; index++) {
166fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                builder.append(getHexString(rawData[index]) + " ");
167fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            }
168fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            closeParagraph();
169fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        }
170fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
171fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean}
172