109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/*
209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Copyright (c) 2008-2009, Motorola, Inc.
309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * All rights reserved.
509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * Redistribution and use in source and binary forms, with or without
709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * modification, are permitted provided that the following conditions are met:
809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions of source code must retain the above copyright notice,
1009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer.
1109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
1209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Redistributions in binary form must reproduce the above copyright notice,
1309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * this list of conditions and the following disclaimer in the documentation
1409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * and/or other materials provided with the distribution.
1509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
1609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * - Neither the name of the Motorola, Inc. nor the names of its contributors
1709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * may be used to endorse or promote products derived from this software
1809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * without specific prior written permission.
1909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly *
2009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly * POSSIBILITY OF SUCH DAMAGE.
3109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */
3209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
3309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypackage com.android.bluetooth.opp;
3409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
3509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport java.util.HashMap;
3609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
3741ef8d494511c040451f2f887cb31c3100746b61Nick Pellyimport android.bluetooth.BluetoothDevice;
3809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.Context;
3909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.SharedPreferences;
4009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.content.SharedPreferences.Editor;
4109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellyimport android.util.Log;
4209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
4309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly/**
44888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun * This class cache Bluetooth device name and channel locally. Its a temp
456769b59d715ea98bd72eafcfea9acd2714a887daTao Liejun * solution which should be replaced by bluetooth_devices in SettingsProvider
4609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly */
4709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pellypublic class BluetoothOppPreference {
4809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private static final String TAG = "BluetoothOppPreference";
49ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly    private static final boolean V = Constants.VERBOSE;
5009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
5109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private static BluetoothOppPreference INSTANCE;
5209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
5309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    /* Used when obtaining a reference to the singleton instance. */
5409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private static Object INSTANCE_LOCK = new Object();
5509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
5609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private boolean mInitialized;
5709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
5809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private Context mContext;
5909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
6009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private SharedPreferences mNamePreference;
6109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
6209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private SharedPreferences mChannelPreference;
6309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
6409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private HashMap<String, Integer> mChannels = new HashMap<String, Integer>();
6509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
6609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private HashMap<String, String> mNames = new HashMap<String, String>();
6709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
6809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public static BluetoothOppPreference getInstance(Context context) {
6909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        synchronized (INSTANCE_LOCK) {
7009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (INSTANCE == null) {
7109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                INSTANCE = new BluetoothOppPreference();
7209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
7309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (!INSTANCE.init(context)) {
7409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                return null;
7509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
7609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            return INSTANCE;
7709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
7809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
7909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    private boolean init(Context context) {
8109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        if (mInitialized)
8209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            return true;
8309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mInitialized = true;
8409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
850bd5f7b5c36a60687ffe895368fd8df6df38acabJaikumar Ganesh        mContext = context;
8609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
8709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mNamePreference = mContext.getSharedPreferences(Constants.BLUETOOTHOPP_NAME_PREFERENCE,
8809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Context.MODE_PRIVATE);
8909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mChannelPreference = mContext.getSharedPreferences(
9009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                Constants.BLUETOOTHOPP_CHANNEL_PREFERENCE, Context.MODE_PRIVATE);
9109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9241ef8d494511c040451f2f887cb31c3100746b61Nick Pelly        mNames = (HashMap<String, String>) mNamePreference.getAll();
9341ef8d494511c040451f2f887cb31c3100746b61Nick Pelly        mChannels = (HashMap<String, Integer>) mChannelPreference.getAll();
9409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        return true;
9609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
9709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
9841ef8d494511c040451f2f887cb31c3100746b61Nick Pelly    private String getChannelKey(BluetoothDevice remoteDevice, int uuid) {
9941ef8d494511c040451f2f887cb31c3100746b61Nick Pelly        return remoteDevice.getAddress() + "_" + Integer.toHexString(uuid);
10009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
10109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
10241ef8d494511c040451f2f887cb31c3100746b61Nick Pelly    public String getName(BluetoothDevice remoteDevice) {
10341ef8d494511c040451f2f887cb31c3100746b61Nick Pelly        if (remoteDevice.getAddress().equals("FF:FF:FF:00:00:00")) {
10409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            return "localhost";
10509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
10609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        if (!mNames.isEmpty()) {
10741ef8d494511c040451f2f887cb31c3100746b61Nick Pelly            String name = mNames.get(remoteDevice.getAddress());
10809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            if (name != null) {
10909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                return name;
11009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            }
11109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
11209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        return null;
11309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
11409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
11541ef8d494511c040451f2f887cb31c3100746b61Nick Pelly    public int getChannel(BluetoothDevice remoteDevice, int uuid) {
11641ef8d494511c040451f2f887cb31c3100746b61Nick Pelly        String key = getChannelKey(remoteDevice, uuid);
117ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly        if (V) Log.v(TAG, "getChannel " + key);
118888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        Integer channel = null;
119888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        if (mChannels != null) {
12009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            channel = mChannels.get(key);
121ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly            if (V) Log.v(TAG, "getChannel for " + remoteDevice + "_" + Integer.toHexString(uuid) +
12241ef8d494511c040451f2f887cb31c3100746b61Nick Pelly                        " as " + channel);
12309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
124888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        return (channel != null) ? channel : -1;
12509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
12609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
12741ef8d494511c040451f2f887cb31c3100746b61Nick Pelly    public void setName(BluetoothDevice remoteDevice, String name) {
128ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly        if (V) Log.v(TAG, "Setname for " + remoteDevice + " to " + name);
12998a53e5bdb2500109c304f2b5364c1715ab745d8martin ma        if (name != null && !name.equals(getName(remoteDevice))) {
13009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Editor ed = mNamePreference.edit();
13141ef8d494511c040451f2f887cb31c3100746b61Nick Pelly            ed.putString(remoteDevice.getAddress(), name);
13255470710c2624bde2aa56275d29b60055638c06cBrad Fitzpatrick            ed.apply();
13341ef8d494511c040451f2f887cb31c3100746b61Nick Pelly            mNames.put(remoteDevice.getAddress(), name);
13409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
13509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
13609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
13741ef8d494511c040451f2f887cb31c3100746b61Nick Pelly    public void setChannel(BluetoothDevice remoteDevice, int uuid, int channel) {
138ce4d93666275df294cb073fe41de5b85932570a8Nick Pelly        if (V) Log.v(TAG, "Setchannel for " + remoteDevice + "_" + Integer.toHexString(uuid) + " to "
13909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly                    + channel);
140888485a3f5fe991116c5536bb6d6903d47b63a70Tao Liejun        if (channel != getChannel(remoteDevice, uuid)) {
14141ef8d494511c040451f2f887cb31c3100746b61Nick Pelly            String key = getChannelKey(remoteDevice, uuid);
14209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            Editor ed = mChannelPreference.edit();
14309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            ed.putInt(key, channel);
14455470710c2624bde2aa56275d29b60055638c06cBrad Fitzpatrick            ed.apply();
14509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly            mChannels.put(key, channel);
14609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        }
14709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
14809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
14941ef8d494511c040451f2f887cb31c3100746b61Nick Pelly    public void removeChannel(BluetoothDevice remoteDevice, int uuid) {
15041ef8d494511c040451f2f887cb31c3100746b61Nick Pelly        String key = getChannelKey(remoteDevice, uuid);
15109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Editor ed = mChannelPreference.edit();
15209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        ed.remove(key);
15355470710c2624bde2aa56275d29b60055638c06cBrad Fitzpatrick        ed.apply();
15409e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        mChannels.remove(key);
15509e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
15609e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly
15709e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    public void dump() {
15809e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Log.d(TAG, "Dumping Names:  ");
15909e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Log.d(TAG, mNames.toString());
16009e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Log.d(TAG, "Dumping Channels:  ");
16109e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly        Log.d(TAG, mChannels.toString());
16209e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly    }
16309e9cba205af60b3f42e7a4d891a7d1392e1f2a5Nick Pelly}
164