1f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal/* 2f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Copyright (C) 2016 The Android Open Source Project 3f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * 4f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Licensed under the Apache License, Version 2.0 (the "License"); 5f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * you may not use this file except in compliance with the License. 6f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * You may obtain a copy of the License at 7f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * 8f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * http://www.apache.org/licenses/LICENSE-2.0 9f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * 10f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Unless required by applicable law or agreed to in writing, software 11f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * distributed under the License is distributed on an "AS IS" BASIS, 12f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * See the License for the specific language governing permissions and 14f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * limitations under the License. 15f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal */ 16f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 17f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalpackage com.android.settingslib.bluetooth; 18f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 19f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothHeadsetClient; 20f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothAdapter; 21f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothClass; 22f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothDevice; 23f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothProfile; 24f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.bluetooth.BluetoothUuid; 25f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.content.Context; 26f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.os.ParcelUuid; 27f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport android.util.Log; 28f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 29f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport com.android.settingslib.R; 30f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 31f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport java.util.ArrayList; 32f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalimport java.util.List; 33f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 34f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal/** 35f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal * Handles the Handsfree HF role. 36f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal */ 37f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwalfinal class HfpClientProfile implements LocalBluetoothProfile { 38f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private static final String TAG = "HfpClientProfile"; 39f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private static boolean V = false; 40f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 41f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private BluetoothHeadsetClient mService; 42f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private boolean mIsProfileReady; 43f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 44f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private final LocalBluetoothAdapter mLocalAdapter; 45f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private final CachedBluetoothDeviceManager mDeviceManager; 46f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 47f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal static final ParcelUuid[] SRC_UUIDS = { 48f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothUuid.HSP_AG, 49f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothUuid.Handsfree_AG, 50f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal }; 51f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 52f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal static final String NAME = "HEADSET_CLIENT"; 53f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private final LocalBluetoothProfileManager mProfileManager; 54f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 55f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal // Order of this profile in device profiles list 56f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private static final int ORDINAL = 0; 57f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 58f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal // These callbacks run on the main thread. 59f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal private final class HfpClientServiceListener 60f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal implements BluetoothProfile.ServiceListener { 61f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 62f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 63f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public void onServiceConnected(int profile, BluetoothProfile proxy) { 64f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (V) Log.d(TAG,"Bluetooth service connected"); 65f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mService = (BluetoothHeadsetClient) proxy; 66f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal // We just bound to the service, so refresh the UI for any connected HFP devices. 67f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal List<BluetoothDevice> deviceList = mService.getConnectedDevices(); 68f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal while (!deviceList.isEmpty()) { 69f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothDevice nextDevice = deviceList.remove(0); 70f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal CachedBluetoothDevice device = mDeviceManager.findDevice(nextDevice); 71f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal // we may add a new device here, but generally this should not happen 72f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (device == null) { 73f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal Log.w(TAG, "HfpClient profile found new device: " + nextDevice); 74f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal device = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, nextDevice); 75f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 76f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal device.onProfileStateChanged( 77f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal HfpClientProfile.this, BluetoothProfile.STATE_CONNECTED); 78f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal device.refresh(); 79f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 80f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mIsProfileReady=true; 81f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 82f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 83f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 84f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public void onServiceDisconnected(int profile) { 85f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (V) Log.d(TAG,"Bluetooth service disconnected"); 86f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mIsProfileReady=false; 87f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 88f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 89f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 90f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 91f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public boolean isProfileReady() { 92f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return mIsProfileReady; 93f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 94f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 95f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal HfpClientProfile(Context context, LocalBluetoothAdapter adapter, 96f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal CachedBluetoothDeviceManager deviceManager, 97f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal LocalBluetoothProfileManager profileManager) { 98f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mLocalAdapter = adapter; 99f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mDeviceManager = deviceManager; 100f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mProfileManager = profileManager; 101f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mLocalAdapter.getProfileProxy(context, new HfpClientServiceListener(), 102f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothProfile.HEADSET_CLIENT); 103f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 104f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 105f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 106f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public boolean isConnectable() { 107f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return true; 108f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 109f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 110f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 111f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public boolean isAutoConnectable() { 112f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return true; 113f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 114f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 115f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public List<BluetoothDevice> getConnectedDevices() { 116f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService == null) return new ArrayList<BluetoothDevice>(0); 117f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return mService.getDevicesMatchingConnectionStates( 118f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal new int[] {BluetoothProfile.STATE_CONNECTED, 119f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothProfile.STATE_CONNECTING, 120f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothProfile.STATE_DISCONNECTING}); 121f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 122f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 123f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 124f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public boolean connect(BluetoothDevice device) { 125f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService == null) return false; 126f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal List<BluetoothDevice> srcs = getConnectedDevices(); 127f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (srcs != null) { 128f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal for (BluetoothDevice src : srcs) { 129f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (src.equals(device)) { 130f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal // Connect to same device, Ignore it 131f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal Log.d(TAG,"Ignoring Connect"); 132f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return true; 133f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 134f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 135f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 136f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return mService.connect(device); 137f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 138f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 139f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 140f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public boolean disconnect(BluetoothDevice device) { 141f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService == null) return false; 142f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal // Downgrade priority as user is disconnecting the headset. 143f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON){ 144f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 145f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 146f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return mService.disconnect(device); 147f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 148f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 149f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 150f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public int getConnectionStatus(BluetoothDevice device) { 151f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService == null) { 152f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return BluetoothProfile.STATE_DISCONNECTED; 153f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 154f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return mService.getConnectionState(device); 155f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 156f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 157f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 158f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public boolean isPreferred(BluetoothDevice device) { 159f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService == null) return false; 160f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF; 161f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 162f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 163f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 164f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public int getPreferred(BluetoothDevice device) { 165f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService == null) return BluetoothProfile.PRIORITY_OFF; 166f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return mService.getPriority(device); 167f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 168f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 169f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 170f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public void setPreferred(BluetoothDevice device, boolean preferred) { 171f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService == null) return; 172f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (preferred) { 173f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) { 174f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 175f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 176f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } else { 177f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mService.setPriority(device, BluetoothProfile.PRIORITY_OFF); 178f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 179f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 180f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 181f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 182f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public String toString() { 183f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return NAME; 184f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 185f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 186f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 187f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public int getOrdinal() { 188f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return ORDINAL; 189f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 190f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 191f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 192f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public int getNameResource(BluetoothDevice device) { 193f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return R.string.bluetooth_profile_headset; 194f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 195f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 196f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 197f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public int getSummaryResourceForDevice(BluetoothDevice device) { 198f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal int state = getConnectionStatus(device); 199f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal switch (state) { 200f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal case BluetoothProfile.STATE_DISCONNECTED: 201f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return R.string.bluetooth_headset_profile_summary_use_for; 202f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 203f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal case BluetoothProfile.STATE_CONNECTED: 204f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return R.string.bluetooth_headset_profile_summary_connected; 205f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 206f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal default: 207f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return Utils.getConnectionStateSummary(state); 208f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 209f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 210f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 211f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal @Override 212f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal public int getDrawableResource(BluetoothClass btClass) { 213f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal return R.drawable.ic_bt_headset_hfp; 214f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 215f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal 216f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal protected void finalize() { 217f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (V) Log.d(TAG, "finalize()"); 218f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal if (mService != null) { 219f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal try { 220f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothAdapter.getDefaultAdapter().closeProfileProxy( 221f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal BluetoothProfile.HEADSET_CLIENT, mService); 222f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal mService = null; 223f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } catch (Throwable t) { 224f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal Log.w(TAG, "Error cleaning up HfpClient proxy", t); 225f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 226f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 227f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal } 228f8a1c9121dae665ec9dc29484f89adfb5f3f0886Sanket Agarwal} 229