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