package com.datdo.mobilib.base; import com.datdo.mobilib.event.MblCommonEvents; import com.datdo.mobilib.event.MblEventCenter; import com.datdo.mobilib.util.MblUtils; import android.content.Context; import android.util.AttributeSet; import android.widget.FrameLayout; /** * <pre> * Root view for activity. This view is mainly for detecting keyboard ON/OFF. * At {@link #onSizeChanged(int, int, int, int)}, if screen_size - view_size > 200dp, it is considered "Keyboard ON", otherwise it is "Keyboard OFF". * </pre> */ public class MblDecorView extends FrameLayout { private static final int KB_SHOWN = 1; private static final int KB_HIDDEN = 2; private static final int MIN_KEYBOARD_HEIGHT = MblUtils.pxFromDp(200); private static int sKeyboardStatus = 0; private int mMaxDisplaySize; private int mMinDisplaySize; private MblOnSizeChangedListener mOnSizeChangedListener; public MblDecorView(Context context) { super(context); init(); } public MblDecorView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public MblDecorView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { int[] displaySizes = MblUtils.getDisplaySizes(); mMaxDisplaySize = Math.max(displaySizes[0], displaySizes[1]); mMinDisplaySize = Math.min(displaySizes[0], displaySizes[1]); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (mOnSizeChangedListener != null) { mOnSizeChangedListener.onSizeChanged(w, h, oldw, oldh); } if (getContext() != MblUtils.getCurrentContext()) { return; } int maxVisibleSize = Math.max(w, h); int minVisibleSize = Math.min(w, h); int maxDiff = Math.max(Math.abs(mMaxDisplaySize - maxVisibleSize), Math.abs(mMinDisplaySize - minVisibleSize)); int kbStt = (maxDiff >= MIN_KEYBOARD_HEIGHT) ? KB_SHOWN : KB_HIDDEN; if (sKeyboardStatus != kbStt) { boolean isShown = kbStt == KB_SHOWN; sKeyboardStatus = kbStt; MblEventCenter.postEvent(this, isShown ? MblCommonEvents.KEYBOARD_SHOWN : MblCommonEvents.KEYBOARD_HIDDEN); } } public static interface MblOnSizeChangedListener { public void onSizeChanged(int w, int h, int oldw, int oldh); } public void setOnSizeChangedListener(MblOnSizeChangedListener listener) { mOnSizeChangedListener = listener; } /** * @return whether keyboard is ON or OFF */ public static boolean isKeyboardOn() { return sKeyboardStatus == KB_SHOWN; } }