Snap for 8941678 from f92894768f to tm-qpr1-release
Change-Id: Idca5abd38866d67476f491ef1e19ed30410cf08a
This commit is contained in:
@@ -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"
|
||||
|
||||
25
res/drawable/tile_icon_desktop_mode.xml
Normal file
25
res/drawable/tile_icon_desktop_mode.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user