1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings.bluetooth;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1911b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthallimport static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
2011b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall
21436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.app.AlertDialog;
22436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothClass;
23436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothDevice;
24436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothProfile;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
26436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.content.DialogInterface;
2711b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthallimport android.os.UserManager;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
29ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hambyimport android.text.Html;
30436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.text.TextUtils;
31436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.util.Log;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.TypedValue;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
3448e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasaniimport android.view.View.OnClickListener;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
36c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby
37436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport com.android.settings.R;
38c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby
39436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport java.util.List;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * BluetoothDevicePreference is the preference type used to display each remote
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Bluetooth device in the Bluetooth Settings screen.
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
45436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambypublic final class BluetoothDevicePreference extends Preference implements
4648e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani        CachedBluetoothDevice.Callback, OnClickListener {
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG = "BluetoothDevicePreference";
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static int sDimAlpha = Integer.MIN_VALUE;
50e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
5139ef225e7c44a48aa9cfdf5c56ecd4ddfb95ae89Jake Hamby    private final CachedBluetoothDevice mCachedDevice;
52e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
5348e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    private OnClickListener mOnSettingsClickListener;
5448e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani
55436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private AlertDialog mDisconnectDialog;
56e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
5739ef225e7c44a48aa9cfdf5c56ecd4ddfb95ae89Jake Hamby    public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice) {
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super(context);
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (sDimAlpha == Integer.MIN_VALUE) {
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            TypedValue outValue = new TypedValue();
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, outValue, true);
63436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            sDimAlpha = (int) (outValue.getFloat() * 255);
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
65e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
66d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly        mCachedDevice = cachedDevice;
67e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
6879be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
6911b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall            UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
7011b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall            if (! um.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH)) {
7111b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall                setWidgetLayoutResource(R.layout.preference_bluetooth);
7211b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthall            }
7379be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        }
74e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
75436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mCachedDevice.registerCallback(this);
76e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
77c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby        onDeviceAttributesChanged();
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
79e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
80436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    CachedBluetoothDevice getCachedDevice() {
81d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly        return mCachedDevice;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
8448e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    public void setOnSettingsClickListener(OnClickListener listener) {
8548e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani        mOnSettingsClickListener = listener;
8648e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    }
8748e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onPrepareForRemoval() {
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPrepareForRemoval();
91d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly        mCachedDevice.unregisterCallback(this);
92436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (mDisconnectDialog != null) {
93436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            mDisconnectDialog.dismiss();
94436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            mDisconnectDialog = null;
95436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
98c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby    public void onDeviceAttributesChanged() {
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        /*
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         * The preference framework takes care of making sure the value has
101436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby         * changed before proceeding. It will also call notifyChanged() if
102436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby         * any preference info has changed from the previous value.
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         */
104d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly        setTitle(mCachedDevice.getName());
105e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
10679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        int summaryResId = getConnectionSummary();
10779be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        if (summaryResId != 0) {
10879be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            setSummary(summaryResId);
10979be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        } else {
11079be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            setSummary(null);   // empty summary for unpaired devices
11179be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        }
11279be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby
11379be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        int iconResId = getBtClassDrawable();
11479be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        if (iconResId != 0) {
11579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            setIcon(iconResId);
11679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        }
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Used to gray out the item
119436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        setEnabled(!mCachedDevice.isBusy());
120e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
121436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        // This could affect ordering, so notify that
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        notifyHierarchyChanged();
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onBindView(View view) {
127132b21440b1b930322fc129a504afa6107835f8eMichael Chan        // Disable this view if the bluetooth enable/disable preference view is off
128c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby        if (null != findPreferenceInHierarchy("bt_checkbox")) {
129a41e2f94b792e44872be87f40fce182e6b39f4baYue Lixin            setDependency("bt_checkbox");
130a41e2f94b792e44872be87f40fce182e6b39f4baYue Lixin        }
131132b21440b1b930322fc129a504afa6107835f8eMichael Chan
13279be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        if (mCachedDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
13379be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            ImageView deviceDetails = (ImageView) view.findViewById(R.id.deviceDetails);
13479be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            if (deviceDetails != null) {
13579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                deviceDetails.setOnClickListener(this);
13679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                deviceDetails.setTag(mCachedDevice);
13779be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                deviceDetails.setAlpha(isEnabled() ? 255 : sDimAlpha);
13848e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani            }
13948e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani        }
14048e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani
14179be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        super.onBindView(view);
14248e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    }
14348e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani
14448e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    public void onClick(View v) {
1454346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne        // Should never be null by construction
1464346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne        if (mOnSettingsClickListener != null) {
1474346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne            mOnSettingsClickListener.onClick(v);
14848e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani        }
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1514346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne    @Override
152436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public boolean equals(Object o) {
153436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if ((o == null) || !(o instanceof BluetoothDevicePreference)) {
154436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            return false;
155436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
156436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mCachedDevice.equals(
157436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                ((BluetoothDevicePreference) o).mCachedDevice);
158436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
159436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
1604346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne    @Override
161436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public int hashCode() {
162436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mCachedDevice.hashCode();
163436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
164436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public int compareTo(Preference another) {
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (!(another instanceof BluetoothDevicePreference)) {
1684346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne            // Rely on default sort
1694346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne            return super.compareTo(another);
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
171e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
172436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mCachedDevice
173436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                .compareTo(((BluetoothDevicePreference) another).mCachedDevice);
174436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
175436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
176436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    void onClicked() {
177436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        int bondState = mCachedDevice.getBondState();
178436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
179436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (mCachedDevice.isConnected()) {
180436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            askDisconnect();
181436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        } else if (bondState == BluetoothDevice.BOND_BONDED) {
182436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            mCachedDevice.connect(true);
183436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        } else if (bondState == BluetoothDevice.BOND_NONE) {
184436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            pair();
185436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
186436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
187436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
188436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    // Show disconnect confirmation dialog for a device.
189436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private void askDisconnect() {
190436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        Context context = getContext();
191436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        String name = mCachedDevice.getName();
192436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (TextUtils.isEmpty(name)) {
193436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            name = context.getString(R.string.bluetooth_device);
194436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
195ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hamby        String message = context.getString(R.string.bluetooth_disconnect_all_profiles, name);
196ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hamby        String title = context.getString(R.string.bluetooth_disconnect_title);
197436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
198436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        DialogInterface.OnClickListener disconnectListener = new DialogInterface.OnClickListener() {
199436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            public void onClick(DialogInterface dialog, int which) {
200436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                mCachedDevice.disconnect();
201436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
202436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        };
203436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
204436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mDisconnectDialog = Utils.showDisconnectDialog(context,
205ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hamby                mDisconnectDialog, disconnectListener, title, Html.fromHtml(message));
206436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
207436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
208436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private void pair() {
209436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (!mCachedDevice.startPairing()) {
210436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            Utils.showError(getContext(), mCachedDevice.getName(),
211436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    R.string.bluetooth_pairing_error_message);
212436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
213436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
214436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
215436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private int getConnectionSummary() {
216436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        final CachedBluetoothDevice cachedDevice = mCachedDevice;
217436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
21879be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        boolean profileConnected = false;       // at least one profile is connected
21979be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        boolean a2dpNotConnected = false;       // A2DP is preferred but not connected
22079be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        boolean headsetNotConnected = false;    // Headset is preferred but not connected
22179be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby
222436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        for (LocalBluetoothProfile profile : cachedDevice.getProfiles()) {
22350e0b0cf87f724d25ada10353867f14ebbf644aaJaikumar Ganesh            int connectionStatus = cachedDevice.getProfileConnectionState(profile);
224436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
22579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            switch (connectionStatus) {
22679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                case BluetoothProfile.STATE_CONNECTING:
22779be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                case BluetoothProfile.STATE_DISCONNECTING:
22879be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                    return Utils.getConnectionStateSummary(connectionStatus);
22979be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby
23079be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                case BluetoothProfile.STATE_CONNECTED:
23179be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                    profileConnected = true;
23279be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                    break;
23379be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby
23479be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                case BluetoothProfile.STATE_DISCONNECTED:
23579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                    if (profile.isProfileReady() && profile.isPreferred(cachedDevice.getDevice())) {
23679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                        if (profile instanceof A2dpProfile) {
23779be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                            a2dpNotConnected = true;
23879be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                        } else if (profile instanceof HeadsetProfile) {
23979be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                            headsetNotConnected = true;
24079be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                        }
24179be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                    }
24279be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                    break;
24379be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            }
24479be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        }
24579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby
24679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        if (profileConnected) {
24779be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            if (a2dpNotConnected && headsetNotConnected) {
24879be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                return R.string.bluetooth_connected_no_headset_no_a2dp;
24979be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            } else if (a2dpNotConnected) {
25079be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                return R.string.bluetooth_connected_no_a2dp;
25179be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            } else if (headsetNotConnected) {
25279be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                return R.string.bluetooth_connected_no_headset;
25379be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            } else {
25479be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                return R.string.bluetooth_connected;
255436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
256436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
257436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
258436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        switch (cachedDevice.getBondState()) {
259436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            case BluetoothDevice.BOND_BONDING:
260436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                return R.string.bluetooth_pairing;
26179be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby
26279be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            case BluetoothDevice.BOND_BONDED:
263436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            case BluetoothDevice.BOND_NONE:
264436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            default:
265436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                return 0;
266436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
268e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
269436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private int getBtClassDrawable() {
270436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        BluetoothClass btClass = mCachedDevice.getBtClass();
271436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (btClass != null) {
272436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            switch (btClass.getMajorDeviceClass()) {
273436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.COMPUTER:
274436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    return R.drawable.ic_bt_laptop;
275436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
276436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.PHONE:
277436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    return R.drawable.ic_bt_cellphone;
278436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
279436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.PERIPHERAL:
280436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    return HidProfile.getHidClassDrawable(btClass);
281436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
282436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.IMAGING:
283436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    return R.drawable.ic_bt_imaging;
284436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
285436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                default:
286436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    // unrecognized device class; continue
287436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
288436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        } else {
289436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            Log.w(TAG, "mBtClass is null");
290436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
291436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
292436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        List<LocalBluetoothProfile> profiles = mCachedDevice.getProfiles();
293436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        for (LocalBluetoothProfile profile : profiles) {
294436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            int resId = profile.getDrawableResource(btClass);
295436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            if (resId != 0) {
296436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                return resId;
297436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
298436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
299436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (btClass != null) {
300436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
301436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                return R.drawable.ic_bt_headphones_a2dp;
302436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
303436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
304436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
305436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                return R.drawable.ic_bt_headset_hfp;
306436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
307436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
308436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return 0;
309436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
311