11bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal/* 21bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Copyright (C) 2015 The Android Open Source Project 31bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * 41bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Licensed under the Apache License, Version 2.0 (the "License"); 51bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * you may not use this file except in compliance with the License. 61bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * You may obtain a copy of the License at 71bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * 81bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * http://www.apache.org/licenses/LICENSE-2.0 91bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * 101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * Unless required by applicable law or agreed to in writing, software 111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * distributed under the License is distributed on an "AS IS" BASIS, 121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * See the License for the specific language governing permissions and 141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal * limitations under the License. 151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal */ 161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalpackage com.android.settingslib.bluetooth; 181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothA2dpSink; 201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothAdapter; 211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothClass; 221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothDevice; 231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothProfile; 241bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.bluetooth.BluetoothUuid; 251bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.content.Context; 261bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.os.ParcelUuid; 271bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport android.util.Log; 281bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 291bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport com.android.settingslib.R; 301bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 311bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport java.util.ArrayList; 321bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalimport java.util.List; 331bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 341bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwalfinal class A2dpSinkProfile implements LocalBluetoothProfile { 351bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private static final String TAG = "A2dpSinkProfile"; 361bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private static boolean V = true; 371bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 381bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private BluetoothA2dpSink mService; 391bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private boolean mIsProfileReady; 401bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 411bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private final LocalBluetoothAdapter mLocalAdapter; 421bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private final CachedBluetoothDeviceManager mDeviceManager; 431bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 441bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal static final ParcelUuid[] SRC_UUIDS = { 451bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal BluetoothUuid.AudioSource, 461bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal BluetoothUuid.AdvAudioDist, 471bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal }; 481bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 491bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal static final String NAME = "A2DPSink"; 501bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private final LocalBluetoothProfileManager mProfileManager; 511bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 521bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal // Order of this profile in device profiles list 531bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private static final int ORDINAL = 5; 541bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 551bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal // These callbacks run on the main thread. 561bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal private final class A2dpSinkServiceListener 571bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal implements BluetoothProfile.ServiceListener { 581bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 591bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public void onServiceConnected(int profile, BluetoothProfile proxy) { 601bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (V) Log.d(TAG,"Bluetooth service connected"); 611bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mService = (BluetoothA2dpSink) proxy; 621bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal // We just bound to the service, so refresh the UI for any connected A2DP devices. 631bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal List<BluetoothDevice> deviceList = mService.getConnectedDevices(); 641bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal while (!deviceList.isEmpty()) { 651bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal BluetoothDevice nextDevice = deviceList.remove(0); 661bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal CachedBluetoothDevice device = mDeviceManager.findDevice(nextDevice); 671bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal // we may add a new device here, but generally this should not happen 681bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (device == null) { 691bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal Log.w(TAG, "A2dpSinkProfile found new device: " + nextDevice); 701bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal device = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, nextDevice); 711bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 721bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal device.onProfileStateChanged(A2dpSinkProfile.this, BluetoothProfile.STATE_CONNECTED); 731bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal device.refresh(); 741bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 751bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mIsProfileReady=true; 761bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 771bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 781bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public void onServiceDisconnected(int profile) { 791bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (V) Log.d(TAG,"Bluetooth service disconnected"); 801bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mIsProfileReady=false; 811bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 821bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 831bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 841bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public boolean isProfileReady() { 851bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return mIsProfileReady; 861bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 871bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 881bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal A2dpSinkProfile(Context context, LocalBluetoothAdapter adapter, 891bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal CachedBluetoothDeviceManager deviceManager, 901bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal LocalBluetoothProfileManager profileManager) { 911bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mLocalAdapter = adapter; 921bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mDeviceManager = deviceManager; 931bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mProfileManager = profileManager; 941bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mLocalAdapter.getProfileProxy(context, new A2dpSinkServiceListener(), 951bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal BluetoothProfile.A2DP_SINK); 961bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 971bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 981bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public boolean isConnectable() { 991bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return true; 1001bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1011bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1021bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public boolean isAutoConnectable() { 1031bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return true; 1041bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1051bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1061bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public List<BluetoothDevice> getConnectedDevices() { 1071bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) return new ArrayList<BluetoothDevice>(0); 1081bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return mService.getDevicesMatchingConnectionStates( 1091bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal new int[] {BluetoothProfile.STATE_CONNECTED, 1101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal BluetoothProfile.STATE_CONNECTING, 1111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal BluetoothProfile.STATE_DISCONNECTING}); 1121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public boolean connect(BluetoothDevice device) { 1151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) return false; 1161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal List<BluetoothDevice> srcs = getConnectedDevices(); 1171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (srcs != null) { 1181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal for (BluetoothDevice src : srcs) { 1191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (src.equals(device)) { 1201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal // Connect to same device, Ignore it 1211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal Log.d(TAG,"Ignoring Connect"); 1221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return true; 1231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1241bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1251bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal for (BluetoothDevice src : srcs) { 1261bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mService.disconnect(src); 1271bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1281bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1291bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return mService.connect(device); 1301bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1311bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1321bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public boolean disconnect(BluetoothDevice device) { 1331bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) return false; 1341bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal // Downgrade priority as user is disconnecting the headset. 1351bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON){ 1361bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 1371bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1381bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return mService.disconnect(device); 1391bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1401bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1411bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public int getConnectionStatus(BluetoothDevice device) { 1421bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) { 1431bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return BluetoothProfile.STATE_DISCONNECTED; 1441bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1451bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return mService.getConnectionState(device); 1461bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1471bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1481bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public boolean isPreferred(BluetoothDevice device) { 1491bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) return false; 1501bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF; 1511bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1521bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1531bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public int getPreferred(BluetoothDevice device) { 1541bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) return BluetoothProfile.PRIORITY_OFF; 1551bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return mService.getPriority(device); 1561bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1571bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1581bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public void setPreferred(BluetoothDevice device, boolean preferred) { 1591bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) return; 1601bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (preferred) { 1611bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) { 1621bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 1631bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1641bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } else { 1651bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mService.setPriority(device, BluetoothProfile.PRIORITY_OFF); 1661bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1671bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1681bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1691bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal boolean isA2dpPlaying() { 1701bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService == null) return false; 1711bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal List<BluetoothDevice> srcs = mService.getConnectedDevices(); 1721bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (!srcs.isEmpty()) { 1731bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService.isA2dpPlaying(srcs.get(0))) { 1741bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return true; 1751bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1761bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1771bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return false; 1781bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1791bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1801bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public String toString() { 1811bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return NAME; 1821bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1831bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1841bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public int getOrdinal() { 1851bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return ORDINAL; 1861bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1871bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1881bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public int getNameResource(BluetoothDevice device) { 1891bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal // we need to have same string in UI for even SINK Media Audio. 1901bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return R.string.bluetooth_profile_a2dp; 1911bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 1921bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1931bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public int getSummaryResourceForDevice(BluetoothDevice device) { 1941bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal int state = getConnectionStatus(device); 1951bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal switch (state) { 1961bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal case BluetoothProfile.STATE_DISCONNECTED: 1971bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return R.string.bluetooth_a2dp_profile_summary_use_for; 1981bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 1991bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal case BluetoothProfile.STATE_CONNECTED: 2001bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return R.string.bluetooth_a2dp_profile_summary_connected; 2011bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 2021bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal default: 2031bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return Utils.getConnectionStateSummary(state); 2041bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 2051bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 2061bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 2071bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal public int getDrawableResource(BluetoothClass btClass) { 2081bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal return R.drawable.ic_bt_headphones_a2dp; 2091bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 2101bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal 2111bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal protected void finalize() { 2121bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (V) Log.d(TAG, "finalize()"); 2131bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal if (mService != null) { 2141bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal try { 2151bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.A2DP_SINK, 2161bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mService); 2171bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal mService = null; 2181bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal }catch (Throwable t) { 2191bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal Log.w(TAG, "Error cleaning up A2DP proxy", t); 2201bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 2211bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 2221bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal } 2231bec6a5b0d67f120b7013572f6b1a4f1e1b3c584Sanket Agarwal} 224