Merge "DO NOT MERGE - Merge RQ2A.210505.003."
This commit is contained in:
@@ -632,6 +632,13 @@
|
|||||||
<!-- The default minimal size of a PiP task, in both dimensions. -->
|
<!-- The default minimal size of a PiP task, in both dimensions. -->
|
||||||
<dimen name="default_minimal_size_pip_resizable_task">108dp</dimen>
|
<dimen name="default_minimal_size_pip_resizable_task">108dp</dimen>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
The overridable minimal size of a PiP task, in both dimensions.
|
||||||
|
Different from default_minimal_size_pip_resizable_task, this is to limit the dimension
|
||||||
|
when the pinned stack size is overridden by app via minWidth/minHeight.
|
||||||
|
-->
|
||||||
|
<dimen name="overridable_minimal_size_pip_resizable_task">48dp</dimen>
|
||||||
|
|
||||||
<!-- Height of a task when in minimized mode from the top when launcher is resizable. -->
|
<!-- Height of a task when in minimized mode from the top when launcher is resizable. -->
|
||||||
<dimen name="task_height_of_minimized_mode">80dp</dimen>
|
<dimen name="task_height_of_minimized_mode">80dp</dimen>
|
||||||
|
|
||||||
|
|||||||
@@ -1941,6 +1941,7 @@
|
|||||||
<java-symbol type="fraction" name="config_dimBehindFadeDuration" />
|
<java-symbol type="fraction" name="config_dimBehindFadeDuration" />
|
||||||
<java-symbol type="dimen" name="default_minimal_size_resizable_task" />
|
<java-symbol type="dimen" name="default_minimal_size_resizable_task" />
|
||||||
<java-symbol type="dimen" name="default_minimal_size_pip_resizable_task" />
|
<java-symbol type="dimen" name="default_minimal_size_pip_resizable_task" />
|
||||||
|
<java-symbol type="dimen" name="overridable_minimal_size_pip_resizable_task" />
|
||||||
<java-symbol type="dimen" name="task_height_of_minimized_mode" />
|
<java-symbol type="dimen" name="task_height_of_minimized_mode" />
|
||||||
<java-symbol type="fraction" name="config_screenAutoBrightnessDozeScaleFactor" />
|
<java-symbol type="fraction" name="config_screenAutoBrightnessDozeScaleFactor" />
|
||||||
<java-symbol type="bool" name="config_allowPriorityVibrationsInLowPowerMode" />
|
<java-symbol type="bool" name="config_allowPriorityVibrationsInLowPowerMode" />
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ import android.os.Handler;
|
|||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
|
import android.util.EventLog;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Size;
|
import android.util.Size;
|
||||||
import android.view.SurfaceControl;
|
import android.view.SurfaceControl;
|
||||||
@@ -223,6 +224,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements
|
|||||||
private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory
|
private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory
|
||||||
mSurfaceControlTransactionFactory;
|
mSurfaceControlTransactionFactory;
|
||||||
private PictureInPictureParams mPictureInPictureParams;
|
private PictureInPictureParams mPictureInPictureParams;
|
||||||
|
private int mOverridableMinSize;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If set to {@code true}, the entering animation will be skipped and we will wait for
|
* If set to {@code true}, the entering animation will be skipped and we will wait for
|
||||||
@@ -244,6 +246,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements
|
|||||||
mPipBoundsHandler = boundsHandler;
|
mPipBoundsHandler = boundsHandler;
|
||||||
mEnterExitAnimationDuration = context.getResources()
|
mEnterExitAnimationDuration = context.getResources()
|
||||||
.getInteger(R.integer.config_pipResizeAnimationDuration);
|
.getInteger(R.integer.config_pipResizeAnimationDuration);
|
||||||
|
mOverridableMinSize = context.getResources().getDimensionPixelSize(
|
||||||
|
com.android.internal.R.dimen.overridable_minimal_size_pip_resizable_task);
|
||||||
mSurfaceTransactionHelper = surfaceTransactionHelper;
|
mSurfaceTransactionHelper = surfaceTransactionHelper;
|
||||||
mPipAnimationController = pipAnimationController;
|
mPipAnimationController = pipAnimationController;
|
||||||
mPipUiEventLoggerLogger = pipUiEventLogger;
|
mPipUiEventLoggerLogger = pipUiEventLogger;
|
||||||
@@ -949,7 +953,14 @@ public class PipTaskOrganizer extends TaskOrganizer implements
|
|||||||
// -1 will be populated if an activity specifies defaultWidth/defaultHeight in <layout>
|
// -1 will be populated if an activity specifies defaultWidth/defaultHeight in <layout>
|
||||||
// without minWidth/minHeight
|
// without minWidth/minHeight
|
||||||
if (windowLayout.minWidth > 0 && windowLayout.minHeight > 0) {
|
if (windowLayout.minWidth > 0 && windowLayout.minHeight > 0) {
|
||||||
return new Size(windowLayout.minWidth, windowLayout.minHeight);
|
// If either dimension is smaller than the allowed minimum, adjust them
|
||||||
|
// according to mOverridableMinSize and log to SafeNet
|
||||||
|
if (windowLayout.minWidth < mOverridableMinSize
|
||||||
|
|| windowLayout.minHeight < mOverridableMinSize) {
|
||||||
|
EventLog.writeEvent(0x534e4554, "174302616", -1, "");
|
||||||
|
}
|
||||||
|
return new Size(Math.max(windowLayout.minWidth, mOverridableMinSize),
|
||||||
|
Math.max(windowLayout.minHeight, mOverridableMinSize));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -252,7 +252,7 @@ public class ScreenshotNotificationsController {
|
|||||||
dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
|
dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE);
|
||||||
if (intent != null) {
|
if (intent != null) {
|
||||||
final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
|
final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(
|
||||||
mContext, 0, intent, 0, null, UserHandle.CURRENT);
|
mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT);
|
||||||
b.setContentIntent(pendingIntent);
|
b.setContentIntent(pendingIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import com.android.internal.annotations.VisibleForTesting;
|
|||||||
import com.android.internal.logging.MetricsLogger;
|
import com.android.internal.logging.MetricsLogger;
|
||||||
import com.android.internal.logging.nano.MetricsProto;
|
import com.android.internal.logging.nano.MetricsProto;
|
||||||
import com.android.internal.util.XmlUtils;
|
import com.android.internal.util.XmlUtils;
|
||||||
|
import com.android.server.pm.PackageManagerService;
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
import org.xmlpull.v1.XmlPullParserException;
|
import org.xmlpull.v1.XmlPullParserException;
|
||||||
@@ -463,6 +464,7 @@ public class SnoozeHelper {
|
|||||||
return PendingIntent.getBroadcast(mContext,
|
return PendingIntent.getBroadcast(mContext,
|
||||||
REQUEST_CODE_REPOST,
|
REQUEST_CODE_REPOST,
|
||||||
new Intent(REPOST_ACTION)
|
new Intent(REPOST_ACTION)
|
||||||
|
.setPackage(PackageManagerService.PLATFORM_PACKAGE_NAME)
|
||||||
.setData(new Uri.Builder().scheme(REPOST_SCHEME).appendPath(key).build())
|
.setData(new Uri.Builder().scheme(REPOST_SCHEME).appendPath(key).build())
|
||||||
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
|
.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
|
||||||
.putExtra(EXTRA_KEY, key)
|
.putExtra(EXTRA_KEY, key)
|
||||||
|
|||||||
@@ -12528,6 +12528,7 @@ public class PackageManagerService extends IPackageManager.Stub
|
|||||||
if (hasOldPkg) {
|
if (hasOldPkg) {
|
||||||
mPermissionManager.revokeRuntimePermissionsIfGroupChanged(pkg, oldPkg,
|
mPermissionManager.revokeRuntimePermissionsIfGroupChanged(pkg, oldPkg,
|
||||||
allPackageNames);
|
allPackageNames);
|
||||||
|
mPermissionManager.revokeStoragePermissionsIfScopeExpanded(pkg, oldPkg);
|
||||||
}
|
}
|
||||||
if (hasPermissionDefinitionChanges) {
|
if (hasPermissionDefinitionChanges) {
|
||||||
mPermissionManager.revokeRuntimePermissionsIfPermissionDefinitionChanged(
|
mPermissionManager.revokeRuntimePermissionsIfPermissionDefinitionChanged(
|
||||||
|
|||||||
@@ -206,6 +206,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {
|
|||||||
private static final int USER_PERMISSION_FLAGS = FLAG_PERMISSION_USER_SET
|
private static final int USER_PERMISSION_FLAGS = FLAG_PERMISSION_USER_SET
|
||||||
| FLAG_PERMISSION_USER_FIXED;
|
| FLAG_PERMISSION_USER_FIXED;
|
||||||
|
|
||||||
|
/** All storage permissions */
|
||||||
|
private static final List<String> STORAGE_PERMISSIONS = new ArrayList<>();
|
||||||
|
|
||||||
/** If the permission of the value is granted, so is the key */
|
/** If the permission of the value is granted, so is the key */
|
||||||
private static final Map<String, String> FULLER_PERMISSION_MAP = new HashMap<>();
|
private static final Map<String, String> FULLER_PERMISSION_MAP = new HashMap<>();
|
||||||
|
|
||||||
@@ -214,6 +217,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {
|
|||||||
Manifest.permission.ACCESS_FINE_LOCATION);
|
Manifest.permission.ACCESS_FINE_LOCATION);
|
||||||
FULLER_PERMISSION_MAP.put(Manifest.permission.INTERACT_ACROSS_USERS,
|
FULLER_PERMISSION_MAP.put(Manifest.permission.INTERACT_ACROSS_USERS,
|
||||||
Manifest.permission.INTERACT_ACROSS_USERS_FULL);
|
Manifest.permission.INTERACT_ACROSS_USERS_FULL);
|
||||||
|
STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
|
STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
|
||||||
|
STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Lock to protect internal data access */
|
/** Lock to protect internal data access */
|
||||||
@@ -2265,6 +2271,49 @@ public class PermissionManagerService extends IPermissionManager.Stub {
|
|||||||
return protectionLevel;
|
return protectionLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the app is updated, and has scoped storage permissions, then it is possible that the
|
||||||
|
* app updated in an attempt to get unscoped storage. If so, revoke all storage permissions.
|
||||||
|
* @param newPackage The new package that was installed
|
||||||
|
* @param oldPackage The old package that was updated
|
||||||
|
*/
|
||||||
|
private void revokeStoragePermissionsIfScopeExpanded(
|
||||||
|
@NonNull AndroidPackage newPackage,
|
||||||
|
@NonNull AndroidPackage oldPackage,
|
||||||
|
@NonNull PermissionCallback permissionCallback) {
|
||||||
|
boolean downgradedSdk = oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q
|
||||||
|
&& newPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q;
|
||||||
|
boolean upgradedSdk = oldPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q
|
||||||
|
&& newPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q;
|
||||||
|
boolean newlyRequestsLegacy = !upgradedSdk && !oldPackage.isRequestLegacyExternalStorage()
|
||||||
|
&& newPackage.isRequestLegacyExternalStorage();
|
||||||
|
|
||||||
|
if (!newlyRequestsLegacy && !downgradedSdk) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final int callingUid = Binder.getCallingUid();
|
||||||
|
final int userId = UserHandle.getUserId(newPackage.getUid());
|
||||||
|
int numRequestedPermissions = newPackage.getRequestedPermissions().size();
|
||||||
|
for (int i = 0; i < numRequestedPermissions; i++) {
|
||||||
|
PermissionInfo permInfo = getPermissionInfo(newPackage.getRequestedPermissions().get(i),
|
||||||
|
newPackage.getPackageName(), 0);
|
||||||
|
if (permInfo == null || !STORAGE_PERMISSIONS.contains(permInfo.name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
EventLog.writeEvent(0x534e4554, "171430330", newPackage.getUid(),
|
||||||
|
"Revoking permission " + permInfo.name + " from package "
|
||||||
|
+ newPackage.getPackageName() + " as either the sdk downgraded "
|
||||||
|
+ downgradedSdk + " or newly requested legacy full storage "
|
||||||
|
+ newlyRequestsLegacy);
|
||||||
|
|
||||||
|
revokeRuntimePermissionInternal(permInfo.name, newPackage.getPackageName(),
|
||||||
|
false, callingUid, userId, null, permissionCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* We might auto-grant permissions if any permission of the group is already granted. Hence if
|
* We might auto-grant permissions if any permission of the group is already granted. Hence if
|
||||||
* the group of a granted permission changes we need to revoke it to avoid having permissions of
|
* the group of a granted permission changes we need to revoke it to avoid having permissions of
|
||||||
@@ -4734,6 +4783,19 @@ public class PermissionManagerService extends IPermissionManager.Stub {
|
|||||||
@UserIdInt int userId) {
|
@UserIdInt int userId) {
|
||||||
return PermissionManagerService.this.isPermissionsReviewRequired(pkg, userId);
|
return PermissionManagerService.this.isPermissionsReviewRequired(pkg, userId);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* If the app is updated, and has scoped storage permissions, then it is possible that the
|
||||||
|
* app updated in an attempt to get unscoped storage. If so, revoke all storage permissions.
|
||||||
|
* @param newPackage The new package that was installed
|
||||||
|
* @param oldPackage The old package that was updated
|
||||||
|
*/
|
||||||
|
public void revokeStoragePermissionsIfScopeExpanded(
|
||||||
|
@NonNull AndroidPackage newPackage,
|
||||||
|
@NonNull AndroidPackage oldPackage
|
||||||
|
) {
|
||||||
|
PermissionManagerService.this.revokeStoragePermissionsIfScopeExpanded(newPackage,
|
||||||
|
oldPackage, mDefaultPermissionCallback);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void revokeRuntimePermissionsIfGroupChanged(
|
public void revokeRuntimePermissionsIfGroupChanged(
|
||||||
|
|||||||
@@ -265,6 +265,17 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager
|
|||||||
@NonNull List<String> permissionsToRevoke,
|
@NonNull List<String> permissionsToRevoke,
|
||||||
@NonNull ArrayList<String> allPackageNames);
|
@NonNull ArrayList<String> allPackageNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the app is updated, and has scoped storage permissions, then it is possible that the
|
||||||
|
* app updated in an attempt to get unscoped storage. If so, revoke all storage permissions.
|
||||||
|
* @param newPackage The new package that was installed
|
||||||
|
* @param oldPackage The old package that was updated
|
||||||
|
*/
|
||||||
|
public abstract void revokeStoragePermissionsIfScopeExpanded(
|
||||||
|
@NonNull AndroidPackage newPackage,
|
||||||
|
@NonNull AndroidPackage oldPackage
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add all permissions in the given package.
|
* Add all permissions in the given package.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -512,7 +512,7 @@ public class LockTaskController {
|
|||||||
setStatusBarState(mLockTaskModeState, userId);
|
setStatusBarState(mLockTaskModeState, userId);
|
||||||
setKeyguardState(mLockTaskModeState, userId);
|
setKeyguardState(mLockTaskModeState, userId);
|
||||||
if (oldLockTaskModeState == LOCK_TASK_MODE_PINNED) {
|
if (oldLockTaskModeState == LOCK_TASK_MODE_PINNED) {
|
||||||
lockKeyguardIfNeeded();
|
lockKeyguardIfNeeded(userId);
|
||||||
}
|
}
|
||||||
if (getDevicePolicyManager() != null) {
|
if (getDevicePolicyManager() != null) {
|
||||||
getDevicePolicyManager().notifyLockTaskModeChanged(false, null, userId);
|
getDevicePolicyManager().notifyLockTaskModeChanged(false, null, userId);
|
||||||
@@ -824,15 +824,15 @@ public class LockTaskController {
|
|||||||
* Helper method for locking the device immediately. This may be necessary when the device
|
* Helper method for locking the device immediately. This may be necessary when the device
|
||||||
* leaves the pinned mode.
|
* leaves the pinned mode.
|
||||||
*/
|
*/
|
||||||
private void lockKeyguardIfNeeded() {
|
private void lockKeyguardIfNeeded(int userId) {
|
||||||
if (shouldLockKeyguard()) {
|
if (shouldLockKeyguard(userId)) {
|
||||||
mWindowManager.lockNow(null);
|
mWindowManager.lockNow(null);
|
||||||
mWindowManager.dismissKeyguard(null /* callback */, null /* message */);
|
mWindowManager.dismissKeyguard(null /* callback */, null /* message */);
|
||||||
getLockPatternUtils().requireCredentialEntry(USER_ALL);
|
getLockPatternUtils().requireCredentialEntry(USER_ALL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldLockKeyguard() {
|
private boolean shouldLockKeyguard(int userId) {
|
||||||
// This functionality should be kept consistent with
|
// This functionality should be kept consistent with
|
||||||
// com.android.settings.security.ScreenPinningSettings (see b/127605586)
|
// com.android.settings.security.ScreenPinningSettings (see b/127605586)
|
||||||
try {
|
try {
|
||||||
@@ -842,7 +842,7 @@ public class LockTaskController {
|
|||||||
} catch (Settings.SettingNotFoundException e) {
|
} catch (Settings.SettingNotFoundException e) {
|
||||||
// Log to SafetyNet for b/127605586
|
// Log to SafetyNet for b/127605586
|
||||||
android.util.EventLog.writeEvent(0x534e4554, "127605586", -1, "");
|
android.util.EventLog.writeEvent(0x534e4554, "127605586", -1, "");
|
||||||
return getLockPatternUtils().isSecure(USER_CURRENT);
|
return getLockPatternUtils().isSecure(userId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ import androidx.test.runner.AndroidJUnit4;
|
|||||||
|
|
||||||
import com.android.internal.util.FastXmlSerializer;
|
import com.android.internal.util.FastXmlSerializer;
|
||||||
import com.android.server.UiServiceTestCase;
|
import com.android.server.UiServiceTestCase;
|
||||||
|
import com.android.server.pm.PackageManagerService;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -256,6 +257,17 @@ public class SnoozeHelperTest extends UiServiceTestCase {
|
|||||||
UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey()));
|
UserHandle.USER_SYSTEM, r.getSbn().getPackageName(), r.getKey()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSnoozeSentToAndroid() throws Exception {
|
||||||
|
NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
|
||||||
|
mSnoozeHelper.snooze(r, 1000);
|
||||||
|
ArgumentCaptor<PendingIntent> captor = ArgumentCaptor.forClass(PendingIntent.class);
|
||||||
|
verify(mAm, times(1)).setExactAndAllowWhileIdle(
|
||||||
|
anyInt(), anyLong(), captor.capture());
|
||||||
|
assertEquals(PackageManagerService.PLATFORM_PACKAGE_NAME,
|
||||||
|
captor.getValue().getIntent().getPackage());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSnooze() throws Exception {
|
public void testSnooze() throws Exception {
|
||||||
NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
|
NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM);
|
||||||
|
|||||||
@@ -450,7 +450,7 @@ public class LockTaskControllerTest {
|
|||||||
Settings.Secure.clearProviderForTest();
|
Settings.Secure.clearProviderForTest();
|
||||||
|
|
||||||
// AND a password is set
|
// AND a password is set
|
||||||
when(mLockPatternUtils.isSecure(anyInt()))
|
when(mLockPatternUtils.isSecure(TEST_USER_ID))
|
||||||
.thenReturn(true);
|
.thenReturn(true);
|
||||||
|
|
||||||
// AND there is a task record
|
// AND there is a task record
|
||||||
|
|||||||
Reference in New Issue
Block a user