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