Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9894d4ad authored by Nick Pelly's avatar Nick Pelly
Browse files

Add support for NFC in airplane mode.

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

Change-Id: Ie1e5407498ac7beb5a4e21daec0ada0e8ae9c388
parent 1685ac22
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -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();
        if (mNfcEnabler != null) {
            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();

        mAirplaneModeEnabler.pause();
        if (mNfcEnabler != null) {
            mNfcEnabler.pause();
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+45 −44
Original line number Diff line number Diff line
@@ -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();
            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);
            mNfcAdapter.disable();
        }
                        });
                }
            }
        }.start();

        return false;
    }

    private void handleNfcStateChanged(boolean newState) {
        mCheckbox.setChecked(newState);
    private void handleNfcStateChanged(int newState) {
        switch (newState) {
        case NfcAdapter.STATE_OFF:
            mCheckbox.setChecked(false);
            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;
        }
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -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