CachedBluetoothDeviceManager.java revision d63c0112251ab4e4e977545368dd703d875012a4
1d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly/* 2d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Copyright (C) 2008 The Android Open Source Project 3d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * 4d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 5d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * you may not use this file except in compliance with the License. 6d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * You may obtain a copy of the License at 7d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * 8d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * http://www.apache.org/licenses/LICENSE-2.0 9d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * 10d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Unless required by applicable law or agreed to in writing, software 11d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 12d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * See the License for the specific language governing permissions and 14d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * limitations under the License. 15d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 16d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 17d63c0112251ab4e4e977545368dd703d875012a4Nick Pellypackage com.android.settings.bluetooth; 18d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 19d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport android.bluetooth.BluetoothAdapter; 20d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport android.bluetooth.BluetoothDevice; 21d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport android.util.Log; 22d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 23d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport com.android.settings.R; 24d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport com.android.settings.bluetooth.LocalBluetoothManager.Callback; 25d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile; 26d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 27d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.ArrayList; 28d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.List; 29d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.Set; 30d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 31d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly/** 32d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices. 33d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 34d63c0112251ab4e4e977545368dd703d875012a4Nick Pellypublic class CachedBluetoothDeviceManager { 35d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private static final String TAG = "CachedBluetoothDeviceManager"; 36d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 37d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly final LocalBluetoothManager mLocalManager; 38d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly final List<Callback> mCallbacks; 39d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 40d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly final List<CachedBluetoothDevice> mCachedDevices = new ArrayList<CachedBluetoothDevice>(); 41d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 42d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public CachedBluetoothDeviceManager(LocalBluetoothManager localManager) { 43d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mLocalManager = localManager; 44d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCallbacks = localManager.getCallbacks(); 45d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly readPairedDevices(); 46d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 47d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 48d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private synchronized boolean readPairedDevices() { 49d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly BluetoothAdapter adapter = mLocalManager.getBluetoothAdapter(); 50d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices(); 51d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (bondedDevices == null) return false; 52d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 53d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly boolean deviceAdded = false; 54d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (BluetoothDevice device : bondedDevices) { 55d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 56d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) { 57d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice = new CachedBluetoothDevice(mLocalManager.getContext(), device); 58d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCachedDevices.add(cachedDevice); 59d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly dispatchDeviceAdded(cachedDevice); 60d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly deviceAdded = true; 61d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 62d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 63d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 64d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return deviceAdded; 65d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 66d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 67d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized List<CachedBluetoothDevice> getCachedDevicesCopy() { 68d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return new ArrayList<CachedBluetoothDevice>(mCachedDevices); 69d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 70d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 71d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly void onBluetoothStateChanged(boolean enabled) { 72d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (enabled) { 73d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly readPairedDevices(); 74d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 75d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 76d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 77d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onDeviceAppeared(BluetoothDevice device, short rssi, int btClass, 78d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly String name) { 79d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly boolean deviceAdded = false; 80d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 81d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 82d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) { 83d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice = new CachedBluetoothDevice(mLocalManager.getContext(), device); 84d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCachedDevices.add(cachedDevice); 85d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly deviceAdded = true; 86d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 87d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 88d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setRssi(rssi); 89d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setBtClass(btClass); 90d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setName(name); 91d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setVisible(true); 92d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 93d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (deviceAdded) { 94d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly dispatchDeviceAdded(cachedDevice); 95d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 96d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 97d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 98d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onDeviceDisappeared(BluetoothDevice device) { 99d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 100d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) return; 101d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 102d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setVisible(false); 103d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly checkForDeviceRemoval(cachedDevice); 104d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 105d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 106d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private void checkForDeviceRemoval(CachedBluetoothDevice cachedDevice) { 107d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice.getBondState() == BluetoothDevice.BOND_NOT_BONDED && 108d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly !cachedDevice.isVisible()) { 109d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // If device isn't paired, remove it altogether 110d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCachedDevices.remove(cachedDevice); 111d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly dispatchDeviceDeleted(cachedDevice); 112d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 113d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 114d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 115d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onDeviceNameUpdated(BluetoothDevice device) { 116d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 117d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice != null) { 118d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refreshName(); 119d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 120d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 121d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 122d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized CachedBluetoothDevice findDevice(BluetoothDevice device) { 123d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 124d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (int i = mCachedDevices.size() - 1; i >= 0; i--) { 125d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); 126d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 127d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice.getDevice().equals(device)) { 128d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return cachedDevice; 129d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 130d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 131d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 132d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return null; 133d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 134d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 135d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly /** 136d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Attempts to get the name of a remote device, otherwise returns the address. 137d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * 138d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @param device The remote device. 139d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @return The name, or if unavailable, the address. 140d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 141d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public String getName(BluetoothDevice device) { 142d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 143d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return cachedDevice != null ? cachedDevice.getName() : device.getAddress(); 144d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 145d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 146d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private void dispatchDeviceAdded(CachedBluetoothDevice cachedDevice) { 147d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly synchronized (mCallbacks) { 148d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (Callback callback : mCallbacks) { 149d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly callback.onDeviceAdded(cachedDevice); 150d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 151d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 152d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 153d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // TODO: divider between prev paired/connected and scanned 154d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 155d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 156d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private void dispatchDeviceDeleted(CachedBluetoothDevice cachedDevice) { 157d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly synchronized (mCallbacks) { 158d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (Callback callback : mCallbacks) { 159d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly callback.onDeviceDeleted(cachedDevice); 160d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 161d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 162d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 163d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 164d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onBondingStateChanged(BluetoothDevice device, int bondState) { 165d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 166d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) { 167d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (!readPairedDevices()) { 168d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly Log.e(TAG, "Got bonding state changed for " + device + 169d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly ", but we have no record of that device."); 170d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 171d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return; 172d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 173d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 174d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refresh(); 175d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 176d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (bondState == BluetoothDevice.BOND_BONDED) { 177d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // Auto-connect after pairing 178d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.connect(); 179d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 180d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 181d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 182d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly /** 183d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Called when there is a bonding error. 184d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * 185d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @param device The remote device. 186d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @param reason The reason, one of the error reasons from 187d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * BluetoothDevice.UNBOND_REASON_* 188d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 189d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onBondingError(BluetoothDevice device, int reason) { 190d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly int errorMsg; 191d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 192d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly switch(reason) { 193d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly case BluetoothDevice.UNBOND_REASON_AUTH_FAILED: 194d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_pin_error_message; 195d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly break; 196d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly case BluetoothDevice.UNBOND_REASON_AUTH_REJECTED: 197d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_rejected_error_message; 198d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly break; 199d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly case BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN: 200d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_device_down_error_message; 201d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly break; 202d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly default: 203d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_error_message; 204d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 205d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg); 206d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 207d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 208d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onProfileStateChanged(BluetoothDevice device, Profile profile, 209d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly int newProfileState) { 210d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 211d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) return; 212d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 213d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.onProfileStateChanged(profile, newProfileState); 214d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refresh(); 215d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 216d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 217d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onConnectingError(BluetoothDevice device) { 218d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 219d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) return; 220d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 221d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly /* 222d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Go through the device's delegate so we don't spam the user with 223d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * errors connecting to different profiles, and instead make sure the 224d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * user sees a single error for his single 'connect' action. 225d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 226d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.showConnectingError(); 227d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 228d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 229d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onScanningStateChanged(boolean started) { 230d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (!started) return; 231d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 232d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // If starting a new scan, clear old visibility 233d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (int i = mCachedDevices.size() - 1; i >= 0; i--) { 234d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); 235d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setVisible(false); 236d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly checkForDeviceRemoval(cachedDevice); 237d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 238d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 239d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 240d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onBtClassChanged(BluetoothDevice device) { 241d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 242d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice != null) { 243d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refreshBtClass(); 244d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 245d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 246d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly} 247