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

Commit 360428c4 authored by Hall Liu's avatar Hall Liu Committed by Gerrit Code Review
Browse files

Merge "Add APIs to support background call screening"

parents b30f6571 6dfa249c
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -43047,6 +43047,7 @@ package android.telecom {
    field public static final String EXTRA_SILENT_RINGING_REQUESTED = "android.telecom.extra.SILENT_RINGING_REQUESTED";
    field public static final String EXTRA_SUGGESTED_PHONE_ACCOUNTS = "android.telecom.extra.SUGGESTED_PHONE_ACCOUNTS";
    field public static final int STATE_ACTIVE = 4; // 0x4
    field public static final int STATE_AUDIO_PROCESSING = 12; // 0xc
    field public static final int STATE_CONNECTING = 9; // 0x9
    field public static final int STATE_DIALING = 1; // 0x1
    field public static final int STATE_DISCONNECTED = 7; // 0x7
@@ -43056,6 +43057,7 @@ package android.telecom {
    field public static final int STATE_PULLING_CALL = 11; // 0xb
    field public static final int STATE_RINGING = 2; // 0x2
    field public static final int STATE_SELECT_PHONE_ACCOUNT = 8; // 0x8
    field public static final int STATE_SIMULATED_RINGING = 13; // 0xd
  }
  public abstract static class Call.Callback {
+6 −0
Original line number Diff line number Diff line
@@ -6893,6 +6893,8 @@ package android.telecom {
  public final class Call {
    method @Deprecated public void addListener(android.telecom.Call.Listener);
    method public void enterBackgroundAudioProcessing();
    method public void exitBackgroundAudioProcessing(boolean);
    method @Deprecated public void removeListener(android.telecom.Call.Listener);
    field @Deprecated public static final int STATE_PRE_DIAL_WAIT = 8; // 0x8
  }
@@ -6901,6 +6903,10 @@ package android.telecom {
    ctor @Deprecated public Call.Listener();
  }
  public static class CallScreeningService.CallResponse.Builder {
    method public android.telecom.CallScreeningService.CallResponse.Builder setShouldScreenCallFurther(boolean);
  }
  public abstract class Conference extends android.telecom.Conferenceable {
    method @Deprecated public final android.telecom.AudioState getAudioState();
    method @Deprecated public final long getConnectTimeMillis();
+9 −0
Original line number Diff line number Diff line
@@ -2733,10 +2733,19 @@ package android.service.quicksettings {

package android.telecom {

  public final class Call {
    method public void enterBackgroundAudioProcessing();
    method public void exitBackgroundAudioProcessing(boolean);
  }

  public final class CallAudioState implements android.os.Parcelable {
    ctor public CallAudioState(boolean, int, int, @Nullable android.bluetooth.BluetoothDevice, @NonNull java.util.Collection<android.bluetooth.BluetoothDevice>);
  }

  public static class CallScreeningService.CallResponse.Builder {
    method public android.telecom.CallScreeningService.CallResponse.Builder setShouldScreenCallFurther(boolean);
  }

  public abstract class Conference extends android.telecom.Conferenceable {
    method public android.telecom.Connection getPrimaryConnection();
  }
+58 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.telecom;
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
import android.net.Uri;
import android.os.Build;
@@ -118,6 +119,20 @@ public final class Call {
     */
    public static final int STATE_PULLING_CALL = 11;

    /**
     * The state of a call that is active with the network, but the audio from the call is
     * being intercepted by an app on the local device. Telecom does not hold audio focus in this
     * state, and the call will be invisible to the user except for a persistent notification.
     */
    public static final int STATE_AUDIO_PROCESSING = 12;

    /**
     * The state of a call that is being presented to the user after being in
     * {@link #STATE_AUDIO_PROCESSING}. The call is still active with the network in this case, and
     * Telecom will hold audio focus and play a ringtone if appropriate.
     */
    public static final int STATE_SIMULATED_RINGING = 13;

    /**
     * The key to retrieve the optional {@code PhoneAccount}s Telecom can bundle with its Call
     * extras. Used to pass the phone accounts to display on the front end to the user in order to
@@ -1478,6 +1493,49 @@ public final class Call {
        mInCallAdapter.unholdCall(mTelecomCallId);
    }

    /**
     * Instructs Telecom to put the call into the background audio processing state.
     *
     * This method can be called either when the call is in {@link #STATE_RINGING} or
     * {@link #STATE_ACTIVE}. After Telecom acknowledges the request by setting the call's state to
     * {@link #STATE_AUDIO_PROCESSING}, your app may setup the audio paths with the audio stack in
     * order to capture and play audio on the call stream.
     *
     * This method can only be called by the default dialer app.
     * @hide
     */
    @SystemApi
    @TestApi
    //@RequiresPermission(android.Manifest.permission.BACKGROUND_CALL_AUDIO)
    public void enterBackgroundAudioProcessing() {
        if (mState != STATE_ACTIVE && mState != STATE_RINGING) {
            throw new IllegalStateException("Call must be active or ringing");
        }
        mInCallAdapter.enterBackgroundAudioProcessing(mTelecomCallId);
    }

    /**
     * Instructs Telecom to come out of the background audio processing state requested by
     * {@link #enterBackgroundAudioProcessing()} or from the call screening service.
     *
     * This method can only be called when the call is in {@link #STATE_AUDIO_PROCESSING}.
     *
     * @param shouldRing If true, Telecom will put the call into the
     *                   {@link #STATE_SIMULATED_RINGING} state and notify other apps that there is
     *                   a ringing call. Otherwise, the call will go into {@link #STATE_ACTIVE}
     *                   immediately.
     * @hide
     */
    @SystemApi
    @TestApi
    //@RequiresPermission(android.Manifest.permission.BACKGROUND_CALL_AUDIO)
    public void exitBackgroundAudioProcessing(boolean shouldRing) {
        if (mState != STATE_AUDIO_PROCESSING) {
            throw new IllegalStateException("Call must in the audio processing state");
        }
        mInCallAdapter.exitBackgroundAudioProcessing(mTelecomCallId, shouldRing);
    }

    /**
     * Instructs this {@code Call} to play a dual-tone multi-frequency signaling (DTMF) tone.
     *
+40 −2
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package android.telecom;

import android.annotation.NonNull;
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
@@ -136,23 +138,30 @@ public abstract class CallScreeningService extends Service {
        private final boolean mShouldSilenceCall;
        private final boolean mShouldSkipCallLog;
        private final boolean mShouldSkipNotification;
        private final boolean mShouldScreenCallFurther;

        private CallResponse(
                boolean shouldDisallowCall,
                boolean shouldRejectCall,
                boolean shouldSilenceCall,
                boolean shouldSkipCallLog,
                boolean shouldSkipNotification) {
                boolean shouldSkipNotification,
                boolean shouldScreenCallFurther) {
            if (!shouldDisallowCall
                    && (shouldRejectCall || shouldSkipCallLog || shouldSkipNotification)) {
                throw new IllegalStateException("Invalid response state for allowed call.");
            }

            if (shouldDisallowCall && shouldScreenCallFurther) {
                throw new IllegalStateException("Invalid response state for allowed call.");
            }

            mShouldDisallowCall = shouldDisallowCall;
            mShouldRejectCall = shouldRejectCall;
            mShouldSkipCallLog = shouldSkipCallLog;
            mShouldSkipNotification = shouldSkipNotification;
            mShouldSilenceCall = shouldSilenceCall;
            mShouldScreenCallFurther = shouldScreenCallFurther;
        }

        /*
@@ -191,12 +200,22 @@ public abstract class CallScreeningService extends Service {
            return mShouldSkipNotification;
        }

        /**
         * @return Whether we should enter the {@link Call#STATE_AUDIO_PROCESSING} state to allow
         * for further screening of the call.
         * @hide
         */
        public boolean getShouldScreenCallFurther() {
            return mShouldScreenCallFurther;
        }

        public static class Builder {
            private boolean mShouldDisallowCall;
            private boolean mShouldRejectCall;
            private boolean mShouldSilenceCall;
            private boolean mShouldSkipCallLog;
            private boolean mShouldSkipNotification;
            private boolean mShouldScreenCallFurther;

            /**
             * Sets whether the incoming call should be blocked.
@@ -252,13 +271,32 @@ public abstract class CallScreeningService extends Service {
                return this;
            }

            /**
             * Sets whether to request background audio processing so that the in-call service can
             * screen the call further. If set to {@code true}, {@link #setDisallowCall} should be
             * called with {@code false}, and all other parameters in this builder will be ignored.
             *
             * This request will only be honored if the {@link CallScreeningService} shares the same
             * uid as the default dialer app. Otherwise, the call will go through as usual.
             *
             * @param shouldScreenCallFurther Whether to request further call screening.
             * @hide
             */
            @SystemApi
            @TestApi
            public Builder setShouldScreenCallFurther(boolean shouldScreenCallFurther) {
                mShouldScreenCallFurther = shouldScreenCallFurther;
                return this;
            }

            public CallResponse build() {
                return new CallResponse(
                        mShouldDisallowCall,
                        mShouldRejectCall,
                        mShouldSilenceCall,
                        mShouldSkipCallLog,
                        mShouldSkipNotification);
                        mShouldSkipNotification,
                        mShouldScreenCallFurther);
            }
       }
    }
Loading