/* * Copyright (C) 2013 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.incallui; import android.net.Uri; import android.telecom.PhoneAccount; import android.telephony.PhoneNumberUtils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Manages logging for the entire class. */ public class Log { // Generic tag for all In Call logging public static final String TAG = "InCall"; public static final boolean DEBUG = android.util.Log.isLoggable(TAG, android.util.Log.DEBUG); public static final boolean VERBOSE = android.util.Log.isLoggable(TAG, android.util.Log.VERBOSE); public static final String TAG_DELIMETER = " - "; public static void d(String tag, String msg) { if (DEBUG) { android.util.Log.d(TAG, delimit(tag) + msg); } } public static void d(Object obj, String msg) { if (DEBUG) { android.util.Log.d(TAG, getPrefix(obj) + msg); } } public static void d(Object obj, String str1, Object str2) { if (DEBUG) { android.util.Log.d(TAG, getPrefix(obj) + str1 + str2); } } public static void v(Object obj, String msg) { if (VERBOSE) { android.util.Log.v(TAG, getPrefix(obj) + msg); } } public static void v(Object obj, String str1, Object str2) { if (VERBOSE) { android.util.Log.d(TAG, getPrefix(obj) + str1 + str2); } } public static void e(String tag, String msg, Exception e) { android.util.Log.e(TAG, delimit(tag) + msg, e); } public static void e(String tag, String msg) { android.util.Log.e(TAG, delimit(tag) + msg); } public static void e(Object obj, String msg, Exception e) { android.util.Log.e(TAG, getPrefix(obj) + msg, e); } public static void e(Object obj, String msg) { android.util.Log.e(TAG, getPrefix(obj) + msg); } public static void i(String tag, String msg) { android.util.Log.i(TAG, delimit(tag) + msg); } public static void i(Object obj, String msg) { android.util.Log.i(TAG, getPrefix(obj) + msg); } public static void w(Object obj, String msg) { android.util.Log.w(TAG, getPrefix(obj) + msg); } public static void wtf(Object obj, String msg) { android.util.Log.wtf(TAG, getPrefix(obj) + msg); } public static String piiHandle(Object pii) { if (pii == null || VERBOSE) { return String.valueOf(pii); } if (pii instanceof Uri) { Uri uri = (Uri) pii; // All Uri's which are not "tel" go through normal pii() method. if (!PhoneAccount.SCHEME_TEL.equals(uri.getScheme())) { return pii(pii); } else { pii = uri.getSchemeSpecificPart(); } } String originalString = String.valueOf(pii); StringBuilder stringBuilder = new StringBuilder(originalString.length()); for (char c : originalString.toCharArray()) { if (PhoneNumberUtils.isDialable(c)) { stringBuilder.append('*'); } else { stringBuilder.append(c); } } return stringBuilder.toString(); } /** * Redact personally identifiable information for production users. * If we are running in verbose mode, return the original string, otherwise * return a SHA-1 hash of the input string. */ public static String pii(Object pii) { if (pii == null || VERBOSE) { return String.valueOf(pii); } return "[" + secureHash(String.valueOf(pii).getBytes()) + "]"; } private static String secureHash(byte[] input) { MessageDigest messageDigest; try { messageDigest = MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException e) { return null; } messageDigest.update(input); byte[] result = messageDigest.digest(); return encodeHex(result); } private static String encodeHex(byte[] bytes) { StringBuffer hex = new StringBuffer(bytes.length * 2); for (int i = 0; i < bytes.length; i++) { int byteIntValue = bytes[i] & 0xff; if (byteIntValue < 0x10) { hex.append("0"); } hex.append(Integer.toString(byteIntValue, 16)); } return hex.toString(); } private static String getPrefix(Object obj) { return (obj == null ? "" : (obj.getClass().getSimpleName() + TAG_DELIMETER)); } private static String delimit(String tag) { return tag + TAG_DELIMETER; } }