Ensure animation scales are within bounds
Ensure that all uses of TRANSITION_ANIMATION_SCALE setting are bounded between 0 and 20. Bug: 238178261 Test: adb shell dumpsys window windows | grep "Animation setting" Change-Id: I01aeeeddcbcdce0824d61db6b8f4a8946595131d
This commit is contained in:
@@ -1023,6 +1023,14 @@ public interface WindowManager extends ViewManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure scales are between 0 and 20.
|
||||
* @hide
|
||||
*/
|
||||
static float fixScale(float scale) {
|
||||
return Math.max(Math.min(scale, 20), 0);
|
||||
}
|
||||
|
||||
public static class LayoutParams extends ViewGroup.LayoutParams implements Parcelable {
|
||||
/**
|
||||
* X position for this window. With the default gravity it is ignored.
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.graphics.Rect;
|
||||
import android.os.Handler;
|
||||
import android.provider.Settings;
|
||||
import android.view.RemoteAnimationTarget;
|
||||
import android.view.WindowManager;
|
||||
import android.view.animation.AlphaAnimation;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationSet;
|
||||
@@ -68,10 +69,7 @@ class TaskFragmentAnimationSpec {
|
||||
|
||||
// The transition animation should be adjusted based on the developer option.
|
||||
final ContentResolver resolver = mContext.getContentResolver();
|
||||
mTransitionAnimationScaleSetting = Settings.Global.getFloat(resolver,
|
||||
Settings.Global.TRANSITION_ANIMATION_SCALE,
|
||||
mContext.getResources().getFloat(
|
||||
R.dimen.config_appTransitionAnimationDurationScaleDefault));
|
||||
mTransitionAnimationScaleSetting = getTransitionAnimationScaleSetting();
|
||||
resolver.registerContentObserver(
|
||||
Settings.Global.getUriFor(Settings.Global.TRANSITION_ANIMATION_SCALE), false,
|
||||
new SettingsObserver(handler));
|
||||
@@ -217,6 +215,12 @@ class TaskFragmentAnimationSpec {
|
||||
return animation;
|
||||
}
|
||||
|
||||
private float getTransitionAnimationScaleSetting() {
|
||||
return WindowManager.fixScale(Settings.Global.getFloat(mContext.getContentResolver(),
|
||||
Settings.Global.TRANSITION_ANIMATION_SCALE, mContext.getResources().getFloat(
|
||||
R.dimen.config_appTransitionAnimationDurationScaleDefault)));
|
||||
}
|
||||
|
||||
private class SettingsObserver extends ContentObserver {
|
||||
SettingsObserver(@NonNull Handler handler) {
|
||||
super(handler);
|
||||
@@ -224,9 +228,7 @@ class TaskFragmentAnimationSpec {
|
||||
|
||||
@Override
|
||||
public void onChange(boolean selfChange) {
|
||||
mTransitionAnimationScaleSetting = Settings.Global.getFloat(
|
||||
mContext.getContentResolver(), Settings.Global.TRANSITION_ANIMATION_SCALE,
|
||||
mTransitionAnimationScaleSetting);
|
||||
mTransitionAnimationScaleSetting = getTransitionAnimationScaleSetting();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import static android.view.WindowManager.TRANSIT_KEYGUARD_GOING_AWAY;
|
||||
import static android.view.WindowManager.TRANSIT_OPEN;
|
||||
import static android.view.WindowManager.TRANSIT_TO_BACK;
|
||||
import static android.view.WindowManager.TRANSIT_TO_FRONT;
|
||||
import static android.view.WindowManager.fixScale;
|
||||
import static android.window.TransitionInfo.FLAG_IS_INPUT_METHOD;
|
||||
import static android.window.TransitionInfo.FLAG_IS_WALLPAPER;
|
||||
import static android.window.TransitionInfo.FLAG_STARTING_WINDOW_TRANSFER_RECIPIENT;
|
||||
@@ -165,10 +166,7 @@ public class Transitions implements RemoteCallable<Transitions> {
|
||||
ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "addHandler: Remote");
|
||||
|
||||
ContentResolver resolver = mContext.getContentResolver();
|
||||
mTransitionAnimationScaleSetting = Settings.Global.getFloat(resolver,
|
||||
Settings.Global.TRANSITION_ANIMATION_SCALE,
|
||||
mContext.getResources().getFloat(
|
||||
R.dimen.config_appTransitionAnimationDurationScaleDefault));
|
||||
mTransitionAnimationScaleSetting = getTransitionAnimationScaleSetting();
|
||||
dispatchAnimScaleSetting(mTransitionAnimationScaleSetting);
|
||||
|
||||
resolver.registerContentObserver(
|
||||
@@ -183,6 +181,12 @@ public class Transitions implements RemoteCallable<Transitions> {
|
||||
}
|
||||
}
|
||||
|
||||
private float getTransitionAnimationScaleSetting() {
|
||||
return fixScale(Settings.Global.getFloat(mContext.getContentResolver(),
|
||||
Settings.Global.TRANSITION_ANIMATION_SCALE, mContext.getResources().getFloat(
|
||||
R.dimen.config_appTransitionAnimationDurationScaleDefault)));
|
||||
}
|
||||
|
||||
public ShellTransitions asRemoteTransitions() {
|
||||
return mImpl;
|
||||
}
|
||||
@@ -886,9 +890,7 @@ public class Transitions implements RemoteCallable<Transitions> {
|
||||
@Override
|
||||
public void onChange(boolean selfChange) {
|
||||
super.onChange(selfChange);
|
||||
mTransitionAnimationScaleSetting = Settings.Global.getFloat(
|
||||
mContext.getContentResolver(), Settings.Global.TRANSITION_ANIMATION_SCALE,
|
||||
mTransitionAnimationScaleSetting);
|
||||
mTransitionAnimationScaleSetting = getTransitionAnimationScaleSetting();
|
||||
|
||||
mMainExecutor.execute(() -> dispatchAnimScaleSetting(mTransitionAnimationScaleSetting));
|
||||
}
|
||||
|
||||
@@ -89,6 +89,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
|
||||
import static android.view.WindowManager.REMOVE_CONTENT_MODE_UNDEFINED;
|
||||
import static android.view.WindowManager.TRANSIT_NONE;
|
||||
import static android.view.WindowManager.TRANSIT_RELAUNCH;
|
||||
import static android.view.WindowManager.fixScale;
|
||||
import static android.view.WindowManagerGlobal.ADD_OKAY;
|
||||
import static android.view.WindowManagerGlobal.RELAYOUT_RES_CANCEL_AND_REDRAW;
|
||||
import static android.view.WindowManagerGlobal.RELAYOUT_RES_SURFACE_CHANGED;
|
||||
@@ -1325,10 +1326,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
// Get persisted window scale setting
|
||||
mWindowAnimationScaleSetting = Settings.Global.getFloat(resolver,
|
||||
Settings.Global.WINDOW_ANIMATION_SCALE, mWindowAnimationScaleSetting);
|
||||
mTransitionAnimationScaleSetting = Settings.Global.getFloat(resolver,
|
||||
Settings.Global.TRANSITION_ANIMATION_SCALE,
|
||||
context.getResources().getFloat(
|
||||
R.dimen.config_appTransitionAnimationDurationScaleDefault));
|
||||
mTransitionAnimationScaleSetting = getTransitionAnimationScaleSetting();
|
||||
|
||||
setAnimatorDurationScale(Settings.Global.getFloat(resolver,
|
||||
Settings.Global.ANIMATOR_DURATION_SCALE, mAnimatorDurationScaleSetting));
|
||||
@@ -1405,6 +1403,12 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
lightRadius);
|
||||
}
|
||||
|
||||
private float getTransitionAnimationScaleSetting() {
|
||||
return fixScale(Settings.Global.getFloat(mContext.getContentResolver(),
|
||||
Settings.Global.TRANSITION_ANIMATION_SCALE, mContext.getResources().getFloat(
|
||||
R.dimen.config_appTransitionAnimationDurationScaleDefault)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after all entities (such as the {@link ActivityManagerService}) have been set up and
|
||||
* associated with the {@link WindowManagerService}.
|
||||
@@ -3397,11 +3401,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
static float fixScale(float scale) {
|
||||
if (scale < 0) scale = 0;
|
||||
else if (scale > 20) scale = 20;
|
||||
return Math.abs(scale);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAnimationScale(int which, float scale) {
|
||||
@@ -5331,10 +5330,8 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
break;
|
||||
}
|
||||
case TRANSITION_ANIMATION_SCALE: {
|
||||
mTransitionAnimationScaleSetting = Settings.Global.getFloat(
|
||||
mContext.getContentResolver(),
|
||||
Settings.Global.TRANSITION_ANIMATION_SCALE,
|
||||
mTransitionAnimationScaleSetting);
|
||||
mTransitionAnimationScaleSetting =
|
||||
getTransitionAnimationScaleSetting();
|
||||
break;
|
||||
}
|
||||
case ANIMATION_DURATION_SCALE: {
|
||||
|
||||
Reference in New Issue
Block a user