Avoid that refresh button appears while checking remote server
[pub/Android/ownCloud.git] / src / com / owncloud / android / authentication / AuthenticatorActivity.java
index e483970..0578905 100644 (file)
@@ -18,7 +18,6 @@
 \r
 package com.owncloud.android.authentication;\r
 \r
 \r
 package com.owncloud.android.authentication;\r
 \r
-import com.owncloud.android.AccountUtils;\r
 import com.owncloud.android.Log_OC;\r
 import com.owncloud.android.ui.dialog.SslValidatorDialog;\r
 import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;\r
 import com.owncloud.android.Log_OC;\r
 import com.owncloud.android.ui.dialog.SslValidatorDialog;\r
 import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;\r
@@ -84,6 +83,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
     public static final String EXTRA_USER_NAME = "USER_NAME";\r
     public static final String EXTRA_HOST_NAME = "HOST_NAME";\r
     public static final String EXTRA_ACTION = "ACTION";\r
     public static final String EXTRA_USER_NAME = "USER_NAME";\r
     public static final String EXTRA_HOST_NAME = "HOST_NAME";\r
     public static final String EXTRA_ACTION = "ACTION";\r
+    public static final String EXTRA_ENFORCED_UPDATE = "ENFORCE_UPDATE";\r
 \r
     private static final String KEY_HOST_URL_TEXT = "HOST_URL_TEXT";\r
     private static final String KEY_OC_VERSION = "OC_VERSION";\r
 \r
     private static final String KEY_HOST_URL_TEXT = "HOST_URL_TEXT";\r
     private static final String KEY_OC_VERSION = "OC_VERSION";\r
@@ -110,7 +110,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
 \r
     public static final byte ACTION_CREATE = 0;\r
     public static final byte ACTION_UPDATE_TOKEN = 1;\r
 \r
     public static final byte ACTION_CREATE = 0;\r
     public static final byte ACTION_UPDATE_TOKEN = 1;\r
-    \r
+\r
     private String mHostBaseUrl;\r
     private OwnCloudVersion mDiscoveredVersion;\r
 \r
     private String mHostBaseUrl;\r
     private OwnCloudVersion mDiscoveredVersion;\r
 \r
@@ -132,6 +132,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
     private Account mAccount;\r
 \r
     private EditText mHostUrlInput;\r
     private Account mAccount;\r
 \r
     private EditText mHostUrlInput;\r
+    private View mRefreshButton;\r
     private EditText mUsernameInput;\r
     private EditText mPasswordInput;\r
     private CheckBox mOAuth2Check;\r
     private EditText mUsernameInput;\r
     private EditText mPasswordInput;\r
     private CheckBox mOAuth2Check;\r
@@ -143,6 +144,8 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
     private TextView mOAuthTokenEndpointText;\r
     \r
     private boolean mRefreshButtonEnabled;\r
     private TextView mOAuthTokenEndpointText;\r
     \r
     private boolean mRefreshButtonEnabled;\r
