OSDN Git Service

am 25bd33e1: am d7b2dccb: Display IMEI and ICCID for LTE device.
[android-x86/packages-apps-Settings.git] / src / com / android / settings / bluetooth / BluetoothSettings.java
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package com.android.settings.bluetooth;
18
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;
39
40 import com.android.settings.ProgressCategory;
41 import com.android.settings.R;
42
43 /**
44  * BluetoothSettings is the Settings screen for Bluetooth configuration and
45  * connection management.
46  */
47 public final class BluetoothSettings extends DeviceListPreferenceFragment {
48     private static final String TAG = "BluetoothSettings";
49
50     private static final int MENU_ID_SCAN = Menu.FIRST;
51     private static final int MENU_ID_ADVANCED = Menu.FIRST + 1;
52
53     private BluetoothEnabler mBluetoothEnabler;
54
55     private PreferenceGroup mAvailableDevicesCategory;
56     private boolean mAvailableDevicesCategoryIsPresent;
57
58     private View mView;
59     private TextView mEmptyView;
60
61     @Override
62     public View onCreateView(LayoutInflater inflater, ViewGroup container,
63             Bundle savedInstanceState) {
64         mView = inflater.inflate(R.layout.custom_preference_list_fragment, container, false);
65         return mView;
66     }
67
68     @Override
69     public void onActivityCreated(Bundle savedInstanceState) {
70         super.onActivityCreated(savedInstanceState);
71
72         mEmptyView = (TextView) mView.findViewById(R.id.empty);
73         getListView().setEmptyView(mEmptyView);
74     }
75
76     @Override
77     void addPreferencesForActivity() {
78         addPreferencesFromResource(R.xml.bluetooth_settings);
79
80         Activity activity = getActivity();
81
82         Switch actionBarSwitch = new Switch(activity);
83
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));
96             }
97         }
98
99         mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch);
100
101         setHasOptionsMenu(true);
102     }
103
104     @Override
105     public void onResume() {
106         super.onResume();
107
108         mBluetoothEnabler.resume();
109
110         updateContent(mLocalAdapter.getBluetoothState());
111     }
112
113     @Override
114     public void onPause() {
115         super.onPause();
116
117         mBluetoothEnabler.pause();
118     }
119
120     @Override
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);
133     }
134
135     @Override
136     public boolean onOptionsItemSelected(MenuItem item) {
137         switch (item.getItemId()) {
138             case MENU_ID_SCAN:
139                 if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON) {
140                     startScanning();
141                 }
142                 return true;
143             case MENU_ID_ADVANCED:
144                 if (getActivity() instanceof PreferenceActivity) {
145                     ((PreferenceActivity) getActivity()).startPreferencePanel(
146                             AdvancedBluetoothSettings.class.getCanonicalName(),
147                             null,
148                             R.string.bluetooth_advanced_titlebar, null,
149                             this, 0);
150                 } else {
151                     startFragment(this, AdvancedBluetoothSettings.class.getCanonicalName(), -1, null);
152                 }
153                 return true;
154         }
155         return super.onOptionsItemSelected(item);
156     }
157
158     private void startScanning() {
159         if (!mAvailableDevicesCategoryIsPresent) {
160             getPreferenceScreen().addPreference(mAvailableDevicesCategory);
161         }
162         mLocalAdapter.startScanning(true);
163     }
164
165     @Override
166     void onDevicePreferenceClick(BluetoothDevicePreference btPreference) {
167         mLocalAdapter.stopScanning();
168         super.onDevicePreferenceClick(btPreference);
169     }
170
171     private void addDeviceCategory(PreferenceGroup preferenceGroup, int titleId,
172             BluetoothDeviceFilter.Filter filter) {
173         preferenceGroup.setTitle(titleId);
174         getPreferenceScreen().addPreference(preferenceGroup);
175         setFilter(filter);
176         setDeviceListGroup(preferenceGroup);
177         addCachedDevices();
178         preferenceGroup.setEnabled(true);
179     }
180
181     private void updateContent(int bluetoothState) {
182         final PreferenceScreen preferenceScreen = getPreferenceScreen();
183         getActivity().invalidateOptionsMenu();
184         int messageId = 0;
185
186         switch (bluetoothState) {
187             case BluetoothAdapter.STATE_ON:
188                 preferenceScreen.removeAll();
189                 preferenceScreen.setOrderingAsAdded(true);
190
191                 // This device
192                 if (mMyDevicePreference == null) {
193                     mMyDevicePreference = new Preference(getActivity());
194                 }
195                 if (mLocalAdapter != null) {
196                     mMyDevicePreference.setTitle(mLocalAdapter.getName());
197                 }
198                 mMyDevicePreference.setEnabled(true);
199                 preferenceScreen.addPreference(mMyDevicePreference);
200
201                 // Paired devices category
202                 if (mPairedDevicesCategory == null) {
203                     mPairedDevicesCategory = new PreferenceCategory(getActivity());
204                 } else {
205                     mPairedDevicesCategory.removeAll();
206                 }
207                 addDeviceCategory(mPairedDevicesCategory,
208                         R.string.bluetooth_preference_paired_devices,
209                         BluetoothDeviceFilter.BONDED_DEVICE_FILTER);
210                 int numberOfPairedDevices = mPairedDevicesCategory.getPreferenceCount();
211
212                 // Available devices category
213                 if (mAvailableDevicesCategory == null) {
214                     mAvailableDevicesCategory = new ProgressCategory(getActivity(), null);
215                 } else {
216                     mAvailableDevicesCategory.removeAll();
217                 }
218                 addDeviceCategory(mAvailableDevicesCategory,
219                         R.string.bluetooth_preference_found_devices,
220                         BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER);
221                 int numberOfAvailableDevices = mAvailableDevicesCategory.getPreferenceCount();
222                 mAvailableDevicesCategoryIsPresent = true;
223
224                 if (numberOfAvailableDevices == 0) {
225                     preferenceScreen.removePreference(mAvailableDevicesCategory);
226                     mAvailableDevicesCategoryIsPresent = false;
227                 }
228
229                 if (numberOfPairedDevices == 0) {
230                     preferenceScreen.removePreference(mPairedDevicesCategory);
231                     startScanning();
232                 }
233                 return; // not break
234
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);
239                 }
240                 return; // not break
241
242             case BluetoothAdapter.STATE_OFF:
243                 messageId = R.string.bluetooth_empty_list_bluetooth_off;
244                 break;
245
246             case BluetoothAdapter.STATE_TURNING_ON:
247                 messageId = R.string.bluetooth_turning_on;
248                 break;
249         }
250
251         setDeviceListGroup(preferenceScreen);
252         removeAllDevices();
253         mEmptyView.setText(messageId);
254     }
255
256     @Override
257     public void onBluetoothStateChanged(int bluetoothState) {
258         super.onBluetoothStateChanged(bluetoothState);
259         updateContent(bluetoothState);
260     }
261
262     @Override
263     public void onScanningStateChanged(boolean started) {
264         super.onScanningStateChanged(started);
265         // Update options' enabled state
266         getActivity().invalidateOptionsMenu();
267     }
268
269     public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) {
270         setDeviceListGroup(getPreferenceScreen());
271         removeAllDevices();
272         updateContent(mLocalAdapter.getBluetoothState());
273     }
274
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();
280
281                 Preference pref = new Preference(getActivity());
282                 pref.setTitle(device.getName());
283                 pref.setFragment(DeviceProfilesSettings.class.getName());
284                 pref.getExtras().putParcelable(DeviceProfilesSettings.EXTRA_DEVICE,
285                         device.getDevice());
286                 ((PreferenceActivity) getActivity()).onPreferenceStartFragment(
287                         BluetoothSettings.this, pref);
288             } else {
289                 Log.w(TAG, "onClick() called for other View: " + v); // TODO remove
290             }
291         }
292     };
293
294     private Preference mMyDevicePreference;
295
296     private PreferenceGroup mPairedDevicesCategory;
297
298     /**
299      * Add a listener, which enables the advanced settings icon.
300      * @param preference the newly added preference
301      */
302     @Override
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);
308         }
309     }
310 }