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 33package com.android.bluetooth.opp; 34 35import android.bluetooth.BluetoothDevice; 36import android.content.Context; 37import android.content.SharedPreferences; 38import android.content.SharedPreferences.Editor; 39import android.util.Log; 40 41import 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 */ 47public 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