afohrman b984e64445 [Predictive Back] [Side Sheet] Added handleBackInvoked() predictive back support for coplanar side sheets.
Added an AnimatorUpdateListener that runs in finishBackProgress() to make the coplanar sibling's margins update as the sheet slides back to its origin edge.

PiperOrigin-RevId: 527749916
2023-04-28 14:46:43 -04:00

113 lines
4.2 KiB
Java

/*
* Copyright (C) 2022 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 com.google.android.material.sidesheet;
import android.view.View;
import android.view.ViewGroup.MarginLayoutParams;
import androidx.annotation.NonNull;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import com.google.android.material.sidesheet.Sheet.SheetEdge;
/**
* A delegate for {@link SideSheetBehavior} to handle logic specific to the sheet's edge position.
*/
abstract class SheetDelegate {
/**
* Returns the edge of the screen in which the sheet is positioned. Must be a {@link SheetEdge}
* value.
*/
@SheetEdge
abstract int getSheetEdge();
/** Returns the sheet's offset from the origin edge when hidden. */
abstract int getHiddenOffset();
/** Returns the sheet's offset from the origin edge when expanded. */
abstract int getExpandedOffset();
/** Whether the view has been released from a drag close to the origin edge. */
abstract boolean isReleasedCloseToOriginEdge(@NonNull View releasedChild);
abstract boolean isSwipeSignificant(float xVelocity, float yVelocity);
/**
* Whether the sheet should hide, based on the position of child, velocity of the drag event, and
* {@link SideSheetBehavior#getHideThreshold()}.
*/
abstract boolean shouldHide(@NonNull View child, float velocity);
/**
* Returns the edge of the sheet that the sheet expands towards, calling the child parameter's
* edge depending on which edge of the screen the sheet is positioned. For a right based sheet,
* this would return {@code child.getLeft()}.
*/
abstract <V extends View> int getOuterEdge(@NonNull V child);
/**
* Returns the calculated slide offset based on how close the sheet is to the outer edge. The
* offset value increases as the sheet moves towards the outer edge.
*
* @return slide offset represented as a float value between 0 and 1. A value of 0 means that the
* sheet is hidden and a value of 1 means that the sheet is fully expanded.
*/
abstract float calculateSlideOffset(int outerEdge);
/** Set the coplanar sheet layout params depending on the screen size. */
abstract void updateCoplanarSiblingLayoutParams(
@NonNull MarginLayoutParams coplanarSiblingLayoutParams, int sheetLeft, int sheetRight);
/** Sets the coplanar sheet's margin that's adjacent to the side sheet to the provided value. */
abstract void updateCoplanarSiblingAdjacentMargin(
@NonNull MarginLayoutParams coplanarSiblingLayoutParams, int coplanarSiblingAdjacentMargin);
/**
* Returns the coplanar sibling's margin that's adjacent to the sheet's left or right edge,
* depending on the sheet edge.
*/
abstract int getCoplanarSiblingAdjacentMargin(
@NonNull MarginLayoutParams coplanarSiblingLayoutParams);
/**
* Calculates the margin on the inner side of the sheet based on the {@link MarginLayoutParams}.
* For right based sheets, the inner margin would be the right margin.
*/
abstract int calculateInnerMargin(@NonNull MarginLayoutParams marginLayoutParams);
/**
* Returns the inner edge of the parent. For example, for the right sheet, the return value would
* be {@code parent.getRight()}.
*/
abstract int getParentInnerEdge(@NonNull CoordinatorLayout parent);
/**
* Returns the minimum horizontal view position, used to calculate the drag range of the sheet.
*/
abstract int getMinViewPositionHorizontal();
/**
* Returns the maximum horizontal view position, used to calculate the drag range of the sheet.
*/
abstract int getMaxViewPositionHorizontal();
/**
* Returns whether the sheet is expanding outwards based on its horizontal velocity and sheet
* edge.
*/
abstract boolean isExpandingOutwards(float xVelocity);
}