package sj.keyboard.widget;
import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import com.keyboard.view.R;
import sj.keyboard.utils.EmoticonsKeyboardUtils;
public abstract class AutoHeightLayout extends SoftKeyboardSizeWatchLayout implements SoftKeyboardSizeWatchLayout.OnResizeListener {
private static final int ID_CHILD = R.id.id_autolayout;
protected Context mContext;
protected int mMaxParentHeight;
protected int mSoftKeyboardHeight;
protected boolean mConfigurationChangedFlag = false;
public AutoHeightLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
mSoftKeyboardHeight = EmoticonsKeyboardUtils.getDefKeyboardHeight(mContext);
addOnResizeListener(this);
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
int childSum = getChildCount();
if (childSum > 1) {
throw new IllegalStateException("can host only one direct child");
}
super.addView(child, index, params);
if (childSum == 0) {
if (child.getId() < 0) {
child.setId(ID_CHILD);
}
LayoutParams paramsChild = (LayoutParams) child.getLayoutParams();
paramsChild.addRule(ALIGN_PARENT_BOTTOM);
child.setLayoutParams(paramsChild);
} else if (childSum == 1) {
LayoutParams paramsChild = (LayoutParams) child.getLayoutParams();
paramsChild.addRule(ABOVE, ID_CHILD);
child.setLayoutParams(paramsChild);
}
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
onSoftKeyboardHeightChanged(mSoftKeyboardHeight);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (mMaxParentHeight == 0) {
mMaxParentHeight = h;
}
}
public void updateMaxParentHeight(int maxParentHeight) {
this.mMaxParentHeight = maxParentHeight;
if(maxParentHeightChangeListener != null){
maxParentHeightChangeListener.onMaxParentHeightChange(maxParentHeight);
}
}
@Override
protected void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mConfigurationChangedFlag = true;
mScreenHeight = 0;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if(mConfigurationChangedFlag){
mConfigurationChangedFlag = false;
Rect r = new Rect();
((Activity) mContext).getWindow().getDecorView().getWindowVisibleDisplayFrame(r);
if (mScreenHeight == 0) {
mScreenHeight = r.bottom;
}
int mNowh = mScreenHeight - r.bottom;
mMaxParentHeight = mNowh;
}
if (mMaxParentHeight != 0) {
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int expandSpec = MeasureSpec.makeMeasureSpec(mMaxParentHeight, heightMode);
super.onMeasure(widthMeasureSpec, expandSpec);
return;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
public void OnSoftPop(final int height) {
if (mSoftKeyboardHeight != height) {
mSoftKeyboardHeight = height;
EmoticonsKeyboardUtils.setDefKeyboardHeight(mContext, mSoftKeyboardHeight);
onSoftKeyboardHeightChanged(mSoftKeyboardHeight);
}
}
@Override
public void OnSoftClose() { }
public abstract void onSoftKeyboardHeightChanged(int height);
private OnMaxParentHeightChangeListener maxParentHeightChangeListener;
public interface OnMaxParentHeightChangeListener {
void onMaxParentHeightChange(int height);
}
public void setOnMaxParentHeightChangeListener(OnMaxParentHeightChangeListener listener) {
this.maxParentHeightChangeListener = listener;
}
}