Merge "audio: add call redirection audio modes"

This commit is contained in:
Eric Laurent
2021-11-16 16:17:57 +00:00
committed by Android (Google) Code Review
6 changed files with 55 additions and 6 deletions

View File

@@ -20732,7 +20732,9 @@ package android.media {
field public static final int GET_DEVICES_ALL = 3; // 0x3
field public static final int GET_DEVICES_INPUTS = 1; // 0x1
field public static final int GET_DEVICES_OUTPUTS = 2; // 0x2
field public static final int MODE_CALL_REDIRECT = 5; // 0x5
field public static final int MODE_CALL_SCREENING = 4; // 0x4
field public static final int MODE_COMMUNICATION_REDIRECT = 6; // 0x6
field public static final int MODE_CURRENT = -1; // 0xffffffff
field public static final int MODE_INVALID = -2; // 0xfffffffe
field public static final int MODE_IN_CALL = 2; // 0x2

View File

@@ -45,4 +45,8 @@ enum AudioMode {
IN_COMMUNICATION = 3,
/** Call screening in progress. */
CALL_SCREEN = 4,
/** PSTN Call redirection in progress. */
SYS_RESERVED_CALL_REDIRECT = 5,
/** VoIP Call redirection in progress. */
SYS_RESERVED_COMMUNICATION_REDIRECT = 6,
}

View File

@@ -42,4 +42,6 @@ enum AudioMode {
IN_CALL = 2,
IN_COMMUNICATION = 3,
CALL_SCREEN = 4,
SYS_RESERVED_CALL_REDIRECT = 5,
SYS_RESERVED_COMMUNICATION_REDIRECT = 6,
}

View File

@@ -30,8 +30,11 @@ import android.annotation.SystemService;
import android.annotation.TestApi;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.compat.CompatChanges;
import android.bluetooth.BluetoothCodecConfig;
import android.bluetooth.BluetoothDevice;
import android.compat.annotation.ChangeId;
import android.compat.annotation.EnabledSince;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
@@ -2839,6 +2842,14 @@ public class AudioManager {
}
}
/**
* This change id controls use of audio modes for call audio redirection.
* @hide
*/
@ChangeId
@EnabledSince(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
public static final long CALL_REDIRECTION_AUDIO_MODES = 189472651L; // buganizer id
/**
* Returns the current audio mode.
*
@@ -2858,6 +2869,12 @@ public class AudioManager {
}
if (mode == MODE_CALL_SCREENING && sdk <= Build.VERSION_CODES.Q) {
mode = MODE_IN_CALL;
} else if (mode == MODE_CALL_REDIRECT
&& !CompatChanges.isChangeEnabled(CALL_REDIRECTION_AUDIO_MODES)) {
mode = MODE_IN_CALL;
} else if (mode == MODE_COMMUNICATION_REDIRECT
&& !CompatChanges.isChangeEnabled(CALL_REDIRECTION_AUDIO_MODES)) {
mode = MODE_IN_COMMUNICATION;
}
return mode;
} catch (RemoteException e) {
@@ -3075,13 +3092,26 @@ public class AudioManager {
*/
public static final int MODE_CALL_SCREENING = AudioSystem.MODE_CALL_SCREENING;
/**
* A telephony call is established and its audio is being redirected to another device.
*/
public static final int MODE_CALL_REDIRECT = AudioSystem.MODE_CALL_REDIRECT;
/**
* n audio/video chat or VoIP call is established and its audio is being redirected to another
* device.
*/
public static final int MODE_COMMUNICATION_REDIRECT = AudioSystem.MODE_COMMUNICATION_REDIRECT;
/** @hide */
@IntDef(flag = false, prefix = "MODE_", value = {
MODE_NORMAL,
MODE_RINGTONE,
MODE_IN_CALL,
MODE_IN_COMMUNICATION,
MODE_CALL_SCREENING }
MODE_CALL_SCREENING,
MODE_CALL_REDIRECT,
MODE_COMMUNICATION_REDIRECT}
)
@Retention(RetentionPolicy.SOURCE)
public @interface AudioMode {}

View File

@@ -199,7 +199,11 @@ public class AudioSystem
/** @hide */
public static final int MODE_CALL_SCREENING = 4;
/** @hide */
public static final int NUM_MODES = 5;
public static final int MODE_CALL_REDIRECT = 5;
/** @hide */
public static final int MODE_COMMUNICATION_REDIRECT = 6;
/** @hide */
public static final int NUM_MODES = 7;
/** @hide */
public static String modeToString(int mode) {
@@ -211,6 +215,8 @@ public class AudioSystem
case MODE_NORMAL: return "MODE_NORMAL";
case MODE_RINGTONE: return "MODE_RINGTONE";
case MODE_CALL_SCREENING: return "MODE_CALL_SCREENING";
case MODE_CALL_REDIRECT: return "MODE_CALL_REDIRECT";
case MODE_COMMUNICATION_REDIRECT: return "MODE_COMMUNICATION_REDIRECT";
default: return "unknown mode (" + mode + ")";
}
}

View File

@@ -4638,12 +4638,13 @@ public class AudioService extends IAudioService.Stub
* or recording for VOICE_COMMUNICATION.
* or
* - It requests a mode different from MODE_IN_COMMUNICATION or MODE_NORMAL
* Note: only privileged apps can request MODE_IN_CALL, MODE_CALL_REDIRECT
* or MODE_COMMUNICATION_REDIRECT.
*/
public boolean isActive() {
return mIsPrivileged
|| ((mMode == AudioSystem.MODE_IN_COMMUNICATION)
&& (mRecordingActive || mPlaybackActive))
|| mMode == AudioSystem.MODE_IN_CALL
|| mMode == AudioSystem.MODE_RINGTONE
|| mMode == AudioSystem.MODE_CALL_SCREENING;
}
@@ -4752,9 +4753,13 @@ public class AudioService extends IAudioService.Stub
final boolean hasModifyPhoneStatePermission = mContext.checkCallingOrSelfPermission(
android.Manifest.permission.MODIFY_PHONE_STATE)
== PackageManager.PERMISSION_GRANTED;
if ((mode == AudioSystem.MODE_IN_CALL) && !hasModifyPhoneStatePermission) {
Log.w(TAG, "MODIFY_PHONE_STATE Permission Denial: setMode(MODE_IN_CALL) from pid="
+ pid + ", uid=" + Binder.getCallingUid());
if ((mode == AudioSystem.MODE_IN_CALL
|| mode == AudioSystem.MODE_CALL_REDIRECT
|| mode == AudioSystem.MODE_COMMUNICATION_REDIRECT)
&& !hasModifyPhoneStatePermission) {
Log.w(TAG, "MODIFY_PHONE_STATE Permission Denial: setMode("
+ AudioSystem.modeToString(mode) + ") from pid=" + pid
+ ", uid=" + Binder.getCallingUid());
return;
}