diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java index 7efa15d30e9..636799d9e81 100644 --- a/src/com/android/settings/WirelessSettings.java +++ b/src/com/android/settings/WirelessSettings.java @@ -94,8 +94,7 @@ public class WirelessSettings extends SettingsPreferenceFragment { final Activity activity = getActivity(); mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE); CheckBoxPreference nfc = (CheckBoxPreference) findPreference(KEY_TOGGLE_NFC); - PreferenceScreen zeroclick = (PreferenceScreen) - findPreference(KEY_ZEROCLICK_SETTINGS); + PreferenceScreen zeroclick = (PreferenceScreen) findPreference(KEY_ZEROCLICK_SETTINGS); mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference); mNfcEnabler = new NfcEnabler(activity, nfc, zeroclick); @@ -113,11 +112,18 @@ public class WirelessSettings extends SettingsPreferenceFragment { // No bluetooth-dependent items in the list. Code kept in case one is added later. } + // Manually set dependencies for NFC when not toggleable. + if (toggleable == null || !toggleable.contains(Settings.System.RADIO_NFC)) { + findPreference(KEY_TOGGLE_NFC).setDependency(KEY_TOGGLE_AIRPLANE); + findPreference(KEY_ZEROCLICK_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE); + } + // Remove NFC if its not available mNfcAdapter = NfcAdapter.getDefaultAdapter(activity); if (mNfcAdapter == null) { getPreferenceScreen().removePreference(nfc); getPreferenceScreen().removePreference(zeroclick); + mNfcEnabler = null; } // Remove Mobile Network Settings if it's a wifi-only device. @@ -176,18 +182,8 @@ public class WirelessSettings extends SettingsPreferenceFragment { super.onResume(); mAirplaneModeEnabler.resume(); - mNfcEnabler.resume(); - - if (mNfcAdapter != null) { - // Update zero-click subtitle - Preference zeroClick = getPreferenceScreen(). - findPreference(KEY_ZEROCLICK_SETTINGS); - - if (mNfcAdapter.zeroClickEnabled()) { - zeroClick.setSummary(R.string.zeroclick_on_summary); - } else { - zeroClick.setSummary(R.string.zeroclick_off_summary); - } + if (mNfcEnabler != null) { + mNfcEnabler.resume(); } } @@ -196,7 +192,9 @@ public class WirelessSettings extends SettingsPreferenceFragment { super.onPause(); mAirplaneModeEnabler.pause(); - mNfcEnabler.pause(); + if (mNfcEnabler != null) { + mNfcEnabler.pause(); + } } @Override diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java index 99cf8f0c621..722787d6d8b 100644 --- a/src/com/android/settings/nfc/NfcEnabler.java +++ b/src/com/android/settings/nfc/NfcEnabler.java @@ -27,6 +27,8 @@ import android.preference.Preference; import android.preference.PreferenceScreen; import android.util.Log; +import com.android.settings.R; + /** * NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It is * turns on/off Nfc and ensures the summary of the preference reflects the @@ -46,16 +48,13 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - if (NfcAdapter.ACTION_ADAPTER_STATE_CHANGE.equals(action)) { - handleNfcStateChanged(intent.getBooleanExtra( - NfcAdapter.EXTRA_NEW_BOOLEAN_STATE, - false)); + if (NfcAdapter.ACTION_ADAPTER_STATE_CHANGED.equals(action)) { + handleNfcStateChanged(intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, + NfcAdapter.STATE_OFF)); } } }; - private boolean mNfcState; - public NfcEnabler(Context context, CheckBoxPreference checkBoxPreference, PreferenceScreen zeroclick) { mContext = context; @@ -66,20 +65,20 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener { if (mNfcAdapter == null) { // NFC is not supported mCheckbox.setEnabled(false); + mZeroClick.setEnabled(false); + mIntentFilter = null; + return; } - - mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGE); - + mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); } public void resume() { if (mNfcAdapter == null) { return; } + handleNfcStateChanged(mNfcAdapter.getAdapterState()); mContext.registerReceiver(mReceiver, mIntentFilter); mCheckbox.setOnPreferenceChangeListener(this); - mNfcState = mNfcAdapter.isEnabled(); - mCheckbox.setChecked(mNfcState); } public void pause() { @@ -96,41 +95,43 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener { final boolean desiredState = (Boolean) value; mCheckbox.setEnabled(false); - // Start async update of the NFC adapter state, as the API is - // unfortunately blocking... - new Thread("toggleNFC") { - @Override - public void run() { - Log.d(TAG, "Setting NFC enabled state to: " + desiredState); - boolean success = false; - if (desiredState) { - success = mNfcAdapter.enable(); - } else { - success = mNfcAdapter.disable(); - } - if (success) { - Log.d(TAG, "Successfully changed NFC enabled state to " + desiredState); - mHandler.post(new Runnable() { - public void run() { - handleNfcStateChanged(desiredState); - } - }); - } else { - Log.w(TAG, "Error setting NFC enabled state to " + desiredState); - mHandler.post(new Runnable() { - public void run() { - mCheckbox.setEnabled(true); - } - }); - } - } - }.start(); + if (desiredState) { + mNfcAdapter.enable(); + } else { + mNfcAdapter.disable(); + } + return false; } - private void handleNfcStateChanged(boolean newState) { - mCheckbox.setChecked(newState); - mCheckbox.setEnabled(true); - mZeroClick.setEnabled(newState); + private void handleNfcStateChanged(int newState) { + switch (newState) { + case NfcAdapter.STATE_OFF: + mCheckbox.setChecked(false); + mCheckbox.setEnabled(true); + mZeroClick.setEnabled(false); + mZeroClick.setSummary(R.string.zeroclick_off_summary); + break; + case NfcAdapter.STATE_ON: + mCheckbox.setChecked(true); + mCheckbox.setEnabled(true); + mZeroClick.setEnabled(true); + if (mNfcAdapter.isZeroClickEnabled()) { + mZeroClick.setSummary(R.string.zeroclick_on_summary); + } else { + mZeroClick.setSummary(R.string.zeroclick_off_summary); + } + break; + case NfcAdapter.STATE_TURNING_ON: + mCheckbox.setChecked(true); + mCheckbox.setEnabled(false); + mZeroClick.setEnabled(false); + break; + case NfcAdapter.STATE_TURNING_OFF: + mCheckbox.setChecked(false); + mCheckbox.setEnabled(false); + mZeroClick.setEnabled(false); + break; + } } } diff --git a/src/com/android/settings/nfc/ZeroClick.java b/src/com/android/settings/nfc/ZeroClick.java index 5c67e5238e6..1b59b528410 100644 --- a/src/com/android/settings/nfc/ZeroClick.java +++ b/src/com/android/settings/nfc/ZeroClick.java @@ -63,7 +63,7 @@ public class ZeroClick extends Fragment mActionBarSwitch.setOnCheckedChangeListener(this); mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); - mActionBarSwitch.setChecked(mNfcAdapter.zeroClickEnabled()); + mActionBarSwitch.setChecked(mNfcAdapter.isZeroClickEnabled()); } @Override @@ -77,7 +77,7 @@ public class ZeroClick extends Fragment private void initView(View view) { mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); mActionBarSwitch.setOnCheckedChangeListener(this); - mActionBarSwitch.setChecked(mNfcAdapter.zeroClickEnabled()); + mActionBarSwitch.setChecked(mNfcAdapter.isZeroClickEnabled()); } @Override