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

Commit 5bf4e1ec authored by Ruchi Kandoi's avatar Ruchi Kandoi
Browse files

Add Secure NFC functionality

Secure NFC will permit NFC acitvity only when screen
is unlocked.

Bug: 117253725
Test: Manual; Toggle switch; check if HCE works with screen off
Change-Id: I9977d85065fc7ebca3ed4991ffa52fef0590cf90
parent 1fe41d44
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -1859,6 +1859,11 @@
    <!-- Dialog content for NFC disclaimer: telling user NFC can exchange data when device is nearby other devices (for example: payment terminals, badge reader etc). [CHAR_LIMIT=NONE]-->
    <string name="nfc_disclaimer_content">NFC exchanges data between this device and other nearby devices or targets, such as payment terminals, access readers, and interactive ads or tags.</string>
    <!-- Used in the settings screen to secure NFC [CHAR LIMIT=NONE] -->
    <string name="nfc_secure_settings_title">Secure NFC</string>
    <!-- Description of Secure NFC in the 1st level settings screen. [CHAR LIMIT=NONE] -->
    <string name="nfc_secure_toggle_summary" product="default">Allow NFC Payment and Transit use only when screen is unlocked</string>
    <!-- Used to enter the Android Beam sharing preferences screen. This phrase is a trademark. [CHAR LIMIT=32] -->
    <string name="android_beam_settings_title">Android Beam</string>
    <!-- Used to describe the on state of the Android Beam feature [CHAR LIMIT=NONE] -->
@@ -1866,7 +1871,7 @@
    <!-- Used to describe the off state of the Android Beam feature [CHAR LIMIT=NONE] -->
    <string name="android_beam_off_summary">Off</string>
    <!-- Used to describe the enabled state of the Android Beam feature when NFC, which it relies on, is turned off [CHAR LIMIT=NONE] -->
    <string name="android_beam_disabled_summary">Unavailable because NFC is turned off</string>
    <string name="nfc_disabled_summary">Unavailable because NFC is turned off</string>
    <!-- Used in the Android Beam sharing preferences screen. This phrase is a trademark. [CHAR LIMIT=32] -->
    <string name="android_beam_label">Android Beam</string>
    <!-- Explanation of the Android Beam feature in the Android Beam settings panel. The use of "beam" here is as a verb and not considered trademarked. [CHAR LIMIT=NONE] -->
+8 −0
Original line number Diff line number Diff line
@@ -44,6 +44,14 @@
        android:icon="@drawable/ic_android"
        android:order="-6"/>

    <SwitchPreference
        android:key="nfc_secure_settings"
        android:title="@string/nfc_secure_settings_title"
        settings:controller="com.android.settings.nfc.SecureNfcPreferenceController"
        android:icon="@drawable/ic_nfc"
        android:summary="@string/nfc_secure_toggle_summary"
        android:order="-7"/>

    <com.android.settingslib.RestrictedPreference
        android:key="connected_device_printing"
        android:title="@string/print_settings"
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ public class AndroidBeamEnabler extends BaseNfcEnabler {
        switch (newState) {
            case NfcAdapter.STATE_OFF:
                mPreference.setEnabled(false);
                mPreference.setSummary(R.string.android_beam_disabled_summary);
                mPreference.setSummary(R.string.nfc_disabled_summary);
                break;
            case NfcAdapter.STATE_ON:
                if (mBeamDisallowedBySystem) {
+60 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.nfc;

import android.content.Context;
import android.nfc.NfcAdapter;
import android.provider.Settings;

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

import com.android.settings.R;

/**
 * SecureNfcEnabler is a helper to manage the Secure Nfc on/off checkbox preference
 * It turns on/off Secure NFC and ensures the summary of the preference reflects
 * the current state.
 */
public class SecureNfcEnabler extends BaseNfcEnabler {
    private final SwitchPreference mPreference;

    public SecureNfcEnabler(Context context, SwitchPreference preference) {
        super(context);
        mPreference = preference;
    }

    @Override
    protected void handleNfcStateChanged(int newState) {
        switch (newState) {
            case NfcAdapter.STATE_OFF:
                mPreference.setSummary(R.string.nfc_disabled_summary);
                mPreference.setEnabled(false);
                break;
            case NfcAdapter.STATE_ON:
                mPreference.setChecked(mPreference.isEnabled());
                mPreference.setEnabled(true);
                break;
            case NfcAdapter.STATE_TURNING_ON:
                mPreference.setEnabled(false);
                break;
            case NfcAdapter.STATE_TURNING_OFF:
                mPreference.setEnabled(false);
                break;
        }
    }
}
+99 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.settings.nfc;

import android.content.Context;
import android.nfc.NfcAdapter;
import android.os.SystemProperties;

import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;

public class SecureNfcPreferenceController extends TogglePreferenceController
        implements LifecycleObserver, OnResume, OnPause {

    public static final String KEY_TOGGLE_NFC = "nfc_secure_setting";
    private final NfcAdapter mNfcAdapter;
    private SecureNfcEnabler mSecureNfcEnabler;

    public SecureNfcPreferenceController(Context context, String key) {
        super(context, key);
        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        if (!isAvailable()) {
            mSecureNfcEnabler = null;
            return;
        }

        final SwitchPreference switchPreference =
                (SwitchPreference) screen.findPreference(getPreferenceKey());

        mSecureNfcEnabler = new SecureNfcEnabler(mContext, switchPreference);
    }

    @Override
    public boolean isChecked() {
        return mNfcAdapter.isNfcSecureEnabled();
    }

    @Override
    public boolean setChecked(boolean isChecked) {
        return mNfcAdapter.setNfcSecure(isChecked);
    }

    @Override
    @AvailabilityStatus
    public int getAvailabilityStatus() {
        if (mNfcAdapter == null) {
            return UNSUPPORTED_ON_DEVICE;
        }
        return mNfcAdapter.deviceSupportsNfcSecure() ? AVAILABLE
            : UNSUPPORTED_ON_DEVICE;
    }

    @Override
    public boolean hasAsyncUpdate() {
        return true;
    }

    @Override
    public boolean isSliceable() {
        return true;
    }

    @Override
    public void onResume() {
        if (mSecureNfcEnabler != null) {
            mSecureNfcEnabler.resume();
        }
    }

    @Override
    public void onPause() {
        if (mSecureNfcEnabler != null) {
            mSecureNfcEnabler.pause();
        }
    }
}
Loading