/* * 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()); } }