Add support for NFC in airplane mode.

Also update logic in Settings for new async NfcAdapter.enable() and disable().

Change-Id: Ie1e5407498ac7beb5a4e21daec0ada0e8ae9c388
This commit is contained in:
Nick Pelly
2011-08-09 07:10:16 -07:00
parent 1685ac22b6
commit 9894d4ade4
3 changed files with 60 additions and 61 deletions

View File

@@ -94,8 +94,7 @@ public class WirelessSettings extends SettingsPreferenceFragment {
final Activity activity = getActivity(); final Activity activity = getActivity();
mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE); mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE);
CheckBoxPreference nfc = (CheckBoxPreference) findPreference(KEY_TOGGLE_NFC); CheckBoxPreference nfc = (CheckBoxPreference) findPreference(KEY_TOGGLE_NFC);
PreferenceScreen zeroclick = (PreferenceScreen) PreferenceScreen zeroclick = (PreferenceScreen) findPreference(KEY_ZEROCLICK_SETTINGS);
findPreference(KEY_ZEROCLICK_SETTINGS);
mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference); mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference);
mNfcEnabler = new NfcEnabler(activity, nfc, zeroclick); 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. // 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 // Remove NFC if its not available
mNfcAdapter = NfcAdapter.getDefaultAdapter(activity); mNfcAdapter = NfcAdapter.getDefaultAdapter(activity);
if (mNfcAdapter == null) { if (mNfcAdapter == null) {
getPreferenceScreen().removePreference(nfc); getPreferenceScreen().removePreference(nfc);
getPreferenceScreen().removePreference(zeroclick); getPreferenceScreen().removePreference(zeroclick);
mNfcEnabler = null;
} }
// Remove Mobile Network Settings if it's a wifi-only device. // Remove Mobile Network Settings if it's a wifi-only device.
@@ -176,18 +182,8 @@ public class WirelessSettings extends SettingsPreferenceFragment {
super.onResume(); super.onResume();
mAirplaneModeEnabler.resume(); mAirplaneModeEnabler.resume();
if (mNfcEnabler != null) {
mNfcEnabler.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);
}
} }
} }
@@ -196,8 +192,10 @@ public class WirelessSettings extends SettingsPreferenceFragment {
super.onPause(); super.onPause();
mAirplaneModeEnabler.pause(); mAirplaneModeEnabler.pause();
if (mNfcEnabler != null) {
mNfcEnabler.pause(); mNfcEnabler.pause();
} }
}
@Override @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) { public void onActivityResult(int requestCode, int resultCode, Intent data) {

View File

@@ -27,6 +27,8 @@ import android.preference.Preference;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
import android.util.Log; import android.util.Log;
import com.android.settings.R;
/** /**
* NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It is * 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 * turns on/off Nfc and ensures the summary of the preference reflects the
@@ -46,16 +48,13 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); String action = intent.getAction();
if (NfcAdapter.ACTION_ADAPTER_STATE_CHANGE.equals(action)) { if (NfcAdapter.ACTION_ADAPTER_STATE_CHANGED.equals(action)) {
handleNfcStateChanged(intent.getBooleanExtra( handleNfcStateChanged(intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE,
NfcAdapter.EXTRA_NEW_BOOLEAN_STATE, NfcAdapter.STATE_OFF));
false));
} }
} }
}; };
private boolean mNfcState;
public NfcEnabler(Context context, CheckBoxPreference checkBoxPreference, public NfcEnabler(Context context, CheckBoxPreference checkBoxPreference,
PreferenceScreen zeroclick) { PreferenceScreen zeroclick) {
mContext = context; mContext = context;
@@ -66,20 +65,20 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
if (mNfcAdapter == null) { if (mNfcAdapter == null) {
// NFC is not supported // NFC is not supported
mCheckbox.setEnabled(false); mCheckbox.setEnabled(false);
mZeroClick.setEnabled(false);
mIntentFilter = null;
return;
} }
mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGE);
} }
public void resume() { public void resume() {
if (mNfcAdapter == null) { if (mNfcAdapter == null) {
return; return;
} }
handleNfcStateChanged(mNfcAdapter.getAdapterState());
mContext.registerReceiver(mReceiver, mIntentFilter); mContext.registerReceiver(mReceiver, mIntentFilter);
mCheckbox.setOnPreferenceChangeListener(this); mCheckbox.setOnPreferenceChangeListener(this);
mNfcState = mNfcAdapter.isEnabled();
mCheckbox.setChecked(mNfcState);
} }
public void pause() { public void pause() {
@@ -96,41 +95,43 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
final boolean desiredState = (Boolean) value; final boolean desiredState = (Boolean) value;
mCheckbox.setEnabled(false); 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) { if (desiredState) {
success = mNfcAdapter.enable(); mNfcAdapter.enable();
} else { } else {
success = mNfcAdapter.disable(); 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();
return false; return false;
} }
private void handleNfcStateChanged(boolean newState) { private void handleNfcStateChanged(int newState) {
mCheckbox.setChecked(newState); switch (newState) {
case NfcAdapter.STATE_OFF:
mCheckbox.setChecked(false);
mCheckbox.setEnabled(true); mCheckbox.setEnabled(true);
mZeroClick.setEnabled(newState); 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;
}
} }
} }

View File

@@ -63,7 +63,7 @@ public class ZeroClick extends Fragment
mActionBarSwitch.setOnCheckedChangeListener(this); mActionBarSwitch.setOnCheckedChangeListener(this);
mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
mActionBarSwitch.setChecked(mNfcAdapter.zeroClickEnabled()); mActionBarSwitch.setChecked(mNfcAdapter.isZeroClickEnabled());
} }
@Override @Override
@@ -77,7 +77,7 @@ public class ZeroClick extends Fragment
private void initView(View view) { private void initView(View view) {
mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
mActionBarSwitch.setOnCheckedChangeListener(this); mActionBarSwitch.setOnCheckedChangeListener(this);
mActionBarSwitch.setChecked(mNfcAdapter.zeroClickEnabled()); mActionBarSwitch.setChecked(mNfcAdapter.isZeroClickEnabled());
} }
@Override @Override