14cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal/* 24cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * Copyright (C) 2014 The Android Open Source Project 34cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * 44cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * Licensed under the Apache License, Version 2.0 (the "License"); 54cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * you may not use this file except in compliance with the License. 64cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * You may obtain a copy of the License at 74cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * 84cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * http://www.apache.org/licenses/LICENSE-2.0 94cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * 104cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * Unless required by applicable law or agreed to in writing, software 114cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * distributed under the License is distributed on an "AS IS" BASIS, 124cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * See the License for the specific language governing permissions and 144cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * limitations under the License. 154cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal */ 164cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 17ef9f6f957d897ea0ed82114185b8fa3fefd4917bTyler Gunnpackage android.telecom; 184cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 194af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Leeimport android.annotation.SystemApi; 204cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepalimport android.os.Parcel; 214cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepalimport android.os.Parcelable; 224cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 234cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepalimport java.util.Locale; 244cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 254cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal/** 26d9e614fd56677bc39481fce115731d55ab72171aSantos Cordon * Encapsulates the telecom audio state, including the current audio routing, supported audio 27d9e614fd56677bc39481fce115731d55ab72171aSantos Cordon * routing and mute. 284af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @deprecated - use {@link CallAudioState} instead. 294af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee * @hide 304cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal */ 314af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee@Deprecated 324af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee@SystemApi 334af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Leepublic class AudioState implements Parcelable { 344cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal /** Direct the audio stream through the device's earpiece. */ 351426048bd37907b5b50401f7242cddacdc3f024aYorke Lee public static final int ROUTE_EARPIECE = 0x00000001; 364cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 374cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal /** Direct the audio stream through Bluetooth. */ 381426048bd37907b5b50401f7242cddacdc3f024aYorke Lee public static final int ROUTE_BLUETOOTH = 0x00000002; 394cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 404cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal /** Direct the audio stream through a wired headset. */ 411426048bd37907b5b50401f7242cddacdc3f024aYorke Lee public static final int ROUTE_WIRED_HEADSET = 0x00000004; 424cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 43ea38cca14964a5ee658899b0bafbc48017d556cdNancy Chen /** Direct the audio stream through the device's speakerphone. */ 441426048bd37907b5b50401f7242cddacdc3f024aYorke Lee public static final int ROUTE_SPEAKER = 0x00000008; 454cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 464cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal /** 474cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * Direct the audio stream through the device's earpiece or wired headset if one is 484cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * connected. 494cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal */ 501426048bd37907b5b50401f7242cddacdc3f024aYorke Lee public static final int ROUTE_WIRED_OR_EARPIECE = ROUTE_EARPIECE | ROUTE_WIRED_HEADSET; 514cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 5255b97525f0f50857f1ab0acd2608053fd0f3416cJay Shrauner /** Bit mask of all possible audio routes. */ 5355b97525f0f50857f1ab0acd2608053fd0f3416cJay Shrauner private static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET | 544cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal ROUTE_SPEAKER; 554cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 56164a0acf53a3496c974a97ed35834e6195c14e4bJay Shrauner private final boolean isMuted; 57164a0acf53a3496c974a97ed35834e6195c14e4bJay Shrauner private final int route; 58164a0acf53a3496c974a97ed35834e6195c14e4bJay Shrauner private final int supportedRouteMask; 594cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 605c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public AudioState(boolean muted, int route, int supportedRouteMask) { 615c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad this.isMuted = muted; 624cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal this.route = route; 634cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal this.supportedRouteMask = supportedRouteMask; 644cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 654cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 66b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public AudioState(AudioState state) { 675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad isMuted = state.isMuted(); 685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad route = state.getRoute(); 695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad supportedRouteMask = state.getSupportedRouteMask(); 704cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 714cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 724af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee public AudioState(CallAudioState state) { 734af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee isMuted = state.isMuted(); 744af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee route = state.getRoute(); 754af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee supportedRouteMask = state.getSupportedRouteMask(); 764af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee } 774af5935c71f1e31ef1aec27661c4ef60545a0924Yorke Lee 784cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal @Override 794cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal public boolean equals(Object obj) { 804cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal if (obj == null) { 814cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal return false; 824cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 83b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad if (!(obj instanceof AudioState)) { 844cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal return false; 854cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 86b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad AudioState state = (AudioState) obj; 875c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return isMuted() == state.isMuted() && getRoute() == state.getRoute() && 885c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad getSupportedRouteMask() == state.getSupportedRouteMask(); 894cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 904cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 914cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal @Override 924cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal public String toString() { 934cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal return String.format(Locale.US, 94ddf15a164981c6f32fccaf6bcc45a9ff6113fd3aNancy Chen "[AudioState isMuted: %b, route: %s, supportedRouteMask: %s]", 955c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad isMuted, 965c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad audioRouteToString(route), 975c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad audioRouteToString(supportedRouteMask)); 984cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 994cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1004cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal public static String audioRouteToString(int route) { 1014cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal if (route == 0 || (route & ~ROUTE_ALL) != 0x0) { 1024cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal return "UNKNOWN"; 1034cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1044cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1054cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal StringBuffer buffer = new StringBuffer(); 1064cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal if ((route & ROUTE_EARPIECE) == ROUTE_EARPIECE) { 1074cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal listAppend(buffer, "EARPIECE"); 1084cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1094cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal if ((route & ROUTE_BLUETOOTH) == ROUTE_BLUETOOTH) { 1104cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal listAppend(buffer, "BLUETOOTH"); 1114cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1124cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal if ((route & ROUTE_WIRED_HEADSET) == ROUTE_WIRED_HEADSET) { 1134cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal listAppend(buffer, "WIRED_HEADSET"); 1144cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1154cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal if ((route & ROUTE_SPEAKER) == ROUTE_SPEAKER) { 1164cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal listAppend(buffer, "SPEAKER"); 1174cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1184cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1194cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal return buffer.toString(); 1204cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1214cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1224cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal private static void listAppend(StringBuffer buffer, String str) { 1234cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal if (buffer.length() > 0) { 1244cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal buffer.append(", "); 1254cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1264cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal buffer.append(str); 1274cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1284cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1294cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal /** 130b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Responsible for creating AudioState objects for deserialized Parcels. 1314cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal */ 132b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public static final Parcelable.Creator<AudioState> CREATOR = 133b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad new Parcelable.Creator<AudioState> () { 1344cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1354cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal @Override 136b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public AudioState createFromParcel(Parcel source) { 1374cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal boolean isMuted = source.readByte() == 0 ? false : true; 1384cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal int route = source.readInt(); 1394cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal int supportedRouteMask = source.readInt(); 140b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return new AudioState(isMuted, route, supportedRouteMask); 1414cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1424cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1434cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal @Override 144b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad public AudioState[] newArray(int size) { 145b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad return new AudioState[size]; 1464cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1474cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal }; 1484cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1494cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal /** 1504cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal * {@inheritDoc} 1514cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal */ 1524cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal @Override 1534cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal public int describeContents() { 1544cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal return 0; 1554cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1564cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal 1574cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal /** 158b19a0bcdd8a5020c61a0d697f600fdc943c86f59Ihab Awad * Writes AudioState object into a serializeable Parcel. 1594cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal */ 1604cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal @Override 1614cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal public void writeToParcel(Parcel destination, int flags) { 1624cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal destination.writeByte((byte) (isMuted ? 1 : 0)); 1634cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal destination.writeInt(route); 1644cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal destination.writeInt(supportedRouteMask); 1654cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal } 1665c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1675c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1685c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return {@code true} if the call is muted, false otherwise. 1695c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1705c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public boolean isMuted() { 1715c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return isMuted; 1725c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 1735c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1745c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1755c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return The current audio route being used. 1765c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1775c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public int getRoute() { 1785c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return route; 1795c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 1805c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad 1815c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad /** 1825c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad * @return Bit mask of all routes supported by this call. 1835c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad */ 1845c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad public int getSupportedRouteMask() { 1855c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad return supportedRouteMask; 1865c9c86ec0f95d1f5e1aca212967f508fc736b895Ihab Awad } 1874cff392a2b3702514e78c5419bf15de6e39c59afSailesh Nepal} 188