Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings.bluetooth;
     18 
     19 import android.bluetooth.BluetoothDevice;
     20 import android.content.Context;
     21 import android.util.Log;
     22 
     23 import java.util.ArrayList;
     24 import java.util.Collection;
     25 import java.util.List;
     26 
     27 /**
     28  * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices.
     29  */
     30 final class CachedBluetoothDeviceManager {
     31     private static final String TAG = "CachedBluetoothDeviceManager";
     32     private static final boolean DEBUG = Utils.D;
     33 
     34     private Context mContext;
     35     private final List<CachedBluetoothDevice> mCachedDevices =
     36             new ArrayList<CachedBluetoothDevice>();
     37 
     38     CachedBluetoothDeviceManager(Context context) {
     39         mContext = context;
     40     }
     41 
     42     public synchronized Collection<CachedBluetoothDevice> getCachedDevicesCopy() {
     43         return new ArrayList<CachedBluetoothDevice>(mCachedDevices);
     44     }
     45 
     46     public static boolean onDeviceDisappeared(CachedBluetoothDevice cachedDevice) {
     47         cachedDevice.setVisible(false);
     48         return cachedDevice.getBondState() == BluetoothDevice.BOND_NONE;
     49     }
     50 
     51     public void onDeviceNameUpdated(BluetoothDevice device) {
     52         CachedBluetoothDevice cachedDevice = findDevice(device);
     53         if (cachedDevice != null) {
     54             cachedDevice.refreshName();
     55         }
     56     }
     57 
     58     /**
     59      * Search for existing {@link CachedBluetoothDevice} or return null
     60      * if this device isn't in the cache. Use {@link #addDevice}
     61      * to create and return a new {@link CachedBluetoothDevice} for
     62      * a newly discovered {@link BluetoothDevice}.
     63      *
     64      * @param device the address of the Bluetooth device
     65      * @return the cached device object for this device, or null if it has
     66      *   not been previously seen
     67      */
     68     CachedBluetoothDevice findDevice(BluetoothDevice device) {
     69         for (CachedBluetoothDevice cachedDevice : mCachedDevices) {
     70             if (cachedDevice.getDevice().equals(device)) {
     71                 return cachedDevice;
     72             }
     73         }
     74         return null;
     75     }
     76 
     77     /**
     78      * Create and return a new {@link CachedBluetoothDevice}. This assumes
     79      * that {@link #findDevice} has already been called and returned null.
     80      * @param device the address of the new Bluetooth device
     81      * @return the newly created CachedBluetoothDevice object
     82      */
     83     CachedBluetoothDevice addDevice(LocalBluetoothAdapter adapter,
     84             LocalBluetoothProfileManager profileManager,
     85             BluetoothDevice device) {
     86         CachedBluetoothDevice newDevice = new CachedBluetoothDevice(mContext, adapter,
     87             profileManager, device);
     88         mCachedDevices.add(newDevice);
     89         return newDevice;
     90     }
     91 
     92     /**
     93      * Attempts to get the name of a remote device, otherwise returns the address.
     94      *
     95      * @param device The remote device.
     96      * @return The name, or if unavailable, the address.
     97      */
     98     public String getName(BluetoothDevice device) {
     99         CachedBluetoothDevice cachedDevice = findDevice(device);
    100         if (cachedDevice != null) {
    101             return cachedDevice.getName();
    102         }
    103 
    104         String name = device.getAliasName();
    105         if (name != null) {
    106             return name;
    107         }
    108 
    109         return device.getAddress();
    110     }
    111 
    112     public synchronized void onScanningStateChanged(boolean started) {
    113         if (!started) return;
    114 
    115         // If starting a new scan, clear old visibility
    116         // Iterate in reverse order since devices may be removed.
    117         for (int i = mCachedDevices.size() - 1; i >= 0; i--) {
    118             CachedBluetoothDevice cachedDevice = mCachedDevices.get(i);
    119             cachedDevice.setVisible(false);
    120         }
    121     }
    122 
    123     public synchronized void onBtClassChanged(BluetoothDevice device) {
    124         CachedBluetoothDevice cachedDevice = findDevice(device);
    125         if (cachedDevice != null) {
    126             cachedDevice.refreshBtClass();
    127         }
    128     }
    129 
    130     public synchronized void onUuidChanged(BluetoothDevice device) {
    131         CachedBluetoothDevice cachedDevice = findDevice(device);
    132         if (cachedDevice != null) {
    133             cachedDevice.onUuidChanged();
    134         }
    135     }
    136 
    137     private void log(String msg) {
    138         if (DEBUG) {
    139             Log.d(TAG, msg);
    140         }
    141     }
    142 }
    143