package com.example.sourcestudy20221111.CustomView;
import android.app.Activity;
import android.graphics.Color;
import android.util.Pair;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import androidx.annotation.NonNull;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat;
import androidx.core.view.WindowInsetsAnimationCompat;
import androidx.core.view.WindowInsetsCompat;
import java.util.List;
public final class SoftKeyBoardInsetsUtil {
static private Pair<View,Integer> pair = null;
static private boolean isHiding = false;
static private int softKeyBoardHeight = 0;
static private int navigationBarHeight;
static private void setViewMoveWithKeyBoard(View view)
{
navigationBarHeight = ViewCompat.getRootWindowInsets(view).getInsets(WindowInsetsCompat.Type.navigationBars()).bottom;
WindowInsetsAnimationCompat.Callback callback = new WindowInsetsAnimationCompat.Callback(WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE) {
@NonNull
@Override
public WindowInsetsCompat onProgress(@NonNull WindowInsetsCompat insets, @NonNull List<WindowInsetsAnimationCompat> runningAnimations) {
Insets in = insets.getInsets(WindowInsetsCompat.Type.ime());
in = Insets.of(0,0,0,in.bottom-insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom);
insets = new WindowInsetsCompat.Builder().setInsets(WindowInsetsCompat.Type.navigationBars(),in).build();
int bottom = ((ViewGroup)view.getParent()).getBottom() - view.getBottom();
int softTopToBottom = in.bottom+navigationBarHeight;
if(bottom<softTopToBottom)
{
ViewCompat.offsetTopAndBottom(view,bottom - softTopToBottom);
}
if(!isHiding)
{
softKeyBoardHeight = softTopToBottom;
}
if(pair==null)
{
pair = new Pair<>(view,bottom);
}
if(bottom>softTopToBottom && isHiding)
{
int offset = softKeyBoardHeight - softTopToBottom;
softKeyBoardHeight = softTopToBottom;
if(bottom - offset >= pair.second)
{
ViewCompat.offsetTopAndBottom(view,offset);
}
else
{
if(bottom>pair.second)
{
ViewCompat.offsetTopAndBottom(view,pair.second - bottom);
}
}
}
return insets;
}
@Override
public void onEnd(@NonNull WindowInsetsAnimationCompat animation) {
isHiding = false;
}
@NonNull
@Override
public WindowInsetsAnimationCompat.BoundsCompat onStart(@NonNull WindowInsetsAnimationCompat animation, @NonNull WindowInsetsAnimationCompat.BoundsCompat bounds) {
return super.onStart(animation, bounds);
}
};
ViewCompat.setWindowInsetsAnimationCallback(view.getRootView(),callback);
}
static void openAndHideSoftKeyBoardAndMakeViewMoveWithKeyBoard(View view)
{
setViewMoveWithKeyBoard(view);
openSoftKeyBoard(view);
}
static void openSoftKeyBoard(View view)
{
ViewCompat.getWindowInsetsController(view).show(WindowInsetsCompat.Type.ime());
}
static void hideSoftKeyBoard(View view)
{
ViewCompat.getWindowInsetsController(view).hide(WindowInsetsCompat.Type.ime());
ViewCompat.setWindowInsetsAnimationCallback(view.getRootView(),null);
pair = null;
isHiding = true;
}
static boolean softKeyBoardIsShow(View view){
return ViewCompat.getRootWindowInsets(view).isVisible(WindowInsetsCompat.Type.ime());
}
static public void setFullScreen(Activity activity)
{
WindowCompat.setDecorFitsSystemWindows(activity.getWindow(),false);
activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
activity.getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
}