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