import android.os.Bundle;\r
import android.os.Handler;\r
import android.preference.PreferenceManager;\r
+import android.text.Editable;\r
import android.text.InputType;\r
+import android.text.TextWatcher;\r
import android.view.KeyEvent;\r
import android.view.MotionEvent;\r
import android.view.View;\r
import android.widget.CheckBox;\r
import android.widget.EditText;\r
import android.widget.Button;\r
-import android.widget.ImageView;\r
import android.widget.TextView;\r
import android.widget.Toast;\r
import android.widget.TextView.OnEditorActionListener;\r
private static final String KEY_HOST_URL_TEXT = "HOST_URL_TEXT";\r
private static final String KEY_OC_VERSION = "OC_VERSION";\r
private static final String KEY_ACCOUNT = "ACCOUNT";\r
- private static final String KEY_SERVER_CHECKED_AND_VALID = "SERVER_CHECKED_AND_VALID";\r
+ private static final String KEY_SERVER_VALID = "SERVER_VALID";\r
+ private static final String KEY_SERVER_CHECKED = "SERVER_CHECKED";\r
private static final String KEY_SERVER_CHECK_IN_PROGRESS = "SERVER_CHECK_IN_PROGRESS"; \r
private static final String KEY_SERVER_STATUS_TEXT = "SERVER_STATUS_TEXT";\r
private static final String KEY_SERVER_STATUS_ICON = "SERVER_STATUS_ICON";\r
private static final String KEY_IS_SSL_CONN = "IS_SSL_CONN";\r
+ private static final String KEY_PASSWORD_VISIBLE = "PASSWORD_VISIBLE";\r
private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT";\r
private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON";\r
\r
private OwnCloudVersion mDiscoveredVersion;\r
\r
private int mServerStatusText, mServerStatusIcon;\r
- private boolean mServerCheckedAndValid, mIsSslConn;\r
+ private boolean mServerIsChecked, mServerIsValid, mIsSslConn;\r
private int mAuthStatusText, mAuthStatusIcon; \r
\r
private final Handler mHandler = new Handler();\r
private byte mAction;\r
private Account mAccount;\r
\r
- private ImageView mViewPasswordButton;\r
private EditText mHostUrlInput;\r
private EditText mUsernameInput;\r
private EditText mPasswordInput;\r
\r
/// set view and get references to view elements\r
setContentView(R.layout.account_setup);\r
- mViewPasswordButton = (ImageView) findViewById(R.id.viewPasswordButton);\r
mHostUrlInput = (EditText) findViewById(R.id.hostUrlInput);\r
mUsernameInput = (EditText) findViewById(R.id.account_username);\r
mPasswordInput = (EditText) findViewById(R.id.account_password);\r
if (savedInstanceState == null) {\r
/// connection state and info\r
mServerStatusText = mServerStatusIcon = 0;\r
- mServerCheckedAndValid = false;\r
+ mServerIsValid = false;\r
+ mServerIsChecked = false;\r
mIsSslConn = false;\r
mAuthStatusText = mAuthStatusIcon = 0;\r
\r
\r
} else {\r
/// connection state and info\r
- mServerCheckedAndValid = savedInstanceState.getBoolean(KEY_SERVER_CHECKED_AND_VALID);\r
+ mServerIsValid = savedInstanceState.getBoolean(KEY_SERVER_VALID);\r
+ mServerIsChecked = savedInstanceState.getBoolean(KEY_SERVER_CHECKED);\r
mServerStatusText = savedInstanceState.getInt(KEY_SERVER_STATUS_TEXT);\r
mServerStatusIcon = savedInstanceState.getInt(KEY_SERVER_STATUS_ICON);\r
mIsSslConn = savedInstanceState.getBoolean(KEY_IS_SSL_CONN);\r
mAuthStatusText = savedInstanceState.getInt(KEY_AUTH_STATUS_TEXT);\r
mAuthStatusIcon = savedInstanceState.getInt(KEY_AUTH_STATUS_ICON);\r
+ if (savedInstanceState.getBoolean(KEY_PASSWORD_VISIBLE, false)) {\r
+ showPassword();\r
+ }\r
\r
/// server data\r
String ocVersion = savedInstanceState.getString(KEY_OC_VERSION);\r
\r
showServerStatus();\r
showAuthStatus();\r
+ if (mServerIsChecked && !mServerIsValid) showRefreshButton();\r
+ mOkButton.setEnabled(mServerIsValid); // state not automatically recovered in configuration changes\r
\r
if (!OAUTH_MODE_OPTIONAL.equals(getString(R.string.oauth2_mode))) {\r
mOAuth2Check.setVisibility(View.GONE);\r
mHostUrlInput.setEnabled(false);\r
mUsernameInput.setEnabled(false);\r
mOAuth2Check.setVisibility(View.GONE);\r
- if (!mServerCheckedAndValid && mOcServerChkOperation == null) {\r
+ if (!mServerIsValid && mOcServerChkOperation == null) {\r
checkOcServer(); \r
}\r
}\r
mHostUrlInput.setOnTouchListener(new RightDrawableOnTouchListener() {\r
@Override\r
public boolean onDrawableTouch(final MotionEvent event) {\r
- AuthenticatorActivity.this.onRefreshClick(mHostUrlInput);\r
+ if (event.getAction() == MotionEvent.ACTION_UP) {\r
+ AuthenticatorActivity.this.onRefreshClick();\r
+ }\r
return true;\r
}\r
});\r
+ mHostUrlInput.addTextChangedListener(new TextWatcher() {\r
+\r
+ @Override\r
+ public void afterTextChanged(Editable s) {\r
+ if (!mHostBaseUrl.equals(normalizeUrl(mHostUrlInput.getText().toString()))) {\r
+ mOkButton.setEnabled(false);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {}\r
+\r
+ @Override\r
+ public void onTextChanged(CharSequence s, int start, int before, int count) {}\r
+ \r
+ });\r
mPasswordInput.setOnFocusChangeListener(this);\r
mPasswordInput.setImeOptions(EditorInfo.IME_ACTION_DONE);\r
mPasswordInput.setOnEditorActionListener(this);\r
+ mPasswordInput.setOnTouchListener(new RightDrawableOnTouchListener() {\r
+ @Override\r
+ public boolean onDrawableTouch(final MotionEvent event) {\r
+ if (event.getAction() == MotionEvent.ACTION_UP) {\r
+ AuthenticatorActivity.this.onViewPasswordClick();\r
+ }\r
+ return true;\r
+ }\r
+ });\r
}\r
\r
/**\r
/// connection state and info\r
outState.putInt(KEY_SERVER_STATUS_TEXT, mServerStatusText);\r
outState.putInt(KEY_SERVER_STATUS_ICON, mServerStatusIcon);\r
- outState.putBoolean(KEY_SERVER_CHECKED_AND_VALID, mServerCheckedAndValid);\r
- outState.putBoolean(KEY_SERVER_CHECK_IN_PROGRESS, (!mServerCheckedAndValid && mOcServerChkOperation != null));\r
+ outState.putBoolean(KEY_SERVER_VALID, mServerIsValid);\r
+ outState.putBoolean(KEY_SERVER_CHECKED, mServerIsChecked);\r
+ outState.putBoolean(KEY_SERVER_CHECK_IN_PROGRESS, (!mServerIsValid && mOcServerChkOperation != null));\r
outState.putBoolean(KEY_IS_SSL_CONN, mIsSslConn);\r
+ outState.putBoolean(KEY_PASSWORD_VISIBLE, isPasswordVisible());\r
outState.putInt(KEY_AUTH_STATUS_ICON, mAuthStatusIcon);\r
outState.putInt(KEY_AUTH_STATUS_TEXT, mAuthStatusText);\r
\r
private void onUrlInputFocusLost(TextView hostInput) {\r
if (!mHostBaseUrl.equals(normalizeUrl(mHostUrlInput.getText().toString()))) {\r
checkOcServer();\r
+ } else {\r
+ mOkButton.setEnabled(mServerIsValid);\r
}\r
}\r
\r
\r
private void checkOcServer() {\r
String uri = mHostUrlInput.getText().toString().trim();\r
- mServerCheckedAndValid = false;\r
+ mServerIsValid = false;\r
+ mServerIsChecked = false;\r
mOkButton.setEnabled(false);\r
mDiscoveredVersion = null;\r
hideRefreshButton();\r
*/\r
private void onPasswordFocusChanged(TextView passwordInput, boolean hasFocus) {\r
if (hasFocus) {\r
- mViewPasswordButton.setVisibility(View.VISIBLE);\r
+ showViewPasswordButton();\r
} else {\r
- int input_type = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;\r
- passwordInput.setInputType(input_type);\r
- mViewPasswordButton.setVisibility(View.INVISIBLE);\r
+ hidePassword();\r
+ hidePasswordButton();\r
}\r
}\r
\r
\r
+ private void showViewPasswordButton() {\r
+ //int drawable = android.R.drawable.ic_menu_view;\r
+ int drawable = R.drawable.ic_view;\r
+ if (isPasswordVisible()) {\r
+ //drawable = android.R.drawable.ic_secure;\r
+ drawable = R.drawable.ic_hide;\r
+ }\r
+ mPasswordInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, drawable, 0);\r
+ }\r
+\r
+ private boolean isPasswordVisible() {\r
+ return ((mPasswordInput.getInputType() & InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);\r
+ }\r
+ \r
+ private void hidePasswordButton() {\r
+ mPasswordInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\r
+ }\r
+\r
+ private void showPassword() {\r
+ mPasswordInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);\r
+ showViewPasswordButton();\r
+ }\r
+ \r
+ private void hidePassword() {\r
+ mPasswordInput.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);\r
+ showViewPasswordButton();\r
+ }\r
+ \r
\r
/**\r
* Cancels the authenticator activity\r
private void onOcServerCheckFinish(OwnCloudServerCheckOperation operation, RemoteOperationResult result) {\r
if (operation.equals(mOcServerChkOperation)) {\r
/// save result state\r
- mServerCheckedAndValid = result.isSuccess();\r
+ mServerIsChecked = true;\r
+ mServerIsValid = result.isSuccess();\r
mIsSslConn = (result.getCode() == ResultCode.OK_SSL);\r
mOcServerChkOperation = null;\r
\r
/// update status icon and text\r
- if (mServerCheckedAndValid) {\r
+ if (mServerIsValid) {\r
hideRefreshButton();\r
} else {\r
showRefreshButton();\r
mHostBaseUrl = normalizeUrl(mHostUrlInput.getText().toString());\r
\r
/// allow or not the user try to access the server\r
- mOkButton.setEnabled(mServerCheckedAndValid);\r
+ mOkButton.setEnabled(mServerIsValid);\r
\r
} // else nothing ; only the last check operation is considered; \r
// multiple can be triggered if the user amends a URL before a previous check can be triggered\r
url = url.substring(0, url.length() - 1);\r
}\r
}\r
- return url;\r
+ return (url != null ? url : "");\r
}\r
\r
/**\r
* \r
* @param view Refresh 'button'\r
*/\r
- public void onRefreshClick(View view) {\r
+ public void onRefreshClick() {\r
checkOcServer();\r
}\r
\r
\r
+ \r
/**\r
* Called when the eye icon in the password field is clicked.\r
* \r
* Toggles the visibility of the password in the field. \r
- * \r
- * @param view 'View password' 'button'\r
*/\r
- public void onViewPasswordClick(View view) {\r
+ public void onViewPasswordClick() {\r
int selectionStart = mPasswordInput.getSelectionStart();\r
int selectionEnd = mPasswordInput.getSelectionEnd();\r
- int input_type = mPasswordInput.getInputType();\r
- if ((input_type & InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {\r
- input_type = InputType.TYPE_CLASS_TEXT\r
- | InputType.TYPE_TEXT_VARIATION_PASSWORD;\r
+ if (isPasswordVisible()) {\r
+ hidePassword();\r
} else {\r
- input_type = InputType.TYPE_CLASS_TEXT\r
- | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;\r
+ showPassword();\r
}\r
- mPasswordInput.setInputType(input_type);\r
mPasswordInput.setSelection(selectionStart, selectionEnd);\r
} \r
\r
mOAuthTokenEndpointText.setVisibility(View.VISIBLE);\r
mUsernameInput.setVisibility(View.GONE);\r
mPasswordInput.setVisibility(View.GONE);\r
- mViewPasswordButton.setVisibility(View.GONE);\r
} else {\r
mOAuthAuthEndpointText.setVisibility(View.GONE);\r
mOAuthTokenEndpointText.setVisibility(View.GONE);\r
mUsernameInput.setVisibility(View.VISIBLE);\r
mPasswordInput.setVisibility(View.VISIBLE);\r
- mViewPasswordButton.setVisibility(View.INVISIBLE);\r
} \r
\r
} \r
\r
private abstract static class RightDrawableOnTouchListener implements OnTouchListener {\r
\r
- private int fuzz = 10;\r
+ private int fuzz = 75;\r
\r
/**\r
* {@inheritDoc}\r
*/\r
@Override\r
public boolean onTouch(View view, MotionEvent event) {\r
- if (event.getAction() == MotionEvent.ACTION_DOWN) {\r
- Drawable rightDrawable = null;\r
- if (view instanceof TextView) {\r
- Drawable[] drawables = ((TextView)view).getCompoundDrawables();\r
- if (drawables.length > 2) {\r
- rightDrawable = drawables[2];\r
- }\r
+ Drawable rightDrawable = null;\r
+ if (view instanceof TextView) {\r
+ Drawable[] drawables = ((TextView)view).getCompoundDrawables();\r
+ if (drawables.length > 2) {\r
+ rightDrawable = drawables[2];\r
}\r
- if (rightDrawable != null) {\r
- final int x = (int) event.getX();\r
- final int y = (int) event.getY();\r
- final Rect bounds = rightDrawable.getBounds();\r
- if (x >= (view.getRight() - bounds.width() - fuzz) && x <= (view.getRight() - view.getPaddingRight() + fuzz)\r
- && y >= (view.getPaddingTop() - fuzz) && y <= (view.getHeight() - view.getPaddingBottom()) + fuzz) {\r
- \r
- return onDrawableTouch(event);\r
- }\r
+ }\r
+ if (rightDrawable != null) {\r
+ final int x = (int) event.getX();\r
+ final int y = (int) event.getY();\r
+ final Rect bounds = rightDrawable.getBounds();\r
+ if (x >= (view.getRight() - bounds.width() - fuzz) && x <= (view.getRight() - view.getPaddingRight() + fuzz)\r
+ && y >= (view.getPaddingTop() - fuzz) && y <= (view.getHeight() - view.getPaddingBottom()) + fuzz) {\r
+ \r
+ return onDrawableTouch(event);\r
}\r
}\r
return false;\r