+    \r
+    private boolean mHostUrlInputEnabled;\r
 \r
 \r
     /**\r
 \r
 \r
     /**\r
@@ -165,6 +168,10 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         mOAuth2Check = (CheckBox) findViewById(R.id.oauth_onOff_check);\r
         mOkButton = findViewById(R.id.buttonOK);\r
         mAuthStatusLayout = (TextView) findViewById(R.id.auth_status_text); \r
         mOAuth2Check = (CheckBox) findViewById(R.id.oauth_onOff_check);\r
         mOkButton = findViewById(R.id.buttonOK);\r
         mAuthStatusLayout = (TextView) findViewById(R.id.auth_status_text); \r
+        \r
+        /// set Host Url Input Enabled\r
+        mHostUrlInputEnabled = getResources().getBoolean(R.bool.show_server_url_input);\r
+        \r
 \r
         /// complete label for 'register account' button\r
         Button b = (Button) findViewById(R.id.account_register);\r
 \r
         /// complete label for 'register account' button\r
         Button b = (Button) findViewById(R.id.account_register);\r
@@ -178,6 +185,19 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         mAction = getIntent().getByteExtra(EXTRA_ACTION, ACTION_CREATE); \r
         mAccount = null;\r
         mHostBaseUrl = "";\r
         mAction = getIntent().getByteExtra(EXTRA_ACTION, ACTION_CREATE); \r
         mAccount = null;\r
         mHostBaseUrl = "";\r
+        boolean refreshButtonEnabled = false;\r
+        \r
+        // URL input configuration applied\r
+        if (!mHostUrlInputEnabled)\r
+        {\r
+            mHostUrlInput.setText(getString(R.string.server_url));\r
+            findViewById(R.id.hostUrlFrame).setVisibility(View.GONE);\r
+            \r
+            mRefreshButton = findViewById(R.id.centeredRefreshButton);\r
+\r
+        } else {\r
+            mRefreshButton = findViewById(R.id.embeddedRefreshButton);\r
+        }\r
 \r
         if (savedInstanceState == null) {\r
             /// connection state and info\r
 \r
         if (savedInstanceState == null) {\r
             /// connection state and info\r
@@ -205,7 +225,11 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             }\r
             mOAuth2Check.setChecked(oAuthRequired);\r
             changeViewByOAuth2Check(oAuthRequired);\r
             }\r
             mOAuth2Check.setChecked(oAuthRequired);\r
             changeViewByOAuth2Check(oAuthRequired);\r
-\r
+            mJustCreated = true;\r
+            \r
+            if (mAction == ACTION_UPDATE_TOKEN || !mHostUrlInputEnabled) {\r
+                checkOcServer(); \r
+            }\r
 \r
         } else {\r
             /// connection state and info\r
 \r
         } else {\r
             /// connection state and info\r
@@ -236,43 +260,35 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             }            \r
             \r
             // refresh button enabled\r
             }            \r
             \r
             // refresh button enabled\r
-            mRefreshButtonEnabled = savedInstanceState.getBoolean(KEY_REFRESH_BUTTON_ENABLED);\r
+            refreshButtonEnabled = savedInstanceState.getBoolean(KEY_REFRESH_BUTTON_ENABLED);\r
+            \r
 \r
         }\r
 \r
         showServerStatus();\r
         showAuthStatus();\r
 \r
         }\r
 \r
         showServerStatus();\r
         showAuthStatus();\r
-        if (mServerIsChecked && !mServerIsValid && mRefreshButtonEnabled) 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
-        }\r
 \r
         if (mAction == ACTION_UPDATE_TOKEN) {\r
             /// lock things that should not change\r
             mHostUrlInput.setEnabled(false);\r
 \r
         if (mAction == ACTION_UPDATE_TOKEN) {\r
             /// lock things that should not change\r
             mHostUrlInput.setEnabled(false);\r
+            mHostUrlInput.setFocusable(false);\r
             mUsernameInput.setEnabled(false);\r
             mUsernameInput.setEnabled(false);\r
+            mUsernameInput.setFocusable(false);\r
+            mOAuth2Check.setVisibility(View.GONE);\r
+        }\r
+        \r
+        //if (mServerIsChecked && !mServerIsValid && mRefreshButtonEnabled) showRefreshButton();\r
+        if (mServerIsChecked && !mServerIsValid && refreshButtonEnabled) 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
             mOAuth2Check.setVisibility(View.GONE);\r
-            if (!mServerIsValid && mOcServerChkOperation == null) {\r
-                checkOcServer(); \r
-            }\r
         }\r
 \r
         mPasswordInput.setText("");     // clean password to avoid social hacking (disadvantage: password in removed if the device is turned aside)\r
         }\r
 \r
         mPasswordInput.setText("");     // clean password to avoid social hacking (disadvantage: password in removed if the device is turned aside)\r
-        mJustCreated = true;\r
 \r
         /// bind view elements to listeners\r
         mHostUrlInput.setOnFocusChangeListener(this);\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
-                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
         mHostUrlInput.addTextChangedListener(new TextWatcher() {\r
 \r
             @Override\r
@@ -338,7 +354,8 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         }\r
         \r
         // refresh button enabled\r
         }\r
         \r
         // refresh button enabled\r
-        outState.putBoolean(KEY_REFRESH_BUTTON_ENABLED, mRefreshButtonEnabled);\r
+        //outState.putBoolean(KEY_REFRESH_BUTTON_ENABLED, mRefreshButtonEnabled);\r
+        outState.putBoolean(KEY_REFRESH_BUTTON_ENABLED, (mRefreshButton.getVisibility() == View.VISIBLE));\r
 \r
     }\r
 \r
 \r
     }\r
 \r
@@ -369,7 +386,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         super.onResume();\r
         // the state of mOAuth2Check is automatically recovered between configuration changes, but not before onCreate() finishes; so keep the next lines here\r
         changeViewByOAuth2Check(mOAuth2Check.isChecked());  \r
         super.onResume();\r
         // the state of mOAuth2Check is automatically recovered between configuration changes, but not before onCreate() finishes; so keep the next lines here\r
         changeViewByOAuth2Check(mOAuth2Check.isChecked());  \r
-        if (mAction == ACTION_UPDATE_TOKEN && mJustCreated) {\r
+        if (mAction == ACTION_UPDATE_TOKEN && mJustCreated && getIntent().getBooleanExtra(EXTRA_ENFORCED_UPDATE, false)) {\r
             if (mOAuth2Check.isChecked())\r
                 Toast.makeText(this, R.string.auth_expired_oauth_token_toast, Toast.LENGTH_LONG).show();\r
             else\r
             if (mOAuth2Check.isChecked())\r
                 Toast.makeText(this, R.string.auth_expired_oauth_token_toast, Toast.LENGTH_LONG).show();\r
             else\r
@@ -415,9 +432,6 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         if (view.getId() == R.id.hostUrlInput) {   \r
             if (!hasFocus) {\r
                 onUrlInputFocusLost((TextView) view);\r
         if (view.getId() == R.id.hostUrlInput) {   \r
             if (!hasFocus) {\r
                 onUrlInputFocusLost((TextView) view);\r
-                if (!mServerIsValid) {\r
-                    showRefreshButton();\r
-                }\r
             }\r
             else {\r
                 hideRefreshButton();\r
             }\r
             else {\r
                 hideRefreshButton();\r
@@ -445,12 +459,20 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             checkOcServer();\r
         } else {\r
             mOkButton.setEnabled(mServerIsValid);\r
             checkOcServer();\r
         } else {\r
             mOkButton.setEnabled(mServerIsValid);\r
+            if (!mServerIsValid) {\r
+                showRefreshButton();\r
+            }\r
         }\r
     }\r
 \r
 \r
     private void checkOcServer() {\r
         String uri = trimUrlWebdav(mHostUrlInput.getText().toString().trim());\r
         }\r
     }\r
 \r
 \r
     private void checkOcServer() {\r
         String uri = trimUrlWebdav(mHostUrlInput.getText().toString().trim());\r
+        \r
+        if (!mHostUrlInputEnabled){\r
+            uri = getString(R.string.server_url);\r
+        }\r
+        \r
         mServerIsValid = false;\r
         mServerIsChecked = false;\r
         mOkButton.setEnabled(false);\r
         mServerIsValid = false;\r
         mServerIsChecked = false;\r
         mOkButton.setEnabled(false);\r
@@ -935,7 +957,33 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
 \r
             finish();\r
 \r
 \r
             finish();\r
 \r
-        } else {\r
+        } else if (result.isServerFail() || result.isException()) {\r
+            /// if server fail or exception in authorization, the UI is updated as when a server check failed\r
+            mServerIsChecked = true;\r
+            mServerIsValid = false;\r
+            mIsSslConn = false;\r
+            mOcServerChkOperation = null;\r
+            mDiscoveredVersion = null;\r
+            mHostBaseUrl = normalizeUrl(mHostUrlInput.getText().toString());\r
+\r
+            // update status icon and text\r
+            updateServerStatusIconAndText(result);\r
+            showServerStatus();\r
+            mAuthStatusIcon = 0;\r
+            mAuthStatusText = 0;\r
+            showAuthStatus();\r
+            \r
+            // update input controls state\r
+            showRefreshButton();\r
+            mOkButton.setEnabled(false);\r
+\r
+            // very special case (TODO: move to a common place for all the remote operations) (dangerous here?)\r
+            if (result.getCode() == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED) {\r
+                mLastSslUntrustedServerResult = result;\r
+                showDialog(DIALOG_SSL_VALIDATOR); \r
+            }\r
+\r
+        } else {    // authorization fail due to client side - probably wrong credentials\r
             updateAuthStatusIconAndText(result);\r
             showAuthStatus();\r
             Log_OC.d(TAG, "Access failed: " + result.getLogMessage());\r
             updateAuthStatusIconAndText(result);\r
             showAuthStatus();\r
             Log_OC.d(TAG, "Access failed: " + result.getLogMessage());\r
@@ -1168,13 +1216,11 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
 \r
 \r
     private void showRefreshButton() {\r
 \r
 \r
     private void showRefreshButton() {\r
-        mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_action_refresh_black, 0);\r
-        mRefreshButtonEnabled = true;\r
+        mRefreshButton.setVisibility(View.VISIBLE);\r
     }\r
 \r
     private void hideRefreshButton() {\r
     }\r
 \r
     private void hideRefreshButton() {\r
-        mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\r
-        mRefreshButtonEnabled = false;\r
+        mRefreshButton.setVisibility(View.GONE);\r
     }\r
 \r
     /**\r
     }\r
 \r
     /**\r
@@ -1184,7 +1230,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
      * \r
      * @param view      Refresh 'button'\r
      */\r
      * \r
      * @param view      Refresh 'button'\r
      */\r
-    public void onRefreshClick() {\r
+    public void onRefreshClick(View view) {\r
         checkOcServer();\r
     }\r
     \r
         checkOcServer();\r
     }\r
     \r
@@ -1245,7 +1291,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
      * Called from SslValidatorDialog when a new server certificate was correctly saved.\r
      */\r
     public void onSavedCertificate() {\r
      * Called from SslValidatorDialog when a new server certificate was correctly saved.\r
      */\r
     public void onSavedCertificate() {\r
-        mOperationThread = mOcServerChkOperation.retry(this, mHandler);                \r
+        checkOcServer();\r
     }\r
 \r
     /**\r
     }\r
 \r
     /**\r