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