Merge "Add APIs to support background call screening"
am: 360428c44a
Change-Id: If443843db03da5013ea9938b1e81e430fee0f182
This commit is contained in:
@@ -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_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 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_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_CONNECTING = 9; // 0x9
|
||||||
field public static final int STATE_DIALING = 1; // 0x1
|
field public static final int STATE_DIALING = 1; // 0x1
|
||||||
field public static final int STATE_DISCONNECTED = 7; // 0x7
|
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_PULLING_CALL = 11; // 0xb
|
||||||
field public static final int STATE_RINGING = 2; // 0x2
|
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_SELECT_PHONE_ACCOUNT = 8; // 0x8
|
||||||
|
field public static final int STATE_SIMULATED_RINGING = 13; // 0xd
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract static class Call.Callback {
|
public abstract static class Call.Callback {
|
||||||
|
|||||||
@@ -6893,6 +6893,8 @@ package android.telecom {
|
|||||||
|
|
||||||
public final class Call {
|
public final class Call {
|
||||||
method @Deprecated public void addListener(android.telecom.Call.Listener);
|
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);
|
method @Deprecated public void removeListener(android.telecom.Call.Listener);
|
||||||
field @Deprecated public static final int STATE_PRE_DIAL_WAIT = 8; // 0x8
|
field @Deprecated public static final int STATE_PRE_DIAL_WAIT = 8; // 0x8
|
||||||
}
|
}
|
||||||
@@ -6901,6 +6903,10 @@ package android.telecom {
|
|||||||
ctor @Deprecated public Call.Listener();
|
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 {
|
public abstract class Conference extends android.telecom.Conferenceable {
|
||||||
method @Deprecated public final android.telecom.AudioState getAudioState();
|
method @Deprecated public final android.telecom.AudioState getAudioState();
|
||||||
method @Deprecated public final long getConnectTimeMillis();
|
method @Deprecated public final long getConnectTimeMillis();
|
||||||
|
|||||||
@@ -2734,10 +2734,19 @@ package android.service.quicksettings {
|
|||||||
|
|
||||||
package android.telecom {
|
package android.telecom {
|
||||||
|
|
||||||
|
public final class Call {
|
||||||
|
method public void enterBackgroundAudioProcessing();
|
||||||
|
method public void exitBackgroundAudioProcessing(boolean);
|
||||||
|
}
|
||||||
|
|
||||||
public final class CallAudioState implements android.os.Parcelable {
|
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>);
|
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 {
|
public abstract class Conference extends android.telecom.Conferenceable {
|
||||||
method public android.telecom.Connection getPrimaryConnection();
|
method public android.telecom.Connection getPrimaryConnection();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ package android.telecom;
|
|||||||
import android.annotation.IntDef;
|
import android.annotation.IntDef;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.annotation.SystemApi;
|
import android.annotation.SystemApi;
|
||||||
|
import android.annotation.TestApi;
|
||||||
import android.annotation.UnsupportedAppUsage;
|
import android.annotation.UnsupportedAppUsage;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@@ -118,6 +119,20 @@ public final class Call {
|
|||||||
*/
|
*/
|
||||||
public static final int STATE_PULLING_CALL = 11;
|
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
|
* 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
|
* 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);
|
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.
|
* Instructs this {@code Call} to play a dual-tone multi-frequency signaling (DTMF) tone.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ package android.telecom;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.SdkConstant;
|
import android.annotation.SdkConstant;
|
||||||
|
import android.annotation.SystemApi;
|
||||||
|
import android.annotation.TestApi;
|
||||||
import android.app.Service;
|
import android.app.Service;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -136,23 +138,30 @@ public abstract class CallScreeningService extends Service {
|
|||||||
private final boolean mShouldSilenceCall;
|
private final boolean mShouldSilenceCall;
|
||||||
private final boolean mShouldSkipCallLog;
|
private final boolean mShouldSkipCallLog;
|
||||||
private final boolean mShouldSkipNotification;
|
private final boolean mShouldSkipNotification;
|
||||||
|
private final boolean mShouldScreenCallFurther;
|
||||||
|
|
||||||
private CallResponse(
|
private CallResponse(
|
||||||
boolean shouldDisallowCall,
|
boolean shouldDisallowCall,
|
||||||
boolean shouldRejectCall,
|
boolean shouldRejectCall,
|
||||||
boolean shouldSilenceCall,
|
boolean shouldSilenceCall,
|
||||||
boolean shouldSkipCallLog,
|
boolean shouldSkipCallLog,
|
||||||
boolean shouldSkipNotification) {
|
boolean shouldSkipNotification,
|
||||||
|
boolean shouldScreenCallFurther) {
|
||||||
if (!shouldDisallowCall
|
if (!shouldDisallowCall
|
||||||
&& (shouldRejectCall || shouldSkipCallLog || shouldSkipNotification)) {
|
&& (shouldRejectCall || shouldSkipCallLog || shouldSkipNotification)) {
|
||||||
throw new IllegalStateException("Invalid response state for allowed call.");
|
throw new IllegalStateException("Invalid response state for allowed call.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (shouldDisallowCall && shouldScreenCallFurther) {
|
||||||
|
throw new IllegalStateException("Invalid response state for allowed call.");
|
||||||
|
}
|
||||||
|
|
||||||
mShouldDisallowCall = shouldDisallowCall;
|
mShouldDisallowCall = shouldDisallowCall;
|
||||||
mShouldRejectCall = shouldRejectCall;
|
mShouldRejectCall = shouldRejectCall;
|
||||||
mShouldSkipCallLog = shouldSkipCallLog;
|
mShouldSkipCallLog = shouldSkipCallLog;
|
||||||
mShouldSkipNotification = shouldSkipNotification;
|
mShouldSkipNotification = shouldSkipNotification;
|
||||||
mShouldSilenceCall = shouldSilenceCall;
|
mShouldSilenceCall = shouldSilenceCall;
|
||||||
|
mShouldScreenCallFurther = shouldScreenCallFurther;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -191,12 +200,22 @@ public abstract class CallScreeningService extends Service {
|
|||||||
return mShouldSkipNotification;
|
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 {
|
public static class Builder {
|
||||||
private boolean mShouldDisallowCall;
|
private boolean mShouldDisallowCall;
|
||||||
private boolean mShouldRejectCall;
|
private boolean mShouldRejectCall;
|
||||||
private boolean mShouldSilenceCall;
|
private boolean mShouldSilenceCall;
|
||||||
private boolean mShouldSkipCallLog;
|
private boolean mShouldSkipCallLog;
|
||||||
private boolean mShouldSkipNotification;
|
private boolean mShouldSkipNotification;
|
||||||
|
private boolean mShouldScreenCallFurther;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets whether the incoming call should be blocked.
|
* Sets whether the incoming call should be blocked.
|
||||||
@@ -252,13 +271,32 @@ public abstract class CallScreeningService extends Service {
|
|||||||
return this;
|
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() {
|
public CallResponse build() {
|
||||||
return new CallResponse(
|
return new CallResponse(
|
||||||
mShouldDisallowCall,
|
mShouldDisallowCall,
|
||||||
mShouldRejectCall,
|
mShouldRejectCall,
|
||||||
mShouldSilenceCall,
|
mShouldSilenceCall,
|
||||||
mShouldSkipCallLog,
|
mShouldSkipCallLog,
|
||||||
mShouldSkipNotification);
|
mShouldSkipNotification,
|
||||||
|
mShouldScreenCallFurther);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
package android.telecom;
|
package android.telecom;
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.bluetooth.BluetoothDevice;
|
import android.bluetooth.BluetoothDevice;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
|
|
||||||
@@ -148,6 +148,26 @@ public final class InCallAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Call#enterBackgroundAudioProcessing()
|
||||||
|
*/
|
||||||
|
public void enterBackgroundAudioProcessing(String callId) {
|
||||||
|
try {
|
||||||
|
mAdapter.enterBackgroundAudioProcessing(callId);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Call#exitBackgroundAudioProcessing(boolean)
|
||||||
|
*/
|
||||||
|
public void exitBackgroundAudioProcessing(String callId, boolean shouldRing) {
|
||||||
|
try {
|
||||||
|
mAdapter.exitBackgroundAudioProcessing(callId, shouldRing);
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Request audio routing to a specific bluetooth device. Calling this method may result in
|
* Request audio routing to a specific bluetooth device. Calling this method may result in
|
||||||
* the device routing audio to a different bluetooth device than the one specified. A list of
|
* the device routing audio to a different bluetooth device than the one specified. A list of
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ oneway interface ICallScreeningAdapter {
|
|||||||
|
|
||||||
void silenceCall(String callId);
|
void silenceCall(String callId);
|
||||||
|
|
||||||
|
void screenCallFurther(String callId);
|
||||||
|
|
||||||
void disallowCall(
|
void disallowCall(
|
||||||
String callId,
|
String callId,
|
||||||
boolean shouldReject,
|
boolean shouldReject,
|
||||||
|
|||||||
@@ -44,6 +44,10 @@ oneway interface IInCallAdapter {
|
|||||||
|
|
||||||
void setAudioRoute(int route, String bluetoothAddress);
|
void setAudioRoute(int route, String bluetoothAddress);
|
||||||
|
|
||||||
|
void enterBackgroundAudioProcessing(String callId);
|
||||||
|
|
||||||
|
void exitBackgroundAudioProcessing(String callId, boolean shouldRing);
|
||||||
|
|
||||||
void playDtmfTone(String callId, char digit);
|
void playDtmfTone(String callId, char digit);
|
||||||
|
|
||||||
void stopDtmfTone(String callId);
|
void stopDtmfTone(String callId);
|
||||||
|
|||||||
Reference in New Issue
Block a user