Merge "Add a trunk stable flag for reordering wallpapers during a user switch" into main
diff --git a/core/api/current.txt b/core/api/current.txt
index 5e8ccdb..2d03be7 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -7955,6 +7955,7 @@
field public static final String LOCK_TASK_POLICY = "lockTask";
field public static final String PACKAGES_SUSPENDED_POLICY = "packagesSuspended";
field public static final String PACKAGE_UNINSTALL_BLOCKED_POLICY = "packageUninstallBlocked";
+ field @FlaggedApi("android.app.admin.flags.policy_engine_migration_v2_enabled") public static final String PASSWORD_COMPLEXITY_POLICY = "passwordComplexity";
field public static final String PERMISSION_GRANT_POLICY = "permissionGrant";
field public static final String PERSISTENT_PREFERRED_ACTIVITY_POLICY = "persistentPreferredActivity";
field public static final String RESET_PASSWORD_TOKEN_POLICY = "resetPasswordToken";
@@ -50515,7 +50516,7 @@
method public boolean applyTransactionOnDraw(@NonNull android.view.SurfaceControl.Transaction);
method @Nullable public android.view.SurfaceControl.Transaction buildReparentTransaction(@NonNull android.view.SurfaceControl);
method public default int getBufferTransformHint();
- method @FlaggedApi("com.android.window.flags.get_host_token_api") @Nullable public default android.os.IBinder getHostToken();
+ method @FlaggedApi("com.android.window.flags.surface_control_input_receiver") @NonNull public default android.window.InputTransferToken getInputTransferToken();
method public default void removeOnBufferTransformHintChangedListener(@NonNull android.view.AttachedSurfaceControl.OnBufferTransformHintChangedListener);
method public default void setChildBoundingInsets(@NonNull android.graphics.Rect);
method public default void setTouchableRegion(@Nullable android.graphics.Region);
@@ -52225,6 +52226,7 @@
public class SurfaceControlViewHost {
ctor public SurfaceControlViewHost(@NonNull android.content.Context, @NonNull android.view.Display, @Nullable android.os.IBinder);
+ ctor @FlaggedApi("com.android.window.flags.surface_control_input_receiver") public SurfaceControlViewHost(@NonNull android.content.Context, @NonNull android.view.Display, @Nullable android.window.InputTransferToken);
method @Nullable public android.view.SurfaceControlViewHost.SurfacePackage getSurfacePackage();
method @Nullable public android.view.View getView();
method public void relayout(int, int);
@@ -52426,7 +52428,7 @@
method public final void cancelPendingInputEvents();
method public boolean checkInputConnectionProxy(android.view.View);
method public void clearAnimation();
- method @FlaggedApi("autofill_credman_dev_integration") public void clearCredentialManagerRequest();
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") public void clearCredentialManagerRequest();
method public void clearFocus();
method public void clearViewTranslationCallback();
method public static int combineMeasuredStates(int, int);
@@ -52536,8 +52538,8 @@
method @FlaggedApi("android.view.flags.sensitive_content_app_protection_api") public final int getContentSensitivity();
method @UiContext public final android.content.Context getContext();
method protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo();
- method @FlaggedApi("autofill_credman_dev_integration") @Nullable public final android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException> getCredentialManagerCallback();
- method @FlaggedApi("autofill_credman_dev_integration") @Nullable public final android.credentials.GetCredentialRequest getCredentialManagerRequest();
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") @Nullable public final android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException> getCredentialManagerCallback();
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") @Nullable public final android.credentials.GetCredentialRequest getCredentialManagerRequest();
method public final boolean getDefaultFocusHighlightEnabled();
method public static int getDefaultSize(int, int);
method public android.view.Display getDisplay();
@@ -52922,7 +52924,7 @@
method public void setContentDescription(CharSequence);
method @FlaggedApi("android.view.flags.sensitive_content_app_protection_api") public final void setContentSensitivity(int);
method public void setContextClickable(boolean);
- method @FlaggedApi("autofill_credman_dev_integration") public void setCredentialManagerRequest(@NonNull android.credentials.GetCredentialRequest, @NonNull android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException>);
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") public void setCredentialManagerRequest(@NonNull android.credentials.GetCredentialRequest, @NonNull android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException>);
method public void setDefaultFocusHighlightEnabled(boolean);
method @Deprecated public void setDrawingCacheBackgroundColor(@ColorInt int);
method @Deprecated public void setDrawingCacheEnabled(boolean);
@@ -53801,11 +53803,11 @@
method public abstract int addChildCount(int);
method public abstract void asyncCommit();
method public abstract android.view.ViewStructure asyncNewChild(int);
- method @FlaggedApi("autofill_credman_dev_integration") public void clearCredentialManagerRequest();
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") public void clearCredentialManagerRequest();
method @Nullable public abstract android.view.autofill.AutofillId getAutofillId();
method public abstract int getChildCount();
- method @FlaggedApi("autofill_credman_dev_integration") @Nullable public android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException> getCredentialManagerCallback();
- method @FlaggedApi("autofill_credman_dev_integration") @Nullable public android.credentials.GetCredentialRequest getCredentialManagerRequest();
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") @Nullable public android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException> getCredentialManagerCallback();
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") @Nullable public android.credentials.GetCredentialRequest getCredentialManagerRequest();
method public abstract android.os.Bundle getExtras();
method public abstract CharSequence getHint();
method public abstract CharSequence getText();
@@ -53830,7 +53832,7 @@
method public abstract void setClickable(boolean);
method public abstract void setContentDescription(CharSequence);
method public abstract void setContextClickable(boolean);
- method @FlaggedApi("autofill_credman_dev_integration") public void setCredentialManagerRequest(@NonNull android.credentials.GetCredentialRequest, @NonNull android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException>);
+ method @FlaggedApi("android.service.autofill.autofill_credman_dev_integration") public void setCredentialManagerRequest(@NonNull android.credentials.GetCredentialRequest, @NonNull android.os.OutcomeReceiver<android.credentials.GetCredentialResponse,android.credentials.GetCredentialException>);
method public abstract void setDataIsSensitive(boolean);
method public abstract void setDimens(int, int, int, int, int, int);
method public abstract void setElevation(float);
@@ -54371,9 +54373,9 @@
method @Deprecated public android.view.Display getDefaultDisplay();
method @NonNull public default android.view.WindowMetrics getMaximumWindowMetrics();
method public default boolean isCrossWindowBlurEnabled();
- method @FlaggedApi("com.android.window.flags.surface_control_input_receiver") public default void registerBatchedSurfaceControlInputReceiver(int, @NonNull android.os.IBinder, @NonNull android.view.SurfaceControl, @NonNull android.view.Choreographer, @NonNull android.view.SurfaceControlInputReceiver);
+ method @FlaggedApi("com.android.window.flags.surface_control_input_receiver") public default void registerBatchedSurfaceControlInputReceiver(int, @NonNull android.window.InputTransferToken, @NonNull android.view.SurfaceControl, @NonNull android.view.Choreographer, @NonNull android.view.SurfaceControlInputReceiver);
method @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") public default void registerTrustedPresentationListener(@NonNull android.os.IBinder, @NonNull android.window.TrustedPresentationThresholds, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
- method @FlaggedApi("com.android.window.flags.surface_control_input_receiver") public default void registerUnbatchedSurfaceControlInputReceiver(int, @NonNull android.os.IBinder, @NonNull android.view.SurfaceControl, @NonNull android.os.Looper, @NonNull android.view.SurfaceControlInputReceiver);
+ method @FlaggedApi("com.android.window.flags.surface_control_input_receiver") public default void registerUnbatchedSurfaceControlInputReceiver(int, @NonNull android.window.InputTransferToken, @NonNull android.view.SurfaceControl, @NonNull android.os.Looper, @NonNull android.view.SurfaceControlInputReceiver);
method public default void removeCrossWindowBlurEnabledListener(@NonNull java.util.function.Consumer<java.lang.Boolean>);
method public default void removeProposedRotationListener(@NonNull java.util.function.IntConsumer);
method @FlaggedApi("com.android.window.flags.screen_recording_callbacks") @RequiresPermission(android.Manifest.permission.DETECT_SCREEN_RECORDING) public default void removeScreenRecordingCallback(@NonNull java.util.function.Consumer<java.lang.Integer>);
@@ -61354,6 +61356,12 @@
field public static final int EDGE_RIGHT = 1; // 0x1
}
+ @FlaggedApi("com.android.window.flags.surface_control_input_receiver") public final class InputTransferToken implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.window.InputTransferToken> CREATOR;
+ }
+
public interface OnBackAnimationCallback extends android.window.OnBackInvokedCallback {
method public default void onBackCancelled();
method public default void onBackProgressed(@NonNull android.window.BackEvent);
@@ -61401,11 +61409,11 @@
@FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") public final class TrustedPresentationThresholds implements android.os.Parcelable {
ctor @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") public TrustedPresentationThresholds(@FloatRange(from=0.0f, fromInclusive=false, to=1.0f) float, @FloatRange(from=0.0f, fromInclusive=false, to=1.0f) float, @IntRange(from=1) int);
method @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") public int describeContents();
+ method @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") @FloatRange(from=0.0f, fromInclusive=false, to=1.0f) public float getMinAlpha();
+ method @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") @FloatRange(from=0.0f, fromInclusive=false, to=1.0f) public float getMinFractionRendered();
+ method @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") @IntRange(from=1) public int getStabilityRequirementMillis();
method @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") public void writeToParcel(@NonNull android.os.Parcel, int);
field @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") @NonNull public static final android.os.Parcelable.Creator<android.window.TrustedPresentationThresholds> CREATOR;
- field @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") @FloatRange(from=0.0f, fromInclusive=false, to=1.0f) public final float minAlpha;
- field @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") @FloatRange(from=0.0f, fromInclusive=false, to=1.0f) public final float minFractionRendered;
- field @FlaggedApi("com.android.window.flags.trusted_presentation_listener_for_window") @IntRange(from=1) public final int stabilityRequirementMs;
}
}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 531aede..159410d 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -1307,6 +1307,7 @@
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public android.os.UserHandle getDeviceOwnerUser();
method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public android.app.admin.DevicePolicyState getDevicePolicyState();
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public String getFinancedDeviceKioskRoleHolder();
+ method @FlaggedApi("android.app.admin.flags.device_policy_size_tracking_enabled") @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public int getMaxPolicyStorageLimit();
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_ADMIN_POLICY}) public java.util.List<java.lang.String> getPermittedAccessibilityServices(int);
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_ADMIN_POLICY}) public java.util.List<java.lang.String> getPermittedInputMethodsForCurrentUser();
method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public java.util.List<android.os.UserHandle> getPolicyManagedProfiles(@NonNull android.os.UserHandle);
@@ -1329,6 +1330,7 @@
method @RequiresPermission(android.Manifest.permission.MANAGE_DEVICE_POLICY_APP_EXEMPTIONS) public void setApplicationExemptions(@NonNull String, @NonNull java.util.Set<java.lang.Integer>) throws android.content.pm.PackageManager.NameNotFoundException;
method @RequiresPermission(android.Manifest.permission.MANAGE_USERS) public void setDeviceProvisioningConfigApplied();
method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void setDpcDownloaded(boolean);
+ method @FlaggedApi("android.app.admin.flags.device_policy_size_tracking_enabled") @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void setMaxPolicyStorageLimit(int);
method @Deprecated @RequiresPermission(value=android.Manifest.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS, conditional=true) public void setProfileOwnerCanAccessDeviceIds(@NonNull android.content.ComponentName);
method public void setSecondaryLockscreenEnabled(@NonNull android.content.ComponentName, boolean);
method @RequiresPermission(android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS) public void setUserProvisioningState(int, @NonNull android.os.UserHandle);
@@ -10432,9 +10434,11 @@
method public int getFlags();
method public int getMode();
field public static final int BUGREPORT_FLAG_DEFER_CONSENT = 2; // 0x2
+ field @FlaggedApi("android.app.admin.flags.onboarding_bugreport_v2_enabled") public static final int BUGREPORT_FLAG_KEEP_BUGREPORT_ON_RETRIEVAL = 4; // 0x4
field public static final int BUGREPORT_FLAG_USE_PREDUMPED_UI_DATA = 1; // 0x1
field public static final int BUGREPORT_MODE_FULL = 0; // 0x0
field public static final int BUGREPORT_MODE_INTERACTIVE = 1; // 0x1
+ field @FlaggedApi("android.app.admin.flags.onboarding_bugreport_v2_enabled") public static final int BUGREPORT_MODE_ONBOARDING = 7; // 0x7
field public static final int BUGREPORT_MODE_REMOTE = 2; // 0x2
field public static final int BUGREPORT_MODE_TELEPHONY = 4; // 0x4
field public static final int BUGREPORT_MODE_WEAR = 3; // 0x3
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index fa232fa..3838b94 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2277,9 +2277,7 @@
}
public final class BugreportParams {
- field @FlaggedApi("android.app.admin.flags.onboarding_bugreport_v2_enabled") public static final int BUGREPORT_FLAG_KEEP_BUGREPORT_ON_RETRIEVAL = 4; // 0x4
field @FlaggedApi("android.os.bugreport_mode_max_value") public static final int BUGREPORT_MODE_MAX_VALUE = 7; // 0x7
- field @FlaggedApi("android.app.admin.flags.onboarding_bugreport_v2_enabled") public static final int BUGREPORT_MODE_ONBOARDING = 7; // 0x7
}
public class Build {
diff --git a/core/java/android/app/admin/DevicePolicyIdentifiers.java b/core/java/android/app/admin/DevicePolicyIdentifiers.java
index 318b2fb..a884ab0 100644
--- a/core/java/android/app/admin/DevicePolicyIdentifiers.java
+++ b/core/java/android/app/admin/DevicePolicyIdentifiers.java
@@ -182,6 +182,12 @@
public static final String USB_DATA_SIGNALING_POLICY = "usbDataSignaling";
/**
+ * String identifier for {@link DevicePolicyManager#setRequiredPasswordComplexity}.
+ */
+ @FlaggedApi(Flags.FLAG_POLICY_ENGINE_MIGRATION_V2_ENABLED)
+ public static final String PASSWORD_COMPLEXITY_POLICY = "passwordComplexity";
+
+ /**
* @hide
*/
public static final String USER_RESTRICTION_PREFIX = "userRestriction_";
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 5c6308f..c53b54c 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -52,6 +52,7 @@
import static android.Manifest.permission.SET_TIME;
import static android.Manifest.permission.SET_TIME_ZONE;
import static android.app.admin.flags.Flags.FLAG_ESIM_MANAGEMENT_ENABLED;
+import static android.app.admin.flags.Flags.FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED;
import static android.app.admin.flags.Flags.onboardingBugreportV2Enabled;
import static android.content.Intent.LOCAL_FLAG_FROM_SYSTEM;
import static android.net.NetworkCapabilities.NET_ENTERPRISE_ID_1;
@@ -17348,4 +17349,46 @@
}
return new HashSet<>();
}
+
+ /**
+ * Controls the maximum storage size allowed for policies associated with an admin.
+ * Setting a limit of -1 effectively removes any storage restrictions.
+ *
+ * @param storageLimit Maximum storage allowed in bytes. Use -1 to disable limits.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS)
+ @FlaggedApi(FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED)
+ public void setMaxPolicyStorageLimit(int storageLimit) {
+ if (mService != null) {
+ try {
+ mService.setMaxPolicyStorageLimit(mContext.getPackageName(), storageLimit);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Retrieves the current maximum storage limit for policies associated with an admin.
+ *
+ * @return The maximum storage limit in bytes, or -1 if no limit is enforced.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS)
+ @FlaggedApi(FLAG_DEVICE_POLICY_SIZE_TRACKING_ENABLED)
+ public int getMaxPolicyStorageLimit() {
+ if (mService != null) {
+ try {
+ return mService.getMaxPolicyStorageLimit(mContext.getPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ return -1;
+ }
}
\ No newline at end of file
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index f72fdc0..c4cbdd6 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -615,4 +615,7 @@
int getContentProtectionPolicy(in ComponentName who, String callerPackageName);
int[] getSubscriptionIds(String callerPackageName);
+
+ void setMaxPolicyStorageLimit(String packageName, int storageLimit);
+ int getMaxPolicyStorageLimit(String packageName);
}
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index 7a4a3f9..9fa7362 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -1,5 +1,7 @@
package android.app.assist;
+import static android.service.autofill.Flags.FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION;
+
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -1278,7 +1280,7 @@
*
* @hide
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
@Nullable
public GetCredentialRequest getCredentialManagerRequest() {
return mGetCredentialRequest;
@@ -1291,7 +1293,7 @@
* @hide
*
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
@Nullable
public OutcomeReceiver<GetCredentialResponse,
GetCredentialException> getCredentialManagerCallback() {
diff --git a/core/java/android/os/BugreportParams.java b/core/java/android/os/BugreportParams.java
index f2ef185..f7b4173 100644
--- a/core/java/android/os/BugreportParams.java
+++ b/core/java/android/os/BugreportParams.java
@@ -21,7 +21,6 @@
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.app.admin.flags.Flags;
-import android.compat.annotation.UnsupportedAppUsage;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -127,12 +126,8 @@
/**
* Options for a lightweight bugreport intended to be taken for onboarding-related flows.
- *
- * @hide
*/
- @TestApi
@FlaggedApi(Flags.FLAG_ONBOARDING_BUGREPORT_V2_ENABLED)
- @UnsupportedAppUsage
public static final int BUGREPORT_MODE_ONBOARDING = IDumpstate.BUGREPORT_MODE_ONBOARDING;
/**
@@ -180,10 +175,7 @@
* The bugreport may be retrieved multiple times using
* {@link BugreportManager#retrieveBugreport(
* String, ParcelFileDescriptor, Executor, BugreportManager.BugreportCallback)}.
- *
- * @hide
*/
- @TestApi
@FlaggedApi(Flags.FLAG_ONBOARDING_BUGREPORT_V2_ENABLED)
public static final int BUGREPORT_FLAG_KEEP_BUGREPORT_ON_RETRIEVAL =
IDumpstate.BUGREPORT_FLAG_KEEP_BUGREPORT_ON_RETRIEVAL;
diff --git a/core/java/android/view/AttachedSurfaceControl.java b/core/java/android/view/AttachedSurfaceControl.java
index ffe0c71..9413f5c 100644
--- a/core/java/android/view/AttachedSurfaceControl.java
+++ b/core/java/android/view/AttachedSurfaceControl.java
@@ -19,10 +19,11 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UiThread;
+import android.content.Context;
import android.graphics.Rect;
import android.graphics.Region;
import android.hardware.HardwareBuffer;
-import android.os.IBinder;
+import android.os.Looper;
import android.window.InputTransferToken;
import android.window.SurfaceSyncGroup;
@@ -180,32 +181,25 @@
}
/**
- * Gets the token used for associating this {@link AttachedSurfaceControl} with
- * {@link SurfaceControlViewHost} instances.
- *
- * <p>This token should be passed to {@link SurfaceControlViewHost}'s constructor.
- * This token will be {@code null} if the window does not have an input channel.
- *
- * @return The SurfaceControlViewHost link token.
- */
- @Nullable
- @FlaggedApi(Flags.FLAG_GET_HOST_TOKEN_API)
- default IBinder getHostToken() {
- throw new UnsupportedOperationException("The getHostToken needs to be "
- + "implemented before making this call.");
- }
-
- /**
* Gets the token used for associating this {@link AttachedSurfaceControl} with an embedded
* {@link SurfaceControlViewHost} or {@link SurfaceControl}
*
- * @return The SurfaceControlViewHost link token. This can return {@code null} if the
- * {@link AttachedSurfaceControl} was created with no registered input
- * @hide
+ * <p>This token should be passed to
+ * {@link SurfaceControlViewHost#SurfaceControlViewHost(Context, Display, InputTransferToken)}
+ * or
+ * {@link WindowManager#registerBatchedSurfaceControlInputReceiver(int, InputTransferToken,
+ * SurfaceControl, Choreographer, SurfaceControlInputReceiver)} or
+ * {@link WindowManager#registerUnbatchedSurfaceControlInputReceiver(int, InputTransferToken,
+ * SurfaceControl, Looper, SurfaceControlInputReceiver)}
+ *
+ * @return The SurfaceControlViewHost link token.
+ * @throws IllegalStateException if the {@link AttachedSurfaceControl} was created with no
+ * registered input
*/
- @Nullable
+ @NonNull
+ @FlaggedApi(Flags.FLAG_SURFACE_CONTROL_INPUT_RECEIVER)
default InputTransferToken getInputTransferToken() {
- throw new UnsupportedOperationException("The getHostToken needs to be "
+ throw new UnsupportedOperationException("The getInputTransferToken needs to be "
+ "implemented before making this call.");
}
diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java
index 58765b4..1dd9cbb 100644
--- a/core/java/android/view/SurfaceControlViewHost.java
+++ b/core/java/android/view/SurfaceControlViewHost.java
@@ -16,6 +16,7 @@
package android.view;
+import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
@@ -33,6 +34,8 @@
import android.window.InputTransferToken;
import android.window.WindowTokenClient;
+import com.android.window.flags.Flags;
+
import dalvik.system.CloseGuard;
import java.util.Objects;
@@ -347,6 +350,25 @@
@Nullable IBinder hostToken) {
this(context, display, hostToken == null ? null : new InputTransferToken(hostToken),
"untracked");
+
+ }
+
+ /**
+ * Construct a new SurfaceControlViewHost. The root Surface will be
+ * allocated internally and is accessible via getSurfacePackage().
+ * <p>
+ * The hostInputTransferToken parameter allows the host and embedded to be associated with
+ * each other to allow transferring touch gesture and focus. This is also used for ANR
+ * reporting. It's accessible from {@link AttachedSurfaceControl#getInputTransferToken()}.
+ *
+ * @param context The Context object for your activity or application.
+ * @param display The Display the hierarchy will be placed on.
+ * @param hostInputTransferToken The host input transfer token, as discussed above.
+ */
+ @FlaggedApi(Flags.FLAG_SURFACE_CONTROL_INPUT_RECEIVER)
+ public SurfaceControlViewHost(@NonNull Context context, @NonNull Display display,
+ @Nullable InputTransferToken hostInputTransferToken) {
+ this(context, display, hostInputTransferToken, "untracked");
}
/**
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 254c4ae..25ade62 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -18,6 +18,7 @@
import static android.content.res.Resources.ID_NULL;
import static android.os.Trace.TRACE_TAG_APP;
+import static android.service.autofill.Flags.FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION;
import static android.view.ContentInfo.SOURCE_DRAG_AND_DROP;
import static android.view.Surface.FRAME_RATE_CATEGORY_HIGH;
import static android.view.Surface.FRAME_RATE_CATEGORY_LOW;
@@ -6995,7 +6996,7 @@
*
* @see #setCredentialManagerRequest
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
public void clearCredentialManagerRequest() {
if (Log.isLoggable(AUTOFILL_LOG_TAG, Log.VERBOSE)) {
Log.v(AUTOFILL_LOG_TAG, "clearCredentialManagerRequest called");
@@ -7027,7 +7028,7 @@
* @param callback to be invoked when either a response or an exception needs to be
* propagated for the given view
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
public void setCredentialManagerRequest(@NonNull GetCredentialRequest request,
@NonNull OutcomeReceiver<GetCredentialResponse, GetCredentialException> callback) {
Preconditions.checkNotNull(request, "request must not be null");
@@ -9944,7 +9945,7 @@
*
* @return The credential request associated with this View.
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
@Nullable
public final GetCredentialRequest getCredentialManagerRequest() {
if (mViewCredentialHandler == null) {
@@ -9968,7 +9969,7 @@
* @return The callback associated with this view that will be invoked on a response from
* {@link CredentialManager} .
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
@Nullable
public final OutcomeReceiver<GetCredentialResponse,
GetCredentialException> getCredentialManagerCallback() {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 28a7334..657c8e6 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -103,7 +103,6 @@
import android.animation.AnimationHandler;
import android.animation.LayoutTransition;
import android.annotation.AnyThread;
-import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
@@ -240,7 +239,6 @@
import com.android.internal.view.RootViewSurfaceTaker;
import com.android.internal.view.SurfaceCallbackHelper;
import com.android.modules.expresslog.Counter;
-import com.android.window.flags.Flags;
import java.io.IOException;
import java.io.OutputStream;
@@ -11220,25 +11218,15 @@
}
/**
- * @return Returns a token used for associating the root surface
- * to {@link SurfaceControlViewHost}.
- */
- @Nullable
- @Override
- @FlaggedApi(Flags.FLAG_GET_HOST_TOKEN_API)
- public IBinder getHostToken() {
- return getInputToken();
- }
-
- /**
* {@inheritDoc}
*/
- @Nullable
+ @NonNull
@Override
public InputTransferToken getInputTransferToken() {
IBinder inputToken = getInputToken();
if (inputToken == null) {
- return null;
+ throw new IllegalStateException(
+ "Called getInputTransferToken for Window with no input channel");
}
return new InputTransferToken(inputToken);
}
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index d86cc4a..131fca7 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -16,6 +16,8 @@
package android.view;
+import static android.service.autofill.Flags.FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION;
+
import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -361,7 +363,7 @@
* {@link ViewStructure#setCredentialManagerRequest(GetCredentialRequest, OutcomeReceiver)}
*/
@Nullable
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
public GetCredentialRequest getCredentialManagerRequest() {
return null;
}
@@ -376,7 +378,7 @@
* {@link ViewStructure#setCredentialManagerRequest(GetCredentialRequest, OutcomeReceiver)}
*/
@Nullable
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
public OutcomeReceiver<
GetCredentialResponse, GetCredentialException> getCredentialManagerCallback() {
return null;
@@ -551,7 +553,7 @@
* @param request the request to be fired
* @param callback the callback where the response or exception, is returned
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
public void setCredentialManagerRequest(@NonNull GetCredentialRequest request,
@NonNull OutcomeReceiver<GetCredentialResponse, GetCredentialException> callback) {}
@@ -559,7 +561,7 @@
* Clears the credential request previously set through
* {@link ViewStructure#setCredentialManagerRequest(GetCredentialRequest, OutcomeReceiver)}
*/
- @FlaggedApi("autofill_credman_dev_integration")
+ @FlaggedApi(FLAG_AUTOFILL_CREDMAN_DEV_INTEGRATION)
public void clearCredentialManagerRequest() {}
/**
diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java
index 58fb273..0302a0d 100644
--- a/core/java/android/view/WindowManager.java
+++ b/core/java/android/view/WindowManager.java
@@ -123,6 +123,7 @@
import android.view.WindowInsets.Type;
import android.view.WindowInsets.Type.InsetsType;
import android.view.accessibility.AccessibilityNodeInfo;
+import android.window.InputTransferToken;
import android.window.TaskFpsCallback;
import android.window.TrustedPresentationThresholds;
@@ -6097,25 +6098,28 @@
* receive batched input event. For those events that are batched, the invocation will happen
* once per {@link Choreographer} frame, and other input events will be delivered immediately.
* This is different from
- * {@link #registerUnbatchedSurfaceControlInputReceiver(int, IBinder, SurfaceControl, Looper,
- * SurfaceControlInputReceiver)} in that the input events are received batched. The caller must
- * invoke {@link #unregisterSurfaceControlInputReceiver(SurfaceControl)} to clean up the
- * resources when no longer needing to use the {@link SurfaceControlInputReceiver}
+ * { #registerUnbatchedSurfaceControlInputReceiver(int, InputTransferToken, SurfaceControl,
+ * Looper, SurfaceControlInputReceiver)} in that the input events are received batched. The
+ * caller must invoke {@link #unregisterSurfaceControlInputReceiver(SurfaceControl)} to clean up
+ * the resources when no longer needing to use the {@link SurfaceControlInputReceiver}
*
- * @param displayId The display that the SurfaceControl will be placed on. Input will
- * only work
- * if SurfaceControl is on that display and that display was touched.
- * @param surfaceControl The SurfaceControl to register the InputChannel for
- * @param hostToken The host token to link the InputChannel for. This is primarily for ANRs
- * to ensure the host receives the ANR if any issues with touch on the
- * InputChannel
- * @param choreographer The Choreographer used for batching. This should match the rendering
- * Choreographer.
- * @param receiver The SurfaceControlInputReceiver that will receive the input events
+ * @param displayId The display that the SurfaceControl will be placed on. Input
+ * will only work if SurfaceControl is on that display and that
+ * display was touched.
+ * @param surfaceControl The SurfaceControl to register the InputChannel for
+ * @param hostInputTransferToken The host token to link the embedded. This is used to handle
+ * transferring touch gesture from host to embedded and for ANRs
+ * to ensure the host receives the ANR if any issues with
+ * touch on the embedded.
+ * @param choreographer The Choreographer used for batching. This should match the
+ * rendering Choreographer.
+ * @param receiver The SurfaceControlInputReceiver that will receive the input
+ * events
*/
@FlaggedApi(Flags.FLAG_SURFACE_CONTROL_INPUT_RECEIVER)
default void registerBatchedSurfaceControlInputReceiver(int displayId,
- @NonNull IBinder hostToken, @NonNull SurfaceControl surfaceControl,
+ @NonNull InputTransferToken hostInputTransferToken,
+ @NonNull SurfaceControl surfaceControl,
@NonNull Choreographer choreographer, @NonNull SurfaceControlInputReceiver receiver) {
throw new UnsupportedOperationException(
"registerBatchedSurfaceControlInputReceiver is not implemented");
@@ -6123,26 +6127,30 @@
/**
* Registers a {@link SurfaceControlInputReceiver} for a {@link SurfaceControl} that will
- * receive every input event. This is different than calling @link
- * #registerBatchedSurfaceControlInputReceiver(int, IBinder, SurfaceControl, Choreographer,
- * SurfaceControlInputReceiver)} in that the input events are received unbatched. The caller
- * must invoke {@link #unregisterSurfaceControlInputReceiver(SurfaceControl)} to clean up the
- * resources when no longer needing to use the {@link SurfaceControlInputReceiver}
+ * receive every input event. This is different than calling
+ * {@link #registerBatchedSurfaceControlInputReceiver(int, InputTransferToken, SurfaceControl,
+ * Choreographer, SurfaceControlInputReceiver)} in that the input events are received
+ * unbatched.
+ * The caller must invoke {@link #unregisterSurfaceControlInputReceiver(SurfaceControl)} to
+ * clean up the resources when no longer needing to use the {@link SurfaceControlInputReceiver}
*
- * @param displayId The display that the SurfaceControl will be placed on. Input will only
- * work if SurfaceControl is on that display and that display was
- * touched.
- * @param hostToken The host token to link the InputChannel for. This is primarily for ANRs
- * to ensure the host receives the ANR if any issues with touch on the
- * InputChannel
- * @param surfaceControl The SurfaceControl to register the InputChannel for
- * @param looper The looper to use when invoking callbacks.
- * @param receiver The SurfaceControlInputReceiver that will receive the input events
- **/
+ * @param displayId The display that the SurfaceControl will be placed on. Input
+ * will only work if SurfaceControl is on that display and that
+ * display was touched.
+ * @param surfaceControl The SurfaceControl to register the InputChannel for
+ * @param hostInputTransferToken The host token to link the embedded. This is used to handle
+ * transferring touch gesture from host to embedded and for ANRs
+ * to ensure the host receives the ANR if any issues with
+ * touch on the embedded.
+ * @param looper The looper to use when invoking callbacks.
+ * @param receiver The SurfaceControlInputReceiver that will receive the input
+ * events.
+ */
@FlaggedApi(Flags.FLAG_SURFACE_CONTROL_INPUT_RECEIVER)
default void registerUnbatchedSurfaceControlInputReceiver(int displayId,
- @NonNull IBinder hostToken, @NonNull SurfaceControl surfaceControl,
- @NonNull Looper looper, @NonNull SurfaceControlInputReceiver receiver) {
+ @NonNull InputTransferToken hostInputTransferToken,
+ @NonNull SurfaceControl surfaceControl, @NonNull Looper looper,
+ @NonNull SurfaceControlInputReceiver receiver) {
throw new UnsupportedOperationException(
"registerUnbatchedSurfaceControlInputReceiver is not implemented");
}
@@ -6152,10 +6160,10 @@
* specified token.
* <p>
* Must be called on the same {@link Looper} thread to which was passed to the
- * {@link #registerBatchedSurfaceControlInputReceiver(int, IBinder, SurfaceControl,
+ * {@link #registerBatchedSurfaceControlInputReceiver(int, InputTransferToken, SurfaceControl,
* Choreographer,
* SurfaceControlInputReceiver)} or
- * {@link #registerUnbatchedSurfaceControlInputReceiver(int, IBinder, SurfaceControl, Looper,
+ * {@link #registerUnbatchedSurfaceControlInputReceiver(int, InputTransferToken, SurfaceControl, Looper,
* SurfaceControlInputReceiver)}
*
* @param surfaceControl The SurfaceControl to remove and unregister the input channel for.
@@ -6171,7 +6179,7 @@
* if the SurfaceControl was registered for input via
* { #registerBatchedSurfaceControlInputReceiver(int, IBinder, SurfaceControl, Choreographer,
* SurfaceControlInputReceiver)} or
- * {@link #registerUnbatchedSurfaceControlInputReceiver(int, IBinder, SurfaceControl, Looper,
+ * {@link #registerUnbatchedSurfaceControlInputReceiver(int, InputTransferToken, SurfaceControl, Looper,
* SurfaceControlInputReceiver)}.
* <p>
* This is helpful for testing to ensure the test waits for the layer to be registered with
diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java
index 2fb5213..1e3d062 100644
--- a/core/java/android/view/WindowManagerImpl.java
+++ b/core/java/android/view/WindowManagerImpl.java
@@ -535,19 +535,19 @@
@Override
public void registerBatchedSurfaceControlInputReceiver(int displayId,
- @NonNull IBinder hostToken, @NonNull SurfaceControl surfaceControl,
- @NonNull Choreographer choreographer, @NonNull SurfaceControlInputReceiver receiver) {
- mGlobal.registerBatchedSurfaceControlInputReceiver(displayId,
- new InputTransferToken(hostToken),
+ @NonNull InputTransferToken hostInputTransferToken,
+ @NonNull SurfaceControl surfaceControl, @NonNull Choreographer choreographer,
+ @NonNull SurfaceControlInputReceiver receiver) {
+ mGlobal.registerBatchedSurfaceControlInputReceiver(displayId, hostInputTransferToken,
surfaceControl, choreographer, receiver);
}
@Override
- public void registerUnbatchedSurfaceControlInputReceiver(
- int displayId, @NonNull IBinder hostToken, @NonNull SurfaceControl surfaceControl,
- @NonNull Looper looper, @NonNull SurfaceControlInputReceiver receiver) {
- mGlobal.registerUnbatchedSurfaceControlInputReceiver(displayId,
- new InputTransferToken(hostToken),
+ public void registerUnbatchedSurfaceControlInputReceiver(int displayId,
+ @NonNull InputTransferToken hostInputTransferToken,
+ @NonNull SurfaceControl surfaceControl, @NonNull Looper looper,
+ @NonNull SurfaceControlInputReceiver receiver) {
+ mGlobal.registerUnbatchedSurfaceControlInputReceiver(displayId, hostInputTransferToken,
surfaceControl, looper, receiver);
}
diff --git a/core/java/android/window/InputTransferToken.java b/core/java/android/window/InputTransferToken.java
index 0601b2a..bed0e0e 100644
--- a/core/java/android/window/InputTransferToken.java
+++ b/core/java/android/window/InputTransferToken.java
@@ -16,6 +16,7 @@
package android.window;
+import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.os.Binder;
import android.os.IBinder;
@@ -23,13 +24,15 @@
import android.os.Parcelable;
import android.view.SurfaceControlViewHost;
+import com.android.window.flags.Flags;
+
import java.util.Objects;
/**
* A token that can be used to request focus on or to transfer touch gesture to a
* {@link SurfaceControlViewHost} or {@link android.view.SurfaceControl} that has an input channel.
- * @hide
*/
+@FlaggedApi(Flags.FLAG_SURFACE_CONTROL_INPUT_RECEIVER)
public final class InputTransferToken implements Parcelable {
/**
* @hide
diff --git a/core/java/android/window/TrustedPresentationThresholds.java b/core/java/android/window/TrustedPresentationThresholds.java
index 90f8834..a30c8fa 100644
--- a/core/java/android/window/TrustedPresentationThresholds.java
+++ b/core/java/android/window/TrustedPresentationThresholds.java
@@ -19,15 +19,15 @@
import android.annotation.FlaggedApi;
import android.annotation.FloatRange;
import android.annotation.IntRange;
-import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;
-import android.view.SurfaceControl;
import androidx.annotation.NonNull;
import com.android.window.flags.Flags;
+import java.util.Objects;
+
/**
* Threshold values that are sent with
* {@link android.view.WindowManager#registerTrustedPresentationListener(IBinder,
@@ -36,33 +36,53 @@
@FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
public final class TrustedPresentationThresholds implements Parcelable {
/**
- * The min alpha the {@link SurfaceControl} is required to have to be considered inside the
+ * The min alpha the Window is required to have to be considered inside the
* threshold.
*/
@FloatRange(from = 0f, fromInclusive = false, to = 1f)
- @FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
- @SuppressLint("InternalField") // simple data class
- public final float minAlpha;
+ private final float mMinAlpha;
/**
- * The min fraction of the SurfaceControl that was presented to the user to be considered
+ * The min fraction of the Window that was presented to the user to be considered
* inside the threshold.
*/
@FloatRange(from = 0f, fromInclusive = false, to = 1f)
- @FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
- @SuppressLint("InternalField") // simple data class
- public final float minFractionRendered;
+ private final float mMinFractionRendered;
/**
- * The time in milliseconds required for the {@link SurfaceControl} to be in the threshold.
+ * The time in milliseconds required for the Window to be in the threshold.
*/
@IntRange(from = 1)
+ private final int mStabilityRequirementMs;
+
+ /**
+ * The min alpha the Window is required to have to be considered inside the
+ * threshold.
+ */
@FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
- @SuppressLint("InternalField") // simple data class
- public final int stabilityRequirementMs;
+ public @FloatRange(from = 0f, fromInclusive = false, to = 1f) float getMinAlpha() {
+ return mMinAlpha;
+ }
+
+ /**
+ * The min fraction of the Window that was presented to the user to be considered
+ * inside the threshold.
+ */
+ @FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
+ public @FloatRange(from = 0f, fromInclusive = false, to = 1f) float getMinFractionRendered() {
+ return mMinFractionRendered;
+ }
+
+ /**
+ * The time in milliseconds required for the Window to be in the threshold.
+ */
+ @FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
+ public @IntRange(from = 1) int getStabilityRequirementMillis() {
+ return mStabilityRequirementMs;
+ }
private void checkValid() {
- if (minAlpha <= 0 || minFractionRendered <= 0 || stabilityRequirementMs < 1) {
+ if (mMinAlpha <= 0 || mMinFractionRendered <= 0 || mStabilityRequirementMs < 1) {
throw new IllegalArgumentException(
"TrustedPresentationThresholds values are invalid");
}
@@ -71,23 +91,23 @@
/**
* Creates a new TrustedPresentationThresholds.
*
- * @param minAlpha The min alpha the {@link SurfaceControl} is required to
+ * @param minAlpha The min alpha the Window is required to
* have to be considered inside the
* threshold.
- * @param minFractionRendered The min fraction of the SurfaceControl that was presented
+ * @param minFractionRendered The min fraction of the Window that was presented
* to the user to be considered
* inside the threshold.
* @param stabilityRequirementMs The time in milliseconds required for the
- * {@link SurfaceControl} to be in the threshold.
+ * Window to be in the threshold.
*/
@FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
public TrustedPresentationThresholds(
@FloatRange(from = 0f, fromInclusive = false, to = 1f) float minAlpha,
@FloatRange(from = 0f, fromInclusive = false, to = 1f) float minFractionRendered,
@IntRange(from = 1) int stabilityRequirementMs) {
- this.minAlpha = minAlpha;
- this.minFractionRendered = minFractionRendered;
- this.stabilityRequirementMs = stabilityRequirementMs;
+ this.mMinAlpha = minAlpha;
+ this.mMinFractionRendered = minFractionRendered;
+ this.mStabilityRequirementMs = stabilityRequirementMs;
checkValid();
}
@@ -95,18 +115,18 @@
@FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
public String toString() {
return "TrustedPresentationThresholds { "
- + "minAlpha = " + minAlpha + ", "
- + "minFractionRendered = " + minFractionRendered + ", "
- + "stabilityRequirementMs = " + stabilityRequirementMs
+ + "minAlpha = " + mMinAlpha + ", "
+ + "minFractionRendered = " + mMinFractionRendered + ", "
+ + "stabilityRequirementMs = " + mStabilityRequirementMs
+ " }";
}
@Override
@FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeFloat(minAlpha);
- dest.writeFloat(minFractionRendered);
- dest.writeInt(stabilityRequirementMs);
+ dest.writeFloat(mMinAlpha);
+ dest.writeFloat(mMinFractionRendered);
+ dest.writeInt(mStabilityRequirementMs);
}
@Override
@@ -115,13 +135,34 @@
return 0;
}
+
+ @Override
+ @FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
+ public int hashCode() {
+ return Objects.hash(mMinAlpha, mMinFractionRendered, mStabilityRequirementMs);
+ }
+
+ @Override
+ @FlaggedApi(Flags.FLAG_TRUSTED_PRESENTATION_LISTENER_FOR_WINDOW)
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof TrustedPresentationThresholds that)) {
+ return false;
+ }
+ return mMinAlpha == that.mMinAlpha
+ && mMinFractionRendered == that.mMinFractionRendered
+ && mStabilityRequirementMs == that.mStabilityRequirementMs;
+ }
+
/**
* @hide
*/
TrustedPresentationThresholds(@NonNull Parcel in) {
- minAlpha = in.readFloat();
- minFractionRendered = in.readFloat();
- stabilityRequirementMs = in.readInt();
+ mMinAlpha = in.readFloat();
+ mMinFractionRendered = in.readFloat();
+ mStabilityRequirementMs = in.readInt();
checkValid();
}
diff --git a/core/java/android/window/flags/window_surfaces.aconfig b/core/java/android/window/flags/window_surfaces.aconfig
index 069affb..3ffa274 100644
--- a/core/java/android/window/flags/window_surfaces.aconfig
+++ b/core/java/android/window/flags/window_surfaces.aconfig
@@ -20,14 +20,6 @@
flag {
namespace: "window_surfaces"
- name: "get_host_token_api"
- description: "Feature flag to associate the host and embedded windows"
- is_fixed_read_only: true
- bug: "304508760"
-}
-
-flag {
- namespace: "window_surfaces"
name: "transfer_gesture_to_embedded"
description: "Enable public API for Window Surfaces"
bug: "287076178"
diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
index 91e6b62..ee260e1 100644
--- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
+++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt
@@ -421,9 +421,11 @@
smallTimeListener?.update(shouldTimeListenerRun)
largeTimeListener?.update(shouldTimeListenerRun)
- // Query ZenMode data
- zenModeCallback.onZenChanged(zenModeController.zen)
- zenModeCallback.onNextAlarmChanged()
+ bgExecutor.execute {
+ // Query ZenMode data
+ zenModeCallback.onZenChanged(zenModeController.zen)
+ zenModeCallback.onNextAlarmChanged()
+ }
}
fun unregisterListeners() {
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index d644235..449e9ab 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -240,7 +240,7 @@
@Override
protected boolean canRestoreAnyVersion() {
- return false;
+ return true;
}
@Override
diff --git a/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
index 817901f..fa2d9bf 100644
--- a/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
+++ b/services/core/java/com/android/server/wm/TrustedPresentationListenerController.java
@@ -322,15 +322,17 @@
var listener = trustedPresentationInfo.mListener;
boolean lastState = trustedPresentationInfo.mLastComputedTrustedPresentationState;
boolean newState =
- (alpha >= trustedPresentationInfo.mThresholds.minAlpha) && (fractionRendered
- >= trustedPresentationInfo.mThresholds.minFractionRendered);
+ (alpha >= trustedPresentationInfo.mThresholds.getMinAlpha())
+ && (fractionRendered >= trustedPresentationInfo.mThresholds
+ .getMinFractionRendered());
trustedPresentationInfo.mLastComputedTrustedPresentationState = newState;
ProtoLog.v(WM_DEBUG_TPL,
"lastState=%s newState=%s alpha=%f minAlpha=%f fractionRendered=%f "
+ "minFractionRendered=%f",
- lastState, newState, alpha, trustedPresentationInfo.mThresholds.minAlpha,
- fractionRendered, trustedPresentationInfo.mThresholds.minFractionRendered);
+ lastState, newState, alpha, trustedPresentationInfo.mThresholds.getMinAlpha(),
+ fractionRendered, trustedPresentationInfo.mThresholds
+ .getMinFractionRendered());
if (lastState && !newState) {
// We were in the trusted presentation state, but now we left it,
@@ -350,13 +352,15 @@
trustedPresentationInfo.mEnteredTrustedPresentationStateTime = currTimeMs;
mHandler.postDelayed(() -> {
computeTpl(mLastWindowHandles);
- }, (long) (trustedPresentationInfo.mThresholds.stabilityRequirementMs * 1.5));
+ }, (long) (trustedPresentationInfo.mThresholds
+ .getStabilityRequirementMillis() * 1.5));
}
// Has the timer elapsed, but we are still in the state? Emit a callback if needed
if (!trustedPresentationInfo.mLastReportedTrustedPresentationState && newState && (
currTimeMs - trustedPresentationInfo.mEnteredTrustedPresentationStateTime
- > trustedPresentationInfo.mThresholds.stabilityRequirementMs)) {
+ > trustedPresentationInfo.mThresholds
+ .getStabilityRequirementMillis())) {
trustedPresentationInfo.mLastReportedTrustedPresentationState = true;
addListenerUpdate(listenerUpdates, listener,
trustedPresentationInfo.mId, /*presentationState*/ true);
@@ -413,15 +417,6 @@
mThresholds = thresholds;
mId = id;
mListener = listener;
- checkValid(thresholds);
- }
-
- private void checkValid(TrustedPresentationThresholds thresholds) {
- if (thresholds.minAlpha <= 0 || thresholds.minFractionRendered <= 0
- || thresholds.stabilityRequirementMs < 1) {
- throw new IllegalArgumentException(
- "TrustedPresentationThresholds values are invalid");
- }
}
}
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
index 105dc88..0ccf810c 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyEngine.java
@@ -102,6 +102,9 @@
DevicePolicyIdentifiers.getIdentifierForUserRestriction(
UserManager.DISALLOW_CELLULAR_2G);
+ //TODO(b/295504706) : Speak to security team to decide what to set Policy_Size_Limit
+ private static final int DEFAULT_POLICY_SIZE_LIMIT = -1;
+
private final Context mContext;
private final UserManager mUserManager;
@@ -122,10 +125,11 @@
* Map containing the current set of admins in each user with active policies.
*/
private final SparseArray<Set<EnforcingAdmin>> mEnforcingAdmins;
+
private final SparseArray<HashMap<EnforcingAdmin, Integer>> mAdminPolicySize;
- //TODO(b/295504706) : Speak to security team to decide what to set Policy_Size_Limit
- private static final int POLICY_SIZE_LIMIT = 99999;
+ private int mPolicySizeLimit = DEFAULT_POLICY_SIZE_LIMIT;
+
private final DeviceAdminServiceController mDeviceAdminServiceController;
DevicePolicyEngine(
@@ -1594,7 +1598,9 @@
existingPolicySize = sizeOf(policyState.getPoliciesSetByAdmins().get(admin));
}
int policySize = sizeOf(value);
- if (currentAdminPoliciesSize + policySize - existingPolicySize < POLICY_SIZE_LIMIT) {
+ // Policy size limit is disabled if mPolicySizeLimit is -1.
+ if (mPolicySizeLimit == -1
+ || currentAdminPoliciesSize + policySize - existingPolicySize < mPolicySizeLimit) {
increasePolicySizeForAdmin(
admin, /* policySizeDiff = */ policySize - existingPolicySize);
return true;
@@ -1642,6 +1648,26 @@
}
}
+ /**
+ * Updates the max allowed size limit for policies per admin. Setting it to -1, disables
+ * the limitation.
+ */
+ void setMaxPolicyStorageLimit(int storageLimit) {
+ if (storageLimit < DEFAULT_POLICY_SIZE_LIMIT && storageLimit != -1) {
+ throw new IllegalArgumentException("Can't set a size limit less than the minimum "
+ + "allowed size.");
+ }
+ mPolicySizeLimit = storageLimit;
+ }
+
+ /**
+ * Returns the max allowed size limit for policies per admin. -1 means the limitation is
+ * disabled.
+ */
+ int getMaxPolicyStorageLimit() {
+ return mPolicySizeLimit;
+ }
+
public void dump(IndentingPrintWriter pw) {
synchronized (mLock) {
pw.println("Local Policies: ");
@@ -1761,6 +1787,7 @@
private static final String TAG_ENFORCING_ADMIN_AND_SIZE = "enforcing-admin-and-size";
private static final String TAG_ENFORCING_ADMIN = "enforcing-admin";
private static final String TAG_POLICY_SUM_SIZE = "policy-sum-size";
+ private static final String TAG_MAX_POLICY_SIZE_LIMIT = "max-policy-size-limit";
private static final String ATTR_USER_ID = "user-id";
private static final String ATTR_POLICY_SUM_SIZE = "size";
@@ -1805,6 +1832,7 @@
writeGlobalPoliciesInner(serializer);
writeEnforcingAdminsInner(serializer);
writeEnforcingAdminSizeInner(serializer);
+ writeMaxPolicySizeInner(serializer);
}
private void writeLocalPoliciesInner(TypedXmlSerializer serializer) throws IOException {
@@ -1886,6 +1914,17 @@
}
}
+ private void writeMaxPolicySizeInner(TypedXmlSerializer serializer)
+ throws IOException {
+ if (!devicePolicySizeTrackingEnabled()) {
+ return;
+ }
+ serializer.startTag(/* namespace= */ null, TAG_MAX_POLICY_SIZE_LIMIT);
+ serializer.attributeInt(
+ /* namespace= */ null, ATTR_POLICY_SUM_SIZE, mPolicySizeLimit);
+ serializer.endTag(/* namespace= */ null, TAG_MAX_POLICY_SIZE_LIMIT);
+ }
+
void readFromFileLocked() {
if (!mFile.exists()) {
Log.d(TAG, "" + mFile + " doesn't exist");
@@ -1926,6 +1965,9 @@
case TAG_ENFORCING_ADMIN_AND_SIZE:
readEnforcingAdminAndSizeInner(parser);
break;
+ case TAG_MAX_POLICY_SIZE_LIMIT:
+ readMaxPolicySizeInner(parser);
+ break;
default:
Slogf.wtf(TAG, "Unknown tag " + tag);
}
@@ -2036,5 +2078,13 @@
}
mAdminPolicySize.get(admin.getUserId()).put(admin, size);
}
+
+ private void readMaxPolicySizeInner(TypedXmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ if (!devicePolicySizeTrackingEnabled()) {
+ return;
+ }
+ mPolicySizeLimit = parser.getAttributeInt(/* namespace= */ null, ATTR_POLICY_SUM_SIZE);
+ }
}
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index b7a2271..9bf41f9 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -101,6 +101,7 @@
import static android.app.AppOpsManager.OPSTR_SYSTEM_EXEMPT_FROM_SUSPENSION;
import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_AFFILIATED;
import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER;
+import static android.app.admin.DeviceAdminInfo.HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED;
import static android.app.admin.DeviceAdminInfo.USES_POLICY_FORCE_LOCK;
import static android.app.admin.DeviceAdminInfo.USES_POLICY_WIPE_DATA;
import static android.app.admin.DeviceAdminReceiver.ACTION_COMPLIANCE_ACKNOWLEDGEMENT_REQUIRED;
@@ -9524,7 +9525,11 @@
private int getHeadlessDeviceOwnerMode() {
synchronized (getLockObject()) {
- return getDeviceOwnerAdminLocked().info.getHeadlessDeviceOwnerMode();
+ ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked();
+ if (deviceOwner == null) {
+ return HEADLESS_DEVICE_OWNER_MODE_UNSUPPORTED;
+ }
+ return deviceOwner.info.getHeadlessDeviceOwnerMode();
}
}
@@ -12042,8 +12047,10 @@
}
if (packageList != null) {
- for (String pkg : packageList) {
- PolicySizeVerifier.enforceMaxPackageNameLength(pkg);
+ if (!devicePolicySizeTrackingEnabled()) {
+ for (String pkg : packageList) {
+ PolicySizeVerifier.enforceMaxPackageNameLength(pkg);
+ }
}
List<InputMethodInfo> enabledImes = mInjector.binderWithCleanCallingIdentity(() ->
@@ -12279,17 +12286,18 @@
}
final CallerIdentity caller = getCallerIdentity(admin);
+ // Only allow the system user to use this method
+ Preconditions.checkCallAuthorization(caller.getUserHandle().isSystem(),
+ "createAndManageUser was called from non-system user");
+ Preconditions.checkCallAuthorization(isDefaultDeviceOwner(caller));
+ checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_CREATE_AND_MANAGE_USER);
+
if (headlessDeviceOwnerSingleUserEnabled()) {
// Block this method if the device is in headless main user mode
Preconditions.checkCallAuthorization(
getHeadlessDeviceOwnerMode() != HEADLESS_DEVICE_OWNER_MODE_SINGLE_USER,
"createAndManageUser was called while in headless single user mode");
}
- // Only allow the system user to use this method
- Preconditions.checkCallAuthorization(caller.getUserHandle().isSystem(),
- "createAndManageUser was called from non-system user");
- Preconditions.checkCallAuthorization(isDefaultDeviceOwner(caller));
- checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_CREATE_AND_MANAGE_USER);
final boolean ephemeral = (flags & DevicePolicyManager.MAKE_USER_EPHEMERAL) != 0;
final boolean demo = (flags & DevicePolicyManager.MAKE_USER_DEMO) != 0
@@ -14362,8 +14370,10 @@
public void setLockTaskPackages(ComponentName who, String callerPackageName, String[] packages)
throws SecurityException {
Objects.requireNonNull(packages, "packages is null");
- for (String pkg : packages) {
- PolicySizeVerifier.enforceMaxPackageNameLength(pkg);
+ if (!devicePolicySizeTrackingEnabled()) {
+ for (String pkg : packages) {
+ PolicySizeVerifier.enforceMaxPackageNameLength(pkg);
+ }
}
CallerIdentity caller = getCallerIdentity(who, callerPackageName);
@@ -24075,5 +24085,30 @@
}
return adminOwnedSubscriptions;
});
+
+ }
+
+ @Override
+ public void setMaxPolicyStorageLimit(String callerPackageName, int storageLimit) {
+ if (!devicePolicySizeTrackingEnabled()) {
+ return;
+ }
+ CallerIdentity caller = getCallerIdentity(callerPackageName);
+ enforcePermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, caller.getPackageName(),
+ caller.getUserId());
+
+ mDevicePolicyEngine.setMaxPolicyStorageLimit(storageLimit);
+ }
+
+ @Override
+ public int getMaxPolicyStorageLimit(String callerPackageName) {
+ if (!devicePolicySizeTrackingEnabled()) {
+ return -1;
+ }
+ CallerIdentity caller = getCallerIdentity(callerPackageName);
+ enforcePermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, caller.getPackageName(),
+ caller.getUserId());
+
+ return mDevicePolicyEngine.getMaxPolicyStorageLimit();
}
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index d50affb..a0f2395 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -18,7 +18,6 @@
import static android.content.pm.ShortcutInfo.DISABLED_REASON_BACKUP_NOT_SUPPORTED;
import static android.content.pm.ShortcutInfo.DISABLED_REASON_NOT_DISABLED;
import static android.content.pm.ShortcutInfo.DISABLED_REASON_SIGNATURE_MISMATCH;
-import static android.content.pm.ShortcutInfo.DISABLED_REASON_VERSION_LOWER;
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.anyOrNull;
import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.anyStringOrNull;
@@ -78,7 +77,6 @@
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.LauncherApps;
-import android.content.pm.LauncherApps.PinItemRequest;
import android.content.pm.LauncherApps.ShortcutQuery;
import android.content.pm.PackageInfo;
import android.content.pm.ShortcutInfo;
@@ -4844,7 +4842,7 @@
doReturn(expected != DISABLED_REASON_SIGNATURE_MISMATCH).when(
mMockPackageManagerInternal).isDataRestoreSafe(any(byte[].class), anyString());
- assertEquals(expected, spi.canRestoreTo(mService, pi, anyVersionOk));
+ assertEquals(expected, spi.canRestoreTo(mService, pi, true));
}
public void testCanRestoreTo() {
@@ -4872,7 +4870,6 @@
checkCanRestoreTo(DISABLED_REASON_SIGNATURE_MISMATCH, spi1, false, 10, true, "x");
checkCanRestoreTo(DISABLED_REASON_SIGNATURE_MISMATCH, spi1, false, 10, true, "x", "y");
checkCanRestoreTo(DISABLED_REASON_SIGNATURE_MISMATCH, spi1, false, 10, true, "x");
- checkCanRestoreTo(DISABLED_REASON_VERSION_LOWER, spi1, false, 9, true, "sig1");
// Any version okay.
checkCanRestoreTo(DISABLED_REASON_NOT_DISABLED, spi1, true, 9, true, "sig1");
@@ -5983,14 +5980,6 @@
});
}
- public void testBackupAndRestore_publisherLowerVersion() {
- prepareForBackupTest();
-
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 0); // Lower version
-
- checkBackupAndRestore_publisherNotRestored(ShortcutInfo.DISABLED_REASON_VERSION_LOWER);
- }
-
public void testBackupAndRestore_publisherWrongSignature() {
prepareForBackupTest();
@@ -6626,252 +6615,6 @@
});
}
-
- /**
- * Restored to a lower version with no manifest shortcuts. All shortcuts are now invisible,
- * and all calls from the publisher should ignore them.
- */
- public void testBackupAndRestore_disabledShortcutsAreIgnored() {
- // Publish two manifest shortcuts.
- addManifestShortcutResource(
- new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
- R.xml.shortcut_5_altalt);
- updatePackageVersion(CALLING_PACKAGE_1, 1);
- mService.mPackageMonitor.onReceive(mServiceContext,
- genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertTrue(mManager.setDynamicShortcuts(list(
- makeShortcutWithShortLabel("s1", "original-title"),
- makeShortcut("s2"), makeShortcut("s3"))));
- });
-
- // Pin from launcher 1.
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- mLauncherApps.pinShortcuts(CALLING_PACKAGE_1,
- list("ms1", "ms2", "ms3", "ms4", "s1", "s2"), HANDLE_USER_0);
- });
-
- doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(
- any(byte[].class), anyString());
-
- backupAndRestore();
-
- // Lower the version and remove the manifest shortcuts.
- addManifestShortcutResource(
- new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()),
- R.xml.shortcut_0);
- addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 0); // Lower version
-
- // When re-installing the app, the manifest shortcut should be re-published.
- mService.mPackageMonitor.onReceive(mServiceContext,
- genPackageAddIntent(CALLING_PACKAGE_1, USER_0));
- mService.mPackageMonitor.onReceive(mServiceContext,
- genPackageAddIntent(LAUNCHER_1, USER_0));
-
- // No shortcuts should be visible to the publisher.
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
- assertWith(getCallerVisibleShortcuts())
- .isEmpty();
- });
-
- final Runnable checkAllDisabledForLauncher = () -> {
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertWith(getShortcutAsLauncher(USER_0))
- .areAllPinned()
- .haveIds("ms1", "ms2", "ms3", "ms4", "s1", "s2")
- .areAllDisabled()
- .areAllWithDisabledReason(ShortcutInfo.DISABLED_REASON_VERSION_LOWER)
-
- .forShortcutWithId("s1", si -> {
- assertEquals("original-title", si.getShortLabel());
- })
- .forShortcutWithId("ms1", si -> {
- assertEquals("string-com.android.test.1-user:0-res:"
- + R.string.shortcut_title1 + "/en"
- , si.getShortLabel());
- })
- .forShortcutWithId("ms2", si -> {
- assertEquals("string-com.android.test.1-user:0-res:"
- + R.string.shortcut_title2 + "/en"
- , si.getShortLabel());
- })
- .forShortcutWithId("ms3", si -> {
- assertEquals("string-com.android.test.1-user:0-res:"
- + R.string.shortcut_title1 + "/en"
- , si.getShortLabel());
- assertEquals("string-com.android.test.1-user:0-res:"
- + R.string.shortcut_title2 + "/en"
- , si.getLongLabel());
- })
- .forShortcutWithId("ms4", si -> {
- assertEquals("string-com.android.test.1-user:0-res:"
- + R.string.shortcut_title2 + "/en"
- , si.getShortLabel());
- assertEquals("string-com.android.test.1-user:0-res:"
- + R.string.shortcut_title2 + "/en"
- , si.getLongLabel());
- });
- });
- };
-
- checkAllDisabledForLauncher.run();
-
- runWithCaller(CALLING_PACKAGE_1, USER_0, () -> {
-
- makeCallerForeground(); // CALLING_PACKAGE_1 is now in the foreground.
-
- // All changing API calls should be ignored.
-
- getManager().enableShortcuts(list("ms1", "ms2", "ms3", "ms4", "s1", "s2"));
- checkAllDisabledForLauncher.run();
-
- getManager().enableShortcuts(list("ms1", "ms2", "ms3", "ms4", "s1", "s2"));
- checkAllDisabledForLauncher.run();
-
- getManager().enableShortcuts(list("ms1", "ms2", "ms3", "ms4", "s1", "s2"));
- checkAllDisabledForLauncher.run();
-
- getManager().removeAllDynamicShortcuts();
- getManager().removeDynamicShortcuts(list("ms1", "ms2", "ms3", "ms4", "s1", "s2"));
- checkAllDisabledForLauncher.run();
-
- getManager().updateShortcuts(list(makeShortcutWithShortLabel("s1", "new-title")));
- checkAllDisabledForLauncher.run();
-
-
- // Add a shortcut -- even though ms1 was immutable, it will succeed.
- assertTrue(getManager().addDynamicShortcuts(list(
- makeShortcutWithShortLabel("ms1", "original-title"))));
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertWith(getShortcutAsLauncher(USER_0))
- .haveIds("ms1", "ms2", "ms3", "ms4", "s1", "s2")
-
- .selectByIds("ms1")
- .areAllEnabled()
- .areAllDynamic()
- .areAllPinned()
- .forAllShortcuts(si -> {
- assertEquals("original-title", si.getShortLabel());
- })
-
- // The rest still exist and disabled.
- .revertToOriginalList()
- .selectByIds("ms2", "ms3", "ms4", "s1", "s2")
- .areAllDisabled()
- .areAllPinned()
- ;
- });
-
- assertTrue(getManager().setDynamicShortcuts(list(
- makeShortcutWithShortLabel("ms2", "new-title-2"))));
-
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertWith(getShortcutAsLauncher(USER_0))
- .haveIds("ms1", "ms2", "ms3", "ms4", "s1", "s2")
-
- .selectByIds("ms1")
- .areAllEnabled()
- .areAllNotDynamic() // ms1 was not in the list, so no longer dynamic.
- .areAllPinned()
- .areAllMutable()
- .forAllShortcuts(si -> {
- assertEquals("original-title", si.getShortLabel());
- })
-
- .revertToOriginalList()
- .selectByIds("ms2")
- .areAllEnabled()
- .areAllDynamic()
- .areAllPinned()
- .areAllMutable()
- .forAllShortcuts(si -> {
- assertEquals("new-title-2", si.getShortLabel());
- })
-
- // The rest still exist and disabled.
- .revertToOriginalList()
- .selectByIds("ms3", "ms4", "s1", "s2")
- .areAllDisabled()
- .areAllPinned()
- ;
- });
-
- // Prepare for requestPinShortcut().
- setDefaultLauncher(USER_0, LAUNCHER_1);
- mPinConfirmActivityFetcher = (packageName, userId) ->
- new ComponentName(packageName, PIN_CONFIRM_ACTIVITY_CLASS);
-
- mManager.requestPinShortcut(
- makeShortcutWithShortLabel("ms3", "new-title-3"),
- /*PendingIntent=*/ null);
-
- // Note this was pinned, so it'll be accepted right away.
- runWithCaller(LAUNCHER_1, USER_0, () -> {
- assertWith(getShortcutAsLauncher(USER_0))
- .selectByIds("ms3")
- .areAllEnabled()
- .areAllNotDynamic()
- .areAllPinned()
- .areAllMutable()
- .forAllShortcuts(si -> {
- assertEquals("new-title-3", si.getShortLabel());
- // The new one replaces the old manifest shortcut, so the long label
- // should be gone now.
- assertNull(si.getLongLabel());
- });
- });
-
- // Now, change the launcher to launcher2, and request pin again.
- setDefaultLauncher(USER_0, LAUNCHER_2);
-
- reset(mServiceContext);
-
- assertTrue(mManager.isRequestPinShortcutSupported());
- mManager.requestPinShortcut(
- makeShortcutWithShortLabel("ms4", "new-title-4"),
- /*PendingIntent=*/ null);
-
- // Initially there should be no pinned shortcuts for L2.
- runWithCaller(LAUNCHER_2, USER_0, () -> {
- assertWith(getShortcutAsLauncher(USER_0))
- .selectPinned()
- .isEmpty();
-
- final ArgumentCaptor<Intent> intent = ArgumentCaptor.forClass(Intent.class);
-
- verify(mServiceContext).startActivityAsUser(intent.capture(), eq(HANDLE_USER_0));
-
- assertEquals(LauncherApps.ACTION_CONFIRM_PIN_SHORTCUT,
- intent.getValue().getAction());
- assertEquals(LAUNCHER_2, intent.getValue().getComponent().getPackageName());
-
- // Check the request object.
- final PinItemRequest request = mLauncherApps.getPinItemRequest(intent.getValue());
-
- assertNotNull(request);
- assertEquals(PinItemRequest.REQUEST_TYPE_SHORTCUT, request.getRequestType());
-
- assertWith(request.getShortcutInfo())
- .haveIds("ms4")
- .areAllOrphan()
- .forAllShortcuts(si -> {
- assertEquals("new-title-4", si.getShortLabel());
- // The new one replaces the old manifest shortcut, so the long label
- // should be gone now.
- assertNull(si.getLongLabel());
- });
- assertTrue(request.accept());
-
- assertWith(getShortcutAsLauncher(USER_0))
- .selectPinned()
- .haveIds("ms4")
- .areAllEnabled();
- });
- });
- }
-
/**
* Test for restoring the pre-P backup format.
*/
diff --git a/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/EmbeddedWindowService.java b/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/EmbeddedWindowService.java
index 14230fe..0fb4f90 100644
--- a/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/EmbeddedWindowService.java
+++ b/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/EmbeddedWindowService.java
@@ -42,6 +42,7 @@
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.TextView;
+import android.window.InputTransferToken;
public class EmbeddedWindowService extends Service {
private static final String TAG = "EmbeddedWindowService";
@@ -118,7 +119,7 @@
@Override
public void attachEmbeddedSurfaceControl(SurfaceControl parentSc, int displayId,
- IBinder hostToken) {
+ InputTransferToken inputTransferToken) {
mHandler.post(() -> {
Paint paint = new Paint();
paint.setTextSize(40);
@@ -134,7 +135,7 @@
c.drawText("Remote", 250, 250, paint);
surface.unlockCanvasAndPost(c);
WindowManager wm = getSystemService(WindowManager.class);
- wm.registerBatchedSurfaceControlInputReceiver(displayId, hostToken,
+ wm.registerBatchedSurfaceControlInputReceiver(displayId, inputTransferToken,
mSurfaceControl,
Choreographer.getInstance(), event -> {
Log.d(TAG, "onInputEvent-remote " + event);
diff --git a/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/IAttachEmbeddedWindow.aidl b/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/IAttachEmbeddedWindow.aidl
index 6b65b40e..e81f5f8 100644
--- a/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/IAttachEmbeddedWindow.aidl
+++ b/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/IAttachEmbeddedWindow.aidl
@@ -20,10 +20,12 @@
import com.android.test.viewembed.IAttachEmbeddedWindowCallback;
import android.view.WindowManager.LayoutParams;
import android.view.SurfaceControl;
+import android.window.InputTransferToken;
interface IAttachEmbeddedWindow {
void attachEmbedded(IBinder hostToken, int width, int height, in IAttachEmbeddedWindowCallback callback);
void relayout(in LayoutParams lp);
- oneway void attachEmbeddedSurfaceControl(in SurfaceControl parentSurfaceControl, int displayId, IBinder hostToken);
+ oneway void attachEmbeddedSurfaceControl(in SurfaceControl parentSurfaceControl, int displayId,
+ in InputTransferToken inputTransferToken);
oneway void tearDownEmbeddedSurfaceControl();
}
\ No newline at end of file
diff --git a/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/SurfaceInputTestActivity.java b/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/SurfaceInputTestActivity.java
index 7330ec1..e700bc2 100644
--- a/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/SurfaceInputTestActivity.java
+++ b/tests/SurfaceControlViewHostTest/src/com/android/test/viewembed/SurfaceInputTestActivity.java
@@ -139,7 +139,7 @@
surface.unlockCanvasAndPost(c);
WindowManager wm = getSystemService(WindowManager.class);
wm.registerBatchedSurfaceControlInputReceiver(getDisplayId(),
- attachedSurfaceControl.getHostToken(), mLocalSurfaceControl,
+ attachedSurfaceControl.getInputTransferToken(), mLocalSurfaceControl,
Choreographer.getInstance(), event -> {
Log.d(TAG, "onInputEvent-sc " + event);
return false;
@@ -160,7 +160,8 @@
WindowManager wm = getSystemService(WindowManager.class);
wm.registerBatchedSurfaceControlInputReceiver(getDisplayId(),
- mLocalSurfaceView.getHostToken(), mLocalSurfaceView.getSurfaceControl(),
+ mLocalSurfaceView.getRootSurfaceControl().getInputTransferToken(),
+ mLocalSurfaceView.getSurfaceControl(),
Choreographer.getInstance(), event -> {
Log.d(TAG, "onInputEvent-local " + event);
return false;
@@ -210,7 +211,8 @@
}
try {
mIAttachEmbeddedWindow.attachEmbeddedSurfaceControl(mParentSurfaceControl,
- getDisplayId(), mRemoteSurfaceView.getHostToken());
+ getDisplayId(),
+ mRemoteSurfaceView.getRootSurfaceControl().getInputTransferToken());
} catch (RemoteException e) {
Log.e(TAG, "Failed to load embedded SurfaceControl", e);
}