/* * Copyright (C) 2021 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.launcher3.anim; import android.os.Build; import android.view.View; import android.view.WindowInsets; import android.view.WindowInsetsAnimation; import androidx.annotation.RequiresApi; import com.android.launcher3.Utilities; import java.util.List; /** * Callback that animates views above the IME */ @RequiresApi(api = Build.VERSION_CODES.R) public class KeyboardInsetAnimationCallback extends WindowInsetsAnimation.Callback { private final View mView; private float mInitialTranslation; private float mTerminalTranslation; public KeyboardInsetAnimationCallback(View view) { super(DISPATCH_MODE_STOP); mView = view; } @Override public void onPrepare(WindowInsetsAnimation animation) { mInitialTranslation = mView.getTranslationY(); } @Override public WindowInsets onProgress(WindowInsets windowInsets, List list) { if (list.size() == 0) { mView.setTranslationY(mInitialTranslation); return windowInsets; } float progress = list.get(0).getInterpolatedFraction(); mView.setTranslationY( Utilities.mapRange(progress, mInitialTranslation, mTerminalTranslation)); return windowInsets; } @Override public WindowInsetsAnimation.Bounds onStart(WindowInsetsAnimation animation, WindowInsetsAnimation.Bounds bounds) { mTerminalTranslation = mView.getTranslationY(); if (mView instanceof KeyboardInsetListener) { ((KeyboardInsetListener) mView).onTranslationStart(); } return super.onStart(animation, bounds); } @Override public void onEnd(WindowInsetsAnimation animation) { if (mView instanceof KeyboardInsetListener) { ((KeyboardInsetListener) mView).onTranslationEnd(); } super.onEnd(animation); } /** * Interface Allowing views to listen for keyboard translation events */ public interface KeyboardInsetListener { /** * Called from {@link KeyboardInsetAnimationCallback#onStart} */ void onTranslationStart(); /** * Called from {@link KeyboardInsetAnimationCallback#onEnd} */ void onTranslationEnd(); } }