afohrman 78fa15748f [Side Sheet] Added LeftSheetDelegate and left sheet support for standard and coplanar side sheets.
Standard and coplanar side sheets now support sliding and dragging from the left side, as well as automatic RTL mirroring when `layout_gravity` is set to `start` or `end`. Change the sheet edge by setting `layout_gravity` on the side sheet view in XML or programmatically.

PiperOrigin-RevId: 518048965
2023-03-20 21:25:55 +00:00

102 lines
3.7 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);
/**
* 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);
}