1563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo/* 2563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * Copyright (C) 2016 The Android Open Source Project 3563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * 4563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * Licensed under the Apache License, Version 2.0 (the "License"); 5563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * you may not use this file except in compliance with the License. 6563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * You may obtain a copy of the License at 7563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * 8563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * http://www.apache.org/licenses/LICENSE-2.0 9563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * 10563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * Unless required by applicable law or agreed to in writing, software 11563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * distributed under the License is distributed on an "AS IS" BASIS, 12563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * See the License for the specific language governing permissions and 14563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo * limitations under the License. 15563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo */ 16563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 17563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzopackage com.android.settingslib.bluetooth; 18563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 19563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothPbapClient; 20563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothAdapter; 21563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothClass; 22563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothDevice; 23563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothProfile; 24563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.bluetooth.BluetoothUuid; 25563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.content.Context; 26563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.os.ParcelUuid; 27563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport android.util.Log; 28563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 29563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport com.android.settingslib.R; 30563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 31563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport java.util.ArrayList; 32563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport java.util.Collection; 33563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzoimport java.util.List; 34563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 35563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzofinal class PbapClientProfile implements LocalBluetoothProfile { 36563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private static final String TAG = "PbapClientProfile"; 37563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private static boolean V = false; 38563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 39563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private BluetoothPbapClient mService; 40563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private boolean mIsProfileReady; 41563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 42563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private final LocalBluetoothAdapter mLocalAdapter; 43563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private final CachedBluetoothDeviceManager mDeviceManager; 44563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 45563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo static final ParcelUuid[] SRC_UUIDS = { 46563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothUuid.PBAP_PSE, 47563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo }; 48563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 49563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo static final String NAME = "PbapClient"; 50563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private final LocalBluetoothProfileManager mProfileManager; 51563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 52563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // Order of this profile in device profiles list 53563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private static final int ORDINAL = 6; 54563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 55563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // These callbacks run on the main thread. 56563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private final class PbapClientServiceListener 57563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo implements BluetoothProfile.ServiceListener { 58563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 59563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public void onServiceConnected(int profile, BluetoothProfile proxy) { 60563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 61563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"Bluetooth service connected"); 62563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 63563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mService = (BluetoothPbapClient) proxy; 64563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // We just bound to the service, so refresh the UI for any connected PBAP devices. 65563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo List<BluetoothDevice> deviceList = mService.getConnectedDevices(); 66563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo while (!deviceList.isEmpty()) { 67563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothDevice nextDevice = deviceList.remove(0); 68563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo CachedBluetoothDevice device = mDeviceManager.findDevice(nextDevice); 69563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // we may add a new device here, but generally this should not happen 70563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (device == null) { 71563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.w(TAG, "PbapClientProfile found new device: " + nextDevice); 72563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo device = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, nextDevice); 73563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 74563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo device.onProfileStateChanged(PbapClientProfile.this, BluetoothProfile.STATE_CONNECTED); 75563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo device.refresh(); 76563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 77563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mIsProfileReady = true; 78563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 79563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 80563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public void onServiceDisconnected(int profile) { 81563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 82563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"Bluetooth service disconnected"); 83563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 84563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mIsProfileReady = false; 85563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 86563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 87563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 88563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo private void refreshProfiles() { 89563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Collection<CachedBluetoothDevice> cachedDevices = mDeviceManager.getCachedDevicesCopy(); 90563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo for (CachedBluetoothDevice device : cachedDevices) { 91563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo device.onUuidChanged(); 92563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 93563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 94563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 95563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean pbapClientExists() { 96563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return (mService != null); 97563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 98563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 99563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean isProfileReady() { 100563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mIsProfileReady; 101563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 102563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 103563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo PbapClientProfile(Context context, LocalBluetoothAdapter adapter, 104563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo CachedBluetoothDeviceManager deviceManager, 105563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo LocalBluetoothProfileManager profileManager) { 106563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mLocalAdapter = adapter; 107563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mDeviceManager = deviceManager; 108563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mProfileManager = profileManager; 109563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mLocalAdapter.getProfileProxy(context, new PbapClientServiceListener(), 110563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.PBAP_CLIENT); 111563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 112563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 113563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean isConnectable() { 114563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return true; 115563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 116563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 117563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean isAutoConnectable() { 118563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return true; 119563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 120563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 121563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public List<BluetoothDevice> getConnectedDevices() { 122563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 123563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return new ArrayList<BluetoothDevice>(0); 124563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 125563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getDevicesMatchingConnectionStates( 126563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo new int[] {BluetoothProfile.STATE_CONNECTED, 127563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.STATE_CONNECTING, 128563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.STATE_DISCONNECTING}); 129563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 130563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 131563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean connect(BluetoothDevice device) { 132563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 133563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"PBAPClientProfile got connect request"); 134563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 135563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 136563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return false; 137563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 138563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo List<BluetoothDevice> srcs = getConnectedDevices(); 139563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (srcs != null) { 140563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo for (BluetoothDevice src : srcs) { 141563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (src.equals(device)) { 142563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // Connect to same device, Ignore it 143563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"Ignoring Connect"); 144563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return true; 145563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 146563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 147c76c857c26ba76fdf319e83a353db66f7b0ab32fJoseph Pirozzo for (BluetoothDevice src : srcs) { 148c76c857c26ba76fdf319e83a353db66f7b0ab32fJoseph Pirozzo mService.disconnect(device); 149c76c857c26ba76fdf319e83a353db66f7b0ab32fJoseph Pirozzo } 150563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 151563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"PBAPClientProfile attempting to connect to " + device.getAddress()); 152563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 153563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.connect(device); 154563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 155563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 156563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean disconnect(BluetoothDevice device) { 157563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 158563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"PBAPClientProfile got disconnect request"); 159563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 160563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 161563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return false; 162563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 163563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.disconnect(device); 164563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 165563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 166563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getConnectionStatus(BluetoothDevice device) { 167563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 168563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return BluetoothProfile.STATE_DISCONNECTED; 169563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 170563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getConnectionState(device); 171563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 172563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 173563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean isPreferred(BluetoothDevice device) { 174563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 175563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return false; 176563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 177563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF; 178563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 179563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 180563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getPreferred(BluetoothDevice device) { 181563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 182563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return BluetoothProfile.PRIORITY_OFF; 183563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 184563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getPriority(device); 185563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 186563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 187563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public void setPreferred(BluetoothDevice device, boolean preferred) { 188563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 189563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return; 190563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 191563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (preferred) { 192563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) { 193563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 194563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 195563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } else { 196563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mService.setPriority(device, BluetoothProfile.PRIORITY_OFF); 197563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 198563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 199563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 200563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public String toString() { 201563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return NAME; 202563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 203563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 204563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getOrdinal() { 205563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return ORDINAL; 206563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 207563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 208563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getNameResource(BluetoothDevice device) { 209563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // we need to have same string in UI as the server side. 210563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return R.string.bluetooth_profile_pbap; 211563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 212563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 213563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getSummaryResourceForDevice(BluetoothDevice device) { 214563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return R.string.bluetooth_profile_pbap_summary; 215563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 216563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 217563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getDrawableResource(BluetoothClass btClass) { 218563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return R.drawable.ic_bt_cellphone; 219563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 220563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 221563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo protected void finalize() { 222563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 223563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG, "finalize()"); 224563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 225563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService != null) { 226563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo try { 227563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothAdapter.getDefaultAdapter().closeProfileProxy( 228563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.PBAP_CLIENT,mService); 229563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mService = null; 230563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } catch (Throwable t) { 231563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.w(TAG, "Error cleaning up PBAP Client proxy", t); 232563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 233563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 234563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 235563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo} 236