1 /*
2  * Copyright (C) 2010-2016 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 
18 package android.bluetooth;
19 
20 import android.Manifest;
21 import android.annotation.RequiresPermission;
22 import android.annotation.SystemApi;
23 
24 import java.util.List;
25 
26 /**
27  * Public APIs for the Bluetooth Profiles.
28  *
29  * <p> Clients should call {@link BluetoothAdapter#getProfileProxy},
30  * to get the Profile Proxy. Each public profile implements this
31  * interface.
32  */
33 public interface BluetoothProfile {
34 
35     /**
36      * Extra for the connection state intents of the individual profiles.
37      *
38      * This extra represents the current connection state of the profile of the
39      * Bluetooth device.
40      */
41     String EXTRA_STATE = "android.bluetooth.profile.extra.STATE";
42 
43     /**
44      * Extra for the connection state intents of the individual profiles.
45      *
46      * This extra represents the previous connection state of the profile of the
47      * Bluetooth device.
48      */
49     String EXTRA_PREVIOUS_STATE =
50             "android.bluetooth.profile.extra.PREVIOUS_STATE";
51 
52     /** The profile is in disconnected state */
53     int STATE_DISCONNECTED = 0;
54     /** The profile is in connecting state */
55     int STATE_CONNECTING = 1;
56     /** The profile is in connected state */
57     int STATE_CONNECTED = 2;
58     /** The profile is in disconnecting state */
59     int STATE_DISCONNECTING = 3;
60 
61     /**
62      * Headset and Handsfree profile
63      */
64     int HEADSET = 1;
65 
66     /**
67      * A2DP profile.
68      */
69     int A2DP = 2;
70 
71     /**
72      * Health Profile
73      */
74     int HEALTH = 3;
75 
76     /**
77      * HID Host
78      *
79      * @hide
80      */
81     int HID_HOST = 4;
82 
83     /**
84      * PAN Profile
85      *
86      * @hide
87      */
88     int PAN = 5;
89 
90     /**
91      * PBAP
92      *
93      * @hide
94      */
95     int PBAP = 6;
96 
97     /**
98      * GATT
99      */
100     int GATT = 7;
101 
102     /**
103      * GATT_SERVER
104      */
105     int GATT_SERVER = 8;
106 
107     /**
108      * MAP Profile
109      *
110      * @hide
111      */
112     int MAP = 9;
113 
114     /*
115      * SAP Profile
116      * @hide
117      */
118     int SAP = 10;
119 
120     /**
121      * A2DP Sink Profile
122      *
123      * @hide
124      */
125     int A2DP_SINK = 11;
126 
127     /**
128      * AVRCP Controller Profile
129      *
130      * @hide
131      */
132     int AVRCP_CONTROLLER = 12;
133 
134     /**
135      * AVRCP Target Profile
136      *
137      * @hide
138      */
139     int AVRCP = 13;
140 
141     /**
142      * Headset Client - HFP HF Role
143      *
144      * @hide
145      */
146     int HEADSET_CLIENT = 16;
147 
148     /**
149      * PBAP Client
150      *
151      * @hide
152      */
153     int PBAP_CLIENT = 17;
154 
155     /**
156      * MAP Messaging Client Equipment (MCE)
157      *
158      * @hide
159      */
160     int MAP_CLIENT = 18;
161 
162     /**
163      * HID Device
164      */
165     int HID_DEVICE = 19;
166 
167     /**
168      * Object Push Profile (OPP)
169      *
170      * @hide
171      */
172     int OPP = 20;
173 
174     /**
175      * Hearing Aid Device
176      *
177      * @hide
178      */
179     int HEARING_AID = 21;
180 
181     /**
182      * Max profile ID. This value should be updated whenever a new profile is added to match
183      * the largest value assigned to a profile.
184      *
185      * @hide
186      */
187     int MAX_PROFILE_ID = 21;
188 
189     /**
190      * Default priority for devices that we try to auto-connect to and
191      * and allow incoming connections for the profile
192      *
193      * @hide
194      **/
195     int PRIORITY_AUTO_CONNECT = 1000;
196 
197     /**
198      * Default priority for devices that allow incoming
199      * and outgoing connections for the profile
200      *
201      * @hide
202      **/
203     @SystemApi
204     int PRIORITY_ON = 100;
205 
206     /**
207      * Default priority for devices that does not allow incoming
208      * connections and outgoing connections for the profile.
209      *
210      * @hide
211      **/
212     @SystemApi
213     int PRIORITY_OFF = 0;
214 
215     /**
216      * Default priority when not set or when the device is unpaired
217      *
218      * @hide
219      */
220     int PRIORITY_UNDEFINED = -1;
221 
222     /**
223      * Get connected devices for this specific profile.
224      *
225      * <p> Return the set of devices which are in state {@link #STATE_CONNECTED}
226      *
227      * @return List of devices. The list will be empty on error.
228      */
229     @RequiresPermission(Manifest.permission.BLUETOOTH)
getConnectedDevices()230     public List<BluetoothDevice> getConnectedDevices();
231 
232     /**
233      * Get a list of devices that match any of the given connection
234      * states.
235      *
236      * <p> If none of the devices match any of the given states,
237      * an empty list will be returned.
238      *
239      * @param states Array of states. States can be one of {@link #STATE_CONNECTED}, {@link
240      * #STATE_CONNECTING}, {@link #STATE_DISCONNECTED}, {@link #STATE_DISCONNECTING},
241      * @return List of devices. The list will be empty on error.
242      */
243     @RequiresPermission(Manifest.permission.BLUETOOTH)
getDevicesMatchingConnectionStates(int[] states)244     public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states);
245 
246     /**
247      * Get the current connection state of the profile
248      *
249      * @param device Remote bluetooth device.
250      * @return State of the profile connection. One of {@link #STATE_CONNECTED}, {@link
251      * #STATE_CONNECTING}, {@link #STATE_DISCONNECTED}, {@link #STATE_DISCONNECTING}
252      */
253     @RequiresPermission(Manifest.permission.BLUETOOTH)
getConnectionState(BluetoothDevice device)254     public int getConnectionState(BluetoothDevice device);
255 
256     /**
257      * An interface for notifying BluetoothProfile IPC clients when they have
258      * been connected or disconnected to the service.
259      */
260     public interface ServiceListener {
261         /**
262          * Called to notify the client when the proxy object has been
263          * connected to the service.
264          *
265          * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or {@link #A2DP}
266          * @param proxy - One of {@link BluetoothHealth}, {@link BluetoothHeadset} or {@link
267          * BluetoothA2dp}
268          */
onServiceConnected(int profile, BluetoothProfile proxy)269         public void onServiceConnected(int profile, BluetoothProfile proxy);
270 
271         /**
272          * Called to notify the client that this proxy object has been
273          * disconnected from the service.
274          *
275          * @param profile - One of {@link #HEALTH}, {@link #HEADSET} or {@link #A2DP}
276          */
onServiceDisconnected(int profile)277         public void onServiceDisconnected(int profile);
278     }
279 
280     /**
281      * Convert an integer value of connection state into human readable string
282      *
283      * @param connectionState - One of {@link #STATE_DISCONNECTED}, {@link #STATE_CONNECTING},
284      * {@link #STATE_CONNECTED}, or {@link #STATE_DISCONNECTED}
285      * @return a string representation of the connection state, STATE_UNKNOWN if the state
286      * is not defined
287      * @hide
288      */
getConnectionStateName(int connectionState)289     static String getConnectionStateName(int connectionState) {
290         switch (connectionState) {
291             case STATE_DISCONNECTED:
292                 return "STATE_DISCONNECTED";
293             case STATE_CONNECTING:
294                 return "STATE_CONNECTING";
295             case STATE_CONNECTED:
296                 return "STATE_CONNECTED";
297             case STATE_DISCONNECTING:
298                 return "STATE_DISCONNECTING";
299             default:
300                 return "STATE_UNKNOWN";
301         }
302     }
303 }
304