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

Commit 1aa46c28 authored by Sewook Seo's avatar Sewook Seo Committed by Android (Google) Code Review
Browse files

Merge "Media quality CB: API interface"

parents 1630bade b822396d
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -13795,6 +13795,7 @@ package android.telephony {
    field @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public static final int EVENT_IMS_CALL_DISCONNECT_CAUSE_CHANGED = 28; // 0x1c
    field @RequiresPermission(android.Manifest.permission.READ_CALL_LOG) public static final int EVENT_LEGACY_CALL_STATE_CHANGED = 36; // 0x24
    field @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public static final int EVENT_LINK_CAPACITY_ESTIMATE_CHANGED = 37; // 0x25
    field @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public static final int EVENT_MEDIA_QUALITY_STATUS_CHANGED = 39; // 0x27
    field @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static final int EVENT_MESSAGE_WAITING_INDICATOR_CHANGED = 3; // 0x3
    field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final int EVENT_OEM_HOOK_RAW = 15; // 0xf
    field @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public static final int EVENT_OUTGOING_EMERGENCY_CALL = 29; // 0x1d
@@ -13830,6 +13831,10 @@ package android.telephony {
    method @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public void onLinkCapacityEstimateChanged(@NonNull java.util.List<android.telephony.LinkCapacityEstimate>);
  }
  public static interface TelephonyCallback.MediaQualityStatusChangedListener {
    method @RequiresPermission(android.Manifest.permission.READ_PRECISE_PHONE_STATE) public void onMediaQualityStatusChanged(@NonNull android.telephony.ims.MediaQualityStatus);
  }
  public static interface TelephonyCallback.OutgoingEmergencyCallListener {
    method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void onOutgoingEmergencyCall(@NonNull android.telephony.emergency.EmergencyNumber, int);
  }
@@ -15372,6 +15377,37 @@ package android.telephony.ims {
    method public void receiveSessionModifyResponse(int, android.telecom.VideoProfile, android.telecom.VideoProfile);
  }
  public final class MediaQualityStatus implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public String getCallSessionId();
    method public int getMediaSessionType();
    method public long getRtpInactivityMillis();
    method public int getRtpJitterMillis();
    method @IntRange(from=0, to=100) public int getRtpPacketLossRate();
    method public int getTransportType();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.MediaQualityStatus> CREATOR;
    field public static final int MEDIA_SESSION_TYPE_AUDIO = 1; // 0x1
    field public static final int MEDIA_SESSION_TYPE_VIDEO = 2; // 0x2
  }
  public static final class MediaQualityStatus.Builder {
    ctor public MediaQualityStatus.Builder(@NonNull String, int, int);
    method @NonNull public android.telephony.ims.MediaQualityStatus build();
    method @NonNull public android.telephony.ims.MediaQualityStatus.Builder setRtpInactivityMillis(long);
    method @NonNull public android.telephony.ims.MediaQualityStatus.Builder setRtpJitterMillis(int);
    method @NonNull public android.telephony.ims.MediaQualityStatus.Builder setRtpPacketLossRate(@IntRange(from=0, to=100) int);
  }
  public final class MediaThreshold implements android.os.Parcelable {
    method public int describeContents();
    method @NonNull public long[] getThresholdsRtpInactivityTimeMillis();
    method @NonNull public int[] getThresholdsRtpJitterMillis();
    method @NonNull public int[] getThresholdsRtpPacketLossRate();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
    field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.MediaThreshold> CREATOR;
  }
  public class ProvisioningManager {
    method @NonNull public static android.telephony.ims.ProvisioningManager createForSubscriptionId(int);
    method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public int getProvisioningIntValue(int);
@@ -15823,6 +15859,7 @@ package android.telephony.ims.feature {
    ctor public MmTelFeature(@NonNull java.util.concurrent.Executor);
    method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
    method public void changeOfferedRtpHeaderExtensionTypes(@NonNull java.util.Set<android.telephony.ims.RtpHeaderExtensionType>);
    method public void clearMediaThreshold(int);
    method @Nullable public android.telephony.ims.ImsCallProfile createCallProfile(int, int);
    method @Nullable public android.telephony.ims.stub.ImsCallSessionImplBase createCallSession(@NonNull android.telephony.ims.ImsCallProfile);
    method @NonNull public android.telephony.ims.stub.ImsEcbmImplBase getEcbm();
@@ -15832,6 +15869,7 @@ package android.telephony.ims.feature {
    method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.MmTelFeature.MmTelCapabilities);
    method @Deprecated public final void notifyIncomingCall(@NonNull android.telephony.ims.stub.ImsCallSessionImplBase, @NonNull android.os.Bundle);
    method @Nullable public final android.telephony.ims.ImsCallSessionListener notifyIncomingCall(@NonNull android.telephony.ims.stub.ImsCallSessionImplBase, @NonNull String, @NonNull android.os.Bundle);
    method public final void notifyMediaQualityStatusChanged(@NonNull android.telephony.ims.MediaQualityStatus);
    method public final void notifyRejectedCall(@NonNull android.telephony.ims.ImsCallProfile, @NonNull android.telephony.ims.ImsReasonInfo);
    method public void notifySrvccCanceled();
    method public void notifySrvccCompleted();
@@ -15842,7 +15880,9 @@ package android.telephony.ims.feature {
    method public void onFeatureRemoved();
    method public boolean queryCapabilityConfiguration(int, int);
    method @NonNull public final android.telephony.ims.feature.MmTelFeature.MmTelCapabilities queryCapabilityStatus();
    method @Nullable public android.telephony.ims.MediaQualityStatus queryMediaQualityStatus(int);
    method public final void setCallAudioHandler(int);
    method public void setMediaThreshold(int, @NonNull android.telephony.ims.MediaThreshold);
    method public void setTerminalBasedCallWaitingStatus(boolean);
    method public void setUiTtyMode(int, @Nullable android.os.Message);
    method public int shouldProcessCall(@NonNull String[]);
+5 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.telephony.Annotation.SrvccState;
import android.telephony.TelephonyManager.DataEnabledReason;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.MediaQualityStatus;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.IPhoneStateListener;
@@ -1664,6 +1665,10 @@ public class PhoneStateListener {
                List<LinkCapacityEstimate> linkCapacityEstimateList) {
            // default implementation empty
        }

        public final void onMediaQualityStatusChanged(MediaQualityStatus mediaQualityStatus) {
            // not support. Can't override. Use TelephonyCallback.
        }
    }

    private void log(String s) {
+52 −1
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ import android.os.Binder;
import android.os.Build;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.MediaQualityStatus;
import android.telephony.ims.MediaThreshold;
import android.util.Log;

import com.android.internal.annotations.VisibleForTesting;
@@ -591,6 +593,19 @@ public class TelephonyCallback {
     */
    public static final int EVENT_TRIGGER_NOTIFY_ANBR = 38;

    /**
     * Event for changes to the media quality status
     *
     * <p>Requires permission {@link android.Manifest.permission#READ_PRECISE_PHONE_STATE}
     *
     * @see MediaQualityStatusChangedListener#onMediaQualityStatusChanged
     *
     * @hide
     */
    @SystemApi
    @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE)
    public static final int EVENT_MEDIA_QUALITY_STATUS_CHANGED = 39;

    /**
     * @hide
     */
@@ -632,7 +647,8 @@ public class TelephonyCallback {
            EVENT_ALLOWED_NETWORK_TYPE_LIST_CHANGED,
            EVENT_LEGACY_CALL_STATE_CHANGED,
            EVENT_LINK_CAPACITY_ESTIMATE_CHANGED,
            EVENT_TRIGGER_NOTIFY_ANBR
            EVENT_TRIGGER_NOTIFY_ANBR,
            EVENT_MEDIA_QUALITY_STATUS_CHANGED
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface TelephonyEvent {
@@ -1516,6 +1532,30 @@ public class TelephonyCallback {
                @NonNull List<LinkCapacityEstimate> linkCapacityEstimateList);
    }

    /**
     * Interface for media quality status changed listener.
     *
     * @hide
     */
    @SystemApi
    public interface MediaQualityStatusChangedListener {
        /**
         * Callback invoked when the media quality status of IMS call changes. This call back
         * means current media quality status crosses at least one of threshold values in {@link
         * MediaThreshold}. Listener needs to get quality information & check whether it crossed
         * listener's threshold.
         *
         * <p/> Currently thresholds for this indication can be configurable by CARRIER_CONFIG
         * {@link CarrierConfigManager#KEY_VOICE_RTP_THRESHOLDS_PACKET_LOSS_RATE_INT}
         * {@link CarrierConfigManager#KEY_VOICE_RTP_THRESHOLDS_INACTIVITY_TIME_IN_MILLIS_INT}
         * {@link CarrierConfigManager#KEY_VOICE_RTP_THRESHOLDS_JITTER_INT}
         *
         * @param mediaQualityStatus The media quality status currently measured.
         */
        @RequiresPermission(Manifest.permission.READ_PRECISE_PHONE_STATE)
        void onMediaQualityStatusChanged(@NonNull MediaQualityStatus mediaQualityStatus);
    }

    /**
     * The callback methods need to be called on the handler thread where
     * this object was created.  If the binder did that for us it'd be nice.
@@ -1873,5 +1913,16 @@ public class TelephonyCallback {
                    () -> mExecutor.execute(() -> listener.onLinkCapacityEstimateChanged(
                            linkCapacityEstimateList)));
        }

        public void onMediaQualityStatusChanged(
                MediaQualityStatus mediaQualityStatus) {
            MediaQualityStatusChangedListener listener =
                    (MediaQualityStatusChangedListener) mTelephonyCallbackWeakRef.get();
            if (listener == null) return;

            Binder.withCleanCallingIdentity(
                    () -> mExecutor.execute(() -> listener.onMediaQualityStatusChanged(
                            mediaQualityStatus)));
        }
    }
}
+26 −0
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.telephony.TelephonyManager.CarrierPrivilegesCallback;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsCallSession;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.MediaQualityStatus;
import android.util.ArraySet;
import android.util.Log;

@@ -544,6 +545,27 @@ public class TelephonyRegistryManager {
        }
    }

    /**
     * Notify change of media quality status {@link MediaQualityStatus} crosses media quality
     * threshold
     * <p/>
     * Currently thresholds for this indication can be configurable by CARRIER_CONFIG
     * {@link CarrierConfigManager#KEY_VOICE_RTP_THRESHOLDS_PACKET_LOSS_RATE_INT}
     * {@link CarrierConfigManager#KEY_VOICE_RTP_THRESHOLDS_INACTIVITY_TIME_IN_MILLIS_INT}
     * {@link CarrierConfigManager#KEY_VOICE_RTP_THRESHOLDS_JITTER_INT}
     *
     * @param status media quality status
     */
    public void notifyMediaQualityStatusChanged(
            int slotIndex, int subId, @NonNull MediaQualityStatus status) {
        try {
            sRegistry.notifyMediaQualityStatusChanged(slotIndex, subId, status);
        } catch (RemoteException ex) {
            // system server crash
            throw ex.rethrowFromSystemServer();
        }
    }

    /**
     * Notify emergency number list changed on certain subscription.
     *
@@ -1087,6 +1109,10 @@ public class TelephonyRegistryManager {
            eventList.add(TelephonyCallback.EVENT_LINK_CAPACITY_ESTIMATE_CHANGED);
        }

        if (telephonyCallback instanceof TelephonyCallback.MediaQualityStatusChangedListener) {
            eventList.add(TelephonyCallback.EVENT_MEDIA_QUALITY_STATUS_CHANGED);
        }

        return eventList;
    }

+2 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.ims.MediaQualityStatus;

/**
 * {@hide}
@@ -76,4 +77,5 @@ oneway interface IPhoneStateListener {
    void onDataEnabledChanged(boolean enabled, int reason);
    void onAllowedNetworkTypesChanged(in int reason, in long allowedNetworkType);
    void onLinkCapacityEstimateChanged(in List<LinkCapacityEstimate> linkCapacityEstimateList);
    void onMediaQualityStatusChanged(in MediaQualityStatus mediaQualityStatus);
}
Loading