1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package com.android.inputmethod.latin.utils;
18 
19 import android.util.Log;
20 
21 import com.android.inputmethod.latin.define.DebugFlags;
22 
23 /**
24  * A class for logging and debugging utility methods.
25  */
26 public final class DebugLogUtils {
27     private final static String TAG = DebugLogUtils.class.getSimpleName();
28     private final static boolean sDBG = DebugFlags.DEBUG_ENABLED;
29 
30     /**
31      * Calls .toString() on its non-null argument or returns "null"
32      * @param o the object to convert to a string
33      * @return the result of .toString() or null
34      */
s(final Object o)35     public static String s(final Object o) {
36         return null == o ? "null" : o.toString();
37     }
38 
39     /**
40      * Get the string representation of the current stack trace, for debugging purposes.
41      * @return a readable, carriage-return-separated string for the current stack trace.
42      */
getStackTrace()43     public static String getStackTrace() {
44         return getStackTrace(Integer.MAX_VALUE - 1);
45     }
46 
47     /**
48      * Get the string representation of the current stack trace, for debugging purposes.
49      * @param limit the maximum number of stack frames to be returned.
50      * @return a readable, carriage-return-separated string for the current stack trace.
51      */
getStackTrace(final int limit)52     public static String getStackTrace(final int limit) {
53         final StringBuilder sb = new StringBuilder();
54         try {
55             throw new RuntimeException();
56         } catch (final RuntimeException e) {
57             final StackTraceElement[] frames = e.getStackTrace();
58             // Start at 1 because the first frame is here and we don't care about it
59             for (int j = 1; j < frames.length && j < limit + 1; ++j) {
60                 sb.append(frames[j].toString() + "\n");
61             }
62         }
63         return sb.toString();
64     }
65 
66     /**
67      * Get the stack trace contained in an exception as a human-readable string.
68      * @param t the throwable
69      * @return the human-readable stack trace
70      */
getStackTrace(final Throwable t)71     public static String getStackTrace(final Throwable t) {
72         final StringBuilder sb = new StringBuilder();
73         final StackTraceElement[] frames = t.getStackTrace();
74         for (int j = 0; j < frames.length; ++j) {
75             sb.append(frames[j].toString() + "\n");
76         }
77         return sb.toString();
78     }
79 
80     /**
81      * Helper log method to ease null-checks and adding spaces.
82      *
83      * This sends all arguments to the log, separated by spaces. Any null argument is converted
84      * to the "null" string. It uses a very visible tag and log level for debugging purposes.
85      *
86      * @param args the stuff to send to the log
87      */
l(final Object... args)88     public static void l(final Object... args) {
89         if (!sDBG) return;
90         final StringBuilder sb = new StringBuilder();
91         for (final Object o : args) {
92             sb.append(s(o).toString());
93             sb.append(" ");
94         }
95         Log.e(TAG, sb.toString());
96     }
97 
98     /**
99      * Helper log method to put stuff in red.
100      *
101      * This does the same as #l but prints in red
102      *
103      * @param args the stuff to send to the log
104      */
r(final Object... args)105     public static void r(final Object... args) {
106         if (!sDBG) return;
107         final StringBuilder sb = new StringBuilder("\u001B[31m");
108         for (final Object o : args) {
109             sb.append(s(o).toString());
110             sb.append(" ");
111         }
112         sb.append("\u001B[0m");
113         Log.e(TAG, sb.toString());
114     }
115 }
116