diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 57f38d16e84c3..40ae65249ada1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -18,6 +18,7 @@ package com.android.server.wm; import android.Manifest; import android.animation.ValueAnimator; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManagerInternal; @@ -153,6 +154,8 @@ import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StringWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.net.Socket; import java.text.DateFormat; import java.util.ArrayList; @@ -332,6 +335,14 @@ public class WindowManagerService extends IWindowManager.Stub private static final String PROPERTY_BUILD_DATE_UTC = "ro.build.date.utc"; + // Enums for animation scale update types. + @Retention(RetentionPolicy.SOURCE) + @IntDef({WINDOW_ANIMATION_SCALE, TRANSITION_ANIMATION_SCALE, ANIMATION_DURATION_SCALE}) + private @interface UpdateAnimationScaleMode {}; + private static final int WINDOW_ANIMATION_SCALE = 0; + private static final int TRANSITION_ANIMATION_SCALE = 1; + private static final int ANIMATION_DURATION_SCALE = 2; + final private KeyguardDisableHandler mKeyguardDisableHandler; final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @@ -613,18 +624,42 @@ public class WindowManagerService extends IWindowManager.Stub private final class SettingsObserver extends ContentObserver { private final Uri mDisplayInversionEnabledUri = Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_DISPLAY_INVERSION_ENABLED); + private final Uri mWindowAnimationScaleUri = + Settings.Global.getUriFor(Settings.Global.WINDOW_ANIMATION_SCALE); + private final Uri mTransitionAnimationScaleUri = + Settings.Global.getUriFor(Settings.Global.TRANSITION_ANIMATION_SCALE); + private final Uri mAnimationDurationScaleUri = + Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE); public SettingsObserver() { super(new Handler()); ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver(mDisplayInversionEnabledUri, false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(mWindowAnimationScaleUri, false, this, + UserHandle.USER_ALL); + resolver.registerContentObserver(mTransitionAnimationScaleUri, false, this, + UserHandle.USER_ALL); + resolver.registerContentObserver(mAnimationDurationScaleUri, false, this, + UserHandle.USER_ALL); } @Override public void onChange(boolean selfChange, Uri uri) { if (mDisplayInversionEnabledUri.equals(uri)) { updateCircularDisplayMaskIfNeeded(); + } else { + @UpdateAnimationScaleMode + final int mode; + if (uri.equals(mWindowAnimationScaleUri)) { + mode = WINDOW_ANIMATION_SCALE; + } else if (uri.equals(mTransitionAnimationScaleUri)) { + mode = TRANSITION_ANIMATION_SCALE; + } else { // uri.equals(mAnimationDurationScaleUri) + mode = ANIMATION_DURATION_SCALE; + } + Message m = mH.obtainMessage(H.UPDATE_ANIMATION_SCALE, mode, 0); + mH.sendMessage(m); } } } @@ -7748,6 +7783,8 @@ public class WindowManagerService extends IWindowManager.Stub public static final int NOTIFY_APP_TRANSITION_FINISHED = 49; public static final int NOTIFY_STARTING_WINDOW_DRAWN = 50; + public static final int UPDATE_ANIMATION_SCALE = 51; + /** * Used to denote that an integer field in a message will not be used. */ @@ -8030,6 +8067,36 @@ public class WindowManagerService extends IWindowManager.Stub break; } + case UPDATE_ANIMATION_SCALE: { + @UpdateAnimationScaleMode + final int mode = msg.arg1; + switch (mode) { + case WINDOW_ANIMATION_SCALE: { + mWindowAnimationScaleSetting = Settings.Global.getFloat( + mContext.getContentResolver(), + Settings.Global.WINDOW_ANIMATION_SCALE, + mWindowAnimationScaleSetting); + break; + } + case TRANSITION_ANIMATION_SCALE: { + mTransitionAnimationScaleSetting = Settings.Global.getFloat( + mContext.getContentResolver(), + Settings.Global.TRANSITION_ANIMATION_SCALE, + mTransitionAnimationScaleSetting); + break; + } + case ANIMATION_DURATION_SCALE: { + mAnimatorDurationScaleSetting = Settings.Global.getFloat( + mContext.getContentResolver(), + Settings.Global.ANIMATOR_DURATION_SCALE, + mAnimatorDurationScaleSetting); + dispatchNewAnimatorScaleLocked(null); + break; + } + } + break; + } + case FORCE_GC: { synchronized (mWindowMap) { // Since we're holding both mWindowMap and mAnimator we don't need to