diff --git a/app/src/main/java/de/baumann/diaspora/MainActivity.java b/app/src/main/java/de/baumann/diaspora/MainActivity.java index 50a00696..25df04cc 100644 --- a/app/src/main/java/de/baumann/diaspora/MainActivity.java +++ b/app/src/main/java/de/baumann/diaspora/MainActivity.java @@ -81,6 +81,7 @@ import java.util.Date; import butterknife.Bind; import butterknife.ButterKnife; import de.baumann.diaspora.utils.Helpers; +import de.baumann.diaspora.utils.SoftKeyboardStateWatcher; public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, WebUserProfileChangedListener { @@ -154,6 +155,22 @@ public class MainActivity extends AppCompatActivity }); + // Keyboard State Watcher + final SoftKeyboardStateWatcher softKeyboardStateWatcher + = new SoftKeyboardStateWatcher(findViewById(R.id.swipe)); + + softKeyboardStateWatcher.addSoftKeyboardStateListener(new SoftKeyboardStateWatcher.SoftKeyboardStateListener() { + @Override + public void onSoftKeyboardOpened(int keyboardHeightInPx) { + fab.setVisibility(View.GONE); + } + @Override + public void onSoftKeyboardClosed() { + fab.setVisibility(View.VISIBLE); + } + }); + + // Load app settings setupNavigationSlider(); diff --git a/app/src/main/java/de/baumann/diaspora/utils/SoftKeyboardStateWatcher.java b/app/src/main/java/de/baumann/diaspora/utils/SoftKeyboardStateWatcher.java new file mode 100644 index 00000000..624c5f81 --- /dev/null +++ b/app/src/main/java/de/baumann/diaspora/utils/SoftKeyboardStateWatcher.java @@ -0,0 +1,95 @@ +package de.baumann.diaspora.utils; + +/** + * Created by juergen on 25.03.16. Part of Diaspora WebApp. + * 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 { + + public interface SoftKeyboardStateListener { + void onSoftKeyboardOpened(int keyboardHeightInPx); + void onSoftKeyboardClosed(); + } + + private final List 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(); + } + } + } +}