• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.telecom;
18 
19 import android.annotation.SystemApi;
20 import android.os.Parcel;
21 import android.os.Parcelable;
22 
23 import java.util.Locale;
24 
25 /**
26  *  Encapsulates all audio states during a call.
27  *  @hide
28  */
29 @SystemApi
30 public final class AudioState implements Parcelable {
31     /** Direct the audio stream through the device's earpiece. */
32     public static final int ROUTE_EARPIECE      = 0x00000001;
33 
34     /** Direct the audio stream through Bluetooth. */
35     public static final int ROUTE_BLUETOOTH     = 0x00000002;
36 
37     /** Direct the audio stream through a wired headset. */
38     public static final int ROUTE_WIRED_HEADSET = 0x00000004;
39 
40     /** Direct the audio stream through the device's speakerphone. */
41     public static final int ROUTE_SPEAKER       = 0x00000008;
42 
43     /**
44      * Direct the audio stream through the device's earpiece or wired headset if one is
45      * connected.
46      */
47     public static final int ROUTE_WIRED_OR_EARPIECE = ROUTE_EARPIECE | ROUTE_WIRED_HEADSET;
48 
49     /** Bit mask of all possible audio routes.
50      *
51      * @hide
52      */
53     public static final int ROUTE_ALL = ROUTE_EARPIECE | ROUTE_BLUETOOTH | ROUTE_WIRED_HEADSET |
54             ROUTE_SPEAKER;
55 
56     /** True if the call is muted, false otherwise. */
57     public final boolean isMuted;
58 
59     /** The route to use for the audio stream. */
60     public final int route;
61 
62     /** Bit vector of all routes supported by this call. */
63     public final int supportedRouteMask;
64 
AudioState(boolean isMuted, int route, int supportedRouteMask)65     public AudioState(boolean isMuted, int route, int supportedRouteMask) {
66         this.isMuted = isMuted;
67         this.route = route;
68         this.supportedRouteMask = supportedRouteMask;
69     }
70 
AudioState(AudioState state)71     public AudioState(AudioState state) {
72         isMuted = state.isMuted;
73         route = state.route;
74         supportedRouteMask = state.supportedRouteMask;
75     }
76 
77     @Override
equals(Object obj)78     public boolean equals(Object obj) {
79         if (obj == null) {
80             return false;
81         }
82         if (!(obj instanceof AudioState)) {
83             return false;
84         }
85         AudioState state = (AudioState) obj;
86         return isMuted == state.isMuted && route == state.route &&
87                 supportedRouteMask == state.supportedRouteMask;
88     }
89 
90     @Override
toString()91     public String toString() {
92         return String.format(Locale.US,
93                 "[AudioState isMuted: %b, route; %s, supportedRouteMask: %s]",
94                 isMuted, audioRouteToString(route), audioRouteToString(supportedRouteMask));
95     }
96 
97     /** @hide */
audioRouteToString(int route)98     public static String audioRouteToString(int route) {
99         if (route == 0 || (route & ~ROUTE_ALL) != 0x0) {
100             return "UNKNOWN";
101         }
102 
103         StringBuffer buffer = new StringBuffer();
104         if ((route & ROUTE_EARPIECE) == ROUTE_EARPIECE) {
105             listAppend(buffer, "EARPIECE");
106         }
107         if ((route & ROUTE_BLUETOOTH) == ROUTE_BLUETOOTH) {
108             listAppend(buffer, "BLUETOOTH");
109         }
110         if ((route & ROUTE_WIRED_HEADSET) == ROUTE_WIRED_HEADSET) {
111             listAppend(buffer, "WIRED_HEADSET");
112         }
113         if ((route & ROUTE_SPEAKER) == ROUTE_SPEAKER) {
114             listAppend(buffer, "SPEAKER");
115         }
116 
117         return buffer.toString();
118     }
119 
listAppend(StringBuffer buffer, String str)120     private static void listAppend(StringBuffer buffer, String str) {
121         if (buffer.length() > 0) {
122             buffer.append(", ");
123         }
124         buffer.append(str);
125     }
126 
127     /**
128      * Responsible for creating AudioState objects for deserialized Parcels.
129      */
130     public static final Parcelable.Creator<AudioState> CREATOR =
131             new Parcelable.Creator<AudioState> () {
132 
133         @Override
134         public AudioState createFromParcel(Parcel source) {
135             boolean isMuted = source.readByte() == 0 ? false : true;
136             int route = source.readInt();
137             int supportedRouteMask = source.readInt();
138             return new AudioState(isMuted, route, supportedRouteMask);
139         }
140 
141         @Override
142         public AudioState[] newArray(int size) {
143             return new AudioState[size];
144         }
145     };
146 
147     /**
148      * {@inheritDoc}
149      */
150     @Override
describeContents()151     public int describeContents() {
152         return 0;
153     }
154 
155     /**
156      * Writes AudioState object into a serializeable Parcel.
157      */
158     @Override
writeToParcel(Parcel destination, int flags)159     public void writeToParcel(Parcel destination, int flags) {
160         destination.writeByte((byte) (isMuted ? 1 : 0));
161         destination.writeInt(route);
162         destination.writeInt(supportedRouteMask);
163     }
164 }
165