From d9e3e6e4b1c3cb1a04dba0f530505843ef44a748 Mon Sep 17 00:00:00 2001 From: Jack Yu Date: Fri, 14 Jan 2022 23:13:54 +0800 Subject: [PATCH 1/6] Do not let guest user disable secure nfc Bug: 209446496 Test: manual Change-Id: I7253f7f08fde04e30400a30d9a0d24f1ceff04b0 --- .../NfcAndPaymentFragment.java | 19 ++++++++++++++++++- .../settings/nfc/SecureNfcEnabler.java | 14 +++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/connecteddevice/NfcAndPaymentFragment.java b/src/com/android/settings/connecteddevice/NfcAndPaymentFragment.java index 4ebc0cdcccd..feb757f9e41 100644 --- a/src/com/android/settings/connecteddevice/NfcAndPaymentFragment.java +++ b/src/com/android/settings/connecteddevice/NfcAndPaymentFragment.java @@ -17,6 +17,12 @@ package com.android.settings.connecteddevice; import android.app.settings.SettingsEnums; +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.UserInfo; +import android.os.UserHandle; +import android.os.UserManager; + import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; @@ -54,5 +60,16 @@ public class NfcAndPaymentFragment extends DashboardFragment { * For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = - new BaseSearchIndexProvider(R.xml.nfc_and_payment_settings); + new BaseSearchIndexProvider(R.xml.nfc_and_payment_settings) { + @Override + protected boolean isPageSearchEnabled(Context context) { + final UserManager userManager = context.getSystemService(UserManager.class); + final UserInfo myUserInfo = userManager.getUserInfo(UserHandle.myUserId()); + if (myUserInfo.isGuest()) { + return false; + } + final PackageManager pm = context.getPackageManager(); + return pm.hasSystemFeature(PackageManager.FEATURE_NFC); + } + }; } diff --git a/src/com/android/settings/nfc/SecureNfcEnabler.java b/src/com/android/settings/nfc/SecureNfcEnabler.java index 9acaf6461f2..f31a382a571 100644 --- a/src/com/android/settings/nfc/SecureNfcEnabler.java +++ b/src/com/android/settings/nfc/SecureNfcEnabler.java @@ -18,9 +18,8 @@ package com.android.settings.nfc; import android.content.Context; import android.nfc.NfcAdapter; -import android.provider.Settings; +import android.os.UserManager; -import androidx.annotation.VisibleForTesting; import androidx.preference.SwitchPreference; import com.android.settings.R; @@ -32,10 +31,12 @@ import com.android.settings.R; */ public class SecureNfcEnabler extends BaseNfcEnabler { private final SwitchPreference mPreference; + private final UserManager mUserManager; public SecureNfcEnabler(Context context, SwitchPreference preference) { super(context); mPreference = preference; + mUserManager = context.getSystemService(UserManager.class); } @Override @@ -48,7 +49,7 @@ public class SecureNfcEnabler extends BaseNfcEnabler { case NfcAdapter.STATE_ON: mPreference.setSummary(R.string.nfc_secure_toggle_summary); mPreference.setChecked(mPreference.isChecked()); - mPreference.setEnabled(true); + mPreference.setEnabled(isToggleable()); break; case NfcAdapter.STATE_TURNING_ON: mPreference.setEnabled(false); @@ -58,4 +59,11 @@ public class SecureNfcEnabler extends BaseNfcEnabler { break; } } + + private boolean isToggleable() { + if (mUserManager.isGuestUser()) { + return false; + } + return true; + } } From 64cc3bf9a40004d296771e6c854a6c5d013b22e1 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 21 Jan 2022 07:10:22 +0000 Subject: [PATCH 2/6] Mock WifiManager.class for Roboletric test-cases Bug: 214938188 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=AddNetworkFragmentTest make RunSettingsRoboTests ROBOTEST_FILTER=ConfigureWifiEntryFragmentTest make RunSettingsRoboTests ROBOTEST_FILTER=ContextualWifiSliceTest make RunSettingsRoboTests ROBOTEST_FILTER=WifiConfigControllerTest make RunSettingsRoboTests ROBOTEST_FILTER=WifiSliceTest Change-Id: I96873c48b36ed11b30e32bba1b98b6328ad17bb7 --- .../settings/wifi/AddNetworkFragmentTest.java | 18 +++++----- .../wifi/ConfigureWifiEntryFragmentTest.java | 13 ++++++-- .../wifi/WifiConfigControllerTest.java | 9 ++--- .../wifi/slice/ContextualWifiSliceTest.java | 33 ++++++++++++------- .../settings/wifi/slice/WifiSliceTest.java | 15 +++++---- 5 files changed, 55 insertions(+), 33 deletions(-) diff --git a/tests/robotests/src/com/android/settings/wifi/AddNetworkFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/AddNetworkFragmentTest.java index 3ba13b43e87..d4913554f4e 100644 --- a/tests/robotests/src/com/android/settings/wifi/AddNetworkFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/AddNetworkFragmentTest.java @@ -18,16 +18,21 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import android.content.Context; +import android.net.wifi.WifiManager; import android.view.View; +import androidx.test.core.app.ApplicationProvider; + import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.testutils.shadow.ShadowConnectivityManager; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; @@ -44,37 +49,36 @@ public class AddNetworkFragmentTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + Context context = spy(ApplicationProvider.getApplicationContext()); + when(context.getSystemService(Context.WIFI_SERVICE)).thenReturn(mock(WifiManager.class)); + mAddNetworkFragment = spy(new AddNetworkFragment()); + when(mAddNetworkFragment.getContext()).thenReturn(context); FragmentController.setupFragment(mAddNetworkFragment); } @Test - @Ignore public void getMetricsCategory_shouldReturnAddNetwork() { assertThat(mAddNetworkFragment.getMetricsCategory()).isEqualTo( MetricsEvent.SETTINGS_WIFI_ADD_NETWORK); } @Test - @Ignore public void getMode_shouldBeModeConnected() { assertThat(mAddNetworkFragment.getMode()).isEqualTo(WifiConfigUiBase2.MODE_CONNECT); } @Test - @Ignore public void launchFragment_shouldShowSubmitButton() { assertThat(mAddNetworkFragment.getSubmitButton()).isNotNull(); } @Test - @Ignore public void launchFragment_shouldShowCancelButton() { assertThat(mAddNetworkFragment.getCancelButton()).isNotNull(); } @Test - @Ignore public void onClickSubmitButton_shouldHandleSubmitAction() { View submitButton = mAddNetworkFragment.getView().findViewById( AddNetworkFragment.SUBMIT_BUTTON_ID); @@ -85,7 +89,6 @@ public class AddNetworkFragmentTest { } @Test - @Ignore public void onClickCancelButton_shouldHandleCancelAction() { View cancelButton = mAddNetworkFragment.getView().findViewById( AddNetworkFragment.CANCEL_BUTTON_ID); @@ -96,7 +99,6 @@ public class AddNetworkFragmentTest { } @Test - @Ignore public void dispatchSubmit_shouldHandleSubmitAction() { mAddNetworkFragment.dispatchSubmit(); diff --git a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiEntryFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiEntryFragmentTest.java index f7ae660abb1..f8f45dd3b86 100644 --- a/tests/robotests/src/com/android/settings/wifi/ConfigureWifiEntryFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/ConfigureWifiEntryFragmentTest.java @@ -18,16 +18,21 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; +import android.content.Context; +import android.net.wifi.WifiManager; import android.os.Bundle; +import androidx.test.core.app.ApplicationProvider; + import com.android.wifitrackerlib.NetworkDetailsTracker; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -36,7 +41,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.shadows.androidx.fragment.FragmentController; @RunWith(RobolectricTestRunner.class) -@Ignore public class ConfigureWifiEntryFragmentTest { private static final String KEY_SSID = "key_ssid"; @@ -50,13 +54,16 @@ public class ConfigureWifiEntryFragmentTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - Bundle bundle = new Bundle(); + Context context = spy(ApplicationProvider.getApplicationContext()); + when(context.getSystemService(Context.WIFI_SERVICE)).thenReturn(mock(WifiManager.class)); + Bundle bundle = new Bundle(); bundle.putString(KEY_SSID, "Test AP"); bundle.putInt(KEY_SECURITY, 1 /* WEP */); mConfigureWifiEntryFragment = spy(new ConfigureWifiEntryFragment()); mConfigureWifiEntryFragment.setArguments(bundle); mConfigureWifiEntryFragment.mNetworkDetailsTracker = mNetworkDetailsTracker; + when(mConfigureWifiEntryFragment.getContext()).thenReturn(context); FragmentController.setupFragment(mConfigureWifiEntryFragment); } diff --git a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java index 9952c06f3e5..8ecbaf64b12 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiConfigControllerTest.java @@ -22,6 +22,7 @@ import static com.android.settings.wifi.WifiConfigController.PRIVACY_SPINNER_IND import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; @@ -45,19 +46,19 @@ import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; +import androidx.test.core.app.ApplicationProvider; + import com.android.settings.R; import com.android.settings.network.SubscriptionUtil; import com.android.settings.testutils.shadow.ShadowConnectivityManager; import com.android.settingslib.wifi.AccessPoint; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowInputMethodManager; @@ -66,7 +67,6 @@ import org.robolectric.shadows.ShadowSubscriptionManager; import java.util.Arrays; @RunWith(RobolectricTestRunner.class) -@Ignore @Config(shadows = ShadowConnectivityManager.class) public class WifiConfigControllerTest { @@ -96,7 +96,8 @@ public class WifiConfigControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mock(WifiManager.class)); when(mConfigUiBase.getContext()).thenReturn(mContext); when(mAccessPoint.getSecurity()).thenReturn(AccessPoint.SECURITY_PSK); mView = LayoutInflater.from(mContext).inflate(R.layout.wifi_dialog, null); diff --git a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java index 28798dfaad6..f31c216d260 100644 --- a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java @@ -27,8 +27,9 @@ import static org.mockito.Mockito.spy; import android.content.ContentResolver; import android.content.Context; +import android.net.Network; import android.net.NetworkCapabilities; -import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import androidx.core.graphics.drawable.IconCompat; @@ -45,9 +46,10 @@ import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowConnectivityManager; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -55,29 +57,40 @@ import org.robolectric.annotation.Config; import java.util.List; @RunWith(RobolectricTestRunner.class) -@Ignore @Config(shadows = ShadowConnectivityManager.class) public class ContextualWifiSliceTest { + private static final String SSID = "123"; + + @Mock + private WifiManager mWifiManager; + @Mock + private WifiInfo mWifiInfo; + @Mock + private Network mNetwork; private Context mContext; private ContentResolver mResolver; - private WifiManager mWifiManager; private ContextualWifiSlice mWifiSlice; private FakeFeatureFactory mFeatureFactory; @Before public void setUp() { + MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); mResolver = mock(ContentResolver.class); mFeatureFactory = FakeFeatureFactory.setupForTest(); mFeatureFactory.slicesFeatureProvider = new SlicesFeatureProviderImpl(); mFeatureFactory.slicesFeatureProvider.newUiSession(); doReturn(mResolver).when(mContext).getContentResolver(); - mWifiManager = mContext.getSystemService(WifiManager.class); + doReturn(mWifiManager).when(mContext).getSystemService(WifiManager.class); + doReturn(true).when(mWifiManager).isWifiEnabled(); + doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState(); + doReturn(mWifiInfo).when(mWifiManager).getConnectionInfo(); + doReturn(SSID).when(mWifiInfo).getSSID(); + doReturn(mNetwork).when(mWifiManager).getCurrentNetwork(); // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); - mWifiManager.setWifiEnabled(true); mWifiSlice = new ContextualWifiSlice(mContext); } @@ -121,7 +134,7 @@ public class ContextualWifiSliceTest { mWifiSlice.sApRowCollapsed = true; connectToWifi(makeValidatedNetworkCapabilities()); - mWifiManager.disconnect(); + doReturn(null).when(mWifiManager).getCurrentNetwork(); final Slice wifiSlice = mWifiSlice.getSlice(); assertWifiHeader(wifiSlice); @@ -138,11 +151,7 @@ public class ContextualWifiSliceTest { } private void connectToWifi(NetworkCapabilities nc) { - final WifiConfiguration config = new WifiConfiguration(); - config.SSID = "123"; - mWifiManager.connect(config, null /* listener */); - ShadowConnectivityManager.getShadow().setNetworkCapabilities( - mWifiManager.getCurrentNetwork(), nc); + ShadowConnectivityManager.getShadow().setNetworkCapabilities(mNetwork, nc); } private NetworkCapabilities makeValidatedNetworkCapabilities() { diff --git a/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java b/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java index 6fb8bb20d58..b4a8b05f648 100644 --- a/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java @@ -50,9 +50,10 @@ import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiEntry.ConnectedState; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -63,7 +64,6 @@ import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) -@Ignore @Config(shadows = WifiSliceTest.ShadowSliceBackgroundWorker.class) public class WifiSliceTest { @@ -71,21 +71,24 @@ public class WifiSliceTest { private static final String AP2_NAME = "ap2"; private static final String AP3_NAME = "ap3"; + @Mock + private WifiManager mWifiManager; + private Context mContext; private ContentResolver mResolver; - private WifiManager mWifiManager; private WifiSlice mWifiSlice; @Before public void setUp() { + MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); mResolver = mock(ContentResolver.class); doReturn(mResolver).when(mContext).getContentResolver(); - mWifiManager = mContext.getSystemService(WifiManager.class); + doReturn(mWifiManager).when(mContext).getSystemService(WifiManager.class); + doReturn(WifiManager.WIFI_STATE_ENABLED).when(mWifiManager).getWifiState(); // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); - mWifiManager.setWifiEnabled(true); mWifiSlice = new WifiSlice(mContext); } @@ -108,7 +111,7 @@ public class WifiSliceTest { @Test public void getWifiSlice_wifiOff_shouldReturnSingleRow() { - mWifiManager.setWifiEnabled(false); + doReturn(WifiManager.WIFI_STATE_DISABLED).when(mWifiManager).getWifiState(); final Slice wifiSlice = mWifiSlice.getSlice(); From ea0425e1f8f0a3bd3d58ffbdfb706373cf53dbc8 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 21 Jan 2022 07:24:21 +0000 Subject: [PATCH 3/6] Mock WifiPickerTracker.class for Roboletric test-cases Bug: 214938188 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=NetworkRequestDialogActivityTest make RunSettingsRoboTests ROBOTEST_FILTER=NetworkRequestDialogFragmentTest make RunSettingsRoboTests ROBOTEST_FILTER=NetworkRequestErrorDialogFragmentTest make RunSettingsRoboTests ROBOTEST_FILTER=WifiConnectionPreferenceControllerTest Change-Id: I4c15c2a095203338bb9cf7bcd359242d59bf8b4e --- .../WifiConnectionPreferenceControllerTest.java | 8 ++++++-- .../wifi/NetworkRequestDialogActivityTest.java | 15 +++++++-------- .../wifi/NetworkRequestDialogFragmentTest.java | 12 ++++++++++-- .../NetworkRequestErrorDialogFragmentTest.java | 17 +++++++++++------ 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/tests/robotests/src/com/android/settings/network/WifiConnectionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/WifiConnectionPreferenceControllerTest.java index 925b000e652..4a7c27316ff 100644 --- a/tests/robotests/src/com/android/settings/network/WifiConnectionPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/network/WifiConnectionPreferenceControllerTest.java @@ -19,6 +19,7 @@ package com.android.settings.network; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -33,6 +34,7 @@ import androidx.lifecycle.LifecycleOwner; import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.wifi.WifiConnectionPreferenceController; import com.android.settings.wifi.WifiEntryPreference; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -40,7 +42,6 @@ import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiPickerTracker; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -50,7 +51,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @RunWith(RobolectricTestRunner.class) -@Ignore public class WifiConnectionPreferenceControllerTest { private static final String KEY = "wifi_connection"; @@ -72,6 +72,10 @@ public class WifiConnectionPreferenceControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest(); + when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker( + any(), any(), any(), any(), any(), anyLong(), anyLong(), any())) + .thenReturn(mWifiPickerTracker); mLifecycleOwner = () -> mLifecycle; mLifecycle = new Lifecycle(mLifecycleOwner); when(mScreen.findPreference(eq(KEY))).thenReturn(mPreferenceCategory); diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java index 460e6448963..fb200453d4d 100644 --- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java @@ -19,6 +19,7 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -35,13 +36,12 @@ import android.os.Bundle; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE; -import com.android.settingslib.wifi.WifiTracker; -import com.android.settingslib.wifi.WifiTrackerFactory; +import com.android.wifitrackerlib.WifiPickerTracker; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.MockitoAnnotations; @@ -55,7 +55,6 @@ import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) -@Ignore @Config(shadows = ShadowAlertDialogCompat.class) public class NetworkRequestDialogActivityTest { @@ -69,11 +68,11 @@ public class NetworkRequestDialogActivityTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); - - WifiTracker wifiTracker = mock(WifiTracker.class); - WifiTrackerFactory.setTestingWifiTracker(wifiTracker); + FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest(); + when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker( + any(), any(), any(), any(), any(), anyLong(), anyLong(), any())) + .thenReturn(mock(WifiPickerTracker.class)); NetworkRequestDialogActivity activity = Robolectric.setupActivity(NetworkRequestDialogActivity.class); diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java index 496fe871b0c..e08a14a469d 100644 --- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java @@ -18,6 +18,8 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -38,15 +40,16 @@ import androidx.appcompat.app.AlertDialog; import androidx.fragment.app.FragmentActivity; import com.android.settings.R; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.wifitrackerlib.WifiEntry; import com.android.wifitrackerlib.WifiPickerTracker; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InOrder; +import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; @@ -56,7 +59,6 @@ import java.util.ArrayList; import java.util.List; @RunWith(RobolectricTestRunner.class) -@Ignore @Config(shadows = ShadowAlertDialogCompat.class) public class NetworkRequestDialogFragmentTest { @@ -69,6 +71,12 @@ public class NetworkRequestDialogFragmentTest { @Before public void setUp() { + MockitoAnnotations.initMocks(this); + FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest(); + when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker( + any(), any(), any(), any(), any(), anyLong(), anyLong(), any())) + .thenReturn(mock(WifiPickerTracker.class)); + mActivity = Robolectric.buildActivity(FragmentActivity.class, new Intent().putExtra(NetworkRequestDialogFragment.EXTRA_APP_NAME, TEST_APP_NAME)).setup().get(); diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java index 8e95db890f0..f4e018f77bd 100644 --- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestErrorDialogFragmentTest.java @@ -19,9 +19,12 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.mockito.internal.verification.VerificationModeFactory.times; import android.content.DialogInterface; @@ -32,22 +35,21 @@ import android.widget.Button; import androidx.appcompat.app.AlertDialog; import com.android.settings.R; +import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; import com.android.settings.wifi.NetworkRequestErrorDialogFragment.ERROR_DIALOG_TYPE; -import com.android.settingslib.wifi.WifiTracker; -import com.android.settingslib.wifi.WifiTrackerFactory; +import com.android.wifitrackerlib.WifiPickerTracker; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Ignore @Config(shadows = ShadowAlertDialogCompat.class) public class NetworkRequestErrorDialogFragmentTest { @@ -56,8 +58,11 @@ public class NetworkRequestErrorDialogFragmentTest { @Before public void setUp() { - WifiTracker wifiTracker = mock(WifiTracker.class); - WifiTrackerFactory.setTestingWifiTracker(wifiTracker); + MockitoAnnotations.initMocks(this); + FakeFeatureFactory fakeFeatureFactory = FakeFeatureFactory.setupForTest(); + when(fakeFeatureFactory.wifiTrackerLibProvider.createWifiPickerTracker( + any(), any(), any(), any(), any(), anyLong(), anyLong(), any())) + .thenReturn(mock(WifiPickerTracker.class)); mActivity = Robolectric.setupActivity(NetworkRequestDialogActivity.class); mFragment = spy(NetworkRequestErrorDialogFragment.newInstance()); From c735f98943512f9089a5904da01b949f6c4731fa Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 21 Jan 2022 08:22:59 +0000 Subject: [PATCH 4/6] Mock WifiManager.class for HotspotConditionControllerTest Bug: 215047177 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=HotspotConditionControllerTest Change-Id: I902383f935d38b1736e5cced388a8b164a428007 --- .../HotspotConditionControllerTest.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/HotspotConditionControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/HotspotConditionControllerTest.java index 6fa83f272f5..69be1310c0c 100644 --- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/HotspotConditionControllerTest.java +++ b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/HotspotConditionControllerTest.java @@ -18,28 +18,31 @@ package com.android.settings.homepage.contextualcards.conditional; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + import android.content.Context; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiManager; +import androidx.test.core.app.ApplicationProvider; + import com.android.settings.homepage.contextualcards.ContextualCard; -import com.android.settings.testutils.shadow.ShadowWifiManager; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowWifiManager.class}) public class HotspotConditionControllerTest { private static final String WIFI_AP_SSID = "Test Hotspot"; + @Mock + private WifiManager mWifiManager; @Mock private ConditionManager mConditionManager; @@ -48,12 +51,14 @@ public class HotspotConditionControllerTest { @Before public void setUp() { - mContext = RuntimeEnvironment.application; + MockitoAnnotations.initMocks(this); + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); + mController = new HotspotConditionController(mContext, mConditionManager); } @Test - @Ignore public void buildContextualCard_hasWifiAp_shouldHaveWifiApSsid() { setupSoftApConfiguration(); @@ -63,7 +68,6 @@ public class HotspotConditionControllerTest { } @Test - @Ignore public void buildContextualCard_noWifiAp_shouldHaveEmptySsid() { final ContextualCard card = mController.buildContextualCard(); @@ -73,6 +77,6 @@ public class HotspotConditionControllerTest { private void setupSoftApConfiguration() { final SoftApConfiguration wifiApConfig = new SoftApConfiguration.Builder() .setSsid(WIFI_AP_SSID).build(); - mContext.getSystemService(WifiManager.class).setSoftApConfiguration(wifiApConfig); + when(mWifiManager.getSoftApConfiguration()).thenReturn(wifiApConfig); } } From 238639c494164de9ba02ea0cdd2a3315b7ab0822 Mon Sep 17 00:00:00 2001 From: menghanli Date: Wed, 19 Jan 2022 09:29:13 +0800 Subject: [PATCH 5/6] Allow users dismiss accessibility quick settings tooltips when clicked Problem: When Talkback on, users cannot use double tap or swipe to move focus on the next window. Solution: Talkback speaks out "double tap to dismiss" to allow dismissing this tooltips. Bug: 215656141 Test: make RunSettingsRoboTests ROBOTEST_FILTER=AccessibilityQuickSettingsTooltipWindowTest Change-Id: I8f7066a805ec963f9f0f8fee1b81ad008418c4a6 --- res/values/strings.xml | 2 + ...cessibilityQuickSettingsTooltipWindow.java | 28 +++++++++- ...ibilityQuickSettingsTooltipWindowTest.java | 55 ++++++++++++------- 3 files changed, 65 insertions(+), 20 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index ec72321ced8..b75ede4599c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5481,6 +5481,8 @@ Open %1$s Swipe down to quickly turn %1$s on or off in quick settings + + Dismiss Use color correction diff --git a/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java b/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java index a4986a0beb2..f24934fbbd1 100644 --- a/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java +++ b/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindow.java @@ -19,10 +19,14 @@ package com.android.settings.accessibility; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.ColorDrawable; +import android.os.Bundle; import android.os.Handler; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.view.View.AccessibilityDelegate; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; @@ -49,6 +53,25 @@ public class AccessibilityQuickSettingsTooltipWindow extends PopupWindow { this.mContext = context; } + private final AccessibilityDelegate mAccessibilityDelegate = new AccessibilityDelegate() { + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(host, info); + final AccessibilityAction clickAction = new AccessibilityAction( + AccessibilityNodeInfo.ACTION_CLICK, + mContext.getString(R.string.accessibility_quick_settings_tooltips_dismiss)); + info.addAction(clickAction); + } + + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (action == AccessibilityNodeInfo.ACTION_CLICK) { + dismiss(); + return true; + } + return super.performAccessibilityAction(host, action, args); + } + }; /** * Sets up {@link #AccessibilityQuickSettingsTooltipWindow}'s layout and content. * @@ -74,13 +97,16 @@ public class AccessibilityQuickSettingsTooltipWindow extends PopupWindow { final LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class); final View popupView = inflater.inflate(R.layout.accessibility_qs_tooltips, /* root= */ null); + popupView.setFocusable(/* focusable= */ true); + popupView.setAccessibilityDelegate(mAccessibilityDelegate); setContentView(popupView); + final TextView textView = getContentView().findViewById(R.id.qs_content); textView.setText(text); - setWidth(getWindowWidthWith(textView)); setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); setFocusable(/* focusable= */ true); + setOutsideTouchable(/* touchable= */ true); } /** diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java index f1e1121b78e..be67977c520 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsTooltipWindowTest.java @@ -22,6 +22,7 @@ import static org.mockito.Mockito.verify; import android.content.Context; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.PopupWindow; import androidx.test.core.app.ApplicationProvider; @@ -53,52 +54,68 @@ public class AccessibilityQuickSettingsTooltipWindowTest { private static final String TEST_PACKAGE_NAME = "com.test.package"; private final Context mContext = ApplicationProvider.getApplicationContext(); - private AccessibilityQuickSettingsTooltipWindow mToolTipView; + private AccessibilityQuickSettingsTooltipWindow mTooltipView; private View mView; @Before public void setUp() { - mToolTipView = new AccessibilityQuickSettingsTooltipWindow(mContext); + mTooltipView = new AccessibilityQuickSettingsTooltipWindow(mContext); mView = new View(RuntimeEnvironment.application); } @Test - public void initToolTipView_atMostAvailableTextWidth() { + public void initTooltipView_atMostAvailableTextWidth() { final String quickSettingsTooltipsContent = mContext.getString( R.string.accessibility_service_quick_settings_tooltips_content, TEST_PACKAGE_NAME); - mToolTipView.setup(quickSettingsTooltipsContent); + mTooltipView.setup(quickSettingsTooltipsContent); - final int getMaxWidth = mToolTipView.getAvailableWindowWidth(); - assertThat(mToolTipView.getWidth()).isAtMost(getMaxWidth); + final int getMaxWidth = mTooltipView.getAvailableWindowWidth(); + assertThat(mTooltipView.getWidth()).isAtMost(getMaxWidth); } @Test - public void showToolTipView_success() { - mToolTipView.setup(TEST_PACKAGE_NAME); + public void showTooltipView_success() { + mTooltipView.setup(TEST_PACKAGE_NAME); assertThat(getLatestPopupWindow()).isNull(); - mToolTipView.showAtTopCenter(mView); + mTooltipView.showAtTopCenter(mView); - assertThat(getLatestPopupWindow()).isSameInstanceAs(mToolTipView); + assertThat(getLatestPopupWindow()).isSameInstanceAs(mTooltipView); } @Test - public void dismiss_toolTipViewShown_shouldInvokeCallbackAndNotShowing() { - mToolTipView.setup(TEST_PACKAGE_NAME); - mToolTipView.setOnDismissListener(mMockOnDismissListener); - mToolTipView.showAtTopCenter(mView); + public void accessibilityClickActionOnTooltipViewShown_shouldInvokeCallbackAndNotShowing() { + mTooltipView.setup(TEST_PACKAGE_NAME); + mTooltipView.setOnDismissListener(mMockOnDismissListener); + mTooltipView.showAtTopCenter(mView); - mToolTipView.dismiss(); + final boolean isActionPerformed = + mTooltipView.getContentView().performAccessibilityAction( + AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK.getId(), + /* arguments= */ null); + + assertThat(isActionPerformed).isTrue(); + verify(mMockOnDismissListener).onDismiss(); + assertThat(getLatestPopupWindow().isShowing()).isFalse(); + } + + @Test + public void dismiss_tooltipViewShown_shouldInvokeCallbackAndNotShowing() { + mTooltipView.setup(TEST_PACKAGE_NAME); + mTooltipView.setOnDismissListener(mMockOnDismissListener); + mTooltipView.showAtTopCenter(mView); + + mTooltipView.dismiss(); verify(mMockOnDismissListener).onDismiss(); assertThat(getLatestPopupWindow().isShowing()).isFalse(); } @Test - public void waitAutoCloseDelayTime_toolTipViewShown_shouldInvokeCallbackAndNotShowing() { - mToolTipView.setup(TEST_PACKAGE_NAME, /* closeDelayTimeMillis= */ 1); - mToolTipView.setOnDismissListener(mMockOnDismissListener); - mToolTipView.showAtTopCenter(mView); + public void waitAutoCloseDelayTime_tooltipViewShown_shouldInvokeCallbackAndNotShowing() { + mTooltipView.setup(TEST_PACKAGE_NAME, /* closeDelayTimeMillis= */ 1); + mTooltipView.setOnDismissListener(mMockOnDismissListener); + mTooltipView.showAtTopCenter(mView); ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); From 4b90c57e99b1eeb0e60bdaff54bbb977a43a1bd4 Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Sat, 22 Jan 2022 00:50:22 +0800 Subject: [PATCH 6/6] =?UTF-8?q?New=20feature=20=E2=80=9CText=20and=20readi?= =?UTF-8?q?ng=20options=E2=80=9D=20for=20SetupWizard,=20Wallpaper,=20and?= =?UTF-8?q?=20Settings=20(7/n).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add new preview mail content layout, but all new strings are not final version. Bug: 211503117 Test: make Change-Id: If57e1fd3ba9a994f5175a18bccd1abb77f7d6a34 --- ...lity_text_reading_preview_mail_content.xml | 45 +++++++++++++++++++ res/values/strings.xml | 6 +++ 2 files changed, 51 insertions(+) create mode 100644 res/layout/accessibility_text_reading_preview_mail_content.xml diff --git a/res/layout/accessibility_text_reading_preview_mail_content.xml b/res/layout/accessibility_text_reading_preview_mail_content.xml new file mode 100644 index 00000000000..7b50ac10e93 --- /dev/null +++ b/res/layout/accessibility_text_reading_preview_mail_content.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 5fec077ec94..d739f5a5b4e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5218,6 +5218,12 @@ About %1$s Text and reading options + + Email: Plans for time machine, v2 + + From: bill@email.com + + Good morning! Following up on our last conversation, I’d like to check in on the progress of your time machine development plan. Will you be able to have a prototype ready to demo at E3 this year? Options