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 357af55fd10e222b0d10fd15692d7db139f707b27broger xuepublic final 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 10344de3a076d8903078c96e6b38564a16832996310ryanywlin @Override 10444de3a076d8903078c96e6b38564a16832996310ryanywlin public int getProfileId() { 10544de3a076d8903078c96e6b38564a16832996310ryanywlin return BluetoothProfile.PBAP_CLIENT; 10644de3a076d8903078c96e6b38564a16832996310ryanywlin } 10744de3a076d8903078c96e6b38564a16832996310ryanywlin 108563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo PbapClientProfile(Context context, LocalBluetoothAdapter adapter, 109563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo CachedBluetoothDeviceManager deviceManager, 110563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo LocalBluetoothProfileManager profileManager) { 111563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mLocalAdapter = adapter; 112563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mDeviceManager = deviceManager; 113563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mProfileManager = profileManager; 114563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mLocalAdapter.getProfileProxy(context, new PbapClientServiceListener(), 115563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.PBAP_CLIENT); 116563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 117563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 118563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean isConnectable() { 119563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return true; 120563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 121563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 122563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean isAutoConnectable() { 123563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return true; 124563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 125563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 126563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public List<BluetoothDevice> getConnectedDevices() { 127563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 128563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return new ArrayList<BluetoothDevice>(0); 129563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 130563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getDevicesMatchingConnectionStates( 131563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo new int[] {BluetoothProfile.STATE_CONNECTED, 132563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.STATE_CONNECTING, 133563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.STATE_DISCONNECTING}); 134563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 135563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 136563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean connect(BluetoothDevice device) { 137563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 138563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"PBAPClientProfile got connect request"); 139563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 140563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 141563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return false; 142563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 143563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo List<BluetoothDevice> srcs = getConnectedDevices(); 144563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (srcs != null) { 145563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo for (BluetoothDevice src : srcs) { 146563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (src.equals(device)) { 147563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // Connect to same device, Ignore it 148563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"Ignoring Connect"); 149563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return true; 150563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 151563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 152563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 153563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"PBAPClientProfile attempting to connect to " + device.getAddress()); 154563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 155563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.connect(device); 156563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 157563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 158563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean disconnect(BluetoothDevice device) { 159563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 160563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG,"PBAPClientProfile got disconnect request"); 161563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 162563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 163563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return false; 164563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 165563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.disconnect(device); 166563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 167563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 168563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getConnectionStatus(BluetoothDevice device) { 169563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 170563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return BluetoothProfile.STATE_DISCONNECTED; 171563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 172563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getConnectionState(device); 173563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 174563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 175563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public boolean isPreferred(BluetoothDevice device) { 176563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 177563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return false; 178563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 179563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getPriority(device) > BluetoothProfile.PRIORITY_OFF; 180563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 181563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 182563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getPreferred(BluetoothDevice device) { 183563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 184563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return BluetoothProfile.PRIORITY_OFF; 185563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 186563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return mService.getPriority(device); 187563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 188563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 189563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public void setPreferred(BluetoothDevice device, boolean preferred) { 190563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService == null) { 191563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return; 192563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 193563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (preferred) { 194563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService.getPriority(device) < BluetoothProfile.PRIORITY_ON) { 195563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mService.setPriority(device, BluetoothProfile.PRIORITY_ON); 196563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 197563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } else { 198563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mService.setPriority(device, BluetoothProfile.PRIORITY_OFF); 199563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 200563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 201563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 202563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public String toString() { 203563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return NAME; 204563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 205563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 206563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getOrdinal() { 207563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return ORDINAL; 208563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 209563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 210563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getNameResource(BluetoothDevice device) { 211563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo // we need to have same string in UI as the server side. 212563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return R.string.bluetooth_profile_pbap; 213563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 214563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 215563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getSummaryResourceForDevice(BluetoothDevice device) { 216563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return R.string.bluetooth_profile_pbap_summary; 217563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 218563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 219563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo public int getDrawableResource(BluetoothClass btClass) { 220563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo return R.drawable.ic_bt_cellphone; 221563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 222563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo 223563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo protected void finalize() { 224563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (V) { 225563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.d(TAG, "finalize()"); 226563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 227563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo if (mService != null) { 228563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo try { 229563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothAdapter.getDefaultAdapter().closeProfileProxy( 230563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo BluetoothProfile.PBAP_CLIENT,mService); 231563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo mService = null; 232563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } catch (Throwable t) { 233563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo Log.w(TAG, "Error cleaning up PBAP Client proxy", t); 234563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 235563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 236563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo } 237563c700f7025d2f792a52b7483725b3d58eaa7a6Joseph Pirozzo} 238