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

Commit 6776da1c authored by Doris Ling's avatar Doris Ling
Browse files

Do not turn on NFC automatically when airplane mode is off.

- besides checking the value for AIRPLANE_MODE_TOGGLEABLE_RADIOS, also
check the value for AIRPLANE_MODE_RADIOS to determine if we should turn
off NFC when airplane mode is on.
- when user turns off airplane mode, only re-enable the NFC preference
and do not enable NFC by default.
- remove listening to airplane mode directly from the android beam
preference controller, as it is already listening to Nfc state, which
handles the beam state already.

Change-Id: Id41fef15fb2de873729d20d7f53b1a88b164cf95
Fixes: 80217047
Test: make RunSettingsRoboTests
parent 7a1d3d9f
Loading
Loading
Loading
Loading
+0 −16
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@ package com.android.settings.nfc;

import android.content.Context;
import android.nfc.NfcAdapter;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;

import com.android.settings.core.BasePreferenceController;
@@ -26,15 +25,12 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

import java.util.List;

public class AndroidBeamPreferenceController extends BasePreferenceController
        implements LifecycleObserver, OnResume, OnPause {

    public static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings";
    private final NfcAdapter mNfcAdapter;
    private AndroidBeamEnabler mAndroidBeamEnabler;
    private NfcAirplaneModeObserver mAirplaneModeObserver;

    public AndroidBeamPreferenceController(Context context, String key) {
        super(context, key);
@@ -52,12 +48,6 @@ public class AndroidBeamPreferenceController extends BasePreferenceController
        final RestrictedPreference restrictedPreference =
                (RestrictedPreference) screen.findPreference(getPreferenceKey());
        mAndroidBeamEnabler = new AndroidBeamEnabler(mContext, restrictedPreference);

        // Manually set dependencies for NFC when not toggleable.
        if (!NfcPreferenceController.isToggleableInAirplaneMode(mContext)) {
            mAirplaneModeObserver = new NfcAirplaneModeObserver(mContext, mNfcAdapter,
                    (Preference) restrictedPreference);
        }
    }

    @Override
@@ -70,9 +60,6 @@ public class AndroidBeamPreferenceController extends BasePreferenceController

    @Override
    public void onResume() {
        if (mAirplaneModeObserver != null) {
            mAirplaneModeObserver.register();
        }
        if (mAndroidBeamEnabler != null) {
            mAndroidBeamEnabler.resume();
        }
@@ -80,9 +67,6 @@ public class AndroidBeamPreferenceController extends BasePreferenceController

    @Override
    public void onPause() {
        if (mAirplaneModeObserver != null) {
            mAirplaneModeObserver.unregister();
        }
        if (mAndroidBeamEnabler != null) {
            mAndroidBeamEnabler.pause();
        }
+1 −1
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import androidx.preference.Preference;
 * preference. It will receive intent and update state to ensure preference show correct state.
 */
public abstract class BaseNfcEnabler {
    private final Context mContext;
    protected final Context mContext;
    protected final NfcAdapter mNfcAdapter;
    private final IntentFilter mIntentFilter;

+6 −5
Original line number Diff line number Diff line
@@ -70,12 +70,13 @@ public class NfcAirplaneModeObserver extends ContentObserver {
        }

        mAirplaneMode = airplaneMode;
        boolean toggleable = mAirplaneMode != 1;
        if (toggleable) {
            mNfcAdapter.enable();
        } else {
        if (mAirplaneMode == 1) {
            // airplane mode is on, need to turn off NFC, and check if user can toggle it
            mNfcAdapter.disable();
            mPreference.setEnabled(NfcPreferenceController.isToggleableInAirplaneMode(mContext));
        } else {
            // airplane mode is off, no restriction
            mPreference.setEnabled(true);
        }
        mPreference.setEnabled(toggleable);
    }
}
+15 −2
Original line number Diff line number Diff line
@@ -18,8 +18,10 @@ package com.android.settings.nfc;

import android.content.Context;
import android.nfc.NfcAdapter;
import androidx.preference.SwitchPreference;
import android.provider.Settings;

import androidx.annotation.VisibleForTesting;
import androidx.preference.SwitchPreference;

/**
 * NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It turns on/off Nfc
@@ -38,7 +40,7 @@ public class NfcEnabler extends BaseNfcEnabler {
        switch (newState) {
            case NfcAdapter.STATE_OFF:
                mPreference.setChecked(false);
                mPreference.setEnabled(true);
                mPreference.setEnabled(isToggleable());
                break;
            case NfcAdapter.STATE_ON:
                mPreference.setChecked(true);
@@ -54,4 +56,15 @@ public class NfcEnabler extends BaseNfcEnabler {
                break;
        }
    }

    @VisibleForTesting
    boolean isToggleable() {
        if (NfcPreferenceController.isToggleableInAirplaneMode(mContext)
                || !NfcPreferenceController.shouldTurnOffNFCInAirplaneMode(mContext)) {
            return true;
        }
        final int airplaneMode = Settings.Global.getInt(
                mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0);
        return airplaneMode != 1;
    }
}
+13 −6
Original line number Diff line number Diff line
@@ -20,7 +20,7 @@ import android.content.IntentFilter;
import android.nfc.NfcAdapter;
import android.provider.Settings;

import androidx.preference.Preference;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

@@ -37,7 +37,8 @@ public class NfcPreferenceController extends TogglePreferenceController
    public static final String KEY_TOGGLE_NFC = "toggle_nfc";
    private final NfcAdapter mNfcAdapter;
    private NfcEnabler mNfcEnabler;
    private NfcAirplaneModeObserver mAirplaneModeObserver;
    @VisibleForTesting
    NfcAirplaneModeObserver mAirplaneModeObserver;

    public NfcPreferenceController(Context context, String key) {
        super(context, key);
@@ -57,10 +58,10 @@ public class NfcPreferenceController extends TogglePreferenceController

        mNfcEnabler = new NfcEnabler(mContext, switchPreference);

        // Manually set dependencies for NFC when not toggleable.
        if (!isToggleableInAirplaneMode(mContext)) {
            mAirplaneModeObserver = new NfcAirplaneModeObserver(mContext,
                    mNfcAdapter, (Preference) switchPreference);
        // Listen to airplane mode updates if NFC should be turned off when airplane mode is on
        if (shouldTurnOffNFCInAirplaneMode(mContext) || isToggleableInAirplaneMode(mContext)) {
            mAirplaneModeObserver =
                    new NfcAirplaneModeObserver(mContext, mNfcAdapter, switchPreference);
        }
    }

@@ -125,6 +126,12 @@ public class NfcPreferenceController extends TogglePreferenceController
        }
    }

    public static boolean shouldTurnOffNFCInAirplaneMode(Context context) {
        final String airplaneModeRadios = Settings.Global.getString(context.getContentResolver(),
                Settings.Global.AIRPLANE_MODE_RADIOS);
        return airplaneModeRadios != null && airplaneModeRadios.contains(Settings.Global.RADIO_NFC);
    }

    public static boolean isToggleableInAirplaneMode(Context context) {
        final String toggleable = Settings.Global.getString(context.getContentResolver(),
                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
Loading