Merge "Edit to label for regional date format to "Regional" from "Normal" Bug: 3471626"
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 7efa15d..636799d 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -94,8 +94,7 @@
         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 @@
             // 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 @@
         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 @@
         super.onPause();
 
         mAirplaneModeEnabler.pause();
-        mNfcEnabler.pause();
+        if (mNfcEnabler != null) {
+            mNfcEnabler.pause();
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index 21057a6..f490fd2 100644
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -21,6 +21,7 @@
 
 import android.app.AlertDialog;
 import android.app.Fragment;
+import android.content.ActivityNotFoundException;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.res.Configuration;
@@ -102,7 +103,13 @@
                     new OnClickListener() {
                         @Override
                         public void onClick(View arg0) {
-                            mFragment.startActivity(mSettingsIntent);
+                            try {
+                                mFragment.startActivity(mSettingsIntent);
+                            } catch (ActivityNotFoundException e) {
+                                Log.d(TAG, "IME's Settings Activity Not Found: " + e);
+                                // If the IME's settings activity does not exist, we can just
+                                // do nothing...
+                            }
                         }
                     });
         }
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;
+        }
     }
 }
diff --git a/src/com/android/settings/nfc/ZeroClick.java b/src/com/android/settings/nfc/ZeroClick.java
index 5c67e52..1b59b52 100644
--- a/src/com/android/settings/nfc/ZeroClick.java
+++ b/src/com/android/settings/nfc/ZeroClick.java
@@ -63,7 +63,7 @@
         mActionBarSwitch.setOnCheckedChangeListener(this);
 
         mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
-        mActionBarSwitch.setChecked(mNfcAdapter.zeroClickEnabled());
+        mActionBarSwitch.setChecked(mNfcAdapter.isZeroClickEnabled());
     }
 
     @Override
@@ -77,7 +77,7 @@
     private void initView(View view) {
         mNfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
         mActionBarSwitch.setOnCheckedChangeListener(this);
-        mActionBarSwitch.setChecked(mNfcAdapter.zeroClickEnabled());
+        mActionBarSwitch.setChecked(mNfcAdapter.isZeroClickEnabled());
     }
 
     @Override