Unexpected-Keyboard/srcs/juloo.keyboard2/KeyPreviewPopup.java

108 lines
2.9 KiB
Java
Raw Normal View History

package juloo.keyboard2;
2015-10-28 20:56:28 +01:00
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.View;
2015-10-28 16:15:19 +01:00
import android.view.View.MeasureSpec;
import android.view.WindowManager;
import android.widget.PopupWindow;
import android.widget.TextView;
class KeyPreviewPopup extends PopupWindow
2015-10-28 20:56:28 +01:00
implements Handler.Callback
{
2015-10-28 20:56:28 +01:00
private final TextView _content;
private final View _anchor;
2015-10-28 20:56:28 +01:00
private final int _bottomMargin;
private final long _dismissTimeout;
private final Handler _handler;
private int _minWidth;
public KeyPreviewPopup(View anchor, long dismissTimeout)
{
super(anchor.getContext());
_content = new TextView(anchor.getContext());
2015-10-28 16:15:19 +01:00
_content.setTextColor(anchor.getResources().getColor(R.color.preview_text));
_content.setTextSize(anchor.getResources().getDimension(R.dimen.preview_text));
int padding = (int)anchor.getResources().getDimension(R.dimen.preview_padding);
_content.setPaddingRelative(padding, padding, padding, padding);
_content.setTextAlignment(View.TEXT_ALIGNMENT_GRAVITY);
_content.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
_anchor = anchor;
2015-10-28 16:15:19 +01:00
_bottomMargin = (int)anchor.getResources().getDimension(R.dimen.preview_margin);
2015-10-28 20:56:28 +01:00
_dismissTimeout = dismissTimeout;
_handler = new Handler(this);
setMinWidth(0);
setWidth(WindowManager.LayoutParams.WRAP_CONTENT);
setHeight(WindowManager.LayoutParams.WRAP_CONTENT);
2015-10-28 16:15:19 +01:00
setBackgroundDrawable(anchor.getResources().getDrawable(R.drawable.preview_popup));
setContentView(_content);
2015-10-28 16:15:19 +01:00
setClippingEnabled(false);
setTouchable(false);
}
2015-10-28 20:56:28 +01:00
@Override
public boolean handleMessage(Message msg)
{
2015-10-28 20:56:28 +01:00
forceDismiss();
return (true);
}
public void forceDismiss()
{
setMinWidth(0);
dismiss();
}
public void setPreview(KeyValue key, int flags)
{
StringBuilder preview;
if (key == null)
{
2015-10-28 20:56:28 +01:00
_handler.sendEmptyMessageDelayed(0, _dismissTimeout);
return ;
}
2015-10-28 20:56:28 +01:00
_handler.removeMessages(0);
preview = new StringBuilder();
if ((flags & KeyValue.FLAG_CTRL) != 0)
preview.append("Ctrl-");
if ((flags & KeyValue.FLAG_ALT) != 0)
preview.append("Alt-");
if ((flags & KeyValue.FLAG_SHIFT) != 0 && !Character.isLetter(key.getChar(0)))
preview.append("Shift-");
preview.append(key.getSymbol(flags));
_content.setText(preview.toString());
show();
}
private void setMinWidth(int minWidth)
{
_minWidth = minWidth;
_content.setMinWidth(minWidth);
}
2015-10-28 16:15:19 +01:00
private void show()
{
2015-10-28 20:56:28 +01:00
int x;
int y;
int width;
int height;
2015-10-28 16:15:19 +01:00
_content.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
2015-10-28 20:56:28 +01:00
width = _content.getMeasuredWidth();
height = _content.getMeasuredHeight();
if (width > _minWidth)
setMinWidth(width);
x = (_anchor.getMeasuredWidth() - width) / 2;
y = -(height + _bottomMargin);
if (!isShowing())
showAtLocation(_anchor, Gravity.NO_GRAVITY, x, y);
update(x, y, width, height);
2015-10-28 16:15:19 +01:00
}
}