summaryrefslogtreecommitdiff
path: root/core/java/android/animation/AnimationHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android/animation/AnimationHandler.java')
-rw-r--r--core/java/android/animation/AnimationHandler.java33
1 files changed, 28 insertions, 5 deletions
diff --git a/core/java/android/animation/AnimationHandler.java b/core/java/android/animation/AnimationHandler.java
index 7f6df2261fcc..57ab55a53e46 100644
--- a/core/java/android/animation/AnimationHandler.java
+++ b/core/java/android/animation/AnimationHandler.java
@@ -53,6 +53,9 @@ public class AnimationHandler {
new ArrayList<>();
private AnimationFrameCallbackProvider mProvider;
+ // Static flag which allows the pausing behavior to be globally disabled/enabled.
+ private static boolean sAnimatorPausingEnabled = true;
+
/**
* This paused list is used to store animators forcibly paused when the activity
* went into the background (to avoid unnecessary background processing work).
@@ -93,6 +96,15 @@ public class AnimationHandler {
return sAnimatorHandler.get();
}
+ /**
+ * Disable the default behavior of pausing infinite animators when
+ * apps go into the background.
+ *
+ * @param enable Enable (default behavior) or disable background pausing behavior.
+ */
+ public static void setAnimatorPausingEnabled(boolean enable) {
+ sAnimatorPausingEnabled = enable;
+ }
/**
* This is called when a window goes away. We should remove
@@ -136,16 +148,19 @@ public class AnimationHandler {
} else {
mAnimatorRequestors.remove(requestor);
}
+ if (!sAnimatorPausingEnabled) {
+ // Resume any animators that have been paused in the meantime, otherwise noop
+ // Leave logic above so that if pausing gets re-enabled, the state of the requestors
+ // list is valid
+ resumeAnimators();
+ return;
+ }
boolean isEmpty = mAnimatorRequestors.isEmpty();
if (wasEmpty != isEmpty) {
// only paused/resume animators if there was a visibility change
if (!isEmpty) {
// If any requestors are enabled, resume currently paused animators
- Choreographer.getInstance().removeFrameCallback(mPauser);
- for (int i = mPausedAnimators.size() - 1; i >= 0; --i) {
- mPausedAnimators.get(i).resume();
- }
- mPausedAnimators.clear();
+ resumeAnimators();
} else {
// Wait before pausing to avoid thrashing animator state for temporary backgrounding
Choreographer.getInstance().postFrameCallbackDelayed(mPauser,
@@ -160,6 +175,14 @@ public class AnimationHandler {
}
}
+ private void resumeAnimators() {
+ Choreographer.getInstance().removeFrameCallback(mPauser);
+ for (int i = mPausedAnimators.size() - 1; i >= 0; --i) {
+ mPausedAnimators.get(i).resume();
+ }
+ mPausedAnimators.clear();
+ }
+
private Choreographer.FrameCallback mPauser = frameTimeNanos -> {
if (mAnimatorRequestors.size() > 0) {
// something enabled animators since this callback was scheduled - bail