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