| /* | |
| * 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 */ | |
| 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; | |
| /** | |
| * Gaming Audio Profile | |
| * | |
| * @hide | |
| */ | |
| int GMAP = 31; | |
| /** | |
| * 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 = 31; | |
| /** | |
| * 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 + ")"; | |
| } | |
| } | |
| } |