package me.devsaki.hentoid.activities; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Vibrator; import android.text.Editable; import android.text.TextWatcher; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import java.util.HashMap; import java.util.Map; import me.devsaki.hentoid.HentoidApp; import me.devsaki.hentoid.R; import me.devsaki.hentoid.abstracts.BaseActivity; import me.devsaki.hentoid.util.ConstsPrefs; /** * If set, this will allow us to 'lock' the app behind a password/code. * <p/> * TODO: On-Screen virtual keyboard */ public class AppLockActivity extends BaseActivity { private final long DELAY = 1000; private final long[] goodPinPattern = {0, 250, 100, 100}; private final long[] wrongPinPattern = {0, 200, 200, 200}; private final Map<String, Integer> imageMap = new HashMap<>(); private final String[] LOCK_STATE = {"Locked", "Open"}; private TextView tvAppLock; private EditText etPin; private ImageView ivLock; private Vibrator vibrator; private Handler handler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_app_lock); imageMap.put(LOCK_STATE[0], R.drawable.ic_lock_closed); imageMap.put(LOCK_STATE[1], R.drawable.ic_lock_open); vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); tvAppLock = (TextView) findViewById(R.id.tv_app_lock_subtitle); etPin = (EditText) findViewById(R.id.et_pin); ivLock = (ImageView) findViewById(R.id.iv_lock); if (etPin != null) { etPin.setGravity(Gravity.CENTER); etPin.setOnKeyListener((v, keyCode, event) -> { if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) { checkPin(etPin); return true; } return false; }); etPin.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // We don't care about this event. } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (handler != null) { handler.removeCallbacksAndMessages(null); } } @Override public void afterTextChanged(final Editable s) { if (tvAppLock != null) { tvAppLock.setText(R.string.app_lock_pin); } if (s.length() >= 4) { handler = new Handler(); handler.postDelayed(() -> { etPin.setText(s.toString()); checkPin(null); }, DELAY); } } }); } } @SuppressWarnings("UnusedParameters") public void checkPin(View view) { String pin = etPin.getText().toString(); String appLock = HentoidApp.getSharedPrefs().getString(ConstsPrefs.PREF_APP_LOCK, ""); boolean appLockVibrate = HentoidApp.getSharedPrefs().getBoolean( ConstsPrefs.PREF_APP_LOCK_VIBRATE, ConstsPrefs.PREF_APP_LOCK_VIBRATE_DEFAULT); if (handler != null) { handler.removeCallbacksAndMessages(null); } if (appLock.equals(pin)) { etPin.setText(""); etPin.clearFocus(); InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); inputManager.hideSoftInputFromWindow(etPin.getWindowToken(), 0); tvAppLock.setText(R.string.pin_ok); ivLock.setImageResource(imageMap.get(LOCK_STATE[1])); if (vibrator.hasVibrator() & appLockVibrate) { vibrator.vibrate(goodPinPattern, -1); } Intent intent = new Intent(this, DownloadsActivity.class); startActivity(intent); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); finish(); } else { etPin.selectAll(); ivLock.setImageResource(imageMap.get(LOCK_STATE[0])); tvAppLock.setText(R.string.pin_invalid); if (vibrator.hasVibrator() & appLockVibrate) { vibrator.vibrate(wrongPinPattern, -1); } } } }