| /* |
| * Copyright (C) 2020 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.android.deskclock.widget.toast |
| |
| import android.content.Context |
| import android.util.AttributeSet |
| import android.view.View |
| import androidx.annotation.Keep |
| import androidx.coordinatorlayout.widget.CoordinatorLayout |
| |
| import com.google.android.material.snackbar.Snackbar |
| |
| import kotlin.math.min |
| |
| /** |
| * Custom [CoordinatorLayout.Behavior] that slides with the [Snackbar]. |
| */ |
| @Keep |
| class SnackbarSlidingBehavior( |
| context: Context?, |
| attrs: AttributeSet? |
| ) : CoordinatorLayout.Behavior<View?>() { |
| override fun layoutDependsOn( |
| parent: CoordinatorLayout, |
| child: View, |
| dependency: View |
| ): Boolean { |
| return dependency is Snackbar.SnackbarLayout |
| } |
| |
| override fun onDependentViewChanged( |
| parent: CoordinatorLayout, |
| child: View, |
| dependency: View |
| ): Boolean { |
| updateTranslationY(parent, child) |
| return false |
| } |
| |
| override fun onDependentViewRemoved(parent: CoordinatorLayout, child: View, dependency: View) { |
| updateTranslationY(parent, child) |
| } |
| |
| override fun onLayoutChild( |
| parent: CoordinatorLayout, |
| child: View, |
| layoutDirection: Int |
| ): Boolean { |
| updateTranslationY(parent, child) |
| return false |
| } |
| |
| private fun updateTranslationY(parent: CoordinatorLayout, child: View) { |
| var translationY = 0f |
| for (dependency in parent.getDependencies(child)) { |
| translationY = min(translationY, dependency.y - child.bottom) |
| } |
| child.translationY = translationY |
| } |
| } |