Add support for NFC in airplane mode.

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

Change-Id: Ie1e5407498ac7beb5a4e21daec0ada0e8ae9c388
diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java
index 99cf8f0..722787d 100644
--- a/src/com/android/settings/nfc/NfcEnabler.java
+++ b/src/com/android/settings/nfc/NfcEnabler.java
@@ -27,6 +27,8 @@
 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 @@
         @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 @@
         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 @@
         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;
+        }
     }
 }