package tv.emby.embyatv.startup; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.media.ToneGenerator; import android.os.Bundle; import android.text.InputType; import android.view.KeyEvent; import android.widget.EditText; import android.widget.TextView; import mediabrowser.model.dto.UserDto; import tv.emby.embyatv.R; import tv.emby.embyatv.TvApp; import tv.emby.embyatv.util.Utils; public class DpadPwActivity extends Activity { private long lastKeyDown = Long.MAX_VALUE; private long lastKeyUp = 0; private boolean keyUpDetected = true; private boolean processed = false; private int lastKey; private int longPressSensitivity = 600; private int doubleClickSensitivity = 350; private String password = ""; TextView title; TextView pwField; UserDto user; String directItemId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dpad_pw); title = (TextView)findViewById(R.id.dpad_pw_text); pwField = (TextView)findViewById(R.id.dpad_pw_display); user = TvApp.getApplication().getSerializer().DeserializeFromString(getIntent().getStringExtra("User"), UserDto.class); directItemId = getIntent().getStringExtra("ItemId"); title.setText(title.getText() + " for "+ user.getName()); pwField.setText(password); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { keyUpDetected = true; switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_UP: if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER && System.currentTimeMillis() - lastKeyDown > longPressSensitivity) { if (processed) return true; //some controllers appear to double send the up on a long press TvApp.getApplication().getLogger().Debug("Password finished"); Utils.MakeTone(ToneGenerator.TONE_CDMA_ANSWER, 200); processed = true; Utils.loginUser(user.getName(), password, TvApp.getApplication().getLoginApiClient(), this, directItemId); return true; } if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT && System.currentTimeMillis() - lastKeyDown > longPressSensitivity) { TvApp.getApplication().getLogger().Debug("Password clear"); password = ""; pwField.setText(password); processed = false; return true; } if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN && System.currentTimeMillis() - lastKeyDown > longPressSensitivity) { TvApp.getApplication().getLogger().Debug("Requesting dialog..."); final EditText password = new EditText(this); final Activity activity = this; password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); new AlertDialog.Builder(this) .setTitle("Enter Password") .setMessage("Please enter password for " + user.getName()) .setView(password) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String pw = password.getText().toString(); Utils.loginUser(user.getName(), pw, TvApp.getApplication().getLoginApiClient(), activity, directItemId); } }).show(); return true; } lastKeyDown = Long.MAX_VALUE; if (lastKey == keyCode && System.currentTimeMillis() - lastKeyUp <= doubleClickSensitivity) { lastKeyUp = 0; Utils.Beep(300); //Remove the single-click value password = password.substring(0,password.length()-1); processKey(keyCode, true); } else { lastKeyUp = System.currentTimeMillis(); Utils.Beep(); processKey(keyCode, false); } processed = false; return true; default: processed = false; return super.onKeyUp(keyCode, event); } } private void processKey(int keyCode, boolean doubleClick) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_UP: password += doubleClick ? 6 : 1; break; case KeyEvent.KEYCODE_DPAD_LEFT: password += doubleClick ? 7 : 2; break; case KeyEvent.KEYCODE_DPAD_RIGHT: password += doubleClick ? 8 : 3; break; case KeyEvent.KEYCODE_DPAD_DOWN: password += doubleClick ? 9 : 4; break; case KeyEvent.KEYCODE_DPAD_CENTER: password += doubleClick ? 5 : 0; break; } //TvApp.getApplication().getLogger().Debug(password); pwField.setText(password); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_DPAD_DOWN: case KeyEvent.KEYCODE_DPAD_LEFT: case KeyEvent.KEYCODE_DPAD_RIGHT: case KeyEvent.KEYCODE_DPAD_UP: if (!keyUpDetected) return false; lastKeyDown = System.currentTimeMillis(); lastKey = keyCode; keyUpDetected = false; return true; default: return super.onKeyDown(keyCode, event); } } }