diff options
author | Gilles Debunne <debunne@google.com> | 2011-06-20 15:00:07 -0700 |
---|---|---|
committer | Gilles Debunne <debunne@google.com> | 2011-06-21 11:05:29 -0700 |
commit | e78c1879058571c00879f0d3e756951302adf513 (patch) | |
tree | 9c5be08683179a2f2c6ee2a97f6c2d49880a5254 /src/com/android | |
parent | 222a619668df108c93b59087b1ff543bb123f7e0 (diff) | |
download | packages_apps_Settings-e78c1879058571c00879f0d3e756951302adf513.zip packages_apps_Settings-e78c1879058571c00879f0d3e756951302adf513.tar.gz packages_apps_Settings-e78c1879058571c00879f0d3e756951302adf513.tar.bz2 |
Settings refactoring
Wifi and bluetooth pane refactored, main toggles moved to left pane.
Change-Id: I42ea4cf3bdf24158f3c67e0dea311258206cd78a
Diffstat (limited to 'src/com/android')
14 files changed, 918 insertions, 386 deletions
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java index 6d314ac..1f54b17 100644 --- a/src/com/android/settings/Settings.java +++ b/src/com/android/settings/Settings.java @@ -16,18 +16,33 @@ package com.android.settings; +import android.bluetooth.BluetoothAdapter; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; +import android.os.ServiceManager; import android.preference.PreferenceActivity; +import android.text.TextUtils; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.ImageView; +import android.widget.ListAdapter; +import android.widget.Switch; +import android.widget.TextView; +import com.android.settings.bluetooth.BluetoothEnabler; +import com.android.settings.wifi.WifiEnabler; + +import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -36,10 +51,11 @@ import java.util.List; */ public class Settings extends PreferenceActivity implements ButtonBarHandler { + private static final String LOG_TAG = "Settings"; private static final String META_DATA_KEY_HEADER_ID = - "com.android.settings.TOP_LEVEL_HEADER_ID"; + "com.android.settings.TOP_LEVEL_HEADER_ID"; private static final String META_DATA_KEY_FRAGMENT_CLASS = - "com.android.settings.FRAGMENT_CLASS"; + "com.android.settings.FRAGMENT_CLASS"; private static final String META_DATA_KEY_PARENT_TITLE = "com.android.settings.PARENT_FRAGMENT_TITLE"; private static final String META_DATA_KEY_PARENT_FRAGMENT_CLASS = @@ -58,6 +74,7 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { // TODO: Update Call Settings based on airplane mode state. protected HashMap<Integer, Integer> mHeaderIndexMap = new HashMap<Integer, Integer>(); + private List<Header> mHeaders; @Override protected void onCreate(Bundle savedInstanceState) { @@ -107,6 +124,26 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { } } + @Override + public void onResume() { + super.onResume(); + + ListAdapter listAdapter = getListAdapter(); + if (listAdapter instanceof HeaderAdapter) { + ((HeaderAdapter) listAdapter).resume(); + } + } + + @Override + public void onPause() { + super.onPause(); + + ListAdapter listAdapter = getListAdapter(); + if (listAdapter instanceof HeaderAdapter) { + ((HeaderAdapter) listAdapter).pause(); + } + } + private void switchToHeaderLocal(Header header) { mInLocalHeaderSwitch = true; switchToHeader(header); @@ -148,7 +185,7 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { mParentHeader.title = parentInfo.metaData.getString(META_DATA_KEY_PARENT_TITLE); } } catch (NameNotFoundException nnfe) { - Log.w("Settings", "Could not find parent activity : " + className); + Log.w(LOG_TAG, "Could not find parent activity : " + className); } } @@ -174,21 +211,22 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { @Override public Intent getIntent() { - String startingFragment = getStartingFragmentClass(super.getIntent()); + Intent superIntent = super.getIntent(); + String startingFragment = getStartingFragmentClass(superIntent); if (startingFragment != null && !onIsMultiPane()) { - Intent modIntent = new Intent(super.getIntent()); + Intent modIntent = new Intent(superIntent); modIntent.putExtra(EXTRA_SHOW_FRAGMENT, startingFragment); - Bundle args = super.getIntent().getExtras(); + Bundle args = superIntent.getExtras(); if (args != null) { args = new Bundle(args); } else { args = new Bundle(); } - args.putParcelable("intent", super.getIntent()); - modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, super.getIntent().getExtras()); + args.putParcelable("intent", superIntent); + modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, superIntent.getExtras()); return modIntent; } - return super.getIntent(); + return superIntent; } /** @@ -204,7 +242,7 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { if ("com.android.settings.ManageApplications".equals(intentClass) || "com.android.settings.RunningServices".equals(intentClass) || "com.android.settings.applications.StorageUse".equals(intentClass)) { - // Old name of manage apps. + // Old names of manage apps. intentClass = com.android.settings.applications.ManageApplications.class.getName(); } @@ -226,7 +264,18 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { mCurrentHeader = header; return header; } - return super.onGetInitialHeader(); + + // Find first non-category header + int position = 0; + while (position < mHeaders.size()) { + Header header = mHeaders.get(position); + if (HeaderAdapter.getHeaderType(header) != HeaderAdapter.HEADER_TYPE_CATEGORY) + return header; + position++; + } + + Log.e(LOG_TAG, "Unable to find a non-category header"); + return null; } @Override @@ -242,10 +291,12 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { * Populate the activity with the top-level headers. */ @Override - public void onBuildHeaders(List<Header> target) { - loadHeadersFromResource(R.xml.settings_headers, target); + public void onBuildHeaders(List<Header> headers) { + loadHeadersFromResource(R.xml.settings_headers, headers); + + updateHeaderList(headers); - updateHeaderList(target); + mHeaders = headers; } private void updateHeaderList(List<Header> target) { @@ -262,7 +313,13 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { } else if (id == R.id.call_settings) { if (!Utils.isVoiceCapable(this)) target.remove(header); + } else if (id == R.id.bluetooth_settings) { + // Remove Bluetooth Settings if Bluetooth service is not available. + if (ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE) == null) { + target.remove(header); + } } + // Increment if the current one wasn't removed by the Utils code. if (target.get(i) == header) { // Hold on to the first header, when we need to reset to the top-level @@ -296,6 +353,7 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { } } } catch (NameNotFoundException nnfe) { + // No recovery } } @@ -309,39 +367,197 @@ public class Settings extends PreferenceActivity implements ButtonBarHandler { return super.getNextButton(); } + private static class HeaderAdapter extends ArrayAdapter<Header> { + static final int HEADER_TYPE_CATEGORY = 0; + static final int HEADER_TYPE_NORMAL = 1; + static final int HEADER_TYPE_SWITCH = 2; + private static final int HEADER_TYPE_COUNT = HEADER_TYPE_SWITCH + 1; + + private final WifiEnabler mWifiEnabler; + private final BluetoothEnabler mBluetoothEnabler; + + private static class HeaderViewHolder { + ImageView icon; + TextView title; + TextView summary; + Switch switch_; + } + + private LayoutInflater mInflater; + + static int getHeaderType(Header header) { + if (header.fragment == null && header.intent == null) { + return HEADER_TYPE_CATEGORY; + } else if (header.id == R.id.wifi_settings || header.id == R.id.bluetooth_settings) { + return HEADER_TYPE_SWITCH; + } else { + return HEADER_TYPE_NORMAL; + } + } + + @Override + public int getItemViewType(int position) { + Header header = getItem(position); + return getHeaderType(header); + } + + @Override + public boolean areAllItemsEnabled() { + return false; // because of categories + } + + @Override + public boolean isEnabled(int position) { + return getItemViewType(position) != HEADER_TYPE_CATEGORY; + } + + @Override + public int getViewTypeCount() { + return HEADER_TYPE_COUNT; + } + + @Override + public boolean hasStableIds() { + return true; + } + + public HeaderAdapter(Context context, List<Header> objects) { + super(context, 0, objects); + mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + // These Switches are provided as placeholder until the adapter replaces these with actual + // Switches inflated from their layouts. Must be done before adapter is set in super + mWifiEnabler = new WifiEnabler(context, new Switch(context)); + mBluetoothEnabler = new BluetoothEnabler(context, new Switch(context)); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + HeaderViewHolder holder; + Header header = getItem(position); + int headerType = getHeaderType(header); + View view = null; + + if (convertView == null) { + holder = new HeaderViewHolder(); + switch (headerType) { + case HEADER_TYPE_CATEGORY: + view = new TextView(getContext(), null, android.R.attr.listSeparatorTextViewStyle); + holder.title = (TextView) view; + break; + + case HEADER_TYPE_SWITCH: + view = mInflater.inflate(R.layout.preference_header_switch_item, parent, false); + holder.icon = (ImageView) view.findViewById(R.id.icon); + holder.title = (TextView) view.findViewById(com.android.internal.R.id.title); + holder.summary = (TextView) view.findViewById(com.android.internal.R.id.summary); + holder.switch_ = (Switch) view.findViewById(R.id.switchWidget); + break; + + case HEADER_TYPE_NORMAL: + view = mInflater.inflate(com.android.internal.R.layout.preference_header_item, parent, false); + holder.icon = (ImageView) view.findViewById(com.android.internal.R.id.icon); + holder.title = (TextView) view.findViewById(com.android.internal.R.id.title); + holder.summary = (TextView) view.findViewById(com.android.internal.R.id.summary); + break; + } + view.setTag(holder); + } else { + view = convertView; + holder = (HeaderViewHolder) view.getTag(); + } + + // All view fields must be updated every time, because the view may be recycled + switch (headerType) { + case HEADER_TYPE_CATEGORY: + holder.title.setText(header.getTitle(getContext().getResources())); + break; + + case HEADER_TYPE_SWITCH: + // Would need a different treatment if the main menu had more switches + if (header.id == R.id.wifi_settings) { + mWifiEnabler.setSwitch(holder.switch_); + } else { + mBluetoothEnabler.setSwitch(holder.switch_); + } + // No break, fall through on purpose to update common fields + + //$FALL-THROUGH$ + case HEADER_TYPE_NORMAL: + holder.icon.setImageResource(header.iconRes); + holder.title.setText(header.getTitle(getContext().getResources())); + CharSequence summary = header.getSummary(getContext().getResources()); + if (!TextUtils.isEmpty(summary)) { + holder.summary.setVisibility(View.VISIBLE); + holder.summary.setText(summary); + } else { + holder.summary.setVisibility(View.GONE); + } + break; + } + + return view; + } + + public void resume() { + mWifiEnabler.resume(); + mBluetoothEnabler.resume(); + } + + public void pause() { + mWifiEnabler.pause(); + mBluetoothEnabler.pause(); + } + } + + @Override + public void setListAdapter(ListAdapter adapter) { + if (mHeaders == null) { + mHeaders = new ArrayList<Header>(); + // When the saved state provides the list of headers, onBuildHeaders is not called + // Copy the list of Headers from the adapter, preserving their order + for (int i = 0; i < adapter.getCount(); i++) { + mHeaders.add((Header) adapter.getItem(i)); + } + } + + // Ignore the adapter provided by PreferenceActivity and substitute ours instead + super.setListAdapter(new HeaderAdapter(this, mHeaders)); + } + /* * Settings subclasses for launching independently. */ - public static class BluetoothSettingsActivity extends Settings { } - public static class WirelessSettingsActivity extends Settings { } - public static class TetherSettingsActivity extends Settings { } - public static class VpnSettingsActivity extends Settings { } - public static class DateTimeSettingsActivity extends Settings { } - public static class StorageSettingsActivity extends Settings { } - public static class WifiSettingsActivity extends Settings { } - public static class InputMethodAndLanguageSettingsActivity extends Settings { } - public static class InputMethodConfigActivity extends Settings { } - public static class InputMethodAndSubtypeEnablerActivity extends Settings { } - public static class LocalePickerActivity extends Settings { } - public static class UserDictionarySettingsActivity extends Settings { } - public static class SoundSettingsActivity extends Settings { } - public static class DisplaySettingsActivity extends Settings { } - public static class DeviceInfoSettingsActivity extends Settings { } - public static class ApplicationSettingsActivity extends Settings { } - public static class ManageApplicationsActivity extends Settings { } - public static class StorageUseActivity extends Settings { } - public static class DevelopmentSettingsActivity extends Settings { } - public static class AccessibilitySettingsActivity extends Settings { } - public static class SecuritySettingsActivity extends Settings { } - public static class PrivacySettingsActivity extends Settings { } - public static class DockSettingsActivity extends Settings { } - public static class RunningServicesActivity extends Settings { } - public static class ManageAccountsSettingsActivity extends Settings { } - public static class PowerUsageSummaryActivity extends Settings { } - public static class AccountSyncSettingsActivity extends Settings { } - public static class AccountSyncSettingsInAddAccountActivity extends Settings { } - public static class CryptKeeperSettingsActivity extends Settings { } - public static class DeviceAdminSettingsActivity extends Settings { } - public static class DataUsageSummaryActivity extends Settings { } + public static class BluetoothSettingsActivity extends Settings { /* empty */ } + public static class WirelessSettingsActivity extends Settings { /* empty */ } + public static class TetherSettingsActivity extends Settings { /* empty */ } + public static class VpnSettingsActivity extends Settings { /* empty */ } + public static class DateTimeSettingsActivity extends Settings { /* empty */ } + public static class StorageSettingsActivity extends Settings { /* empty */ } + public static class WifiSettingsActivity extends Settings { /* empty */ } + public static class InputMethodAndLanguageSettingsActivity extends Settings { /* empty */ } + public static class InputMethodConfigActivity extends Settings { /* empty */ } + public static class InputMethodAndSubtypeEnablerActivity extends Settings { /* empty */ } + public static class LocalePickerActivity extends Settings { /* empty */ } + public static class UserDictionarySettingsActivity extends Settings { /* empty */ } + public static class SoundSettingsActivity extends Settings { /* empty */ } + public static class DisplaySettingsActivity extends Settings { /* empty */ } + public static class DeviceInfoSettingsActivity extends Settings { /* empty */ } + public static class ApplicationSettingsActivity extends Settings { /* empty */ } + public static class ManageApplicationsActivity extends Settings { /* empty */ } + public static class StorageUseActivity extends Settings { /* empty */ } + public static class DevelopmentSettingsActivity extends Settings { /* empty */ } + public static class AccessibilitySettingsActivity extends Settings { /* empty */ } + public static class SecuritySettingsActivity extends Settings { /* empty */ } + public static class PrivacySettingsActivity extends Settings { /* empty */ } + public static class DockSettingsActivity extends Settings { /* empty */ } + public static class RunningServicesActivity extends Settings { /* empty */ } + public static class ManageAccountsSettingsActivity extends Settings { /* empty */ } + public static class PowerUsageSummaryActivity extends Settings { /* empty */ } + public static class AccountSyncSettingsActivity extends Settings { /* empty */ } + public static class AccountSyncSettingsInAddAccountActivity extends Settings { /* empty */ } + public static class CryptKeeperSettingsActivity extends Settings { /* empty */ } + public static class DeviceAdminSettingsActivity extends Settings { /* empty */ } + public static class DataUsageSummaryActivity extends Settings { /* empty */ } } diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java index 2844f3b..d09fcc5 100644 --- a/src/com/android/settings/WirelessSettings.java +++ b/src/com/android/settings/WirelessSettings.java @@ -16,35 +16,27 @@ package com.android.settings; -import com.android.internal.telephony.TelephonyIntents; -import com.android.internal.telephony.TelephonyProperties; -import com.android.settings.bluetooth.BluetoothEnabler; -import com.android.settings.wifi.WifiEnabler; -import com.android.settings.nfc.NfcEnabler; - import android.app.Activity; import android.app.admin.DevicePolicyManager; -import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.nfc.NfcAdapter; import android.os.Bundle; -import android.os.ServiceManager; import android.os.SystemProperties; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceScreen; import android.provider.Settings; +import com.android.internal.telephony.TelephonyIntents; +import com.android.internal.telephony.TelephonyProperties; +import com.android.settings.nfc.NfcEnabler; + public class WirelessSettings extends SettingsPreferenceFragment { private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane"; - private static final String KEY_TOGGLE_BLUETOOTH = "toggle_bluetooth"; - private static final String KEY_TOGGLE_WIFI = "toggle_wifi"; private static final String KEY_TOGGLE_NFC = "toggle_nfc"; - private static final String KEY_WIFI_SETTINGS = "wifi_settings"; - private static final String KEY_BT_SETTINGS = "bt_settings"; private static final String KEY_VPN_SETTINGS = "vpn_settings"; private static final String KEY_TETHER_SETTINGS = "tether_settings"; private static final String KEY_PROXY_SETTINGS = "proxy_settings"; @@ -55,9 +47,7 @@ public class WirelessSettings extends SettingsPreferenceFragment { private AirplaneModeEnabler mAirplaneModeEnabler; private CheckBoxPreference mAirplaneModePreference; - private WifiEnabler mWifiEnabler; private NfcEnabler mNfcEnabler; - private BluetoothEnabler mBtEnabler; /** * Invoked on each preference click in this hierarchy, overrides @@ -95,15 +85,10 @@ public class WirelessSettings extends SettingsPreferenceFragment { addPreferencesFromResource(R.xml.wireless_settings); final Activity activity = getActivity(); - CheckBoxPreference airplane = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE); - CheckBoxPreference wifi = (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI); - CheckBoxPreference bt = (CheckBoxPreference) findPreference(KEY_TOGGLE_BLUETOOTH); + mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE); CheckBoxPreference nfc = (CheckBoxPreference) findPreference(KEY_TOGGLE_NFC); - mAirplaneModeEnabler = new AirplaneModeEnabler(activity, airplane); - mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE); - mWifiEnabler = new WifiEnabler(activity, wifi); - mBtEnabler = new BluetoothEnabler(activity, bt); + mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference); mNfcEnabler = new NfcEnabler(activity, nfc); String toggleable = Settings.System.getString(activity.getContentResolver(), @@ -111,21 +96,12 @@ public class WirelessSettings extends SettingsPreferenceFragment { // Manually set dependencies for Wifi when not toggleable. if (toggleable == null || !toggleable.contains(Settings.System.RADIO_WIFI)) { - wifi.setDependency(KEY_TOGGLE_AIRPLANE); - findPreference(KEY_WIFI_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE); findPreference(KEY_VPN_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE); } // Manually set dependencies for Bluetooth when not toggleable. if (toggleable == null || !toggleable.contains(Settings.System.RADIO_BLUETOOTH)) { - bt.setDependency(KEY_TOGGLE_AIRPLANE); - findPreference(KEY_BT_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE); - } - - // Remove Bluetooth Settings if Bluetooth service is not available. - if (ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE) == null) { - getPreferenceScreen().removePreference(bt); - getPreferenceScreen().removePreference(findPreference(KEY_BT_SETTINGS)); + // No bluetooth-dependent items in the list. Code kept in case one is added later. } // Remove NFC if its not available @@ -191,8 +167,6 @@ public class WirelessSettings extends SettingsPreferenceFragment { super.onResume(); mAirplaneModeEnabler.resume(); - mWifiEnabler.resume(); - mBtEnabler.resume(); mNfcEnabler.resume(); } @@ -201,8 +175,6 @@ public class WirelessSettings extends SettingsPreferenceFragment { super.onPause(); mAirplaneModeEnabler.pause(); - mWifiEnabler.pause(); - mBtEnabler.pause(); mNfcEnabler.pause(); } diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothSettings.java b/src/com/android/settings/bluetooth/AdvancedBluetoothSettings.java new file mode 100644 index 0000000..83371cd --- /dev/null +++ b/src/com/android/settings/bluetooth/AdvancedBluetoothSettings.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.bluetooth; + +import android.content.Intent; +import android.os.Bundle; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.PreferenceScreen; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; + +public class AdvancedBluetoothSettings extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener { + + private static final String KEY_BT_DISCOVERABLE = "bt_discoverable"; + private static final String KEY_BT_DISCOVERABLE_TIMEOUT = "bt_discoverable_timeout"; + private static final String KEY_BT_NAME = "bt_name"; + private static final String KEY_BT_SHOW_RECEIVED = "bt_show_received_files"; + + /* Private intent to show the list of received files */ + private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES = + "android.btopp.intent.action.OPEN_RECEIVED_FILES"; + + private BluetoothDiscoverableEnabler mDiscoverableEnabler; + private BluetoothNamePreference mNamePreference; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.bluetooth_advanced_settings); + + LocalBluetoothManager localManager = LocalBluetoothManager.getInstance(getActivity()); + if (localManager != null) { + LocalBluetoothAdapter localAdapter = localManager.getBluetoothAdapter(); + mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(), + localAdapter, + (CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE), + (ListPreference) findPreference(KEY_BT_DISCOVERABLE_TIMEOUT)); + } + + mNamePreference = (BluetoothNamePreference) findPreference(KEY_BT_NAME); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + } + + @Override + public void onResume() { + super.onResume(); + mDiscoverableEnabler.resume(); + mNamePreference.resume(); + } + + @Override + public void onPause() { + super.onPause(); + + mNamePreference.pause(); + mDiscoverableEnabler.pause(); + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + if (KEY_BT_SHOW_RECEIVED.equals(preference.getKey())) { + Intent intent = new Intent(BTOPP_ACTION_OPEN_RECEIVED_FILES); + getActivity().sendBroadcast(intent); + return true; + } + + return super.onPreferenceTreeClick(preferenceScreen, preference); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + return true; + } +} diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java index 79f23bb..50149d8 100644 --- a/src/com/android/settings/bluetooth/BluetoothEnabler.java +++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java @@ -16,28 +16,27 @@ package com.android.settings.bluetooth; -import com.android.settings.R; -import com.android.settings.WirelessSettings; - import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.preference.Preference; -import android.preference.CheckBoxPreference; import android.provider.Settings; +import android.widget.CompoundButton; +import android.widget.Switch; import android.widget.Toast; +import com.android.settings.R; +import com.android.settings.WirelessSettings; + /** * BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox * preference. It turns on/off Bluetooth and ensures the summary of the * preference reflects the current state. */ -public final class BluetoothEnabler implements Preference.OnPreferenceChangeListener { +public final class BluetoothEnabler implements CompoundButton.OnCheckedChangeListener { private final Context mContext; - private final CheckBoxPreference mCheckBox; - private final CharSequence mOriginalSummary; + private Switch mSwitch; private final LocalBluetoothAdapter mLocalAdapter; private final IntentFilter mIntentFilter; @@ -50,17 +49,15 @@ public final class BluetoothEnabler implements Preference.OnPreferenceChangeList } }; - public BluetoothEnabler(Context context, CheckBoxPreference checkBox) { + public BluetoothEnabler(Context context, Switch switch_) { mContext = context; - mCheckBox = checkBox; - mOriginalSummary = checkBox.getSummary(); - checkBox.setPersistent(false); + mSwitch = switch_; LocalBluetoothManager manager = LocalBluetoothManager.getInstance(context); if (manager == null) { // Bluetooth is not supported mLocalAdapter = null; - checkBox.setEnabled(false); + mSwitch.setEnabled(false); } else { mLocalAdapter = manager.getBluetoothAdapter(); } @@ -76,7 +73,7 @@ public final class BluetoothEnabler implements Preference.OnPreferenceChangeList handleStateChanged(mLocalAdapter.getBluetoothState()); mContext.registerReceiver(mReceiver, mIntentFilter); - mCheckBox.setOnPreferenceChangeListener(this); + mSwitch.setOnCheckedChangeListener(this); } public void pause() { @@ -85,51 +82,54 @@ public final class BluetoothEnabler implements Preference.OnPreferenceChangeList } mContext.unregisterReceiver(mReceiver); - mCheckBox.setOnPreferenceChangeListener(null); + mSwitch.setOnCheckedChangeListener(null); } - public boolean onPreferenceChange(Preference preference, Object value) { - boolean enable = (Boolean) value; + public void setSwitch(Switch switch_) { + if (mSwitch == switch_) return; + mSwitch.setOnCheckedChangeListener(null); + mSwitch = switch_; + mSwitch.setOnCheckedChangeListener(this); + + final int bluetoothState = mLocalAdapter.getBluetoothState(); + boolean isEnabled = bluetoothState == BluetoothAdapter.STATE_ON; + boolean isDisabled = bluetoothState == BluetoothAdapter.STATE_OFF; + mSwitch.setChecked(isEnabled); + mSwitch.setEnabled(isEnabled || isDisabled); + } + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // Show toast message if Bluetooth is not allowed in airplane mode - if (enable && !WirelessSettings - .isRadioAllowed(mContext, Settings.System.RADIO_BLUETOOTH)) { - Toast.makeText(mContext, R.string.wifi_in_airplane_mode, - Toast.LENGTH_SHORT).show(); - return false; + if (isChecked && + !WirelessSettings.isRadioAllowed(mContext, Settings.System.RADIO_BLUETOOTH)) { + Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); + // Reset switch to off + buttonView.setChecked(false); } - mLocalAdapter.setBluetoothEnabled(enable); - mCheckBox.setEnabled(false); - - // Don't update UI to opposite state until we're sure - return false; + mLocalAdapter.setBluetoothEnabled(isChecked); + mSwitch.setEnabled(false); } void handleStateChanged(int state) { switch (state) { case BluetoothAdapter.STATE_TURNING_ON: - mCheckBox.setSummary(R.string.wifi_starting); - mCheckBox.setEnabled(false); + mSwitch.setEnabled(false); break; case BluetoothAdapter.STATE_ON: - mCheckBox.setChecked(true); - mCheckBox.setSummary(null); - mCheckBox.setEnabled(true); + mSwitch.setChecked(true); + mSwitch.setEnabled(true); break; case BluetoothAdapter.STATE_TURNING_OFF: - mCheckBox.setSummary(R.string.wifi_stopping); - mCheckBox.setEnabled(false); + mSwitch.setEnabled(false); break; case BluetoothAdapter.STATE_OFF: - mCheckBox.setChecked(false); - mCheckBox.setSummary(mOriginalSummary); - mCheckBox.setEnabled(true); + mSwitch.setChecked(false); + mSwitch.setEnabled(true); break; default: - mCheckBox.setChecked(false); - mCheckBox.setSummary(R.string.wifi_error); - mCheckBox.setEnabled(true); + mSwitch.setChecked(false); + mSwitch.setEnabled(true); } } } diff --git a/src/com/android/settings/bluetooth/BluetoothSettings.java b/src/com/android/settings/bluetooth/BluetoothSettings.java index 5e4e130..9c90b20 100644 --- a/src/com/android/settings/bluetooth/BluetoothSettings.java +++ b/src/com/android/settings/bluetooth/BluetoothSettings.java @@ -16,15 +16,20 @@ package com.android.settings.bluetooth; +import android.app.ActionBar; +import android.app.Activity; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; -import android.content.Intent; -import android.preference.CheckBoxPreference; -import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.util.Log; +import android.view.Gravity; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; +import android.widget.Switch; import com.android.settings.R; @@ -35,77 +40,120 @@ import com.android.settings.R; public final class BluetoothSettings extends DeviceListPreferenceFragment { private static final String TAG = "BluetoothSettings"; - private static final String KEY_BT_CHECKBOX = "bt_checkbox"; - private static final String KEY_BT_DISCOVERABLE = "bt_discoverable"; - private static final String KEY_BT_DISCOVERABLE_TIMEOUT = "bt_discoverable_timeout"; - private static final String KEY_BT_NAME = "bt_name"; - private static final String KEY_BT_SHOW_RECEIVED = "bt_show_received_files"; + private static final int MENU_ID_MAKE_DISCOVERABLE = Menu.FIRST; + private static final int MENU_ID_SCAN = Menu.FIRST + 1; + private static final int MENU_ID_ADVANCED = Menu.FIRST + 2; - private BluetoothEnabler mEnabler; - private BluetoothDiscoverableEnabler mDiscoverableEnabler; - private BluetoothNamePreference mNamePreference; - - /* Private intent to show the list of received files */ - private static final String BTOPP_ACTION_OPEN_RECEIVED_FILES = - "android.btopp.intent.action.OPEN_RECEIVED_FILES"; + private BluetoothEnabler mBluetoothEnabler; /** Initialize the filter to show bonded devices only. */ - public BluetoothSettings() { - super(BluetoothDeviceFilter.BONDED_DEVICE_FILTER); - } + //public BluetoothSettings() { + // super(BluetoothDeviceFilter.BONDED_DEVICE_FILTER); + //} @Override void addPreferencesForActivity() { addPreferencesFromResource(R.xml.bluetooth_settings); - mEnabler = new BluetoothEnabler(getActivity(), - (CheckBoxPreference) findPreference(KEY_BT_CHECKBOX)); + Activity activity = getActivity(); + + Switch actionBarSwitch = new Switch(activity); + + if (activity instanceof PreferenceActivity) { + PreferenceActivity preferenceActivity = (PreferenceActivity) activity; + if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { + final int padding = activity.getResources().getDimensionPixelSize( + R.dimen.action_bar_switch_padding); + actionBarSwitch.setPadding(0, 0, padding, 0); + activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, + ActionBar.DISPLAY_SHOW_CUSTOM); + activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams( + ActionBar.LayoutParams.WRAP_CONTENT, + ActionBar.LayoutParams.WRAP_CONTENT, + Gravity.CENTER_VERTICAL | Gravity.RIGHT)); + } + } + + mBluetoothEnabler = new BluetoothEnabler(activity, actionBarSwitch); - mDiscoverableEnabler = new BluetoothDiscoverableEnabler(getActivity(), - mLocalAdapter, - (CheckBoxPreference) findPreference(KEY_BT_DISCOVERABLE), - (ListPreference) findPreference(KEY_BT_DISCOVERABLE_TIMEOUT)); + if (mLocalAdapter != null && mLocalAdapter.isEnabled()) { + activity.getActionBar().setSubtitle(mLocalAdapter.getName()); + } + + // TODO activity.setTheme(android.R.style.Theme_Holo_SplitActionBarWhenNarrow); - mNamePreference = (BluetoothNamePreference) findPreference(KEY_BT_NAME); + setHasOptionsMenu(true); } @Override public void onResume() { super.onResume(); - // Repopulate (which isn't too bad since it's cached in the settings - // bluetooth manager) - addDevices(); + mBluetoothEnabler.resume(); - mEnabler.resume(); - mDiscoverableEnabler.resume(); - mNamePreference.resume(); + updateContent(mLocalAdapter.getBluetoothState()); } @Override public void onPause() { super.onPause(); - mNamePreference.pause(); - mDiscoverableEnabler.pause(); - mEnabler.pause(); + mBluetoothEnabler.pause(); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + boolean bluetoothIsEnabled = mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON; + menu.add(Menu.NONE, MENU_ID_MAKE_DISCOVERABLE, 0, R.string.bluetooth_visibility) + .setEnabled(bluetoothIsEnabled); + menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.bluetooth_preference_find_nearby_title) + .setIcon(R.drawable.ic_menu_scan_network).setEnabled(bluetoothIsEnabled); + menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.bluetooth_menu_advanced) + .setIcon(android.R.drawable.ic_menu_manage); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case MENU_ID_MAKE_DISCOVERABLE: + // TODO +// if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON) { +// onAddNetworkPressed(); +// } + return true; + case MENU_ID_SCAN: + if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_ON) { + mLocalAdapter.startScanning(true); + } + return true; + case MENU_ID_ADVANCED: + if (getActivity() instanceof PreferenceActivity) { + ((PreferenceActivity) getActivity()).startPreferencePanel( + AdvancedBluetoothSettings.class.getCanonicalName(), + null, + R.string.bluetooth_advanced_titlebar, null, + this, 0); + } else { + startFragment(this, AdvancedBluetoothSettings.class.getCanonicalName(), -1, null); + } + return true; + } + return super.onOptionsItemSelected(item); } private final View.OnClickListener mListener = new View.OnClickListener() { public void onClick(View v) { // User clicked on advanced options icon for a device in the list if (v.getTag() instanceof CachedBluetoothDevice) { - CachedBluetoothDevice - device = (CachedBluetoothDevice) v.getTag(); + CachedBluetoothDevice device = (CachedBluetoothDevice) v.getTag(); Preference pref = new Preference(getActivity()); pref.setTitle(device.getName()); pref.setFragment(DeviceProfilesSettings.class.getName()); pref.getExtras().putParcelable(DeviceProfilesSettings.EXTRA_DEVICE, device.getDevice()); - ((PreferenceActivity) getActivity()) - .onPreferenceStartFragment(BluetoothSettings.this, - pref); + ((PreferenceActivity) getActivity()).onPreferenceStartFragment( + BluetoothSettings.this, pref); } else { Log.w(TAG, "onClick() called for other View: " + v); } @@ -113,19 +161,54 @@ public final class BluetoothSettings extends DeviceListPreferenceFragment { }; @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, - Preference preference) { - if (KEY_BT_SHOW_RECEIVED.equals(preference.getKey())) { - Intent intent = new Intent(BTOPP_ACTION_OPEN_RECEIVED_FILES); - getActivity().sendBroadcast(intent); - return true; + void onDevicePreferenceClick(BluetoothDevicePreference btPreference) { + mLocalAdapter.stopScanning(); + super.onDevicePreferenceClick(btPreference); + } + + @Override + public void onBluetoothStateChanged(int bluetoothState) { + super.onBluetoothStateChanged(bluetoothState); + updateContent(bluetoothState); + } + + private void updateContent(int bluetoothState) { + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + getActivity().invalidateOptionsMenu(); + int messageId = 0; + + switch (bluetoothState) { + case BluetoothAdapter.STATE_ON: + preferenceScreen.removeAll(); + // Repopulate (which isn't too bad since it's cached in the settings bluetooth manager) + addDevices(); + mLocalAdapter.startScanning(false); + return; + + case BluetoothAdapter.STATE_TURNING_OFF: + int preferenceCount = preferenceScreen.getPreferenceCount(); + for (int i = 0; i < preferenceCount; i++) { + preferenceScreen.getPreference(i).setEnabled(false); + } + return; + + case BluetoothAdapter.STATE_OFF: + messageId = R.string.bluetooth_empty_list_bluetooth_off; + break; + + case BluetoothAdapter.STATE_TURNING_ON: + messageId = R.string.bluetooth_turning_on; + break; } - return super.onPreferenceTreeClick(preferenceScreen, preference); + removeAllDevices(); + // TODO: from xml, add top padding. Same as in wifi + Preference emptyListPreference = new Preference(getActivity()); + emptyListPreference.setTitle(messageId); + preferenceScreen.addPreference(emptyListPreference); } - public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, - int bondState) { + public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) { if (bondState == BluetoothDevice.BOND_BONDED) { // add to "Paired devices" list after remote-initiated pairing if (mDevicePreferenceMap.get(cachedDevice) == null) { diff --git a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java index a978e23..409edb9 100644 --- a/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java +++ b/src/com/android/settings/bluetooth/DeviceListPreferenceFragment.java @@ -21,6 +21,7 @@ import android.bluetooth.BluetoothDevice; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceCategory; +import android.preference.PreferenceGroup; import android.preference.PreferenceScreen; import android.util.Log; @@ -36,7 +37,6 @@ import java.util.WeakHashMap; * * @see BluetoothSettings * @see DevicePickerFragment - * @see BluetoothFindNearby */ public abstract class DeviceListPreferenceFragment extends SettingsPreferenceFragment implements BluetoothCallback { @@ -53,7 +53,7 @@ public abstract class DeviceListPreferenceFragment extends LocalBluetoothAdapter mLocalAdapter; LocalBluetoothManager mLocalManager; - private PreferenceCategory mDeviceList; + private PreferenceGroup mDeviceListGroup; final WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference> mDevicePreferenceMap = new WeakHashMap<CachedBluetoothDevice, BluetoothDevicePreference>(); @@ -83,8 +83,13 @@ public abstract class DeviceListPreferenceFragment extends addPreferencesForActivity(); - mDeviceList = (PreferenceCategory) findPreference(KEY_BT_DEVICE_LIST); - if (mDeviceList == null) { + mDeviceListGroup = (PreferenceCategory) findPreference(KEY_BT_DEVICE_LIST); + if (mDeviceListGroup == null) { + // If null, device preferences are added directly to the root of the preference screen + mDeviceListGroup = getPreferenceScreen(); + mDeviceListGroup.setOrderingAsAdded(false); + } + if (mDeviceListGroup == null) { Log.e(TAG, "Could not find device list preference object!"); } } @@ -105,13 +110,15 @@ public abstract class DeviceListPreferenceFragment extends @Override public void onPause() { super.onPause(); - - mLocalAdapter.stopScanning(); + removeAllDevices(); mLocalManager.setForegroundActivity(null); mLocalManager.getEventManager().unregisterCallback(this); + } + void removeAllDevices() { + mLocalAdapter.stopScanning(); mDevicePreferenceMap.clear(); - mDeviceList.removeAll(); + mDeviceListGroup.removeAll(); } void addDevices() { @@ -132,7 +139,7 @@ public abstract class DeviceListPreferenceFragment extends } if (preference instanceof BluetoothDevicePreference) { - BluetoothDevicePreference btPreference = (BluetoothDevicePreference)preference; + BluetoothDevicePreference btPreference = (BluetoothDevicePreference) preference; CachedBluetoothDevice device = btPreference.getCachedDevice(); mSelectedDevice = device.getDevice(); onDevicePreferenceClick(btPreference); @@ -152,6 +159,9 @@ public abstract class DeviceListPreferenceFragment extends return; } + // No update while list shows state message + if (mLocalAdapter.getBluetoothState() != BluetoothAdapter.STATE_ON) return; + if (mFilter.matches(cachedDevice.getDevice())) { createDevicePreference(cachedDevice); } @@ -162,7 +172,7 @@ public abstract class DeviceListPreferenceFragment extends getActivity(), cachedDevice); initDevicePreference(preference); - mDeviceList.addPreference(preference); + mDeviceListGroup.addPreference(preference); mDevicePreferenceMap.put(cachedDevice, preference); } @@ -170,13 +180,14 @@ public abstract class DeviceListPreferenceFragment extends * Overridden in {@link BluetoothSettings} to add a listener. * @param preference the newly added preference */ - void initDevicePreference(BluetoothDevicePreference preference) { } + void initDevicePreference(BluetoothDevicePreference preference) { + // Does nothing by default + } public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) { - BluetoothDevicePreference preference = mDevicePreferenceMap.remove( - cachedDevice); + BluetoothDevicePreference preference = mDevicePreferenceMap.remove(cachedDevice); if (preference != null) { - mDeviceList.removePreference(preference); + mDeviceListGroup.removePreference(preference); } } @@ -185,9 +196,10 @@ public abstract class DeviceListPreferenceFragment extends } private void updateProgressUi(boolean start) { - if (mDeviceList instanceof ProgressCategory) { - ((ProgressCategory) mDeviceList).setProgress(start); + if (mDeviceListGroup instanceof ProgressCategory) { + ((ProgressCategory) mDeviceListGroup).setProgress(start); } + // else TODO Add a spinner at the end of the list to show in progress state } public void onBluetoothStateChanged(int bluetoothState) { diff --git a/src/com/android/settings/bluetooth/DevicePickerFragment.java b/src/com/android/settings/bluetooth/DevicePickerFragment.java index 126df02..3aeb7e2 100644 --- a/src/com/android/settings/bluetooth/DevicePickerFragment.java +++ b/src/com/android/settings/bluetooth/DevicePickerFragment.java @@ -89,7 +89,7 @@ public final class DevicePickerFragment extends DeviceListPreferenceFragment { super.onBluetoothStateChanged(bluetoothState); if (bluetoothState == BluetoothAdapter.STATE_ON) { - mLocalAdapter.startScanning(false); + mLocalAdapter.startScanning(false); } } diff --git a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java index 9db4baf..ecb7112 100644 --- a/src/com/android/settings/bluetooth/DeviceProfilesSettings.java +++ b/src/com/android/settings/bluetooth/DeviceProfilesSettings.java @@ -50,7 +50,7 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment private static final String KEY_RENAME_DEVICE = "rename_device"; private static final String KEY_PROFILE_CONTAINER = "profile_container"; private static final String KEY_UNPAIR = "unpair"; - private static final String KEY_ALLOW_INCOMING = "allow_incoming"; + //private static final String KEY_ALLOW_INCOMING = "allow_incoming"; public static final String EXTRA_DEVICE = "device"; @@ -355,6 +355,7 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment mCachedDevice.unpair(); } + /* private void setIncomingFileTransfersAllowed(boolean allow) { // TODO: make an IPC call into BluetoothOpp to update Log.d(TAG, "Set allow incoming = " + allow); @@ -364,6 +365,7 @@ public final class DeviceProfilesSettings extends SettingsPreferenceFragment // TODO: get this value from BluetoothOpp ??? return true; } + */ private boolean getAutoConnect(LocalBluetoothProfile prof) { return prof.isPreferred(mCachedDevice.getDevice()); diff --git a/src/com/android/settings/wifi/AdvancedSettings.java b/src/com/android/settings/wifi/AdvancedSettings.java index faea9f2..4855c99 100644 --- a/src/com/android/settings/wifi/AdvancedSettings.java +++ b/src/com/android/settings/wifi/AdvancedSettings.java @@ -16,21 +16,23 @@ package com.android.settings.wifi; -import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.Utils; - -import android.app.Activity; import android.content.Context; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; -import android.os.SystemProperties; +import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.Preference; +import android.preference.PreferenceScreen; +import android.provider.Settings; +import android.provider.Settings.Secure; import android.text.TextUtils; -import android.widget.Toast; import android.util.Log; +import android.widget.Toast; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.Utils; public class AdvancedSettings extends SettingsPreferenceFragment implements Preference.OnPreferenceChangeListener { @@ -39,6 +41,8 @@ public class AdvancedSettings extends SettingsPreferenceFragment private static final String KEY_MAC_ADDRESS = "mac_address"; private static final String KEY_CURRENT_IP_ADDRESS = "current_ip_address"; private static final String KEY_FREQUENCY_BAND = "frequency_band"; + private static final String KEY_NOTIFY_OPEN_NETWORKS = "notify_open_networks"; + private static final String KEY_SLEEP_POLICY = "sleep_policy"; private WifiManager mWifiManager; @@ -62,27 +66,61 @@ public class AdvancedSettings extends SettingsPreferenceFragment } private void initPreferences() { + CheckBoxPreference notifyOpenNetworks = + (CheckBoxPreference) findPreference(KEY_NOTIFY_OPEN_NETWORKS); + notifyOpenNetworks.setChecked(Secure.getInt(getContentResolver(), + Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1); + notifyOpenNetworks.setEnabled(mWifiManager.isWifiEnabled()); - ListPreference pref = (ListPreference) findPreference(KEY_FREQUENCY_BAND); + ListPreference frequencyPref = (ListPreference) findPreference(KEY_FREQUENCY_BAND); if (mWifiManager.isDualBandSupported()) { - pref.setOnPreferenceChangeListener(this); + frequencyPref.setOnPreferenceChangeListener(this); int value = mWifiManager.getFrequencyBand(); if (value != -1) { - pref.setValue(String.valueOf(value)); + frequencyPref.setValue(String.valueOf(value)); } else { Log.e(TAG, "Failed to fetch frequency band"); } } else { - getPreferenceScreen().removePreference(pref); + if (frequencyPref != null) { + // null if it has already been removed before resume + getPreferenceScreen().removePreference(frequencyPref); + } + } + + ListPreference sleepPolicyPref = (ListPreference) findPreference(KEY_SLEEP_POLICY); + if (sleepPolicyPref != null) { + if (Utils.isWifiOnly()) { + sleepPolicyPref.setEntries(R.array.wifi_sleep_policy_entries_wifi_only); + sleepPolicyPref.setSummary(R.string.wifi_setting_sleep_policy_summary_wifi_only); + } + sleepPolicyPref.setOnPreferenceChangeListener(this); + int value = Settings.System.getInt(getContentResolver(), + Settings.System.WIFI_SLEEP_POLICY, + Settings.System.WIFI_SLEEP_POLICY_NEVER); + sleepPolicyPref.setValue(String.valueOf(value)); } } + @Override + public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { + String key = preference.getKey(); + + if (KEY_NOTIFY_OPEN_NETWORKS.equals(key)) { + Secure.putInt(getContentResolver(), + Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, + ((CheckBoxPreference) preference).isChecked() ? 1 : 0); + } else { + return super.onPreferenceTreeClick(screen, preference); + } + return true; + } + public boolean onPreferenceChange(Preference preference, Object newValue) { String key = preference.getKey(); - if (key == null) return true; - if (key.equals(KEY_FREQUENCY_BAND)) { + if (KEY_FREQUENCY_BAND.equals(key)) { try { mWifiManager.setFrequencyBand(Integer.parseInt(((String) newValue)), true); } catch (NumberFormatException e) { @@ -92,6 +130,17 @@ public class AdvancedSettings extends SettingsPreferenceFragment } } + if (KEY_SLEEP_POLICY.equals(key)) { + try { + Settings.System.putInt(getContentResolver(), + Settings.System.WIFI_SLEEP_POLICY, Integer.parseInt(((String) newValue))); + } catch (NumberFormatException e) { + Toast.makeText(getActivity(), R.string.wifi_setting_sleep_policy_error, + Toast.LENGTH_SHORT).show(); + return false; + } + } + return true; } diff --git a/src/com/android/settings/wifi/AdvancedWifiSettings.java b/src/com/android/settings/wifi/AdvancedWifiSettings.java new file mode 100644 index 0000000..1da8b68 --- /dev/null +++ b/src/com/android/settings/wifi/AdvancedWifiSettings.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import android.content.Context; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.Bundle; +import android.preference.ListPreference; +import android.preference.Preference; +import android.text.TextUtils; +import android.util.Log; +import android.widget.Toast; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.Utils; + +public class AdvancedWifiSettings extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener { + + private static final String TAG = "AdvancedWifiSettings"; + private static final String KEY_MAC_ADDRESS = "mac_address"; + private static final String KEY_CURRENT_IP_ADDRESS = "current_ip_address"; + private static final String KEY_FREQUENCY_BAND = "frequency_band"; + + private WifiManager mWifiManager; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.wifi_advanced_settings); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); + } + + @Override + public void onResume() { + super.onResume(); + initPreferences(); + refreshWifiInfo(); + } + + private void initPreferences() { + + ListPreference pref = (ListPreference) findPreference(KEY_FREQUENCY_BAND); + + if (mWifiManager.isDualBandSupported()) { + pref.setOnPreferenceChangeListener(this); + int value = mWifiManager.getFrequencyBand(); + if (value != -1) { + pref.setValue(String.valueOf(value)); + } else { + Log.e(TAG, "Failed to fetch frequency band"); + } + } else { + getPreferenceScreen().removePreference(pref); + } + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + String key = preference.getKey(); + if (key == null) return true; + + if (key.equals(KEY_FREQUENCY_BAND)) { + try { + mWifiManager.setFrequencyBand(Integer.parseInt(((String) newValue)), true); + } catch (NumberFormatException e) { + Toast.makeText(getActivity(), R.string.wifi_setting_frequency_band_error, + Toast.LENGTH_SHORT).show(); + return false; + } + } + + return true; + } + + private void refreshWifiInfo() { + WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); + + Preference wifiMacAddressPref = findPreference(KEY_MAC_ADDRESS); + String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress(); + wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress + : getActivity().getString(R.string.status_unavailable)); + + Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS); + String ipAddress = Utils.getWifiIpAddresses(getActivity()); + wifiIpAddressPref.setSummary(ipAddress == null ? + getActivity().getString(R.string.status_unavailable) : ipAddress); + } + +} diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java index 91f4110..a8ce94f 100644 --- a/src/com/android/settings/wifi/WifiConfigController.java +++ b/src/com/android/settings/wifi/WifiConfigController.java @@ -16,33 +16,29 @@ package com.android.settings.wifi; +import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; + import android.content.Context; -import android.content.DialogInterface; import android.content.res.Resources; -import android.net.DhcpInfo; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkInfo.DetailedState; import android.net.NetworkUtils; -import android.net.Proxy; import android.net.ProxyProperties; import android.net.RouteInfo; import android.net.wifi.WifiConfiguration; -import android.net.wifi.WifiConfiguration.IpAssignment; import android.net.wifi.WifiConfiguration.AuthAlgorithm; +import android.net.wifi.WifiConfiguration.IpAssignment; import android.net.wifi.WifiConfiguration.KeyMgmt; -import android.net.wifi.WpsConfiguration; -import android.net.wifi.WpsConfiguration.Setup; - -import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; import android.net.wifi.WifiConfiguration.ProxySettings; import android.net.wifi.WifiInfo; +import android.net.wifi.WpsConfiguration; +import android.net.wifi.WpsConfiguration.Setup; import android.security.Credentials; import android.security.KeyStore; import android.text.Editable; import android.text.InputType; import android.text.TextWatcher; -import android.text.format.Formatter; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -57,12 +53,10 @@ import com.android.settings.ProxySelector; import com.android.settings.R; import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.UnknownHostException; import java.util.Iterator; /** - * The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigPreference} to + * The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigUiBase} to * share the logic for controlling buttons, text fields, etc. */ public class WifiConfigController implements TextWatcher, @@ -429,7 +423,9 @@ public class WifiConfigController implements TextWatcher, int networkPrefixLength = -1; try { networkPrefixLength = Integer.parseInt(mNetworkPrefixLengthView.getText().toString()); - } catch (NumberFormatException e) { } + } catch (NumberFormatException e) { + // Use -1 + } if (networkPrefixLength < 0 || networkPrefixLength > 32) { return R.string.wifi_ip_settings_invalid_network_prefix_length; } @@ -698,6 +694,7 @@ public class WifiConfigController implements TextWatcher, private void setSelection(Spinner spinner, String value) { if (value != null) { + @SuppressWarnings("unchecked") ArrayAdapter<String> adapter = (ArrayAdapter<String>) spinner.getAdapter(); for (int i = adapter.getCount() - 1; i >= 0; --i) { if (value.equals(adapter.getItem(i))) { @@ -719,10 +716,12 @@ public class WifiConfigController implements TextWatcher, @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // work done in afterTextChanged } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { + // work done in afterTextChanged } @Override @@ -750,5 +749,6 @@ public class WifiConfigController implements TextWatcher, @Override public void onNothingSelected(AdapterView<?> parent) { + // } } diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java index 7f1221e..223022d 100644 --- a/src/com/android/settings/wifi/WifiEnabler.java +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -16,9 +16,6 @@ package com.android.settings.wifi; -import com.android.settings.R; -import com.android.settings.WirelessSettings; - import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -27,19 +24,19 @@ import android.net.NetworkInfo; import android.net.wifi.SupplicantState; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; -import android.preference.Preference; -import android.preference.CheckBoxPreference; import android.provider.Settings; -import android.text.TextUtils; +import android.widget.CompoundButton; +import android.widget.Switch; import android.widget.Toast; +import com.android.settings.R; +import com.android.settings.WirelessSettings; + import java.util.concurrent.atomic.AtomicBoolean; -public class WifiEnabler implements Preference.OnPreferenceChangeListener { +public class WifiEnabler implements CompoundButton.OnCheckedChangeListener { private final Context mContext; - private final CheckBoxPreference mCheckBox; - private final CharSequence mOriginalSummary; - + private Switch mSwitch; private AtomicBoolean mConnected = new AtomicBoolean(false); private final WifiManager mWifiManager; @@ -65,11 +62,9 @@ public class WifiEnabler implements Preference.OnPreferenceChangeListener { } }; - public WifiEnabler(Context context, CheckBoxPreference checkBox) { + public WifiEnabler(Context context, Switch switch_) { mContext = context; - mCheckBox = checkBox; - mOriginalSummary = checkBox.getSummary(); - checkBox.setPersistent(false); + mSwitch = switch_; mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); @@ -81,78 +76,86 @@ public class WifiEnabler implements Preference.OnPreferenceChangeListener { public void resume() { // Wi-Fi state is sticky, so just let the receiver update UI mContext.registerReceiver(mReceiver, mIntentFilter); - mCheckBox.setOnPreferenceChangeListener(this); + mSwitch.setOnCheckedChangeListener(this); } public void pause() { mContext.unregisterReceiver(mReceiver); - mCheckBox.setOnPreferenceChangeListener(null); + mSwitch.setOnCheckedChangeListener(null); } - public boolean onPreferenceChange(Preference preference, Object value) { - boolean enable = (Boolean) value; + public void setSwitch(Switch switch_) { + if (mSwitch == switch_) return; + mSwitch.setOnCheckedChangeListener(null); + mSwitch = switch_; + mSwitch.setOnCheckedChangeListener(this); + + final int wifiState = mWifiManager.getWifiState(); + boolean isEnabled = wifiState == WifiManager.WIFI_STATE_ENABLED; + boolean isDisabled = wifiState == WifiManager.WIFI_STATE_DISABLED; + mSwitch.setChecked(isEnabled); + mSwitch.setEnabled(isEnabled || isDisabled); + } + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // Show toast message if Wi-Fi is not allowed in airplane mode - if (enable && !WirelessSettings - .isRadioAllowed(mContext, Settings.System.RADIO_WIFI)) { - Toast.makeText(mContext, R.string.wifi_in_airplane_mode, - Toast.LENGTH_SHORT).show(); - return false; + if (isChecked && !WirelessSettings.isRadioAllowed(mContext, Settings.System.RADIO_WIFI)) { + Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); + // Reset switch to off. No infinite check/listenenr loop. + buttonView.setChecked(false); } - /** - * Disable tethering if enabling Wifi - */ + // Disable tethering if enabling Wifi int wifiApState = mWifiManager.getWifiApState(); - if (enable && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || + if (isChecked && ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING) || (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED))) { mWifiManager.setWifiApEnabled(null, false); } - if (mWifiManager.setWifiEnabled(enable)) { - mCheckBox.setEnabled(false); + + if (mWifiManager.setWifiEnabled(isChecked)) { + // Intent has been taken into account, disable until new state is active + mSwitch.setEnabled(false); } else { - mCheckBox.setSummary(R.string.wifi_error); + // Error + Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show(); } - - // Don't update UI to opposite state until we're sure - return false; } private void handleWifiStateChanged(int state) { switch (state) { case WifiManager.WIFI_STATE_ENABLING: - mCheckBox.setSummary(R.string.wifi_starting); - mCheckBox.setEnabled(false); + mSwitch.setEnabled(false); break; case WifiManager.WIFI_STATE_ENABLED: - mCheckBox.setChecked(true); - mCheckBox.setSummary(null); - mCheckBox.setEnabled(true); + mSwitch.setChecked(true); + mSwitch.setEnabled(true); break; case WifiManager.WIFI_STATE_DISABLING: - mCheckBox.setSummary(R.string.wifi_stopping); - mCheckBox.setEnabled(false); + mSwitch.setEnabled(false); break; case WifiManager.WIFI_STATE_DISABLED: - mCheckBox.setChecked(false); - mCheckBox.setSummary(mOriginalSummary); - mCheckBox.setEnabled(true); + mSwitch.setChecked(false); + mSwitch.setEnabled(true); break; default: - mCheckBox.setChecked(false); - mCheckBox.setSummary(R.string.wifi_error); - mCheckBox.setEnabled(true); + mSwitch.setChecked(false); + mSwitch.setEnabled(true); } } - private void handleStateChanged(NetworkInfo.DetailedState state) { + private void handleStateChanged(@SuppressWarnings("unused") NetworkInfo.DetailedState state) { + // After the refactoring from a CheckBoxPreference to a Switch, this method is useless since + // there is nowhere to display a summary. + // This code is kept in case a future change re-introduces an associated text. + /* // WifiInfo is valid if and only if Wi-Fi is enabled. - // Here we use the state of the check box as an optimization. - if (state != null && mCheckBox.isChecked()) { + // Here we use the state of the switch as an optimization. + if (state != null && mSwitch.isChecked()) { WifiInfo info = mWifiManager.getConnectionInfo(); if (info != null) { - mCheckBox.setSummary(Summary.get(mContext, info.getSSID(), state)); + //setSummary(Summary.get(mContext, info.getSSID(), state)); } } + */ } } diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index a09c5c4..a829602 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -18,6 +18,7 @@ package com.android.settings.wifi; import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; +import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.content.BroadcastReceiver; @@ -31,40 +32,35 @@ import android.net.NetworkInfo.DetailedState; import android.net.wifi.ScanResult; import android.net.wifi.SupplicantState; import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiConfiguration.KeyMgmt; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WpsResult; -import android.net.wifi.WifiConfiguration.KeyMgmt; -import android.net.wifi.WpsConfiguration; import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.preference.CheckBoxPreference; import android.preference.Preference; -import android.preference.ListPreference; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; -import android.provider.Settings.Secure; -import android.provider.Settings; import android.security.Credentials; import android.security.KeyStore; import android.util.Log; import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.view.ContextMenu.ContextMenuInfo; -import android.widget.Toast; import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.Switch; +import android.widget.Toast; import com.android.internal.util.AsyncChannel; -import com.android.settings.ProgressCategoryBase; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.Utils; import java.util.ArrayList; import java.util.Collection; @@ -83,14 +79,14 @@ import java.util.concurrent.atomic.AtomicBoolean; * other decorations specific to that screen. */ public class WifiSettings extends SettingsPreferenceFragment - implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener { + implements DialogInterface.OnClickListener { private static final String TAG = "WifiSettings"; private static final int MENU_ID_SCAN = Menu.FIRST; - private static final int MENU_ID_ADVANCED = Menu.FIRST + 1; - private static final int MENU_ID_CONNECT = Menu.FIRST + 2; - private static final int MENU_ID_FORGET = Menu.FIRST + 3; - private static final int MENU_ID_MODIFY = Menu.FIRST + 4; - private static final String KEY_SLEEP_POLICY = "sleep_policy"; + private static final int MENU_ID_ADD_NETWORK = Menu.FIRST + 1; + private static final int MENU_ID_ADVANCED = Menu.FIRST + 2; + private static final int MENU_ID_CONNECT = Menu.FIRST + 3; + private static final int MENU_ID_FORGET = Menu.FIRST + 4; + private static final int MENU_ID_MODIFY = Menu.FIRST + 5; private final IntentFilter mFilter; private final BroadcastReceiver mReceiver; @@ -98,12 +94,8 @@ public class WifiSettings extends SettingsPreferenceFragment private WifiManager mWifiManager; private WifiEnabler mWifiEnabler; - private CheckBoxPreference mNotifyOpenNetworks; - private ProgressCategoryBase mAccessPoints; - private Preference mAddNetwork; // An access point being editted is stored here. private AccessPoint mSelectedAccessPoint; - private boolean mEdit; private DetailedState mLastState; private WifiInfo mLastInfo; @@ -180,60 +172,48 @@ public class WifiSettings extends SettingsPreferenceFragment // state, start it off in the right state mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false); - // Avoid re-adding on returning from an overlapping activity/fragment. - if (getPreferenceScreen() == null || getPreferenceScreen().getPreferenceCount() < 2) { - if (mEnableNextOnConnection) { - if (hasNextButton()) { - final ConnectivityManager connectivity = (ConnectivityManager) - getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); - if (connectivity != null) { - NetworkInfo info = connectivity.getNetworkInfo( - ConnectivityManager.TYPE_WIFI); - changeNextButtonState(info.isConnected()); - } + if (mEnableNextOnConnection) { + if (hasNextButton()) { + final ConnectivityManager connectivity = (ConnectivityManager) + getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivity != null) { + NetworkInfo info = connectivity.getNetworkInfo( + ConnectivityManager.TYPE_WIFI); + changeNextButtonState(info.isConnected()); } } + } - if (mInXlSetupWizard) { - addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl); - } else if (intent.getBooleanExtra("only_access_points", false)) { - addPreferencesFromResource(R.xml.wifi_access_points); - } else { - addPreferencesFromResource(R.xml.wifi_settings); - mWifiEnabler = new WifiEnabler(activity, - (CheckBoxPreference) findPreference("enable_wifi")); - mNotifyOpenNetworks = - (CheckBoxPreference) findPreference("notify_open_networks"); - mNotifyOpenNetworks.setChecked(Secure.getInt(getContentResolver(), - Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, 0) == 1); - } - // This may be either ProgressCategory or AccessPointCategoryForXL. - final ProgressCategoryBase preference = - (ProgressCategoryBase) findPreference("access_points"); - mAccessPoints = preference; - mAccessPoints.setOrderingAsAdded(false); - mAddNetwork = findPreference("add_network"); - - ListPreference pref = (ListPreference) findPreference(KEY_SLEEP_POLICY); - if (pref != null) { - if (Utils.isWifiOnly()) { - pref.setEntries(R.array.wifi_sleep_policy_entries_wifi_only); - pref.setSummary(R.string.wifi_setting_sleep_policy_summary_wifi_only); + if (mInXlSetupWizard) { + addPreferencesFromResource(R.xml.wifi_access_points_for_wifi_setup_xl); + } else { + addPreferencesFromResource(R.xml.wifi_settings); + + Switch actionBarSwitch = new Switch(activity); + + if (activity instanceof PreferenceActivity) { + PreferenceActivity preferenceActivity = (PreferenceActivity) activity; + if (preferenceActivity.onIsHidingHeaders() || !preferenceActivity.onIsMultiPane()) { + final int padding = activity.getResources().getDimensionPixelSize( + R.dimen.action_bar_switch_padding); + actionBarSwitch.setPadding(0, 0, padding, 0); + activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, + ActionBar.DISPLAY_SHOW_CUSTOM); + activity.getActionBar().setCustomView(actionBarSwitch, new ActionBar.LayoutParams( + ActionBar.LayoutParams.WRAP_CONTENT, + ActionBar.LayoutParams.WRAP_CONTENT, + Gravity.CENTER_VERTICAL | Gravity.RIGHT)); } - pref.setOnPreferenceChangeListener(this); - int value = Settings.System.getInt(getContentResolver(), - Settings.System.WIFI_SLEEP_POLICY, - Settings.System.WIFI_SLEEP_POLICY_NEVER); - pref.setValue(String.valueOf(value)); } - registerForContextMenu(getListView()); - setHasOptionsMenu(true); + mWifiEnabler = new WifiEnabler(activity, actionBarSwitch); } + registerForContextMenu(getListView()); + setHasOptionsMenu(true); + // After confirming PreferenceScreen is available, we call super. super.onActivityCreated(savedInstanceState); - } @Override @@ -249,6 +229,7 @@ public class WifiSettings extends SettingsPreferenceFragment mWifiManager.connectNetwork(mKeyStoreNetworkId); } mKeyStoreNetworkId = INVALID_NETWORK_ID; + updateAccessPoints(); } @@ -270,8 +251,11 @@ public class WifiSettings extends SettingsPreferenceFragment public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // We don't want menus in Setup Wizard XL. if (!mInXlSetupWizard) { + final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); menu.add(Menu.NONE, MENU_ID_SCAN, 0, R.string.wifi_menu_scan) - .setIcon(R.drawable.ic_menu_scan_network); + .setIcon(R.drawable.ic_menu_scan_network).setEnabled(wifiIsEnabled); + menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) + .setIcon(android.R.drawable.ic_menu_add).setEnabled(wifiIsEnabled); menu.add(Menu.NONE, MENU_ID_ADVANCED, 0, R.string.wifi_menu_advanced) .setIcon(android.R.drawable.ic_menu_manage); } @@ -286,6 +270,11 @@ public class WifiSettings extends SettingsPreferenceFragment mScanner.forceScan(); } return true; + case MENU_ID_ADD_NETWORK: + if (mWifiManager.isWifiEnabled()) { + onAddNetworkPressed(); + } + return true; case MENU_ID_ADVANCED: if (getActivity() instanceof PreferenceActivity) { ((PreferenceActivity) getActivity()).startPreferencePanel( @@ -363,43 +352,17 @@ public class WifiSettings extends SettingsPreferenceFragment if (preference instanceof AccessPoint) { mSelectedAccessPoint = (AccessPoint) preference; showConfigUi(mSelectedAccessPoint, false); - } else if (preference == mAddNetwork) { - onAddNetworkPressed(); - } else if (preference == mNotifyOpenNetworks) { - Secure.putInt(getContentResolver(), - Secure.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, - mNotifyOpenNetworks.isChecked() ? 1 : 0); } else { return super.onPreferenceTreeClick(screen, preference); } return true; } - public boolean onPreferenceChange(Preference preference, Object newValue) { - String key = preference.getKey(); - if (key == null) return true; - - if (key.equals(KEY_SLEEP_POLICY)) { - try { - Settings.System.putInt(getContentResolver(), - Settings.System.WIFI_SLEEP_POLICY, Integer.parseInt(((String) newValue))); - } catch (NumberFormatException e) { - Toast.makeText(getActivity(), R.string.wifi_setting_sleep_policy_error, - Toast.LENGTH_SHORT).show(); - return false; - } - } - - return true; - } - - /** * Shows an appropriate Wifi configuration component. * Called when a user clicks "Add network" preference or one of available networks is selected. */ private void showConfigUi(AccessPoint accessPoint, boolean edit) { - mEdit = edit; if (mInXlSetupWizard) { ((WifiSettingsForSetupWizardXL)getActivity()).showConfigUi(accessPoint, edit); } else { @@ -430,20 +393,40 @@ public class WifiSettings extends SettingsPreferenceFragment * the strength of network and the security for it. */ private void updateAccessPoints() { - mAccessPoints.removeAll(); + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + preferenceScreen.removeAll(); + final int wifiState = mWifiManager.getWifiState(); + + switch (wifiState) { + case WifiManager.WIFI_STATE_ENABLED: + // AccessPoints are automatically sorted with TreeSet. + final Collection<AccessPoint> accessPoints = constructAccessPoints(); + if (mInXlSetupWizard) { + ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated( + getPreferenceScreen(), accessPoints); + } else { + for (AccessPoint accessPoint : accessPoints) { + getPreferenceScreen().addPreference(accessPoint); + } + } + break; - // AccessPoints are automatically sorted with TreeSet. - final Collection<AccessPoint> accessPoints = constructAccessPoints(); - if (mInXlSetupWizard) { - ((WifiSettingsForSetupWizardXL)getActivity()).onAccessPointsUpdated( - mAccessPoints, accessPoints); - } else { - for (AccessPoint accessPoint : accessPoints) { - mAccessPoints.addPreference(accessPoint); - } + case WifiManager.WIFI_STATE_DISABLING: + addMessagePreference(R.string.wifi_stopping); + break; + + case WifiManager.WIFI_STATE_DISABLED: + addMessagePreference(R.string.wifi_empty_list_wifi_off); + break; } } + private void addMessagePreference(int messageId) { + Preference emptyListPreference = new Preference(getActivity()); + emptyListPreference.setTitle(messageId); + getPreferenceScreen().addPreference(emptyListPreference); + } + private Collection<AccessPoint> constructAccessPoints() { Collection<AccessPoint> accessPoints = new ArrayList<AccessPoint>(); @@ -542,9 +525,9 @@ public class WifiSettings extends SettingsPreferenceFragment mLastState = state; } - for (int i = mAccessPoints.getPreferenceCount() - 1; i >= 0; --i) { + for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) { // Maybe there's a WifiConfigPreference - Preference preference = mAccessPoints.getPreference(i); + Preference preference = getPreferenceScreen().getPreference(i); if (preference instanceof AccessPoint) { final AccessPoint accessPoint = (AccessPoint) preference; accessPoint.update(mLastInfo, mLastState); @@ -557,12 +540,25 @@ public class WifiSettings extends SettingsPreferenceFragment } private void updateWifiState(int state) { - if (state == WifiManager.WIFI_STATE_ENABLED) { - mScanner.resume(); - } else { - mScanner.pause(); - mAccessPoints.removeAll(); + getActivity().invalidateOptionsMenu(); + + switch (state) { + case WifiManager.WIFI_STATE_ENABLED: + mScanner.resume(); + return; // not break, to avoid pause + + case WifiManager.WIFI_STATE_ENABLING: + getPreferenceScreen().removeAll(); + addMessagePreference(R.string.wifi_starting); + break; + + case WifiManager.WIFI_STATE_DISABLED: + getPreferenceScreen().removeAll(); + addMessagePreference(R.string.wifi_empty_list_wifi_off); + break; } + + mScanner.pause(); } private class Scanner extends Handler { @@ -580,7 +576,6 @@ public class WifiSettings extends SettingsPreferenceFragment void pause() { mRetry = 0; - mAccessPoints.setProgress(false); removeMessages(0); } @@ -594,7 +589,6 @@ public class WifiSettings extends SettingsPreferenceFragment Toast.LENGTH_LONG).show(); return; } - mAccessPoints.setProgress(mRetry != 0); // Combo scans can take 5-6s to complete. Increase interval to 10s. sendEmptyMessageDelayed(0, 10000); } @@ -636,6 +630,7 @@ public class WifiSettings extends SettingsPreferenceFragment } break; } + break; //TODO: more connectivity feedback default: //Ignore @@ -740,7 +735,7 @@ public class WifiSettings extends SettingsPreferenceFragment mScanner.resume(); } - mAccessPoints.removeAll(); + getPreferenceScreen().removeAll(); } /** @@ -753,8 +748,9 @@ public class WifiSettings extends SettingsPreferenceFragment } /* package */ int getAccessPointsCount() { - if (mAccessPoints != null) { - return mAccessPoints.getPreferenceCount(); + final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); + if (wifiIsEnabled) { + return getPreferenceScreen().getPreferenceCount(); } else { return 0; } diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java index 93d55d5..a3f1764 100644 --- a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java +++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java @@ -16,8 +16,6 @@ package com.android.settings.wifi; -import com.android.settings.R; - import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -28,11 +26,9 @@ import android.net.wifi.WifiManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.preference.PreferenceCategory; +import android.preference.PreferenceScreen; import android.text.TextUtils; import android.util.Log; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; @@ -43,6 +39,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.android.internal.util.AsyncChannel; +import com.android.settings.R; import java.util.Collection; import java.util.EnumMap; @@ -666,9 +663,10 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis /** * Called when the list of AccessPoints are modified and this Activity needs to refresh * the list. + * @param preferenceScreen */ /* package */ void onAccessPointsUpdated( - PreferenceCategory holder, Collection<AccessPoint> accessPoints) { + PreferenceScreen preferenceScreen, Collection<AccessPoint> accessPoints) { // If we already show some of access points but the bar still shows "scanning" state, it // should be stopped. if (mProgressBar.isIndeterminate() && accessPoints.size() > 0) { @@ -683,7 +681,7 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis for (AccessPoint accessPoint : accessPoints) { accessPoint.setLayoutResource(R.layout.custom_preference); - holder.addPreference(accessPoint); + preferenceScreen.addPreference(accessPoint); } } @@ -788,11 +786,6 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis mWifiManager.connectNetwork(config); } - @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, view, menuInfo); - } - /** * Replace the current background with a new background whose id is resId if needed. */ |