package com.ht.gate; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.TextView; import androidx.appcompat.app.AppCompatDialog; import butterknife.BindView; import butterknife.ButterKnife; public class PasswordDialog extends AppCompatDialog { private final int MSG_HIDE_PASSWORD = 1; public interface DialogListener { void onCancel(PasswordDialog dialog); void onConfirm(PasswordDialog dialog, String password); } @BindView(R.id.keyboard_view) CustomKeyboardView keyboardView; @BindView(R.id.tv_room_name) TextView tv1; @BindView(R.id.tv_space_name) TextView tv2; @BindView(R.id.tv3) TextView tv3; @BindView(R.id.tv4) TextView tv4; private TextView[] textViews; private String password = ""; private String passwordStr = ""; private DialogListener listener; private Handler mHandler = new Handler(msg -> { switch (msg.what) { case MSG_HIDE_PASSWORD: passwordStr = passwordStr.replaceAll(".", "●"); updatePasswordTv(); break; } return true; }); public PasswordDialog(Context context) { super(context, R.style.DialogStyle); } public void setListener(DialogListener listener) { this.listener = listener; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_password); ButterKnife.bind(this); Window window = getWindow(); WindowManager.LayoutParams wlp = window.getAttributes(); wlp.gravity = Gravity.BOTTOM; window.setAttributes(wlp); window.setWindowAnimations(R.style.DialogAnimation); window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT); View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE; decorView.setSystemUiVisibility(uiOptions); textViews = new TextView[]{tv1, tv2, tv3, tv4}; keyboardView.setKeyboardActionListener(new CustomKeyboardView.OnKeyboardActionListener() { @Override public void onPress(int primaryCode) { } @Override public void onRelease(int primaryCode) { } @Override public void onKey(int primaryCode, int[] keyCodes) { switch (primaryCode) { case CustomKeyboardView.KEYCODE_CANCEL: if (listener != null) { listener.onCancel(PasswordDialog.this); } break; case CustomKeyboardView.KEYCODE_DONE: if (listener != null) { listener.onConfirm(PasswordDialog.this, password); } break; case CustomKeyboardView.KEYCODE_DELETE: if (password.length() > 0) { password = password.substring(0, password.length() - 1); passwordStr = password.replaceAll(".", "●"); updatePasswordTv(); } break; default: String str = Character.toString((char) primaryCode); if (!TextUtils.isEmpty(str) && password.length() < 4) { str = str.substring(0, 1); password += str; passwordStr = password.substring(0, password.length() - 1).replaceAll(".", "●") + str; updatePasswordTv(); } mHandler.removeMessages(MSG_HIDE_PASSWORD); mHandler.sendEmptyMessageDelayed(MSG_HIDE_PASSWORD, 1000); if (password.length() == 4) { if (listener != null) { listener.onConfirm(PasswordDialog.this, password); } } break; } } @Override public void onText(CharSequence text) { } }); } private void updatePasswordTv() { for (int i = 0; i < textViews.length; i++) { if (passwordStr.length() > i) { textViews[i].setText(passwordStr.charAt(i) + ""); } else { textViews[i].setText(""); } if (textViews[i].getText().toString().equals("●")) { textViews[i].setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); } else { textViews[i].setTextSize(TypedValue.COMPLEX_UNIT_SP, 37); } } } }