1d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/** 2d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Copyright (c) 2015 The Android Open Source Project 3d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 4d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * except in compliance with the License. You may obtain a copy of the License at 6d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 7d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * <p>http://www.apache.org/licenses/LICENSE-2.0 8d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 9d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * <p>Unless required by applicable law or agreed to in writing, software distributed under the 10d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 11d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * express or implied. See the License for the specific language governing permissions and 12d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * limitations under the License. 13d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 14d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.voicemail.impl.mail.utils; 15d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 16d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.net.Uri; 17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.support.annotation.VisibleForTesting; 18d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.text.TextUtils; 19d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.util.Log; 20d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.voicemail.impl.VvmLog; 21d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport java.util.List; 22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 23d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpublic class LogUtils { 24d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static final String TAG = "Email Log"; 25d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private static final String ACCOUNT_PREFIX = "account:"; 27d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 28d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Priority constant for the println method; use LogUtils.v. */ 29d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static final int VERBOSE = Log.VERBOSE; 30d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 31d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Priority constant for the println method; use LogUtils.d. */ 32d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static final int DEBUG = Log.DEBUG; 33d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 34d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Priority constant for the println method; use LogUtils.i. */ 35d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static final int INFO = Log.INFO; 36d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Priority constant for the println method; use LogUtils.w. */ 38d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static final int WARN = Log.WARN; 39d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 40d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Priority constant for the println method; use LogUtils.e. */ 41d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static final int ERROR = Log.ERROR; 42d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 43d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 44d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Used to enable/disable logging that we don't want included in production releases. This should 45d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * be set to DEBUG for production releases, and VERBOSE for internal builds. 46d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 47d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private static final int MAX_ENABLED_LOG_LEVEL = DEBUG; 48d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 49d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private static Boolean sDebugLoggingEnabledForTests = null; 50d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 51d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Enable debug logging for unit tests. */ 52d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @VisibleForTesting 53d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void setDebugLoggingEnabledForTests(boolean enabled) { 54d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian setDebugLoggingEnabledForTestsInternal(enabled); 55d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian protected static void setDebugLoggingEnabledForTestsInternal(boolean enabled) { 58d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian sDebugLoggingEnabledForTests = Boolean.valueOf(enabled); 59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Returns true if the build configuration prevents debug logging. */ 62d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @VisibleForTesting 63d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static boolean buildPreventsDebugLogging() { 64d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return MAX_ENABLED_LOG_LEVEL > VERBOSE; 65d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 66d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Returns a boolean indicating whether debug logging is enabled. */ 68d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian protected static boolean isDebugLoggingEnabled(String tag) { 69d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (buildPreventsDebugLogging()) { 70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return false; 71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 72d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (sDebugLoggingEnabledForTests != null) { 73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return sDebugLoggingEnabledForTests.booleanValue(); 74d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return Log.isLoggable(tag, Log.DEBUG) || Log.isLoggable(TAG, Log.DEBUG); 76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 77d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 78d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 79d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Returns a String for the specified content provider uri. This will do sanitation of the uri to 80d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * remove PII if debug logging is not enabled. 81d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 82d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static String contentUriToString(final Uri uri) { 83d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return contentUriToString(TAG, uri); 84d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 85d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 86d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 87d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Returns a String for the specified content provider uri. This will do sanitation of the uri to 88d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * remove PII if debug logging is not enabled. 89d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 90d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static String contentUriToString(String tag, Uri uri) { 91d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isDebugLoggingEnabled(tag)) { 92d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian // Debug logging has been enabled, so log the uri as is 93d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return uri.toString(); 94d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else { 95d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian // Debug logging is not enabled, we want to remove the email address from the uri. 96d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian List<String> pathSegments = uri.getPathSegments(); 97d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 98d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian Uri.Builder builder = 99d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian new Uri.Builder() 100d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian .scheme(uri.getScheme()) 101d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian .authority(uri.getAuthority()) 102d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian .query(uri.getQuery()) 103d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian .fragment(uri.getFragment()); 104d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 105d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian // This assumes that the first path segment is the account 106d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian final String account = pathSegments.get(0); 107d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 108d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian builder = builder.appendPath(sanitizeAccountName(account)); 109d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian for (int i = 1; i < pathSegments.size(); i++) { 110d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian builder.appendPath(pathSegments.get(i)); 111d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 112d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return builder.toString(); 113d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 114d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 115d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 116d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** Sanitizes an account name. If debug logging is not enabled, a sanitized name is returned. */ 117d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static String sanitizeAccountName(String accountName) { 118d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (TextUtils.isEmpty(accountName)) { 119d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return ""; 120d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 121d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 122d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return ACCOUNT_PREFIX + sanitizeName(TAG, accountName); 123d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 124d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 125d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static String sanitizeName(final String tag, final String name) { 126d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (TextUtils.isEmpty(name)) { 127d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return ""; 128d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 129d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 130d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isDebugLoggingEnabled(tag)) { 131d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return name; 132d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 133d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 134d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return String.valueOf(name.hashCode()); 135d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 136d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 137d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 138d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Checks to see whether or not a log for the specified tag is loggable at the specified level. 139d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 140d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static boolean isLoggable(String tag, int level) { 141d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (MAX_ENABLED_LOG_LEVEL > level) { 142d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return false; 143d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 144d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return Log.isLoggable(tag, level) || Log.isLoggable(TAG, level); 145d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 146d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 147d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 148d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #VERBOSE} log message. 149d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 150d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 151d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 152d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 153d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 154d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 155d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 156d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void v(String tag, String format, Object... args) { 157d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, VERBOSE)) { 158d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.v(tag, String.format(format, args)); 159d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 160d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 161d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 162d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 163d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #VERBOSE} log message. 164d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 165d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 166d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 167d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tr An exception to log 168d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 169d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 170d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 171d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 172d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void v(String tag, Throwable tr, String format, Object... args) { 173d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, VERBOSE)) { 174d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.v(tag, String.format(format, args), tr); 175d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 176d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 177d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 178d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 179d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #DEBUG} log message. 180d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 181d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 182d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 183d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 184d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 185d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 186d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 187d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void d(String tag, String format, Object... args) { 188d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, DEBUG)) { 189d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.d(tag, String.format(format, args)); 190d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 191d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 192d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 193d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 194d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #DEBUG} log message. 195d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 196d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 197d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 198d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tr An exception to log 199d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 200d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 201d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 202d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 203d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void d(String tag, Throwable tr, String format, Object... args) { 204d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, DEBUG)) { 205d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.d(tag, String.format(format, args), tr); 206d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 207d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 208d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 209d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 210d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #INFO} log message. 211d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 212d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 213d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 214d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 215d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 216d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 217d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 218d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void i(String tag, String format, Object... args) { 219d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, INFO)) { 220d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.i(tag, String.format(format, args)); 221d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 222d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 223d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 224d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 225d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #INFO} log message. 226d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 227d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 228d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 229d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tr An exception to log 230d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 231d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 232d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 233d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 234d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void i(String tag, Throwable tr, String format, Object... args) { 235d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, INFO)) { 236d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.i(tag, String.format(format, args), tr); 237d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 238d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 239d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 240d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 241d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #WARN} log message. 242d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 243d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 244d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 245d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 246d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 247d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 248d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 249d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void w(String tag, String format, Object... args) { 250d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, WARN)) { 251d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.w(tag, String.format(format, args)); 252d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 253d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 254d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 255d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 256d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #WARN} log message. 257d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 258d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 259d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 260d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tr An exception to log 261d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 262d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 263d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 264d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 265d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void w(String tag, Throwable tr, String format, Object... args) { 266d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, WARN)) { 267d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.w(tag, String.format(format, args), tr); 268d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 269d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 270d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 271d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 272d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #ERROR} log message. 273d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 274d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 275d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 276d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 277d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 278d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 279d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 280d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void e(String tag, String format, Object... args) { 281d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, ERROR)) { 282d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.e(tag, String.format(format, args)); 283d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 284d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 285d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 286d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 287d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Send a {@link #ERROR} log message. 288d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 289d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 290d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 291d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tr An exception to log 292d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 293d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 294d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 295d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 296d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void e(String tag, Throwable tr, String format, Object... args) { 297d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (isLoggable(tag, ERROR)) { 298d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.e(tag, String.format(format, args), tr); 299d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 300d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 301d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 302d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 303d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * What a Terrible Failure: Report a condition that should never happen. The error will always be 304d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * logged at level ASSERT with the call stack. Depending on system configuration, a report may be 305d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * added to the {@link android.os.DropBoxManager} and/or the process may be terminated immediately 306d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * with an error dialog. 307d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 308d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 309d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 310d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 311d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 312d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 313d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 314d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void wtf(String tag, String format, Object... args) { 315d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.wtf(tag, String.format(format, args), new Error()); 316d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 317d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 318d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian /** 319d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * What a Terrible Failure: Report a condition that should never happen. The error will always be 320d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * logged at level ASSERT with the call stack. Depending on system configuration, a report may be 321d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * added to the {@link android.os.DropBoxManager} and/or the process may be terminated immediately 322d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * with an error dialog. 323d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 324d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tag Used to identify the source of a log message. It usually identifies the class or 325d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * activity where the log call occurs. 326d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param tr An exception to log 327d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param format the format string (see {@link java.util.Formatter#format}) 328d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * @param args the list of arguments passed to the formatter. If there are more arguments than 329d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * required by {@code format}, additional arguments are ignored. 330d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 331d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static void wtf(String tag, Throwable tr, String format, Object... args) { 332d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian VvmLog.wtf(tag, String.format(format, args), tr); 333d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 334d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 335d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static String byteToHex(int b) { 336d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return byteToHex(new StringBuilder(), b).toString(); 337d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 338d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 339d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public static StringBuilder byteToHex(StringBuilder sb, int b) { 340d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian b &= 0xFF; 341d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian sb.append("0123456789ABCDEF".charAt(b >> 4)); 342d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian sb.append("0123456789ABCDEF".charAt(b & 0xF)); 343d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return sb; 344d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 345d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian} 346