Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8271ee4d authored by Grace Jia's avatar Grace Jia Committed by Gerrit Code Review
Browse files

Merge "Add call missed information relative field and implement telecom auto missed part."

parents 5a454d90 009d958e
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -208,6 +208,9 @@ public class Analytics {

        public void setCallSource(int callSource) {
        }

        public void setMissedReason(long missedReason) {
        }
    }

    /**
@@ -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;

@@ -254,6 +258,7 @@ public class Analytics {
            connectionService = "";
            videoEvents = new LinkedList<>();
            inCallServiceInfos = new LinkedList<>();
            missedReason = 0;
        }

        CallInfoImpl(CallInfoImpl other) {
@@ -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(
@@ -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;
@@ -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'
@@ -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");
+32 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;

@@ -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.
@@ -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;
    }

    /**
@@ -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;
    }
}
+18 −7
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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.
@@ -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();
@@ -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());
        }
    }

@@ -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,
@@ -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
@@ -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.");
@@ -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);
        }


+22 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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 &&
@@ -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");
@@ -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) {
@@ -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
@@ -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");
@@ -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;
        }
+6 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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));
        }
@@ -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