|  | /* | 
|  | * Copyright (C) 2010-2016 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | package android.bluetooth; | 
|  |  | 
|  | import android.annotation.IntDef; | 
|  | import android.annotation.NonNull; | 
|  | import android.annotation.RequiresNoPermission; | 
|  | import android.annotation.SuppressLint; | 
|  | import android.annotation.SystemApi; | 
|  | import android.compat.annotation.UnsupportedAppUsage; | 
|  | import android.os.Build; | 
|  | import android.os.IBinder; | 
|  |  | 
|  | import java.lang.annotation.Retention; | 
|  | import java.lang.annotation.RetentionPolicy; | 
|  | import java.util.List; | 
|  |  | 
|  | /** | 
|  | * Public APIs for the Bluetooth Profiles. | 
|  | * | 
|  | * <p>Clients should call {@link BluetoothAdapter#getProfileProxy}, to get the Profile Proxy. Each | 
|  | * public profile implements this interface. | 
|  | */ | 
|  | public interface BluetoothProfile { | 
|  |  | 
|  | /** | 
|  | * Extra for the connection state intents of the individual profiles. | 
|  | * | 
|  | * <p>This extra represents the current connection state of the profile of the Bluetooth device. | 
|  | */ | 
|  | @SuppressLint("ActionValue") | 
|  | String EXTRA_STATE = "android.bluetooth.profile.extra.STATE"; | 
|  |  | 
|  | /** | 
|  | * Extra for the connection state intents of the individual profiles. | 
|  | * | 
|  | * <p>This extra represents the previous connection state of the profile of the Bluetooth | 
|  | * device. | 
|  | */ | 
|  | @SuppressLint("ActionValue") | 
|  | String EXTRA_PREVIOUS_STATE = "android.bluetooth.profile.extra.PREVIOUS_STATE"; | 
|  |  | 
|  | /** The profile is in disconnected state */ | 
|  | int STATE_DISCONNECTED = 0; | 
|  |  | 
|  | /** The profile is in connecting state */ | 
|  | int STATE_CONNECTING = 1; | 
|  |  | 
|  | /** The profile is in connected state */ | 
|  | int STATE_CONNECTED = 2; | 
|  |  | 
|  | /** The profile is in disconnecting state */ | 
|  | int STATE_DISCONNECTING = 3; | 
|  |  | 
|  | /** @hide */ | 
|  | @IntDef({ | 
|  | STATE_DISCONNECTED, | 
|  | STATE_CONNECTING, | 
|  | STATE_CONNECTED, | 
|  | STATE_DISCONNECTING, | 
|  | }) | 
|  | @Retention(RetentionPolicy.SOURCE) | 
|  | public @interface BtProfileState {} | 
|  |  | 
|  | /** Headset and Handsfree profile */ | 
|  | int HEADSET = 1; | 
|  |  | 
|  | /** A2DP profile. */ | 
|  | int A2DP = 2; | 
|  |  | 
|  | /** | 
|  | * Health Profile | 
|  | * | 
|  | * @deprecated Health Device Profile (HDP) and MCAP protocol are no longer used. New apps should | 
|  | *     use Bluetooth Low Energy based solutions such as {@link BluetoothGatt}, {@link | 
|  | *     BluetoothAdapter#listenUsingL2capChannel()}, or {@link | 
|  | *     BluetoothDevice#createL2capChannel(int)} | 
|  | */ | 
|  | @Deprecated int HEALTH = 3; | 
|  |  | 
|  | /** | 
|  | * HID Host | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int HID_HOST = 4; | 
|  |  | 
|  | /** | 
|  | * PAN Profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int PAN = 5; | 
|  |  | 
|  | /** | 
|  | * PBAP | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int PBAP = 6; | 
|  |  | 
|  | /** GATT */ | 
|  | int GATT = 7; | 
|  |  | 
|  | /** GATT_SERVER */ | 
|  | int GATT_SERVER = 8; | 
|  |  | 
|  | /** | 
|  | * MAP Profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int MAP = 9; | 
|  |  | 
|  | /* | 
|  | * SAP Profile | 
|  | * @hide | 
|  | */ | 
|  | int SAP = 10; | 
|  |  | 
|  | /** | 
|  | * A2DP Sink Profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int A2DP_SINK = 11; | 
|  |  | 
|  | /** | 
|  | * AVRCP Controller Profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int AVRCP_CONTROLLER = 12; | 
|  |  | 
|  | /** | 
|  | * AVRCP Target Profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | int AVRCP = 13; | 
|  |  | 
|  | /** | 
|  | * Headset Client - HFP HF Role | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int HEADSET_CLIENT = 16; | 
|  |  | 
|  | /** | 
|  | * PBAP Client | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int PBAP_CLIENT = 17; | 
|  |  | 
|  | /** | 
|  | * MAP Messaging Client Equipment (MCE) | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int MAP_CLIENT = 18; | 
|  |  | 
|  | /** HID Device */ | 
|  | int HID_DEVICE = 19; | 
|  |  | 
|  | /** | 
|  | * Object Push Profile (OPP) | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int OPP = 20; | 
|  |  | 
|  | /** Hearing Aid Device */ | 
|  | int HEARING_AID = 21; | 
|  |  | 
|  | /** LE Audio Device */ | 
|  | int LE_AUDIO = 22; | 
|  |  | 
|  | /** | 
|  | * Volume Control profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int VOLUME_CONTROL = 23; | 
|  |  | 
|  | /** | 
|  | * @hide Media Control Profile server | 
|  | */ | 
|  | int MCP_SERVER = 24; | 
|  |  | 
|  | /** Coordinated Set Identification Profile set coordinator */ | 
|  | int CSIP_SET_COORDINATOR = 25; | 
|  |  | 
|  | /** | 
|  | * LE Audio Broadcast Source | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int LE_AUDIO_BROADCAST = 26; | 
|  |  | 
|  | /** | 
|  | * @hide Telephone Bearer Service from Call Control Profile | 
|  | */ | 
|  | int LE_CALL_CONTROL = 27; | 
|  |  | 
|  | /* | 
|  | * Hearing Access Profile Client | 
|  | * | 
|  | */ | 
|  | int HAP_CLIENT = 28; | 
|  |  | 
|  | /** | 
|  | * LE Audio Broadcast Assistant | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int LE_AUDIO_BROADCAST_ASSISTANT = 29; | 
|  |  | 
|  | /** | 
|  | * Battery Service | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | int BATTERY = 30; | 
|  |  | 
|  | /** | 
|  | * Max profile ID. This value should be updated whenever a new profile is added to match the | 
|  | * largest value assigned to a profile. | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | int MAX_PROFILE_ID = 30; | 
|  |  | 
|  | /** | 
|  | * Default priority for devices that we try to auto-connect to and allow incoming connections | 
|  | * for the profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) | 
|  | int PRIORITY_AUTO_CONNECT = 1000; | 
|  |  | 
|  | /** | 
|  | * Default priority for devices that allow incoming and outgoing connections for the profile | 
|  | * | 
|  | * @hide | 
|  | * @deprecated Replaced with {@link #CONNECTION_POLICY_ALLOWED} | 
|  | */ | 
|  | @Deprecated @SystemApi int PRIORITY_ON = 100; | 
|  |  | 
|  | /** | 
|  | * Default priority for devices that does not allow incoming connections and outgoing | 
|  | * connections for the profile. | 
|  | * | 
|  | * @hide | 
|  | * @deprecated Replaced with {@link #CONNECTION_POLICY_FORBIDDEN} | 
|  | */ | 
|  | @Deprecated @SystemApi int PRIORITY_OFF = 0; | 
|  |  | 
|  | /** | 
|  | * Default priority when not set or when the device is unpaired | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @UnsupportedAppUsage int PRIORITY_UNDEFINED = -1; | 
|  |  | 
|  | /** @hide */ | 
|  | @IntDef( | 
|  | prefix = "CONNECTION_POLICY_", | 
|  | value = { | 
|  | CONNECTION_POLICY_ALLOWED, | 
|  | CONNECTION_POLICY_FORBIDDEN, | 
|  | CONNECTION_POLICY_UNKNOWN | 
|  | }) | 
|  | @Retention(RetentionPolicy.SOURCE) | 
|  | public @interface ConnectionPolicy {} | 
|  |  | 
|  | /** | 
|  | * Default connection policy for devices that allow incoming and outgoing connections for the | 
|  | * profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int CONNECTION_POLICY_ALLOWED = 100; | 
|  |  | 
|  | /** | 
|  | * Default connection policy for devices that do not allow incoming or outgoing connections for | 
|  | * the profile. | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int CONNECTION_POLICY_FORBIDDEN = 0; | 
|  |  | 
|  | /** | 
|  | * Default connection policy when not set or when the device is unpaired | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi int CONNECTION_POLICY_UNKNOWN = -1; | 
|  |  | 
|  | /** | 
|  | * Get connected devices for this specific profile. | 
|  | * | 
|  | * <p>Return the set of devices which are in state {@link #STATE_CONNECTED} | 
|  | * | 
|  | * @return List of devices. The list will be empty on error. | 
|  | */ | 
|  | List<BluetoothDevice> getConnectedDevices(); | 
|  |  | 
|  | /** | 
|  | * Get a list of devices that match any of the given connection states. | 
|  | * | 
|  | * <p>If none of the devices match any of the given states, an empty list will be returned. | 
|  | * | 
|  | * @param states Array of states. States can be one of {@link #STATE_CONNECTED}, {@link | 
|  | *     #STATE_CONNECTING}, {@link #STATE_DISCONNECTED}, {@link #STATE_DISCONNECTING}, | 
|  | * @return List of devices. The list will be empty on error. | 
|  | */ | 
|  | List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states); | 
|  |  | 
|  | /** | 
|  | * Get the current connection state of the profile | 
|  | * | 
|  | * @param device Remote bluetooth device. | 
|  | * @return State of the profile connection. One of {@link #STATE_CONNECTED}, {@link | 
|  | *     #STATE_CONNECTING}, {@link #STATE_DISCONNECTED}, {@link #STATE_DISCONNECTING} | 
|  | */ | 
|  | @BtProfileState | 
|  | int getConnectionState(BluetoothDevice device); | 
|  |  | 
|  | /** | 
|  | * Called by the BluetoothAdapter when the Bluetooth service is connected with a Binder instance | 
|  | * corresponding to the service associated with the profile | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | void onServiceConnected(IBinder service); | 
|  |  | 
|  | /** | 
|  | * Called by the BluetoothAdapter when the Bluetooth service connection has been lost | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | void onServiceDisconnected(); | 
|  |  | 
|  | /** | 
|  | * Get the BluetoothAdapter that created this proxy | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | BluetoothAdapter getAdapter(); | 
|  |  | 
|  | /** | 
|  | * An interface for notifying BluetoothProfile IPC clients when they have been connected or | 
|  | * disconnected to the service. | 
|  | */ | 
|  | public interface ServiceListener { | 
|  | /** | 
|  | * Called to notify the client when the proxy object has been connected to the service. | 
|  | * | 
|  | * @param profile - One of {@link #HEADSET} or {@link #A2DP} | 
|  | * @param proxy - One of {@link BluetoothHeadset} or {@link BluetoothA2dp} | 
|  | */ | 
|  | @RequiresNoPermission | 
|  | void onServiceConnected(int profile, BluetoothProfile proxy); | 
|  |  | 
|  | /** | 
|  | * Called to notify the client that this proxy object has been disconnected from the | 
|  | * service. | 
|  | * | 
|  | * @param profile - One of {@link #HEADSET} or {@link #A2DP} | 
|  | */ | 
|  | @RequiresNoPermission | 
|  | void onServiceDisconnected(int profile); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Convert an integer value of connection state into human readable string | 
|  | * | 
|  | * @param connectionState - One of {@link #STATE_DISCONNECTED}, {@link #STATE_CONNECTING}, | 
|  | *     {@link #STATE_CONNECTED}, or {@link #STATE_DISCONNECTED} | 
|  | * @return a string representation of the connection state, STATE_UNKNOWN if the state is not | 
|  | *     defined | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi | 
|  | @NonNull | 
|  | @RequiresNoPermission | 
|  | static String getConnectionStateName(int connectionState) { | 
|  | switch (connectionState) { | 
|  | case STATE_DISCONNECTED: | 
|  | return "STATE_DISCONNECTED"; | 
|  | case STATE_CONNECTING: | 
|  | return "STATE_CONNECTING"; | 
|  | case STATE_CONNECTED: | 
|  | return "STATE_CONNECTED"; | 
|  | case STATE_DISCONNECTING: | 
|  | return "STATE_DISCONNECTING"; | 
|  | default: | 
|  | return "STATE_UNKNOWN"; | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Convert an integer value of profile ID into human readable string | 
|  | * | 
|  | * @param profile profile ID | 
|  | * @return profile name as String, UNKNOWN_PROFILE if the profile ID is not defined. | 
|  | * @hide | 
|  | */ | 
|  | @SystemApi | 
|  | @NonNull | 
|  | @RequiresNoPermission | 
|  | static String getProfileName(int profile) { | 
|  | switch (profile) { | 
|  | case HEADSET: | 
|  | return "HEADSET"; | 
|  | case A2DP: | 
|  | return "A2DP"; | 
|  | case HID_HOST: | 
|  | return "HID_HOST"; | 
|  | case PAN: | 
|  | return "PAN"; | 
|  | case PBAP: | 
|  | return "PBAP"; | 
|  | case GATT: | 
|  | return "GATT"; | 
|  | case GATT_SERVER: | 
|  | return "GATT_SERVER"; | 
|  | case MAP: | 
|  | return "MAP"; | 
|  | case SAP: | 
|  | return "SAP"; | 
|  | case A2DP_SINK: | 
|  | return "A2DP_SINK"; | 
|  | case AVRCP_CONTROLLER: | 
|  | return "AVRCP_CONTROLLER"; | 
|  | case AVRCP: | 
|  | return "AVRCP"; | 
|  | case HEADSET_CLIENT: | 
|  | return "HEADSET_CLIENT"; | 
|  | case PBAP_CLIENT: | 
|  | return "PBAP_CLIENT"; | 
|  | case MAP_CLIENT: | 
|  | return "MAP_CLIENT"; | 
|  | case HID_DEVICE: | 
|  | return "HID_DEVICE"; | 
|  | case OPP: | 
|  | return "OPP"; | 
|  | case HEARING_AID: | 
|  | return "HEARING_AID"; | 
|  | case LE_AUDIO: | 
|  | return "LE_AUDIO"; | 
|  | case VOLUME_CONTROL: | 
|  | return "VOLUME_CONTROL"; | 
|  | case MCP_SERVER: | 
|  | return "MCP_SERVER"; | 
|  | case CSIP_SET_COORDINATOR: | 
|  | return "CSIP_SET_COORDINATOR"; | 
|  | case LE_AUDIO_BROADCAST: | 
|  | return "LE_AUDIO_BROADCAST"; | 
|  | case LE_CALL_CONTROL: | 
|  | return "LE_CALL_CONTROL"; | 
|  | case HAP_CLIENT: | 
|  | return "HAP_CLIENT"; | 
|  | case LE_AUDIO_BROADCAST_ASSISTANT: | 
|  | return "LE_AUDIO_BROADCAST_ASSISTANT"; | 
|  | case BATTERY: | 
|  | return "BATTERY"; | 
|  | default: | 
|  | return "UNKNOWN_PROFILE (" + profile + ")"; | 
|  | } | 
|  | } | 
|  | } |