Snap for 8941678 from f92894768f to tm-qpr1-release

Change-Id: Idca5abd38866d67476f491ef1e19ed30410cf08a
This commit is contained in:
Android Build Coastguard Worker
2022-08-13 01:30:28 +00:00
19 changed files with 361 additions and 21 deletions

View File

@@ -4054,6 +4054,20 @@
android:value="true"/>
</service>
<service
android:name=".development.qstile.DevelopmentTiles$DesktopMode"
android:label="@string/desktop_mode"
android:icon="@drawable/tile_icon_desktop_mode"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"
android:exported="true"
android:enabled="false">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
<meta-data android:name="android.service.quicksettings.TOGGLEABLE_TILE"
android:value="true"/>
</service>
<activity
android:name=".HelpTrampoline"
android:exported="true"

View File

@@ -0,0 +1,25 @@
<!--
Copyright (C) 2022 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.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:tint="?android:attr/colorControlNormal"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M18,15V20Q18,20.825 17.413,21.413Q16.825,22 16,22H4Q3.175,22 2.588,21.413Q2,20.825 2,20V11Q2,10.175 2.588,9.587Q3.175,9 4,9H6V4Q6,3.175 6.588,2.587Q7.175,2 8,2H20Q20.825,2 21.413,2.587Q22,3.175 22,4V13Q22,13.825 21.413,14.412Q20.825,15 20,15ZM4,13V20Q4,20 4,20Q4,20 4,20H16Q16,20 16,20Q16,20 16,20V13ZM18,13H20Q20,13 20,13Q20,13 20,13V6H8V9H16Q16.825,9 17.413,9.587Q18,10.175 18,11Z" />
</vector>

View File

@@ -624,4 +624,10 @@
<!-- Whether to enable the advanced vpn feature. The default is not to. -->
<bool name="config_advanced_vpn_enabled">false</bool>
<!-- An array of uid name for which packages exempt from Wi-Fi permission check. -->
<string-array name="config_exempt_wifi_permission_uid_name" translatable="false">
<item>@string/config_settingsintelligence_package_name</item>
<item>android.uid.system:1000</item>
</string-array>
</resources>

View File

@@ -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) {

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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();
}
}
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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,

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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();