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 Original line Diff line number Diff line
@@ -46,6 +46,7 @@ import android.util.IndentingPrintWriter;
import android.util.LocalLog;
import android.util.LocalLog;
import android.util.Log;
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.PublishControllerCallback;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishTriggerType;
import com.android.ims.rcs.uce.util.UceUtils;
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 com.android.internal.telephony.util.HandlerExecutor;


import java.io.PrintWriter;
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.Objects;
import java.util.Set;


/**
/**
 * Listen to the device changes and notify the PublishController to publish the device's
 * 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 static final long REGISTER_IMS_CHANGED_DELAY = 15000L;  // 15 seconds


    private final UceStatsWriter mUceStatsWriter;

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


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


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


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

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

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


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


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


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


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


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


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


    @Override
    @Override
@@ -934,6 +940,9 @@ public class PublishControllerImpl implements PublishController {
            if (mPublishState == newPublishState) return;
            if (mPublishState == newPublishState) return;
            mPublishState = newPublishState;
            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.
        // Trigger the publish state changed in handler thread since it may take time.
        logd("Notify publish state changed: " + mPublishState);
        logd("Notify publish state changed: " + mPublishState);
+35 −0
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import android.annotation.NonNull;
import android.content.Context;
import android.content.Context;
import android.os.RemoteException;
import android.os.RemoteException;
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.RcsContactUceCapability;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.ims.stub.RcsCapabilityExchangeImplBase;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.IndentingPrintWriter;
import android.util.IndentingPrintWriter;
import android.util.LocalLog;
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.pidfparser.PidfParser;
import com.android.ims.rcs.uce.presence.publish.PublishController.PublishControllerCallback;
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.presence.publish.PublishController.PublishTriggerType;
import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.ims.rcs.uce.util.UceUtils;
import com.android.ims.rcs.uce.util.UceUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;


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


    private final UceStatsWriter mUceStatsWriter;

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


@@ -74,6 +79,18 @@ public class PublishProcessor {
        mDeviceCapabilities = capabilityInfo;
        mDeviceCapabilities = capabilityInfo;
        mPublishCtrlCallback = publishCtrlCallback;
        mPublishCtrlCallback = publishCtrlCallback;
        mProcessorState = new PublishProcessorState(subId);
        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;
            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.
        // Publish to the Presence server.
        return publishCapabilities(featureManager, pidfXml);
        return publishCapabilities(featureManager, pidfXml);
    }
    }
@@ -244,6 +268,13 @@ public class PublishProcessor {
        mLocalLog.log("Receive command error code=" + requestResponse.getCmdErrorCode());
        mLocalLog.log("Receive command error code=" + requestResponse.getCmdErrorCode());
        logd("onCommandError: " + requestResponse.toString());
        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()) {
        if (requestResponse.needRetry() && !mProcessorState.isReachMaximumRetries()) {
            handleRequestRespWithRetry(requestResponse);
            handleRequestRespWithRetry(requestResponse);
        } else {
        } else {
@@ -267,6 +298,10 @@ public class PublishProcessor {
        mLocalLog.log("Receive network response code=" + requestResponse.getNetworkRespSipCode());
        mLocalLog.log("Receive network response code=" + requestResponse.getNetworkRespSipCode());
        logd("onNetworkResponse: " + requestResponse.toString());
        logd("onNetworkResponse: " + requestResponse.toString());


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

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


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


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


        public Builder(int subId, Collection<UceRequest> requests,
        public Builder(int subId, Collection<UceRequest> requests,
                RequestManagerCallback callback) {
                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) {
        public Builder setCapabilitiesCallback(IRcsUceControllerCallback callback) {
@@ -105,9 +113,12 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
    // The callback to notify the result of the capabilities request.
    // The callback to notify the result of the capabilities request.
    private IRcsUceControllerCallback mCapabilitiesCallback;
    private IRcsUceControllerCallback mCapabilitiesCallback;


    private final UceStatsWriter mUceStatsWriter;

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


@@ -189,6 +200,11 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
        // Finish this request.
        // Finish this request.
        request.onFinish();
        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.
        // Remove this request from the activated collection and notify RequestManager.
        Long taskId = request.getTaskId();
        Long taskId = request.getTaskId();
        RequestResult requestResult = sCommandErrorCreator.createRequestResult(taskId, response);
        RequestResult requestResult = sCommandErrorCreator.createRequestResult(taskId, response);
@@ -203,6 +219,11 @@ public class OptionsRequestCoordinator extends UceRequestCoordinator {
        CapabilityRequestResponse response = request.getRequestResponse();
        CapabilityRequestResponse response = request.getRequestResponse();
        logd("handleNetworkResponse: " + response.toString());
        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();
        List<RcsContactUceCapability> updatedCapList = response.getUpdatedContactCapability();
        if (!updatedCapList.isEmpty()) {
        if (!updatedCapList.isEmpty()) {
            // Save the capabilities and trigger the capabilities callback
            // Save the capabilities and trigger the capabilities callback
+18 −2
Original line number Original line 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.RemoteOptionsRequest.RemoteOptResponse;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
import com.android.ims.rcs.uce.request.UceRequestManager.RequestManagerCallback;
import com.android.ims.rcs.uce.UceStatsWriter;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;


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


        public Builder(int subId, Collection<UceRequest> requests, RequestManagerCallback c) {
        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) {
        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.
    // The callback to notify the result of the remote options request.
    private IOptionsRequestCallback mOptionsReqCallback;
    private IOptionsRequestCallback mOptionsReqCallback;


    private final UceStatsWriter mUceStatsWriter;

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


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

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

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