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