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
18fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLeanimport android.hardware.usb.UsbDeviceConnection;
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
27fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    private final UsbDeviceConnection mConnection;
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     */
34fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public ReportCanvas(UsbDeviceConnection connection) {
35fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        mConnection = connection;
36fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
37fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
38fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
39fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @returns the UsbDeviceConnection member (mConnection).
40fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
41fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public UsbDeviceConnection getConnection() {
42fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return mConnection;
43fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
44fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
45fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
46fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a plain string to the output.
47fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
48fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void write(String text);
49fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
50fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
51fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a "header" formatted section in the output.
52fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param level Specifies the logical level of the header.
53fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
54fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openHeader(int level);
55fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
56fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
57fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a "header" formatted section in the output.
58fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param level Specifies the logical level of the header.
59fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
60fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeHeader(int level);
61fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
62fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
63fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a "header" formatted string to the output.
64fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param level Specifies the logical level of the header.
65fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param text  Specifies the text to display in the header.
66fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
67fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void writeHeader(int level, String text) {
68fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        openHeader(level);
69fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        write(text);
70fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        closeHeader(level);
71fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
72fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
73fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
74fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a paragraph construct in the output.
75fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param emphasis Specifies whether the text in the paragraph should
76fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * be displayed with "emphasis" formatting.
77fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
78fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openParagraph(boolean emphasis);
79fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
80fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
81fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a paragraph construct in the output.
82fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
83fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeParagraph();
84fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
85fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
86fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a paragraph construct to the output.
87fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param text  The text to display with "paragraph" formatting.
88fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param emphasis Specifies whether the text in the paragraph should
89fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * be displayed with "emphasis" formatting.
90fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
91fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void writeParagraph(String text, boolean emphasis);
92fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
93fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
94fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a "list" formatted section in the output.
95fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
96fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openList();
97fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
98fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
99fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a "list" formatted section in the output.
100fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
101fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeList();
102fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
103fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
104fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Opens a "list item" formatted section in the output.
105fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
106fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void openListItem();
107fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
108fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
109fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Closes a "list item" formatted section in the output.
110fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
111fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public abstract void closeListItem();
112fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
113fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
114fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes a "list item" formatted section in the output.
115fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param text  Specifies the text of the list item.
116fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
117fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void writeListItem(String text) {
118fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        openListItem();
119fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        write(text);
120fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        closeListItem();
121fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
122fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
123fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /*
124fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Data Formating Helpers
125fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
126fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
127fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Generates a hex representation of the specified byte value.
128fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param value The value to format.
129fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
130fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    //TODO Look into renaming the "getHexString()" functions to be more
131fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    // representative of the types they handle.
132fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public static String getHexString(byte value) {
133fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return "0x" + Integer.toHexString(((int) value) & 0xFF).toUpperCase();
134fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
135fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
136fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
137fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Generates a string representing a USB Binary-Coded Decimal value.
138fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param valueBCD The value to format.
139fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
140fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public static String getBCDString(int valueBCD) {
141fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int major = (valueBCD >> 8) & 0x0F;
142fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int minor = (valueBCD >> 4) & 0x0F;
143fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int subminor = valueBCD & 0x0F;
144fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
145fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return "" + major + "." + minor + subminor;
146fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
147fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
148fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
149fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Generates a hex representation of the specified 16-bit integer value.
150fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param value The value to format.
151fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
152fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    //TODO Look into renaming the "getHexString()" functions to be more
153fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    // representative of the types they handle.
154fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public static String getHexString(int value) {
155fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        int intValue = value & 0xFFFF;
156fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        return "0x" + Integer.toHexString(intValue).toUpperCase();
157fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
158fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean
159fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    /**
160fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * Writes out the specified byte array to the provided StringBuilder.
161fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param rawData   The byte values.
162fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     * @param builder The StringBuilder to write text into.
163fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean     */
164fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    public void dumpHexArray(byte[] rawData, StringBuilder builder) {
165fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        if (rawData != null) {
166fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            // Assume the type and Length and perhaps sub-type have been displayed
167fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            openParagraph(false);
168fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            for (int index = 0; index < rawData.length; index++) {
169fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean                builder.append(getHexString(rawData[index]) + " ");
170fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            }
171fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean            closeParagraph();
172fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean        }
173fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean    }
174fd7cb85feff517f3cc94384102933aa4485e1fc5Paul McLean}
175