blob: 11a31844399004a4da309ae355b375b2a2fcb85d [file] [log] [blame]
/*
* Copyright (c) 2008-2009, Motorola, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* - Neither the name of the Motorola, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package com.android.bluetooth.opp;
import java.util.HashMap;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
/**
* This class cache Bluetooth device name and channel locally. Its a temp
* solution which should be replaced by bluetooth_devices in SettingsProvider
*/
public class BluetoothOppPreference {
private static final String TAG = "BluetoothOppPreference";
private static final boolean V = Constants.VERBOSE;
private static BluetoothOppPreference INSTANCE;
/* Used when obtaining a reference to the singleton instance. */
private static Object INSTANCE_LOCK = new Object();
private boolean mInitialized;
private Context mContext;
private SharedPreferences mNamePreference;
private SharedPreferences mChannelPreference;
private HashMap<String, Integer> mChannels = new HashMap<String, Integer>();
private HashMap<String, String> mNames = new HashMap<String, String>();
public static BluetoothOppPreference getInstance(Context context) {
synchronized (INSTANCE_LOCK) {
if (INSTANCE == null) {
INSTANCE = new BluetoothOppPreference();
}
if (!INSTANCE.init(context)) {
return null;
}
return INSTANCE;
}
}
private boolean init(Context context) {
if (mInitialized)
return true;
mInitialized = true;
mContext = context;
mNamePreference = mContext.getSharedPreferences(Constants.BLUETOOTHOPP_NAME_PREFERENCE,
Context.MODE_PRIVATE);
mChannelPreference = mContext.getSharedPreferences(
Constants.BLUETOOTHOPP_CHANNEL_PREFERENCE, Context.MODE_PRIVATE);
mNames = (HashMap<String, String>) mNamePreference.getAll();
mChannels = (HashMap<String, Integer>) mChannelPreference.getAll();
return true;
}
private String getChannelKey(BluetoothDevice remoteDevice, int uuid) {
return remoteDevice.getAddress() + "_" + Integer.toHexString(uuid);
}
public String getName(BluetoothDevice remoteDevice) {
if (remoteDevice.getAddress().equals("FF:FF:FF:00:00:00")) {
return "localhost";
}
if (!mNames.isEmpty()) {
String name = mNames.get(remoteDevice.getAddress());
if (name != null) {
return name;
}
}
return null;
}
public int getChannel(BluetoothDevice remoteDevice, int uuid) {
String key = getChannelKey(remoteDevice, uuid);
if (V) Log.v(TAG, "getChannel " + key);
Integer channel = null;
if (mChannels != null) {
channel = mChannels.get(key);
if (V) Log.v(TAG, "getChannel for " + remoteDevice + "_" + Integer.toHexString(uuid) +
" as " + channel);
}
return (channel != null) ? channel : -1;
}
public void setName(BluetoothDevice remoteDevice, String name) {
if (V) Log.v(TAG, "Setname for " + remoteDevice + " to " + name);
if (name != null && !name.equals(getName(remoteDevice))) {
Editor ed = mNamePreference.edit();
ed.putString(remoteDevice.getAddress(), name);
ed.apply();
mNames.put(remoteDevice.getAddress(), name);
}
}
public void setChannel(BluetoothDevice remoteDevice, int uuid, int channel) {
if (V) Log.v(TAG, "Setchannel for " + remoteDevice + "_" + Integer.toHexString(uuid) + " to "
+ channel);
if (channel != getChannel(remoteDevice, uuid)) {
String key = getChannelKey(remoteDevice, uuid);
Editor ed = mChannelPreference.edit();
ed.putInt(key, channel);
ed.apply();
mChannels.put(key, channel);
}
}
public void removeChannel(BluetoothDevice remoteDevice, int uuid) {
String key = getChannelKey(remoteDevice, uuid);
Editor ed = mChannelPreference.edit();
ed.remove(key);
ed.apply();
mChannels.remove(key);
}
public void dump() {
Log.d(TAG, "Dumping Names: ");
Log.d(TAG, mNames.toString());
Log.d(TAG, "Dumping Channels: ");
Log.d(TAG, mChannels.toString());
}
}