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

Commit 71d52e72 authored by Jinyoung Jeong's avatar Jinyoung Jeong Committed by Automerger Merge Worker
Browse files

Merge "Add metrics for UCE event about Publish, Subscribe, Options and metrics...

Merge "Add metrics for UCE event about Publish, Subscribe, Options and metrics for RCS registration features" am: eb404b14

Original change: https://android-review.googlesource.com/c/platform/frameworks/opt/net/ims/+/1906326

Change-Id: I954b3b14faf04729c63e15bea4ccd48553346a9c
parents 8912984c eb404b14
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.util.IndentingPrintWriter;
import android.util.LocalLog;
import android.util.Log;

import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
import com.android.ims.rcs.uce.util.UceUtils;
@@ -53,7 +54,12 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.util.HandlerExecutor;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;

/**
 * Listen to the device changes and notify the PublishController to publish the device's
@@ -65,6 +71,8 @@ public class DeviceCapabilityListener {

    private static final long REGISTER_IMS_CHANGED_DELAY = 15000L;  // 15 seconds

    private final UceStatsWriter mUceStatsWriter;

    /**
     * Used to inject ImsMmTelManager instances for testing.
     */
@@ -180,7 +188,7 @@ public class DeviceCapabilityListener {
    private final Object mLock = new Object();

    public DeviceCapabilityListener(Context context, int subId, DeviceCapabilityInfo info,
            PublishControllerCallback callback) {
            PublishControllerCallback callback, UceStatsWriter uceStatsWriter) {
        mSubId = subId;
        logi("create");

@@ -188,6 +196,7 @@ public class DeviceCapabilityListener {
        mCallback = callback;
        mCapabilityInfo = info;
        mInitialized = false;
        mUceStatsWriter = uceStatsWriter;

        mHandlerThread = new HandlerThread("DeviceCapListenerThread");
        mHandlerThread.start();
@@ -447,6 +456,12 @@ public class DeviceCapabilityListener {
                    synchronized (mLock) {
                        logi("onRcsRegistered: " + attributes);
                        if (!mIsImsCallbackRegistered) return;

                        List<String> featureTagList = new ArrayList<>(attributes.getFeatureTags());
                        int registrationTech = attributes.getRegistrationTechnology();

                        mUceStatsWriter.setImsRegistrationFeatureTagStats(
                                mSubId, featureTagList, registrationTech);
                        handleImsRcsRegistered(attributes);
                    }
                }
@@ -456,6 +471,7 @@ public class DeviceCapabilityListener {
                    synchronized (mLock) {
                        logi("onRcsUnregistered: " + info);
                        if (!mIsImsCallbackRegistered) return;
                        mUceStatsWriter.setStoreCompleteImsRegistrationFeatureTagStats(mSubId);
                        handleImsRcsUnregistered();
                    }
                }
+14 −5
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import com.android.ims.rcs.uce.UceController;
import com.android.ims.rcs.uce.UceController.UceControllerCallback;
import com.android.ims.rcs.uce.UceDeviceState;
import com.android.ims.rcs.uce.UceDeviceState.DeviceStateResult;
import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.util.UceUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
@@ -79,7 +80,8 @@ public class PublishControllerImpl implements PublishController {
    @VisibleForTesting
    public interface DeviceCapListenerFactory {
        DeviceCapabilityListener createDeviceCapListener(Context context, int subId,
                DeviceCapabilityInfo capInfo, PublishControllerCallback callback);
                DeviceCapabilityInfo capInfo, PublishControllerCallback callback,
                UceStatsWriter uceStatsWriter);
    }

    private final int mSubId;
@@ -90,6 +92,7 @@ public class PublishControllerImpl implements PublishController {
    private volatile boolean mReceivePublishFromService;
    private volatile RcsFeatureManager mRcsFeatureManager;
    private final UceControllerCallback mUceCtrlCallback;
    private final UceStatsWriter mUceStatsWriter;

    // The capability type that the device is using.
    private @RcsImsCapabilityFlag int mCapabilityType;
@@ -115,8 +118,9 @@ public class PublishControllerImpl implements PublishController {

    // The listener to listen to the device's capabilities changed.
    private DeviceCapabilityListener mDeviceCapListener;
    private DeviceCapListenerFactory mDeviceCapListenerFactory = (context, subId, capInfo, callback)
            -> new DeviceCapabilityListener(context, subId, capInfo, callback);
    private DeviceCapListenerFactory mDeviceCapListenerFactory = (context, subId, capInfo, callback,
            uceStatsWriter)
            -> new DeviceCapabilityListener(context, subId, capInfo, callback, uceStatsWriter);

    // Listen to the RCS availability status changed.
    private final IImsCapabilityCallback mRcsCapabilitiesCallback =
@@ -141,6 +145,7 @@ public class PublishControllerImpl implements PublishController {
        mSubId = subId;
        mContext = context;
        mUceCtrlCallback = callback;
        mUceStatsWriter = UceStatsWriter.getInstance();
        logi("create");
        initPublishController(looper);
    }
@@ -148,12 +153,13 @@ public class PublishControllerImpl implements PublishController {
    @VisibleForTesting
    public PublishControllerImpl(Context context, int subId, UceControllerCallback c,
            Looper looper, DeviceCapListenerFactory deviceCapFactory,
            PublishProcessorFactory processorFactory) {
            PublishProcessorFactory processorFactory, UceStatsWriter instance) {
        mSubId = subId;
        mContext = context;
        mUceCtrlCallback = c;
        mDeviceCapListenerFactory = deviceCapFactory;
        mPublishProcessorFactory = processorFactory;
        mUceStatsWriter = instance;
        initPublishController(looper);
    }

@@ -200,7 +206,7 @@ public class PublishControllerImpl implements PublishController {

    private void initDeviceCapabilitiesListener() {
        mDeviceCapListener = mDeviceCapListenerFactory.createDeviceCapListener(mContext, mSubId,
                mDeviceCapabilityInfo, mPublishControllerCallback);
                mDeviceCapabilityInfo, mPublishControllerCallback, mUceStatsWriter);
    }

    @Override
@@ -934,6 +940,9 @@ public class PublishControllerImpl implements PublishController {
            if (mPublishState == newPublishState) return;
            mPublishState = newPublishState;
        }
        if (newPublishState == RcsUceAdapter.PUBLISH_STATE_NOT_PUBLISHED) {
            mUceStatsWriter.setUnPublish(mSubId);
        }

        // Trigger the publish state changed in handler thread since it may take time.
        logd("Notify publish state changed: " + mPublishState);
+35 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import android.annotation.NonNull;
import android.content.Context;
import android.os.RemoteException;
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
import android.text.TextUtils;
import android.util.IndentingPrintWriter;
import android.util.LocalLog;
@@ -31,6 +33,7 @@ import com.android.ims.RcsFeatureManager;
import com.android.ims.rcs.uce.presence.pidfparser.PidfParser;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.util.UceUtils;
import com.android.internal.annotations.VisibleForTesting;

@@ -53,6 +56,8 @@ public class PublishProcessor {
    private volatile boolean mIsDestroyed;
    private volatile RcsFeatureManager mRcsFeatureManager;

    private final UceStatsWriter mUceStatsWriter;

    // Manage the state of the publish processor.
    private PublishProcessorState mProcessorState;

@@ -74,6 +79,18 @@ public class PublishProcessor {
        mDeviceCapabilities = capabilityInfo;
        mPublishCtrlCallback = publishCtrlCallback;
        mProcessorState = new PublishProcessorState(subId);
        mUceStatsWriter = UceStatsWriter.getInstance();
    }

    @VisibleForTesting
    public PublishProcessor(Context context, int subId, DeviceCapabilityInfo capabilityInfo,
            PublishControllerCallback publishCtrlCallback, UceStatsWriter instance) {
        mSubId = subId;
        mContext = context;
        mDeviceCapabilities = capabilityInfo;
        mPublishCtrlCallback = publishCtrlCallback;
        mProcessorState = new PublishProcessorState(subId);
        mUceStatsWriter = instance;
    }

    /**
@@ -158,6 +175,13 @@ public class PublishProcessor {
            return false;
        }

        featureManager.getImsRegistrationTech((tech) -> {
            int registrationTech = (tech == null)
                    ? ImsRegistrationImplBase.REGISTRATION_TECH_NONE : tech;
            mUceStatsWriter.setImsRegistrationServiceDescStats(mSubId,
                    deviceCapability.getCapabilityTuples(), registrationTech);
        });

        // Publish to the Presence server.
        return publishCapabilities(featureManager, pidfXml);
    }
@@ -244,6 +268,13 @@ public class PublishProcessor {
        mLocalLog.log("Receive command error code=" + requestResponse.getCmdErrorCode());
        logd("onCommandError: " + requestResponse.toString());

        int cmdError = requestResponse.getCmdErrorCode().orElse(0);
        boolean successful = false;
        if (cmdError == RcsCapabilityExchangeImplBase.COMMAND_CODE_NO_CHANGE) {
            successful = true;
        }
        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.PUBLISH_EVENT, successful, cmdError, 0);

        if (requestResponse.needRetry() && !mProcessorState.isReachMaximumRetries()) {
            handleRequestRespWithRetry(requestResponse);
        } else {
@@ -267,6 +298,10 @@ public class PublishProcessor {
        mLocalLog.log("Receive network response code=" + requestResponse.getNetworkRespSipCode());
        logd("onNetworkResponse: " + requestResponse.toString());

        int responseCode = requestResponse.getNetworkRespSipCode().orElse(0);
        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.PUBLISH_EVENT, true, 0,
            responseCode);

        if (requestResponse.needRetry() && !mProcessorState.isReachMaximumRetries()) {
            handleRequestRespWithRetry(requestResponse);
        } else {
+23 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.telephony.ims.RcsUceAdapter;
import android.telephony.ims.aidl.IRcsUceControllerCallback;

import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.internal.annotations.VisibleForTesting;

import java.util.Collection;
@@ -44,7 +45,14 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {

        public Builder(int subId, Collection<UceRequest> requests,
                RequestManagerCallback callback) {
            mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback);
            mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback,
                    UceStatsWriter.getInstance());
        }
        @VisibleForTesting
        public Builder(int subId, Collection<UceRequest> requests,
                RequestManagerCallback callback, UceStatsWriter instance) {
            mRequestCoordinator = new OptionsRequestCoordinator(subId, requests, callback,
                    instance);
        }

        public Builder setCapabilitiesCallback(IRcsUceControllerCallback callback) {
@@ -105,9 +113,12 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
    // The callback to notify the result of the capabilities request.
    private IRcsUceControllerCallback mCapabilitiesCallback;

    private final UceStatsWriter mUceStatsWriter;

    private OptionsRequestCoordinator(int subId, Collection<UceRequest> requests,
            RequestManagerCallback requestMgrCallback) {
            RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
        super(subId, requests, requestMgrCallback);
        mUceStatsWriter = instance;
        logd("OptionsRequestCoordinator: created");
    }

@@ -189,6 +200,11 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
        // Finish this request.
        request.onFinish();

        int commandErrorCode = response.getCommandError().orElse(0);
        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.OUTGOING_OPTION_EVENT,
            false, commandErrorCode, 0);


        // Remove this request from the activated collection and notify RequestManager.
        Long taskId = request.getTaskId();
        RequestResult requestResult = sCommandErrorCreator.createRequestResult(taskId, response);
@@ -203,6 +219,11 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
        CapabilityRequestResponse response = request.getRequestResponse();
        logd("handleNetworkResponse: " + response.toString());

        int responseCode = response.getNetworkRespSipCode().orElse(0);
        mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.OUTGOING_OPTION_EVENT, true,
            0, responseCode);


        List<RcsContactUceCapability> updatedCapList = response.getUpdatedContactCapability();
        if (!updatedCapList.isEmpty()) {
            // Save the capabilities and trigger the capabilities callback
+18 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.telephony.ims.aidl.IOptionsRequestCallback;

import com.android.ims.rcs.uce.request.RemoteOptionsRequest.RemoteOptResponse;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.internal.annotations.VisibleForTesting;

import java.util.Collection;
@@ -41,7 +42,13 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
        RemoteOptionsCoordinator mRemoteOptionsCoordinator;

        public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c) {
            mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c);
            mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c,
                    UceStatsWriter.getInstance());
        }
        @VisibleForTesting
        public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c,
                UceStatsWriter instance) {
            mRemoteOptionsCoordinator = new RemoteOptionsCoordinator(subId, requests, c, instance);
        }

        public Builder setOptionsRequestCallback(IOptionsRequestCallback callback) {
@@ -78,9 +85,12 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
    // The callback to notify the result of the remote options request.
    private IOptionsRequestCallback mOptionsReqCallback;

    private final UceStatsWriter mUceStatsWriter;

    private RemoteOptionsCoordinator(int subId, Collection<UceRequest> requests,
            RequestManagerCallback requestMgrCallback) {
            RequestManagerCallback requestMgrCallback, UceStatsWriter instance) {
        super(subId, requests, requestMgrCallback);
        mUceStatsWriter = instance;
        logd("RemoteOptionsCoordinator: created");
    }

@@ -144,6 +154,9 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
            boolean isRemoteNumberBlocked) {
        try {
            logd("triggerOptionsReqCallback: start");
            mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.INCOMING_OPTION_EVENT, true, 0,
                200);

            mOptionsReqCallback.respondToCapabilityRequest(deviceCaps, isRemoteNumberBlocked);
        } catch (RemoteException e) {
            logw("triggerOptionsReqCallback exception: " + e);
@@ -155,6 +168,9 @@ public class RemoteOptionsCoordinator extends UceRequestCoordinator {
    private void triggerOptionsReqWithErrorCallback(int errorCode, String reason) {
        try {
            logd("triggerOptionsReqWithErrorCallback: start");
            mUceStatsWriter.setUceEvent(mSubId, UceStatsWriter.INCOMING_OPTION_EVENT, true, 0,
                errorCode);

            mOptionsReqCallback.respondToCapabilityRequestWithError(errorCode, reason);
        } catch (RemoteException e) {
            logw("triggerOptionsReqWithErrorCallback exception: " + e);
Loading