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