CachedBluetoothDeviceManager.java revision 2aef1f3c814b1f8aa00aeefff35caf293c738702
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; 2016cc86315d7a8e1f6a0f3083d0a810a7cb097832Nick Pellyimport android.bluetooth.BluetoothClass; 21d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport android.bluetooth.BluetoothDevice; 22d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport android.util.Log; 23d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 24d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport com.android.settings.R; 25d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport com.android.settings.bluetooth.LocalBluetoothManager.Callback; 26d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport com.android.settings.bluetooth.LocalBluetoothProfileManager.Profile; 27d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 28d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.ArrayList; 29d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.List; 30d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.Set; 31d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 32d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly/** 33d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices. 34d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 35d63c0112251ab4e4e977545368dd703d875012a4Nick Pellypublic class CachedBluetoothDeviceManager { 36d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private static final String TAG = "CachedBluetoothDeviceManager"; 37d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 38d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly final LocalBluetoothManager mLocalManager; 39d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly final List<Callback> mCallbacks; 40d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 41d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly final List<CachedBluetoothDevice> mCachedDevices = new ArrayList<CachedBluetoothDevice>(); 42d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 43d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public CachedBluetoothDeviceManager(LocalBluetoothManager localManager) { 44d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mLocalManager = localManager; 45d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCallbacks = localManager.getCallbacks(); 46d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly readPairedDevices(); 47d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 48d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 49d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private synchronized boolean readPairedDevices() { 50d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly BluetoothAdapter adapter = mLocalManager.getBluetoothAdapter(); 51d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly Set<BluetoothDevice> bondedDevices = adapter.getBondedDevices(); 52d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (bondedDevices == null) return false; 53d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 54d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly boolean deviceAdded = false; 55d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (BluetoothDevice device : bondedDevices) { 56d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 57d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) { 58d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice = new CachedBluetoothDevice(mLocalManager.getContext(), device); 59d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCachedDevices.add(cachedDevice); 60d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly dispatchDeviceAdded(cachedDevice); 61d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly deviceAdded = true; 62d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 63d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 64d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 65d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return deviceAdded; 66d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 67d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 68d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized List<CachedBluetoothDevice> getCachedDevicesCopy() { 69d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return new ArrayList<CachedBluetoothDevice>(mCachedDevices); 70d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 71d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 72d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly void onBluetoothStateChanged(boolean enabled) { 73d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (enabled) { 74d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly readPairedDevices(); 75d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 76d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 77d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 7816cc86315d7a8e1f6a0f3083d0a810a7cb097832Nick Pelly public synchronized void onDeviceAppeared(BluetoothDevice device, short rssi, 7916cc86315d7a8e1f6a0f3083d0a810a7cb097832Nick Pelly BluetoothClass btClass, String name) { 80d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly boolean deviceAdded = false; 81d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 82d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 83d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) { 84d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice = new CachedBluetoothDevice(mLocalManager.getContext(), device); 85d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCachedDevices.add(cachedDevice); 86d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly deviceAdded = true; 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) { 10716cc86315d7a8e1f6a0f3083d0a810a7cb097832Nick Pelly if (cachedDevice.getBondState() == BluetoothDevice.BOND_NONE && 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); 1433eb43fe7a4a508e8cd476525fd68ec8d900f06b8Jaikumar Ganesh if (cachedDevice != null) return cachedDevice.getName(); 1443eb43fe7a4a508e8cd476525fd68ec8d900f06b8Jaikumar Ganesh 1453eb43fe7a4a508e8cd476525fd68ec8d900f06b8Jaikumar Ganesh String name = device.getName(); 1463eb43fe7a4a508e8cd476525fd68ec8d900f06b8Jaikumar Ganesh if (name != null) return name; 1473eb43fe7a4a508e8cd476525fd68ec8d900f06b8Jaikumar Ganesh 1483eb43fe7a4a508e8cd476525fd68ec8d900f06b8Jaikumar Ganesh return device.getAddress(); 149d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 150d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 151d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private void dispatchDeviceAdded(CachedBluetoothDevice cachedDevice) { 152d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly synchronized (mCallbacks) { 153d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (Callback callback : mCallbacks) { 154d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly callback.onDeviceAdded(cachedDevice); 155d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 156d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 157d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 158d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // TODO: divider between prev paired/connected and scanned 159d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 160d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 161d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly private void dispatchDeviceDeleted(CachedBluetoothDevice cachedDevice) { 162d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly synchronized (mCallbacks) { 163d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (Callback callback : mCallbacks) { 164d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly callback.onDeviceDeleted(cachedDevice); 165d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 166d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 167d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 168d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 169d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onBondingStateChanged(BluetoothDevice device, int bondState) { 170d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 171d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) { 172d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (!readPairedDevices()) { 173d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly Log.e(TAG, "Got bonding state changed for " + device + 174d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly ", but we have no record of that device."); 175d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 176d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return; 177d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 178d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 179d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refresh(); 180d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 181d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (bondState == BluetoothDevice.BOND_BONDED) { 182d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // Auto-connect after pairing 183d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.connect(); 184d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 185d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 186d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 187d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly /** 188d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Called when there is a bonding error. 189d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * 190d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @param device The remote device. 191d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @param reason The reason, one of the error reasons from 192d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * BluetoothDevice.UNBOND_REASON_* 193d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 194d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onBondingError(BluetoothDevice device, int reason) { 195d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly int errorMsg; 196d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 197d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly switch(reason) { 198d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly case BluetoothDevice.UNBOND_REASON_AUTH_FAILED: 199d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_pin_error_message; 2005f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg); 201d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly break; 202d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly case BluetoothDevice.UNBOND_REASON_AUTH_REJECTED: 203d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_rejected_error_message; 2045f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg); 205d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly break; 206d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly case BluetoothDevice.UNBOND_REASON_REMOTE_DEVICE_DOWN: 207d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_device_down_error_message; 2085f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg); 209d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly break; 2105f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh case BluetoothDevice.UNBOND_REASON_DISCOVERY_IN_PROGRESS: 2115f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh case BluetoothDevice.UNBOND_REASON_AUTH_TIMEOUT: 2125f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh case BluetoothDevice.UNBOND_REASON_REPEATED_ATTEMPTS: 213d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly errorMsg = R.string.bluetooth_pairing_error_message; 2145f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh mLocalManager.showError(device, R.string.bluetooth_error_title, errorMsg); 2155f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh break; 2165f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh default: 2175f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh Log.w(TAG, "onBondingError: Not displaying any error message for reason:" + reason); 2185f23cb39a1bd9c319383108c209fca7f0256894bJaikumar Ganesh break; 219d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 220d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 221d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 222d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onProfileStateChanged(BluetoothDevice device, Profile profile, 223d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly int newProfileState) { 224d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 225d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) return; 226d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 227d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.onProfileStateChanged(profile, newProfileState); 228d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refresh(); 229d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 230d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 231d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onConnectingError(BluetoothDevice device) { 232d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 233d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice == null) return; 234d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 235d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly /* 236d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Go through the device's delegate so we don't spam the user with 237d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * errors connecting to different profiles, and instead make sure the 238d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * user sees a single error for his single 'connect' action. 239d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 240d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.showConnectingError(); 241d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 242d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 243d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onScanningStateChanged(boolean started) { 244d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (!started) return; 245d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 246d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // If starting a new scan, clear old visibility 247d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (int i = mCachedDevices.size() - 1; i >= 0; i--) { 248d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); 249d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setVisible(false); 250d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly checkForDeviceRemoval(cachedDevice); 251d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 252d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 253d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 254d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onBtClassChanged(BluetoothDevice device) { 255d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 256d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice != null) { 257d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refreshBtClass(); 258d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 259d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 2602aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan 2612aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan public synchronized void onUuidChanged(BluetoothDevice device) { 2622aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan CachedBluetoothDevice cachedDevice = findDevice(device); 2632aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan if (cachedDevice != null) { 2642aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan cachedDevice.onUuidChanged(); 2652aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan } 2662aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan } 267d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly} 268