Loading src/com/android/server/telecom/Analytics.java +19 −0 Original line number Diff line number Diff line Loading @@ -208,6 +208,9 @@ public class Analytics { public void setCallSource(int callSource) { } public void setMissedReason(long missedReason) { } } /** Loading Loading @@ -242,6 +245,7 @@ public class Analytics { public List<TelecomLogClass.InCallServiceInfo> inCallServiceInfos; public int callProperties = 0; public int callSource = CALL_SOURCE_UNSPECIFIED; public long missedReason; private long mTimeOfLastVideoEvent = -1; Loading @@ -254,6 +258,7 @@ public class Analytics { connectionService = ""; videoEvents = new LinkedList<>(); inCallServiceInfos = new LinkedList<>(); missedReason = 0; } CallInfoImpl(CallInfoImpl other) { Loading @@ -272,6 +277,7 @@ public class Analytics { this.videoEvents = other.videoEvents; this.callProperties = other.callProperties; this.callSource = other.callSource; this.missedReason = other.missedReason; if (other.callTerminationReason != null) { this.callTerminationReason = new DisconnectCause( Loading Loading @@ -341,6 +347,13 @@ public class Analytics { this.connectionService = connectionServiceName; } @Override public void setMissedReason(long missedReason) { Log.d(TAG, "setting missedReason for call " + callId + ": " + missedReason); this.missedReason = missedReason; } @Override public void setCallEvents(EventManager.EventRecord records) { this.callEvents = records; Loading Loading @@ -399,6 +412,7 @@ public class Analytics { + " isEmergency: " + isEmergency + '\n' + " callTechnologies: " + getCallTechnologiesAsString() + '\n' + " callTerminationReason: " + getCallDisconnectReasonString() + '\n' + " missedReason: " + getMissedReasonString() + '\n' + " connectionService: " + connectionService + '\n' + " isVideoCall: " + isVideo + '\n' + " inCallServices: " + getInCallServicesString() + '\n' Loading Loading @@ -526,6 +540,11 @@ public class Analytics { } } private String getMissedReasonString() { //TODO: Implement this return null; } private String getInCallServicesString() { StringBuilder s = new StringBuilder(); s.append("[\n"); Loading src/com/android/server/telecom/Call.java +32 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.telecom; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; Loading @@ -33,6 +35,7 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.provider.CallLog; import android.provider.ContactsContract.Contacts; import android.telecom.CallAudioState; import android.telecom.CallerInfo; Loading Loading @@ -588,7 +591,7 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, /** * Indicates whether this call is using one of the * {@link com.android.server.telecom.callfiltering.IncomingCallFilter.CallFilter} modules. * {@link com.android.server.telecom.callfiltering.CallFilter} modules. */ private boolean mIsUsingCallFiltering = false; Loading @@ -610,6 +613,16 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, */ private String mPostCallPackageName; /** * Call missed information code. */ @CallLog.Calls.MissedReason private long mMissedReason; /** * Time that this call start ringing or simulated ringing. */ private long mStartRingTime; /** * Persists the specified parameters and initializes the new instance. * @param context The context. Loading Loading @@ -692,6 +705,8 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, mClockProxy = clockProxy; mToastFactory = toastFactory; mCreationTimeMillis = mClockProxy.currentTimeMillis(); mMissedReason = MISSED_REASON_NOT_MISSED; mStartRingTime = 0; } /** Loading Loading @@ -3870,4 +3885,20 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, public String getPostCallPackageName() { return mPostCallPackageName; } public long getMissedReason() { return mMissedReason; } public void setMissedReason(long missedReason) { mMissedReason = missedReason; } public long getStartRingTime() { return mStartRingTime; } public void setStartRingTime(long startRingTime) { mStartRingTime = startRingTime; } } src/com/android/server/telecom/CallLogManager.java +18 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.telecom; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import static android.telephony.CarrierConfigManager.KEY_SUPPORT_IMS_CONFERENCE_EVENT_PACKAGE_BOOL; import android.annotation.Nullable; Loading Loading @@ -84,7 +85,8 @@ public final class CallLogManager extends CallsManagerListenerBase { int features, PhoneAccountHandle accountHandle, long creationDate, long durationInMillis, Long dataUsage, UserHandle initiatingUser, boolean isRead, @Nullable LogCallCompletedListener logCallCompletedListener, int callBlockReason, CharSequence callScreeningAppName, String callScreeningComponentName) { CharSequence callScreeningAppName, String callScreeningComponentName, long missedReason) { this.context = context; this.callerInfo = callerInfo; this.number = number; Loading @@ -103,6 +105,7 @@ public final class CallLogManager extends CallsManagerListenerBase { this.callBockReason = callBlockReason; this.callScreeningAppName = callScreeningAppName; this.callScreeningComponentName = callScreeningComponentName; this.missedReason = missedReason; } // Since the members are accessed directly, we don't use the // mXxxx notation. Loading @@ -127,6 +130,7 @@ public final class CallLogManager extends CallsManagerListenerBase { public final int callBockReason; public final CharSequence callScreeningAppName; public final String callScreeningComponentName; public final long missedReason; } private static final String TAG = CallLogManager.class.getSimpleName(); Loading Loading @@ -353,20 +357,25 @@ public final class CallLogManager extends CallsManagerListenerBase { call.wasEverRttCall(), call.wasVolte()); if (callLogType == Calls.BLOCKED_TYPE) { if (result == null) { // Call auto missed before filtered result = new CallFilteringResult.Builder().build(); } if (callLogType == Calls.BLOCKED_TYPE || callLogType == Calls.MISSED_TYPE) { logCall(call.getCallerInfo(), logNumber, call.getPostDialDigits(), formattedViaNumber, call.getHandlePresentation(), callLogType, callFeatures, accountHandle, creationTime, age, callDataUsage, call.isEmergencyCall(), call.getInitiatingUser(), call.isSelfManaged(), logCallCompletedListener, result.mCallBlockReason, result.mCallScreeningAppName, result.mCallScreeningComponentName); result.mCallScreeningComponentName, call.getMissedReason()); } else { logCall(call.getCallerInfo(), logNumber, call.getPostDialDigits(), formattedViaNumber, call.getHandlePresentation(), callLogType, callFeatures, accountHandle, creationTime, age, callDataUsage, call.isEmergencyCall(), call.getInitiatingUser(), call.isSelfManaged(), logCallCompletedListener, Calls.BLOCK_REASON_NOT_BLOCKED, null /*callScreeningAppName*/, null /*callScreeningComponentName*/); null /*callScreeningComponentName*/, call.getMissedReason()); } } Loading @@ -390,6 +399,7 @@ public final class CallLogManager extends CallsManagerListenerBase { * @param callBlockReason The reason why the call is blocked. * @param callScreeningAppName The call screening application name which block the call. * @param callScreeningComponentName The call screening component name which block the call. * @param missedReason The encoded information about reasons for missed call. */ private void logCall( CallerInfo callerInfo, Loading @@ -409,7 +419,8 @@ public final class CallLogManager extends CallsManagerListenerBase { @Nullable LogCallCompletedListener logCallCompletedListener, int callBlockReason, CharSequence callScreeningAppName, String callScreeningComponentName) { String callScreeningComponentName, long missedReason) { // On some devices, to avoid accidental redialing of emergency numbers, we *never* log // emergency calls to the Call Log. (This behavior is set on a per-product basis, based Loading Loading @@ -443,7 +454,7 @@ public final class CallLogManager extends CallsManagerListenerBase { AddCallArgs args = new AddCallArgs(mContext, callerInfo, number, postDialDigits, viaNumber, presentation, callType, features, accountHandle, start, duration, dataUsage, initiatingUser, isRead, logCallCompletedListener, callBlockReason, callScreeningAppName, callScreeningComponentName); callScreeningAppName, callScreeningComponentName, missedReason); logCallAsync(args); } else { Log.d(TAG, "Not adding emergency call to call log."); Loading Loading @@ -596,7 +607,7 @@ public final class CallLogManager extends CallsManagerListenerBase { c.presentation, c.callType, c.features, c.accountHandle, c.timestamp, c.durationInSec, c.dataUsage, userToBeInserted == null, userToBeInserted, c.isRead, c.callBockReason, c.callScreeningAppName, c.callScreeningComponentName); c.callScreeningComponentName, c.missedReason); } Loading src/com/android/server/telecom/CallsManager.java +22 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.telecom; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import static android.telecom.TelecomManager.ACTION_POST_CALL; import static android.telecom.TelecomManager.DURATION_LONG; import static android.telecom.TelecomManager.DURATION_MEDIUM; Loading @@ -27,6 +28,9 @@ import static android.telecom.TelecomManager.EXTRA_HANDLE; import static android.telecom.TelecomManager.MEDIUM_CALL_TIME_MS; import static android.telecom.TelecomManager.SHORT_CALL_TIME_MS; import static android.telecom.TelecomManager.VERY_SHORT_CALL_TIME_MS; import static android.provider.CallLog.Calls.AUTO_MISSED_EMERGENCY_CALL; import static android.provider.CallLog.Calls.AUTO_MISSED_MAXIMUM_DIALING; import static android.provider.CallLog.Calls.AUTO_MISSED_MAXIMUM_RINGING; import android.Manifest; import android.annotation.NonNull; Loading Loading @@ -738,6 +742,7 @@ public class CallsManager extends Call.ListenerBase // Only set the incoming call as ringing if it isn't already disconnected. It is possible // that the connection service disconnected the call before it was even added to Telecom, in // which case it makes no sense to set it back to a ringing state. Log.i(this, "onCallFilteringComplete"); mGraphHandlerThreads.clear(); if (incomingCall.getState() != CallState.DISCONNECTED && Loading @@ -759,16 +764,17 @@ public class CallsManager extends Call.ListenerBase } else { Log.i(this, "onCallFilteringCompleted: Call rejected! " + "Exceeds maximum number of ringing calls."); rejectCallAndLog(incomingCall, result); incomingCall.setMissedReason(AUTO_MISSED_MAXIMUM_RINGING); autoMissCallAndLog(incomingCall, result); } } else if (hasMaximumManagedDialingCalls(incomingCall)) { if (shouldSilenceInsteadOfReject(incomingCall)) { incomingCall.silence(); } else { Log.i(this, "onCallFilteringCompleted: Call rejected! Exceeds maximum number of " + "dialing calls."); rejectCallAndLog(incomingCall, result); incomingCall.setMissedReason(AUTO_MISSED_MAXIMUM_DIALING); autoMissCallAndLog(incomingCall, result); } } else if (result.shouldScreenViaAudio) { Log.i(this, "onCallFilteringCompleted: starting background audio processing"); Loading Loading @@ -1322,12 +1328,18 @@ public class CallsManager extends Call.ListenerBase if (isConference) { notifyCreateConferenceFailed(phoneAccountHandle, call); } else { if (hasMaximumManagedRingingCalls(call)) { call.setMissedReason(AUTO_MISSED_MAXIMUM_RINGING); mCallLogManager.logCall(call, Calls.MISSED_TYPE, true /*showNotificationForMissedCall*/, null /*CallFilteringResult*/); } notifyCreateConnectionFailed(phoneAccountHandle, call); } } else if (isInEmergencyCall()) { // The incoming call is implicitly being rejected so the user does not get any incoming // call UI during an emergency call. In this case, log the call as missed instead of // rejected since the user did not explicitly reject. call.setMissedReason(AUTO_MISSED_EMERGENCY_CALL); mCallLogManager.logCall(call, Calls.MISSED_TYPE, true /*showNotificationForMissedCall*/, null /*CallFilteringResult*/); if (isConference) { Loading Loading @@ -3435,7 +3447,8 @@ public class CallsManager extends Call.ListenerBase * Reject an incoming call and manually add it to the Call Log. * @param incomingCall Incoming call that has been rejected */ private void rejectCallAndLog(Call incomingCall, CallFilteringResult result) { private void autoMissCallAndLog(Call incomingCall, CallFilteringResult result) { incomingCall.getAnalytics().setMissedReason(incomingCall.getMissedReason()); if (incomingCall.getConnectionService() != null) { // Only reject the call if it has not already been destroyed. If a call ends while // incoming call filtering is taking place, it is possible that the call has already Loading Loading @@ -3573,6 +3586,10 @@ public class CallsManager extends Call.ListenerBase (newState == CallState.DISCONNECTED)) { maybeSendPostCallScreenIntent(call); } if (((newState == CallState.ABORTED) || (newState == CallState.DISCONNECTED)) && (call.getDisconnectCause().getCode() != DisconnectCause.MISSED)) { call.setMissedReason(MISSED_REASON_NOT_MISSED); } maybeShowErrorDialogOnDisconnect(call); Trace.beginSection("onCallStateChanged"); Loading Loading @@ -4729,6 +4746,7 @@ public class CallsManager extends Call.ListenerBase * @param call The {@link Call} which could not be added. */ private void notifyCreateConnectionFailed(PhoneAccountHandle phoneAccountHandle, Call call) { call.getAnalytics().setMissedReason(call.getMissedReason()); if (phoneAccountHandle == null) { return; } Loading tests/src/com/android/server/telecom/tests/AnalyticsTests.java +6 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.telecom.tests; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; Loading Loading @@ -127,7 +129,8 @@ public class AnalyticsTests extends TelecomSystemTest { Analytics.dump(ip); String dumpResult = sr.toString(); String[] expectedFields = {"startTime", "endTime", "direction", "isAdditionalCall", "isInterrupted", "callTechnologies", "callTerminationReason", "connectionService"}; "isInterrupted", "callTechnologies", "callTerminationReason", "connectionService", "missedReason"}; for (String field : expectedFields) { assertTrue(dumpResult.contains(field)); } Loading Loading @@ -200,6 +203,8 @@ public class AnalyticsTests extends TelecomSystemTest { assertTrue(callAnalytics2.startTime > 0); assertEquals(0, callAnalytics1.endTime); assertEquals(0, callAnalytics2.endTime); assertEquals(MISSED_REASON_NOT_MISSED, callAnalytics1.missedReason); assertEquals(MISSED_REASON_NOT_MISSED, callAnalytics2.missedReason); assertEquals(Analytics.INCOMING_DIRECTION, callAnalytics1.callDirection); assertEquals(Analytics.OUTGOING_DIRECTION, callAnalytics2.callDirection); Loading Loading
src/com/android/server/telecom/Analytics.java +19 −0 Original line number Diff line number Diff line Loading @@ -208,6 +208,9 @@ public class Analytics { public void setCallSource(int callSource) { } public void setMissedReason(long missedReason) { } } /** Loading Loading @@ -242,6 +245,7 @@ public class Analytics { public List<TelecomLogClass.InCallServiceInfo> inCallServiceInfos; public int callProperties = 0; public int callSource = CALL_SOURCE_UNSPECIFIED; public long missedReason; private long mTimeOfLastVideoEvent = -1; Loading @@ -254,6 +258,7 @@ public class Analytics { connectionService = ""; videoEvents = new LinkedList<>(); inCallServiceInfos = new LinkedList<>(); missedReason = 0; } CallInfoImpl(CallInfoImpl other) { Loading @@ -272,6 +277,7 @@ public class Analytics { this.videoEvents = other.videoEvents; this.callProperties = other.callProperties; this.callSource = other.callSource; this.missedReason = other.missedReason; if (other.callTerminationReason != null) { this.callTerminationReason = new DisconnectCause( Loading Loading @@ -341,6 +347,13 @@ public class Analytics { this.connectionService = connectionServiceName; } @Override public void setMissedReason(long missedReason) { Log.d(TAG, "setting missedReason for call " + callId + ": " + missedReason); this.missedReason = missedReason; } @Override public void setCallEvents(EventManager.EventRecord records) { this.callEvents = records; Loading Loading @@ -399,6 +412,7 @@ public class Analytics { + " isEmergency: " + isEmergency + '\n' + " callTechnologies: " + getCallTechnologiesAsString() + '\n' + " callTerminationReason: " + getCallDisconnectReasonString() + '\n' + " missedReason: " + getMissedReasonString() + '\n' + " connectionService: " + connectionService + '\n' + " isVideoCall: " + isVideo + '\n' + " inCallServices: " + getInCallServicesString() + '\n' Loading Loading @@ -526,6 +540,11 @@ public class Analytics { } } private String getMissedReasonString() { //TODO: Implement this return null; } private String getInCallServicesString() { StringBuilder s = new StringBuilder(); s.append("[\n"); Loading
src/com/android/server/telecom/Call.java +32 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.telecom; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; Loading @@ -33,6 +35,7 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.Trace; import android.os.UserHandle; import android.provider.CallLog; import android.provider.ContactsContract.Contacts; import android.telecom.CallAudioState; import android.telecom.CallerInfo; Loading Loading @@ -588,7 +591,7 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, /** * Indicates whether this call is using one of the * {@link com.android.server.telecom.callfiltering.IncomingCallFilter.CallFilter} modules. * {@link com.android.server.telecom.callfiltering.CallFilter} modules. */ private boolean mIsUsingCallFiltering = false; Loading @@ -610,6 +613,16 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, */ private String mPostCallPackageName; /** * Call missed information code. */ @CallLog.Calls.MissedReason private long mMissedReason; /** * Time that this call start ringing or simulated ringing. */ private long mStartRingTime; /** * Persists the specified parameters and initializes the new instance. * @param context The context. Loading Loading @@ -692,6 +705,8 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, mClockProxy = clockProxy; mToastFactory = toastFactory; mCreationTimeMillis = mClockProxy.currentTimeMillis(); mMissedReason = MISSED_REASON_NOT_MISSED; mStartRingTime = 0; } /** Loading Loading @@ -3870,4 +3885,20 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, public String getPostCallPackageName() { return mPostCallPackageName; } public long getMissedReason() { return mMissedReason; } public void setMissedReason(long missedReason) { mMissedReason = missedReason; } public long getStartRingTime() { return mStartRingTime; } public void setStartRingTime(long startRingTime) { mStartRingTime = startRingTime; } }
src/com/android/server/telecom/CallLogManager.java +18 −7 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.telecom; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import static android.telephony.CarrierConfigManager.KEY_SUPPORT_IMS_CONFERENCE_EVENT_PACKAGE_BOOL; import android.annotation.Nullable; Loading Loading @@ -84,7 +85,8 @@ public final class CallLogManager extends CallsManagerListenerBase { int features, PhoneAccountHandle accountHandle, long creationDate, long durationInMillis, Long dataUsage, UserHandle initiatingUser, boolean isRead, @Nullable LogCallCompletedListener logCallCompletedListener, int callBlockReason, CharSequence callScreeningAppName, String callScreeningComponentName) { CharSequence callScreeningAppName, String callScreeningComponentName, long missedReason) { this.context = context; this.callerInfo = callerInfo; this.number = number; Loading @@ -103,6 +105,7 @@ public final class CallLogManager extends CallsManagerListenerBase { this.callBockReason = callBlockReason; this.callScreeningAppName = callScreeningAppName; this.callScreeningComponentName = callScreeningComponentName; this.missedReason = missedReason; } // Since the members are accessed directly, we don't use the // mXxxx notation. Loading @@ -127,6 +130,7 @@ public final class CallLogManager extends CallsManagerListenerBase { public final int callBockReason; public final CharSequence callScreeningAppName; public final String callScreeningComponentName; public final long missedReason; } private static final String TAG = CallLogManager.class.getSimpleName(); Loading Loading @@ -353,20 +357,25 @@ public final class CallLogManager extends CallsManagerListenerBase { call.wasEverRttCall(), call.wasVolte()); if (callLogType == Calls.BLOCKED_TYPE) { if (result == null) { // Call auto missed before filtered result = new CallFilteringResult.Builder().build(); } if (callLogType == Calls.BLOCKED_TYPE || callLogType == Calls.MISSED_TYPE) { logCall(call.getCallerInfo(), logNumber, call.getPostDialDigits(), formattedViaNumber, call.getHandlePresentation(), callLogType, callFeatures, accountHandle, creationTime, age, callDataUsage, call.isEmergencyCall(), call.getInitiatingUser(), call.isSelfManaged(), logCallCompletedListener, result.mCallBlockReason, result.mCallScreeningAppName, result.mCallScreeningComponentName); result.mCallScreeningComponentName, call.getMissedReason()); } else { logCall(call.getCallerInfo(), logNumber, call.getPostDialDigits(), formattedViaNumber, call.getHandlePresentation(), callLogType, callFeatures, accountHandle, creationTime, age, callDataUsage, call.isEmergencyCall(), call.getInitiatingUser(), call.isSelfManaged(), logCallCompletedListener, Calls.BLOCK_REASON_NOT_BLOCKED, null /*callScreeningAppName*/, null /*callScreeningComponentName*/); null /*callScreeningComponentName*/, call.getMissedReason()); } } Loading @@ -390,6 +399,7 @@ public final class CallLogManager extends CallsManagerListenerBase { * @param callBlockReason The reason why the call is blocked. * @param callScreeningAppName The call screening application name which block the call. * @param callScreeningComponentName The call screening component name which block the call. * @param missedReason The encoded information about reasons for missed call. */ private void logCall( CallerInfo callerInfo, Loading @@ -409,7 +419,8 @@ public final class CallLogManager extends CallsManagerListenerBase { @Nullable LogCallCompletedListener logCallCompletedListener, int callBlockReason, CharSequence callScreeningAppName, String callScreeningComponentName) { String callScreeningComponentName, long missedReason) { // On some devices, to avoid accidental redialing of emergency numbers, we *never* log // emergency calls to the Call Log. (This behavior is set on a per-product basis, based Loading Loading @@ -443,7 +454,7 @@ public final class CallLogManager extends CallsManagerListenerBase { AddCallArgs args = new AddCallArgs(mContext, callerInfo, number, postDialDigits, viaNumber, presentation, callType, features, accountHandle, start, duration, dataUsage, initiatingUser, isRead, logCallCompletedListener, callBlockReason, callScreeningAppName, callScreeningComponentName); callScreeningAppName, callScreeningComponentName, missedReason); logCallAsync(args); } else { Log.d(TAG, "Not adding emergency call to call log."); Loading Loading @@ -596,7 +607,7 @@ public final class CallLogManager extends CallsManagerListenerBase { c.presentation, c.callType, c.features, c.accountHandle, c.timestamp, c.durationInSec, c.dataUsage, userToBeInserted == null, userToBeInserted, c.isRead, c.callBockReason, c.callScreeningAppName, c.callScreeningComponentName); c.callScreeningComponentName, c.missedReason); } Loading
src/com/android/server/telecom/CallsManager.java +22 −4 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.server.telecom; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import static android.telecom.TelecomManager.ACTION_POST_CALL; import static android.telecom.TelecomManager.DURATION_LONG; import static android.telecom.TelecomManager.DURATION_MEDIUM; Loading @@ -27,6 +28,9 @@ import static android.telecom.TelecomManager.EXTRA_HANDLE; import static android.telecom.TelecomManager.MEDIUM_CALL_TIME_MS; import static android.telecom.TelecomManager.SHORT_CALL_TIME_MS; import static android.telecom.TelecomManager.VERY_SHORT_CALL_TIME_MS; import static android.provider.CallLog.Calls.AUTO_MISSED_EMERGENCY_CALL; import static android.provider.CallLog.Calls.AUTO_MISSED_MAXIMUM_DIALING; import static android.provider.CallLog.Calls.AUTO_MISSED_MAXIMUM_RINGING; import android.Manifest; import android.annotation.NonNull; Loading Loading @@ -738,6 +742,7 @@ public class CallsManager extends Call.ListenerBase // Only set the incoming call as ringing if it isn't already disconnected. It is possible // that the connection service disconnected the call before it was even added to Telecom, in // which case it makes no sense to set it back to a ringing state. Log.i(this, "onCallFilteringComplete"); mGraphHandlerThreads.clear(); if (incomingCall.getState() != CallState.DISCONNECTED && Loading @@ -759,16 +764,17 @@ public class CallsManager extends Call.ListenerBase } else { Log.i(this, "onCallFilteringCompleted: Call rejected! " + "Exceeds maximum number of ringing calls."); rejectCallAndLog(incomingCall, result); incomingCall.setMissedReason(AUTO_MISSED_MAXIMUM_RINGING); autoMissCallAndLog(incomingCall, result); } } else if (hasMaximumManagedDialingCalls(incomingCall)) { if (shouldSilenceInsteadOfReject(incomingCall)) { incomingCall.silence(); } else { Log.i(this, "onCallFilteringCompleted: Call rejected! Exceeds maximum number of " + "dialing calls."); rejectCallAndLog(incomingCall, result); incomingCall.setMissedReason(AUTO_MISSED_MAXIMUM_DIALING); autoMissCallAndLog(incomingCall, result); } } else if (result.shouldScreenViaAudio) { Log.i(this, "onCallFilteringCompleted: starting background audio processing"); Loading Loading @@ -1322,12 +1328,18 @@ public class CallsManager extends Call.ListenerBase if (isConference) { notifyCreateConferenceFailed(phoneAccountHandle, call); } else { if (hasMaximumManagedRingingCalls(call)) { call.setMissedReason(AUTO_MISSED_MAXIMUM_RINGING); mCallLogManager.logCall(call, Calls.MISSED_TYPE, true /*showNotificationForMissedCall*/, null /*CallFilteringResult*/); } notifyCreateConnectionFailed(phoneAccountHandle, call); } } else if (isInEmergencyCall()) { // The incoming call is implicitly being rejected so the user does not get any incoming // call UI during an emergency call. In this case, log the call as missed instead of // rejected since the user did not explicitly reject. call.setMissedReason(AUTO_MISSED_EMERGENCY_CALL); mCallLogManager.logCall(call, Calls.MISSED_TYPE, true /*showNotificationForMissedCall*/, null /*CallFilteringResult*/); if (isConference) { Loading Loading @@ -3435,7 +3447,8 @@ public class CallsManager extends Call.ListenerBase * Reject an incoming call and manually add it to the Call Log. * @param incomingCall Incoming call that has been rejected */ private void rejectCallAndLog(Call incomingCall, CallFilteringResult result) { private void autoMissCallAndLog(Call incomingCall, CallFilteringResult result) { incomingCall.getAnalytics().setMissedReason(incomingCall.getMissedReason()); if (incomingCall.getConnectionService() != null) { // Only reject the call if it has not already been destroyed. If a call ends while // incoming call filtering is taking place, it is possible that the call has already Loading Loading @@ -3573,6 +3586,10 @@ public class CallsManager extends Call.ListenerBase (newState == CallState.DISCONNECTED)) { maybeSendPostCallScreenIntent(call); } if (((newState == CallState.ABORTED) || (newState == CallState.DISCONNECTED)) && (call.getDisconnectCause().getCode() != DisconnectCause.MISSED)) { call.setMissedReason(MISSED_REASON_NOT_MISSED); } maybeShowErrorDialogOnDisconnect(call); Trace.beginSection("onCallStateChanged"); Loading Loading @@ -4729,6 +4746,7 @@ public class CallsManager extends Call.ListenerBase * @param call The {@link Call} which could not be added. */ private void notifyCreateConnectionFailed(PhoneAccountHandle phoneAccountHandle, Call call) { call.getAnalytics().setMissedReason(call.getMissedReason()); if (phoneAccountHandle == null) { return; } Loading
tests/src/com/android/server/telecom/tests/AnalyticsTests.java +6 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.telecom.tests; import static android.provider.CallLog.Calls.MISSED_REASON_NOT_MISSED; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; Loading Loading @@ -127,7 +129,8 @@ public class AnalyticsTests extends TelecomSystemTest { Analytics.dump(ip); String dumpResult = sr.toString(); String[] expectedFields = {"startTime", "endTime", "direction", "isAdditionalCall", "isInterrupted", "callTechnologies", "callTerminationReason", "connectionService"}; "isInterrupted", "callTechnologies", "callTerminationReason", "connectionService", "missedReason"}; for (String field : expectedFields) { assertTrue(dumpResult.contains(field)); } Loading Loading @@ -200,6 +203,8 @@ public class AnalyticsTests extends TelecomSystemTest { assertTrue(callAnalytics2.startTime > 0); assertEquals(0, callAnalytics1.endTime); assertEquals(0, callAnalytics2.endTime); assertEquals(MISSED_REASON_NOT_MISSED, callAnalytics1.missedReason); assertEquals(MISSED_REASON_NOT_MISSED, callAnalytics2.missedReason); assertEquals(Analytics.INCOMING_DIRECTION, callAnalytics1.callDirection); assertEquals(Analytics.OUTGOING_DIRECTION, callAnalytics2.callDirection); Loading