summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/nfc
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@android.com>2010-10-18 14:04:24 -0700
committerNick Pelly <npelly@google.com>2010-10-18 15:25:49 -0700
commitd36d650a8132e8aea375239e6dfff92708771b7a (patch)
treed4f7ec35219305f9b3160adc6386021c1f299c27 /src/com/android/settings/nfc
parentdd49624ed049d6f2f9946f71381bcde83f19e5e0 (diff)
downloadpackages_apps_Settings-d36d650a8132e8aea375239e6dfff92708771b7a.zip
packages_apps_Settings-d36d650a8132e8aea375239e6dfff92708771b7a.tar.gz
packages_apps_Settings-d36d650a8132e8aea375239e6dfff92708771b7a.tar.bz2
NFC: async enabling/disabling, ala Bluewooth & Wifi.
Don't ANR when toggling. Bug: 3097279 Change-Id: Ief09a5a4d023f32b02b2f3b72ac701e8089254c8
Diffstat (limited to 'src/com/android/settings/nfc')
-rw-r--r--src/com/android/settings/nfc/NfcEnabler.java86
1 files changed, 61 insertions, 25 deletions
diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java
index 1facab9..14e8b52 100644
--- a/src/com/android/settings/nfc/NfcEnabler.java
+++ b/src/com/android/settings/nfc/NfcEnabler.java
@@ -17,10 +17,15 @@
package com.android.settings.nfc;
import com.android.settings.R;
+
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.nfc.NfcAdapter;
-import android.preference.Preference;
+import android.os.Handler;
import android.preference.CheckBoxPreference;
+import android.preference.Preference;
import android.provider.Settings;
import android.util.Log;
@@ -35,6 +40,20 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
private final Context mContext;
private final CheckBoxPreference mCheckbox;
private final NfcAdapter mNfcAdapter;
+ private final IntentFilter mIntentFilter;
+ private final Handler mHandler = new Handler();
+
+ private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+ @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));
+ }
+ }
+ };
private boolean mNfcState;
@@ -47,49 +66,66 @@ public class NfcEnabler implements Preference.OnPreferenceChangeListener {
// NFC is not supported
mCheckbox.setEnabled(false);
}
+
+ mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGE);
+
}
public void resume() {
if (mNfcAdapter == null) {
return;
}
- mCheckbox.setOnPreferenceChangeListener(this);
- mNfcState = Settings.System.getInt(mContext.getContentResolver(),
- Settings.System.NFC_ON, 0) != 0;
- updateUi();
+ mContext.registerReceiver(mReceiver, mIntentFilter);
+ mCheckbox.setOnPreferenceChangeListener(this);
+ mNfcState = Settings.System.getInt(mContext.getContentResolver(),
+ Settings.System.NFC_ON, 0) != 0;
+ mCheckbox.setChecked(mNfcState);
}
public void pause() {
if (mNfcAdapter == null) {
return;
}
+ mContext.unregisterReceiver(mReceiver);
mCheckbox.setOnPreferenceChangeListener(null);
}
public boolean onPreferenceChange(Preference preference, Object value) {
- // Turn on/off Nfc
- mNfcState = (Boolean) value;
- setEnabled();
+ // Turn NFC on/off
- return false;
- }
+ final boolean desiredState = (Boolean) value;
+ mCheckbox.setEnabled(false);
- private void setEnabled() {
- if (mNfcState) {
- if (!mNfcAdapter.enableTagDiscovery()) {
- Log.w(TAG, "NFC enabling failed");
- mNfcState = false;
- }
- } else {
- if (!mNfcAdapter.disableTagDiscovery()) {
- Log.w(TAG, "NFC disabling failed");
- mNfcState = true;
+ // Start async update of the NFC adapter state, as the API is
+ // unfortunately blocking...
+ new Thread("toggleNFC") {
+ public void run() {
+ Log.d(TAG, "Setting NFC enabled state to: " + desiredState);
+ boolean success = false;
+ if (desiredState) {
+ success = mNfcAdapter.enableTagDiscovery();
+ } else {
+ success = mNfcAdapter.disableTagDiscovery();
+ }
+ if (success) {
+ Log.d(TAG, "Successfully changed NFC enabled state to " + desiredState);
+ // UI will be updated by BroadcastReceiver, above.
+ } else {
+ Log.w(TAG, "Error setting NFC enabled state to " + desiredState);
+ mHandler.post(new Runnable() {
+ public void run() {
+ mCheckbox.setEnabled(true);
+ mCheckbox.setSummary(R.string.nfc_toggle_error);
+ }
+ });
+ }
}
- }
- updateUi();
- }
+ }.start();
+ return false;
+ }
- private void updateUi() {
- mCheckbox.setChecked(mNfcState);
+ private void handleNfcStateChanged(boolean newState) {
+ mCheckbox.setChecked(newState);
+ mCheckbox.setEnabled(true);
}
}