2 * Copyright (C) 2011 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.settings.bluetooth;
19 import android.app.ActionBar;
20 import android.app.Activity;
21 import android.bluetooth.BluetoothAdapter;
22 import android.bluetooth.BluetoothDevice;
23 import android.os.Bundle;
24 import android.preference.Preference;
25 import android.preference.PreferenceActivity;
26 import android.preference.PreferenceCategory;
27 import android.preference.PreferenceGroup;
28 import android.preference.PreferenceScreen;
29 import android.util.Log;
30 import android.view.Gravity;
31 import android.view.LayoutInflater;
32 import android.view.Menu;
33 import android.view.MenuInflater;
34 import android.view.MenuItem;
35 import android.view.View;
36 import android.view.ViewGroup;
37 import android.widget.Switch;
38 import android.widget.TextView;
40 import com.android.settings.ProgressCategory;
41 import com.android.settings.R;
44 * BluetoothSettings is the Settings screen for Bluetooth configuration and
45 * connection management.
47 public final class BluetoothSettings extends DeviceListPreferenceFragment {
48 private static final String TAG = "BluetoothSettings";
50 private static final int MENU_ID_SCAN = Menu.FIRST;
51 private static final int MENU_ID_ADVANCED = Menu.FIRST + 1;
53 private BluetoothEnabler mBluetoothEnabler;
55 private PreferenceGroup mAvailableDevicesCategory;
56 private boolean mAvailableDevicesCategoryIsPresent;
59 private TextView mEmptyView;
62 public View onCreateView(LayoutInflater inflater, ViewGroup container,
63 Bundle savedInstanceState) {
64 mView = inflater.inflate(R.layout.custom_preference_list_fragment, container, false);
69 public void onActivityCreated(Bundle savedInstanceState) {
70 super.onActivityCreated(savedInstanceState);
72 mEmptyView = (TextView) mView.findViewById(R.id.empty);
73 getListView().setEmptyView(mEmptyView);
77 void addPreferencesForActivity() {
78 addPreferencesFromResource(R.xml.bluetooth_settings);
80 Activity activity = getActivity();
82 Switch actionBarSwitch = new Switch(activity);
84 if (activity instanceof PreferenceActivity) {
85 PreferenceActivity preferenceActivity = (PreferenceActivity) activity;
86 if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) {
87 final int padding = activity.getResources().getDimensionPixelSize(
88 R.dimen.action_bar_switch_padding);
89 actionBarSwitch.setPadding(0, 0, padding, 0);
90 activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
91 ActionBar.DISPLAY_SHOW_CUSTOM);
92 activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams(
93 ActionBar.LayoutParams.WRAP_CONTENT,
94 ActionBar.LayoutParams.WRAP_CONTENT,
95 Gravity.CENTER_VERTICAL | Gravity.RIGHT));
99 mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);
101 setHasOptionsMenu(true);
105 public void onResume() {
108 mBluetoothEnabler.resume();
110 updateContent(mLocalAdapter.getBluetoothState());
114 public void onPause() {
117 mBluetoothEnabler.pause();
121 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
122 boolean bluetoothIsEnabled = mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON;
123 boolean isDiscovering = mLocalAdapter.isDiscovering();
124 int textId = isDiscovering ? R.string.bluetooth_searching_for_devices :
125 R.string.bluetooth_search_for_devices;
126 menu.add(Menu.NONE, MENU_ID_SCAN, 0, textId)
127 //.setIcon(R.drawable.ic_menu_scan_network)
128 .setEnabled(bluetoothIsEnabled && !isDiscovering)
129 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
130 menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.bluetooth_menu_advanced)
131 //.setIcon(android.R.drawable.ic_menu_manage)
132 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
136 public boolean onOptionsItemSelected(MenuItem item) {
137 switch (item.getItemId()) {
139 if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON) {
143 case MENU_ID_ADVANCED:
144 if (getActivity() instanceof PreferenceActivity) {
145 ((PreferenceActivity) getActivity()).startPreferencePanel(
146 AdvancedBluetoothSettings.class.getCanonicalName(),
148 R.string.bluetooth_advanced_titlebar, null,
151 startFragment(this, AdvancedBluetoothSettings.class.getCanonicalName(), -1, null);
155 return super.onOptionsItemSelected(item);
158 private void startScanning() {
159 if (!mAvailableDevicesCategoryIsPresent) {
160 getPreferenceScreen().addPreference(mAvailableDevicesCategory);
162 mLocalAdapter.startScanning(true);
166 void onDevicePreferenceClick(BluetoothDevicePreference btPreference) {
167 mLocalAdapter.stopScanning();
168 super.onDevicePreferenceClick(btPreference);
171 private void addDeviceCategory(PreferenceGroup preferenceGroup, int titleId,
172 BluetoothDeviceFilter.Filter filter) {
173 preferenceGroup.setTitle(titleId);
174 getPreferenceScreen().addPreference(preferenceGroup);
176 setDeviceListGroup(preferenceGroup);
178 preferenceGroup.setEnabled(true);
181 private void updateContent(int bluetoothState) {
182 final PreferenceScreen preferenceScreen = getPreferenceScreen();
183 getActivity().invalidateOptionsMenu();
186 switch (bluetoothState) {
187 case BluetoothAdapter.STATE_ON:
188 preferenceScreen.removeAll();
189 preferenceScreen.setOrderingAsAdded(true);
192 if (mMyDevicePreference == null) {
193 mMyDevicePreference = new Preference(getActivity());
195 if (mLocalAdapter != null) {
196 mMyDevicePreference.setTitle(mLocalAdapter.getName());
198 mMyDevicePreference.setEnabled(true);
199 preferenceScreen.addPreference(mMyDevicePreference);
201 // Paired devices category
202 if (mPairedDevicesCategory == null) {
203 mPairedDevicesCategory = new PreferenceCategory(getActivity());
205 mPairedDevicesCategory.removeAll();
207 addDeviceCategory(mPairedDevicesCategory,
208 R.string.bluetooth_preference_paired_devices,
209 BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
210 int numberOfPairedDevices = mPairedDevicesCategory.getPreferenceCount();
212 // Available devices category
213 if (mAvailableDevicesCategory == null) {
214 mAvailableDevicesCategory = new ProgressCategory(getActivity(), null);
216 mAvailableDevicesCategory.removeAll();
218 addDeviceCategory(mAvailableDevicesCategory,
219 R.string.bluetooth_preference_found_devices,
220 BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER);
221 int numberOfAvailableDevices = mAvailableDevicesCategory.getPreferenceCount();
222 mAvailableDevicesCategoryIsPresent = true;
224 if (numberOfAvailableDevices == 0) {
225 preferenceScreen.removePreference(mAvailableDevicesCategory);
226 mAvailableDevicesCategoryIsPresent = false;
229 if (numberOfPairedDevices == 0) {
230 preferenceScreen.removePreference(mPairedDevicesCategory);
235 case BluetoothAdapter.STATE_TURNING_OFF:
236 int preferenceCount = preferenceScreen.getPreferenceCount();
237 for (int i = 0; i < preferenceCount; i++) {
238 preferenceScreen.getPreference(i).setEnabled(false);
242 case BluetoothAdapter.STATE_OFF:
243 messageId = R.string.bluetooth_empty_list_bluetooth_off;
246 case BluetoothAdapter.STATE_TURNING_ON:
247 messageId = R.string.bluetooth_turning_on;
251 setDeviceListGroup(preferenceScreen);
253 mEmptyView.setText(messageId);
257 public void onBluetoothStateChanged(int bluetoothState) {
258 super.onBluetoothStateChanged(bluetoothState);
259 updateContent(bluetoothState);
263 public void onScanningStateChanged(boolean started) {
264 super.onScanningStateChanged(started);
265 // Update options' enabled state
266 getActivity().invalidateOptionsMenu();
269 public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
270 setDeviceListGroup(getPreferenceScreen());
272 updateContent(mLocalAdapter.getBluetoothState());
275 private final View.OnClickListener mDeviceProfilesListener = new View.OnClickListener() {
276 public void onClick(View v) {
277 // User clicked on advanced options icon for a device in the list
278 if (v.getTag() instanceof CachedBluetoothDevice) {
279 CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag();
281 Preference pref = new Preference(getActivity());
282 pref.setTitle(device.getName());
283 pref.setFragment(DeviceProfilesSettings.class.getName());
284 pref.getExtras().putParcelable(DeviceProfilesSettings.EXTRA_DEVICE,
286 ((PreferenceActivity) getActivity()).onPreferenceStartFragment(
287 BluetoothSettings.this, pref);
289 Log.w(TAG, "onClick() called for other View: " + v); // TODO remove
294 private Preference mMyDevicePreference;
296 private PreferenceGroup mPairedDevicesCategory;
299 * Add a listener, which enables the advanced settings icon.
300 * @param preference the newly added preference
303 void initDevicePreference(BluetoothDevicePreference preference) {
304 CachedBluetoothDevice cachedDevice = preference.getCachedDevice();
305 if (cachedDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
306 // Only paired device have an associated advanced settings screen
307 preference.setOnSettingsClickListener(mDeviceProfilesListener);