| /* |
| * 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; |
| } |
| } |