import android.content.DialogInterface;\r
import android.content.Intent;\r
import android.content.SharedPreferences;\r
+import android.graphics.Rect;\r
+import android.graphics.drawable.Drawable;\r
import android.net.Uri;\r
import android.os.Bundle;\r
import android.os.Handler;\r
import android.preference.PreferenceManager;\r
import android.text.InputType;\r
+import android.view.KeyEvent;\r
+import android.view.MotionEvent;\r
import android.view.View;\r
import android.view.View.OnFocusChangeListener;\r
+import android.view.View.OnTouchListener;\r
import android.view.Window;\r
+import android.view.inputmethod.EditorInfo;\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
\r
import com.owncloud.android.R;\r
\r
* @author David A. Velasco\r
*/\r
public class AuthenticatorActivity extends AccountAuthenticatorActivity\r
- implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeListener {\r
+ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeListener, OnEditorActionListener {\r
\r
private static final String TAG = AuthenticatorActivity.class.getSimpleName();\r
\r
private byte mAction;\r
private Account mAccount;\r
\r
- private ImageView mRefreshButton;\r
private ImageView mViewPasswordButton;\r
private EditText mHostUrlInput;\r
private EditText mUsernameInput;\r
\r
/// set view and get references to view elements\r
setContentView(R.layout.account_setup);\r
- mRefreshButton = (ImageView) findViewById(R.id.refreshButton);\r
mViewPasswordButton = (ImageView) findViewById(R.id.viewPasswordButton);\r
mHostUrlInput = (EditText) findViewById(R.id.hostUrlInput);\r
mUsernameInput = (EditText) findViewById(R.id.account_username);\r
\r
/// bind view elements to listeners\r
mHostUrlInput.setOnFocusChangeListener(this);\r
+ mHostUrlInput.setOnTouchListener(new RightDrawableOnTouchListener() {\r
+ @Override\r
+ public boolean onDrawableTouch(final MotionEvent event) {\r
+ AuthenticatorActivity.this.onRefreshClick(mHostUrlInput);\r
+ return true;\r
+ }\r
+ });\r
mPasswordInput.setOnFocusChangeListener(this);\r
+ mPasswordInput.setImeOptions(EditorInfo.IME_ACTION_DONE);\r
+ mPasswordInput.setOnEditorActionListener(this);\r
\r
/// initialization\r
mAccountMgr = AccountManager.get(this);\r
mStatusText = mStatusIcon = 0;\r
mStatusCorrect = false;\r
mIsSslConn = false;\r
+ updateConnStatus();\r
+ updateAuthStatus();\r
\r
/// retrieve extras from intent\r
String tokenType = getIntent().getExtras().getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);\r
updateConnStatus();\r
\r
/// UI settings depending upon connection\r
- mOkButton.setEnabled(mStatusCorrect); // TODO really necessary?\r
- if (!mStatusCorrect)\r
- mRefreshButton.setVisibility(View.VISIBLE); // seems that setting visibility is necessary\r
- else\r
- mRefreshButton.setVisibility(View.INVISIBLE);\r
+ mOkButton.setEnabled(mStatusCorrect); \r
+ if (!mStatusCorrect) {\r
+ mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_action_refresh_black, 0);\r
+ } else {\r
+ mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\r
+ }\r
\r
/// server data\r
String ocVersion = savedInstanceState.getString(KEY_OC_VERSION);\r
\r
/// GET ACCESS TOKEN to the oAuth server \r
RemoteOperation operation = new OAuth2GetAccessToken( getString(R.string.oauth2_client_id), \r
- getString(R.string.oauth2_redirect_uri), // TODO check - necessary here? \r
+ getString(R.string.oauth2_redirect_uri), \r
getString(R.string.oauth2_grant_type),\r
queryParameters);\r
//WebdavClient client = OwnCloudClientUtils.createOwnCloudClient(Uri.parse(getString(R.string.oauth2_url_endpoint_access)), getApplicationContext());\r
mDiscoveredVersion = null;\r
mOperationThread = mOcServerChkOperation.execute(client, this, mHandler);\r
} else {\r
- mRefreshButton.setVisibility(View.INVISIBLE);\r
+ mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\r
mStatusText = 0;\r
mStatusIcon = 0;\r
updateConnStatus();\r
}\r
\r
/// update the visibility of the 'retry connection' button\r
- if (!mStatusCorrect)\r
- mRefreshButton.setVisibility(View.VISIBLE);\r
- else\r
- mRefreshButton.setVisibility(View.INVISIBLE);\r
+ if (!mStatusCorrect) {\r
+ mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_action_refresh_black, 0);\r
+ } else {\r
+ mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\r
+ }\r
\r
/// retrieve discovered version and normalize server URL\r
mDiscoveredVersion = operation.getDiscoveredVersion();\r
* to the last check on the ownCloud server.\r
*/\r
private void updateConnStatus() {\r
- ImageView iv = (ImageView) findViewById(R.id.action_indicator);\r
- TextView tv = (TextView) findViewById(R.id.status_text);\r
+ TextView tv = (TextView) findViewById(R.id.server_status_text);\r
\r
if (mStatusIcon == 0 && mStatusText == 0) {\r
- iv.setVisibility(View.INVISIBLE);\r
tv.setVisibility(View.INVISIBLE);\r
} else {\r
- iv.setImageResource(mStatusIcon);\r
tv.setText(mStatusText);\r
- iv.setVisibility(View.VISIBLE);\r
+ tv.setCompoundDrawablesWithIntrinsicBounds(mStatusIcon, 0, 0, 0);\r
tv.setVisibility(View.VISIBLE);\r
}\r
}\r
* @param view Refresh 'button'\r
*/\r
public void onRefreshClick(View view) {\r
- onFocusChange(mRefreshButton, false);\r
+ onFocusChange(mHostUrlInput, false);\r
}\r
\r
\r
showDialog(DIALOG_CERT_NOT_SAVED);\r
}\r
\r
+\r
+ /**\r
+ * Called when the 'action' button in an IME is pressed ('enter' in software keyboard).\r
+ * \r
+ * Used to trigger the authorization check when the user presses 'enter' after writing the password.\r
+ */\r
+ @Override\r
+ public boolean onEditorAction(TextView inputField, int actionId, KeyEvent event) {\r
+ if (inputField != null && inputField.equals(mPasswordInput) && \r
+ actionId == EditorInfo.IME_ACTION_DONE) {\r
+ if (mOkButton.isEnabled()) {\r
+ mOkButton.performClick();\r
+ }\r
+ }\r
+ return false; // always return false to grant that the software keyboard is hidden anyway\r
+ }\r
+\r
+ \r
+ private abstract static class RightDrawableOnTouchListener implements OnTouchListener {\r
+\r
+ private int fuzz = 10;\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
+ }\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
+ }\r
+ return false;\r
+ }\r
+ \r
+ public abstract boolean onDrawableTouch(final MotionEvent event);\r
+ }\r
+ \r
}\r