Merge "Add "New Window" option to Handle Menu." into main
diff --git a/AconfigFlags.bp b/AconfigFlags.bp
index 7a1add3..6b8baf8 100644
--- a/AconfigFlags.bp
+++ b/AconfigFlags.bp
@@ -99,6 +99,7 @@
"framework_graphics_flags_java_lib",
"hwui_flags_java_lib",
"libcore_exported_aconfig_flags_lib",
+ "libgui_flags_java_lib",
"power_flags_lib",
"sdk_sandbox_flags_lib",
"surfaceflinger_flags_java_lib",
@@ -1208,6 +1209,12 @@
defaults: ["framework-minus-apex-aconfig-java-defaults"],
}
+java_aconfig_library {
+ name: "libgui_flags_java_lib",
+ aconfig_declarations: "libgui_flags",
+ defaults: ["framework-minus-apex-aconfig-java-defaults"],
+}
+
// Content Capture
aconfig_declarations {
name: "android.view.contentcapture.flags-aconfig",
diff --git a/core/api/current.txt b/core/api/current.txt
index c5a70df..3c5a31c 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -43911,6 +43911,7 @@
field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String KEY_SATELLITE_ENTITLEMENT_STATUS_REFRESH_DAYS_INT = "satellite_entitlement_status_refresh_days_int";
field @FlaggedApi("com.android.internal.telephony.flags.carrier_enabled_satellite_flag") public static final String KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL = "satellite_entitlement_supported_bool";
field @FlaggedApi("com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn") public static final String KEY_SATELLITE_ESOS_SUPPORTED_BOOL = "satellite_esos_supported_bool";
+ field @FlaggedApi("com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn") public static final String KEY_SATELLITE_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC_INT = "satellite_screen_off_inactivity_timeout_duration_sec_int";
field public static final String KEY_SHOW_4G_FOR_3G_DATA_ICON_BOOL = "show_4g_for_3g_data_icon_bool";
field public static final String KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL = "show_4g_for_lte_data_icon_bool";
field public static final String KEY_SHOW_APN_SETTING_CDMA_BOOL = "show_apn_setting_cdma_bool";
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index fd0262e..bed1b43 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -3465,6 +3465,7 @@
public static class VirtualDeviceManager.VirtualDevice implements java.lang.AutoCloseable {
method public void addActivityListener(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void addActivityPolicyExemption(@NonNull android.content.ComponentName);
+ method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void addActivityPolicyExemption(@NonNull android.content.ComponentName, int);
method public void addSoundEffectListener(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.SoundEffectListener);
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void close();
method @NonNull public android.content.Context createContext();
@@ -3489,8 +3490,10 @@
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void registerIntentInterceptor(@NonNull android.content.IntentFilter, @NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.IntentInterceptorCallback);
method public void removeActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener);
method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull android.content.ComponentName);
+ method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void removeActivityPolicyExemption(@NonNull android.content.ComponentName, int);
method public void removeSoundEffectListener(@NonNull android.companion.virtual.VirtualDeviceManager.SoundEffectListener);
method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setDevicePolicy(int, int);
+ method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setDevicePolicy(int, int, int);
method @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setDisplayImePolicy(int, int);
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void setShowPointerIcon(boolean);
method @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public void unregisterIntentInterceptor(@NonNull android.companion.virtual.VirtualDeviceManager.IntentInterceptorCallback);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 07e4f22..2f80b30 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -7066,9 +7066,6 @@
&& level >= ComponentCallbacks2.TRIM_MEMORY_BACKGROUND) {
return;
}
- if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) {
- PropertyInvalidatedCache.onTrimMemory();
- }
final ArrayList<ComponentCallbacks2> callbacks =
collectComponentCallbacks(true /* includeUiContexts */);
diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java
index 27f9f54..22804a2 100644
--- a/core/java/android/app/PropertyInvalidatedCache.java
+++ b/core/java/android/app/PropertyInvalidatedCache.java
@@ -1617,18 +1617,4 @@
Log.e(TAG, "Failed to dump PropertyInvalidatedCache instances");
}
}
-
- /**
- * Trim memory by clearing all the caches.
- * @hide
- */
- public static void onTrimMemory() {
- ArrayList<PropertyInvalidatedCache> activeCaches;
- synchronized (sGlobalLock) {
- activeCaches = getActiveCaches();
- }
- for (int i = 0; i < activeCaches.size(); i++) {
- activeCaches.get(i).clear();
- }
- }
}
diff --git a/core/java/android/companion/virtual/IVirtualDevice.aidl b/core/java/android/companion/virtual/IVirtualDevice.aidl
index 0653839..a56bc02 100644
--- a/core/java/android/companion/virtual/IVirtualDevice.aidl
+++ b/core/java/android/companion/virtual/IVirtualDevice.aidl
@@ -112,6 +112,24 @@
void removeActivityPolicyExemption(in ComponentName exemption);
/**
+ * Specifies a policy for this virtual device on the given display.
+ */
+ @EnforcePermission("CREATE_VIRTUAL_DEVICE")
+ void setDevicePolicyForDisplay(int displayId, int policyType, int devicePolicy);
+
+ /**
+ * Adds an exemption to the default activity launch policy on the given display.
+ */
+ @EnforcePermission("CREATE_VIRTUAL_DEVICE")
+ void addActivityPolicyExemptionForDisplay(int displayId, in ComponentName exemption);
+
+ /**
+ * Removes an exemption to the default activity launch policy on the given display.
+ */
+ @EnforcePermission("CREATE_VIRTUAL_DEVICE")
+ void removeActivityPolicyExemptionForDisplay(int displayId, in ComponentName exemption);
+
+ /**
* Notifies that an audio session being started.
*/
@EnforcePermission("CREATE_VIRTUAL_DEVICE")
diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java
index d3fcfc6..d8899b2 100644
--- a/core/java/android/companion/virtual/VirtualDeviceInternal.java
+++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java
@@ -17,7 +17,11 @@
package android.companion.virtual;
import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM;
+import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_ACTIVITY;
import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_AUDIO;
+import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_BLOCKED_ACTIVITY_BEHAVIOR;
+import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_CLIPBOARD;
+import static android.companion.virtual.VirtualDeviceParams.POLICY_TYPE_RECENTS;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
@@ -282,6 +286,16 @@
void setDevicePolicy(@VirtualDeviceParams.DynamicPolicyType int policyType,
@VirtualDeviceParams.DevicePolicy int devicePolicy) {
+ switch (policyType) {
+ case POLICY_TYPE_RECENTS:
+ case POLICY_TYPE_CLIPBOARD:
+ case POLICY_TYPE_ACTIVITY:
+ case POLICY_TYPE_BLOCKED_ACTIVITY_BEHAVIOR:
+ break;
+ default:
+ throw new IllegalArgumentException("Device policy " + policyType
+ + " cannot be changed at runtime. ");
+ }
try {
mVirtualDevice.setDevicePolicy(policyType, devicePolicy);
} catch (RemoteException e) {
@@ -305,6 +319,42 @@
}
}
+ void setDevicePolicyForDisplay(int displayId,
+ @VirtualDeviceParams.DynamicDisplayPolicyType int policyType,
+ @VirtualDeviceParams.DevicePolicy int devicePolicy) {
+ switch (policyType) {
+ case POLICY_TYPE_RECENTS:
+ case POLICY_TYPE_ACTIVITY:
+ break;
+ default:
+ throw new IllegalArgumentException("Device policy " + policyType
+ + " cannot be changed for a specific display. ");
+ }
+
+ try {
+ mVirtualDevice.setDevicePolicyForDisplay(displayId, policyType, devicePolicy);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ void addActivityPolicyExemptionForDisplay(int displayId, @NonNull ComponentName componentName) {
+ try {
+ mVirtualDevice.addActivityPolicyExemptionForDisplay(displayId, componentName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ void removeActivityPolicyExemptionForDisplay(int displayId,
+ @NonNull ComponentName componentName) {
+ try {
+ mVirtualDevice.removeActivityPolicyExemptionForDisplay(displayId, componentName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
@NonNull
VirtualDpad createVirtualDpad(@NonNull VirtualDpadConfig config) {
try {
diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java
index 296ca33..42da7e9 100644
--- a/core/java/android/companion/virtual/VirtualDeviceManager.java
+++ b/core/java/android/companion/virtual/VirtualDeviceManager.java
@@ -739,6 +739,7 @@
*
* @param policyType the type of policy, i.e. which behavior to specify a policy for.
* @param devicePolicy the value of the policy, i.e. how to interpret the device behavior.
+ * @throws IllegalArgumentException if the policy cannot be changed at runtime.
*
* @see VirtualDeviceParams#POLICY_TYPE_RECENTS
* @see VirtualDeviceParams#POLICY_TYPE_ACTIVITY
@@ -797,6 +798,81 @@
}
/**
+ * Specifies a policy for this virtual device to be applied on the given virtual display.
+ * <p>
+ * Any policy specified for a particular display takes precedence over the policy specified
+ * for the device itself.
+ * </p>
+ *
+ * @param policyType the type of policy, i.e. which behavior to specify a policy for.
+ * @param devicePolicy the value of the policy, i.e. how to interpret the device behavior.
+ * @param displayId the ID of the display, for which to apply the policy.
+ * @throws IllegalArgumentException if the specified policy cannot be changed per
+ * display or if the specified display does not belong to the virtual device.
+ *
+ * @see #setDevicePolicy(int, int)
+ * @see VirtualDeviceParams#POLICY_TYPE_RECENTS
+ * @see VirtualDeviceParams#POLICY_TYPE_ACTIVITY
+ */
+ @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ public void setDevicePolicy(
+ @VirtualDeviceParams.DynamicDisplayPolicyType int policyType,
+ @VirtualDeviceParams.DevicePolicy int devicePolicy,
+ int displayId) {
+ mVirtualDeviceInternal.setDevicePolicyForDisplay(displayId, policyType, devicePolicy);
+ }
+
+ /**
+ * Specifies a component name to be exempt from the given display's activity launch policy.
+ *
+ * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
+ * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
+ * then the specified component will be blocked from launching.
+ * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
+ * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then the
+ * specified component will be allowed to launch.</p>
+ *
+ * <p>Note that changing the activity launch policy will clear current set of exempt
+ * components.</p>
+ * <p>Any change to the exemptions will only be applied for new activity launches.</p>
+ *
+ * @see #removeActivityPolicyExemption
+ * @see #setDevicePolicy
+ */
+ @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ public void addActivityPolicyExemption(
+ @NonNull ComponentName componentName, int displayId) {
+ mVirtualDeviceInternal.addActivityPolicyExemptionForDisplay(
+ displayId, Objects.requireNonNull(componentName));
+ }
+
+ /**
+ * Makes the specified component name adhere to the given display's activity launch policy.
+ *
+ * <p>If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} allows activity
+ * launches by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_DEFAULT}),
+ * then the specified component will be allowed to launch.
+ * If the current {@link VirtualDeviceParams#POLICY_TYPE_ACTIVITY} blocks activity launches
+ * by default, (i.e. it is {@link VirtualDeviceParams#DEVICE_POLICY_CUSTOM}), then the
+ * specified component will be blocked from launching.</p>
+ *
+ * <p>Note that changing the activity launch policy will clear current set of exempt
+ * components.</p>
+ *
+ * @see #addActivityPolicyExemption
+ * @see #setDevicePolicy
+ */
+ @FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
+ @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ public void removeActivityPolicyExemption(
+ @NonNull ComponentName componentName, int displayId) {
+ mVirtualDeviceInternal.removeActivityPolicyExemptionForDisplay(
+ displayId, Objects.requireNonNull(componentName));
+ }
+
+ /**
* Creates a virtual dpad.
*
* @param config the configurations of the virtual dpad.
diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java
index f7f842f..c1fc51d 100644
--- a/core/java/android/companion/virtual/VirtualDeviceParams.java
+++ b/core/java/android/companion/virtual/VirtualDeviceParams.java
@@ -159,7 +159,8 @@
* @hide
*/
@IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_SENSORS, POLICY_TYPE_AUDIO,
- POLICY_TYPE_RECENTS, POLICY_TYPE_ACTIVITY, POLICY_TYPE_CAMERA})
+ POLICY_TYPE_RECENTS, POLICY_TYPE_ACTIVITY, POLICY_TYPE_CAMERA,
+ POLICY_TYPE_BLOCKED_ACTIVITY_BEHAVIOR})
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
public @interface PolicyType {}
@@ -177,6 +178,17 @@
public @interface DynamicPolicyType {}
/**
+ * Policy types that can be dynamically changed for a specific display.
+ *
+ * @see VirtualDeviceManager.VirtualDevice#setDevicePolicyForDisplay
+ * @hide
+ */
+ @IntDef(prefix = "POLICY_TYPE_", value = {POLICY_TYPE_RECENTS, POLICY_TYPE_ACTIVITY})
+ @Retention(RetentionPolicy.SOURCE)
+ @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE})
+ public @interface DynamicDisplayPolicyType {}
+
+ /**
* Tells the sensor framework how to handle sensor requests from contexts associated with this
* virtual device, namely the sensors returned by
* {@link android.hardware.SensorManager#getSensorList}:
@@ -229,6 +241,8 @@
* @see VirtualDeviceManager.VirtualDevice#addActivityPolicyExemption
* @see VirtualDeviceManager.VirtualDevice#removeActivityPolicyExemption
*/
+ // TODO(b/333443509): Update the documentation of custom policy and link to the new policy
+ // POLICY_TYPE_BLOCKED_ACTIVITY_BEHAVIOR
@FlaggedApi(Flags.FLAG_DYNAMIC_POLICY)
public static final int POLICY_TYPE_ACTIVITY = 3;
@@ -276,6 +290,7 @@
* experience on the virtual device.
* </ul>
*/
+ // TODO(b/333443509): Link to POLICY_TYPE_ACTIVITY
@FlaggedApi(android.companion.virtualdevice.flags.Flags.FLAG_ACTIVITY_CONTROL_API)
public static final int POLICY_TYPE_BLOCKED_ACTIVITY_BEHAVIOR = 6;
diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java
index 634469d..a7641c0 100644
--- a/core/java/android/view/SurfaceControl.java
+++ b/core/java/android/view/SurfaceControl.java
@@ -164,6 +164,9 @@
float width, float height, float vecX, float vecY,
float maxStretchAmountX, float maxStretchAmountY, float childRelativeLeft,
float childRelativeTop, float childRelativeRight, float childRelativeBottom);
+ private static native void nativeSetEdgeExtensionEffect(long transactionObj, long nativeObj,
+ boolean leftEdge, boolean rightEdge,
+ boolean topEdge, boolean bottomEdge);
private static native void nativeSetTrustedOverlay(long transactionObj, long nativeObject,
int isTrustedOverlay);
private static native void nativeSetDropInputMode(
@@ -3513,6 +3516,19 @@
/**
* @hide
*/
+ public Transaction setEdgeExtensionEffect(SurfaceControl sc, int edge) {
+ checkPreconditions(sc);
+
+ nativeSetEdgeExtensionEffect(
+ mNativeObject, sc.mNativeObject,
+ (edge & WindowInsets.Side.LEFT) != 0, (edge & WindowInsets.Side.RIGHT) != 0,
+ (edge & WindowInsets.Side.TOP) != 0, (edge & WindowInsets.Side.BOTTOM) != 0);
+ return this;
+ }
+
+ /**
+ * @hide
+ */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.O)
public Transaction setLayerStack(SurfaceControl sc, int layerStack) {
checkPreconditions(sc);
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index d40b72c..2ac5873 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -2949,7 +2949,8 @@
* @param callback Consumer callback that provides {@code true} if view belongs to allowed
* delegate package declared in
* {@link #prepareStylusHandwritingDelegation(View, String)} and handwriting
- * session can start.
+ * session can start. Note: The caller should hold a reference to the callback.
+ * The framework only holds a weak reference.
* @see #prepareStylusHandwritingDelegation(View, String)
* @see #acceptStylusHandwritingDelegation(View)
*/
@@ -2979,7 +2980,8 @@
* @param delegatorPackageName package name of the delegator that handled initial stylus stroke.
* @param flags {@link #HANDWRITING_DELEGATE_FLAG_HOME_DELEGATOR_ALLOWED} or {@code 0}
* @param executor The executor to run the callback on.
- * @param callback {@code true>} would be received if delegation was accepted.
+ * @param callback {@code true} would be received if delegation was accepted. The caller should
+ * hold a reference to the callback. The framework only holds a weak reference.
* @see #prepareStylusHandwritingDelegation(View, String)
* @see #acceptStylusHandwritingDelegation(View)
*/
diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java
index 6258f5c..ca4d1b6 100644
--- a/core/java/com/android/internal/app/ChooserActivity.java
+++ b/core/java/com/android/internal/app/ChooserActivity.java
@@ -2960,10 +2960,10 @@
}
private boolean shouldShowStickyContentPreviewNoOrientationCheck() {
- return shouldShowTabs()
- && (mMultiProfilePagerAdapter.getListAdapterForUserHandle(
- UserHandle.of(UserHandle.myUserId())).getCount() > 0
- || shouldShowStickyContentPreviewWhenEmpty())
+ ResolverListAdapter adapter = mMultiProfilePagerAdapter.getListAdapterForUserHandle(
+ UserHandle.of(UserHandle.myUserId()));
+ boolean isEmpty = adapter == null || adapter.getCount() == 0;
+ return shouldShowTabs() && (!isEmpty || shouldShowStickyContentPreviewWhenEmpty())
&& shouldShowContentPreview();
}
diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp
index 9ce7658..0f53164 100644
--- a/core/jni/android_view_SurfaceControl.cpp
+++ b/core/jni/android_view_SurfaceControl.cpp
@@ -22,6 +22,7 @@
#include <android/graphics/properties.h>
#include <android/graphics/region.h>
#include <android/gui/BnWindowInfosReportedListener.h>
+#include <android/gui/EdgeExtensionParameters.h>
#include <android/gui/JankData.h>
#include <android/hardware/display/IDeviceProductInfoConstants.h>
#include <android/os/IInputConstants.h>
@@ -799,6 +800,20 @@
transaction->setStretchEffect(ctrl, stretch);
}
+static void nativeSetEdgeExtensionEffect(JNIEnv* env, jclass clazz, jlong transactionObj,
+ jlong nativeObj, jboolean leftEdge, jboolean rightEdge,
+ jboolean topEdge, jboolean bottomEdge) {
+ auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
+ auto* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObj);
+
+ auto effect = gui::EdgeExtensionParameters();
+ effect.extendLeft = leftEdge;
+ effect.extendRight = rightEdge;
+ effect.extendTop = topEdge;
+ effect.extendBottom = bottomEdge;
+ transaction->setEdgeExtensionEffect(ctrl, effect);
+}
+
static void nativeSetFlags(JNIEnv* env, jclass clazz, jlong transactionObj,
jlong nativeObject, jint flags, jint mask) {
auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
@@ -2340,6 +2355,8 @@
(void*)nativeSetBlurRegions },
{"nativeSetStretchEffect", "(JJFFFFFFFFFF)V",
(void*) nativeSetStretchEffect },
+ {"nativeSetEdgeExtensionEffect", "(JJZZZZ)V",
+ (void*) nativeSetEdgeExtensionEffect },
{"nativeSetShadowRadius", "(JJF)V",
(void*)nativeSetShadowRadius },
{"nativeSetFrameRate", "(JJFII)V",
diff --git a/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java b/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java
index cd6abdd..b5ee130 100644
--- a/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java
+++ b/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java
@@ -375,20 +375,4 @@
PropertyInvalidatedCache.MODULE_BLUETOOTH, "getState");
assertEquals(n1, "cache_key.bluetooth.get_state");
}
-
- @Test
- public void testOnTrimMemory() {
- TestCache cache = new TestCache(MODULE, "trimMemoryTest");
- // The cache is not active until it has been invalidated once.
- cache.invalidateCache();
- // Populate the cache with six entries.
- for (int i = 0; i < 6; i++) {
- cache.query(i);
- }
- // The maximum number of entries in TestCache is 4, so even though six entries were
- // created, only four are retained.
- assertEquals(4, cache.size());
- PropertyInvalidatedCache.onTrimMemory();
- assertEquals(0, cache.size());
- }
}
diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt
index 2493e98..6d63971 100644
--- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt
+++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeFlags.kt
@@ -46,7 +46,8 @@
DYNAMIC_INITIAL_BOUNDS(Flags::enableWindowingDynamicInitialBounds, true),
ENABLE_DESKTOP_WINDOWING_TASK_LIMIT(Flags::enableDesktopWindowingTaskLimit, true),
BACK_NAVIGATION(Flags::enableDesktopWindowingBackNavigation, true),
- EDGE_DRAG_RESIZE(Flags::enableWindowingEdgeDragResize, true);
+ EDGE_DRAG_RESIZE(Flags::enableWindowingEdgeDragResize, true),
+ TASKBAR_RUNNING_APPS(Flags::enableDesktopWindowingTaskbarRunningApps, true);
/**
* Determines state of flag based on the actual flag and desktop mode developer option
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
index 08de900..271c07d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java
@@ -19,6 +19,8 @@
import static android.view.WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP;
import static android.window.TaskConstants.TASK_CHILD_LAYER_COMPAT_UI;
+import static com.android.wm.shell.shared.desktopmode.DesktopModeFlags.DESKTOP_WINDOWING_MODE;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.TaskInfo;
@@ -38,7 +40,6 @@
import com.android.wm.shell.compatui.api.CompatUIEvent;
import com.android.wm.shell.compatui.impl.CompatUIEvents.SizeCompatRestartButtonAppeared;
import com.android.wm.shell.shared.desktopmode.DesktopModeFlags;
-import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import java.util.function.Consumer;
@@ -82,7 +83,7 @@
super(context, taskInfo, syncQueue, taskListener, displayLayout);
mCallback = callback;
mHasSizeCompat = taskInfo.appCompatTaskInfo.topActivityInSizeCompat;
- if (DesktopModeStatus.canEnterDesktopMode(context)
+ if (DESKTOP_WINDOWING_MODE.isEnabled(mContext)
&& DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(context)) {
// Don't show the SCM button for freeform tasks
mHasSizeCompat &= !taskInfo.isFreeform();
@@ -138,7 +139,7 @@
boolean canShow) {
final boolean prevHasSizeCompat = mHasSizeCompat;
mHasSizeCompat = taskInfo.appCompatTaskInfo.topActivityInSizeCompat;
- if (DesktopModeStatus.canEnterDesktopMode(mContext)
+ if (DESKTOP_WINDOWING_MODE.isEnabled(mContext)
&& DesktopModeFlags.DYNAMIC_INITIAL_BOUNDS.isEnabled(mContext)) {
// Don't show the SCM button for freeform tasks
mHasSizeCompat &= !taskInfo.isFreeform();
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
index 1a6ca0e..eca3c1f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeShellCommandHandler.kt
@@ -63,8 +63,7 @@
pw.println("Error: task id should be an integer")
return false
}
-
- return controller.moveToDesktop(taskId, transitionSource = UNKNOWN)
+ return controller.moveTaskToDesktop(taskId, transitionSource = UNKNOWN)
}
private fun runMoveToNextDisplay(args: Array<String>, pw: PrintWriter): Boolean {
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
index 167b516..2bb172f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt
@@ -256,81 +256,82 @@
/** Returns true if any tasks are visible in Desktop Mode. */
fun isDesktopModeShowing(displayId: Int): Boolean = visibleTaskCount(displayId) > 0
- /** Enter desktop by using the focused task in given `displayId` */
+ /** Moves focused task to desktop mode for given [displayId]. */
fun moveFocusedTaskToDesktop(displayId: Int, transitionSource: DesktopModeTransitionSource) {
- val allFocusedTasks =
- shellTaskOrganizer.getRunningTasks(displayId).filter { taskInfo ->
- taskInfo.isFocused &&
- (taskInfo.windowingMode == WINDOWING_MODE_FULLSCREEN ||
- taskInfo.windowingMode == WINDOWING_MODE_MULTI_WINDOW) &&
- taskInfo.activityType != ACTIVITY_TYPE_HOME
- }
- if (allFocusedTasks.isNotEmpty()) {
- when (allFocusedTasks.size) {
- 2 -> {
- // Split-screen case where there are two focused tasks, then we find the child
- // task to move to desktop.
- val splitFocusedTask =
- if (allFocusedTasks[0].taskId == allFocusedTasks[1].parentTaskId) {
- allFocusedTasks[1]
- } else {
- allFocusedTasks[0]
- }
- moveToDesktop(splitFocusedTask, transitionSource = transitionSource)
- }
- 1 -> {
- // Fullscreen case where we move the current focused task.
- moveToDesktop(allFocusedTasks[0].taskId, transitionSource = transitionSource)
- }
- else -> logW("Cannot enter desktop, expected < 3 focused tasks, found %d",
- allFocusedTasks.size)
- }
+ val allFocusedTasks = getAllFocusedTasks(displayId)
+ when (allFocusedTasks.size) {
+ 0 -> return
+ // Full screen case
+ 1 -> moveRunningTaskToDesktop(
+ allFocusedTasks.single(), transitionSource = transitionSource)
+ // Split-screen case where there are two focused tasks, then we find the child
+ // task to move to desktop.
+ 2 -> moveRunningTaskToDesktop(
+ getSplitFocusedTask(allFocusedTasks[0], allFocusedTasks[1]),
+ transitionSource = transitionSource)
+ else -> logW(
+ "DesktopTasksController: Cannot enter desktop, expected less " +
+ "than 3 focused tasks but found %d", allFocusedTasks.size)
}
}
- /** Move a task with given `taskId` to desktop */
- fun moveToDesktop(
+ /**
+ * Returns all focused tasks in full screen or split screen mode in [displayId] when
+ * it is not the home activity.
+ */
+ private fun getAllFocusedTasks(displayId: Int): List<RunningTaskInfo> =
+ shellTaskOrganizer.getRunningTasks(displayId).filter {
+ it.isFocused &&
+ (it.windowingMode == WINDOWING_MODE_FULLSCREEN ||
+ it.windowingMode == WINDOWING_MODE_MULTI_WINDOW) &&
+ it.activityType != ACTIVITY_TYPE_HOME
+ }
+
+ /** Returns child task from two focused tasks in split screen mode. */
+ private fun getSplitFocusedTask(task1: RunningTaskInfo, task2: RunningTaskInfo) =
+ if (task1.taskId == task2.parentTaskId) task2 else task1
+
+ /** Moves task to desktop mode if task is running, else launches it in desktop mode. */
+ fun moveTaskToDesktop(
taskId: Int,
wct: WindowContainerTransaction = WindowContainerTransaction(),
transitionSource: DesktopModeTransitionSource,
): Boolean {
- shellTaskOrganizer.getRunningTaskInfo(taskId)?.let {
- moveToDesktop(it, wct, transitionSource)
+ val runningTask = shellTaskOrganizer.getRunningTaskInfo(taskId)
+ if (runningTask == null) {
+ return moveBackgroundTaskToDesktop(taskId, wct, transitionSource)
}
- ?: moveToDesktopFromNonRunningTask(taskId, wct, transitionSource)
+ moveRunningTaskToDesktop(runningTask, wct, transitionSource)
return true
}
- private fun moveToDesktopFromNonRunningTask(
- taskId: Int,
- wct: WindowContainerTransaction,
- transitionSource: DesktopModeTransitionSource,
+ private fun moveBackgroundTaskToDesktop(
+ taskId: Int,
+ wct: WindowContainerTransaction,
+ transitionSource: DesktopModeTransitionSource,
): Boolean {
- recentTasksController?.findTaskInBackground(taskId)?.let {
- logV("moveToDesktopFromNonRunningTask with taskId=%d, displayId=%d", taskId)
- // TODO(342378842): Instead of using default display, support multiple displays
- val taskToMinimize =
- bringDesktopAppsToFrontBeforeShowingNewTask(DEFAULT_DISPLAY, wct, taskId)
- addMoveToDesktopChangesNonRunningTask(wct, taskId)
- // TODO(343149901): Add DPI changes for task launch
- val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
- addPendingMinimizeTransition(transition, taskToMinimize)
- return true
+ if (recentTasksController?.findTaskInBackground(taskId) == null) {
+ logW("moveBackgroundTaskToDesktop taskId=%d not found", taskId)
+ return false
}
- ?: return false
+ logV("moveBackgroundTaskToDesktop with taskId=%d, displayId=%d", taskId)
+ // TODO(342378842): Instead of using default display, support multiple displays
+ val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(
+ DEFAULT_DISPLAY, wct, taskId)
+ wct.startTask(
+ taskId,
+ ActivityOptions.makeBasic().apply {
+ launchWindowingMode = WINDOWING_MODE_FREEFORM
+ }.toBundle(),
+ )
+ // TODO(343149901): Add DPI changes for task launch
+ val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource)
+ addPendingMinimizeTransition(transition, taskToMinimize)
+ return true
}
- private fun addMoveToDesktopChangesNonRunningTask(
- wct: WindowContainerTransaction,
- taskId: Int
- ) {
- val options = ActivityOptions.makeBasic()
- options.launchWindowingMode = WINDOWING_MODE_FREEFORM
- wct.startTask(taskId, options.toBundle())
- }
-
- /** Move a task to desktop */
- fun moveToDesktop(
+ /** Moves a running task to desktop. */
+ fun moveRunningTaskToDesktop(
task: RunningTaskInfo,
wct: WindowContainerTransaction = WindowContainerTransaction(),
transitionSource: DesktopModeTransitionSource,
@@ -340,7 +341,7 @@
logW("Cannot enter desktop for taskId %d, ineligible top activity found", task.taskId)
return
}
- logV("moveToDesktop taskId=%d", task.taskId)
+ logV("moveRunningTaskToDesktop taskId=%d", task.taskId)
exitSplitIfApplicable(wct, task)
// Bring other apps to front first
val taskToMinimize =
@@ -1574,8 +1575,8 @@
}
override fun moveToDesktop(taskId: Int, transitionSource: DesktopModeTransitionSource) {
- executeRemoteCallWithTaskPermission(controller, "moveToDesktop") { c ->
- c.moveToDesktop(taskId, transitionSource = transitionSource)
+ executeRemoteCallWithTaskPermission(controller, "moveTaskToDesktop") { c ->
+ c.moveTaskToDesktop(taskId, transitionSource = transitionSource)
}
}
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
index 54f908b..da7e03f 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java
@@ -19,7 +19,6 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.content.pm.PackageManager.FEATURE_PC;
-import static com.android.window.flags.Flags.enableDesktopWindowingTaskbarRunningApps;
import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_RECENT_TASKS;
import android.app.ActivityManager;
@@ -365,7 +364,7 @@
private boolean shouldEnableRunningTasksForDesktopMode() {
return mPcFeatureEnabled
|| (DesktopModeStatus.canEnterDesktopMode(mContext)
- && enableDesktopWindowingTaskbarRunningApps());
+ && DesktopModeFlags.TASKBAR_RUNNING_APPS.isEnabled(mContext));
}
@VisibleForTesting
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
index 64cbe81..633067d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java
@@ -518,7 +518,7 @@
mInteractionJankMonitor.begin(decoration.mTaskSurface, mContext,
CUJ_DESKTOP_MODE_ENTER_MODE_APP_HANDLE_MENU);
mWindowDecorByTaskId.get(mTaskId).addCaptionInset(wct);
- mDesktopTasksController.moveToDesktop(mTaskId, wct,
+ mDesktopTasksController.moveTaskToDesktop(mTaskId, wct,
DesktopModeTransitionSource.APP_HANDLE_MENU_BUTTON);
decoration.closeHandleMenu();
} else if (id == R.id.fullscreen_button) {
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
index 95d9017..c3d31ba 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt
@@ -277,7 +277,7 @@
}
@Test
- fun instantiate_canNotEnterDesktopMode_doNotAddInitCallback() {
+ fun instantiate_cannotEnterDesktopMode_doNotAddInitCallback() {
whenever(DesktopModeStatus.canEnterDesktopMode(context)).thenReturn(false)
clearInvocations(shellInit)
@@ -752,36 +752,36 @@
val task = setUpFullscreenTask()
val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
}
@Test
- fun moveToDesktop_tdaFreeform_windowingModeSetToUndefined() {
+ fun moveRunningTaskToDesktop_tdaFreeform_windowingModeSetToUndefined() {
val task = setUpFullscreenTask()
val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!!
tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode)
.isEqualTo(WINDOWING_MODE_UNDEFINED)
}
@Test
- fun moveToDesktop_nonExistentTask_doesNothing() {
- controller.moveToDesktop(999, transitionSource = UNKNOWN)
+ fun moveTaskToDesktop_nonExistentTask_doesNothing() {
+ controller.moveTaskToDesktop(999, transitionSource = UNKNOWN)
verifyEnterDesktopWCTNotExecuted()
}
@Test
@DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
- fun moveToDesktop_desktopWallpaperDisabled_nonRunningTask_launchesInFreeform() {
+ fun moveTaskToDesktop_desktopWallpaperDisabled_nonRunningTask_launchesInFreeform() {
val task = createTaskInfo(1)
whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null)
whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task)
- controller.moveToDesktop(task.taskId, transitionSource = UNKNOWN)
+ controller.moveTaskToDesktop(task.taskId, transitionSource = UNKNOWN)
with(getLatestEnterDesktopWct()) {
assertLaunchTaskAt(0, task.taskId, WINDOWING_MODE_FREEFORM)
@@ -790,12 +790,12 @@
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
- fun moveToDesktop_desktopWallpaperEnabled_nonRunningTask_launchesInFreeform() {
+ fun moveTaskToDesktop_desktopWallpaperEnabled_nonRunningTask_launchesInFreeform() {
val task = createTaskInfo(1)
whenever(shellTaskOrganizer.getRunningTaskInfo(anyInt())).thenReturn(null)
whenever(recentTasksController.findTaskInBackground(anyInt())).thenReturn(task)
- controller.moveToDesktop(task.taskId, transitionSource = UNKNOWN)
+ controller.moveTaskToDesktop(task.taskId, transitionSource = UNKNOWN)
with(getLatestEnterDesktopWct()) {
// Add desktop wallpaper activity
@@ -807,7 +807,7 @@
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
- fun moveToDesktop_topActivityTranslucentWithStyleFloating_taskIsMovedToDesktop() {
+ fun moveRunningTaskToDesktop_topActivityTranslucentWithStyleFloating_taskIsMovedToDesktop() {
val task =
setUpFullscreenTask().apply {
isTopActivityTransparent = true
@@ -815,7 +815,7 @@
numActivities = 1
}
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
@@ -823,7 +823,7 @@
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
- fun moveToDesktop_topActivityTranslucentWithoutStyleFloating_doesNothing() {
+ fun moveRunningTaskToDesktop_topActivityTranslucentWithoutStyleFloating_doesNothing() {
val task =
setUpFullscreenTask().apply {
isTopActivityTransparent = true
@@ -831,13 +831,13 @@
numActivities = 1
}
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
verifyEnterDesktopWCTNotExecuted()
}
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
- fun moveToDesktop_systemUIActivity_doesNothing() {
+ fun moveRunningTaskToDesktop_systemUIActivity_doesNothing() {
val task = setUpFullscreenTask()
// Set task as systemUI package
@@ -846,15 +846,15 @@
val baseComponent = ComponentName(systemUIPackageName, /* class */ "")
task.baseActivity = baseComponent
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
verifyEnterDesktopWCTNotExecuted()
}
@Test
- fun moveToDesktop_deviceSupported_taskIsMovedToDesktop() {
+ fun moveRunningTaskToDesktop_deviceSupported_taskIsMovedToDesktop() {
val task = setUpFullscreenTask()
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
@@ -862,13 +862,13 @@
@Test
@DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
- fun moveToDesktop_otherFreeformTasksBroughtToFront_desktopWallpaperDisabled() {
+ fun moveRunningTaskToDesktop_otherFreeformTasksBroughtToFront_desktopWallpaperDisabled() {
val homeTask = setUpHomeTask()
val freeformTask = setUpFreeformTask()
val fullscreenTask = setUpFullscreenTask()
markTaskHidden(freeformTask)
- controller.moveToDesktop(fullscreenTask, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(fullscreenTask, transitionSource = UNKNOWN)
with(getLatestEnterDesktopWct()) {
// Operations should include home task, freeform task
@@ -881,12 +881,12 @@
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
- fun moveToDesktop_otherFreeformTasksBroughtToFront_desktopWallpaperEnabled() {
+ fun moveRunningTaskToDesktop_otherFreeformTasksBroughtToFront_desktopWallpaperEnabled() {
val freeformTask = setUpFreeformTask()
val fullscreenTask = setUpFullscreenTask()
markTaskHidden(freeformTask)
- controller.moveToDesktop(fullscreenTask, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(fullscreenTask, transitionSource = UNKNOWN)
with(getLatestEnterDesktopWct()) {
// Operations should include wallpaper intent, freeform task, fullscreen task
@@ -900,7 +900,7 @@
}
@Test
- fun moveToDesktop_onlyFreeformTasksFromCurrentDisplayBroughtToFront() {
+ fun moveRunningTaskToDesktop_onlyFreeformTasksFromCurrentDisplayBroughtToFront() {
setUpHomeTask(displayId = DEFAULT_DISPLAY)
val freeformTaskDefault = setUpFreeformTask(displayId = DEFAULT_DISPLAY)
val fullscreenTaskDefault = setUpFullscreenTask(displayId = DEFAULT_DISPLAY)
@@ -910,7 +910,7 @@
val freeformTaskSecond = setUpFreeformTask(displayId = SECOND_DISPLAY)
markTaskHidden(freeformTaskSecond)
- controller.moveToDesktop(fullscreenTaskDefault, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(fullscreenTaskDefault, transitionSource = UNKNOWN)
with(getLatestEnterDesktopWct()) {
// Check that hierarchy operations do not include tasks from second display
@@ -921,9 +921,9 @@
}
@Test
- fun moveToDesktop_splitTaskExitsSplit() {
+ fun moveRunningTaskToDesktop_splitTaskExitsSplit() {
val task = setUpSplitScreenTask()
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
verify(splitScreenController)
@@ -931,9 +931,9 @@
}
@Test
- fun moveToDesktop_fullscreenTaskDoesNotExitSplit() {
+ fun moveRunningTaskToDesktop_fullscreenTaskDoesNotExitSplit() {
val task = setUpFullscreenTask()
- controller.moveToDesktop(task, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(task, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.changes[task.token.asBinder()]?.windowingMode).isEqualTo(WINDOWING_MODE_FREEFORM)
verify(splitScreenController, never())
@@ -942,12 +942,12 @@
@Test
@DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
- fun moveToDesktop_desktopWallpaperDisabled_bringsTasksOver_dontShowBackTask() {
+ fun moveRunningTaskToDesktop_desktopWallpaperDisabled_bringsTasksOver_dontShowBackTask() {
val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() }
val newTask = setUpFullscreenTask()
val homeTask = setUpHomeTask()
- controller.moveToDesktop(newTask, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(newTask, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.hierarchyOps.size).isEqualTo(MAX_TASK_LIMIT + 1) // visible tasks + home
@@ -960,12 +960,12 @@
@Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY)
- fun moveToDesktop_desktopWallpaperEnabled_bringsTasksOverLimit_dontShowBackTask() {
+ fun moveRunningTaskToDesktop_desktopWallpaperEnabled_bringsTasksOverLimit_dontShowBackTask() {
val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() }
val newTask = setUpFullscreenTask()
val homeTask = setUpHomeTask()
- controller.moveToDesktop(newTask, transitionSource = UNKNOWN)
+ controller.moveRunningTaskToDesktop(newTask, transitionSource = UNKNOWN)
val wct = getLatestEnterDesktopWct()
assertThat(wct.hierarchyOps.size).isEqualTo(MAX_TASK_LIMIT + 2) // tasks + home + wallpaper
diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/EdgeToEdgeUtils.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/EdgeToEdgeUtils.java
index 6e53012..062e9b8 100644
--- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/EdgeToEdgeUtils.java
+++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/EdgeToEdgeUtils.java
@@ -36,7 +36,7 @@
* Enable Edge to Edge and handle overlaps using insets. It should be called before
* setContentView.
*/
- static void enable(@NonNull ComponentActivity activity) {
+ public static void enable(@NonNull ComponentActivity activity) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.VANILLA_ICE_CREAM) {
return;
}
diff --git a/packages/SystemUI/aconfig/biometrics_framework.aconfig b/packages/SystemUI/aconfig/biometrics_framework.aconfig
index bd1a442..e81d5d5 100644
--- a/packages/SystemUI/aconfig/biometrics_framework.aconfig
+++ b/packages/SystemUI/aconfig/biometrics_framework.aconfig
@@ -4,13 +4,6 @@
# NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
flag {
- name: "bp_talkback"
- namespace: "biometrics_framework"
- description: "Adds talkback directional guidance when using UDFPS with biometric prompt"
- bug: "310044658"
-}
-
-flag {
name: "constraint_bp"
namespace: "biometrics_framework"
description: "Refactors Biometric Prompt to use a ConstraintLayout"
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
index cde703b..5e9badc 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModelTest.kt
@@ -156,6 +156,43 @@
assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
}
+ @Test
+ fun deviceEntryBackgroundView_onCancel() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ val deviceEntryBackgroundViewAlpha by
+ collectLastValue(underTest.deviceEntryBackgroundViewAlpha)
+ runCurrent()
+
+ // GIVEN transition START
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(0f)
+
+ // WHEN transition is cancelled
+ repository.sendTransitionStep(step(.1f, TransitionState.CANCELED))
+
+ // THEN alpha is immediately set to 1f (expected lockscreen alpha state)
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
+ }
+
+ @Test
+ fun deviceEntryParentViewAlpha_onCancel() =
+ testScope.runTest {
+ fingerprintPropertyRepository.supportsUdfps()
+ val deviceEntryBackgroundViewAlpha by
+ collectLastValue(underTest.deviceEntryParentViewAlpha)
+ runCurrent()
+
+ // GIVEN transition START
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+
+ // WHEN transition is cancelled
+ repository.sendTransitionStep(step(.1f, TransitionState.CANCELED))
+
+ // THEN alpha is immediately set to 1f (expected lockscreen alpha state)
+ assertThat(deviceEntryBackgroundViewAlpha).isEqualTo(1f)
+ }
+
private fun step(
value: Float,
state: TransitionState = TransitionState.RUNNING
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
index 6ce7e88..e6ea64f 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModelTest.kt
@@ -201,6 +201,24 @@
assertThat(actual).isEqualTo(0f)
}
+ @Test
+ fun deviceEntryParentViewAlpha_shadeNotExpanded_onCancel() =
+ testScope.runTest {
+ val actual by collectLastValue(underTest.deviceEntryParentViewAlpha)
+ shadeExpanded(false)
+ runCurrent()
+
+ // START transition
+ repository.sendTransitionStep(step(0f, TransitionState.STARTED))
+ assertThat(actual).isEqualTo(1f)
+
+ // WHEN transition is canceled
+ repository.sendTransitionStep(step(1f, TransitionState.CANCELED))
+
+ // THEN alpha is immediately set to 0f
+ assertThat(actual).isEqualTo(0f)
+ }
+
private fun step(
value: Float,
state: TransitionState = TransitionState.RUNNING,
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
index 34fbcac..40fb769 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowControllerImplTest.java
@@ -60,7 +60,6 @@
import com.android.systemui.res.R;
import com.android.systemui.scene.FakeWindowRootViewComponent;
import com.android.systemui.settings.UserTracker;
-import com.android.systemui.shade.ui.viewmodel.NotificationShadeWindowModel;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -107,7 +106,6 @@
@Mock private ShadeWindowLogger mShadeWindowLogger;
@Mock private SelectedUserInteractor mSelectedUserInteractor;
@Mock private UserTracker mUserTracker;
- @Mock private NotificationShadeWindowModel mNotificationShadeWindowModel;
@Captor private ArgumentCaptor<WindowManager.LayoutParams> mLayoutParameters;
@Captor private ArgumentCaptor<StatusBarStateController.StateListener> mStateListener;
@@ -163,7 +161,7 @@
mShadeWindowLogger,
() -> mSelectedUserInteractor,
mUserTracker,
- mNotificationShadeWindowModel,
+ mKosmos.getNotificationShadeWindowModel(),
mKosmos::getCommunalInteractor) {
@Override
protected boolean isDebuggable() {
diff --git a/packages/SystemUI/res/layout/record_issue_dialog.xml b/packages/SystemUI/res/layout/record_issue_dialog.xml
index 30d7b0a..e30ae6e 100644
--- a/packages/SystemUI/res/layout/record_issue_dialog.xml
+++ b/packages/SystemUI/res/layout/record_issue_dialog.xml
@@ -35,7 +35,7 @@
android:layout_height="wrap_content"
android:text="@string/qs_record_issue_dropdown_prompt"
android:lines="1"
- android:drawableRight="@drawable/arrow_pointing_down"
+ android:drawableEnd="@drawable/arrow_pointing_down"
android:layout_marginTop="@dimen/qqs_layout_margin_top"
android:focusable="false"
android:clickable="true" />
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
index 0352da3..9521be1 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthContainerView.java
@@ -412,7 +412,6 @@
});
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
- setFocusableInTouchMode(true);
requestFocus();
}
@@ -464,7 +463,8 @@
}
}
- private void onBackInvoked() {
+ @VisibleForTesting
+ public void onBackInvoked() {
sendEarlyUserCanceled();
animateAway(AuthDialogCallback.DISMISSED_USER_CANCELED);
}
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
index b1cba2f..874ad9e 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt
@@ -36,7 +36,6 @@
import android.view.HapticFeedbackConstants
import android.view.MotionEvent
import com.android.launcher3.icons.IconProvider
-import com.android.systemui.Flags.bpTalkback
import com.android.systemui.Flags.constraintBp
import com.android.systemui.biometrics.UdfpsUtils
import com.android.systemui.biometrics.Utils
@@ -916,10 +915,9 @@
touchExplorationEnabled: Boolean,
): Boolean {
if (
- bpTalkback() &&
- modalities.first().hasUdfps &&
- touchExplorationEnabled &&
- !isAuthenticated.first().isAuthenticated
+ modalities.first().hasUdfps &&
+ touchExplorationEnabled &&
+ !isAuthenticated.first().isAuthenticated
) {
// TODO(b/315184924): Remove uses of UdfpsUtils
val scaledTouch =
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index a448072..609aa39 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -103,6 +103,7 @@
import com.android.systemui.screenshot.dagger.ScreenshotModule;
import com.android.systemui.security.data.repository.SecurityRepositoryModule;
import com.android.systemui.settings.DisplayTracker;
+import com.android.systemui.settings.UserTracker;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolator;
import com.android.systemui.shade.transition.LargeScreenShadeInterpolatorImpl;
@@ -154,6 +155,7 @@
import com.android.systemui.util.kotlin.SysUICoroutinesModule;
import com.android.systemui.util.reference.ReferenceModule;
import com.android.systemui.util.sensors.SensorModule;
+import com.android.systemui.util.settings.SettingsProxy;
import com.android.systemui.util.settings.SettingsUtilModule;
import com.android.systemui.util.time.SystemClock;
import com.android.systemui.util.time.SystemClockImpl;
@@ -268,15 +270,15 @@
NoteTaskModule.class,
WalletModule.class,
ContextualEducationModule.class
- },
+},
subcomponents = {
- ComplicationComponent.class,
- DozeComponent.class,
- ExpandableNotificationRowComponent.class,
- KeyguardBouncerComponent.class,
- NavigationBarComponent.class,
- NotificationRowComponent.class,
- WindowRootViewComponent.class,
+ ComplicationComponent.class,
+ DozeComponent.class,
+ ExpandableNotificationRowComponent.class,
+ KeyguardBouncerComponent.class,
+ NavigationBarComponent.class,
+ NotificationRowComponent.class,
+ WindowRootViewComponent.class,
})
public abstract class SystemUIModule {
@@ -443,4 +445,9 @@
@Binds
abstract SceneDataSource bindSceneDataSource(SceneDataSourceDelegator delegator);
+
+ @Provides
+ static SettingsProxy.CurrentUserIdProvider provideCurrentUserId(UserTracker userTracker) {
+ return userTracker::getUserId;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
index 6ed84e5..89fce4a 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenBrightness.java
@@ -293,11 +293,11 @@
if (shouldUseFloatBrightness()) {
mDozeService.setDozeScreenBrightnessFloat(
clampToDimBrightnessForScreenOffFloat(
- clampToUserSettingFloat(mDefaultDozeBrightnessFloat)));
+ clampToUserSettingOrAutoBrightnessFloat(mDefaultDozeBrightnessFloat)));
} else {
mDozeService.setDozeScreenBrightness(
clampToDimBrightnessForScreenOff(
- clampToUserSetting(mDefaultDozeBrightness)));
+ clampToUserSettingOrAutoBrightness(mDefaultDozeBrightness)));
}
mDozeHost.setAodDimmingScrim(0f);
}
@@ -310,10 +310,7 @@
return brightness;
}
- int userSetting = mSystemSettings.getIntForUser(
- Settings.System.SCREEN_BRIGHTNESS, Integer.MAX_VALUE,
- UserHandle.USER_CURRENT);
- return Math.min(brightness, userSetting);
+ return Math.min(brightness, getScreenBrightness());
}
@SuppressLint("AndroidFrameworkRequiresPermission")
@@ -325,8 +322,33 @@
return brightness;
}
- float userSetting = mDisplayManager.getBrightness(Display.DEFAULT_DISPLAY);
- return Math.min(brightness, userSetting);
+ return Math.min(brightness, getScreenBrightnessFloat());
+ }
+
+ private int clampToUserSettingOrAutoBrightness(int brightness) {
+ return Math.min(brightness, getScreenBrightness());
+ }
+
+ private float clampToUserSettingOrAutoBrightnessFloat(float brightness) {
+ return Math.min(brightness, getScreenBrightnessFloat());
+ }
+
+ /**
+ * Gets the current screen brightness that may have been set by manually by the user
+ * or by autobrightness.
+ */
+ private int getScreenBrightness() {
+ return mSystemSettings.getIntForUser(
+ Settings.System.SCREEN_BRIGHTNESS, Integer.MAX_VALUE,
+ UserHandle.USER_CURRENT);
+ }
+
+ /**
+ * Gets the current screen brightness that may have been set by manually by the user
+ * or by autobrightness.
+ */
+ private float getScreenBrightnessFloat() {
+ return mDisplayManager.getBrightness(Display.DEFAULT_DISPLAY);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
index 23aa21c..0cb8dd4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/KeyguardTransitionAnimationFlow.kt
@@ -177,7 +177,12 @@
* Immediately (after 1ms) emits the given value for every step of the KeyguardTransition.
*/
fun immediatelyTransitionTo(value: Float): Flow<Float> {
- return sharedFlow(duration = 1.milliseconds, onStep = { value }, onFinish = { value })
+ return sharedFlow(
+ duration = 1.milliseconds,
+ onStep = { value },
+ onCancel = { value },
+ onFinish = { value }
+ )
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModel.kt
index 9da11ce..c590f07 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AlternateBouncerToAodTransitionViewModel.kt
@@ -51,6 +51,7 @@
transitionAnimation.sharedFlow(
duration = FromAlternateBouncerTransitionInteractor.TO_AOD_DURATION,
onStep = { 1 - it },
+ onCancel = { 0f },
onFinish = { 0f },
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
index b267ecb..6b22c0f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/AodToLockscreenTransitionViewModel.kt
@@ -104,12 +104,10 @@
transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { it },
+ onCancel = { 1f },
onFinish = { 1f },
)
override val deviceEntryParentViewAlpha: Flow<Float> =
- transitionAnimation.sharedFlow(
- duration = 500.milliseconds,
- onStep = { 1f },
- )
+ transitionAnimation.immediatelyTransitionTo(1f)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModel.kt
index 1ee0368..7562392 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToAodTransitionViewModel.kt
@@ -63,6 +63,7 @@
transitionAnimation.sharedFlow(
duration = FromDreamingTransitionInteractor.TO_AOD_DURATION,
onStep = { it },
+ onCancel = { 1f },
onFinish = { 1f },
)
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt
index ea8fe29..11ed52a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToGlanceableHubTransitionViewModel.kt
@@ -95,7 +95,7 @@
startTime = 167.milliseconds,
duration = 167.milliseconds,
onStep = { it },
- onCancel = { 0f },
+ onCancel = { 1f },
onFinish = { 1f },
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
index 82381eb..b5ec7a6 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DreamingToLockscreenTransitionViewModel.kt
@@ -95,5 +95,11 @@
)
val deviceEntryBackgroundViewAlpha = transitionAnimation.immediatelyTransitionTo(1f)
- override val deviceEntryParentViewAlpha = lockscreenAlpha
+ override val deviceEntryParentViewAlpha =
+ transitionAnimation.sharedFlow(
+ startTime = 233.milliseconds,
+ duration = 250.milliseconds,
+ onCancel = { 1f },
+ onStep = { it },
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt
index 76d5a8d..f69f996 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GlanceableHubToDreamingTransitionViewModel.kt
@@ -93,7 +93,7 @@
transitionAnimation.sharedFlow(
duration = 167.milliseconds,
onStep = { 1 - it },
- onCancel = { 1f },
+ onCancel = { 0f },
onFinish = { 0f },
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt
index 2bc8e51..43872b7 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToAodTransitionViewModel.kt
@@ -122,6 +122,7 @@
startTime = 1100.milliseconds,
duration = 200.milliseconds,
onStep = { it },
+ onCancel = { 1f },
onFinish = { 1f },
)
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToGlanceableHubTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToGlanceableHubTransitionViewModel.kt
index 6a3573a..6d95ade 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToGlanceableHubTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/GoneToGlanceableHubTransitionViewModel.kt
@@ -43,7 +43,7 @@
transitionAnimation.sharedFlow(
duration = 167.milliseconds,
onStep = { it },
- onCancel = { 0f },
+ onCancel = { 1f },
onFinish = { 1f },
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
index 5408428..2f21ebc 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToAodTransitionViewModel.kt
@@ -70,6 +70,7 @@
transitionAnimation.sharedFlow(
duration = 300.milliseconds,
onStep = { 1 - it },
+ onCancel = { 0f },
onFinish = { 0f },
),
)
@@ -153,6 +154,7 @@
transitionAnimation.sharedFlow(
duration = 300.milliseconds,
onStep = { it },
+ onCancel = { 1f },
onFinish = { 1f },
),
flowWhenShadeIsNotExpanded = transitionAnimation.immediatelyTransitionTo(1f),
@@ -164,6 +166,7 @@
transitionAnimation.sharedFlow(
duration = 200.milliseconds,
onStep = { 1f - it },
+ onCancel = { 0f },
onFinish = { 0f },
),
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
index 579abeb..bbb55cc 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToDreamingTransitionViewModel.kt
@@ -74,7 +74,12 @@
override val deviceEntryParentViewAlpha: Flow<Float> =
shadeDependentFlows.transitionFlow(
- flowWhenShadeIsNotExpanded = lockscreenAlpha,
+ flowWhenShadeIsNotExpanded =
+ transitionAnimation.sharedFlow(
+ duration = 250.milliseconds,
+ onStep = { 1f - it },
+ onCancel = { 0f },
+ ),
flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f),
)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
index fcf8c14f..8d9ccef 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToOccludedTransitionViewModel.kt
@@ -83,7 +83,12 @@
override val deviceEntryParentViewAlpha: Flow<Float> =
shadeDependentFlows.transitionFlow(
- flowWhenShadeIsNotExpanded = lockscreenAlpha,
+ flowWhenShadeIsNotExpanded =
+ transitionAnimation.sharedFlow(
+ duration = 250.milliseconds,
+ onStep = { 1f - it },
+ onCancel = { 0f },
+ ),
flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f),
)
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
index 23c44b0a..e64c614 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenToPrimaryBouncerTransitionViewModel.kt
@@ -65,6 +65,7 @@
transitionAnimation.sharedFlow(
duration = 250.milliseconds,
onStep = { 1f - it },
+ onCancel = { 0f },
onFinish = { 0f }
),
flowWhenShadeIsExpanded = transitionAnimation.immediatelyTransitionTo(0f)
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
index 36c7d5b..737bd7a 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/OccludedToLockscreenTransitionViewModel.kt
@@ -110,5 +110,11 @@
val deviceEntryBackgroundViewAlpha: Flow<Float> =
transitionAnimation.immediatelyTransitionTo(1f)
- override val deviceEntryParentViewAlpha: Flow<Float> = lockscreenAlpha
+ override val deviceEntryParentViewAlpha: Flow<Float> =
+ transitionAnimation.sharedFlow(
+ startTime = 233.milliseconds,
+ duration = 250.milliseconds,
+ onStep = { it },
+ onCancel = { 1f },
+ )
}
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt
index 009f85d..501feca 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/PrimaryBouncerToAodTransitionViewModel.kt
@@ -70,6 +70,7 @@
transitionAnimation.sharedFlow(
duration = 300.milliseconds,
onStep = { it },
+ onCancel = { 1f },
onFinish = { 1f },
)
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt
index 29450a2..3fe3162 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/policy/WorkProfilePolicy.kt
@@ -26,7 +26,7 @@
import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult
import com.android.systemui.screenshot.policy.CapturePolicy.PolicyResult.NotMatched
import com.android.systemui.screenshot.policy.CaptureType.IsolatedTask
-import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.shared.desktopmode.DesktopModeFlags
import javax.inject.Inject
import kotlinx.coroutines.flow.first
@@ -48,7 +48,7 @@
return NotMatched(policy = NAME, reason = SHADE_EXPANDED)
}
- if (DesktopModeStatus.canEnterDesktopMode(context)) {
+ if (DesktopModeFlags.DESKTOP_WINDOWING_MODE.isEnabled(context)) {
content.rootTasks.firstOrNull()?.also {
if (it.windowingMode == WINDOWING_MODE_FREEFORM) {
return NotMatched(policy = NAME, reason = DESKTOP_MODE_ENABLED)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/OWNERS b/packages/SystemUI/src/com/android/systemui/statusbar/OWNERS
new file mode 100644
index 0000000..69ebb76
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+# Bug component: 78010
+
+caitlinshk@google.com
+evanlaird@google.com
+pixel@google.com
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/OWNERS b/packages/SystemUI/src/com/android/systemui/statusbar/phone/OWNERS
index 4657e9b..92a333e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/OWNERS
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/OWNERS
@@ -1,6 +1,6 @@
per-file *Notification* = set noparent
per-file *Notification* = file:../notification/OWNERS
-per-file NotificationIcon* = ccassidy@google.com, evanlaird@google.com, pixel@google.com
+per-file NotificationIcon* = file:../OWNERS
per-file NotificationShadeWindowControllerImpl.java = dupin@google.com, cinek@google.com, beverlyt@google.com, pixel@google.com, juliacr@google.com
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java b/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java
index 9c98f43..f1da27f 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/SecureSettingsImpl.java
@@ -22,23 +22,24 @@
import androidx.annotation.NonNull;
-import com.android.systemui.settings.UserTracker;
import com.android.systemui.util.kotlin.SettingsSingleThreadBackground;
-import javax.inject.Inject;
-
import kotlinx.coroutines.CoroutineDispatcher;
+import javax.inject.Inject;
+
class SecureSettingsImpl implements SecureSettings {
private final ContentResolver mContentResolver;
- private final UserTracker mUserTracker;
+ private final CurrentUserIdProvider mCurrentUserProvider;
private final CoroutineDispatcher mBgDispatcher;
@Inject
- SecureSettingsImpl(ContentResolver contentResolver, UserTracker userTracker,
+ SecureSettingsImpl(
+ ContentResolver contentResolver,
+ CurrentUserIdProvider currentUserProvider,
@SettingsSingleThreadBackground CoroutineDispatcher bgDispatcher) {
mContentResolver = contentResolver;
- mUserTracker = userTracker;
+ mCurrentUserProvider = currentUserProvider;
mBgDispatcher = bgDispatcher;
}
@@ -48,8 +49,8 @@
}
@Override
- public UserTracker getUserTracker() {
- return mUserTracker;
+ public CurrentUserIdProvider getCurrentUserProvider() {
+ return mCurrentUserProvider;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt b/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
index 9125a91..0ee997e 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt
@@ -15,6 +15,7 @@
*/
package com.android.systemui.util.settings
+import android.annotation.UserIdInt
import android.content.ContentResolver
import android.database.ContentObserver
import android.net.Uri
@@ -629,4 +630,8 @@
}
}
}
+
+ fun interface CurrentUserIdProvider {
+ @UserIdInt fun getUserId(): Int
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java b/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java
index 406d95b..1e80357 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/SystemSettingsImpl.java
@@ -22,23 +22,23 @@
import androidx.annotation.NonNull;
-import com.android.systemui.settings.UserTracker;
import com.android.systemui.util.kotlin.SettingsSingleThreadBackground;
-import javax.inject.Inject;
-
import kotlinx.coroutines.CoroutineDispatcher;
+import javax.inject.Inject;
+
class SystemSettingsImpl implements SystemSettings {
private final ContentResolver mContentResolver;
- private final UserTracker mUserTracker;
+ private final CurrentUserIdProvider mCurrentUserProvider;
private final CoroutineDispatcher mBgCoroutineDispatcher;
@Inject
- SystemSettingsImpl(ContentResolver contentResolver, UserTracker userTracker,
+ SystemSettingsImpl(ContentResolver contentResolver,
+ CurrentUserIdProvider currentUserProvider,
@SettingsSingleThreadBackground CoroutineDispatcher bgDispatcher) {
mContentResolver = contentResolver;
- mUserTracker = userTracker;
+ mCurrentUserProvider = currentUserProvider;
mBgCoroutineDispatcher = bgDispatcher;
}
@@ -48,8 +48,8 @@
}
@Override
- public UserTracker getUserTracker() {
- return mUserTracker;
+ public CurrentUserIdProvider getCurrentUserProvider() {
+ return mCurrentUserProvider;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt b/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
index ac7c1ce..9ae8f03 100644
--- a/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt
@@ -23,7 +23,6 @@
import android.os.UserHandle
import android.provider.Settings.SettingNotFoundException
import com.android.app.tracing.TraceUtils.trace
-import com.android.systemui.settings.UserTracker
import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloat
import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloatOrThrow
import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrThrow
@@ -46,8 +45,8 @@
* instances, unifying setting related actions in one place.
*/
interface UserSettingsProxy : SettingsProxy {
- /** Returns that [UserTracker] this instance was constructed with. */
- val userTracker: UserTracker
+ val currentUserProvider: SettingsProxy.CurrentUserIdProvider
+
/** Returns the user id for the associated [ContentResolver]. */
var userId: Int
get() = getContentResolver().userId
@@ -64,7 +63,7 @@
fun getRealUserHandle(userHandle: Int): Int {
return if (userHandle != UserHandle.USER_CURRENT) {
userHandle
- } else userTracker.userId
+ } else currentUserProvider.getUserId()
}
@WorkerThread
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
index 1e3ee28..dc69cda 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt
@@ -35,7 +35,6 @@
import android.testing.TestableLooper
import android.testing.TestableLooper.RunWithLooper
import android.testing.ViewUtils
-import android.view.KeyEvent
import android.view.View
import android.view.WindowInsets
import android.view.WindowManager
@@ -202,8 +201,7 @@
val root = container.rootView
// Simulate back invocation
- container.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK))
- container.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK))
+ container.onBackInvoked()
waitForIdleSync()
assertThat(container.parent).isNull()
@@ -217,8 +215,7 @@
val root = container.rootView
// Simulate back invocation
- container.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK))
- container.dispatchKeyEvent(KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK))
+ container.onBackInvoked()
waitForIdleSync()
assertThat(container.parent).isNull()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
index e603db4..b8b93c9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModelTest.kt
@@ -44,7 +44,6 @@
import android.view.Surface
import androidx.test.filters.SmallTest
import com.android.app.activityTaskManager
-import com.android.systemui.Flags.FLAG_BP_TALKBACK
import com.android.systemui.Flags.FLAG_CONSTRAINT_BP
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.AuthController
@@ -1356,7 +1355,6 @@
}
@Test
- @EnableFlags(FLAG_BP_TALKBACK)
fun hint_for_talkback_guidance() = runGenericTest {
val hint by collectLastValue(kosmos.promptViewModel.accessibilityHint)
@@ -1379,7 +1377,6 @@
}
@Test
- @EnableFlags(FLAG_BP_TALKBACK)
fun no_hint_for_talkback_guidance_after_auth() = runGenericTest {
val hint by collectLastValue(kosmos.promptViewModel.accessibilityHint)
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
index 4818119..86da203 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenBrightnessTest.java
@@ -58,7 +58,6 @@
import com.android.internal.display.BrightnessSynchronizer;
import com.android.server.display.feature.flags.Flags;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.policy.DevicePostureController;
@@ -105,8 +104,6 @@
@Mock
DozeParameters mDozeParameters;
@Mock
- DockManager mDockManager;
- @Mock
DevicePostureController mDevicePostureController;
@Mock
DozeLog mDozeLog;
@@ -114,8 +111,8 @@
SystemSettings mSystemSettings;
@Mock
DisplayManager mDisplayManager;
- private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
- private FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor);
+ private final FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock());
+ private final FakeThreadFactory mFakeThreadFactory = new FakeThreadFactory(mFakeExecutor);
private DozeScreenBrightness mScreen;
@@ -249,32 +246,35 @@
}
@Test
- @RequiresFlagsDisabled(Flags.FLAG_DOZE_BRIGHTNESS_FLOAT)
- public void testAod_usesLightSensorNotClampingToAutoBrightnessValue_Int() {
- int maxBrightness = 3;
- when(mSystemSettings.getIntForUser(eq(Settings.System.SCREEN_BRIGHTNESS), anyInt(),
- eq(UserHandle.USER_CURRENT))).thenReturn(maxBrightness);
+ @RequiresFlagsEnabled(Flags.FLAG_DOZE_BRIGHTNESS_FLOAT)
+ public void initialBrightness_clampsToAutoBrightnessValue_Float() {
+ float maxBrightnessFromAutoBrightness = DEFAULT_BRIGHTNESS_FLOAT / 2;
+ when(mDisplayManager.getBrightness(Display.DEFAULT_DISPLAY)).thenReturn(
+ maxBrightnessFromAutoBrightness
+ );
when(mSystemSettings.getIntForUser(eq(Settings.System.SCREEN_BRIGHTNESS_MODE), anyInt(),
eq(UserHandle.USER_CURRENT)))
.thenReturn(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
- assertEquals(DEFAULT_BRIGHTNESS_INT, mServiceFake.screenBrightnessInt);
- assertTrue(Float.isNaN(mServiceFake.screenBrightnessFloat));
+ assertEquals(maxBrightnessFromAutoBrightness, mServiceFake.screenBrightnessFloat,
+ DELTA);
+ assertEquals(PowerManager.BRIGHTNESS_DEFAULT, mServiceFake.screenBrightnessInt);
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_DOZE_BRIGHTNESS_FLOAT)
- public void testAod_usesLightSensorNotClampingToAutoBrightnessValue_Float() {
- float maxBrightness = DEFAULT_BRIGHTNESS_FLOAT / 2;
- when(mDisplayManager.getBrightness(Display.DEFAULT_DISPLAY)).thenReturn(maxBrightness);
+ @RequiresFlagsDisabled(Flags.FLAG_DOZE_BRIGHTNESS_FLOAT)
+ public void initialBrightness_clampsToAutoBrightnessValue_Int() {
+ int maxBrightnessFromAutoBrightness = DEFAULT_BRIGHTNESS_INT / 2;
+ when(mSystemSettings.getIntForUser(eq(Settings.System.SCREEN_BRIGHTNESS), anyInt(),
+ eq(UserHandle.USER_CURRENT))).thenReturn(maxBrightnessFromAutoBrightness);
when(mSystemSettings.getIntForUser(eq(Settings.System.SCREEN_BRIGHTNESS_MODE), anyInt(),
eq(UserHandle.USER_CURRENT)))
.thenReturn(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
- assertEquals(DEFAULT_BRIGHTNESS_FLOAT, mServiceFake.screenBrightnessFloat, DELTA);
- assertEquals(PowerManager.BRIGHTNESS_DEFAULT, mServiceFake.screenBrightnessInt);
+ assertEquals(maxBrightnessFromAutoBrightness, mServiceFake.screenBrightnessInt);
+ assertTrue(Float.isNaN(mServiceFake.screenBrightnessFloat));
}
@Test
@@ -378,6 +378,54 @@
}
@Test
+ @RequiresFlagsEnabled(Flags.FLAG_DOZE_BRIGHTNESS_FLOAT)
+ public void lightSensorChangesInAod_doesNotClampToAutoBrightnessValue_Float() {
+ // GIVEN auto brightness reports low brightness
+ float maxBrightnessFromAutoBrightness = DEFAULT_BRIGHTNESS_FLOAT / 2;
+ when(mDisplayManager.getBrightness(Display.DEFAULT_DISPLAY))
+ .thenReturn(maxBrightnessFromAutoBrightness);
+ when(mSystemSettings.getIntForUser(eq(Settings.System.SCREEN_BRIGHTNESS_MODE), anyInt(),
+ eq(UserHandle.USER_CURRENT)))
+ .thenReturn(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+
+ // GIVEN the device is DOZE_AOD and the display state changes to ON
+ mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
+ mScreen.transitionTo(INITIALIZED, DOZE_AOD);
+ waitForSensorManager();
+
+ // WHEN new sensor event sent
+ mSensor.sendSensorEvent(3);
+
+ // THEN brightness is updated
+ assertEquals(SENSOR_TO_BRIGHTNESS_FLOAT[3], mServiceFake.screenBrightnessFloat, DELTA);
+ assertEquals(PowerManager.BRIGHTNESS_DEFAULT, mServiceFake.screenBrightnessInt);
+ }
+
+ @Test
+ @RequiresFlagsDisabled(Flags.FLAG_DOZE_BRIGHTNESS_FLOAT)
+ public void lightSensorChangesInAod_doesNotClampToAutoBrightnessValue_Int() {
+ // GIVEN auto brightness reports low brightness
+ int maxBrightnessFromAutoBrightness = 1;
+ when(mSystemSettings.getIntForUser(eq(Settings.System.SCREEN_BRIGHTNESS), anyInt(),
+ eq(UserHandle.USER_CURRENT))).thenReturn(maxBrightnessFromAutoBrightness);
+ when(mSystemSettings.getIntForUser(eq(Settings.System.SCREEN_BRIGHTNESS_MODE), anyInt(),
+ eq(UserHandle.USER_CURRENT)))
+ .thenReturn(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+
+ // GIVEN the device is DOZE_AOD and the display state changes to ON
+ mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
+ mScreen.transitionTo(INITIALIZED, DOZE_AOD);
+ waitForSensorManager();
+
+ // WHEN new sensor event sent
+ mSensor.sendSensorEvent(3);
+
+ // THEN brightness is updated
+ assertEquals(SENSOR_TO_BRIGHTNESS_INT[3], mServiceFake.screenBrightnessInt);
+ assertTrue(Float.isNaN(mServiceFake.screenBrightnessFloat));
+ }
+
+ @Test
@RequiresFlagsDisabled(Flags.FLAG_DOZE_BRIGHTNESS_FLOAT)
public void docked_usesLightSensor_Int() {
// GIVEN the device is docked and the display state changes to ON
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index ff65887..e3a38a8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -111,7 +111,6 @@
import com.android.systemui.shade.ShadeExpansionStateManager;
import com.android.systemui.shade.ShadeWindowLogger;
import com.android.systemui.shade.domain.interactor.ShadeInteractor;
-import com.android.systemui.shade.ui.viewmodel.NotificationShadeWindowModel;
import com.android.systemui.statusbar.NotificationShadeDepthController;
import com.android.systemui.statusbar.NotificationShadeWindowController;
import com.android.systemui.statusbar.SysuiStatusBarStateController;
@@ -226,7 +225,6 @@
private @Mock DreamViewModel mDreamViewModel;
private @Mock CommunalTransitionViewModel mCommunalTransitionViewModel;
private @Mock SystemPropertiesHelper mSystemPropertiesHelper;
- @Mock private NotificationShadeWindowModel mNotificationShadeWindowModel;
private FakeFeatureFlags mFeatureFlags;
private final int mDefaultUserId = 100;
@@ -274,7 +272,7 @@
mShadeWindowLogger,
() -> mSelectedUserInteractor,
mUserTracker,
- mNotificationShadeWindowModel,
+ mKosmos.getNotificationShadeWindowModel(),
mKosmos::getCommunalInteractor);
mFeatureFlags = new FakeFeatureFlags();
mSetFlagsRule.enableFlags(FLAG_REFACTOR_GET_CURRENT_USER);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
index 0196f95..80a9e4c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt
@@ -62,9 +62,8 @@
import com.android.systemui.util.mockito.capture
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
-import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.mockito.withArgCaptor
-import com.android.systemui.util.settings.SecureSettings
+import com.android.systemui.util.settings.FakeSettings
import com.android.wm.shell.bubbles.Bubble
import com.android.wm.shell.bubbles.Bubbles
import com.google.common.truth.Truth.assertThat
@@ -86,6 +85,7 @@
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyZeroInteractions
import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.whenever
/** atest SystemUITests:NoteTaskControllerTest */
@OptIn(ExperimentalCoroutinesApi::class)
@@ -106,10 +106,10 @@
@Mock private lateinit var shortcutManager: ShortcutManager
@Mock private lateinit var activityManager: ActivityManager
@Mock private lateinit var devicePolicyManager: DevicePolicyManager
- @Mock private lateinit var secureSettings: SecureSettings
private val userTracker = FakeUserTracker()
private val testDispatcher = UnconfinedTestDispatcher()
private val testScope = TestScope(testDispatcher)
+ private val secureSettings = FakeSettings(testDispatcher) { userTracker.userId }
@Before
fun setUp() {
@@ -139,7 +139,6 @@
whenever(activityManager.getRunningTasks(anyInt())).thenReturn(emptyList())
whenever(userManager.isManagedProfile(workUserInfo.id)).thenReturn(true)
whenever(context.resources).thenReturn(getContext().resources)
- whenever(secureSettings.userTracker).thenReturn(userTracker)
}
private fun createNoteTaskController(
@@ -245,6 +244,7 @@
verifyZeroInteractions(bubbles, keyguardManager, userManager, eventLogger)
}
+
// endregion
// region showNoteTask
@@ -357,14 +357,11 @@
@Test
fun showNoteTask_defaultUserSet_shouldStartActivityWithExpectedUserAndLogUiEvent() {
- whenever(
- secureSettings.getIntForUser(
- /* name= */ eq(Settings.Secure.DEFAULT_NOTE_TASK_PROFILE),
- /* def= */ any(),
- /* userHandle= */ any()
- )
- )
- .thenReturn(10)
+ secureSettings.putIntForUser(
+ /* name= */ Settings.Secure.DEFAULT_NOTE_TASK_PROFILE,
+ /* value= */ 10,
+ /* userHandle= */ userTracker.userId
+ )
val user10 = UserHandle.of(/* userId= */ 10)
val expectedInfo =
@@ -458,6 +455,7 @@
verify(eventLogger).logNoteTaskOpened(expectedInfo)
verifyZeroInteractions(bubbles)
}
+
// endregion
// region setNoteTaskShortcutEnabled
@@ -535,6 +533,7 @@
assertThat(argument.value.className)
.isEqualTo(CreateNoteTaskShortcutActivity::class.java.name)
}
+
// endregion
// region keyguard policy
@@ -601,6 +600,7 @@
verifyNoteTaskOpenInBubbleInUser(userTracker.userHandle)
}
+
// endregion
// region showNoteTask, COPE devices
@@ -626,14 +626,11 @@
@Test
fun showNoteTask_copeDevices_tailButtonEntryPoint_shouldStartBubbleInTheUserSelectedUser() {
- whenever(
- secureSettings.getIntForUser(
- /* name= */ eq(Settings.Secure.DEFAULT_NOTE_TASK_PROFILE),
- /* def= */ any(),
- /* userHandle= */ any()
- )
- )
- .thenReturn(mainUserInfo.id)
+ secureSettings.putIntForUser(
+ /* name= */ Settings.Secure.DEFAULT_NOTE_TASK_PROFILE,
+ /* value= */ mainUserInfo.id,
+ /* userHandle= */ userTracker.userId
+ )
whenever(devicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile).thenReturn(true)
userTracker.set(mainAndWorkProfileUsers, mainAndWorkProfileUsers.indexOf(mainUserInfo))
@@ -661,6 +658,7 @@
verifyNoteTaskOpenInBubbleInUser(mainUserInfo.userHandle)
}
+
// endregion
private fun verifyNoteTaskOpenInBubbleInUser(userHandle: UserHandle) {
@@ -700,6 +698,7 @@
verify(controller).updateNoteTaskAsUser(user)
}
+
// endregion
// region updateNoteTaskAsUser
@@ -729,6 +728,7 @@
val intent = withArgCaptor { verify(context).startServiceAsUser(capture(), eq(user)) }
assertThat(intent).hasComponentClass(NoteTaskControllerUpdateService::class.java)
}
+
// endregion
// region internalUpdateNoteTaskAsUser
@@ -807,6 +807,7 @@
verify(shortcutManager, never()).enableShortcuts(any())
verify(shortcutManager, never()).updateShortcuts(any())
}
+
// endregion
// startregion updateNoteTaskForAllUsers
@@ -821,6 +822,7 @@
verify(controller).updateNoteTaskAsUser(mainUserInfo.userHandle)
verify(controller).updateNoteTaskAsUser(workUserInfo.userHandle)
}
+
// endregion
// region getUserForHandlingNotesTaking
@@ -836,14 +838,11 @@
@Test
fun getUserForHandlingNotesTaking_cope_userSelectedWorkProfile_tailButton_shouldReturnWorkProfileUser() { // ktlint-disable max-line-length
- whenever(
- secureSettings.getIntForUser(
- /* name= */ eq(Settings.Secure.DEFAULT_NOTE_TASK_PROFILE),
- /* def= */ any(),
- /* userHandle= */ any()
- )
- )
- .thenReturn(workUserInfo.id)
+ secureSettings.putIntForUser(
+ /* name= */ Settings.Secure.DEFAULT_NOTE_TASK_PROFILE,
+ /* value= */ workUserInfo.id,
+ /* userHandle= */ userTracker.userId
+ )
whenever(devicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile).thenReturn(true)
userTracker.set(mainAndWorkProfileUsers, mainAndWorkProfileUsers.indexOf(mainUserInfo))
@@ -854,14 +853,11 @@
@Test
fun getUserForHandlingNotesTaking_cope_userSelectedMainProfile_tailButton_shouldReturnMainProfileUser() { // ktlint-disable max-line-length
- whenever(
- secureSettings.getIntForUser(
- /* name= */ eq(Settings.Secure.DEFAULT_NOTE_TASK_PROFILE),
- /* def= */ any(),
- /* userHandle= */ any()
- )
- )
- .thenReturn(mainUserInfo.id)
+ secureSettings.putIntForUser(
+ /* name= */ Settings.Secure.DEFAULT_NOTE_TASK_PROFILE,
+ /* value= */ mainUserInfo.id,
+ /* userHandle= */ userTracker.userId
+ )
whenever(devicePolicyManager.isOrganizationOwnedDeviceWithManagedProfile).thenReturn(true)
userTracker.set(mainAndWorkProfileUsers, mainAndWorkProfileUsers.indexOf(mainUserInfo))
@@ -906,6 +902,7 @@
assertThat(user).isEqualTo(UserHandle.of(mainUserInfo.id))
}
+
// endregion
// startregion startNotesRoleSetting
@@ -962,6 +959,7 @@
assertThat(intentCaptor.value).hasAction(ACTION_MANAGE_DEFAULT_APP)
assertThat(userCaptor.value).isEqualTo(UserHandle.of(mainUserInfo.id))
}
+
// endregion
private companion object {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
index 191a048..a5fbfb5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/screenshot/policy/WorkProfilePolicyTest.kt
@@ -18,13 +18,11 @@
import android.content.ComponentName
import android.content.Context
-import android.content.res.Resources
import android.os.UserHandle
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.internal.R
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.screenshot.data.model.DisplayContentModel
import com.android.systemui.screenshot.data.model.DisplayContentScenarios.ActivityNames.FILES
@@ -49,7 +47,6 @@
import com.android.systemui.screenshot.policy.WorkProfilePolicy.Companion.SHADE_EXPANDED
import com.android.systemui.screenshot.policy.WorkProfilePolicy.Companion.WORK_TASK_IS_TOP
import com.android.systemui.screenshot.policy.WorkProfilePolicy.Companion.WORK_TASK_NOT_TOP
-import com.android.systemui.util.mockito.whenever
import com.android.window.flags.Flags
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
@@ -58,7 +55,6 @@
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
-import org.mockito.MockitoAnnotations
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
@@ -70,19 +66,12 @@
@JvmField @Rule(order = 2) val mockitoRule: MockitoRule = MockitoJUnit.rule()
@Mock lateinit var mContext: Context
- @Mock lateinit var mResources: Resources
private val kosmos = Kosmos()
private lateinit var policy: WorkProfilePolicy
@Before
fun setUp() {
- MockitoAnnotations.initMocks(this)
-
- // Set desktop mode supported
- whenever(mContext.resources).thenReturn(mResources)
- whenever(mResources.getBoolean(R.bool.config_isDesktopModeSupported)).thenReturn(true)
-
policy = WorkProfilePolicy(kosmos.profileTypeRepository, mContext)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/OWNERS b/packages/SystemUI/tests/src/com/android/systemui/statusbar/OWNERS
new file mode 100644
index 0000000..1c52b8d
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/OWNERS
@@ -0,0 +1,3 @@
+set noparent
+
+include /packages/SystemUI/src/com/android/systemui/statusbar/OWNERS
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt
index ead9939..eaeece9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/settings/UserSettingsProxyTest.kt
@@ -17,7 +17,6 @@
package com.android.systemui.util.settings
import android.content.ContentResolver
-import android.content.pm.UserInfo
import android.database.ContentObserver
import android.net.Uri
import android.os.Handler
@@ -28,8 +27,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
-import com.android.systemui.settings.FakeUserTracker
-import com.android.systemui.settings.UserTracker
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -52,29 +49,21 @@
@TestableLooper.RunWithLooper
class UserSettingsProxyTest : SysuiTestCase() {
- private var mUserTracker = FakeUserTracker()
+ private var userId = MAIN_USER_ID
private val testDispatcher = StandardTestDispatcher()
- private var mSettings: UserSettingsProxy = FakeUserSettingsProxy(mUserTracker, testDispatcher)
+ private var mSettings: UserSettingsProxy = FakeUserSettingsProxy({ userId }, testDispatcher)
private var mContentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {}
private lateinit var testScope: TestScope
@Before
fun setUp() {
- mUserTracker.set(
- listOf(UserInfo(MAIN_USER_ID, "main", UserInfo.FLAG_MAIN)),
- selectedUserIndex = 0
- )
testScope = TestScope(testDispatcher)
}
@Test
fun registerContentObserverForUser_inputString_success() =
testScope.runTest {
- mSettings.registerContentObserverForUserSync(
- TEST_SETTING,
- mContentObserver,
- mUserTracker.userId
- )
+ mSettings.registerContentObserverForUserSync(TEST_SETTING, mContentObserver, userId)
verify(mSettings.getContentResolver())
.registerContentObserver(
eq(TEST_SETTING_URI),
@@ -87,11 +76,7 @@
@Test
fun registerContentObserverForUserSuspend_inputString_success() =
testScope.runTest {
- mSettings.registerContentObserverForUser(
- TEST_SETTING,
- mContentObserver,
- mUserTracker.userId
- )
+ mSettings.registerContentObserverForUser(TEST_SETTING, mContentObserver, userId)
verify(mSettings.getContentResolver())
.registerContentObserver(
eq(TEST_SETTING_URI),
@@ -104,11 +89,7 @@
@Test
fun registerContentObserverForUserAsync_inputString_success() =
testScope.runTest {
- mSettings.registerContentObserverForUserAsync(
- TEST_SETTING,
- mContentObserver,
- mUserTracker.userId
- )
+ mSettings.registerContentObserverForUserAsync(TEST_SETTING, mContentObserver, userId)
testScope.advanceUntilIdle()
verify(mSettings.getContentResolver())
.registerContentObserver(
@@ -126,7 +107,7 @@
TEST_SETTING,
notifyForDescendants = true,
mContentObserver,
- mUserTracker.userId
+ userId
)
verify(mSettings.getContentResolver())
.registerContentObserver(
@@ -144,7 +125,7 @@
TEST_SETTING,
notifyForDescendants = true,
mContentObserver,
- mUserTracker.userId
+ userId
)
verify(mSettings.getContentResolver())
.registerContentObserver(
@@ -164,7 +145,7 @@
TEST_SETTING,
notifyForDescendants = true,
mContentObserver,
- mUserTracker.userId
+ userId
)
testScope.advanceUntilIdle()
verify(mSettings.getContentResolver())
@@ -179,11 +160,7 @@
@Test
fun registerContentObserverForUser_inputUri_success() =
testScope.runTest {
- mSettings.registerContentObserverForUserSync(
- TEST_SETTING_URI,
- mContentObserver,
- mUserTracker.userId
- )
+ mSettings.registerContentObserverForUserSync(TEST_SETTING_URI, mContentObserver, userId)
verify(mSettings.getContentResolver())
.registerContentObserver(
eq(TEST_SETTING_URI),
@@ -196,11 +173,7 @@
@Test
fun registerContentObserverForUserSuspend_inputUri_success() =
testScope.runTest {
- mSettings.registerContentObserverForUser(
- TEST_SETTING_URI,
- mContentObserver,
- mUserTracker.userId
- )
+ mSettings.registerContentObserverForUser(TEST_SETTING_URI, mContentObserver, userId)
verify(mSettings.getContentResolver())
.registerContentObserver(
eq(TEST_SETTING_URI),
@@ -216,7 +189,7 @@
mSettings.registerContentObserverForUserAsync(
TEST_SETTING_URI,
mContentObserver,
- mUserTracker.userId
+ userId
)
testScope.advanceUntilIdle()
@@ -239,7 +212,7 @@
mSettings.registerContentObserverForUserAsync(
TEST_SETTING_URI,
mContentObserver,
- mUserTracker.userId,
+ userId,
runnable
)
testScope.advanceUntilIdle()
@@ -253,7 +226,7 @@
TEST_SETTING_URI,
notifyForDescendants = true,
mContentObserver,
- mUserTracker.userId
+ userId
)
verify(mSettings.getContentResolver())
.registerContentObserver(
@@ -271,14 +244,12 @@
TEST_SETTING_URI,
notifyForDescendants = true,
mContentObserver,
- mUserTracker.userId
+ userId
)
verify(mSettings.getContentResolver())
.registerContentObserver(
eq(TEST_SETTING_URI),
- eq(
- true,
- ),
+ eq(true),
eq(mContentObserver),
eq(MAIN_USER_ID)
)
@@ -291,7 +262,7 @@
TEST_SETTING_URI,
notifyForDescendants = true,
mContentObserver,
- mUserTracker.userId
+ userId
)
testScope.advanceUntilIdle()
verify(mSettings.getContentResolver())
@@ -585,7 +556,7 @@
* This class uses a mock of [ContentResolver] to test the [ContentObserver] registration APIs.
*/
private class FakeUserSettingsProxy(
- override val userTracker: UserTracker,
+ override val currentUserProvider: SettingsProxy.CurrentUserIdProvider,
val testDispatcher: CoroutineDispatcher
) : UserSettingsProxy {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index 7f964d1..e5e04dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -349,10 +349,10 @@
private Display mDefaultDisplay;
@Mock
private Lazy<ViewCapture> mLazyViewCapture;
- @Mock private NotificationShadeWindowModel mNotificationShadeWindowModel;
private final KosmosJavaAdapter mKosmos = new KosmosJavaAdapter(this);
private ShadeInteractor mShadeInteractor;
+ private NotificationShadeWindowModel mNotificationShadeWindowModel;
private ShellTaskOrganizer mShellTaskOrganizer;
private TaskViewTransitions mTaskViewTransitions;
@@ -411,6 +411,7 @@
when(deviceEntryUdfpsInteractor.isUdfpsSupported()).thenReturn(MutableStateFlow(false));
mShadeInteractor = mKosmos.getShadeInteractor();
+ mNotificationShadeWindowModel = mKosmos.getNotificationShadeWindowModel();
mNotificationShadeWindowController = new NotificationShadeWindowControllerImpl(
mContext,
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
index 8614fc9..e6bd24b 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/kosmos/KosmosJavaAdapter.kt
@@ -59,6 +59,7 @@
import com.android.systemui.shade.data.repository.shadeRepository
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.shadeController
+import com.android.systemui.shade.ui.viewmodel.notificationShadeWindowModel
import com.android.systemui.statusbar.chips.ui.viewmodel.ongoingActivityChipsViewModel
import com.android.systemui.statusbar.notification.domain.interactor.seenNotificationsInteractor
import com.android.systemui.statusbar.notification.stack.domain.interactor.headsUpNotificationInteractor
@@ -140,6 +141,7 @@
val shadeController by lazy { kosmos.shadeController }
val shadeRepository by lazy { kosmos.shadeRepository }
val shadeInteractor by lazy { kosmos.shadeInteractor }
+ val notificationShadeWindowModel by lazy { kosmos.notificationShadeWindowModel }
val wifiInteractor by lazy { kosmos.wifiInteractor }
val fakeWifiRepository by lazy { kosmos.fakeWifiRepository }
val volumeDialogInteractor by lazy { kosmos.volumeDialogInteractor }
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java
index 3f0318b..d117466 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettings.java
@@ -28,9 +28,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
-import com.android.systemui.settings.FakeUserTracker;
-import com.android.systemui.settings.UserTracker;
-
import kotlinx.coroutines.CoroutineDispatcher;
import java.util.ArrayList;
@@ -44,12 +41,13 @@
new HashMap<>();
private final Map<String, List<ContentObserver>> mContentObserversAllUsers = new HashMap<>();
private final CoroutineDispatcher mDispatcher;
- private final UserTracker mUserTracker;
public static final Uri CONTENT_URI = Uri.parse("content://settings/fake");
@UserIdInt
private int mUserId = UserHandle.USER_CURRENT;
+ private final CurrentUserIdProvider mCurrentUserProvider;
+
/**
* @deprecated Please use FakeSettings(testDispatcher) to provide the same dispatcher used
* by main test scope.
@@ -57,17 +55,17 @@
@Deprecated
public FakeSettings() {
mDispatcher = StandardTestDispatcher(/* scheduler = */ null, /* name = */ null);
- mUserTracker = new FakeUserTracker();
+ mCurrentUserProvider = () -> mUserId;
}
public FakeSettings(CoroutineDispatcher dispatcher) {
mDispatcher = dispatcher;
- mUserTracker = new FakeUserTracker();
+ mCurrentUserProvider = () -> mUserId;
}
- public FakeSettings(CoroutineDispatcher dispatcher, UserTracker userTracker) {
+ public FakeSettings(CoroutineDispatcher dispatcher, CurrentUserIdProvider currentUserProvider) {
mDispatcher = dispatcher;
- mUserTracker = userTracker;
+ mCurrentUserProvider = currentUserProvider;
}
@VisibleForTesting
@@ -93,8 +91,8 @@
@NonNull
@Override
- public UserTracker getUserTracker() {
- return mUserTracker;
+ public CurrentUserIdProvider getCurrentUserProvider() {
+ return mCurrentUserProvider;
}
@NonNull
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettingsKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettingsKosmos.kt
index 55044bf..76ef202 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettingsKosmos.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/util/settings/FakeSettingsKosmos.kt
@@ -19,6 +19,8 @@
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.kosmos.testDispatcher
-import com.android.systemui.settings.fakeUserTracker
+import com.android.systemui.settings.userTracker
-val Kosmos.fakeSettings: FakeSettings by Fixture { FakeSettings(testDispatcher, fakeUserTracker) }
+val Kosmos.fakeSettings: FakeSettings by Fixture {
+ FakeSettings(testDispatcher) { userTracker.userId }
+}
diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
index 988a213..0bf931c 100644
--- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
+++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java
@@ -108,7 +108,7 @@
private boolean mActivityLaunchAllowedByDefault;
@NonNull
@GuardedBy("mGenericWindowPolicyControllerLock")
- private final Set<ComponentName> mActivityPolicyExemptions;
+ private final ArraySet<ComponentName> mActivityPolicyExemptions;
private final boolean mCrossTaskNavigationAllowedByDefault;
@NonNull
private final ArraySet<ComponentName> mCrossTaskNavigationExemptions;
@@ -190,7 +190,7 @@
mAttributionSource = attributionSource;
mAllowedUsers = allowedUsers;
mActivityLaunchAllowedByDefault = activityLaunchAllowedByDefault;
- mActivityPolicyExemptions = activityPolicyExemptions;
+ mActivityPolicyExemptions = new ArraySet<>(activityPolicyExemptions);
mCrossTaskNavigationAllowedByDefault = crossTaskNavigationAllowedByDefault;
mCrossTaskNavigationExemptions = new ArraySet<>(crossTaskNavigationExemptions);
mPermissionDialogComponent = permissionDialogComponent;
diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
index ee7d0ae..29ddf64 100644
--- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
+++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java
@@ -558,6 +558,36 @@
}
}
+ @Override // Binder call
+ @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ public void addActivityPolicyExemptionForDisplay(
+ int displayId, @NonNull ComponentName componentName) {
+ super.addActivityPolicyExemptionForDisplay_enforcePermission();
+ if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
+ return;
+ }
+ synchronized (mVirtualDeviceLock) {
+ checkDisplayOwnedByVirtualDeviceLocked(displayId);
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .addActivityPolicyExemption(componentName);
+ }
+ }
+
+ @Override // Binder call
+ @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ public void removeActivityPolicyExemptionForDisplay(
+ int displayId, @NonNull ComponentName componentName) {
+ super.removeActivityPolicyExemptionForDisplay_enforcePermission();
+ if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
+ return;
+ }
+ synchronized (mVirtualDeviceLock) {
+ checkDisplayOwnedByVirtualDeviceLocked(displayId);
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .removeActivityPolicyExemption(componentName);
+ }
+ }
+
private void sendPendingIntent(int displayId, PendingIntent pendingIntent)
throws PendingIntent.CanceledException {
final ActivityOptions options = ActivityOptions.makeBasic().setLaunchDisplayId(displayId);
@@ -657,12 +687,7 @@
@Nullable IAudioConfigChangedCallback configChangedCallback) {
super.onAudioSessionStarting_enforcePermission();
synchronized (mVirtualDeviceLock) {
- if (!mVirtualDisplays.contains(displayId)) {
- throw new SecurityException(
- "Cannot start audio session for a display not associated with this virtual "
- + "device");
- }
-
+ checkDisplayOwnedByVirtualDeviceLocked(displayId);
if (mVirtualAudioController == null) {
mVirtualAudioController = new VirtualAudioController(mContext, mAttributionSource);
GenericWindowPolicyController gwpc = mVirtualDisplays.get(
@@ -706,6 +731,9 @@
break;
case POLICY_TYPE_ACTIVITY:
synchronized (mVirtualDeviceLock) {
+ if (getDevicePolicy(policyType) != devicePolicy) {
+ mActivityPolicyExemptions.clear();
+ }
mDevicePolicies.put(policyType, devicePolicy);
for (int i = 0; i < mVirtualDisplays.size(); i++) {
mVirtualDisplays.valueAt(i).getWindowPolicyController()
@@ -736,6 +764,33 @@
@Override // Binder call
@EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
+ public void setDevicePolicyForDisplay(int displayId,
+ @VirtualDeviceParams.DynamicDisplayPolicyType int policyType,
+ @VirtualDeviceParams.DevicePolicy int devicePolicy) {
+ super.setDevicePolicyForDisplay_enforcePermission();
+ if (!android.companion.virtualdevice.flags.Flags.activityControlApi()) {
+ return;
+ }
+ synchronized (mVirtualDeviceLock) {
+ checkDisplayOwnedByVirtualDeviceLocked(displayId);
+ switch (policyType) {
+ case POLICY_TYPE_RECENTS:
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .setShowInHostDeviceRecents(devicePolicy == DEVICE_POLICY_DEFAULT);
+ break;
+ case POLICY_TYPE_ACTIVITY:
+ mVirtualDisplays.get(displayId).getWindowPolicyController()
+ .setActivityLaunchDefaultAllowed(devicePolicy == DEVICE_POLICY_DEFAULT);
+ break;
+ default:
+ throw new IllegalArgumentException("Device policy " + policyType
+ + " cannot be changed for a specific display. ");
+ }
+ }
+ }
+
+ @Override // Binder call
+ @EnforcePermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE)
public void createVirtualDpad(VirtualDpadConfig config, @NonNull IBinder deviceToken) {
super.createVirtualDpad_enforcePermission();
Objects.requireNonNull(config);
@@ -1441,20 +1496,24 @@
@SuppressWarnings("AndroidFrameworkRequiresPermission")
private void checkVirtualInputDeviceDisplayIdAssociation(int displayId) {
+ // The INJECT_EVENTS permission allows for injecting input to any window / display.
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.INJECT_EVENTS)
- == PackageManager.PERMISSION_GRANTED) {
- // The INJECT_EVENTS permission allows for injecting input to any window / display.
- return;
- }
- synchronized (mVirtualDeviceLock) {
- if (!mVirtualDisplays.contains(displayId)) {
- throw new SecurityException(
- "Cannot create a virtual input device for display " + displayId
- + " which not associated with this virtual device");
+ != PackageManager.PERMISSION_GRANTED) {
+ synchronized (mVirtualDeviceLock) {
+ checkDisplayOwnedByVirtualDeviceLocked(displayId);
}
}
}
+ @GuardedBy("mVirtualDeviceLock")
+ private void checkDisplayOwnedByVirtualDeviceLocked(int displayId) {
+ if (!mVirtualDisplays.contains(displayId)) {
+ throw new SecurityException(
+ "Invalid displayId: Display " + displayId
+ + " is not associated with this virtual device");
+ }
+ }
+
/**
* Release resources tied to virtual display owned by this VirtualDevice instance.
*
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 03fbfd37..f936b81 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -620,6 +620,10 @@
private void setPowerStatsThrottlePeriods(BatteryStatsImpl.BatteryStatsConfig.Builder builder,
String configString) {
+ if (configString == null) {
+ return;
+ }
+
Matcher matcher = Pattern.compile("([^:]+):(\\d+)\\s*").matcher(configString);
while (matcher.find()) {
String powerComponentName = matcher.group(1);
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
index ef7abdd..6cce722 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java
@@ -227,6 +227,9 @@
onError(BiometricFaceConstants.FACE_ERROR_HW_UNAVAILABLE, 0 /* vendorCode */);
mCallback.onClientFinished(this, false /* success */);
}
+ } else {
+ Slog.e(TAG, "Cancellation signal is null");
+ mCallback.onClientFinished(this, false /* success */);
}
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
index d04afdb..dee4b4f 100644
--- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java
@@ -359,7 +359,8 @@
mCallback.onClientFinished(this, false /* success */);
}
} else {
- Slog.e(TAG, "cancellation signal was null");
+ Slog.e(TAG, "Cancellation signal was null");
+ mCallback.onClientFinished(this, false /* success */);
}
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 730077c..61d8e0b 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -619,7 +619,7 @@
case Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD: {
if (!mNewInputMethodSwitcherMenuEnabled) {
if (userId == mCurrentUserId) {
- mMenuController.updateKeyboardFromSettingsLocked();
+ mMenuController.updateKeyboardFromSettingsLocked(userId);
}
}
break;
@@ -693,7 +693,7 @@
senderUserId);
}
} else {
- mMenuController.hideInputMethodMenu();
+ mMenuController.hideInputMethodMenu(senderUserId);
}
} else {
Slog.w(TAG, "Unexpected intent " + intent);
@@ -1222,12 +1222,6 @@
}
}
- @GuardedBy("ImfLock.class")
- @UserIdInt
- int getCurrentImeUserIdLocked() {
- return mCurrentUserId;
- }
-
private final class InkWindowInitializer implements Runnable {
public void run() {
synchronized (ImfLock.class) {
@@ -1239,12 +1233,11 @@
}
}
- private void onUpdateEditorToolType(int toolType) {
- synchronized (ImfLock.class) {
- IInputMethodInvoker curMethod = getCurMethodLocked();
- if (curMethod != null) {
- curMethod.updateEditorToolType(toolType);
- }
+ @GuardedBy("ImfLock.class")
+ private void onUpdateEditorToolTypeLocked(@MotionEvent.ToolType int toolType) {
+ final IInputMethodInvoker curMethod = getCurMethodLocked();
+ if (curMethod != null) {
+ curMethod.updateEditorToolType(toolType);
}
}
@@ -1826,7 +1819,7 @@
if (mNewInputMethodSwitcherMenuEnabled) {
mMenuControllerNew.hide(bindingController.getCurTokenDisplayId(), userId);
} else {
- mMenuController.hideInputMethodMenuLocked();
+ mMenuController.hideInputMethodMenuLocked(userId);
}
}
}
@@ -2860,7 +2853,7 @@
void updateFromSettingsLocked(boolean enabledMayChange, @UserIdInt int userId) {
updateInputMethodsFromSettingsLocked(enabledMayChange, userId);
if (!mNewInputMethodSwitcherMenuEnabled) {
- mMenuController.updateKeyboardFromSettingsLocked();
+ mMenuController.updateKeyboardFromSettingsLocked(userId);
}
}
@@ -3465,7 +3458,7 @@
if (Flags.useHandwritingListenerForTooltype()) {
maybeReportToolType();
} else if (lastClickToolType != MotionEvent.TOOL_TYPE_UNKNOWN) {
- onUpdateEditorToolType(lastClickToolType);
+ onUpdateEditorToolTypeLocked(lastClickToolType);
}
mVisibilityApplier.performShowIme(windowToken, statsToken,
mVisibilityStateComputer.getShowFlagsForInputMethodServiceOnly(),
@@ -3499,7 +3492,7 @@
// other toolTypes are irrelevant and reported as unknown.
toolType = MotionEvent.TOOL_TYPE_UNKNOWN;
}
- onUpdateEditorToolType(toolType);
+ onUpdateEditorToolTypeLocked(toolType);
}
@Override
@@ -5071,7 +5064,7 @@
mMenuControllerNew.show(menuItems, selectedIndex, displayId, userId);
} else {
mMenuController.showInputMethodMenuLocked(showAuxSubtypes, displayId,
- lastInputMethodId, lastInputMethodSubtypeId, imList);
+ lastInputMethodId, lastInputMethodSubtypeId, imList, userId);
}
}
@@ -5948,7 +5941,7 @@
final var bindingController = getInputMethodBindingController(userId);
mMenuControllerNew.hide(bindingController.getCurTokenDisplayId(), userId);
} else {
- mMenuController.hideInputMethodMenuLocked();
+ mMenuController.hideInputMethodMenuLocked(userId);
}
}
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
index ba5c13e..f16a5a0 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodMenuController.java
@@ -21,6 +21,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
@@ -77,13 +78,12 @@
@GuardedBy("ImfLock.class")
void showInputMethodMenuLocked(boolean showAuxSubtypes, int displayId,
String preferredInputMethodId, int preferredInputMethodSubtypeId,
- @NonNull List<ImeSubtypeListItem> imList) {
+ @NonNull List<ImeSubtypeListItem> imList, @UserIdInt int userId) {
if (DEBUG) Slog.v(TAG, "Show switching menu. showAuxSubtypes=" + showAuxSubtypes);
- final int userId = mService.getCurrentImeUserIdLocked();
final var bindingController = mService.getInputMethodBindingController(userId);
- hideInputMethodMenuLocked();
+ hideInputMethodMenuLocked(userId);
if (preferredInputMethodSubtypeId == NOT_A_SUBTYPE_ID) {
final InputMethodSubtype currentSubtype =
@@ -131,7 +131,7 @@
}
final Context dialogWindowContext = mDialogWindowContext.get(displayId);
mDialogBuilder = new AlertDialog.Builder(dialogWindowContext);
- mDialogBuilder.setOnCancelListener(dialog -> hideInputMethodMenu());
+ mDialogBuilder.setOnCancelListener(dialog -> hideInputMethodMenu(userId));
final Context dialogContext = mDialogBuilder.getContext();
final TypedArray a = dialogContext.obtainStyledAttributes(null,
@@ -162,7 +162,7 @@
isChecked, userId);
// Ensure that the input method dialog is dismissed when changing
// the hardware keyboard state.
- hideInputMethodMenu();
+ hideInputMethodMenu(userId);
});
// Fill the list items with onClick listener, which takes care of IME (and subtype)
@@ -185,7 +185,7 @@
}
mService.setInputMethodLocked(im.getId(), subtypeId, userId);
}
- hideInputMethodMenuLocked();
+ hideInputMethodMenuLocked(userId);
}
};
mDialogBuilder.setSingleChoiceItems(adapter, checkedItem, choiceListener);
@@ -209,10 +209,10 @@
mSwitchingDialog.show();
}
- void updateKeyboardFromSettingsLocked() {
+ void updateKeyboardFromSettingsLocked(@UserIdInt int userId) {
mShowImeWithHardKeyboard =
SecureSettingsWrapper.getBoolean(Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD,
- false, mService.getCurrentImeUserIdLocked());
+ false, userId);
if (mSwitchingDialog != null && mSwitchingDialogTitleView != null
&& mSwitchingDialog.isShowing()) {
final Switch hardKeySwitch = mSwitchingDialogTitleView.findViewById(
@@ -223,18 +223,22 @@
/**
* Hides the input method switcher menu.
+ *
+ * @param userId user ID for this operation
*/
- void hideInputMethodMenu() {
+ void hideInputMethodMenu(@UserIdInt int userId) {
synchronized (ImfLock.class) {
- hideInputMethodMenuLocked();
+ hideInputMethodMenuLocked(userId);
}
}
/**
* Hides the input method switcher menu, synchronised version of {@link #hideInputMethodMenu}.
+ *
+ * @param userId user ID for this operation
*/
@GuardedBy("ImfLock.class")
- void hideInputMethodMenuLocked() {
+ void hideInputMethodMenuLocked(@UserIdInt int userId) {
if (DEBUG) Slog.v(TAG, "Hide switching menu");
if (mSwitchingDialog != null) {
@@ -242,8 +246,6 @@
mSwitchingDialog = null;
mSwitchingDialogTitleView = null;
- // TODO(b/305849394): Make InputMethodMenuController multi-user aware
- final int userId = mService.getCurrentImeUserIdLocked();
mService.updateSystemUiLocked(userId);
mService.sendOnNavButtonFlagsChangedToAllImesLocked();
mDialogBuilder = null;
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java
index 1e3b7e9..e552621 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java
@@ -79,10 +79,8 @@
// from system.
synchronized (ImfLock.class) {
mBindingController =
- new InputMethodBindingController(
- mInputMethodManagerService.getCurrentImeUserIdLocked(),
- mInputMethodManagerService, mImeConnectionBindFlags,
- mCountDownLatch);
+ new InputMethodBindingController(mUserId, mInputMethodManagerService,
+ mImeConnectionBindFlags, mCountDownLatch);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java
index 2d4dbb7..78c9372 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClientTest.java
@@ -479,6 +479,15 @@
eq(mContext.getOpPackageName()), anyInt(), anyInt(), any());
}
+ @Test
+ public void testCancelAuth_whenClientWaitingForCookie() throws RemoteException {
+ final FaceAuthenticationClient client = createClient(true);
+ client.waitForCookie(mCallback);
+ client.cancel();
+
+ verify(mCallback).onClientFinished(client, false);
+ }
+
private FaceAuthenticationClient createClient() throws RemoteException {
return createClient(2 /* version */, mClientMonitorCallbackConverter,
false /* allowBackgroundAuthentication */, true /* isBiometricPrompt */,
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
index 6ec888c..7e1d421 100644
--- a/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
+++ b/services/tests/servicestests/src/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClientTest.java
@@ -117,7 +117,6 @@
private static final int TOUCH_Y = 20;
private static final float TOUCH_MAJOR = 4.4f;
private static final float TOUCH_MINOR = 5.5f;
- private static final int FINGER_UP = 111;
@Rule
public final TestableContext mContext = new TestableContext(
@@ -383,6 +382,8 @@
@Test
public void subscribeContextAndStartHal() throws RemoteException {
+ when(mHal.authenticateWithContext(anyLong(), any())).thenReturn(mCancellationSignal);
+
final FingerprintAuthenticationClient client = createClient();
client.start(mCallback);
@@ -691,6 +692,17 @@
verify(mLockoutTracker).addFailedAttemptForUser(USER_ID);
}
+ @Test
+ public void testCancelAuth_whenClientWaitingForCookie() throws RemoteException {
+ final FingerprintAuthenticationClient client = createClientWithoutBackgroundAuth();
+ client.waitForCookie(mCallback);
+ client.cancel();
+ mLooper.moveTimeForward(10);
+ mLooper.dispatchAll();
+
+ verify(mCallback).onClientFinished(client, false);
+ }
+
private FingerprintAuthenticationClient createClient() throws RemoteException {
return createClient(100 /* version */, true /* allowBackgroundAuthentication */,
true /* isBiometricPrompt */,
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 0468f48..e57a95e 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -10038,6 +10038,19 @@
"carrier_supported_satellite_notification_hysteresis_sec_int";
/**
+ * An integer key holds the timeout duration in seconds used to determine whether to exit
+ * carrier-roaming NB-IOT satellite mode.
+ *
+ * The timer is started when the device screen is turned off during a satellite session.
+ * When the timer expires, the device exits Carrier Roaming NB IOT NTN.
+ *
+ * The default value is 30 seconds.
+ */
+ @FlaggedApi(Flags.FLAG_CARRIER_ROAMING_NB_IOT_NTN)
+ public static final String KEY_SATELLITE_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC_INT =
+ "satellite_screen_off_inactivity_timeout_duration_sec_int";
+
+ /**
* Indicating whether DUN APN should be disabled when the device is roaming. In that case,
* the default APN (i.e. internet) will be used for tethering.
*
@@ -11197,6 +11210,7 @@
sDefaults.putBoolean(KEY_SATELLITE_ESOS_SUPPORTED_BOOL, false);
sDefaults.putInt(KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT, 0);
sDefaults.putInt(KEY_CARRIER_SUPPORTED_SATELLITE_NOTIFICATION_HYSTERESIS_SEC_INT, 180);
+ sDefaults.putInt(KEY_SATELLITE_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC_INT, 30);
sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, "");
sDefaults.putBoolean(KEY_SUPPORTS_CALL_COMPOSER_BOOL, false);
sDefaults.putBoolean(KEY_SUPPORTS_BUSINESS_CALL_COMPOSER_BOOL, false);