Console.java revision f7bca430d9356c26d6df222d2c90bc7668262f6b
1303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung/* 2303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Copyright (C) 2014 The Android Open Source Project 3303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * 4303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 5303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * you may not use this file except in compliance with the License. 6303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * You may obtain a copy of the License at 7303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * 8303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * http://www.apache.org/licenses/LICENSE-2.0 9303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * 10303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * Unless required by applicable law or agreed to in writing, software 11303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * distributed under the License is distributed on an "AS IS" BASIS, 12303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * See the License for the specific language governing permissions and 14303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung * limitations under the License. 15303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung */ 16303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 17303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpackage com.android.systemui.recents; 18303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 19303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 204d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chungimport android.content.ComponentCallbacks2; 21303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.content.Context; 22303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.util.Log; 23303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.view.MotionEvent; 24303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungimport android.widget.Toast; 25303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 26bd91297e895410bb27df3e930be5d9eab30129afWinson Chungimport java.util.HashMap; 27bd91297e895410bb27df3e930be5d9eab30129afWinson Chungimport java.util.Map; 28bd91297e895410bb27df3e930be5d9eab30129afWinson Chung 29bd91297e895410bb27df3e930be5d9eab30129afWinson Chung 30303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chungpublic class Console { 31bd91297e895410bb27df3e930be5d9eab30129afWinson Chung // Timer 32bd91297e895410bb27df3e930be5d9eab30129afWinson Chung public static final Map<Object, Long> mTimeLogs = new HashMap<Object, Long>(); 33bd91297e895410bb27df3e930be5d9eab30129afWinson Chung 34303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung // Colors 35303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiReset = "\u001B[0m"; 36303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiBlack = "\u001B[30m"; 37303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiRed = "\u001B[31m"; // SystemUIHandshake 38303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiGreen = "\u001B[32m"; // MeasureAndLayout 39303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiYellow = "\u001B[33m"; // SynchronizeViewsWithModel 40f7bca430d9356c26d6df222d2c90bc7668262f6bWinson Chung public static final String AnsiBlue = "\u001B[34m"; // TouchEvents, Search 41303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiPurple = "\u001B[35m"; // Draw 42303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiCyan = "\u001B[36m"; // ClickEvents 43303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static final String AnsiWhite = "\u001B[37m"; 44303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 45303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a key */ 46303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(String key) { 474d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(true, key, "", AnsiReset); 48303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 49303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 50303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a conditioned key */ 51303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(boolean condition, String key) { 52303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 534d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(condition, key, "", AnsiReset); 54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 55303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 56303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 57303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a key in a specific color */ 58303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(boolean condition, String key, Object data) { 59303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 604d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(condition, key, data, AnsiReset); 61303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 62303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 63303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 64303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a key with data in a specific color */ 65303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(boolean condition, String key, Object data, String color) { 66303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 67303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung System.out.println(color + key + AnsiReset + " " + data.toString()); 68303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 69303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 70303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 71303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs an error */ 72303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void logError(Context context, String msg) { 73303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 74303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Log.e("Recents", msg); 75303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 76303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 777048fea75c06324a748d49f25bc05be908cda9ffWinson Chung /** Logs a raw error */ 787048fea75c06324a748d49f25bc05be908cda9ffWinson Chung public static void logRawError(String msg, Exception e) { 797048fea75c06324a748d49f25bc05be908cda9ffWinson Chung Log.e("Recents", msg, e); 807048fea75c06324a748d49f25bc05be908cda9ffWinson Chung } 817048fea75c06324a748d49f25bc05be908cda9ffWinson Chung 82303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a divider bar */ 83303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void logDivider(boolean condition) { 84303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 85303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung System.out.println("==== [" + System.currentTimeMillis() + 86303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung "] ============================================================"); 87303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 88303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 89303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 90bd91297e895410bb27df3e930be5d9eab30129afWinson Chung /** Starts a time trace */ 91bd91297e895410bb27df3e930be5d9eab30129afWinson Chung public static void logStartTracingTime(boolean condition, String key) { 92bd91297e895410bb27df3e930be5d9eab30129afWinson Chung if (condition) { 93bd91297e895410bb27df3e930be5d9eab30129afWinson Chung long curTime = System.currentTimeMillis(); 94bd91297e895410bb27df3e930be5d9eab30129afWinson Chung mTimeLogs.put(key, curTime); 95bd91297e895410bb27df3e930be5d9eab30129afWinson Chung Console.log(condition, "[Recents|" + key + "]", 96bd91297e895410bb27df3e930be5d9eab30129afWinson Chung "started @ " + curTime); 97bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 98bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 99bd91297e895410bb27df3e930be5d9eab30129afWinson Chung 100bd91297e895410bb27df3e930be5d9eab30129afWinson Chung /** Continues a time trace */ 101bd91297e895410bb27df3e930be5d9eab30129afWinson Chung public static void logTraceTime(boolean condition, String key, String desc) { 102bd91297e895410bb27df3e930be5d9eab30129afWinson Chung if (condition) { 103bd91297e895410bb27df3e930be5d9eab30129afWinson Chung long timeDiff = System.currentTimeMillis() - mTimeLogs.get(key); 104bd91297e895410bb27df3e930be5d9eab30129afWinson Chung Console.log(condition, "[Recents|" + key + "|" + desc + "]", 105bd91297e895410bb27df3e930be5d9eab30129afWinson Chung "+" + timeDiff + "ms"); 106bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 107bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 108bd91297e895410bb27df3e930be5d9eab30129afWinson Chung 1094d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Logs a stack trace */ 1104d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static void logStackTrace() { 1114d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung logStackTrace("", 99); 1124d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1134d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1144d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Logs a stack trace to a certain depth */ 1154d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static void logStackTrace(int depth) { 1164d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung logStackTrace("", depth); 1174d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1184d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1194d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Logs a stack trace to a certain depth with a key */ 1204d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static void logStackTrace(String key, int depth) { 1214d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung int offset = 0; 1224d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung StackTraceElement[] callStack = Thread.currentThread().getStackTrace(); 1234d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung String tinyStackTrace = ""; 1244d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung // Skip over the known stack trace classes 1254d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung for (int i = 0; i < callStack.length; i++) { 1264d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung StackTraceElement el = callStack[i]; 1274d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung String className = el.getClassName(); 1284d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung if (className.indexOf("dalvik.system.VMStack") == -1 && 1294d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung className.indexOf("java.lang.Thread") == -1 && 1304d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung className.indexOf("recents.Console") == -1) { 1314d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung break; 1324d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } else { 1334d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung offset++; 1344d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1354d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1364d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung // Build the pretty stack trace 1374d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung int start = Math.min(offset + depth, callStack.length); 1384d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung int end = offset; 1394d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung String indent = ""; 1404d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung for (int i = start - 1; i >= end; i--) { 1414d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung StackTraceElement el = callStack[i]; 1424d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung tinyStackTrace += indent + " -> " + el.getClassName() + 1434d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung "[" + el.getLineNumber() + "]." + el.getMethodName(); 1444d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung if (i > end) { 1454d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung tinyStackTrace += "\n"; 1464d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung indent += " "; 1474d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1484d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1494d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(true, key, tinyStackTrace, AnsiRed); 1504d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1514d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1524d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 153303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Returns the stringified MotionEvent action */ 154303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static String motionEventActionToString(int action) { 155303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung switch (action) { 156303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_DOWN: 157303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Down"; 158303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_UP: 159303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Up"; 160303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_MOVE: 161303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Move"; 162303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_CANCEL: 163303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Cancel"; 164303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_POINTER_DOWN: 165303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Pointer Down"; 166303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_POINTER_UP: 167303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Pointer Up"; 168303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung default: 169303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "" + action; 170303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 171303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 1724d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1734d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static String trimMemoryLevelToString(int level) { 1744d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung switch (level) { 1754d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN: 1764d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "UI Hidden"; 1774d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE: 1784d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Running Moderate"; 1794d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_BACKGROUND: 1804d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Background"; 1814d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW: 1824d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Running Low"; 1834d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_MODERATE: 1844d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Moderate"; 1854d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL: 1864d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Critical"; 1874d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_COMPLETE: 1884d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Complete"; 1894d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung default: 1904d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "" + level; 1914d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1924d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 193303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung} 194