Home | History | Annotate | Download | only in opp
      1 /*
      2  * Copyright (c) 2008-2009, Motorola, Inc.
      3  *
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions are met:
      8  *
      9  * - Redistributions of source code must retain the above copyright notice,
     10  * this list of conditions and the following disclaimer.
     11  *
     12  * - Redistributions in binary form must reproduce the above copyright notice,
     13  * this list of conditions and the following disclaimer in the documentation
     14  * and/or other materials provided with the distribution.
     15  *
     16  * - Neither the name of the Motorola, Inc. nor the names of its contributors
     17  * may be used to endorse or promote products derived from this software
     18  * without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
     24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30  * POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 package com.android.bluetooth.opp;
     34 
     35 import android.bluetooth.BluetoothDevice;
     36 import android.content.Context;
     37 import android.content.SharedPreferences;
     38 import android.content.SharedPreferences.Editor;
     39 import android.util.Log;
     40 
     41 import java.util.HashMap;
     42 
     43 /**
     44  * This class cache Bluetooth device name and channel locally. Its a temp
     45  * solution which should be replaced by bluetooth_devices in SettingsProvider
     46  */
     47 public class BluetoothOppPreference {
     48     private static final String TAG = "BluetoothOppPreference";
     49     private static final boolean V = Constants.VERBOSE;
     50 
     51     private static BluetoothOppPreference sInstance;
     52 
     53     /* Used when obtaining a reference to the singleton instance. */
     54     private static final Object INSTANCE_LOCK = new Object();
     55 
     56     private boolean mInitialized;
     57 
     58     private Context mContext;
     59 
     60     private SharedPreferences mNamePreference;
     61 
     62     private SharedPreferences mChannelPreference;
     63 
     64     private HashMap<String, Integer> mChannels = new HashMap<String, Integer>();
     65 
     66     private HashMap<String, String> mNames = new HashMap<String, String>();
     67 
     68     public static BluetoothOppPreference getInstance(Context context) {
     69         synchronized (INSTANCE_LOCK) {
     70             if (sInstance == null) {
     71                 sInstance = new BluetoothOppPreference();
     72             }
     73             if (!sInstance.init(context)) {
     74                 return null;
     75             }
     76             return sInstance;
     77         }
     78     }
     79 
     80     private boolean init(Context context) {
     81         if (mInitialized) {
     82             return true;
     83         }
     84         mInitialized = true;
     85 
     86         mContext = context;
     87 
     88         mNamePreference = mContext.getSharedPreferences(Constants.BLUETOOTHOPP_NAME_PREFERENCE,
     89                 Context.MODE_PRIVATE);
     90         mChannelPreference =
     91                 mContext.getSharedPreferences(Constants.BLUETOOTHOPP_CHANNEL_PREFERENCE,
     92                         Context.MODE_PRIVATE);
     93 
     94         mNames = (HashMap<String, String>) mNamePreference.getAll();
     95         mChannels = (HashMap<String, Integer>) mChannelPreference.getAll();
     96 
     97         return true;
     98     }
     99 
    100     private String getChannelKey(BluetoothDevice remoteDevice, int uuid) {
    101         return remoteDevice.getAddress() + "_" + Integer.toHexString(uuid);
    102     }
    103 
    104     public String getName(BluetoothDevice remoteDevice) {
    105         if (remoteDevice.getAddress().equals("FF:FF:FF:00:00:00")) {
    106             return "localhost";
    107         }
    108         if (!mNames.isEmpty()) {
    109             String name = mNames.get(remoteDevice.getAddress());
    110             if (name != null) {
    111                 return name;
    112             }
    113         }
    114         return null;
    115     }
    116 
    117     public int getChannel(BluetoothDevice remoteDevice, int uuid) {
    118         String key = getChannelKey(remoteDevice, uuid);
    119         if (V) {
    120             Log.v(TAG, "getChannel " + key);
    121         }
    122         Integer channel = null;
    123         if (mChannels != null) {
    124             channel = mChannels.get(key);
    125             if (V) {
    126                 Log.v(TAG,
    127                         "getChannel for " + remoteDevice + "_" + Integer.toHexString(uuid) + " as "
    128                                 + channel);
    129             }
    130         }
    131         return (channel != null) ? channel : -1;
    132     }
    133 
    134     public void setName(BluetoothDevice remoteDevice, String name) {
    135         if (V) {
    136             Log.v(TAG, "Setname for " + remoteDevice + " to " + name);
    137         }
    138         if (name != null && !name.equals(getName(remoteDevice))) {
    139             Editor ed = mNamePreference.edit();
    140             ed.putString(remoteDevice.getAddress(), name);
    141             ed.apply();
    142             mNames.put(remoteDevice.getAddress(), name);
    143         }
    144     }
    145 
    146     public void setChannel(BluetoothDevice remoteDevice, int uuid, int channel) {
    147         if (V) {
    148             Log.v(TAG, "Setchannel for " + remoteDevice + "_" + Integer.toHexString(uuid) + " to "
    149                     + channel);
    150         }
    151         if (channel != getChannel(remoteDevice, uuid)) {
    152             String key = getChannelKey(remoteDevice, uuid);
    153             Editor ed = mChannelPreference.edit();
    154             ed.putInt(key, channel);
    155             ed.apply();
    156             mChannels.put(key, channel);
    157         }
    158     }
    159 
    160     public void removeChannel(BluetoothDevice remoteDevice, int uuid) {
    161         String key = getChannelKey(remoteDevice, uuid);
    162         Editor ed = mChannelPreference.edit();
    163         ed.remove(key);
    164         ed.apply();
    165         mChannels.remove(key);
    166     }
    167 
    168     public void dump() {
    169         Log.d(TAG, "Dumping Names:  ");
    170         Log.d(TAG, mNames.toString());
    171         Log.d(TAG, "Dumping Channels:  ");
    172         Log.d(TAG, mChannels.toString());
    173     }
    174 }
    175