@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.login_layout);

    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

    mEmail = prefs.getString(PREFS_USER_EMAIL, null);
    mPassword = prefs.getString(PREFS_PASSWORD, null);

    mEmailView = (EditText) findViewById(R.id.email);

    if (mEmail != null && mEmailView != null) {
      mEmailView.setText(mEmail);
    }

    mAutoCompleteTextView = (InstantAutoComplete) findViewById(R.id.login_act);

    mUrls = URLListPersistanceUtil.load(getBaseContext());

    if (mUrls == null || mUrls.size() == 0) {
      // provide initial server access point
      mUrls = new ArrayList<String>();
      mUrls.add(Config.MAIN_SERVER_BASE_URL + Config.OPENSDI_PATH);
    }

    // Creating adapter for spinner
    ArrayAdapter<String> adapter =
        new ArrayAdapter<String>(this, R.layout.server_spinner_item, mUrls);

    // Drop down layout style - list view with radio button
    adapter.setDropDownViewResource(R.layout.server_spinner_item);
    mAutoCompleteTextView.setAdapter(adapter);

    // Auto-set first value
    if (mUrls != null && mUrls.size() > 0) {
      mAutoCompleteTextView.setText(mUrls.get(0));
    }

    mPasswordView = (EditText) findViewById(R.id.password);

    if (mPasswordView != null) {

      // Enter saved password
      if (mPassword != null) {
        mPasswordView.setText(mPassword);
      }

      mPasswordView.setOnEditorActionListener(
          new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
              if (id == R.id.login || id == EditorInfo.IME_NULL) {
                attemptLogin();
                return true;
              }
              return false;
            }
          });

      // if eMail provided but no pass set focus
      if (mEmail != null && mPassword == null) {
        mPasswordView.requestFocus();
      }
    }

    mLoginFormView = findViewById(R.id.login_form);
    mLoginStatusView = findViewById(R.id.login_status);
    mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);

    findViewById(R.id.login_confirm)
        .setOnClickListener(
            new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                // hide keyboard
                InputMethodManager imm =
                    (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(mPasswordView.getWindowToken(), 0);
                attemptLogin();
              }
            });

    findViewById(R.id.login_cancel)
        .setOnClickListener(
            new View.OnClickListener() {

              @Override
              public void onClick(View v) {
                // report cancel click
                Intent returnIntent = new Intent();
                setResult(RESULT_CANCELED, returnIntent);
                finish();
              }
            });

    TextView forgotPasswordTextView = (TextView) findViewById(R.id.password_forgotten_tv);
    if (forgotPasswordTextView != null) {
      forgotPasswordTextView.setOnClickListener(
          new View.OnClickListener() {

            @Override
            public void onClick(View v) {
              String url = getString(R.string.geocollect_retrieve_password_link);
              Intent i = new Intent(Intent.ACTION_VIEW);
              i.setData(Uri.parse(url));
              startActivity(i);
            }
          });
    }

    TextView register_tv = (TextView) findViewById(R.id.register_tv);

    if (register_tv != null) {

      register_tv.setOnClickListener(
          new View.OnClickListener() {

            @Override
            public void onClick(View v) {
              String url = getString(R.string.geocollect_register_link);
              Intent i = new Intent(Intent.ACTION_VIEW);
              i.setData(Uri.parse(url));
              startActivity(i);
            }
          });
    }
  }
  /** Attempt Login */
  private void attemptLogin() {

    // Reset errors.
    mEmailView.setError(null);
    mPasswordView.setError(null);

    // Store values at the time of the login attempt.
    mEmail = mEmailView.getText().toString();
    mPassword = mPasswordView.getText().toString();
    mSelectedUrl = mAutoCompleteTextView.getText().toString();

    Log.d(TAG, "selected url " + mSelectedUrl);

    boolean cancel = false;
    View focusView = null;

    // Check for a valid password.
    if (TextUtils.isEmpty(mPassword)) {
      mPasswordView.setError(getString(R.string.login_error_field_required));
      focusView = mPasswordView;
      cancel = true;
    } else if (mPassword.length() < 4) {
      mPasswordView.setError(getString(R.string.login_error_invalid_password));
      focusView = mPasswordView;
      cancel = true;
    }

    // Check for a valid email address.
    if (TextUtils.isEmpty(mEmail)) {
      mEmailView.setError(getString(R.string.login_error_field_required));
      focusView = mEmailView;
      cancel = true;
    }

    if (TextUtils.isEmpty(mSelectedUrl)) {
      mAutoCompleteTextView.setError(getString(R.string.login_error_field_required));
      focusView = mAutoCompleteTextView;
      cancel = true;
    }

    // check if online
    if (!NetworkUtil.isOnline(getBaseContext())) {

      Toast.makeText(getBaseContext(), getString(R.string.login_not_online), Toast.LENGTH_LONG)
          .show();
      cancel = true;
    }

    if (cancel) {
      // There was an error; don't attempt login and focus the first
      // form field with an error.
      if (focusView != null) focusView.requestFocus();
    } else {
      // Show a progress spinner, and kick off a background task to
      // perform the user login attempt.
      mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
      showProgress(true, false);

      LoginUtil.session(
          mSelectedUrl,
          mEmail,
          mPassword,
          new LoginStatusCallback() {

            @Override
            public void notLoggedIn(final RetrofitError error) {

              showProgress(false, true);

              if (error != null && error.isNetworkError()) {
                Log.d(TAG, "Retrofit network error : " + error.getMessage());
                Toast.makeText(
                        getBaseContext(),
                        getString(R.string.login_error_generic) + " " + error.getMessage(),
                        Toast.LENGTH_LONG)
                    .show();
              } else {
                // credentials were most likely wrong
                mPasswordView.setError(getString(R.string.login_error_incorrect_password));
                mPasswordView.requestFocus();
              }
            }

            @Override
            public void loggedIn(final String authKey) {

              // success, save credentials to prefs
              final Editor ed =
                  PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit();
              ed.putString(PREFS_USER_EMAIL, mEmail);
              ed.putString(PREFS_PASSWORD, mPassword);
              ed.putString(PREFS_AUTH_KEY, authKey);
              ed.putString(PREFS_LOGIN_URL, mSelectedUrl);

              ed.commit();

              String authorizationString = LoginRequestInterceptor.getB64Auth(mEmail, mPassword);

              // save urls
              ArrayList<String> urls = new ArrayList<String>();
              // add the one that worked
              urls.add(mSelectedUrl);

              for (int i = 0; i < mUrls.size(); i++) {
                // if is not yet included, add the others
                if (!mUrls.get(i).equals(mSelectedUrl)) {
                  urls.add(mUrls.get(i));
                }
              }
              URLListPersistanceUtil.save(getBaseContext(), urls);

              // auth key received, get userdata
              LoginUtil.getUserDetails(
                  getBaseContext(),
                  mSelectedUrl,
                  authKey,
                  authorizationString,
                  new UserDataStatusCallback() {

                    @Override
                    public void received(String authorizationString) {

                      showProgress(false, false);

                      Toast.makeText(
                              getBaseContext(),
                              getString(R.string.login_success),
                              Toast.LENGTH_LONG)
                          .show();

                      /////////////
                      TemplateDownloadTask.getRemoteTemplates(
                          authorizationString,
                          new RemoteTemplatesFetchCallback() {

                            @Override
                            public void templatesReceived(
                                String authorizationString, ResourceList list) {

                              if (list != null && list.list.size() > 0) {

                                final int awaiting = list.list.size();
                                // list worked using a "geostore" resource
                                for (final it.geosolutions.android.map.geostore.model.Resource
                                    resource : list.list) {

                                  TemplateDownloadTask.downloadRemoteTemplate(
                                      authorizationString,
                                      resource.id,
                                      new SingleRemoteTemplateFetchCallback() {

                                        @Override
                                        public void received(Resource res) {

                                          // to download a single template, a slightly different
                                          // Resource was needed
                                          // TODO use geostore resource when server side has applied
                                          // the according schema

                                          String templateString = res.getData().getData();

                                          downloads.add(
                                              MissionUtils.getTemplateFromJSON(templateString));

                                          arrived++;

                                          if (arrived == awaiting) {
                                            complete(downloads);
                                          }
                                        }

                                        @Override
                                        public void error(RetrofitError error) {

                                          Log.e(
                                              TAG,
                                              "error getting template "
                                                  + resource.id
                                                  + " : "
                                                  + error.getMessage());

                                          arrived++;

                                          if (arrived == awaiting) {
                                            complete(downloads);
                                          }
                                        }
                                      });
                                }
                              } else {
                                Log.e(
                                    TAG, "none or empty list received, cannot download templates");

                                showProgress(false, false);

                                Toast.makeText(
                                        getBaseContext(),
                                        "none or empty list received, cannot download templates",
                                        Toast.LENGTH_SHORT)
                                    .show();
                              }
                            }

                            @Override
                            public void error(RetrofitError error) {

                              showProgress(false, false);

                              Toast.makeText(
                                      getBaseContext(),
                                      getString(R.string.login_error_generic)
                                          + " "
                                          + error.getMessage(),
                                      Toast.LENGTH_SHORT)
                                  .show();

                              Log.e(TAG, "error getting template list : " + error.getMessage());
                            }
                          });
                      /////////////

                    }

                    @Override
                    public void failed(final RetrofitError error) {

                      showProgress(false, false);

                      Toast.makeText(
                              getBaseContext(),
                              getString(R.string.login_error_generic) + " " + error.getMessage(),
                              Toast.LENGTH_SHORT)
                          .show();
                    }
                  });
            }
          });
    }
  }