From dd976b1b0dab6655e180eecd0d2c44658b66f529 Mon Sep 17 00:00:00 2001 From: Bryce Lee Date: Tue, 17 Nov 2015 12:31:53 -0800 Subject: [PATCH] DO NOT MERGE ANYWHERE Add ability to set supported audio routes on phone accounts and connection. The set audio routes are used by Telecom to restrict where the audio may be routed to. For example, an account can specify that calls may not be routed over bluetooth headsets, which will prevent a new call from being routed to this source. Bug: 25485578 Change-Id: Ia1ca665e9ae8852a2538ab7cbeb3a73217d9b03b --- telecomm/java/android/telecom/Call.java | 15 +++++++ .../java/android/telecom/CallAudioState.java | 8 +++- telecomm/java/android/telecom/Connection.java | 27 ++++++++++++ .../android/telecom/ConnectionService.java | 2 + .../java/android/telecom/ParcelableCall.java | 11 +++++ .../android/telecom/ParcelableConnection.java | 10 +++++ .../java/android/telecom/PhoneAccount.java | 42 ++++++++++++++----- 7 files changed, 103 insertions(+), 12 deletions(-) diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 65117055045ce..eab13afedb772 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -253,6 +253,7 @@ public final class Call { private final PhoneAccountHandle mAccountHandle; private final int mCallCapabilities; private final int mCallProperties; + private final int mSupportedAudioRoutes; private final DisconnectCause mDisconnectCause; private final long mConnectTimeMillis; private final GatewayInfo mGatewayInfo; @@ -447,6 +448,15 @@ public final class Call { return mCallProperties; } + /** + * @return a bitmask of the audio routes available for the call. + * + * @hide + */ + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** * @return For a {@link #STATE_DISCONNECTED} {@code Call}, the disconnect cause expressed * by {@link android.telecom.DisconnectCause}. @@ -513,6 +523,7 @@ public final class Call { Objects.equals(mAccountHandle, d.mAccountHandle) && Objects.equals(mCallCapabilities, d.mCallCapabilities) && Objects.equals(mCallProperties, d.mCallProperties) && + Objects.equals(mSupportedAudioRoutes, d.mSupportedAudioRoutes) && Objects.equals(mDisconnectCause, d.mDisconnectCause) && Objects.equals(mConnectTimeMillis, d.mConnectTimeMillis) && Objects.equals(mGatewayInfo, d.mGatewayInfo) && @@ -534,6 +545,7 @@ public final class Call { Objects.hashCode(mAccountHandle) + Objects.hashCode(mCallCapabilities) + Objects.hashCode(mCallProperties) + + Objects.hashCode(mSupportedAudioRoutes) + Objects.hashCode(mDisconnectCause) + Objects.hashCode(mConnectTimeMillis) + Objects.hashCode(mGatewayInfo) + @@ -552,6 +564,7 @@ public final class Call { PhoneAccountHandle accountHandle, int capabilities, int properties, + int audioRoutes, DisconnectCause disconnectCause, long connectTimeMillis, GatewayInfo gatewayInfo, @@ -566,6 +579,7 @@ public final class Call { mAccountHandle = accountHandle; mCallCapabilities = capabilities; mCallProperties = properties; + mSupportedAudioRoutes = audioRoutes; mDisconnectCause = disconnectCause; mConnectTimeMillis = connectTimeMillis; mGatewayInfo = gatewayInfo; @@ -1008,6 +1022,7 @@ public final class Call { parcelableCall.getAccountHandle(), parcelableCall.getCapabilities(), parcelableCall.getProperties(), + parcelableCall.getSupportedAudioRoutes(), parcelableCall.getDisconnectCause(), parcelableCall.getConnectTimeMillis(), parcelableCall.getGatewayInfo(), diff --git a/telecomm/java/android/telecom/CallAudioState.java b/telecomm/java/android/telecom/CallAudioState.java index 2b1672209a3df..f601d8b545ac9 100644 --- a/telecomm/java/android/telecom/CallAudioState.java +++ b/telecomm/java/android/telecom/CallAudioState.java @@ -44,8 +44,12 @@ public final class CallAudioState implements Parcelable { */ public static final int ROUTE_WIRED_OR_EARPIECE = ROUTE_EARPIECE | ROUTE_WIRED_HEADSET; - /** Bit mask of all possible audio routes. */ - private static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET | + /** + * Bit mask of all possible audio routes. + * + * @hide + **/ + public static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET | ROUTE_SPEAKER; private final boolean isMuted; diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 430760a892b7c..a44b79cc05263 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -416,6 +416,7 @@ public abstract class Connection extends Conferenceable { public void onRingbackRequested(Connection c, boolean ringback) {} public void onDestroyed(Connection c) {} public void onConnectionCapabilitiesChanged(Connection c, int capabilities) {} + public void onSupportedAudioRoutesChanged(Connection c, int supportedAudioRoutes) {} public void onVideoProviderChanged( Connection c, VideoProvider videoProvider) {} public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {} @@ -1082,6 +1083,7 @@ public abstract class Connection extends Conferenceable { private int mCallerDisplayNamePresentation; private boolean mRingbackRequested = false; private int mConnectionCapabilities; + private int mSupportedAudioRoutes = CallAudioState.ROUTE_ALL; private VideoProvider mVideoProvider; private boolean mAudioModeIsVoip; private long mConnectTimeMillis = Conference.CONNECT_TIME_NOT_SPECIFIED; @@ -1305,6 +1307,15 @@ public abstract class Connection extends Conferenceable { return mConnectionCapabilities; } + /** + * Returns the connection's supported audio routes. + * + * @hide + */ + public final int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** * Sets the value of the {@link #getAddress()} property. * @@ -1501,6 +1512,22 @@ public abstract class Connection extends Conferenceable { } } + /** + * Sets the supported audio routes. + * + * @param supportedAudioRoutes the supported audio routes as a bitmask. + * See {@link CallAudioState} + * @hide + */ + public final void setSupportedAudioRoutes(int supportedAudioRoutes) { + if (mSupportedAudioRoutes != supportedAudioRoutes) { + mSupportedAudioRoutes = supportedAudioRoutes; + for (Listener l : mListeners) { + l.onSupportedAudioRoutesChanged(this, mSupportedAudioRoutes); + } + } + } + /** * Tears down the Connection object. */ diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 4e330bdbf67d9..d35bac0d6de25 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -660,6 +660,7 @@ public abstract class ConnectionService extends Service { request.getAccountHandle(), connection.getState(), connection.getConnectionCapabilities(), + connection.getSupportedAudioRoutes(), connection.getAddress(), connection.getAddressPresentation(), connection.getCallerDisplayName(), @@ -997,6 +998,7 @@ public abstract class ConnectionService extends Service { phoneAccountHandle, connection.getState(), connection.getConnectionCapabilities(), + connection.getSupportedAudioRoutes(), connection.getAddress(), connection.getAddressPresentation(), connection.getCallerDisplayName(), diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java index 8cf4aebe840e0..599c210585f47 100644 --- a/telecomm/java/android/telecom/ParcelableCall.java +++ b/telecomm/java/android/telecom/ParcelableCall.java @@ -39,6 +39,7 @@ public final class ParcelableCall implements Parcelable { private final List mCannedSmsResponses; private final int mCapabilities; private final int mProperties; + private final int mSupportedAudioRoutes; private final long mConnectTimeMillis; private final Uri mHandle; private final int mHandlePresentation; @@ -64,6 +65,7 @@ public final class ParcelableCall implements Parcelable { List cannedSmsResponses, int capabilities, int properties, + int supportedAudioRoutes, long connectTimeMillis, Uri handle, int handlePresentation, @@ -86,6 +88,7 @@ public final class ParcelableCall implements Parcelable { mCannedSmsResponses = cannedSmsResponses; mCapabilities = capabilities; mProperties = properties; + mSupportedAudioRoutes = supportedAudioRoutes; mConnectTimeMillis = connectTimeMillis; mHandle = handle; mHandlePresentation = handlePresentation; @@ -137,6 +140,11 @@ public final class ParcelableCall implements Parcelable { /** Bitmask of properties of the call. */ public int getProperties() { return mProperties; } + /** Bitmask of supported routes of the call */ + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** The time that the call switched to the active state. */ public long getConnectTimeMillis() { return mConnectTimeMillis; @@ -291,6 +299,7 @@ public final class ParcelableCall implements Parcelable { source.readList(conferenceableCallIds, classLoader); Bundle intentExtras = source.readBundle(classLoader); Bundle extras = source.readBundle(classLoader); + int supportedAudioRoutes = source.readInt(); return new ParcelableCall( id, state, @@ -298,6 +307,7 @@ public final class ParcelableCall implements Parcelable { cannedSmsResponses, capabilities, properties, + supportedAudioRoutes, connectTimeMillis, handle, handlePresentation, @@ -354,6 +364,7 @@ public final class ParcelableCall implements Parcelable { destination.writeList(mConferenceableCallIds); destination.writeBundle(mIntentExtras); destination.writeBundle(mExtras); + destination.writeInt(mSupportedAudioRoutes); } @Override diff --git a/telecomm/java/android/telecom/ParcelableConnection.java b/telecomm/java/android/telecom/ParcelableConnection.java index fe0a4d8eef3d8..3ce917600e823 100644 --- a/telecomm/java/android/telecom/ParcelableConnection.java +++ b/telecomm/java/android/telecom/ParcelableConnection.java @@ -36,6 +36,7 @@ public final class ParcelableConnection implements Parcelable { private final PhoneAccountHandle mPhoneAccount; private final int mState; private final int mConnectionCapabilities; + private final int mSupportedAudioRoutes; private final Uri mAddress; private final int mAddressPresentation; private final String mCallerDisplayName; @@ -55,6 +56,7 @@ public final class ParcelableConnection implements Parcelable { PhoneAccountHandle phoneAccount, int state, int capabilities, + int supportedAudioRoutes, Uri address, int addressPresentation, String callerDisplayName, @@ -71,6 +73,7 @@ public final class ParcelableConnection implements Parcelable { mPhoneAccount = phoneAccount; mState = state; mConnectionCapabilities = capabilities; + mSupportedAudioRoutes = supportedAudioRoutes; mAddress = address; mAddressPresentation = addressPresentation; mCallerDisplayName = callerDisplayName; @@ -99,6 +102,10 @@ public final class ParcelableConnection implements Parcelable { return mConnectionCapabilities; } + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + public Uri getHandle() { return mAddress; } @@ -189,11 +196,13 @@ public final class ParcelableConnection implements Parcelable { List conferenceableConnectionIds = new ArrayList<>(); source.readStringList(conferenceableConnectionIds); Bundle extras = source.readBundle(classLoader); + int supportedAudioRoutes = source.readInt(); return new ParcelableConnection( phoneAccount, state, capabilities, + supportedAudioRoutes, address, addressPresentation, callerDisplayName, @@ -241,5 +250,6 @@ public final class ParcelableConnection implements Parcelable { destination.writeParcelable(mDisconnectCause, 0); destination.writeStringList(mConferenceableConnectionIds); destination.writeBundle(mExtras); + destination.writeInt(mSupportedAudioRoutes); } } diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java index b64043c6e07a7..e7f5e3c3c3e5d 100644 --- a/telecomm/java/android/telecom/PhoneAccount.java +++ b/telecomm/java/android/telecom/PhoneAccount.java @@ -17,15 +17,6 @@ package android.telecom; import android.annotation.SystemApi; -import android.content.ComponentName; -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.Resources.NotFoundException; -import android.graphics.Bitmap; -import android.graphics.Color; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Parcel; @@ -36,7 +27,6 @@ import java.lang.String; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.MissingResourceException; /** * Represents a distinct method to place or receive a phone call. Apps which can place calls and @@ -167,6 +157,7 @@ public final class PhoneAccount implements Parcelable { private final CharSequence mLabel; private final CharSequence mShortDescription; private final List mSupportedUriSchemes; + private final int mSupportedAudioRoutes; private final Icon mIcon; private boolean mIsEnabled; @@ -174,10 +165,12 @@ public final class PhoneAccount implements Parcelable { * Helper class for creating a {@link PhoneAccount}. */ public static class Builder { + private PhoneAccountHandle mAccountHandle; private Uri mAddress; private Uri mSubscriptionAddress; private int mCapabilities; + private int mSupportedAudioRoutes = CallAudioState.ROUTE_ALL; private int mHighlightColor = NO_HIGHLIGHT_COLOR; private CharSequence mLabel; private CharSequence mShortDescription; @@ -210,6 +203,7 @@ public final class PhoneAccount implements Parcelable { mSupportedUriSchemes.addAll(phoneAccount.getSupportedUriSchemes()); mIcon = phoneAccount.getIcon(); mIsEnabled = phoneAccount.isEnabled(); + mSupportedAudioRoutes = phoneAccount.getSupportedAudioRoutes(); } /** @@ -319,6 +313,18 @@ public final class PhoneAccount implements Parcelable { return this; } + /** + * Sets the audio routes supported by this {@link PhoneAccount}. + * + * @param routes bit mask of available routes. + * @return The builder. + * @hide + */ + public Builder setSupportedAudioRoutes(int routes) { + mSupportedAudioRoutes = routes; + return this; + } + /** * Creates an instance of a {@link PhoneAccount} based on the current builder settings. * @@ -340,6 +346,7 @@ public final class PhoneAccount implements Parcelable { mLabel, mShortDescription, mSupportedUriSchemes, + mSupportedAudioRoutes, mIsEnabled); } } @@ -354,6 +361,7 @@ public final class PhoneAccount implements Parcelable { CharSequence label, CharSequence shortDescription, List supportedUriSchemes, + int supportedAudioRoutes, boolean isEnabled) { mAccountHandle = account; mAddress = address; @@ -364,6 +372,7 @@ public final class PhoneAccount implements Parcelable { mLabel = label; mShortDescription = shortDescription; mSupportedUriSchemes = Collections.unmodifiableList(supportedUriSchemes); + mSupportedAudioRoutes = supportedAudioRoutes; mIsEnabled = isEnabled; } @@ -462,6 +471,15 @@ public final class PhoneAccount implements Parcelable { return mSupportedUriSchemes; } + /** + * The audio routes supported by this {@code PhoneAccount}. + * + * @hide + */ + public int getSupportedAudioRoutes() { + return mSupportedAudioRoutes; + } + /** * The icon to represent this {@code PhoneAccount}. * @@ -561,6 +579,7 @@ public final class PhoneAccount implements Parcelable { mIcon.writeToParcel(out, flags); } out.writeByte((byte) (mIsEnabled ? 1 : 0)); + out.writeInt(mSupportedAudioRoutes); } public static final Creator CREATOR @@ -603,6 +622,7 @@ public final class PhoneAccount implements Parcelable { mIcon = null; } mIsEnabled = in.readByte() == 1; + mSupportedAudioRoutes = in.readInt(); } @Override @@ -613,6 +633,8 @@ public final class PhoneAccount implements Parcelable { .append(mAccountHandle) .append(" Capabilities: ") .append(mCapabilities) + .append(" Audio Routes: ") + .append(mSupportedAudioRoutes) .append(" Schemes: "); for (String scheme : mSupportedUriSchemes) { sb.append(scheme)