96 lines
3.1 KiB
Java
96 lines
3.1 KiB
Java
package com.github.dfa.diaspora_android.listener;
|
|
|
|
/**
|
|
* Created by juergen on 25.03.16. Part of Diaspora for Android.
|
|
* solution found on: http://stackoverflow.com/questions/2150078/how-to-check-visibility-of-software-keyboard-in-android
|
|
*/
|
|
|
|
import android.graphics.Rect;
|
|
import android.view.View;
|
|
import android.view.ViewTreeObserver;
|
|
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
|
|
public class SoftKeyboardStateWatcher implements ViewTreeObserver.OnGlobalLayoutListener {
|
|
|
|
private final List<SoftKeyboardStateListener> listeners = new LinkedList<>();
|
|
private final View activityRootView;
|
|
private int lastSoftKeyboardHeightInPx;
|
|
private boolean isSoftKeyboardOpened;
|
|
public SoftKeyboardStateWatcher(View activityRootView) {
|
|
this(activityRootView, false);
|
|
}
|
|
|
|
public SoftKeyboardStateWatcher(View activityRootView, boolean isSoftKeyboardOpened) {
|
|
this.activityRootView = activityRootView;
|
|
this.isSoftKeyboardOpened = isSoftKeyboardOpened;
|
|
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
|
|
}
|
|
|
|
@Override
|
|
public void onGlobalLayout() {
|
|
final Rect r = new Rect();
|
|
//r will be populated with the coordinates of your view that area still visible.
|
|
activityRootView.getWindowVisibleDisplayFrame(r);
|
|
|
|
final int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
|
|
if (!isSoftKeyboardOpened && heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
|
|
isSoftKeyboardOpened = true;
|
|
notifyOnSoftKeyboardOpened(heightDiff);
|
|
} else if (isSoftKeyboardOpened && heightDiff < 100) {
|
|
isSoftKeyboardOpened = false;
|
|
notifyOnSoftKeyboardClosed();
|
|
}
|
|
}
|
|
|
|
public void setIsSoftKeyboardOpened(boolean isSoftKeyboardOpened) {
|
|
this.isSoftKeyboardOpened = isSoftKeyboardOpened;
|
|
}
|
|
|
|
public boolean isSoftKeyboardOpened() {
|
|
return isSoftKeyboardOpened;
|
|
}
|
|
|
|
/**
|
|
* Default value is zero {@code 0}.
|
|
*
|
|
* @return last saved keyboard height in px
|
|
*/
|
|
public int getLastSoftKeyboardHeightInPx() {
|
|
return lastSoftKeyboardHeightInPx;
|
|
}
|
|
|
|
public void addSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
|
|
listeners.add(listener);
|
|
}
|
|
|
|
public void removeSoftKeyboardStateListener(SoftKeyboardStateListener listener) {
|
|
listeners.remove(listener);
|
|
}
|
|
|
|
private void notifyOnSoftKeyboardOpened(int keyboardHeightInPx) {
|
|
this.lastSoftKeyboardHeightInPx = keyboardHeightInPx;
|
|
|
|
for (SoftKeyboardStateListener listener : listeners) {
|
|
if (listener != null) {
|
|
listener.onSoftKeyboardOpened(keyboardHeightInPx);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void notifyOnSoftKeyboardClosed() {
|
|
for (SoftKeyboardStateListener listener : listeners) {
|
|
if (listener != null) {
|
|
listener.onSoftKeyboardClosed();
|
|
}
|
|
}
|
|
}
|
|
|
|
public interface SoftKeyboardStateListener {
|
|
void onSoftKeyboardOpened(int keyboardHeightInPx);
|
|
|
|
void onSoftKeyboardClosed();
|
|
}
|
|
}
|