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