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 17ffa2ec664479bff6b4b61d4c349d9db2cb37ca16Winson Chungpackage com.android.systemui.recents.misc; 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 4510f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung // Console enabled state 467aceb9a07fd3883c8f301ba93726d55494b0446eWinson Chung public static boolean Enabled = false; 4710f8139d3b8dd7cd08a2fc688285b3b74a34f0dbWinson Chung 48303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a key */ 49303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(String key) { 504d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(true, key, "", AnsiReset); 51303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 52303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 53303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a conditioned key */ 54303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(boolean condition, String key) { 55303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 564d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(condition, key, "", AnsiReset); 57303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 58303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 59303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 60303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a key in a specific color */ 61303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(boolean condition, String key, Object data) { 62303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 634d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(condition, key, data, AnsiReset); 64303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 65303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 66303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 67303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a key with data in a specific color */ 68303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void log(boolean condition, String key, Object data, String color) { 69303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 70303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung System.out.println(color + key + AnsiReset + " " + data.toString()); 71303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 72303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 73303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 74303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs an error */ 75303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void logError(Context context, String msg) { 76303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 77303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung Log.e("Recents", msg); 78303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 79303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 807048fea75c06324a748d49f25bc05be908cda9ffWinson Chung /** Logs a raw error */ 817048fea75c06324a748d49f25bc05be908cda9ffWinson Chung public static void logRawError(String msg, Exception e) { 827048fea75c06324a748d49f25bc05be908cda9ffWinson Chung Log.e("Recents", msg, e); 837048fea75c06324a748d49f25bc05be908cda9ffWinson Chung } 847048fea75c06324a748d49f25bc05be908cda9ffWinson Chung 85303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Logs a divider bar */ 86303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static void logDivider(boolean condition) { 87303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung if (condition) { 88303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung System.out.println("==== [" + System.currentTimeMillis() + 89303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung "] ============================================================"); 90303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 91303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 92303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung 93bd91297e895410bb27df3e930be5d9eab30129afWinson Chung /** Starts a time trace */ 94bd91297e895410bb27df3e930be5d9eab30129afWinson Chung public static void logStartTracingTime(boolean condition, String key) { 95bd91297e895410bb27df3e930be5d9eab30129afWinson Chung if (condition) { 96bd91297e895410bb27df3e930be5d9eab30129afWinson Chung long curTime = System.currentTimeMillis(); 97bd91297e895410bb27df3e930be5d9eab30129afWinson Chung mTimeLogs.put(key, curTime); 98bd91297e895410bb27df3e930be5d9eab30129afWinson Chung Console.log(condition, "[Recents|" + key + "]", 99bd91297e895410bb27df3e930be5d9eab30129afWinson Chung "started @ " + curTime); 100bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 101bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 102bd91297e895410bb27df3e930be5d9eab30129afWinson Chung 103bd91297e895410bb27df3e930be5d9eab30129afWinson Chung /** Continues a time trace */ 104bd91297e895410bb27df3e930be5d9eab30129afWinson Chung public static void logTraceTime(boolean condition, String key, String desc) { 105bd91297e895410bb27df3e930be5d9eab30129afWinson Chung if (condition) { 106bd91297e895410bb27df3e930be5d9eab30129afWinson Chung long timeDiff = System.currentTimeMillis() - mTimeLogs.get(key); 107bd91297e895410bb27df3e930be5d9eab30129afWinson Chung Console.log(condition, "[Recents|" + key + "|" + desc + "]", 108bd91297e895410bb27df3e930be5d9eab30129afWinson Chung "+" + timeDiff + "ms"); 109bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 110bd91297e895410bb27df3e930be5d9eab30129afWinson Chung } 111bd91297e895410bb27df3e930be5d9eab30129afWinson Chung 1124d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Logs a stack trace */ 1134d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static void logStackTrace() { 1144d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung logStackTrace("", 99); 1154d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1164d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1174d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Logs a stack trace to a certain depth */ 1184d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static void logStackTrace(int depth) { 1194d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung logStackTrace("", depth); 1204d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1214d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1224d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung /** Logs a stack trace to a certain depth with a key */ 1234d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static void logStackTrace(String key, int depth) { 1244d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung int offset = 0; 1254d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung StackTraceElement[] callStack = Thread.currentThread().getStackTrace(); 1264d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung String tinyStackTrace = ""; 1274d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung // Skip over the known stack trace classes 1284d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung for (int i = 0; i < callStack.length; i++) { 1294d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung StackTraceElement el = callStack[i]; 1304d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung String className = el.getClassName(); 1314d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung if (className.indexOf("dalvik.system.VMStack") == -1 && 1324d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung className.indexOf("java.lang.Thread") == -1 && 1334d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung className.indexOf("recents.Console") == -1) { 1344d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung break; 1354d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } else { 1364d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung offset++; 1374d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1384d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1394d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung // Build the pretty stack trace 1404d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung int start = Math.min(offset + depth, callStack.length); 1414d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung int end = offset; 1424d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung String indent = ""; 1434d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung for (int i = start - 1; i >= end; i--) { 1444d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung StackTraceElement el = callStack[i]; 1454d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung tinyStackTrace += indent + " -> " + el.getClassName() + 1464d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung "[" + el.getLineNumber() + "]." + el.getMethodName(); 1474d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung if (i > end) { 1484d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung tinyStackTrace += "\n"; 1494d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung indent += " "; 1504d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1514d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1524d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung log(true, key, tinyStackTrace, AnsiRed); 1534d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1544d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1554d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 156303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung /** Returns the stringified MotionEvent action */ 157303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung public static String motionEventActionToString(int action) { 158303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung switch (action) { 159303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_DOWN: 160303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Down"; 161303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_UP: 162303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Up"; 163303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_MOVE: 164303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Move"; 165303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_CANCEL: 166303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Cancel"; 167303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_POINTER_DOWN: 168303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Pointer Down"; 169303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung case MotionEvent.ACTION_POINTER_UP: 170303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "Pointer Up"; 171303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung default: 172303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung return "" + action; 173303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 174303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung } 1754d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung 1764d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung public static String trimMemoryLevelToString(int level) { 1774d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung switch (level) { 1784d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN: 1794d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "UI Hidden"; 1804d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE: 1814d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Running Moderate"; 1824d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_BACKGROUND: 1834d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Background"; 1844d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW: 1854d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Running Low"; 1864d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_MODERATE: 1874d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Moderate"; 1884d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL: 1894d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Critical"; 1904d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung case ComponentCallbacks2.TRIM_MEMORY_COMPLETE: 1914d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "Complete"; 1924d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung default: 1934d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung return "" + level; 1944d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 1954d7b092a866d2fce3e11b5a12cda2b87a83af52dWinson Chung } 196303e1ff1fec8b240b587bb18b981247a99833aa8Winson Chung} 197