| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | package com.reactnativenavigation.utils;
import android.content.Context;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.inputmethod.InputMethodManager;
import com.reactnativenavigation.NavigationApplication;
public class KeyboardVisibilityDetector {
    // 0.15 ratio is perhaps enough to determine keypad height.
    public static final double KEYBOARD_VISIBLE_RATIO = 0.15;
    private final KeyboardVisibilityLayoutListener keyboardVisibilityListener;
    private final View screen;
    private Runnable keyboardCloseListener;
    public KeyboardVisibilityDetector(final View screen) {
        this.screen = screen;
        keyboardVisibilityListener = new KeyboardVisibilityLayoutListener(this);
        screen.getViewTreeObserver().addOnGlobalLayoutListener(keyboardVisibilityListener);
    }
    public boolean isKeyboardVisible() {
        return keyboardVisibilityListener.isKeyboardVisible();
    }
    public void setKeyboardCloseListener(Runnable keyboardCloseListener) {
        this.keyboardCloseListener = keyboardCloseListener;
    }
    public void closeKeyboard() {
        InputMethodManager imm = (InputMethodManager) screen.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    }
    private static class KeyboardVisibilityLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener {
        public static final int KEYBOARD_CLOSE_DURATION = 100;
        private View screen;
        private boolean isVisible = false;
        private KeyboardVisibilityDetector detector;
        public KeyboardVisibilityLayoutListener(KeyboardVisibilityDetector detector) {
            this.detector = detector;
            this.screen = detector.screen;
        }
        public boolean isKeyboardVisible() {
            return isVisible;
        }
        @Override
        public void onGlobalLayout() {
            int screenHeight = screen.getRootView().getHeight();
            int screenBottomY = getScreenBottomY(screen);
            int keyboardHeight = screenHeight - screenBottomY;
            if (isKeyboardVisible(screenHeight, keyboardHeight)) {
                isVisible = true;
            } else {
                if (isVisible && detector.keyboardCloseListener != null) {
                    NavigationApplication.instance.runOnMainThread(detector.keyboardCloseListener, KEYBOARD_CLOSE_DURATION);
                }
                isVisible = false;
            }
        }
        private boolean isKeyboardVisible(int screenHeight, int keypadHeight) {
            return keypadHeight > screenHeight * KEYBOARD_VISIBLE_RATIO;
        }
        private int getScreenBottomY(View screen) {
            Rect r = new Rect();
            screen.getWindowVisibleDisplayFrame(r);
            return r.bottom;
        }
    }
}
 |