blob: e7b5042651ca26da7f5d16880c9141cd1f17845c [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.pump.util;
import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import com.android.pump.BuildConfig;
import java.util.Locale;
import java.util.regex.Pattern;
@AnyThread
public final class Clog {
private static final boolean COLORIZE = BuildConfig.DEBUG;
public static final int VERBOSE = android.util.Log.VERBOSE;
public static final int DEBUG = android.util.Log.DEBUG;
public static final int INFO = android.util.Log.INFO;
public static final int WARN = android.util.Log.WARN;
public static final int ERROR = android.util.Log.ERROR;
public static final int ASSERT = android.util.Log.ASSERT;
private static final int COLOR_BLACK = 30;
private static final int COLOR_RED = 31;
private static final int COLOR_GREEN = 32;
private static final int COLOR_YELLOW = 33;
private static final int COLOR_BLUE = 34;
private static final int COLOR_MAGENTA = 35;
private static final int COLOR_CYAN = 36;
//private static final int COLOR_WHITE = 37;
private static final int MAX_TAG_LENGTH = 23;
private static final int MAX_LINE_LENGTH = 1024;
private static final Pattern LINE_BREAKER = Pattern.compile("\\r?\\n");
private Clog() { }
public static @NonNull String tag(@NonNull Class<?> clazz) {
String tag = clazz.getSimpleName();
return tag.substring(0, Math.min(tag.length(), MAX_TAG_LENGTH));
}
public static int v(@NonNull String tag, @NonNull String msg) {
return println(VERBOSE, tag, msg);
}
public static int v(@NonNull String tag, @NonNull String msg, @NonNull Throwable tr) {
return println(VERBOSE, tag, msg + '\n' + getStackTraceString(tr));
}
public static int d(@NonNull String tag, @NonNull String msg) {
return println(DEBUG, tag, msg);
}
public static int d(@NonNull String tag, @NonNull String msg, @NonNull Throwable tr) {
return println(DEBUG, tag, msg + '\n' + getStackTraceString(tr));
}
public static int i(@NonNull String tag, @NonNull String msg) {
return println(INFO, tag, msg);
}
public static int i(@NonNull String tag, @NonNull String msg, @NonNull Throwable tr) {
return println(INFO, tag, msg + '\n' + getStackTraceString(tr));
}
public static int w(@NonNull String tag, @NonNull String msg) {
return println(WARN, tag, msg);
}
public static int w(@NonNull String tag, @NonNull String msg, @NonNull Throwable tr) {
return println(WARN, tag, msg + '\n' + getStackTraceString(tr));
}
public static boolean isLoggable(@NonNull String tag, int level) {
return android.util.Log.isLoggable(tag, level);
}
public static int w(@NonNull String tag, @NonNull Throwable tr) {
return println(WARN, tag, getStackTraceString(tr));
}
public static int e(@NonNull String tag, @NonNull String msg) {
return println(ERROR, tag, msg);
}
public static int e(@NonNull String tag, @NonNull String msg, @NonNull Throwable tr) {
return println(ERROR, tag, msg + '\n' + getStackTraceString(tr));
}
public static int wtf(@NonNull String tag, @NonNull String msg) {
return android.util.Log.wtf(tag, msg);
}
public static int wtf(@NonNull String tag, @NonNull Throwable tr) {
return android.util.Log.wtf(tag, tr);
}
public static int wtf(@NonNull String tag, @NonNull String msg, @NonNull Throwable tr) {
return android.util.Log.wtf(tag, msg, tr);
}
public static @NonNull String getStackTraceString(@NonNull Throwable tr) {
return android.util.Log.getStackTraceString(tr);
}
public static int println(int priority, @NonNull String tag, @NonNull String msg) {
tag = String.valueOf(tag);
msg = String.valueOf(msg);
int color;
switch (priority) {
case VERBOSE:
color = COLOR_CYAN;
break;
case DEBUG:
color = COLOR_BLUE;
break;
case INFO:
color = COLOR_GREEN;
break;
case WARN:
color = COLOR_YELLOW;
break;
case ERROR:
color = COLOR_RED;
break;
case ASSERT:
color = COLOR_MAGENTA;
break;
default:
color = COLOR_BLACK;
break;
}
int result = 0;
for (String line : LINE_BREAKER.split(msg)) {
int length = line.length();
for (int start = 0; start < length; start += MAX_LINE_LENGTH) {
String part = line.substring(start, Math.min(start + MAX_LINE_LENGTH, length));
result += android.util.Log.println(priority, tag, colorize(part, color));
}
}
return result;
}
private static String colorize(String msg, int color) {
if (COLORIZE) {
return String.format(Locale.ROOT, "\033[%2$dm%1$s\033[0m", msg, color);
}
return msg;
}
}