CachedBluetoothDeviceManager.java revision 2036ebd8896bbabbbe04db34c9e7d8a1be6fe32a
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.BluetoothDevice; 20d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 21d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.ArrayList; 22436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport java.util.Collection; 23d63c0112251ab4e4e977545368dd703d875012a4Nick Pellyimport java.util.List; 24d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 25d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly/** 26d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices. 27d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 28436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyfinal class CachedBluetoothDeviceManager { 29436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby// private static final String TAG = "CachedBluetoothDeviceManager"; 30d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 31436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private final List<CachedBluetoothDevice> mCachedDevices = 32436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby new ArrayList<CachedBluetoothDevice>(); 33d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 34436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public synchronized Collection<CachedBluetoothDevice> getCachedDevicesCopy() { 35d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return new ArrayList<CachedBluetoothDevice>(mCachedDevices); 36d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 37d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 38436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public boolean onDeviceDisappeared(CachedBluetoothDevice cachedDevice) { 39d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setVisible(false); 40436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return checkForDeviceRemoval(cachedDevice); 41d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 42d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 43436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby private boolean checkForDeviceRemoval( 44436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby CachedBluetoothDevice cachedDevice) { 4516cc86315d7a8e1f6a0f3083d0a810a7cb097832Nick Pelly if (cachedDevice.getBondState() == BluetoothDevice.BOND_NONE && 46d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly !cachedDevice.isVisible()) { 47d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // If device isn't paired, remove it altogether 48d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly mCachedDevices.remove(cachedDevice); 49436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return true; // dispatch device deleted 50d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 51436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return false; 52d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 53d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 54436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby public void onDeviceNameUpdated(BluetoothDevice device) { 55d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 56d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice != null) { 57d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refreshName(); 58d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 59d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 60d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 61436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby /** 62436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Search for existing {@link CachedBluetoothDevice} or return null 63436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * if this device isn't in the cache. Use {@link #addDevice} 64436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * to create and return a new {@link CachedBluetoothDevice} for 65436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * a newly discovered {@link BluetoothDevice}. 66436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * 67436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * @param device the address of the Bluetooth device 68436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * @return the cached device object for this device, or null if it has 69436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * not been previously seen 70436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */ 71436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby CachedBluetoothDevice findDevice(BluetoothDevice device) { 72436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby for (CachedBluetoothDevice cachedDevice : mCachedDevices) { 73d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice.getDevice().equals(device)) { 74d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return cachedDevice; 75d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 76d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 77d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly return null; 78d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 79d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 80d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly /** 81436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * Create and return a new {@link CachedBluetoothDevice}. This assumes 82436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * that {@link #findDevice} has already been called and returned null. 83436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * @param device the address of the new Bluetooth device 84436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby * @return the newly created CachedBluetoothDevice object 85436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby */ 86436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby CachedBluetoothDevice addDevice(LocalBluetoothAdapter adapter, 87436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby LocalBluetoothProfileManager profileManager, 88436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby BluetoothDevice device) { 89436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby CachedBluetoothDevice newDevice = new CachedBluetoothDevice(adapter, profileManager, 90436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby device); 91436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby mCachedDevices.add(newDevice); 92436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return newDevice; 93436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby } 94436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby 95436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby /** 96d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * Attempts to get the name of a remote device, otherwise returns the address. 97d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * 98d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @param device The remote device. 99d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly * @return The name, or if unavailable, the address. 100d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly */ 101d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public String getName(BluetoothDevice device) { 102d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 103436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (cachedDevice != null) { 104436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return cachedDevice.getName(); 105d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 106d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 1072036ebd8896bbabbbe04db34c9e7d8a1be6fe32aMatthew Xie String name = device.getAliasName(); 108436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby if (name != null) { 109436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return name; 110d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 111d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 112436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby return device.getAddress(); 113d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 114d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 115d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onScanningStateChanged(boolean started) { 116d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (!started) return; 117d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 118d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly // If starting a new scan, clear old visibility 119436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby // Iterate in reverse order since devices may be removed. 120d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly for (int i = mCachedDevices.size() - 1; i >= 0; i--) { 121d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); 122d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.setVisible(false); 123d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly checkForDeviceRemoval(cachedDevice); 124d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 125d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 126d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly 127d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly public synchronized void onBtClassChanged(BluetoothDevice device) { 128d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly CachedBluetoothDevice cachedDevice = findDevice(device); 129d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly if (cachedDevice != null) { 130d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly cachedDevice.refreshBtClass(); 131d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 132d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly } 1332aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan 1342aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan public synchronized void onUuidChanged(BluetoothDevice device) { 1352aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan CachedBluetoothDevice cachedDevice = findDevice(device); 1362aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan if (cachedDevice != null) { 1372aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan cachedDevice.onUuidChanged(); 1382aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan } 1392aef1f3c814b1f8aa00aeefff35caf293c738702Michael Chan } 140d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly} 141