blob: 682ab5bfb63cc26e2dddea01ee7bd57d9f72ceb4 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.view;
import android.graphics.Insets;
/**
* Interface that allows the application to listen to animation events for windows that cause
* insets.
* @hide pending unhide
*/
public interface WindowInsetsAnimationListener {
/**
* Called when an inset animation gets started.
*
* @param animation The animation that is about to start.
*/
void onStarted(InsetsAnimation animation);
/**
* Called when the insets change as part of running an animation. Note that even if multiple
* animations for different types are running, there will only be one progress callback per
* frame. The {@code insets} passed as an argument represents the overall state and will include
* all types, regardless of whether they are animating or not.
* <p>
* Note that insets dispatch is hierarchical: It will start at the root of the view hierarchy,
* and then traverse it and invoke the callback of the specific {@link View} being traversed.
* The callback may return a modified instance by calling {@link WindowInsets#inset(int, int, int, int)}
* to indicate that a part of the insets have been used to offset or clip its children, and the
* children shouldn't worry about that part anymore.
*
* @param insets The current insets.
* @return The insets to dispatch to the subtree of the hierarchy.
*/
WindowInsets onProgress(WindowInsets insets);
/**
* Called when an inset animation has finished.
*
* @param animation The animation that has finished running.
*/
void onFinished(InsetsAnimation animation);
/**
* Class representing an animation of a set of windows that cause insets.
*/
class InsetsAnimation {
private final @WindowInsets.Type.InsetType int mTypeMask;
private final Insets mLowerBound;
private final Insets mUpperBound;
/**
* @hide
*/
InsetsAnimation(int typeMask, Insets lowerBound, Insets upperBound) {
mTypeMask = typeMask;
mLowerBound = lowerBound;
mUpperBound = upperBound;
}
/**
* @return The bitmask of {@link WindowInsets.Type.InsetType}s that are animating.
*/
public @WindowInsets.Type.InsetType int getTypeMask() {
return mTypeMask;
}
/**
* Queries the lower inset bound of the animation. If the animation is about showing or
* hiding a window that cause insets, the lower bound is {@link Insets#NONE} and the upper
* bound is the same as {@link WindowInsets#getInsets(int)} for the fully shown state. This
* is the same as {@link WindowInsetsAnimationController#getHiddenStateInsets} and
* {@link WindowInsetsAnimationController#getShownStateInsets} in case the listener gets
* invoked because of an animation that originates from
* {@link WindowInsetsAnimationController}.
* <p>
* However, if the size of a window that causes insets is changing, these are the
* lower/upper bounds of that size animation.
* <p>
* There are no overlapping animations for a specific type, but there may be two animations
* running at the same time for different inset types.
*
* @see #getUpperBound()
* @see WindowInsetsAnimationController#getHiddenStateInsets
* TODO: It's a bit weird that these are global per window but onProgress is hierarchical.
* TODO: If multiple types are animating, querying the bound per type isn't possible. Should
* we:
* 1. Offer bounds by type here?
* 2. Restrict one animation to one single type only?
* Returning WindowInsets here isn't feasible in case of overlapping animations: We can't
* fill in the insets for the types from the other animation into the WindowInsets object
* as it's changing as well.
*/
public Insets getLowerBound() {
return mLowerBound;
}
/**
* @see #getLowerBound()
* @see WindowInsetsAnimationController#getShownStateInsets
*/
public Insets getUpperBound() {
return mUpperBound;
}
}
}