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
19436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.app.AlertDialog;
20436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothClass;
21436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.bluetooth.BluetoothDevice;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
23436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.content.DialogInterface;
248fa3d44596e75cbc03f1eb5b478133360227bc66pkanwarimport android.content.res.Resources;
2511b69bf86d7b3d8203e24473d4d91424a87bbdc1Maggie Benthallimport android.os.UserManager;
2639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.Preference;
2739b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.support.v7.preference.PreferenceViewHolder;
28ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hambyimport android.text.Html;
29436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.text.TextUtils;
30436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport android.util.Log;
318fa3d44596e75cbc03f1eb5b478133360227bc66pkanwarimport android.util.Pair;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.TypedValue;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
34c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby
35133b09628805d2b0f1cc559739c597f0b92951ceDoris Lingimport com.android.internal.logging.nano.MetricsProto.MetricsEvent;
36436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport com.android.settings.R;
37133b09628805d2b0f1cc559739c597f0b92951ceDoris Lingimport com.android.settings.core.instrumentation.MetricsFeatureProvider;
38133b09628805d2b0f1cc559739c597f0b92951ceDoris Lingimport com.android.settings.overlay.FeatureFactory;
3900d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhangimport com.android.settings.widget.GearPreference;
40f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.CachedBluetoothDevice;
41f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.HidProfile;
42f2982a9ba19340b474bafb6b0bf5832673984e0dJason Monkimport com.android.settingslib.bluetooth.LocalBluetoothProfile;
43c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby
44436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hambyimport java.util.List;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
4639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport static android.os.UserManager.DISALLOW_CONFIG_BLUETOOTH;
4739b467482d1bf256a111c757e9b7621c6f523271Jason Monk
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * BluetoothDevicePreference is the preference type used to display each remote
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Bluetooth device in the Bluetooth Settings screen.
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
5200d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhangpublic final class BluetoothDevicePreference extends GearPreference implements
5300d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang        CachedBluetoothDevice.Callback {
5400d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    private static final String TAG = "BluetoothDevicePref";
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static int sDimAlpha = Integer.MIN_VALUE;
57e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
5839ef225e7c44a48aa9cfdf5c56ecd4ddfb95ae89Jake Hamby    private final CachedBluetoothDevice mCachedDevice;
5900d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    private final UserManager mUserManager;
6048e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani
61436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private AlertDialog mDisconnectDialog;
62e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
638fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    private String contentDescription = null;
648fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar
658fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    /* Talk-back descriptions for various BT icons */
668fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    Resources r = getContext().getResources();
67ec407ff78c69209c7071eefaf86e55cb1350872aFan Zhang    public final String COMPUTER = r.getString(R.string.bluetooth_talkback_computer);
688fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    public final String INPUT_PERIPHERAL = r.getString(
69ec407ff78c69209c7071eefaf86e55cb1350872aFan Zhang            R.string.bluetooth_talkback_input_peripheral);
708fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    public final String HEADSET = r.getString(R.string.bluetooth_talkback_headset);
718fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    public final String PHONE = r.getString(R.string.bluetooth_talkback_phone);
728fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    public final String IMAGING = r.getString(R.string.bluetooth_talkback_imaging);
738fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    public final String HEADPHONE = r.getString(R.string.bluetooth_talkback_headphone);
748fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    public final String BLUETOOTH = r.getString(R.string.bluetooth_talkback_bluetooth);
758fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar
7639ef225e7c44a48aa9cfdf5c56ecd4ddfb95ae89Jake Hamby    public BluetoothDevicePreference(Context context, CachedBluetoothDevice cachedDevice) {
7700d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang        super(context, null);
7800d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (sDimAlpha == Integer.MIN_VALUE) {
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            TypedValue outValue = new TypedValue();
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            context.getTheme().resolveAttribute(android.R.attr.disabledAlpha, outValue, true);
83436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            sDimAlpha = (int) (outValue.getFloat() * 255);
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
85e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
86d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly        mCachedDevice = cachedDevice;
87436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mCachedDevice.registerCallback(this);
88e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
89c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby        onDeviceAttributesChanged();
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
91e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
922071eda150c4ade320fa91ec99678114afbd223eJason Monk    void rebind() {
932071eda150c4ade320fa91ec99678114afbd223eJason Monk        notifyChanged();
942071eda150c4ade320fa91ec99678114afbd223eJason Monk    }
952071eda150c4ade320fa91ec99678114afbd223eJason Monk
9600d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    @Override
9700d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    protected boolean shouldHideSecondTarget() {
9800d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang        return mCachedDevice == null
9900d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang                || mCachedDevice.getBondState() != BluetoothDevice.BOND_BONDED
10000d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang                || mUserManager.hasUserRestriction(DISALLOW_CONFIG_BLUETOOTH);
10148e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    }
10248e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani
10300d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    @Override
10400d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    protected int getSecondTargetResId() {
10500d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang        return R.layout.preference_widget_gear;
10600d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    }
10700d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang
10800d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    CachedBluetoothDevice getCachedDevice() {
10900d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang        return mCachedDevice;
110457c3cbec2cf38a671a101e9c9426b318aff1564Doris Ling    }
111457c3cbec2cf38a671a101e9c9426b318aff1564Doris Ling
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onPrepareForRemoval() {
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onPrepareForRemoval();
115d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly        mCachedDevice.unregisterCallback(this);
116436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (mDisconnectDialog != null) {
117436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            mDisconnectDialog.dismiss();
118436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            mDisconnectDialog = null;
119436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
12200d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    public CachedBluetoothDevice getBluetoothDevice() {
12300d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang        return mCachedDevice;
12400d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang    }
12500d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang
126c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby    public void onDeviceAttributesChanged() {
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        /*
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         * The preference framework takes care of making sure the value has
129436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby         * changed before proceeding. It will also call notifyChanged() if
130436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby         * any preference info has changed from the previous value.
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         */
132d63c0112251ab4e4e977545368dd703d875012a4Nick Pelly        setTitle(mCachedDevice.getName());
133e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
13488643ac6baeb2079e4a6f3fd11ca74e84573da4eJason Monk        int summaryResId = mCachedDevice.getConnectionSummary();
13579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        if (summaryResId != 0) {
13679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            setSummary(summaryResId);
13779be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        } else {
13879be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            setSummary(null);   // empty summary for unpaired devices
13979be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        }
14079be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby
1418fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar
1428fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar        Pair<Integer, String> pair = getBtClassDrawableWithDescription();
1438fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar        if (pair.first != 0) {
1448fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar            setIcon(pair.first);
1458fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar            contentDescription = pair.second;
14679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        }
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Used to gray out the item
149436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        setEnabled(!mCachedDevice.isBusy());
150e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
151436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        // This could affect ordering, so notify that
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        notifyHierarchyChanged();
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
15639b467482d1bf256a111c757e9b7621c6f523271Jason Monk    public void onBindViewHolder(PreferenceViewHolder view) {
157132b21440b1b930322fc129a504afa6107835f8eMichael Chan        // Disable this view if the bluetooth enable/disable preference view is off
158c090feb64f674d9840993736a24f9667f8b0e0d5Jake Hamby        if (null != findPreferenceInHierarchy("bt_checkbox")) {
159a41e2f94b792e44872be87f40fce182e6b39f4baYue Lixin            setDependency("bt_checkbox");
160a41e2f94b792e44872be87f40fce182e6b39f4baYue Lixin        }
161132b21440b1b930322fc129a504afa6107835f8eMichael Chan
16279be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby        if (mCachedDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
16300d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang            ImageView deviceDetails = (ImageView) view.findViewById(R.id.settings_button);
164da43135d7e498f95ad2f2caa4e466b6824a0cd03PauloftheWest
16579be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby            if (deviceDetails != null) {
16679be0b3e6b5639c4cbe2bbcd9adb0ec4c28716edJake Hamby                deviceDetails.setOnClickListener(this);
16748e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani            }
16848e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani        }
1698fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar        final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon);
1708fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar        if (imageView != null) {
1718fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar            imageView.setContentDescription(contentDescription);
1728fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar        }
17339b467482d1bf256a111c757e9b7621c6f523271Jason Monk        super.onBindViewHolder(view);
17448e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani    }
17548e90002839e662eb1667471aebeb0483e9fb7dbAmith Yamasani
1764346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne    @Override
177436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public boolean equals(Object o) {
178436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if ((o == null) || !(o instanceof BluetoothDevicePreference)) {
179436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            return false;
180436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
181436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mCachedDevice.equals(
182436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                ((BluetoothDevicePreference) o).mCachedDevice);
183436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
184436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
1854346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne    @Override
186436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    public int hashCode() {
187436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mCachedDevice.hashCode();
188436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
189436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public int compareTo(Preference another) {
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (!(another instanceof BluetoothDevicePreference)) {
1934346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne            // Rely on default sort
1944346cda76c6faa69d7341eb5e4e5bf21c2210e7fGilles Debunne            return super.compareTo(another);
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
196e6531e253bf646324d3a68de0e9cc612c5e1c8acMichael Chan
197436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        return mCachedDevice
198436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                .compareTo(((BluetoothDevicePreference) another).mCachedDevice);
199436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
200436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
201436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    void onClicked() {
202436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        int bondState = mCachedDevice.getBondState();
203436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
204133b09628805d2b0f1cc559739c597f0b92951ceDoris Ling        final MetricsFeatureProvider metricsFeatureProvider =
20500d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang                FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider();
206133b09628805d2b0f1cc559739c597f0b92951ceDoris Ling
207436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (mCachedDevice.isConnected()) {
208133b09628805d2b0f1cc559739c597f0b92951ceDoris Ling            metricsFeatureProvider.action(getContext(),
20900d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang                    MetricsEvent.ACTION_SETTINGS_BLUETOOTH_DISCONNECT);
210c0963dd7c5a35fdb007a2954644c1352060350d1Paul West            askDisconnect();
211436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        } else if (bondState == BluetoothDevice.BOND_BONDED) {
212133b09628805d2b0f1cc559739c597f0b92951ceDoris Ling            metricsFeatureProvider.action(getContext(),
21300d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang                    MetricsEvent.ACTION_SETTINGS_BLUETOOTH_CONNECT);
214436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            mCachedDevice.connect(true);
215436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        } else if (bondState == BluetoothDevice.BOND_NONE) {
216133b09628805d2b0f1cc559739c597f0b92951ceDoris Ling            metricsFeatureProvider.action(getContext(),
21700d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang                    MetricsEvent.ACTION_SETTINGS_BLUETOOTH_PAIR);
218436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            pair();
219436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
220436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
221436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
222436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    // Show disconnect confirmation dialog for a device.
223436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private void askDisconnect() {
224436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        Context context = getContext();
225436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        String name = mCachedDevice.getName();
226436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (TextUtils.isEmpty(name)) {
227436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            name = context.getString(R.string.bluetooth_device);
228436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
229ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hamby        String message = context.getString(R.string.bluetooth_disconnect_all_profiles, name);
230ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hamby        String title = context.getString(R.string.bluetooth_disconnect_title);
231436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
232436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        DialogInterface.OnClickListener disconnectListener = new DialogInterface.OnClickListener() {
233436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            public void onClick(DialogInterface dialog, int which) {
234436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                mCachedDevice.disconnect();
235436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
236436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        };
237436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
238436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        mDisconnectDialog = Utils.showDisconnectDialog(context,
239ca9812a8521fcc483e821fd5a88ec421de0b8f66Jake Hamby                mDisconnectDialog, disconnectListener, title, Html.fromHtml(message));
240436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
241436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
242436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    private void pair() {
243436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (!mCachedDevice.startPairing()) {
244436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            Utils.showError(getContext(), mCachedDevice.getName(),
245436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    R.string.bluetooth_pairing_error_message);
246436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
247436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
248436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
2498fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar    private Pair<Integer, String> getBtClassDrawableWithDescription() {
250436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        BluetoothClass btClass = mCachedDevice.getBtClass();
251436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (btClass != null) {
252436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            switch (btClass.getMajorDeviceClass()) {
253436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.COMPUTER:
2548fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar                    return new Pair<Integer, String>(R.drawable.ic_bt_laptop, COMPUTER);
255436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
256436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.PHONE:
2578fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar                    return new Pair<Integer, String>(R.drawable.ic_bt_cellphone, PHONE);
258436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
259436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.PERIPHERAL:
2608fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar                    return new Pair<Integer, String>(HidProfile.getHidClassDrawable(btClass),
261ec407ff78c69209c7071eefaf86e55cb1350872aFan Zhang                            INPUT_PERIPHERAL);
262436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
263436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                case BluetoothClass.Device.Major.IMAGING:
2648fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar                    return new Pair<Integer, String>(R.drawable.ic_bt_imaging, IMAGING);
265436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
266436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                default:
267436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby                    // unrecognized device class; continue
268436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
269436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        } else {
270436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            Log.w(TAG, "mBtClass is null");
271436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
272436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby
273436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        List<LocalBluetoothProfile> profiles = mCachedDevice.getProfiles();
274436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        for (LocalBluetoothProfile profile : profiles) {
275436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            int resId = profile.getDrawableResource(btClass);
276436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            if (resId != 0) {
2778fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar                return new Pair<Integer, String>(resId, null);
278436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
279436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
280436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        if (btClass != null) {
28100d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang            if (btClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET)) {
2828fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar                return new Pair<Integer, String>(R.drawable.ic_bt_headset_hfp, HEADSET);
283436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby            }
28400d8ff5d6e97c8ea09ca16080c496846875969e4Fan Zhang            if (btClass.doesClassMatch(BluetoothClass.PROFILE_A2DP)) {
285262f7fba9a314b6e8db962b84e617e0a71ca1c6aXiaodong Xu                return new Pair<Integer, String>(R.drawable.ic_bt_headphones_a2dp, HEADPHONE);
286262f7fba9a314b6e8db962b84e617e0a71ca1c6aXiaodong Xu            }
287436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby        }
2888fa3d44596e75cbc03f1eb5b478133360227bc66pkanwar        return new Pair<Integer, String>(R.drawable.ic_settings_bluetooth, BLUETOOTH);
289436b29e68e6608bed9e8e7d54385b8f62d89208eJake Hamby    }
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
291