diff options
author | Ihab Awad <ihab@google.com> | 2014-05-20 22:32:12 -0700 |
---|---|---|
committer | Ihab Awad <ihab@google.com> | 2014-05-21 12:06:00 -0700 |
commit | 60ac30bb8a30fa7283d592c12ddf2da9447adf14 (patch) | |
tree | 128af81351af157b5e7e3fca3970d6aefae46a9b /telecomm | |
parent | 542e0ea8bfa60f09c33e4be366adf8681c25d0bf (diff) | |
download | frameworks_base-60ac30bb8a30fa7283d592c12ddf2da9447adf14.zip frameworks_base-60ac30bb8a30fa7283d592c12ddf2da9447adf14.tar.gz frameworks_base-60ac30bb8a30fa7283d592c12ddf2da9447adf14.tar.bz2 |
Add logging utilities to Telecomm classes
Add logging utility class from packages/services/Telecomm to the Telecomm
classes in the framework.
Change-Id: I54a9edc4daa24ffdeb15b08afc5ad8a238d04291
Diffstat (limited to 'telecomm')
-rw-r--r-- | telecomm/java/android/telecomm/Connection.java | 29 | ||||
-rw-r--r-- | telecomm/java/android/telecomm/ConnectionService.java | 55 | ||||
-rw-r--r-- | telecomm/java/android/telecomm/Log.java | 181 |
3 files changed, 218 insertions, 47 deletions
diff --git a/telecomm/java/android/telecomm/Connection.java b/telecomm/java/android/telecomm/Connection.java index 6b7463c..88de17a 100644 --- a/telecomm/java/android/telecomm/Connection.java +++ b/telecomm/java/android/telecomm/Connection.java @@ -18,7 +18,6 @@ package android.telecomm; import android.net.Uri; import android.os.Bundle; -import android.util.Log; import java.util.HashSet; import java.util.Set; @@ -28,8 +27,6 @@ import java.util.Set; */ public abstract class Connection { - private static String TAG = Connection.class.getSimpleName(); - public interface Listener { void onStateChanged(Connection c, int state); void onAudioStateChanged(Connection c, CallAudioState state); @@ -146,7 +143,7 @@ public abstract class Connection { * @hide */ public final void playDtmfTone(char c) { - Log.d(TAG, "playDtmfTone " + c); + Log.d(this, "playDtmfTone %c", c); onPlayDtmfTone(c); } @@ -156,7 +153,7 @@ public abstract class Connection { * @hide */ public final void stopDtmfTone() { - Log.d(TAG, "stopDtmfTone"); + Log.d(this, "stopDtmfTone"); onStopDtmfTone(); } @@ -168,7 +165,7 @@ public abstract class Connection { * @hide */ public final void disconnect() { - Log.d(TAG, "disconnect"); + Log.d(this, "disconnect"); onDisconnect(); } @@ -180,7 +177,7 @@ public abstract class Connection { * @hide */ public final void abort() { - Log.d(TAG, "abort"); + Log.d(this, "abort"); onAbort(); } @@ -192,7 +189,7 @@ public abstract class Connection { * @hide */ public final void hold() { - Log.d(TAG, "hold"); + Log.d(this, "hold"); onHold(); } @@ -204,7 +201,7 @@ public abstract class Connection { * @hide */ public final void unhold() { - Log.d(TAG, "unhold"); + Log.d(this, "unhold"); onUnhold(); } @@ -216,7 +213,7 @@ public abstract class Connection { * @hide */ public final void answer() { - Log.d(TAG, "answer"); + Log.d(this, "answer"); if (mState == State.RINGING) { onAnswer(); } @@ -230,7 +227,7 @@ public abstract class Connection { * @hide */ public final void reject() { - Log.d(TAG, "reject"); + Log.d(this, "reject"); if (mState == State.RINGING) { onReject(); } @@ -242,7 +239,7 @@ public abstract class Connection { * @param state The new audio state. */ public void setAudioState(CallAudioState state) { - Log.d(TAG, "setAudioState " + state); + Log.d(this, "setAudioState %s", state); onSetAudioState(state); } @@ -265,7 +262,7 @@ public abstract class Connection { case State.DISCONNECTED: return "DISCONNECTED"; default: - Log.wtf(TAG, "Unknown state " + state); + Log.wtf(Connection.class, "Unknown state %d", state); return "UNKNOWN"; } } @@ -276,7 +273,7 @@ public abstract class Connection { * @param handle The new handle. */ protected void setHandle(Uri handle) { - Log.d(TAG, "setHandle " + handle); + Log.d(this, "setHandle %s", handle); // TODO: Enforce super called mHandle = handle; for (Listener l : mListeners) { @@ -325,7 +322,7 @@ public abstract class Connection { */ protected void setDisconnected(int cause, String message) { setState(State.DISCONNECTED); - Log.d(TAG, "Disconnected with cause " + cause + " message " + message); + Log.d(this, "Disconnected with cause %d message %s", cause, message); for (Listener l : mListeners) { l.onDisconnected(this, cause, message); } @@ -403,7 +400,7 @@ public abstract class Connection { protected void onReject() {} private void setState(int state) { - Log.d(TAG, "setState: " + stateToString(state)); + Log.d(this, "setState: %s", stateToString(state)); this.mState = state; for (Listener l : mListeners) { l.onStateChanged(this, state); diff --git a/telecomm/java/android/telecomm/ConnectionService.java b/telecomm/java/android/telecomm/ConnectionService.java index aba4579..9ace36f 100644 --- a/telecomm/java/android/telecomm/ConnectionService.java +++ b/telecomm/java/android/telecomm/ConnectionService.java @@ -18,7 +18,6 @@ package android.telecomm; import android.net.Uri; import android.os.Bundle; -import android.util.Log; import java.util.HashMap; import java.util.Map; @@ -28,13 +27,8 @@ import java.util.Map; * processes running on an Android device. */ public abstract class ConnectionService extends CallService { - private static final String TAG = ConnectionService.class.getSimpleName(); - - // STOPSHIP: Debug Logging should be conditional on a debug flag or use a set of - // logging functions that make it automaticaly so. - // Flag controlling whether PII is emitted into the logs - private static final boolean PII_DEBUG = Log.isLoggable(TAG, Log.DEBUG); + private static final boolean PII_DEBUG = Log.isLoggable(android.util.Log.DEBUG); private static final Connection NULL_CONNECTION = new Connection() {}; @@ -46,7 +40,7 @@ public abstract class ConnectionService extends CallService { @Override public void onStateChanged(Connection c, int state) { String id = mIdByConnection.get(c); - Log.d(TAG, "Adapter set state " + id + " " + Connection.stateToString(state)); + Log.d(this, "Adapter set state %d %s", id, Connection.stateToString(state)); switch (state) { case Connection.State.ACTIVE: getAdapter().setActive(id); @@ -72,7 +66,7 @@ public abstract class ConnectionService extends CallService { @Override public void onDisconnected(Connection c, int cause, String message) { String id = mIdByConnection.get(c); - Log.d(TAG, "Adapter set disconnected " + cause + " " + message); + Log.d(this, "Adapter set disconnected %d %s", cause, message); getAdapter().setDisconnected(id, cause, message); } @@ -99,21 +93,21 @@ public abstract class ConnectionService extends CallService { @Override public final void isCompatibleWith(final CallInfo callInfo) { - Log.d(TAG, "isCompatibleWith " + callInfo); + Log.d(this, "isCompatibleWith %s", callInfo); onFindSubscriptions( callInfo.getHandle(), new Response<Uri, Subscription>() { @Override public void onResult(Uri handle, Subscription... result) { boolean isCompatible = result.length > 0; - Log.d(TAG, "adapter setIsCompatibleWith " + Log.d(this, "adapter setIsCompatibleWith " + callInfo.getId() + " " + isCompatible); getAdapter().setIsCompatibleWith(callInfo.getId(), isCompatible); } @Override public void onError(Uri handle, String reason) { - Log.wtf(TAG, "Error in onFindSubscriptions " + callInfo.getHandle() + Log.w(this, "Error in onFindSubscriptions " + callInfo.getHandle() + " error: " + reason); getAdapter().setIsCompatibleWith(callInfo.getId(), false); } @@ -123,7 +117,7 @@ public abstract class ConnectionService extends CallService { @Override public final void call(final CallInfo callInfo) { - Log.d(TAG, "call " + callInfo); + Log.d(this, "call %s", callInfo); onCreateConnections( new ConnectionRequest( callInfo.getHandle(), @@ -132,7 +126,7 @@ public abstract class ConnectionService extends CallService { @Override public void onResult(ConnectionRequest request, Connection... result) { if (result.length != 1) { - Log.d(TAG, "adapter handleFailedOutgoingCall " + callInfo); + Log.d(this, "adapter handleFailedOutgoingCall %s", callInfo); getAdapter().handleFailedOutgoingCall( callInfo.getId(), "Created " + result.length + " Connections, expected 1"); @@ -141,8 +135,7 @@ public abstract class ConnectionService extends CallService { } } else { addConnection(callInfo.getId(), result[0]); - Log.d(TAG, "adapter handleSuccessfulOutgoingCall " - + callInfo.getId()); + Log.d(this, "adapter handleSuccessfulOutgoingCall %s", callInfo.getId()); getAdapter().handleSuccessfulOutgoingCall(callInfo.getId()); } } @@ -157,13 +150,13 @@ public abstract class ConnectionService extends CallService { @Override public final void abort(String callId) { - Log.d(TAG, "abort " + callId); + Log.d(this, "abort %s", callId); findConnectionForAction(callId, "abort").abort(); } @Override public final void setIncomingCallId(final String callId, Bundle extras) { - Log.d(TAG, "setIncomingCallId " + callId + " " + extras); + Log.d(this, "setIncomingCallId %s %s", callId, extras); onCreateIncomingConnection( new ConnectionRequest( null, // TODO: Can we obtain this from "extras"? @@ -172,7 +165,7 @@ public abstract class ConnectionService extends CallService { @Override public void onResult(ConnectionRequest request, Connection... result) { if (result.length != 1) { - Log.d(TAG, "adapter handleFailedOutgoingCall " + callId); + Log.d(this, "adapter handleFailedOutgoingCall %s", callId); getAdapter().handleFailedOutgoingCall( callId, "Created " + result.length + " Connections, expected 1"); @@ -181,7 +174,7 @@ public abstract class ConnectionService extends CallService { } } else { addConnection(callId, result[0]); - Log.d(TAG, "adapter notifyIncomingCall " + callId); + Log.d(this, "adapter notifyIncomingCall %s", callId); // TODO: Uri.EMPTY is because CallInfo crashes when Parceled with a // null URI ... need to fix that at its cause! getAdapter().notifyIncomingCall(new CallInfo( @@ -194,7 +187,7 @@ public abstract class ConnectionService extends CallService { @Override public void onError(ConnectionRequest request, String reason) { - Log.d(TAG, "adapter failed setIncomingCallId " + request + " " + reason); + Log.d(this, "adapter failed setIncomingCallId %s %s", request, reason); } } ); @@ -202,49 +195,49 @@ public abstract class ConnectionService extends CallService { @Override public final void answer(String callId) { - Log.d(TAG, "answer " + callId); + Log.d(this, "answer %s", callId); findConnectionForAction(callId, "answer").answer(); } @Override public final void reject(String callId) { - Log.d(TAG, "reject " + callId); + Log.d(this, "reject %s", callId); findConnectionForAction(callId, "reject").reject(); } @Override public final void disconnect(String callId) { - Log.d(TAG, "disconnect " + callId); + Log.d(this, "disconnect %s", callId); findConnectionForAction(callId, "disconnect").disconnect(); } @Override public final void hold(String callId) { - Log.d(TAG, "hold " + callId); + Log.d(this, "hold %s", callId); findConnectionForAction(callId, "hold").hold(); } @Override public final void unhold(String callId) { - Log.d(TAG, "unhold " + callId); + Log.d(this, "unhold %s", callId); findConnectionForAction(callId, "unhold").unhold(); } @Override public final void playDtmfTone(String callId, char digit) { - Log.d(TAG, "playDtmfTone " + callId + " " + Character.toString(digit)); + Log.d(this, "playDtmfTone %s %c", callId, digit); findConnectionForAction(callId, "playDtmfTone").playDtmfTone(digit); } @Override public final void stopDtmfTone(String callId) { - Log.d(TAG, "stopDtmfTone " + callId); + Log.d(this, "stopDtmfTone %s", callId); findConnectionForAction(callId, "stopDtmfTone").stopDtmfTone(); } @Override public final void onAudioStateChanged(String callId, CallAudioState audioState) { - Log.d(TAG, "onAudioStateChanged " + callId + " " + audioState); + Log.d(this, "onAudioStateChanged %s %s", callId, audioState); findConnectionForAction(callId, "onAudioStateChanged").setAudioState(audioState); } @@ -318,7 +311,7 @@ public abstract class ConnectionService extends CallService { case Connection.State.DISCONNECTED: return CallState.DISCONNECTED; default: - Log.wtf(TAG, "Unknown Connection.State " + connectionState); + Log.wtf(this, "Unknown Connection.State %d", connectionState); return CallState.NEW; } } @@ -339,7 +332,7 @@ public abstract class ConnectionService extends CallService { if (mConnectionById.containsKey(callId)) { return mConnectionById.get(callId); } - Log.wtf(TAG, action + " - Cannot find Connection \"" + callId + "\""); + Log.w(this, "%s - Cannot find Connection %s", action, callId); return NULL_CONNECTION; } }
\ No newline at end of file diff --git a/telecomm/java/android/telecomm/Log.java b/telecomm/java/android/telecomm/Log.java new file mode 100644 index 0000000..b8dfb11 --- /dev/null +++ b/telecomm/java/android/telecomm/Log.java @@ -0,0 +1,181 @@ +/* + * Copyright 2014, 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 android.telecomm; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.IllegalFormatException; +import java.util.Locale; + +/** + * Manages logging for the entire module. + * + * @hide + */ +final public class Log { + + // Generic tag for all Telecomm Framework logging + private static final String TAG = "TelecommFramework"; + + public static final boolean FORCE_LOGGING = true; /* STOP SHIP if true */ + public static final boolean DEBUG = isLoggable(android.util.Log.DEBUG); + public static final boolean INFO = isLoggable(android.util.Log.INFO); + public static final boolean VERBOSE = isLoggable(android.util.Log.VERBOSE); + public static final boolean WARN = isLoggable(android.util.Log.WARN); + public static final boolean ERROR = isLoggable(android.util.Log.ERROR); + + private Log() {} + + public static boolean isLoggable(int level) { + return FORCE_LOGGING || android.util.Log.isLoggable(TAG, level); + } + + public static void d(String prefix, String format, Object... args) { + if (DEBUG) { + android.util.Log.d(TAG, buildMessage(prefix, format, args)); + } + } + + public static void d(Object objectPrefix, String format, Object... args) { + if (DEBUG) { + android.util.Log.d(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args)); + } + } + + public static void i(String prefix, String format, Object... args) { + if (INFO) { + android.util.Log.i(TAG, buildMessage(prefix, format, args)); + } + } + + public static void i(Object objectPrefix, String format, Object... args) { + if (INFO) { + android.util.Log.i(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args)); + } + } + + public static void v(String prefix, String format, Object... args) { + if (VERBOSE) { + android.util.Log.v(TAG, buildMessage(prefix, format, args)); + } + } + + public static void v(Object objectPrefix, String format, Object... args) { + if (VERBOSE) { + android.util.Log.v(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args)); + } + } + + public static void w(String prefix, String format, Object... args) { + if (WARN) { + android.util.Log.w(TAG, buildMessage(prefix, format, args)); + } + } + + public static void w(Object objectPrefix, String format, Object... args) { + if (WARN) { + android.util.Log.w(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args)); + } + } + + public static void e(String prefix, Throwable tr, String format, Object... args) { + if (ERROR) { + android.util.Log.e(TAG, buildMessage(prefix, format, args), tr); + } + } + + public static void e(Object objectPrefix, Throwable tr, String format, Object... args) { + if (ERROR) { + android.util.Log.e(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args), + tr); + } + } + + public static void wtf(String prefix, Throwable tr, String format, Object... args) { + android.util.Log.wtf(TAG, buildMessage(prefix, format, args), tr); + } + + public static void wtf(Object objectPrefix, Throwable tr, String format, Object... args) { + android.util.Log.wtf(TAG, buildMessage(getPrefixFromObject(objectPrefix), format, args), + tr); + } + + public static void wtf(String prefix, String format, Object... args) { + String msg = buildMessage(prefix, format, args); + android.util.Log.wtf(TAG, msg, new IllegalStateException(msg)); + } + + public static void wtf(Object objectPrefix, String format, Object... args) { + String msg = buildMessage(getPrefixFromObject(objectPrefix), format, args); + android.util.Log.wtf(TAG, msg, new IllegalStateException(msg)); + } + + /** + * 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 getPrefixFromObject(Object obj) { + return obj == null ? "<null>" : obj.getClass().getSimpleName(); + } + + private static String buildMessage(String prefix, String format, Object... args) { + String msg; + try { + msg = (args == null || args.length == 0) ? format + : String.format(Locale.US, format, args); + } catch (IllegalFormatException ife) { + wtf("Log", ife, "IllegalFormatException: formatString='%s' numArgs=%d", format, + args.length); + msg = format + " (An error occurred while formatting the message.)"; + } + return String.format(Locale.US, "%s: %s", prefix, msg); + } +} |