diff --git a/res/layout/wifi_dpp_qrcode_generator_fragment.xml b/res/layout/wifi_dpp_qrcode_generator_fragment.xml index f70abd54697..6df56c62692 100644 --- a/res/layout/wifi_dpp_qrcode_generator_fragment.xml +++ b/res/layout/wifi_dpp_qrcode_generator_fragment.xml @@ -62,7 +62,8 @@ android:focusable="true" android:longClickable="true" android:textAppearance="@android:style/TextAppearance.Material.Body1" - android:textColor="?android:attr/textColorSecondary"/> + android:textColor="?android:attr/textColorSecondary" + android:typeface="monospace" /> diff --git a/res/values/config.xml b/res/values/config.xml index cd17ee0eb88..6d9d784cb84 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -387,6 +387,9 @@ true + + true + true diff --git a/res/values/strings.xml b/res/values/strings.xml index 860e1c8f6d7..efbc430be9a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11107,6 +11107,9 @@ Use %1$s\? + + %1$s on/off + Turn off diff --git a/res/xml/accounts_work_dashboard_settings_credman.xml b/res/xml/accounts_work_dashboard_settings_credman.xml index 44bdb52a915..c275b82140b 100644 --- a/res/xml/accounts_work_dashboard_settings_credman.xml +++ b/res/xml/accounts_work_dashboard_settings_credman.xml @@ -22,6 +22,9 @@ android:title="@string/account_dashboard_title_with_passkeys" settings:keywords="@string/keywords_accounts"> + + @@ -43,6 +44,7 @@ diff --git a/src/com/android/settings/applications/AppCounter.java b/src/com/android/settings/applications/AppCounter.java index 2b1e47eaf23..bc752e94fd7 100644 --- a/src/com/android/settings/applications/AppCounter.java +++ b/src/com/android/settings/applications/AppCounter.java @@ -72,8 +72,7 @@ public abstract class AppCounter extends AsyncTask { } private boolean isArchivingEnabled() { - return mFf.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false) - || Flags.appArchiving(); + return mFf.archiving() || Flags.appArchiving(); } @Override diff --git a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java index 47beeb66e21..a92b755331c 100644 --- a/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java +++ b/src/com/android/settings/applications/credentials/CredentialManagerPreferenceController.java @@ -1072,6 +1072,22 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl return mChecked; } + @Override + public void setTitle(@Nullable CharSequence title) { + super.setTitle(title); + maybeUpdateContentDescription(); + } + + private void maybeUpdateContentDescription() { + final CharSequence appName = getTitle(); + + if (mSwitch != null && !TextUtils.isEmpty(appName)) { + mSwitch.setContentDescription( + getContext().getString( + R.string.credman_on_off_switch_content_description, appName)); + } + } + public void setPreferenceListener(OnCombiPreferenceClickListener onClickListener) { mOnClickListener = onClickListener; } @@ -1094,6 +1110,9 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl // Store this for later. mSwitch = switchView; + + // Update the content description. + maybeUpdateContentDescription(); } super.setOnPreferenceClickListener( diff --git a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java index 84459e057ab..4a45ea4ed06 100644 --- a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java +++ b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java @@ -129,6 +129,7 @@ public class PrimaryProviderPreference extends GearPreference { } }); setVisibility(mOpenButton, mOpenButtonVisible); + holder.itemView.setClickable(false); mChangeButton = (Button) holder.findViewById(R.id.change_button); mChangeButton.setOnClickListener( diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java index f75d301ad22..dc7d4dcac26 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingController.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java @@ -448,7 +448,7 @@ public class BluetoothPairingController implements OnCheckedChangeListener, switch (mType) { case BluetoothDevice.PAIRING_VARIANT_PASSKEY_CONFIRMATION: case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PASSKEY: - return String.format(Locale.US, "%06d", passkey); + return String.format(Locale.getDefault(), "%06d", passkey); case BluetoothDevice.PAIRING_VARIANT_DISPLAY_PIN: return String.format("%04d", passkey); diff --git a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java index 3bf9db33321..01ced4ea197 100644 --- a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java +++ b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java @@ -43,6 +43,9 @@ public class EraseEuiccDataDialogFragment extends InstrumentedDialogFragment imp "com.android.settings.network"; public static void show(ResetDashboardFragment host) { + if (host.getActivity() == null) { + return; + } final EraseEuiccDataDialogFragment dialog = new EraseEuiccDataDialogFragment(); dialog.setTargetFragment(host, 0 /* requestCode */); final FragmentManager manager = host.getActivity().getSupportFragmentManager(); diff --git a/src/com/android/settings/network/EuiccRacConnectivityDialogFragment.java b/src/com/android/settings/network/EuiccRacConnectivityDialogFragment.java index 76a587e679f..663631ff51a 100644 --- a/src/com/android/settings/network/EuiccRacConnectivityDialogFragment.java +++ b/src/com/android/settings/network/EuiccRacConnectivityDialogFragment.java @@ -33,14 +33,25 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import com.android.settings.R; -import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.overlay.FeatureFactory; import com.android.settings.system.ResetDashboardFragment; +import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; +import com.android.settingslib.core.lifecycle.ObservableDialogFragment; -public class EuiccRacConnectivityDialogFragment extends InstrumentedDialogFragment - implements DialogInterface.OnClickListener { +public class EuiccRacConnectivityDialogFragment extends ObservableDialogFragment + implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener { public static final String TAG = "EuiccRacConnectivityDlg"; + private static final int METRICS_TAG = + SettingsEnums.ACTION_RESET_ESIMS_RAC_CONNECTIVITY_WARNING; + private static final int METRICS_CANCEL_VALUE = 0; + private static final int METRICS_CONTINUE_VALUE = 1; + + private MetricsFeatureProvider mMetricsFeatureProvider; static void show(ResetDashboardFragment host) { + if (host.getActivity() == null) { + return; + } final EuiccRacConnectivityDialogFragment dialog = new EuiccRacConnectivityDialogFragment(); dialog.setTargetFragment(host, /* requestCode= */ 0); final FragmentManager manager = host.getActivity().getSupportFragmentManager(); @@ -48,8 +59,9 @@ public class EuiccRacConnectivityDialogFragment extends InstrumentedDialogFragme } @Override - public int getMetricsCategory() { - return SettingsEnums.RESET_EUICC; + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider(); } @NonNull @@ -62,7 +74,7 @@ public class EuiccRacConnectivityDialogFragment extends InstrumentedDialogFragme new AlertDialog.Builder(getContext()) .setOnDismissListener(this) // Return is on the right side - .setPositiveButton(R.string.wifi_warning_return_button, null) + .setPositiveButton(R.string.wifi_warning_return_button, this) // Continue is on the left side .setNegativeButton(R.string.wifi_warning_continue_button, this); @@ -109,7 +121,24 @@ public class EuiccRacConnectivityDialogFragment extends InstrumentedDialogFragme // Positions of the buttons have been switch: // negative button = left button = the button to continue if (which == DialogInterface.BUTTON_NEGATIVE) { + logMetrics(METRICS_CONTINUE_VALUE); EraseEuiccDataDialogFragment.show(((ResetDashboardFragment) fragment)); + } else { + logMetrics(METRICS_CANCEL_VALUE); } } + + @Override + public void onCancel(@NonNull DialogInterface dialog) { + final Fragment fragment = getTargetFragment(); + if (!(fragment instanceof ResetDashboardFragment)) { + Log.e(TAG, "getTargetFragment return unexpected type"); + return; + } + logMetrics(METRICS_CANCEL_VALUE); + } + + private void logMetrics(int value) { + mMetricsFeatureProvider.action(getActivity(), METRICS_TAG, value); + } } diff --git a/src/com/android/settings/network/InternetPreferenceController.java b/src/com/android/settings/network/InternetPreferenceController.java index 1f5042fc917..aed44d531e5 100644 --- a/src/com/android/settings/network/InternetPreferenceController.java +++ b/src/com/android/settings/network/InternetPreferenceController.java @@ -180,7 +180,7 @@ public class InternetPreferenceController extends AbstractPreferenceController i @Override public boolean isAvailable() { - return true; + return mContext.getResources().getBoolean(R.bool.config_show_internet_settings); } @Override diff --git a/src/com/android/settings/network/NetworkMobileProviderController.java b/src/com/android/settings/network/NetworkMobileProviderController.java index e0db395caf4..8d9d353b736 100644 --- a/src/com/android/settings/network/NetworkMobileProviderController.java +++ b/src/com/android/settings/network/NetworkMobileProviderController.java @@ -24,7 +24,6 @@ import androidx.preference.PreferenceCategory; import androidx.preference.PreferenceScreen; import com.android.settings.core.BasePreferenceController; -import com.android.settings.wifi.WifiPickerTrackerHelper; import com.android.settingslib.core.lifecycle.Lifecycle; /** @@ -117,12 +116,6 @@ public class NetworkMobileProviderController extends BasePreferenceController im mPreferenceCategory.setVisible(available); } - public void setWifiPickerTrackerHelper(WifiPickerTrackerHelper helper) { - if (mSubscriptionsController != null) { - mSubscriptionsController.setWifiPickerTrackerHelper(helper); - } - } - /** * Hides the preference. */ diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java index 0bc426c9887..6abe52bb5b4 100644 --- a/src/com/android/settings/network/NetworkProviderSettings.java +++ b/src/com/android/settings/network/NetworkProviderSettings.java @@ -295,6 +295,12 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); + final Context context = getContext(); + if (context != null && !context.getResources().getBoolean( + R.bool.config_show_internet_settings)) { + finish(); + return; + } mAirplaneModeEnabler = new AirplaneModeEnabler(getContext(), this); // TODO(b/37429702): Add animations and preference comparator back after initial screen is @@ -477,10 +483,6 @@ public class NetworkProviderSettings extends RestrictedSettingsFragment mOpenSsid = intent.getStringExtra(EXTRA_START_CONNECT_SSID); } - if (mNetworkMobileProviderController != null) { - mNetworkMobileProviderController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper); - } - requireActivity().addMenuProvider(mMenuProvider); } diff --git a/src/com/android/settings/network/SubscriptionsPreferenceController.java b/src/com/android/settings/network/SubscriptionsPreferenceController.java index 09ce02ee194..d9a64646aef 100644 --- a/src/com/android/settings/network/SubscriptionsPreferenceController.java +++ b/src/com/android/settings/network/SubscriptionsPreferenceController.java @@ -68,6 +68,7 @@ import com.android.settingslib.mobile.MobileMappings.Config; import com.android.settingslib.mobile.TelephonyIcons; import com.android.settingslib.net.SignalStrengthUtil; import com.android.wifitrackerlib.WifiEntry; +import com.android.wifitrackerlib.WifiPickerTracker; import java.util.Collections; import java.util.List; @@ -82,7 +83,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl LifecycleObserver, SubscriptionsChangeListener.SubscriptionsChangeListenerClient, MobileDataEnabledListener.Client, DataConnectivityListener.Client, SignalStrengthListener.Callback, TelephonyDisplayInfoListener.Callback, - TelephonyCallback.CarrierNetworkListener { + TelephonyCallback.CarrierNetworkListener, WifiPickerTracker.WifiPickerTrackerCallback { private static final String TAG = "SubscriptionsPrefCntrlr"; private UpdateListener mUpdateListener; @@ -95,7 +96,8 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl private DataConnectivityListener mConnectivityListener; private SignalStrengthListener mSignalStrengthListener; private TelephonyDisplayInfoListener mTelephonyDisplayInfoListener; - private WifiPickerTrackerHelper mWifiPickerTrackerHelper; + @VisibleForTesting + WifiPickerTrackerHelper mWifiPickerTrackerHelper; private final WifiManager mWifiManager; private boolean mCarrierNetworkChangeMode; @@ -163,6 +165,7 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl mSignalStrengthListener = new SignalStrengthListener(context, this); mTelephonyDisplayInfoListener = new TelephonyDisplayInfoListener(context, this); lifecycle.addObserver(this); + mWifiPickerTrackerHelper = new WifiPickerTrackerHelper(lifecycle, context, this); mSubsPrefCtrlInjector = createSubsPrefCtrlInjector(); mConfig = mSubsPrefCtrlInjector.getConfig(mContext); } @@ -485,8 +488,24 @@ public class SubscriptionsPreferenceController extends AbstractPreferenceControl update(); } - public void setWifiPickerTrackerHelper(WifiPickerTrackerHelper helper) { - mWifiPickerTrackerHelper = helper; + @Override + public void onNumSavedNetworksChanged() { + //Do nothing + } + + @Override + public void onNumSavedSubscriptionsChanged() { + //Do nothing + } + + @Override + public void onWifiStateChanged() { + update(); + } + + @Override + public void onWifiEntriesChanged() { + update(); } @VisibleForTesting diff --git a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java index 03ce7f66dc8..024fb834968 100644 --- a/src/com/android/settings/network/telephony/DefaultSubscriptionController.java +++ b/src/com/android/settings/network/telephony/DefaultSubscriptionController.java @@ -116,8 +116,6 @@ public abstract class DefaultSubscriptionController extends TelephonyBasePrefere public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); - // Set a summary placeholder to reduce flicker. - mPreference.setSummaryProvider(pref -> mContext.getString(R.string.summary_placeholder)); updateEntries(); } diff --git a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt index 2fd8fc59edf..f38dd96ef98 100644 --- a/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt +++ b/src/com/android/settings/spa/app/appinfo/AppInfoSettings.kt @@ -179,5 +179,4 @@ private fun AppInfoSettings(packageInfoPresenter: PackageInfoPresenter) { } fun isArchivingEnabled(featureFlags: PmFeatureFlags) = - featureFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false) - || Flags.appArchiving() \ No newline at end of file + featureFlags.archiving() || Flags.appArchiving() \ No newline at end of file diff --git a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt index 86d7f445090..7a45ed4ea2f 100644 --- a/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt +++ b/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreference.kt @@ -93,8 +93,7 @@ fun HibernationSwitchPreference( } private fun isArchivingEnabled() = - PmFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false) - || Flags.appArchiving() + PmFlags.archiving() || Flags.appArchiving() private class HibernationSwitchPresenter(context: Context, private val app: ApplicationInfo) { private val appOpsManager = context.appOpsManager diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java index 210e94cb13b..3d437e22e7d 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java @@ -26,7 +26,6 @@ import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.provider.Settings; -import android.text.InputType; import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; @@ -120,8 +119,6 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment { final String password = wifiNetworkConfig.getPreSharedKey(); TextView passwordView = view.findViewById(R.id.password); - passwordView.setInputType( - InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); if (TextUtils.isEmpty(password)) { mSummary.setText(getString( R.string.wifi_dpp_scan_open_network_qr_code_with_another_device, diff --git a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeUnmountTest.java b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeUnmountTest.java index 4704475bb94..9425d08a2bc 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeUnmountTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/PrivateVolumeUnmountTest.java @@ -30,19 +30,23 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import org.robolectric.android.util.concurrent.PausedExecutorService; import org.robolectric.annotation.Config; -import org.robolectric.annotation.LooperMode; +import org.robolectric.shadows.ShadowLooper; +import org.robolectric.shadows.ShadowPausedAsyncTask; import org.robolectric.shadows.androidx.fragment.FragmentController; @RunWith(RobolectricTestRunner.class) -@LooperMode(LooperMode.Mode.LEGACY) @Config(shadows = ShadowStorageManager.class) public class PrivateVolumeUnmountTest { private PrivateVolumeUnmount mFragment; + private PausedExecutorService mExecutorService; @Before public void setUp() { + mExecutorService = new PausedExecutorService(); + ShadowPausedAsyncTask.overrideExecutor(mExecutorService); Bundle bundle = new Bundle(); bundle.putString(VolumeInfo.EXTRA_VOLUME_ID, "id"); mFragment = FragmentController.of(new PrivateVolumeUnmount(), bundle) @@ -65,6 +69,8 @@ public class PrivateVolumeUnmountTest { final Button confirm = mFragment.getView().findViewById(R.id.confirm); confirm.performClick(); + mExecutorService.runAll(); + ShadowLooper.idleMainLooper(); assertThat(ShadowStorageManager.isUnmountCalled()).isTrue(); } diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceControllerTest.java index 1a16d04812b..dc61455560e 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterpriseSetDefaultAppsListPreferenceControllerTest.java @@ -37,6 +37,7 @@ import android.os.UserHandle; import androidx.preference.Preference; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; @@ -46,23 +47,27 @@ import com.android.settings.testutils.ApplicationTestUtils; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.LooperMode; -import org.robolectric.shadows.ShadowApplication; +import org.robolectric.android.util.concurrent.PausedExecutorService; +import org.robolectric.shadows.ShadowLooper; +import org.robolectric.shadows.ShadowPausedAsyncTask; import java.util.Arrays; import java.util.Collections; @RunWith(RobolectricTestRunner.class) -@LooperMode(LooperMode.Mode.LEGACY) public class EnterpriseSetDefaultAppsListPreferenceControllerTest { + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + private static final int USER_ID = 0; private static final int APP_UID = 0; @@ -82,11 +87,13 @@ public class EnterpriseSetDefaultAppsListPreferenceControllerTest { private Context mContext; private FakeFeatureFactory mFeatureFactory; + private PausedExecutorService mExecutorService; @Before public void setUp() { - MockitoAnnotations.initMocks(this); - mContext = spy(RuntimeEnvironment.application); + mExecutorService = new PausedExecutorService(); + ShadowPausedAsyncTask.overrideExecutor(mExecutorService); + mContext = spy(ApplicationProvider.getApplicationContext()); mFeatureFactory = FakeFeatureFactory.setupForTest(); when(mFragment.getPreferenceScreen()).thenReturn(mScreen); when(mPrefenceManager.getContext()).thenReturn(mContext); @@ -127,7 +134,8 @@ public class EnterpriseSetDefaultAppsListPreferenceControllerTest { new UserAppInfo(user, appInfo2))); new EnterpriseSetDefaultAppsListPreferenceController(mContext, mFragment, mPackageManager); - ShadowApplication.runBackgroundTasks(); + mExecutorService.runAll(); + ShadowLooper.idleMainLooper(); ArgumentCaptor apps = ArgumentCaptor.forClass(Preference.class); verify(mScreen, times(2)).addPreference(apps.capture()); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java index b025db8d551..7faca0d0960 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessManagerTest.java @@ -41,19 +41,24 @@ import android.os.RemoteException; import android.os.UserManager; import android.text.format.DateUtils; +import androidx.test.core.app.ApplicationProvider; + import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.LooperMode; +import org.robolectric.android.util.concurrent.PausedExecutorService; +import org.robolectric.shadows.ShadowLooper; +import org.robolectric.shadows.ShadowPausedAsyncTask; import java.util.ArrayList; import java.util.Collections; @@ -65,10 +70,14 @@ import java.util.function.Supplier; @RunWith(RobolectricTestRunner.class) public final class DataProcessManagerTest { + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + private static final String FAKE_ENTRY_KEY = "fake_entry_key"; private Context mContext; private DataProcessManager mDataProcessManager; + private PausedExecutorService mExecutorService; @Mock private UserIdsSeries mUserIdsSeries; @Mock private IUsageStatsManager mUsageStatsManager; @@ -80,9 +89,9 @@ public final class DataProcessManagerTest { @Before public void setUp() { - MockitoAnnotations.initMocks(this); - - mContext = spy(RuntimeEnvironment.application); + mExecutorService = new PausedExecutorService(); + ShadowPausedAsyncTask.overrideExecutor(mExecutorService); + mContext = spy(ApplicationProvider.getApplicationContext()); DataProcessor.sTestSystemAppsPackageNames = Set.of(); DataProcessor.sUsageStatsManager = mUsageStatsManager; doReturn(mContext).when(mContext).getApplicationContext(); @@ -117,7 +126,6 @@ public final class DataProcessManagerTest { } @Test - @LooperMode(LooperMode.Mode.LEGACY) public void constructor_noLevelData() { final DataProcessManager dataProcessManager = new DataProcessManager( @@ -129,7 +137,6 @@ public final class DataProcessManagerTest { } @Test - @LooperMode(LooperMode.Mode.LEGACY) public void start_loadEmptyDatabaseAppUsageData() { final MatrixCursor cursor = new MatrixCursor( @@ -142,6 +149,8 @@ public final class DataProcessManagerTest { doReturn(true).when(mUserManager).isUserUnlocked(anyInt()); mDataProcessManager.start(); + mExecutorService.runAll(); + ShadowLooper.idleMainLooper(); assertThat(mDataProcessManager.getIsCurrentAppUsageLoaded()).isTrue(); assertThat(mDataProcessManager.getIsDatabaseAppUsageLoaded()).isTrue(); @@ -152,7 +161,6 @@ public final class DataProcessManagerTest { } @Test - @LooperMode(LooperMode.Mode.LEGACY) public void start_loadExpectedAppUsageData() throws RemoteException { final List hourlyBatteryLevelsPerDay = new ArrayList<>(); @@ -254,6 +262,8 @@ public final class DataProcessManagerTest { hourlyBatteryLevelsPerDay, /* batteryHistoryMap= */ new HashMap<>()); dataProcessManager.start(); + mExecutorService.runAll(); + ShadowLooper.idleMainLooper(); assertThat(dataProcessManager.getIsCurrentAppUsageLoaded()).isTrue(); assertThat(dataProcessManager.getIsDatabaseAppUsageLoaded()).isTrue(); @@ -301,7 +311,6 @@ public final class DataProcessManagerTest { } @Test - @LooperMode(LooperMode.Mode.LEGACY) public void start_currentUserLocked_emptyAppUsageList() throws RemoteException { final UsageEvents.Event event = getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /* timestamp= */ 1, "package"); @@ -323,6 +332,8 @@ public final class DataProcessManagerTest { DatabaseUtils.sFakeSupplier = () -> cursor; mDataProcessManager.start(); + mExecutorService.runAll(); + ShadowLooper.idleMainLooper(); assertThat(mDataProcessManager.getAppUsageEventList()).isEmpty(); assertThat(mDataProcessManager.getAppUsagePeriodMap()).isNull(); @@ -330,7 +341,6 @@ public final class DataProcessManagerTest { } @Test - @LooperMode(LooperMode.Mode.LEGACY) public void getBatteryLevelData_emptyHistoryMap_returnNull() { assertThat( DataProcessManager.getBatteryLevelData( diff --git a/tests/robotests/src/com/android/settings/network/EuiccRacConnectivityDialogFragmentTest.java b/tests/robotests/src/com/android/settings/network/EuiccRacConnectivityDialogFragmentTest.java new file mode 100644 index 00000000000..3a4ba6e2b73 --- /dev/null +++ b/tests/robotests/src/com/android/settings/network/EuiccRacConnectivityDialogFragmentTest.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 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.network; + +import static org.mockito.Mockito.verify; + +import android.app.settings.SettingsEnums; +import android.content.DialogInterface; + +import com.android.settings.system.ResetDashboardFragment; +import com.android.settings.testutils.FakeFeatureFactory; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.shadows.androidx.fragment.FragmentController; + +@RunWith(RobolectricTestRunner.class) +public class EuiccRacConnectivityDialogFragmentTest { + private static final int CONTINUE_VALUE = 1; + private static final int CANCEL_VALUE = 0; + + private EuiccRacConnectivityDialogFragment mRacDialogFragment; + private FakeFeatureFactory mFeatureFactory; + @Mock private DialogInterface mDialogInterface; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mFeatureFactory = FakeFeatureFactory.setupForTest(); + mRacDialogFragment = new EuiccRacConnectivityDialogFragment(); + + FragmentController.setupFragment(mRacDialogFragment); + mRacDialogFragment.setTargetFragment(new ResetDashboardFragment(), /* requestCode= */ 0); + } + + @Test + public void dialogAction_continue_intentResetESIMS_metricsLogged() { + mRacDialogFragment.onClick(mDialogInterface, DialogInterface.BUTTON_NEGATIVE); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mRacDialogFragment.getActivity(), + SettingsEnums.ACTION_RESET_ESIMS_RAC_CONNECTIVITY_WARNING, + CONTINUE_VALUE); + } + + @Test + public void dialogAction_backCancel_intentResetESIMS_metricsLogged() { + mRacDialogFragment.onCancel(mDialogInterface); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mRacDialogFragment.getActivity(), + SettingsEnums.ACTION_RESET_ESIMS_RAC_CONNECTIVITY_WARNING, + CANCEL_VALUE); + } + + @Test + public void dialogAction_buttonCancel_intentResetESIMS_metricsLogged() { + mRacDialogFragment.onCancel(mDialogInterface); + verify(mFeatureFactory.metricsFeatureProvider) + .action( + mRacDialogFragment.getActivity(), + SettingsEnums.ACTION_RESET_ESIMS_RAC_CONNECTIVITY_WARNING, + CANCEL_VALUE); + } +} diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt index b61e3a9fd7c..a0be3f2498a 100644 --- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt +++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/HibernationSwitchPreferenceTest.kt @@ -163,8 +163,7 @@ class HibernationSwitchPreferenceTest { } private fun isArchivingEnabled() = - PmFlags.archiving() || SystemProperties.getBoolean("pm.archiving.enabled", false) - || Flags.appArchiving() + PmFlags.archiving() || Flags.appArchiving() @Test fun `An app targets Q with ops mode default when hibernation targets pre S - not exempted`() { mockOpsMode(MODE_DEFAULT) diff --git a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java index 4ba12cbd769..8a4acd28f38 100644 --- a/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/InternetPreferenceControllerTest.java @@ -49,6 +49,7 @@ import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.android.settings.R; import com.android.settings.testutils.ResourcesUtils; import com.android.settings.wifi.WifiPickerTrackerHelper; import com.android.settings.wifi.WifiSummaryUpdater; @@ -188,8 +189,9 @@ public class InternetPreferenceControllerTest { } @Test - public void isAvailable_shouldBeTrue() { - assertThat(mController.isAvailable()).isTrue(); + public void isAvailable_shouldMatchPrefFlag() { + assertThat(mController.isAvailable()).isEqualTo( + mContext.getResources().getBoolean(R.bool.config_show_internet_settings)); } @Test diff --git a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java index 58a3f3a1d85..c443b230f5f 100644 --- a/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/network/SubscriptionsPreferenceControllerTest.java @@ -165,7 +165,7 @@ public class SubscriptionsPreferenceControllerTest { mController = new FakeSubscriptionsPreferenceController(mContext, mLifecycle, mUpdateListener, KEY, 5); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0); - mController.setWifiPickerTrackerHelper(mWifiPickerTrackerHelper); + mController.mWifiPickerTrackerHelper = mWifiPickerTrackerHelper; } @After diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java index 8a7bd70e0ed..499cd934fb1 100644 --- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java +++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceAuthenticationActivityTest.java @@ -18,6 +18,7 @@ package com.android.settings.privatespace; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.spy; @@ -27,6 +28,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; import android.os.Flags; +import android.os.UserManager; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; @@ -91,6 +93,7 @@ public class PrivateSpaceAuthenticationActivityTest { @RequiresFlagsEnabled({Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES}) public void whenPrivateProfileDoesNotExist_triggersSetupFlow() { + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); when(mPrivateSpaceMaintainer.doesPrivateSpaceExist()).thenReturn(false); final ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); diff --git a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java index f75e76f31b3..637b4857ce5 100644 --- a/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java +++ b/tests/unit/src/com/android/settings/privatespace/PrivateSpaceMaintainerTest.java @@ -81,6 +81,7 @@ public class PrivateSpaceMaintainerTest { public void deletePrivateSpace_psExists_deletesPS() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.createPrivateSpace(); @@ -114,6 +115,7 @@ public class PrivateSpaceMaintainerTest { public void createPrivateSpace_psDoesNotExist_createsPS() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.deletePrivateSpace(); @@ -129,6 +131,7 @@ public class PrivateSpaceMaintainerTest { public void createPrivateSpace_psExists_returnsFalse() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.deletePrivateSpace(); @@ -145,6 +148,7 @@ public class PrivateSpaceMaintainerTest { public void createPrivateSpace_psDoesNotExist_resetsHidePSSettings() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); Settings.Secure.putInt( @@ -168,6 +172,7 @@ public class PrivateSpaceMaintainerTest { Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ENABLE_PS_SENSITIVE_NOTIFICATIONS_TOGGLE, android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.deletePrivateSpace(); @@ -185,6 +190,7 @@ public class PrivateSpaceMaintainerTest { public void createPrivateSpace_psExists_doesNotResetHidePSSettings() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.createPrivateSpace(); @@ -230,6 +236,7 @@ public class PrivateSpaceMaintainerTest { public void lockPrivateSpace_psExistsAndPrivateProfileRunning_locksCreatedPrivateSpace() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.createPrivateSpace(); @@ -248,6 +255,7 @@ public class PrivateSpaceMaintainerTest { public void lockPrivateSpace_psExistsAndPrivateProfileNotRunning_returnsFalse() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.createPrivateSpace(); @@ -284,6 +292,7 @@ public class PrivateSpaceMaintainerTest { public void createPrivateSpace_psDoesNotExist_setsUserSetupComplete() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.createPrivateSpace(); @@ -298,6 +307,7 @@ public class PrivateSpaceMaintainerTest { public void createPrivateSpace_pSExists_doesNotChangeUserSetupSetting() { mSetFlagsRule.enableFlags( android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); privateSpaceMaintainer.createPrivateSpace(); @@ -316,6 +326,7 @@ public class PrivateSpaceMaintainerTest { Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE, android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); final int autoLockOption = 2; PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); @@ -340,6 +351,7 @@ public class PrivateSpaceMaintainerTest { Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_SUPPORT_AUTOLOCK_FOR_PRIVATE_SPACE, android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); final int privateSpaceAutLockValue = 1; PrivateSpaceMaintainer privateSpaceMaintainer = PrivateSpaceMaintainer.getInstance(mContext); diff --git a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java index ffc1edf0c28..d6eadd59780 100644 --- a/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java +++ b/tests/unit/src/com/android/settings/privatespace/delete/PrivateSpaceDeletionProgressFragmentTest.java @@ -20,6 +20,7 @@ import static com.android.settings.privatespace.PrivateSpaceMaintainer.ErrorDele import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assume.assumeTrue; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; @@ -28,6 +29,7 @@ import static org.mockito.Mockito.verify; import android.app.settings.SettingsEnums; import android.content.Context; import android.os.Flags; +import android.os.UserManager; import android.platform.test.flag.junit.SetFlagsRule; import androidx.test.annotation.UiThreadTest; @@ -90,6 +92,7 @@ public class PrivateSpaceDeletionProgressFragmentTest { doNothing().when(spyFragment).showSuccessfulDeletionToast(); mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); mPrivateSpaceMaintainer.createPrivateSpace(); spyFragment.deletePrivateSpace(); @@ -104,6 +107,7 @@ public class PrivateSpaceDeletionProgressFragmentTest { doNothing().when(spyFragment).showSuccessfulDeletionToast(); mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); mPrivateSpaceMaintainer.createPrivateSpace(); spyFragment.deletePrivateSpace(); @@ -128,6 +132,7 @@ public class PrivateSpaceDeletionProgressFragmentTest { doNothing().when(spyFragment).showDeletionInternalErrorToast(); mSetFlagsRule.enableFlags(Flags.FLAG_ALLOW_PRIVATE_PROFILE, android.multiuser.Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES); + assumeTrue(mContext.getSystemService(UserManager.class).canAddPrivateProfile()); spyFragment.deletePrivateSpace();