diff --git a/res/values/strings.xml b/res/values/strings.xml
index b27e9d0e24d..323edd1dd6e 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2023,8 +2023,6 @@
Forget network
Modify network
-
- Write to NFC tag
To see available networks, turn Wi\u2011Fi on.
@@ -2210,8 +2208,6 @@
\u0020(WPS available)
-
- Enter your network password
Carrier Wi\u2011Fi network
@@ -7283,24 +7279,6 @@
battery saver, sticky, persist, power saver, battery
-
-
-
-
- Set up Wi-Fi NFC Tag
-
- Write
-
- Tap a tag to write...
-
- Invalid password, try again.
-
- Success!
-
- Unable to write data to NFC tag. If the problem persists, try a different tag
-
- NFC tag is not writable. Please use a different tag.
-
Default sound
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 91672104e45..4e5b13894c0 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -35,7 +35,6 @@ import android.net.NetworkInfo.State;
import android.net.NetworkRequest;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
-import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
@@ -100,10 +99,8 @@ public class WifiSettings extends RestrictedSettingsFragment
private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
private static final int MENU_ID_FORGET = Menu.FIRST + 7;
private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
- private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
public static final int WIFI_DIALOG_ID = 1;
- private static final int WRITE_NFC_DIALOG_ID = 6;
@VisibleForTesting
static final int ADD_NETWORK_REQUEST = 2;
@@ -111,7 +108,6 @@ public class WifiSettings extends RestrictedSettingsFragment
// Instance state keys
private static final String SAVE_DIALOG_MODE = "dialog_mode";
private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
- private static final String SAVED_WIFI_NFC_DIALOG_STATE = "wifi_nfc_dlg_state";
private static final String PREF_KEY_EMPTY_WIFI_LIST = "wifi_empty_list";
private static final String PREF_KEY_CONNECTED_ACCESS_POINTS = "connected_access_point";
@@ -152,7 +148,6 @@ public class WifiSettings extends RestrictedSettingsFragment
private AccessPoint mSelectedAccessPoint;
private WifiDialog mDialog;
- private WriteWifiConfigToNfcDialog mWifiToNfcDialog;
private View mProgressHeader;
@@ -171,7 +166,6 @@ public class WifiSettings extends RestrictedSettingsFragment
private int mDialogMode;
private AccessPoint mDlgAccessPoint;
private Bundle mAccessPointSavedState;
- private Bundle mWifiNfcDialogSavedState;
@VisibleForTesting
WifiTracker mWifiTracker;
@@ -312,11 +306,6 @@ public class WifiSettings extends RestrictedSettingsFragment
mAccessPointSavedState =
savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
}
-
- if (savedInstanceState.containsKey(SAVED_WIFI_NFC_DIALOG_STATE)) {
- mWifiNfcDialogSavedState =
- savedInstanceState.getBundle(SAVED_WIFI_NFC_DIALOG_STATE);
- }
}
// if we're supposed to enable/disable the Next button based on our current connection
@@ -461,12 +450,6 @@ public class WifiSettings extends RestrictedSettingsFragment
outState.putBundle(SAVE_DIALOG_ACCESS_POINT_STATE, mAccessPointSavedState);
}
}
-
- if (mWifiToNfcDialog != null) {
- Bundle savedState = new Bundle();
- mWifiToNfcDialog.saveState(savedState);
- outState.putBundle(SAVED_WIFI_NFC_DIALOG_STATE, savedState);
- }
}
@Override
@@ -495,13 +478,6 @@ public class WifiSettings extends RestrictedSettingsFragment
}
if (mSelectedAccessPoint.isSaved()) {
menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
- NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
- if (nfcAdapter != null && nfcAdapter.isEnabled() &&
- (!(mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE) ||
- (mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_OWE))) {
- // Only allow writing of NFC tags for password-protected networks.
- menu.add(Menu.NONE, MENU_ID_WRITE_NFC, 0, R.string.wifi_menu_write_to_nfc);
- }
}
}
}
@@ -534,10 +510,6 @@ public class WifiSettings extends RestrictedSettingsFragment
showDialog(mSelectedAccessPoint, WifiConfigUiBase.MODE_MODIFY);
return true;
}
- case MENU_ID_WRITE_NFC:
- showDialog(WRITE_NFC_DIALOG_ID);
- return true;
-
}
return super.onContextItemSelected(item);
}
@@ -626,16 +598,6 @@ public class WifiSettings extends RestrictedSettingsFragment
.createModal(getActivity(), this, mDlgAccessPoint, mDialogMode);
mSelectedAccessPoint = mDlgAccessPoint;
return mDialog;
- case WRITE_NFC_DIALOG_ID:
- if (mSelectedAccessPoint != null) {
- mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
- getActivity(),
- mSelectedAccessPoint.getSecurity());
- } else if (mWifiNfcDialogSavedState != null) {
- mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(getActivity(),
- mWifiNfcDialogSavedState);
- }
- return mWifiToNfcDialog;
}
return super.onCreateDialog(dialogId);
}
@@ -650,7 +612,6 @@ public class WifiSettings extends RestrictedSettingsFragment
public void onDismiss(DialogInterface dialog) {
// We don't keep any dialog object when dialog was dismissed.
mDialog = null;
- mWifiToNfcDialog = null;
}
@Override
@@ -658,8 +619,6 @@ public class WifiSettings extends RestrictedSettingsFragment
switch (dialogId) {
case WIFI_DIALOG_ID:
return SettingsEnums.DIALOG_WIFI_AP_EDIT;
- case WRITE_NFC_DIALOG_ID:
- return SettingsEnums.DIALOG_WIFI_WRITE_NFC;
default:
return 0;
}
diff --git a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
deleted file mode 100644
index b56eca60307..00000000000
--- a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * Copyright (C) 2014 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.wifi;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.net.wifi.WifiManager;
-import android.nfc.FormatException;
-import android.nfc.NdefMessage;
-import android.nfc.NdefRecord;
-import android.nfc.NfcAdapter;
-import android.nfc.Tag;
-import android.nfc.tech.Ndef;
-import android.os.Bundle;
-import android.os.PowerManager;
-import android.text.Editable;
-import android.text.InputType;
-import android.text.TextWatcher;
-import android.util.Log;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.CompoundButton;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import androidx.appcompat.app.AlertDialog;
-
-import com.android.settings.R;
-import com.android.settingslib.wifi.AccessPoint;
-
-import java.io.IOException;
-
-class WriteWifiConfigToNfcDialog extends AlertDialog
- implements TextWatcher, View.OnClickListener, CompoundButton.OnCheckedChangeListener {
-
- private static final String NFC_TOKEN_MIME_TYPE = "application/vnd.wfa.wsc";
-
- private static final String TAG = WriteWifiConfigToNfcDialog.class.getName().toString();
- private static final String PASSWORD_FORMAT = "102700%s%s";
- private static final int HEX_RADIX = 16;
- private static final char[] hexArray = "0123456789ABCDEF".toCharArray();
- private static final String SECURITY = "security";
-
- private final PowerManager.WakeLock mWakeLock;
-
- private View mView;
- private Button mSubmitButton;
- private Button mCancelButton;
- private TextView mPasswordView;
- private TextView mLabelView;
- private CheckBox mPasswordCheckBox;
- private ProgressBar mProgressBar;
- private WifiManager mWifiManager;
- private String mWpsNfcConfigurationToken;
- private Context mContext;
- private int mSecurity;
-
- WriteWifiConfigToNfcDialog(Context context, int security) {
- super(context);
-
- mContext = context;
- mWakeLock = ((PowerManager) context.getSystemService(Context.POWER_SERVICE))
- .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WriteWifiConfigToNfcDialog:wakeLock");
- mSecurity = security;
- mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- }
-
- WriteWifiConfigToNfcDialog(Context context, Bundle savedState) {
- super(context);
-
- mContext = context;
- mWakeLock = ((PowerManager) context.getSystemService(Context.POWER_SERVICE))
- .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WriteWifiConfigToNfcDialog:wakeLock");
- mSecurity = savedState.getInt(SECURITY);
- mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- mView = getLayoutInflater().inflate(R.layout.write_wifi_config_to_nfc, null);
-
- setView(mView);
- setTitle(R.string.setup_wifi_nfc_tag);
- setCancelable(true);
- setButton(DialogInterface.BUTTON_NEUTRAL,
- mContext.getResources().getString(R.string.write_tag), (OnClickListener) null);
- setButton(DialogInterface.BUTTON_NEGATIVE,
- mContext.getResources().getString(com.android.internal.R.string.cancel),
- (OnClickListener) null);
-
- mPasswordView = mView.findViewById(R.id.password);
- mLabelView = mView.findViewById(R.id.password_label);
- mPasswordView.addTextChangedListener(this);
- mPasswordCheckBox = mView.findViewById(R.id.show_password);
- mPasswordCheckBox.setOnCheckedChangeListener(this);
- mProgressBar = mView.findViewById(R.id.progress_bar);
-
- super.onCreate(savedInstanceState);
-
- mSubmitButton = getButton(DialogInterface.BUTTON_NEUTRAL);
- mSubmitButton.setOnClickListener(this);
- mSubmitButton.setEnabled(false);
-
- mCancelButton = getButton(DialogInterface.BUTTON_NEGATIVE);
- }
-
- @Override
- public void onClick(View v) {
- mWakeLock.acquire();
-
- String password = mPasswordView.getText().toString();
- String wpsNfcConfigurationToken = mWifiManager.getCurrentNetworkWpsNfcConfigurationToken();
- String passwordHex = byteArrayToHexString(password.getBytes());
-
- String passwordLength = password.length() >= HEX_RADIX
- ? Integer.toString(password.length(), HEX_RADIX)
- : "0" + Character.forDigit(password.length(), HEX_RADIX);
-
- passwordHex = String.format(PASSWORD_FORMAT, passwordLength, passwordHex).toLowerCase();
-
- if (wpsNfcConfigurationToken != null && wpsNfcConfigurationToken.contains(passwordHex)) {
- mWpsNfcConfigurationToken = wpsNfcConfigurationToken;
-
- Activity activity = getOwnerActivity();
- NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(activity);
-
- nfcAdapter.enableReaderMode(activity, new NfcAdapter.ReaderCallback() {
- @Override
- public void onTagDiscovered(Tag tag) {
- handleWriteNfcEvent(tag);
- }
- }, NfcAdapter.FLAG_READER_NFC_A |
- NfcAdapter.FLAG_READER_NFC_B |
- NfcAdapter.FLAG_READER_NFC_BARCODE |
- NfcAdapter.FLAG_READER_NFC_F |
- NfcAdapter.FLAG_READER_NFC_V,
- null);
-
- mPasswordView.setVisibility(View.GONE);
- mPasswordCheckBox.setVisibility(View.GONE);
- mSubmitButton.setVisibility(View.GONE);
- InputMethodManager imm = (InputMethodManager)
- getOwnerActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
- imm.hideSoftInputFromWindow(mPasswordView.getWindowToken(), 0);
-
- mLabelView.setText(R.string.status_awaiting_tap);
-
- mView.findViewById(R.id.password_layout).setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
- mProgressBar.setVisibility(View.VISIBLE);
- } else {
- mLabelView.setText(R.string.status_invalid_password);
- }
- }
-
- public void saveState(Bundle state) {
- state.putInt(SECURITY, mSecurity);
- }
-
- private void handleWriteNfcEvent(Tag tag) {
- Ndef ndef = Ndef.get(tag);
-
- if (ndef != null) {
- if (ndef.isWritable()) {
- NdefRecord record = NdefRecord.createMime(
- NFC_TOKEN_MIME_TYPE,
- hexStringToByteArray(mWpsNfcConfigurationToken));
- try {
- ndef.connect();
- ndef.writeNdefMessage(new NdefMessage(record));
- getOwnerActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- mProgressBar.setVisibility(View.GONE);
- }
- });
- setViewText(mLabelView, R.string.status_write_success);
- setViewText(mCancelButton, com.android.internal.R.string.done_label);
- } catch (IOException e) {
- setViewText(mLabelView, R.string.status_failed_to_write);
- Log.e(TAG, "Unable to write Wi-Fi config to NFC tag.", e);
- return;
- } catch (FormatException e) {
- setViewText(mLabelView, R.string.status_failed_to_write);
- Log.e(TAG, "Unable to write Wi-Fi config to NFC tag.", e);
- return;
- }
- } else {
- setViewText(mLabelView, R.string.status_tag_not_writable);
- Log.e(TAG, "Tag is not writable");
- }
- } else {
- setViewText(mLabelView, R.string.status_tag_not_writable);
- Log.e(TAG, "Tag does not support NDEF");
- }
- }
-
- @Override
- public void dismiss() {
- if (mWakeLock.isHeld()) {
- mWakeLock.release();
- }
-
- super.dismiss();
- }
-
- @Override
- public void onTextChanged(CharSequence s, int start, int before, int count) {
- enableSubmitIfAppropriate();
- }
-
- private void enableSubmitIfAppropriate() {
-
- if (mPasswordView != null) {
- if (mSecurity == AccessPoint.SECURITY_WEP) {
- mSubmitButton.setEnabled(mPasswordView.length() > 0);
- } else if (mSecurity == AccessPoint.SECURITY_PSK) {
- mSubmitButton.setEnabled(mPasswordView.length() >= 8);
- }
- } else {
- mSubmitButton.setEnabled(false);
- }
-
- }
-
- private void setViewText(final TextView view, final int resid) {
- getOwnerActivity().runOnUiThread(new Runnable() {
- @Override
- public void run() {
- view.setText(resid);
- }
- });
- }
-
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- mPasswordView.setInputType(
- InputType.TYPE_CLASS_TEXT |
- (isChecked
- ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
- : InputType.TYPE_TEXT_VARIATION_PASSWORD));
- }
-
- private static byte[] hexStringToByteArray(String s) {
- int len = s.length();
- byte[] data = new byte[len / 2];
-
- for (int i = 0; i < len; i += 2) {
- data[i / 2] = (byte) ((Character.digit(s.charAt(i), HEX_RADIX) << 4)
- + Character.digit(s.charAt(i + 1), HEX_RADIX));
- }
-
- return data;
- }
-
- private static String byteArrayToHexString(byte[] bytes) {
- char[] hexChars = new char[bytes.length * 2];
- for ( int j = 0; j < bytes.length; j++ ) {
- int v = bytes[j] & 0xFF;
- hexChars[j * 2] = hexArray[v >>> 4];
- hexChars[j * 2 + 1] = hexArray[v & 0x0F];
- }
- return new String(hexChars);
- }
-
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
-
- @Override
- public void afterTextChanged(Editable s) {}
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java b/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java
deleted file mode 100644
index ea306d0c055..00000000000
--- a/tests/robotests/src/com/android/settings/wifi/WriteWifiConfigToNfcDialogTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) 2017 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.wifi;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Mockito.when;
-
-import android.app.Activity;
-import android.net.wifi.WifiManager;
-
-import com.android.settings.testutils.shadow.ShadowNfcAdapter;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.Robolectric;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(RobolectricTestRunner.class)
-@Config(shadows = ShadowNfcAdapter.class)
-public class WriteWifiConfigToNfcDialogTest {
-
- @Mock
- private WifiManager mWifiManager;
-
- private WriteWifiConfigToNfcDialog mWriteWifiConfigToNfcDialog;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- final Activity activity = Robolectric.setupActivity(Activity.class);
- mWriteWifiConfigToNfcDialog = new WriteWifiConfigToNfcDialog(activity, 0 /* security */);
- ReflectionHelpers.setField(mWriteWifiConfigToNfcDialog, "mWifiManager", mWifiManager);
- mWriteWifiConfigToNfcDialog.setOwnerActivity(activity);
- mWriteWifiConfigToNfcDialog.onCreate(null /* savedInstanceState */);
- }
-
- @After
- public void tearDown() {
- ShadowNfcAdapter.reset();
- }
-
- @Test
- public void testOnClick_nfcConfigurationTokenDoesNotContainPasswordHex() {
- when(mWifiManager.getCurrentNetworkWpsNfcConfigurationToken()).thenReturn("blah");
-
- mWriteWifiConfigToNfcDialog.onClick(null);
-
- assertThat(ShadowNfcAdapter.isReaderModeEnabled()).isFalse();
- }
-
- @Test
- public void testOnClick_nfcConfigurationTokenIsNull() {
- when(mWifiManager.getCurrentNetworkWpsNfcConfigurationToken()).thenReturn(null);
-
- mWriteWifiConfigToNfcDialog.onClick(null);
-
- assertThat(ShadowNfcAdapter.isReaderModeEnabled()).isFalse();
- }
-
- @Test
- public void testOnClick_nfcConfigurationTokenContainsPasswordHex() {
- // This is the corresponding passwordHex for an empty string password.
- when(mWifiManager.getCurrentNetworkWpsNfcConfigurationToken()).thenReturn("10270000");
-
- mWriteWifiConfigToNfcDialog.onClick(null);
-
- assertThat(ShadowNfcAdapter.isReaderModeEnabled()).isTrue();
- }
-}