package com.xiaomi.xms.sales.widget; import android.app.Activity; import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.inputmethod.InputMethodManager; import android.widget.RelativeLayout; import java.lang.ref.WeakReference; public class BaseLayout extends RelativeLayout { public interface BackKeyListener { public boolean shouldHackBackKey(); public void onBackKeyFired(); } protected WeakReference<Activity> mActivityRef; protected WeakReference<BackKeyListener> mListener; public BaseLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public BaseLayout(Context context, AttributeSet attrs) { super(context, attrs); } public BaseLayout(Context context) { super(context); } public void setActivity(Activity activity) { mActivityRef = new WeakReference<Activity>(activity); } public void setBackKeyListener(BackKeyListener listener) { mListener = new WeakReference<BackKeyListener>(listener); } protected void hideInputMethod() { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(getWindowToken(), 0); } } @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { Activity activity = mActivityRef == null ? null : mActivityRef.get(); BackKeyListener listener = mListener == null ? null : mListener.get(); if (listener != null && listener.shouldHackBackKey() && activity != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK) { KeyEvent.DispatcherState state = getKeyDispatcherState(); if (state != null) { if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { state.startTracking(event, this); return true; } else if (event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled() && state.isTracking(event)) { hideInputMethod(); listener.onBackKeyFired(); return true; } } } return super.dispatchKeyEventPreIme(event); } }