summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-02-22 00:22:30 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-02-22 00:22:30 +0000
commit982e7d70c82c4ef6b4bf6d622380aaa7227c7d1c (patch)
tree335033a2a0f148de27137a4e0fb13f940cd6ab04
parent7c898ad4e539ba1bdf1e90c63a2adb0c8b3225b2 (diff)
parentaa2d2caffd6cf6f9c86f7f6ed89df985b3c8f6b2 (diff)
downloadImsMedia-android14-qpr3-release.tar.gz
Snap for 11479893 from aa2d2caffd6cf6f9c86f7f6ed89df985b3c8f6b2 to 24Q2-releaseandroid-14.0.0_r51android-14.0.0_r50android14-qpr3-release
Change-Id: Icb72b25f110efac53767d666732b99fd5ce5f756
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioListener.java5
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioLocalSession.java14
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioOffloadService.java2
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioService.java7
-rw-r--r--service/src/com/android/telephony/imsmedia/AudioSession.java28
-rw-r--r--service/src/com/android/telephony/imsmedia/ImsMediaApplication.java3
-rw-r--r--service/src/com/android/telephony/imsmedia/ImsMediaController.java12
-rw-r--r--service/src/com/android/telephony/imsmedia/JNIImsMediaService.java5
-rw-r--r--service/src/com/android/telephony/imsmedia/TextListener.java5
-rw-r--r--service/src/com/android/telephony/imsmedia/TextLocalSession.java8
-rw-r--r--service/src/com/android/telephony/imsmedia/TextService.java7
-rw-r--r--service/src/com/android/telephony/imsmedia/TextSession.java14
-rw-r--r--service/src/com/android/telephony/imsmedia/VideoListener.java5
-rw-r--r--service/src/com/android/telephony/imsmedia/VideoLocalSession.java9
-rw-r--r--service/src/com/android/telephony/imsmedia/VideoService.java7
-rw-r--r--service/src/com/android/telephony/imsmedia/VideoSession.java21
-rw-r--r--service/src/com/android/telephony/imsmedia/WakeLockManager.java5
-rw-r--r--service/src/com/android/telephony/imsmedia/config/ConfigPreference.java21
-rw-r--r--service/src/com/android/telephony/imsmedia/util/Log.java237
-rw-r--r--tests/unit/src/com/android/telephony/imsmedia/util/LogTest.java136
20 files changed, 451 insertions, 100 deletions
diff --git a/service/src/com/android/telephony/imsmedia/AudioListener.java b/service/src/com/android/telephony/imsmedia/AudioListener.java
index 468436d6..5fc9f39b 100644
--- a/service/src/com/android/telephony/imsmedia/AudioListener.java
+++ b/service/src/com/android/telephony/imsmedia/AudioListener.java
@@ -23,7 +23,8 @@ import android.telephony.ims.RtpHeaderExtension;
import android.telephony.imsmedia.AudioConfig;
import android.telephony.imsmedia.MediaQualityStatus;
import android.telephony.imsmedia.RtpReceptionStats;
-import android.util.Log;
+
+import com.android.telephony.imsmedia.util.Log;
import java.util.ArrayList;
import java.util.List;
@@ -69,7 +70,7 @@ public class AudioListener implements JNIImsMediaListener {
@Override
public void onMessage(final Parcel parcel) {
final int event = parcel.readInt();
- Log.d(TAG, "onMessage() -" + AudioListener.this + ", event=" + event);
+ Log.dc(TAG, "onMessage() -" + AudioListener.this + ", event=" + event);
switch (event) {
case AudioSession.EVENT_OPEN_SESSION_SUCCESS:
final int sessionId = parcel.readInt();
diff --git a/service/src/com/android/telephony/imsmedia/AudioLocalSession.java b/service/src/com/android/telephony/imsmedia/AudioLocalSession.java
index 5d4facf4..c36cda16 100644
--- a/service/src/com/android/telephony/imsmedia/AudioLocalSession.java
+++ b/service/src/com/android/telephony/imsmedia/AudioLocalSession.java
@@ -20,7 +20,8 @@ import android.os.Parcel;
import android.telephony.ims.RtpHeaderExtension;
import android.telephony.imsmedia.AudioConfig;
import android.telephony.imsmedia.MediaQualityThreshold;
-import android.util.Log;
+
+import com.android.telephony.imsmedia.util.Log;
import java.util.List;
@@ -46,7 +47,7 @@ public class AudioLocalSession {
/** Returns the unique session identifier */
public int getSessionId() {
- Log.d(TAG, "getSessionId");
+ Log.dc(TAG, "getSessionId");
return mSessionId;
}
@@ -74,7 +75,6 @@ public class AudioLocalSession {
* @param config provides remote end point info and codec details
*/
public void modifySession(final AudioConfig config) {
- Log.d(TAG, "modifySession: " + config);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_MODIFY_SESSION);
if (config != null) {
@@ -90,7 +90,6 @@ public class AudioLocalSession {
* @param config provides remote end point info and codec details
*/
public void addConfig(final AudioConfig config) {
- Log.d(TAG, "addConfig: " + config);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_ADD_CONFIG);
if (config != null) {
@@ -106,7 +105,6 @@ public class AudioLocalSession {
* @param config remote config to be deleted
*/
public void deleteConfig(final AudioConfig config) {
- Log.d(TAG, "deleteConfig: " + config);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_DELETE_CONFIG);
if (config != null) {
@@ -125,7 +123,6 @@ public class AudioLocalSession {
* @param config remote config to be confirmed
*/
public void confirmConfig(final AudioConfig config) {
- Log.d(TAG, "confirmConfig: " + config);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_CONFIRM_CONFIG);
if (config != null) {
@@ -141,7 +138,6 @@ public class AudioLocalSession {
* @param duration of the key press in milliseconds.
*/
public void sendDtmf(final char dtmfDigit, final int duration) {
- Log.d(TAG, "sendDtmf: digit= " + dtmfDigit + ", duration=" + duration);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_SEND_DTMF);
parcel.writeByte((byte)dtmfDigit);
@@ -155,7 +151,6 @@ public class AudioLocalSession {
* @param extensions List of RTP header extensions to be transmitted
*/
public void sendHeaderExtension(final List<RtpHeaderExtension> extensions) {
- Log.d(TAG, "sendHeaderExtension, extension=" + extensions);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_SEND_RTP_HDR_EXTN);
parcel.writeInt(extensions.size());
@@ -172,7 +167,6 @@ public class AudioLocalSession {
* @param threshold media quality thresholds for various quality parameters
*/
public void setMediaQualityThreshold(final MediaQualityThreshold threshold) {
- Log.d(TAG, "setMediaQualityThreshold: " + threshold);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_SET_MEDIA_QUALITY_THRESHOLD);
if (threshold != null) {
@@ -188,7 +182,6 @@ public class AudioLocalSession {
* @param intervalMs The interval of the time in milliseconds of the rtp reception notification
*/
public void requestRtpReceptionStats(final int intervalMs) {
- Log.d(TAG, "requestRtpReceptionStats: interval=" + intervalMs);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_REQUEST_RECEPTION_STATS);
parcel.writeInt(intervalMs);
@@ -202,7 +195,6 @@ public class AudioLocalSession {
* always positive.
*/
public void adjustDelay(final int delayMs) {
- Log.d(TAG, "adjustDelay: delay=" + delayMs);
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_ADJUST_DELAY);
parcel.writeInt(delayMs);
diff --git a/service/src/com/android/telephony/imsmedia/AudioOffloadService.java b/service/src/com/android/telephony/imsmedia/AudioOffloadService.java
index c18f1e3e..f7ba4fb9 100644
--- a/service/src/com/android/telephony/imsmedia/AudioOffloadService.java
+++ b/service/src/com/android/telephony/imsmedia/AudioOffloadService.java
@@ -24,9 +24,9 @@ import android.hardware.radio.ims.media.RtpConfig;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.telephony.imsmedia.AudioConfig;
-import android.util.Log;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
/**
* This connects to IImsMedia HAL and invokes all the HAL APIs
diff --git a/service/src/com/android/telephony/imsmedia/AudioService.java b/service/src/com/android/telephony/imsmedia/AudioService.java
index 7cebf901..e84509e8 100644
--- a/service/src/com/android/telephony/imsmedia/AudioService.java
+++ b/service/src/com/android/telephony/imsmedia/AudioService.java
@@ -19,9 +19,9 @@ package com.android.telephony.imsmedia;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.telephony.imsmedia.ImsMediaSession;
-import android.util.Log;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
/**
* Audio service for internal AP based RTP stack. This interacts with native library
@@ -90,9 +90,6 @@ public class AudioService {
return ImsMediaSession.RESULT_INVALID_PARAM;
}
- Log.d(LOG_TAG, "openSession: sessionId = " + sessionId
- + "," + sessionParams.getRtpConfig());
-
JNIImsMediaService.setListener(sessionId, mListener);
final int socketFdRtp = rtpSockFd.detachFd();
@@ -118,7 +115,7 @@ public class AudioService {
* @param sessionId RTP session to be closed.
*/
public void closeSession(final int sessionId) {
- Log.d(LOG_TAG, "closeSession");
+ Log.dc(LOG_TAG, "closeSession");
Parcel parcel = Parcel.obtain();
parcel.writeInt(AudioSession.CMD_CLOSE_SESSION);
sendRequest(sessionId, parcel);
diff --git a/service/src/com/android/telephony/imsmedia/AudioSession.java b/service/src/com/android/telephony/imsmedia/AudioSession.java
index cdac749a..32085303 100644
--- a/service/src/com/android/telephony/imsmedia/AudioSession.java
+++ b/service/src/com/android/telephony/imsmedia/AudioSession.java
@@ -30,14 +30,14 @@ import android.telephony.imsmedia.IImsAudioSessionCallback;
import android.telephony.imsmedia.ImsMediaSession;
import android.telephony.imsmedia.MediaQualityStatus;
import android.telephony.imsmedia.MediaQualityThreshold;
-import android.telephony.imsmedia.RtpReceptionStats;
-import android.util.Log;
import android.telephony.imsmedia.RtpConfig;
+import android.telephony.imsmedia.RtpReceptionStats;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
import java.util.List;
import java.util.stream.Collectors;
@@ -167,7 +167,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
@Override
public void modifySession(AudioConfig config) {
- Log.d(TAG, "modifySession: " + config);
+ Log.d(TAG, "modifySession: " + Log.hidePii(String.valueOf(config)));
Utils.sendMessage(mHandler, CMD_MODIFY_SESSION, config);
WakeLockManager.getInstance().manageWakeLockOnMediaDirectionUpdate(
mSessionId, config.getMediaDirection());
@@ -175,48 +175,48 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
@Override
public void addConfig(AudioConfig config) {
- Log.d(TAG, "addConfig: " + config);
+ Log.d(TAG, "addConfig: " + Log.hidePii(String.valueOf(config)));
Utils.sendMessage(mHandler, CMD_ADD_CONFIG, config);
}
@Override
public void deleteConfig(AudioConfig config) {
- Log.d(TAG, "deleteConfig: " + config);
+ Log.d(TAG, "deleteConfig: " + Log.hidePii(String.valueOf(config)));
Utils.sendMessage(mHandler, CMD_DELETE_CONFIG, config);
}
@Override
public void confirmConfig(AudioConfig config) {
- Log.d(TAG, "confirmConfig: " + config);
+ Log.d(TAG, "confirmConfig: " + Log.hidePii(String.valueOf(config)));
Utils.sendMessage(mHandler, CMD_CONFIRM_CONFIG, config);
}
@Override
public void sendDtmf(char digit, int duration) {
- Log.d(TAG, "sendDtmf: digit=" + digit + ",duration=" + duration);
+ Log.dc(TAG, "sendDtmf: digit=" + digit + ",duration=" + duration);
Utils.sendMessage(mHandler, CMD_SEND_DTMF, duration, Utils.UNUSED, digit);
}
@Override
public void startDtmf(char digit) {
- Log.d(TAG, "startDtmf: digit=" + digit);
+ Log.dc(TAG, "startDtmf: digit=" + digit);
Utils.sendMessage(mHandler, CMD_START_DTMF, digit);
}
@Override
public void stopDtmf() {
- Log.d(TAG, "stopDtmf");
+ Log.dc(TAG, "stopDtmf");
Utils.sendMessage(mHandler, CMD_STOP_DTMF);
}
@Override
public void sendHeaderExtension(List<RtpHeaderExtension> extensions) {
- Log.d(TAG, "sendHeaderExtension");
+ Log.d(TAG, "sendHeaderExtension" + Log.hidePii(String.valueOf(extensions)));
Utils.sendMessage(mHandler, CMD_SEND_RTP_HDR_EXTN, extensions);
}
@Override
public void setMediaQualityThreshold(MediaQualityThreshold threshold) {
- Log.d(TAG, "setMediaQualityThreshold: " + threshold);
+ Log.d(TAG, "setMediaQualityThreshold: " + Log.hidePii(String.valueOf(threshold)));
Utils.sendMessage(mHandler, CMD_SET_MEDIA_QUALITY_THRESHOLD, threshold);
}
@@ -234,19 +234,16 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
@Override
public void onOpenSessionSuccess(Object session) {
- Log.d(TAG, "onOpenSessionSuccess");
Utils.sendMessage(mHandler, EVENT_OPEN_SESSION_SUCCESS, session);
}
@Override
public void onOpenSessionFailure(int error) {
- Log.d(TAG, "onOpenSessionFailure: error=" + error);
Utils.sendMessage(mHandler, EVENT_OPEN_SESSION_FAILURE, error);
}
@Override
public void onSessionClosed() {
- Log.d(TAG, "onSessionClosed");
Utils.sendMessage(mHandler, EVENT_SESSION_CLOSED);
}
@@ -264,7 +261,7 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
@Override
public void handleMessage (Message msg) {
- Log.d(TAG, "handleMessage() -" + AudioSessionHandler.this + ", " + msg.what);
+ Log.dc(TAG, "handleMessage() -" + AudioSessionHandler.this + ", " + msg.what);
switch(msg.what) {
case CMD_OPEN_SESSION:
handleOpenSession((OpenSessionParams)msg.obj);
@@ -362,7 +359,6 @@ public final class AudioSession extends IImsAudioSession.Stub implements IMediaS
}
private void handleCloseSession() {
- Log.d(TAG, "handleCloseSession");
if (isAudioOffload()) {
mOffloadService.closeSession(mSessionId);
} else {
diff --git a/service/src/com/android/telephony/imsmedia/ImsMediaApplication.java b/service/src/com/android/telephony/imsmedia/ImsMediaApplication.java
index ad6be775..f40af6c4 100644
--- a/service/src/com/android/telephony/imsmedia/ImsMediaApplication.java
+++ b/service/src/com/android/telephony/imsmedia/ImsMediaApplication.java
@@ -17,7 +17,8 @@ package com.android.telephony.imsmedia;
import android.app.Application;
import android.content.Context;
-import android.util.Log;
+
+import com.android.telephony.imsmedia.util.Log;
/**
* Extension of Application class to catch unhandled exception and release wake lock.
diff --git a/service/src/com/android/telephony/imsmedia/ImsMediaController.java b/service/src/com/android/telephony/imsmedia/ImsMediaController.java
index f99d00e4..46e77dec 100644
--- a/service/src/com/android/telephony/imsmedia/ImsMediaController.java
+++ b/service/src/com/android/telephony/imsmedia/ImsMediaController.java
@@ -33,11 +33,11 @@ import android.telephony.imsmedia.IImsVideoSessionCallback;
import android.telephony.imsmedia.ImsMediaSession;
import android.telephony.imsmedia.RtpConfig;
import android.telephony.imsmedia.VideoConfig;
-import android.util.Log;
import android.util.SparseArray;
import com.android.internal.util.DumpUtils;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -63,7 +63,7 @@ public class ImsMediaController extends Service {
IMediaSession session;
Log.d(TAG, "openSession: sessionId = " + sessionId
- + ", type=" + sessionType + "," + rtpConfig);
+ + ", type=" + sessionType + "," + Log.hidePii(String.valueOf(rtpConfig)));
synchronized (mSessions) {
switch (sessionType) {
case ImsMediaSession.SESSION_TYPE_AUDIO:
@@ -116,7 +116,7 @@ public class ImsMediaController extends Service {
public void generateVideoSprop(VideoConfig[] videoConfigList, IBinder callback) {
if (videoConfigList == null || callback == null) {
- Log.d(TAG, "[SPROP] Invalid params");
+ Log.w(TAG, "[SPROP] Invalid params");
return;
}
@@ -161,7 +161,7 @@ public class ImsMediaController extends Service {
mSessions.clear();
}
} catch (Exception e) {
- Log.d(TAG, "onUnbind: e=" + e);
+ Log.e(TAG, "onUnbind: e = " + e);
}
return true;
}
@@ -208,11 +208,13 @@ public class ImsMediaController extends Service {
public class OpenSessionCallback {
public void onOpenSessionSuccess(int sessionId, Object session) {
+ Log.d(TAG, "onOpenSessionSuccess: sessionId = " + sessionId);
getSession(sessionId).onOpenSessionSuccess(session);
}
public void onOpenSessionFailure(int sessionId, int error) {
synchronized (mSessions) {
+ Log.e(TAG, "onOpenSessionFailure: sessionId = " + sessionId + " error = " + error);
getSession(sessionId).onOpenSessionFailure(error);
mSessions.remove(sessionId);
}
@@ -225,8 +227,8 @@ public class ImsMediaController extends Service {
*/
public void onSessionClosed(int sessionId) {
synchronized (mSessions) {
- getSession(sessionId).onSessionClosed();
Log.d(TAG, "onSessionClosed: sessionId = " + sessionId);
+ getSession(sessionId).onSessionClosed();
mSessions.remove(sessionId);
if (mSessions.size() <= 0) {
diff --git a/service/src/com/android/telephony/imsmedia/JNIImsMediaService.java b/service/src/com/android/telephony/imsmedia/JNIImsMediaService.java
index ff072f66..e5c442ce 100644
--- a/service/src/com/android/telephony/imsmedia/JNIImsMediaService.java
+++ b/service/src/com/android/telephony/imsmedia/JNIImsMediaService.java
@@ -20,11 +20,12 @@ import android.content.res.AssetManager;
import android.os.Parcel;
import android.os.Process;
import android.util.ArrayMap;
-import android.util.Log;
import android.view.Surface;
import androidx.annotation.VisibleForTesting;
+import com.android.telephony.imsmedia.util.Log;
+
/** JNI interface class to send message to libimsmediajni */
public class JNIImsMediaService {
private static final String TAG = "JNIImsMediaService";
@@ -163,7 +164,7 @@ public class JNIImsMediaService {
* @return 1 if it is success to send data, -1 when it fails
*/
public static int sendData2Java(final int sessionId, final byte[] baData) {
- Log.d(TAG, "sendData2Java() - sessionId=" + sessionId);
+ Log.dc(TAG, "sendData2Java() - sessionId=" + sessionId);
JNIImsMediaListener listener = getListener(sessionId);
if (listener == null) {
Log.e(TAG, "No listener :: sessionId=" + sessionId);
diff --git a/service/src/com/android/telephony/imsmedia/TextListener.java b/service/src/com/android/telephony/imsmedia/TextListener.java
index 2c7d620c..dcb9c69d 100644
--- a/service/src/com/android/telephony/imsmedia/TextListener.java
+++ b/service/src/com/android/telephony/imsmedia/TextListener.java
@@ -19,7 +19,8 @@ package com.android.telephony.imsmedia;
import android.os.Handler;
import android.os.Parcel;
import android.telephony.imsmedia.TextConfig;
-import android.util.Log;
+
+import com.android.telephony.imsmedia.util.Log;
/**
* Text listener to process JNI messages from local AP based RTP stack
@@ -62,7 +63,7 @@ public class TextListener implements JNIImsMediaListener {
@Override
public void onMessage(final Parcel parcel) {
final int event = parcel.readInt();
- Log.d(TAG, "onMessage() -" + TextListener.this + ", event=" + event);
+ Log.dc(TAG, "onMessage() -" + TextListener.this + ", event=" + event);
switch (event) {
case TextSession.EVENT_OPEN_SESSION_SUCCESS:
final int sessionId = parcel.readInt();
diff --git a/service/src/com/android/telephony/imsmedia/TextLocalSession.java b/service/src/com/android/telephony/imsmedia/TextLocalSession.java
index f0f0ebf1..8c398939 100644
--- a/service/src/com/android/telephony/imsmedia/TextLocalSession.java
+++ b/service/src/com/android/telephony/imsmedia/TextLocalSession.java
@@ -19,7 +19,8 @@ package com.android.telephony.imsmedia;
import android.os.Parcel;
import android.telephony.imsmedia.MediaQualityThreshold;
import android.telephony.imsmedia.TextConfig;
-import android.util.Log;
+
+import com.android.telephony.imsmedia.util.Log;
/**
* Text session implementation for internal AP based RTP stack. This handles all API calls from
@@ -43,7 +44,7 @@ public class TextLocalSession {
/** Returns the unique session identifier */
public int getSessionId() {
- Log.d(TAG, "getSessionId");
+ Log.dc(TAG, "getSessionId");
return mSessionId;
}
@@ -74,7 +75,6 @@ public class TextLocalSession {
* @param config provides remote end point info and codec details
*/
public void modifySession(final TextConfig config) {
- Log.d(TAG, "modifySession: " + config);
Parcel parcel = Parcel.obtain();
parcel.writeInt(TextSession.CMD_MODIFY_SESSION);
if (config != null) {
@@ -90,7 +90,6 @@ public class TextLocalSession {
* @param threshold media quality thresholds for various quality parameters
*/
public void setMediaQualityThreshold(final MediaQualityThreshold threshold) {
- Log.d(TAG, "setMediaQualityThreshold: " + threshold);
Parcel parcel = Parcel.obtain();
parcel.writeInt(TextSession.CMD_SET_MEDIA_QUALITY_THRESHOLD);
if (threshold != null) {
@@ -105,7 +104,6 @@ public class TextLocalSession {
* @param text The text string
*/
public void sendRtt(String text) {
- Log.d(TAG, "sendRtt");
Parcel parcel = Parcel.obtain();
parcel.writeInt(TextSession.CMD_SEND_RTT);
parcel.writeString(text);
diff --git a/service/src/com/android/telephony/imsmedia/TextService.java b/service/src/com/android/telephony/imsmedia/TextService.java
index e7e524fd..f01f265a 100644
--- a/service/src/com/android/telephony/imsmedia/TextService.java
+++ b/service/src/com/android/telephony/imsmedia/TextService.java
@@ -19,9 +19,9 @@ package com.android.telephony.imsmedia;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.telephony.imsmedia.ImsMediaSession;
-import android.util.Log;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
/**
* Text service for internal AP based RTP stack. This interacts with native library to open/close
@@ -89,9 +89,6 @@ public class TextService {
return ImsMediaSession.RESULT_INVALID_PARAM;
}
- Log.d(LOG_TAG, "openSession: sessionId = " + sessionId
- + "," + sessionParams.getRtpConfig());
-
JNIImsMediaService.setListener(sessionId, mListener);
final int socketFdRtp = rtpSockFd.detachFd();
@@ -116,7 +113,7 @@ public class TextService {
* @param sessionId The session id to be closed.
*/
public void closeSession(final int sessionId) {
- Log.d(LOG_TAG, "closeSession");
+ Log.dc(LOG_TAG, "closeSession");
Parcel parcel = Parcel.obtain();
parcel.writeInt(TextSession.CMD_CLOSE_SESSION);
sendRequest(sessionId, parcel);
diff --git a/service/src/com/android/telephony/imsmedia/TextSession.java b/service/src/com/android/telephony/imsmedia/TextSession.java
index ff791ac9..978b9923 100644
--- a/service/src/com/android/telephony/imsmedia/TextSession.java
+++ b/service/src/com/android/telephony/imsmedia/TextSession.java
@@ -27,12 +27,12 @@ import android.telephony.imsmedia.ImsMediaSession;
import android.telephony.imsmedia.MediaQualityThreshold;
import android.telephony.imsmedia.RtpConfig;
import android.telephony.imsmedia.TextConfig;
-import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
/**
* Text session binder implementation which handles all text session APIs from the text service.
@@ -118,7 +118,7 @@ public final class TextSession extends IImsTextSession.Stub implements IMediaSes
@Override
public void modifySession(TextConfig config) {
- Log.d(TAG, "modifySession: " + config);
+ Log.d(TAG, "modifySession: " + Log.hidePii(String.valueOf(config)));
Utils.sendMessage(mHandler, CMD_MODIFY_SESSION, config);
WakeLockManager.getInstance().manageWakeLockOnMediaDirectionUpdate(
mSessionId, config.getMediaDirection());
@@ -126,31 +126,28 @@ public final class TextSession extends IImsTextSession.Stub implements IMediaSes
@Override
public void setMediaQualityThreshold(MediaQualityThreshold threshold) {
- Log.d(TAG, "setMediaQualityThreshold: " + threshold);
+ Log.d(TAG, "setMediaQualityThreshold: " + Log.hidePii(String.valueOf(threshold)));
Utils.sendMessage(mHandler, CMD_SET_MEDIA_QUALITY_THRESHOLD, threshold);
}
@Override
public void sendRtt(String text) {
- Log.d(TAG, "sendRtt: ");
+ Log.dc(TAG, "sendRtt: ");
Utils.sendMessage(mHandler, CMD_SEND_RTT, text);
}
@Override
public void onOpenSessionSuccess(Object session) {
- Log.d(TAG, "onOpenSessionSuccess");
Utils.sendMessage(mHandler, EVENT_OPEN_SESSION_SUCCESS, session);
}
@Override
public void onOpenSessionFailure(int error) {
- Log.d(TAG, "onOpenSessionFailure: error=" + error);
Utils.sendMessage(mHandler, EVENT_OPEN_SESSION_FAILURE, error);
}
@Override
public void onSessionClosed() {
- Log.d(TAG, "onSessionClosed");
Utils.sendMessage(mHandler, EVENT_SESSION_CLOSED);
}
@@ -164,7 +161,7 @@ public final class TextSession extends IImsTextSession.Stub implements IMediaSes
@Override
public void handleMessage(Message msg) {
- Log.d(TAG, "handleMessage() -" + TextSessionHandler.this + ", " + msg.what);
+ Log.dc(TAG, "handleMessage() -" + TextSessionHandler.this + ", " + msg.what);
switch (msg.what) {
case CMD_OPEN_SESSION:
handleOpenSession((OpenSessionParams) msg.obj);
@@ -214,7 +211,6 @@ public final class TextSession extends IImsTextSession.Stub implements IMediaSes
}
private void handleCloseSession() {
- Log.d(TAG, "handleCloseSession");
mTextService.closeSession(mSessionId);
}
diff --git a/service/src/com/android/telephony/imsmedia/VideoListener.java b/service/src/com/android/telephony/imsmedia/VideoListener.java
index 32122974..65d444ad 100644
--- a/service/src/com/android/telephony/imsmedia/VideoListener.java
+++ b/service/src/com/android/telephony/imsmedia/VideoListener.java
@@ -19,7 +19,8 @@ package com.android.telephony.imsmedia;
import android.os.Handler;
import android.os.Parcel;
import android.telephony.imsmedia.VideoConfig;
-import android.util.Log;
+
+import com.android.telephony.imsmedia.util.Log;
/**
* Video listener to process JNI messages from local AP based RTP stack
@@ -62,7 +63,7 @@ public class VideoListener implements JNIImsMediaListener {
@Override
public void onMessage(final Parcel parcel) {
final int event = parcel.readInt();
- Log.d(TAG, "onMessage() -" + VideoListener.this + ", event=" + event);
+ Log.dc(TAG, "onMessage() -" + VideoListener.this + ", event=" + event);
switch (event) {
case VideoSession.EVENT_OPEN_SESSION_SUCCESS:
final int sessionId = parcel.readInt();
diff --git a/service/src/com/android/telephony/imsmedia/VideoLocalSession.java b/service/src/com/android/telephony/imsmedia/VideoLocalSession.java
index 743ed8b8..d50fad00 100644
--- a/service/src/com/android/telephony/imsmedia/VideoLocalSession.java
+++ b/service/src/com/android/telephony/imsmedia/VideoLocalSession.java
@@ -20,9 +20,10 @@ import android.os.Parcel;
import android.telephony.ims.RtpHeaderExtension;
import android.telephony.imsmedia.MediaQualityThreshold;
import android.telephony.imsmedia.VideoConfig;
-import android.util.Log;
import android.view.Surface;
+import com.android.telephony.imsmedia.util.Log;
+
import java.util.List;
/** Video session implementation for internal AP based RTP stack. This handles
@@ -45,7 +46,7 @@ public class VideoLocalSession {
/** Returns the unique session identifier */
public int getSessionId() {
- Log.d(TAG, "getSessionId");
+ Log.dc(TAG, "getSessionId");
return mSessionId;
}
@@ -74,7 +75,6 @@ public class VideoLocalSession {
* @param config provides remote end point info and codec details
*/
public void modifySession(final VideoConfig config) {
- Log.d(TAG, "modifySession: " + config);
Parcel parcel = Parcel.obtain();
parcel.writeInt(VideoSession.CMD_MODIFY_SESSION);
if (config != null) {
@@ -115,7 +115,6 @@ public class VideoLocalSession {
* parameters
*/
public void setMediaQualityThreshold(final MediaQualityThreshold threshold) {
- Log.d(TAG, "setMediaQualityThreshold: " + threshold);
Parcel parcel = Parcel.obtain();
parcel.writeInt(VideoSession.CMD_SET_MEDIA_QUALITY_THRESHOLD);
if (threshold != null) {
@@ -130,7 +129,7 @@ public class VideoLocalSession {
* @param extensions List of RTP header extensions to be transmitted
*/
public void sendHeaderExtension(final List<RtpHeaderExtension> extensions) {
- Log.d(TAG, "sendHeaderExtension");
+ Log.dc(TAG, "sendHeaderExtension");
// TODO: add implementation
}
diff --git a/service/src/com/android/telephony/imsmedia/VideoService.java b/service/src/com/android/telephony/imsmedia/VideoService.java
index 395f5167..6de3a2a7 100644
--- a/service/src/com/android/telephony/imsmedia/VideoService.java
+++ b/service/src/com/android/telephony/imsmedia/VideoService.java
@@ -19,9 +19,9 @@ package com.android.telephony.imsmedia;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.telephony.imsmedia.ImsMediaSession;
-import android.util.Log;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
/**
* Video service for internal AP based RTP stack. This interacts with native library
@@ -90,9 +90,6 @@ public class VideoService {
return ImsMediaSession.RESULT_INVALID_PARAM;
}
- Log.d(LOG_TAG, "openSession: sessionId = " + sessionId
- + "," + sessionParams.getRtpConfig());
-
JNIImsMediaService.setListener(sessionId, mListener);
final int socketFdRtp = rtpSockFd.detachFd();
@@ -118,7 +115,7 @@ public class VideoService {
* @param sessionId RTP session to be closed.
*/
public void closeSession(final int sessionId) {
- Log.d(LOG_TAG, "closeSession");
+ Log.dc(LOG_TAG, "closeSession");
Parcel parcel = Parcel.obtain();
parcel.writeInt(VideoSession.CMD_CLOSE_SESSION);
sendRequest(sessionId, parcel);
diff --git a/service/src/com/android/telephony/imsmedia/VideoSession.java b/service/src/com/android/telephony/imsmedia/VideoSession.java
index e6ceefd5..2e3b6e07 100644
--- a/service/src/com/android/telephony/imsmedia/VideoSession.java
+++ b/service/src/com/android/telephony/imsmedia/VideoSession.java
@@ -28,13 +28,13 @@ import android.telephony.imsmedia.ImsMediaSession;
import android.telephony.imsmedia.MediaQualityThreshold;
import android.telephony.imsmedia.RtpConfig;
import android.telephony.imsmedia.VideoConfig;
-import android.util.Log;
import android.view.Surface;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.telephony.imsmedia.Utils.OpenSessionParams;
+import com.android.telephony.imsmedia.util.Log;
import java.util.List;
@@ -130,7 +130,7 @@ public final class VideoSession extends IImsVideoSession.Stub implements IMediaS
@Override
public void modifySession(VideoConfig config) {
- Log.d(TAG, "modifySession: " + config);
+ Log.d(TAG, "modifySession: " + Log.hidePii(String.valueOf(config)));
Utils.sendMessage(mHandler, CMD_MODIFY_SESSION, config);
WakeLockManager.getInstance().manageWakeLockOnMediaDirectionUpdate(
mSessionId, config.getMediaDirection());
@@ -138,49 +138,46 @@ public final class VideoSession extends IImsVideoSession.Stub implements IMediaS
@Override
public void setPreviewSurface(Surface surface) {
- Log.d(TAG, "setPreviewSurface: " + surface);
+ Log.dc(TAG, "setPreviewSurface: " + surface);
Utils.sendMessage(mHandler, CMD_SET_PREVIEW_SURFACE, surface);
}
@Override
public void setDisplaySurface(Surface surface) {
- Log.d(TAG, "setDisplaySurface: " + surface);
+ Log.dc(TAG, "setDisplaySurface: " + surface);
Utils.sendMessage(mHandler, CMD_SET_DISPLAY_SURFACE, surface);
}
@Override
public void sendHeaderExtension(List<RtpHeaderExtension> extensions) {
- Log.d(TAG, "sendHeaderExtension");
+ Log.d(TAG, "sendHeaderExtension" + Log.hidePii(String.valueOf(extensions)));
Utils.sendMessage(mHandler, CMD_SEND_RTP_HDR_EXTN, extensions);
}
@Override
public void setMediaQualityThreshold(MediaQualityThreshold threshold) {
- Log.d(TAG, "setMediaQualityThreshold: " + threshold);
+ Log.d(TAG, "setMediaQualityThreshold: " + Log.hidePii(String.valueOf(threshold)));
Utils.sendMessage(mHandler, CMD_SET_MEDIA_QUALITY_THRESHOLD, threshold);
}
@Override
public void requestVideoDataUsage() {
- Log.d(TAG, "requestVideoDataUsage: ");
+ Log.dc(TAG, "requestVideoDataUsage: ");
Utils.sendMessage(mHandler, CMD_REQUEST_VIDEO_DATA_USAGE);
}
@Override
public void onOpenSessionSuccess(Object session) {
- Log.d(TAG, "onOpenSessionSuccess");
Utils.sendMessage(mHandler, EVENT_OPEN_SESSION_SUCCESS, session);
}
@Override
public void onOpenSessionFailure(int error) {
- Log.d(TAG, "onOpenSessionFailure: error=" + error);
Utils.sendMessage(mHandler, EVENT_OPEN_SESSION_FAILURE, error);
}
@Override
public void onSessionClosed() {
- Log.d(TAG, "onSessionClosed");
Utils.sendMessage(mHandler, EVENT_SESSION_CLOSED);
}
@@ -194,7 +191,7 @@ public final class VideoSession extends IImsVideoSession.Stub implements IMediaS
@Override
public void handleMessage(Message msg) {
- Log.d(TAG, "handleMessage() -" + VideoSessionHandler.this + ", " + msg.what);
+ Log.dc(TAG, "handleMessage() -" + VideoSessionHandler.this + ", " + msg.what);
switch(msg.what) {
case CMD_OPEN_SESSION:
handleOpenSession((OpenSessionParams) msg.obj);
@@ -257,7 +254,6 @@ public final class VideoSession extends IImsVideoSession.Stub implements IMediaS
private void handleOpenSession(OpenSessionParams sessionParams) {
mVideoListener.setMediaCallback(sessionParams.getCallback());
- Log.d(TAG, "handleOpenSession");
int result = mVideoService.openSession(mSessionId, sessionParams);
if (result != ImsMediaSession.RESULT_SUCCESS) {
handleOpenFailure(result);
@@ -265,7 +261,6 @@ public final class VideoSession extends IImsVideoSession.Stub implements IMediaS
}
private void handleCloseSession() {
- Log.d(TAG, "handleCloseSession");
mVideoService.closeSession(mSessionId);
}
diff --git a/service/src/com/android/telephony/imsmedia/WakeLockManager.java b/service/src/com/android/telephony/imsmedia/WakeLockManager.java
index 33bfcc5c..b03ac0f0 100644
--- a/service/src/com/android/telephony/imsmedia/WakeLockManager.java
+++ b/service/src/com/android/telephony/imsmedia/WakeLockManager.java
@@ -18,10 +18,11 @@ package com.android.telephony.imsmedia;
import android.content.Context;
import android.os.PowerManager;
import android.telephony.imsmedia.RtpConfig;
-import android.util.Log;
import androidx.annotation.VisibleForTesting;
+import com.android.telephony.imsmedia.util.Log;
+
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Iterator;
@@ -133,7 +134,7 @@ public class WakeLockManager {
int sessionId, final @RtpConfig.MediaDirection int mediaDirection) {
try {
boolean wakeLockAcquired = mWakeLockAcquiredSessions.contains(sessionId);
- Log.d(TAG, "manageWakeLockOnMediaDirectionUpdate - SessionId:" + sessionId
+ Log.dc(TAG, "manageWakeLockOnMediaDirectionUpdate - SessionId:" + sessionId
+ ", mediaDirection:" + mediaDirection);
if (wakeLockAcquired && mediaDirection == RtpConfig.MEDIA_DIRECTION_NO_FLOW) {
diff --git a/service/src/com/android/telephony/imsmedia/config/ConfigPreference.java b/service/src/com/android/telephony/imsmedia/config/ConfigPreference.java
index 5374fca8..ac644179 100644
--- a/service/src/com/android/telephony/imsmedia/config/ConfigPreference.java
+++ b/service/src/com/android/telephony/imsmedia/config/ConfigPreference.java
@@ -21,13 +21,13 @@ import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
-import android.util.Log;
import android.util.SparseArray;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import com.android.telephony.imsmedia.JNIImsMediaService;
import com.android.telephony.imsmedia.R;
+import com.android.telephony.imsmedia.util.Log;
/**
* The configuration of logging and test options for the libimsmedia
@@ -98,7 +98,7 @@ public class ConfigPreference extends PreferenceActivity {
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
- Log.d(LOG_TAG, "onCreate");
+ Log.dc(LOG_TAG, "onCreate");
super.onCreate(savedInstanceState);
@@ -133,7 +133,7 @@ public class ConfigPreference extends PreferenceActivity {
@Override
public void onResume() {
super.onResume();
- Log.d(LOG_TAG, "onResume");
+ Log.dc(LOG_TAG, "onResume");
initPreferences();
}
@@ -147,9 +147,9 @@ public class ConfigPreference extends PreferenceActivity {
}
private void initPreferences() {
- Log.d(LOG_TAG, "initPreferences");
+ Log.dc(LOG_TAG, "initPreferences");
for (int i = 0; i < KEY_LIST_PREFERENCES.length; ++i) {
- Log.d(LOG_TAG, "initPreferences, key=" + KEY_LIST_PREFERENCES[i]);
+ Log.dc(LOG_TAG, "initPreferences, key=" + KEY_LIST_PREFERENCES[i]);
ListPreference itemList = (ListPreference) findPreference(KEY_LIST_PREFERENCES[i]);
mListPrefs.put(i, itemList);
if (itemList != null) {
@@ -161,7 +161,7 @@ public class ConfigPreference extends PreferenceActivity {
}
for (int i = 0; i < KEY_CHECKBOX_PREFERENCES.length; ++i) {
- Log.d(LOG_TAG, "initPreferences, key=" + KEY_CHECKBOX_PREFERENCES[i]);
+ Log.dc(LOG_TAG, "initPreferences, key=" + KEY_CHECKBOX_PREFERENCES[i]);
CheckBoxPreference check =
(CheckBoxPreference) findPreference(KEY_CHECKBOX_PREFERENCES[i]);
mCheckboxPrefs.put(i, check);
@@ -175,8 +175,9 @@ public class ConfigPreference extends PreferenceActivity {
}
}
- Log.d(LOG_TAG, "initPreferences, LogMode=" + mLogMode + ", DebugLogMode=" + mDebugLogMode);
+ Log.dc(LOG_TAG, "initPreferences, LogMode=" + mLogMode + ", DebugLogMode=" + mDebugLogMode);
JNIImsMediaService.setLogMode(mLogMode, mDebugLogMode);
+ Log.init(mLogMode);
}
private final class ConfigListItemChangeListener
@@ -189,12 +190,13 @@ public class ConfigPreference extends PreferenceActivity {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String value = newValue.toString();
- Log.d(LOG_TAG, "onPreferenceChange: key=" + preference.getKey() + ",value=" + value);
+ Log.dc(LOG_TAG, "onPreferenceChange: key=" + preference.getKey() + ",value=" + value);
ListPreference itemList = mListPrefs.valueAt(mPrefIndex);
if (itemList != null) {
mLogMode = parseInt(value, 0);
itemList.setSummary(value);
JNIImsMediaService.setLogMode(mLogMode, mDebugLogMode);
+ Log.setLogLevel(mLogMode);
}
return true;
}
@@ -210,7 +212,7 @@ public class ConfigPreference extends PreferenceActivity {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String value = newValue.toString();
- Log.d(LOG_TAG, "onPreferenceChange: key=" + preference.getKey() + ", value=" + value);
+ Log.dc(LOG_TAG, "onPreferenceChange: key=" + preference.getKey() + ", value=" + value);
boolean boolValue = Boolean.valueOf(value);
if (boolValue) {
mDebugLogMode |= DEBUG_MODE_ARRAY[mPrefIndex];
@@ -218,6 +220,7 @@ public class ConfigPreference extends PreferenceActivity {
mDebugLogMode &= ~DEBUG_MODE_ARRAY[mPrefIndex];
}
JNIImsMediaService.setLogMode(mLogMode, mDebugLogMode);
+ Log.setLogLevel(mLogMode);
return true;
}
}
diff --git a/service/src/com/android/telephony/imsmedia/util/Log.java b/service/src/com/android/telephony/imsmedia/util/Log.java
new file mode 100644
index 00000000..6e317f7d
--- /dev/null
+++ b/service/src/com/android/telephony/imsmedia/util/Log.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2024 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.telephony.imsmedia.util;
+
+import android.annotation.IntDef;
+import android.os.Build;
+import android.support.annotation.VisibleForTesting;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * This class provides the logging interface and utility methods
+ * that will be helpful when adding the log statement.
+ */
+public final class Log {
+ public static final String TAG = "Log";
+ public static final String HIDDEN = "****";
+ public static final String EMPTY = "(empty)";
+ public static final String NULL = "(null)";
+ /**
+ * Logging options.
+ */
+
+ /**
+ * Priority Level constant for Logging all level logs; use Log.v.
+ */
+ public static final int LOG_LEVEL_ALL = 0;
+
+ /**
+ * Priority Level constant for Logging Verbose logs; use Log.v.
+ */
+ public static final int LOG_LEVEL_VERBOSE = 1;
+
+ /**
+ * Priority Level constant for Logging debug logs; use Log.d.
+ */
+ public static final int LOG_LEVEL_DEBUG = 2;
+
+ /**
+ * Priority Level constant for Logging Info logs; use Log.i.
+ */
+ public static final int LOG_LEVEL_INFO = 3;
+
+ /**
+ * Priority Level constant for Logging Warning logs; use Log.w.
+ */
+ public static final int LOG_LEVEL_WARN = 4;
+
+ /**
+ * Priority Level constant for Logging Error logs; use Log.e.
+ */
+ public static final int LOG_LEVEL_ERROR = 5;
+
+ /** @hide */
+ @IntDef(
+ value = {
+ LOG_LEVEL_ALL,
+ LOG_LEVEL_VERBOSE,
+ LOG_LEVEL_DEBUG,
+ LOG_LEVEL_INFO,
+ LOG_LEVEL_WARN,
+ LOG_LEVEL_ERROR
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface LogLevel {}
+
+ // all levels(V / D / I / W / E)
+ public static final int DEFAULT_LOG_LEVEL = LOG_LEVEL_ALL;
+
+ private static int sDebug = -1;
+ private static int sLogLevel = LOG_LEVEL_ALL;
+
+ static {
+ if (Build.IS_DEBUGGABLE) {
+ sDebug = 1;
+ init(DEFAULT_LOG_LEVEL);
+ Log.d(TAG, "All logs are enabled");
+ } else {
+ init(LOG_LEVEL_DEBUG);
+ Log.d(TAG, "Verbose logs are disabled");
+ }
+ }
+
+ /**
+ * Initializes the logging configuration.
+ *
+ * @param logLevel A logging priority level.
+ */
+ public static void init(@LogLevel int logLevel) {
+ setLogLevel(logLevel);
+ }
+
+ /**
+ * Returns whether the debug mode is enabled or not.
+ */
+ public static boolean isDebuggable() {
+ if (sDebug == 1) {
+ return true;
+ } else if (sDebug == -1) {
+ return isLoggable(android.util.Log.DEBUG);
+ }
+
+ return false;
+ }
+
+ /**
+ * Checks whether android logging is enabled for the given log level.
+ *
+ * @param level log level
+ */
+ public static boolean isLoggable(int level) {
+ return android.util.Log.isLoggable(TAG, level);
+ }
+
+ /** Sets the debug mode from the specified flag. */
+ @VisibleForTesting
+ static void setDebuggable(boolean enableDebug) {
+ sDebug = enableDebug ? 1 : 0;
+ }
+
+ /** Returns the log Level. */
+ @VisibleForTesting
+ static int getLogLevel() {
+ return sLogLevel;
+ }
+
+ /** Sets the log Level. */
+ public static void setLogLevel(@LogLevel int logLevel) {
+ sLogLevel = logLevel;
+ }
+
+ /** Checks whether ImsMedia logging is enabled or not for given level. */
+ @VisibleForTesting
+ static boolean isLogEnabled(@LogLevel int level) {
+ if (sLogLevel == LOG_LEVEL_ALL) {
+ // All logs are available as default.
+ return true;
+ }
+ return sLogLevel <= level;
+ }
+
+ /**
+ * Prints the verbose level log.
+ */
+ public static void v(String tag, String msg) {
+ if (isLogEnabled(LOG_LEVEL_VERBOSE)) {
+ android.util.Log.v(tag, msg);
+ }
+ }
+
+ /**
+ * Prints the debug level log.
+ */
+ public static void d(String tag, String msg) {
+ if (isLogEnabled(LOG_LEVEL_DEBUG)) {
+ android.util.Log.d(tag, msg);
+ }
+ }
+
+ /**
+ * Prints the debug level log when the debug mode is enabled.
+ */
+ public static void dc(String tag, String msg) {
+ if (isDebuggable()) {
+ d(tag, msg);
+ }
+ }
+
+ /**
+ * Prints the information level log.
+ */
+ public static void i(String tag, String msg) {
+ if (isLogEnabled(LOG_LEVEL_INFO)) {
+ android.util.Log.i(tag, msg);
+ }
+ }
+
+ /**
+ * Prints the warning level log.
+ */
+ public static void w(String tag, String msg) {
+ if (isLogEnabled(LOG_LEVEL_WARN)) {
+ android.util.Log.w(tag, msg);
+ }
+ }
+
+ /**
+ * Prints the error level log.
+ */
+ public static void e(String tag, String msg) {
+ if (isLogEnabled(LOG_LEVEL_ERROR)) {
+ android.util.Log.e(tag, msg);
+ }
+ }
+
+ /**
+ * Prints the error level log.
+ */
+ public static void e(String tag, String msg, Throwable t) {
+ if (isLogEnabled(LOG_LEVEL_ERROR)) {
+ android.util.Log.e(tag, msg, t);
+ }
+ }
+
+ /**
+ * Hides personal identifiable information logging string if debug mode is disabled.
+ *
+ * @param msg logging string
+ * @return hidden string if debug mode is disabled. Original string otherwise.
+ */
+ public static String hidePii(String msg) {
+ if (msg == null) {
+ return NULL;
+ } else if (msg.isEmpty()) {
+ return EMPTY;
+ } else if (isDebuggable()) {
+ return msg;
+ }
+
+ return HIDDEN;
+ }
+
+}
diff --git a/tests/unit/src/com/android/telephony/imsmedia/util/LogTest.java b/tests/unit/src/com/android/telephony/imsmedia/util/LogTest.java
new file mode 100644
index 00000000..cd48550f
--- /dev/null
+++ b/tests/unit/src/com/android/telephony/imsmedia/util/LogTest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2024 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.telephony.imsmedia.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class LogTest {
+
+ private static final String TAG = "LogTest";
+ private static final String LOG_TEST_MESSAGE = "LogTestMessage";
+
+ @Test
+ @SmallTest
+ public void testInit() {
+ int logLevel = Log.DEFAULT_LOG_LEVEL;
+ Log.init(logLevel);
+ assertEquals(Log.DEFAULT_LOG_LEVEL, Log.getLogLevel());
+
+ logLevel = Log.LOG_LEVEL_DEBUG;
+ Log.init(logLevel);
+ assertEquals(Log.LOG_LEVEL_DEBUG, Log.getLogLevel());
+ }
+
+ @Test
+ @SmallTest
+ public void logLevels() throws Exception {
+
+ Exception throwable = null;
+
+ try {
+ throw new Exception();
+ } catch (Exception e) {
+ throwable = e;
+ }
+
+ // Checks the logs in the logcat.
+ Log.v(TAG, LOG_TEST_MESSAGE + ": v");
+ Log.d(TAG, LOG_TEST_MESSAGE + ": d");
+ Log.i(TAG, LOG_TEST_MESSAGE + ": i");
+ Log.w(TAG, LOG_TEST_MESSAGE + ": w");
+ Log.e(TAG, LOG_TEST_MESSAGE + ": e");
+ Log.e(TAG, LOG_TEST_MESSAGE + ": e with exception", throwable);
+ }
+
+ @Test
+ @SmallTest
+ public void debugConditional() throws Exception {
+ // when debug mode is enabled
+ Log.setDebuggable(true);
+ Log.dc(TAG, LOG_TEST_MESSAGE);
+
+ // when debug mode is disabled
+ Log.setDebuggable(false);
+ Log.dc(TAG, LOG_TEST_MESSAGE + ": debug conditional");
+ }
+
+ @Test
+ @SmallTest
+ public void setDebuggable() throws Exception {
+ Log.setDebuggable(false);
+ assertFalse(Log.isDebuggable());
+
+ Log.setDebuggable(true);
+ assertTrue(Log.isDebuggable());
+ }
+
+ @Test
+ @SmallTest
+ public void setLogLevel() throws Exception {
+ Log.setLogLevel(Log.LOG_LEVEL_INFO);
+ assertFalse(Log.isLogEnabled(Log.LOG_LEVEL_VERBOSE));
+ assertFalse(Log.isLogEnabled(Log.LOG_LEVEL_DEBUG));
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_INFO));
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_WARN));
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_ERROR));
+
+ Log.setLogLevel(Log.DEFAULT_LOG_LEVEL);
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_VERBOSE));
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_DEBUG));
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_INFO));
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_WARN));
+ assertTrue(Log.isLogEnabled(Log.LOG_LEVEL_ERROR));
+ }
+
+ @Test
+ @SmallTest
+ public void hidePii() throws Exception {
+ // when debug mode is enabled
+ Log.setDebuggable(true);
+ String hiddenLogMessage;
+
+ hiddenLogMessage = Log.hidePii(null);
+ assertEquals(Log.NULL, hiddenLogMessage);
+
+ hiddenLogMessage = Log.hidePii("");
+ assertEquals(Log.EMPTY, hiddenLogMessage);
+
+ hiddenLogMessage = Log.hidePii(LOG_TEST_MESSAGE);
+ assertEquals(LOG_TEST_MESSAGE, hiddenLogMessage);
+
+ // when debug mode is disabled
+ Log.setDebuggable(false);
+
+ hiddenLogMessage = Log.hidePii(null);
+ assertEquals(Log.NULL, hiddenLogMessage);
+
+ hiddenLogMessage = Log.hidePii("");
+ assertEquals(Log.EMPTY, hiddenLogMessage);
+
+ hiddenLogMessage = Log.hidePii(LOG_TEST_MESSAGE);
+ assertEquals(Log.HIDDEN, hiddenLogMessage);
+ }
+}