diff --git a/AndroidManifest.xml b/AndroidManifest.xml index c8c33a8b5be..7c44a8ffded 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -4054,6 +4054,20 @@ android:value="true"/> + + + + + + + + + + diff --git a/res/values/config.xml b/res/values/config.xml index 00117d7bda0..8b255e6bc7d 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -624,4 +624,10 @@ false + + + + @string/config_settingsintelligence_package_name + android.uid.system:1000 + diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index e12bc1cc76a..30d4a717087 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -126,6 +126,8 @@ import com.android.settings.notification.app.AppNotificationSettings; import com.android.settings.widget.LoadingViewController; import com.android.settings.wifi.AppStateChangeWifiStateBridge; import com.android.settings.wifi.ChangeWifiStateDetails; +import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.applications.AppIconCacheManager; import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState; @@ -776,7 +778,18 @@ public class ManageApplications extends InstrumentedFragment mShowSystem = !mShowSystem; mApplications.rebuild(); } else if (i == R.id.reset_app_preferences) { - mResetAppsHelper.buildResetDialog(); + final boolean appsControlDisallowedBySystem = + RestrictedLockUtilsInternal.hasBaseUserRestriction(getActivity(), + UserManager.DISALLOW_APPS_CONTROL, UserHandle.myUserId()); + final RestrictedLockUtils.EnforcedAdmin appsControlDisallowedAdmin = + RestrictedLockUtilsInternal.checkIfRestrictionEnforced(getActivity(), + UserManager.DISALLOW_APPS_CONTROL, UserHandle.myUserId()); + if (appsControlDisallowedAdmin != null && !appsControlDisallowedBySystem) { + RestrictedLockUtils.sendShowAdminSupportDetailsIntent( + getActivity(), appsControlDisallowedAdmin); + } else { + mResetAppsHelper.buildResetDialog(); + } return true; } else if (i == R.id.advanced) { if (mListType == LIST_TYPE_NOTIFICATION) { diff --git a/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java b/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java index b2636a63d30..dd06b679910 100644 --- a/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java +++ b/src/com/android/settings/bluetooth/BluetoothBroadcastDialog.java @@ -41,15 +41,18 @@ import com.android.settingslib.media.MediaOutputConstants; * nearby broadcast sources. */ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { + public static final String KEY_APP_LABEL = "app_label"; public static final String KEY_DEVICE_ADDRESS = BluetoothFindBroadcastsFragment.KEY_DEVICE_ADDRESS; + public static final String KEY_MEDIA_STREAMING = "media_streaming"; private static final String TAG = "BTBroadcastsDialog"; private static final CharSequence UNKNOWN_APP_LABEL = "unknown"; private Context mContext; private CharSequence mCurrentAppLabel = UNKNOWN_APP_LABEL; private String mDeviceAddress; + private boolean mIsMediaStreaming; private LocalBluetoothManager mLocalBluetoothManager; private AlertDialog mAlertDialog; @@ -59,6 +62,7 @@ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { mContext = getActivity(); mCurrentAppLabel = getActivity().getIntent().getCharSequenceExtra(KEY_APP_LABEL); mDeviceAddress = getActivity().getIntent().getStringExtra(KEY_DEVICE_ADDRESS); + mIsMediaStreaming = getActivity().getIntent().getBooleanExtra(KEY_MEDIA_STREAMING, false); mLocalBluetoothManager = Utils.getLocalBtManager(mContext); setShowsDialog(true); } @@ -75,16 +79,21 @@ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { mContext.getString(R.string.bluetooth_broadcast_dialog_broadcast_message)); Button broadcastBtn = layout.findViewById(com.android.settingslib.R.id.positive_btn); - if (TextUtils.isEmpty(mCurrentAppLabel)) { - broadcastBtn.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); - } else { - broadcastBtn.setText(mContext.getString( + if (isBroadcastSupported() && mIsMediaStreaming) { + broadcastBtn.setVisibility(View.VISIBLE); + if (TextUtils.isEmpty(mCurrentAppLabel)) { + broadcastBtn.setText(mContext.getString(R.string.bluetooth_broadcast_dialog_title)); + } else { + broadcastBtn.setText(mContext.getString( R.string.bluetooth_broadcast_dialog_broadcast_app, String.valueOf(mCurrentAppLabel))); + } + broadcastBtn.setOnClickListener((view) -> { + launchMediaOutputBroadcastDialog(); + }); + } else { + broadcastBtn.setVisibility(View.GONE); } - broadcastBtn.setOnClickListener((view) -> { - launchMediaOutputBroadcastDialog(); - }); Button findBroadcastBtn = layout.findViewById(com.android.settingslib.R.id.negative_btn); findBroadcastBtn.setText(mContext.getString(R.string.bluetooth_find_broadcast)); @@ -169,4 +178,10 @@ public class BluetoothBroadcastDialog extends InstrumentedDialogFragment { .setPackage(MediaOutputConstants.SETTINGS_PACKAGE_NAME) .setAction(MediaOutputConstants.ACTION_CLOSE_PANEL)); } + + boolean isBroadcastSupported() { + LocalBluetoothLeBroadcast broadcast = + mLocalBluetoothManager.getProfileManager().getLeAudioBroadcastProfile(); + return broadcast != null; + } } diff --git a/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java b/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java index dcf89ca9d0e..0253aa6b748 100644 --- a/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java +++ b/src/com/android/settings/bluetooth/QrCodeScanModeFragment.java @@ -36,16 +36,15 @@ import android.view.ViewOutlineProvider; import android.view.accessibility.AccessibilityEvent; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.StringRes; + import com.android.settings.core.InstrumentedFragment; import com.android.settingslib.R; import com.android.settingslib.bluetooth.BluetoothBroadcastUtils; import com.android.settingslib.bluetooth.BluetoothUtils; -import com.android.settingslib.core.lifecycle.ObservableFragment; import com.android.settingslib.qrcode.QrCamera; -import androidx.annotation.NonNull; -import androidx.annotation.StringRes; - public class QrCodeScanModeFragment extends InstrumentedFragment implements TextureView.SurfaceTextureListener, QrCamera.ScannerCallback { @@ -232,8 +231,7 @@ public class QrCodeScanModeFragment extends InstrumentedFragment implements } private void updateSummary() { - mSummary.setText(getString(R.string.bt_le_audio_scan_qr_code_scanner, - null /* broadcast_name*/));; + mSummary.setText(getString(R.string.bt_le_audio_scan_qr_code_scanner)); } @Override diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java index 0483aea861f..343ed24e0a1 100644 --- a/src/com/android/settings/development/qstile/DevelopmentTiles.java +++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java @@ -476,4 +476,77 @@ public abstract class DevelopmentTiles extends TileService { Settings.System.SHOW_TOUCHES, isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF); } } + + /** + * Tile to enable desktop mode + */ + public static class DesktopMode extends DevelopmentTiles { + + private static final int SETTING_VALUE_ON = 1; + private static final int SETTING_VALUE_OFF = 0; + private Context mContext; + + @Override + public void onCreate() { + super.onCreate(); + mContext = getApplicationContext(); + } + + @Override + protected boolean isEnabled() { + return Settings.System.getInt(mContext.getContentResolver(), + Settings.System.DESKTOP_MODE, SETTING_VALUE_OFF) == SETTING_VALUE_ON; + } + + private boolean isDesktopModeFlagEnabled() { + return SystemProperties.getBoolean("persist.wm.debug.desktop_mode", false); + } + + private boolean isFreeformFlagEnabled() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, SETTING_VALUE_OFF) + == SETTING_VALUE_ON; + } + + private boolean isCaptionOnShellEnabled() { + return SystemProperties.getBoolean("persist.wm.debug.caption_on_shell", false); + } + + @Override + protected void setIsEnabled(boolean isEnabled) { + if (isEnabled) { + // Check that all required features are enabled + if (!isDesktopModeFlagEnabled()) { + closeShade(); + showMessage( + "Enable 'Desktop Windowing Proto 1' from the Flag Flipper app"); + return; + } + if (!isCaptionOnShellEnabled()) { + closeShade(); + showMessage("Enable 'Captions in Shell' from the Flag Flipper app"); + return; + } + if (!isFreeformFlagEnabled()) { + closeShade(); + showMessage( + "Enable freeform windows from developer settings"); + return; + } + } + + Settings.System.putInt(mContext.getContentResolver(), + Settings.System.DESKTOP_MODE, + isEnabled ? SETTING_VALUE_ON : SETTING_VALUE_OFF); + closeShade(); + } + + private void closeShade() { + sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + } + + private void showMessage(String message) { + Toast.makeText(mContext, message, Toast.LENGTH_LONG).show(); + } + } } diff --git a/src/com/android/settings/notification/MediaVolumePreferenceController.java b/src/com/android/settings/notification/MediaVolumePreferenceController.java index 05c8e033930..2466b7747a3 100644 --- a/src/com/android/settings/notification/MediaVolumePreferenceController.java +++ b/src/com/android/settings/notification/MediaVolumePreferenceController.java @@ -29,6 +29,7 @@ import androidx.core.graphics.drawable.IconCompat; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; +import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.bluetooth.BluetoothBroadcastDialog; @@ -90,13 +91,16 @@ public class MediaVolumePreferenceController extends VolumeSeekBarPreferenceCont return R.drawable.ic_media_stream_off; } - private boolean isSupportEndItem() { - return getWorker() != null - && getWorker().getActiveLocalMediaController() != null - && isConnectedBLEDevice(); + @VisibleForTesting + boolean isSupportEndItem() { + return isConnectedBLEDevice(); } private boolean isConnectedBLEDevice() { + if (getWorker() == null) { + Log.d(TAG, "The Worker is null"); + return false; + } mMediaDevice = getWorker().getCurrentConnectedMediaDevice(); if (mMediaDevice != null) { return mMediaDevice.isBLEDevice(); @@ -133,6 +137,8 @@ public class MediaVolumePreferenceController extends VolumeSeekBarPreferenceCont Utils.getApplicationLabel(mContext, getWorker().getPackageName())); intent.putExtra(BluetoothBroadcastDialog.KEY_DEVICE_ADDRESS, bluetoothDevice.getAddress()); + intent.putExtra(BluetoothBroadcastDialog.KEY_MEDIA_STREAMING, getWorker() != null + && getWorker().getActiveLocalMediaController() != null); pi = PendingIntent.getActivity(context, 0 /* requestCode */, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index 199d584cc5c..c4a3159e001 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -69,6 +69,7 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.ImeAwareEditText; import android.widget.TextView; @@ -214,6 +215,7 @@ public class ChooseLockPassword extends SettingsActivity { ThemeHelper.trySetDynamicColor(this); super.onCreate(savedInstanceState); findViewById(R.id.content_parent).setFitsSystemWindows(false); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } public static class ChooseLockPasswordFragment extends InstrumentedFragment diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java index 65582627d9a..c39ef661a0f 100644 --- a/src/com/android/settings/password/ChooseLockPattern.java +++ b/src/com/android/settings/password/ChooseLockPattern.java @@ -41,6 +41,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.widget.TextView; import androidx.fragment.app.Fragment; @@ -175,6 +176,7 @@ public class ChooseLockPattern extends SettingsActivity { ThemeHelper.trySetDynamicColor(this); super.onCreate(savedInstanceState); findViewById(R.id.content_parent).setFitsSystemWindows(false); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } @Override diff --git a/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java b/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java index 55ba0646af5..2d1d9e18564 100644 --- a/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java +++ b/src/com/android/settings/privacy/WorkPolicyInfoPreferenceController.java @@ -24,6 +24,8 @@ import androidx.preference.Preference; import com.android.settings.core.BasePreferenceController; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; import com.android.settings.overlay.FeatureFactory; +import com.android.settings.safetycenter.SafetyCenterManagerWrapper; + public class WorkPolicyInfoPreferenceController extends BasePreferenceController { @@ -37,7 +39,12 @@ public class WorkPolicyInfoPreferenceController extends BasePreferenceController @Override public int getAvailabilityStatus() { - return mEnterpriseProvider.hasWorkPolicyInfo() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + // Your Work policy info will be shown in the Safety Center. + // No need to show it in the privacy settings. + return !SafetyCenterManagerWrapper.get().isEnabled(mContext) + && mEnterpriseProvider.hasWorkPolicyInfo() + ? AVAILABLE + : UNSUPPORTED_ON_DEVICE; } @Override diff --git a/src/com/android/settings/wifi/slice/WifiSlice.java b/src/com/android/settings/wifi/slice/WifiSlice.java index 2e5524e5b45..c06e8693511 100644 --- a/src/com/android/settings/wifi/slice/WifiSlice.java +++ b/src/com/android/settings/wifi/slice/WifiSlice.java @@ -109,7 +109,7 @@ public class WifiSlice implements CustomSliceable { // If external calling package doesn't have Wi-Fi permission. final boolean isPermissionGranted = - Utils.isSettingsIntelligence(mContext) || isPermissionGranted(mContext); + isCallerExemptUid(mContext) || isPermissionGranted(mContext); ListBuilder listBuilder = getListBuilder(isWifiEnabled, null /* wifiSliceItem */, isPermissionGranted); // If the caller doesn't have the permission granted, just return a slice without a toggle. @@ -156,6 +156,21 @@ public class WifiSlice implements CustomSliceable { return userManager.isGuestUser(); } + private boolean isCallerExemptUid(Context context) { + final String[] allowedUidNames = context.getResources().getStringArray( + R.array.config_exempt_wifi_permission_uid_name); + final String uidName = + context.getPackageManager().getNameForUid(Binder.getCallingUid()); + Log.d(TAG, "calling uid name : " + uidName); + + for (String allowedUidName : allowedUidNames) { + if (TextUtils.equals(uidName, allowedUidName)) { + return true; + } + } + return false; + } + private static boolean isPermissionGranted(Context settingsContext) { final int callingUid = Binder.getCallingUid(); final String callingPackage = settingsContext.getPackageManager() diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java index 75b7fe143e9..ec982264e60 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java @@ -19,7 +19,7 @@ package com.android.settings.fuelgauge.batteryusage; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Matchers.anyLong; +import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; diff --git a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java index 7cfcaffb97d..56e83bb90ae 100644 --- a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java @@ -16,29 +16,71 @@ package com.android.settings.notification; +import static com.android.settings.slices.CustomSliceRegistry.VOLUME_MEDIA_URI; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.app.PendingIntent; import android.content.Context; +import android.content.Intent; import android.media.AudioManager; +import android.media.session.MediaController; +import android.net.Uri; + +import androidx.slice.builders.SliceAction; + +import com.android.settings.media.MediaOutputIndicatorWorker; +import com.android.settings.slices.SliceBackgroundWorker; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.media.BluetoothMediaDevice; +import com.android.settingslib.media.MediaDevice; +import com.android.settingslib.media.MediaOutputConstants; 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.RuntimeEnvironment; import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; @RunWith(RobolectricTestRunner.class) +@Config(shadows = MediaVolumePreferenceControllerTest.ShadowSliceBackgroundWorker.class) public class MediaVolumePreferenceControllerTest { + private static final String ACTION_LAUNCH_BROADCAST_DIALOG = + "android.settings.MEDIA_BROADCAST_DIALOG"; + private static MediaOutputIndicatorWorker sMediaOutputIndicatorWorker; + private MediaVolumePreferenceController mController; private Context mContext; + @Mock + private MediaController mMediaController; + @Mock + private MediaDevice mDevice1; + @Mock + private MediaDevice mDevice2; + @Before public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; mController = new MediaVolumePreferenceController(mContext); + sMediaOutputIndicatorWorker = spy( + new MediaOutputIndicatorWorker(mContext, VOLUME_MEDIA_URI)); + when(mDevice1.isBLEDevice()).thenReturn(true); + when(mDevice2.isBLEDevice()).thenReturn(false); } @Test @@ -68,4 +110,83 @@ public class MediaVolumePreferenceControllerTest { public void isPublicSlice_returnTrue() { assertThat(mController.isPublicSlice()).isTrue(); } + + @Test + public void isSupportEndItem_withBleDevice_returnsTrue() { + doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice(); + + assertThat(mController.isSupportEndItem()).isTrue(); + } + + @Test + public void isSupportEndItem_withNonBleDevice_returnsFalse() { + doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice(); + + assertThat(mController.isSupportEndItem()).isFalse(); + } + + @Test + public void getSliceEndItem_NotSupportEndItem_getsNullSliceAction() { + doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice(); + + final SliceAction sliceAction = mController.getSliceEndItem(mContext); + + assertThat(sliceAction).isNull(); + } + + @Test + public void getSliceEndItem_deviceIsBroadcasting_getsBroadcastIntent() { + doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice(); + doReturn(true).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting(); + doReturn(mMediaController).when(sMediaOutputIndicatorWorker) + .getActiveLocalMediaController(); + + final SliceAction sliceAction = mController.getSliceEndItem(mContext); + + final PendingIntent endItemPendingIntent = sliceAction.getAction(); + final PendingIntent expectedToggleIntent = getBroadcastIntent( + MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG); + assertThat(endItemPendingIntent).isEqualTo(expectedToggleIntent); + } + + @Test + public void getSliceEndItem_deviceIsNotBroadcasting_getsActivityIntent() { + final MediaDevice device = mock(BluetoothMediaDevice.class); + final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class); + when(((BluetoothMediaDevice) device).getCachedDevice()).thenReturn(cachedDevice); + when(device.isBLEDevice()).thenReturn(true); + doReturn(device).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice(); + doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting(); + doReturn(mMediaController).when(sMediaOutputIndicatorWorker) + .getActiveLocalMediaController(); + + final SliceAction sliceAction = mController.getSliceEndItem(mContext); + + final PendingIntent endItemPendingIntent = sliceAction.getAction(); + final PendingIntent expectedPendingIntent = + getActivityIntent(ACTION_LAUNCH_BROADCAST_DIALOG); + assertThat(endItemPendingIntent).isEqualTo(expectedPendingIntent); + } + + @Implements(SliceBackgroundWorker.class) + public static class ShadowSliceBackgroundWorker { + + @Implementation + public static SliceBackgroundWorker getInstance(Uri uri) { + return sMediaOutputIndicatorWorker; + } + } + + private PendingIntent getBroadcastIntent(String action) { + final Intent intent = new Intent(action); + intent.setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME); + return PendingIntent.getBroadcast(mContext, 0 /* requestCode */, intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); + } + + private PendingIntent getActivityIntent(String action) { + final Intent intent = new Intent(action); + return PendingIntent.getActivity(mContext, 0 /* requestCode */, intent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); + } } diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java index 3c50c6bf2f4..43a49a1a1b3 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java @@ -27,6 +27,7 @@ import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_NUMERIC_COMPLEX; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_SOMETHING; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; import static com.android.internal.widget.LockPatternUtils.PASSWORD_TYPE_KEY; import static com.android.settings.password.ChooseLockGeneric.CONFIRM_CREDENTIALS; @@ -158,6 +159,21 @@ public class ChooseLockPasswordTest { .isNotNull(); } + @Test + public void activity_shouldHaveSecureFlag() { + PasswordPolicy policy = new PasswordPolicy(); + policy.quality = PASSWORD_QUALITY_ALPHABETIC; + policy.length = 10; + + Intent intent = createIntentForPasswordValidation( + /* minMetrics */ policy.getMinMetrics(), + /* minComplexity= */ PASSWORD_COMPLEXITY_NONE, + /* passwordType= */ PASSWORD_QUALITY_ALPHABETIC); + ChooseLockPassword activity = buildChooseLockPasswordActivity(intent); + final int flags = activity.getWindow().getAttributes().flags; + assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE); + } + @Test public void processAndValidatePasswordRequirements_noMinPasswordComplexity() { PasswordPolicy policy = new PasswordPolicy(); diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java index f5cc39435ad..1fc10fc75f2 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java @@ -16,6 +16,8 @@ package com.android.settings.password; +import static android.view.WindowManager.LayoutParams.FLAG_SECURE; + import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -107,6 +109,14 @@ public class ChooseLockPatternTest { assertThat(iconView.getVisibility()).isEqualTo(View.GONE); } + @Test + public void activity_shouldHaveSecureFlag() { + final ChooseLockPattern activity = Robolectric.buildActivity( + ChooseLockPattern.class, new IntentBuilder(application).build()).setup().get(); + final int flags = activity.getWindow().getAttributes().flags; + assertThat(flags & FLAG_SECURE).isEqualTo(FLAG_SECURE); + } + private ChooseLockPattern createActivity(boolean addFingerprintExtra) { return Robolectric.buildActivity( ChooseLockPattern.class, diff --git a/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java index 82444aade07..a983228255e 100644 --- a/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/privacy/WorkPolicyInfoPreferenceControllerTest.java @@ -21,6 +21,7 @@ import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_ import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -30,6 +31,7 @@ import android.content.Context; import androidx.preference.Preference; import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider; +import com.android.settings.safetycenter.SafetyCenterManagerWrapper; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; @@ -52,6 +54,7 @@ public class WorkPolicyInfoPreferenceControllerTest { mContext = RuntimeEnvironment.application; mFakeFeatureFactory = FakeFeatureFactory.setupForTest(); mEnterpriseProvider = mFakeFeatureFactory.getEnterprisePrivacyFeatureProvider(mContext); + SafetyCenterManagerWrapper.sInstance = mock(SafetyCenterManagerWrapper.class); } @Test @@ -72,6 +75,15 @@ public class WorkPolicyInfoPreferenceControllerTest { assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE); } + @Test + public void getAvailabilityStatus_safetyCenterEnabled_shouldReturnUnsupported() { + when(SafetyCenterManagerWrapper.get().isEnabled(mContext)).thenReturn(true); + WorkPolicyInfoPreferenceController controller = + new WorkPolicyInfoPreferenceController(mContext, "test_key"); + + assertThat(controller.getAvailabilityStatus()).isEqualTo(UNSUPPORTED_ON_DEVICE); + } + @Test public void handlePreferenceTreeClick_nonMatchingKey_shouldDoNothing() { when(mEnterpriseProvider.hasWorkPolicyInfo()).thenReturn(true); 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 52dcb5282da..d9c726ab058 100644 --- a/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/slice/ContextualWifiSliceTest.java @@ -103,6 +103,7 @@ public class ContextualWifiSliceTest { mContext.getString(R.string.config_settingsintelligence_package_name); ShadowBinder.setCallingUid(1); when(mPackageManager.getPackagesForUid(1)).thenReturn(new String[]{siPackageName}); + when(mPackageManager.getNameForUid(1)).thenReturn(siPackageName); ShadowWifiSlice.setWifiPermissible(true); mWifiSlice = new ContextualWifiSlice(mContext); } 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 33302ce8dc7..5ed2e8b9444 100644 --- a/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/slice/WifiSliceTest.java @@ -114,6 +114,7 @@ public class WifiSliceTest { mSIPackageName = mContext.getString(R.string.config_settingsintelligence_package_name); ShadowBinder.setCallingUid(USER_ID); when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{mSIPackageName}); + when(mPackageManager.getNameForUid(USER_ID)).thenReturn(mSIPackageName); ShadowWifiSlice.setWifiPermissible(true); mWifiSlice = new WifiSlice(mContext, mWifiRestriction); } @@ -148,6 +149,7 @@ public class WifiSliceTest { @Test public void getWifiSlice_fromSIPackage_shouldHaveTitleAndToggle() { when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{mSIPackageName}); + when(mPackageManager.getNameForUid(USER_ID)).thenReturn(mSIPackageName); ShadowWifiSlice.setWifiPermissible(false); final Slice wifiSlice = mWifiSlice.getSlice(); @@ -163,6 +165,7 @@ public class WifiSliceTest { @Test public void getWifiSlice_notFromSIPackageAndWithWifiPermission_shouldHaveTitleAndToggle() { when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{"com.test"}); + when(mPackageManager.getNameForUid(USER_ID)).thenReturn("com.test"); ShadowWifiSlice.setWifiPermissible(true); final Slice wifiSlice = mWifiSlice.getSlice(); @@ -177,6 +180,7 @@ public class WifiSliceTest { @Test public void getWifiSlice_notFromSIPackageAndWithoutWifiPermission_shouldReturnNoToggle() { when(mPackageManager.getPackagesForUid(USER_ID)).thenReturn(new String[]{"com.test"}); + when(mPackageManager.getNameForUid(USER_ID)).thenReturn("com.test"); ShadowWifiSlice.setWifiPermissible(false); final Slice wifiSlice = mWifiSlice.getSlice();