diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 89d952e60..e7a566102 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -97,15 +97,15 @@ > 0) { - mDefaultView.setVisibility(View.VISIBLE); - } - - if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) { - String accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT); - mAccount = Preferences.getPreferences(this).getAccount(accountUuid); - } - - if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) { - mProvider = (Provider)savedInstanceState.getSerializable(STATE_KEY_PROVIDER); - } - } - - @Override - public void onResume() { - super.onResume(); - validateFields(); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (mAccount != null) { - outState.putString(EXTRA_ACCOUNT, mAccount.getUuid()); - } - if (mProvider != null) { - outState.putSerializable(STATE_KEY_PROVIDER, mProvider); - } - } - - public void afterTextChanged(Editable s) { - validateFields(); - } - - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - private void validateFields() { - String email = mEmailView.getText().toString(); - boolean valid = Utility.requiredFieldValid(mEmailView) - && Utility.requiredFieldValid(mPasswordView) - && mEmailValidator.isValidAddressOnly(email); - - mNextButton.setEnabled(valid); - mManualSetupButton.setEnabled(valid); - /* - * Dim the next button's icon to 50% if the button is disabled. - * TODO this can probably be done with a stateful drawable. Check into it. - * android:state_enabled - */ - Utility.setCompoundDrawablesAlpha(mNextButton, mNextButton.isEnabled() ? 255 : 128); - } - - private String getOwnerName() { - String name = null; - try { - name = getDefaultAccountName(); - } catch (Exception e) { - Log.e(K9.LOG_TAG, "Could not get default account name", e); - } - - if (name == null) { - name = ""; - } - return name; - } - - private String getDefaultAccountName() { - String name = null; - Account account = Preferences.getPreferences(this).getDefaultAccount(); - if (account != null) { - name = account.getName(); - } - return name; - } - - @Override - public Dialog onCreateDialog(int id) { - if (id == DIALOG_NOTE) { - if (mProvider != null && mProvider.note != null) { - return new AlertDialog.Builder(this) - .setMessage(mProvider.note) - .setPositiveButton( - getString(R.string.okay_action), - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - finishAutoSetup(); - } - }) - .setNegativeButton( - getString(R.string.cancel_action), - null) - .create(); - } - } - return null; - } - - private void finishAutoSetup() { - String email = mEmailView.getText().toString(); - String password = mPasswordView.getText().toString(); - String[] emailParts = splitEmail(email); - String user = emailParts[0]; - String domain = emailParts[1]; - URI incomingUri = null; - URI outgoingUri = null; - try { - String userEnc = URLEncoder.encode(user, "UTF-8"); - String passwordEnc = URLEncoder.encode(password, "UTF-8"); - - String incomingUsername = mProvider.incomingUsernameTemplate; - incomingUsername = incomingUsername.replaceAll("\\$email", email); - incomingUsername = incomingUsername.replaceAll("\\$user", userEnc); - incomingUsername = incomingUsername.replaceAll("\\$domain", domain); - - URI incomingUriTemplate = mProvider.incomingUriTemplate; - incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUsername + ":" - + passwordEnc, incomingUriTemplate.getHost(), incomingUriTemplate.getPort(), null, - null, null); - - String outgoingUsername = mProvider.outgoingUsernameTemplate; - - URI outgoingUriTemplate = mProvider.outgoingUriTemplate; - - - if (outgoingUsername != null) { - outgoingUsername = outgoingUsername.replaceAll("\\$email", email); - outgoingUsername = outgoingUsername.replaceAll("\\$user", userEnc); - outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain); - outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUsername + ":" - + passwordEnc, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, - null, null); - - } else { - outgoingUri = new URI(outgoingUriTemplate.getScheme(), - null, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(), null, - null, null); - - - } - mAccount = Preferences.getPreferences(this).newAccount(); - mAccount.setName(getOwnerName()); - mAccount.setEmail(email); - mAccount.setStoreUri(incomingUri.toString()); - mAccount.setTransportUri(outgoingUri.toString()); - mAccount.setDraftsFolderName(getString(R.string.special_mailbox_name_drafts)); - mAccount.setTrashFolderName(getString(R.string.special_mailbox_name_trash)); - mAccount.setArchiveFolderName(getString(R.string.special_mailbox_name_archive)); - // Yahoo! has a special folder for Spam, called "Bulk Mail". - if (incomingUriTemplate.getHost().toLowerCase().endsWith(".yahoo.com")) { - mAccount.setSpamFolderName("Bulk Mail"); - } else { - mAccount.setSpamFolderName(getString(R.string.special_mailbox_name_spam)); - } - mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent)); - if (incomingUri.toString().startsWith("imap")) { - mAccount.setDeletePolicy(Account.DELETE_POLICY_ON_DELETE); - } else if (incomingUri.toString().startsWith("pop3")) { - mAccount.setDeletePolicy(Account.DELETE_POLICY_NEVER); - } - AccountSetupCheckSettings.actionCheckSettings(this, mAccount, true, true); - } catch (UnsupportedEncodingException enc) { - // This really shouldn't happen since the encoding is hardcoded to UTF-8 - Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc); - } catch (URISyntaxException use) { - /* - * If there is some problem with the URI we give up and go on to - * manual setup. - */ - onManualSetup(); - } - } - - protected void onNext() { - String email = mEmailView.getText().toString(); - String[] emailParts = splitEmail(email); - String domain = emailParts[1]; - mProvider = findProviderForDomain(domain); - if (mProvider == null) { - /* - * We don't have default settings for this account, start the manual - * setup process. - */ - onManualSetup(); - return; - } - - if (mProvider.note != null) { - showDialog(DIALOG_NOTE); - } else { - finishAutoSetup(); - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (resultCode == RESULT_OK) { - mAccount.setDescription(mAccount.getEmail()); - mAccount.save(Preferences.getPreferences(this)); - if (mDefaultView.isChecked()) { - Preferences.getPreferences(this).setDefaultAccount(mAccount); - } - K9.setServicesEnabled(this); - AccountSetupNames.actionSetNames(this, mAccount); - finish(); - } - } - - private void onManualSetup() { - String email = mEmailView.getText().toString(); - String password = mPasswordView.getText().toString(); - String[] emailParts = splitEmail(email); - String user = emailParts[0]; - String domain = emailParts[1]; - - mAccount = Preferences.getPreferences(this).newAccount(); - mAccount.setName(getOwnerName()); - mAccount.setEmail(email); - try { - String userEnc = URLEncoder.encode(user, "UTF-8"); - String passwordEnc = URLEncoder.encode(password, "UTF-8"); - - URI uri = new URI("placeholder", userEnc + ":" + passwordEnc, "mail." + domain, -1, null, - null, null); - mAccount.setStoreUri(uri.toString()); - mAccount.setTransportUri(uri.toString()); - } catch (UnsupportedEncodingException enc) { - // This really shouldn't happen since the encoding is hardcoded to UTF-8 - Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc); - } catch (URISyntaxException use) { - /* - * If we can't set up the URL we just continue. It's only for - * convenience. - */ - } - mAccount.setDraftsFolderName(getString(R.string.special_mailbox_name_drafts)); - mAccount.setTrashFolderName(getString(R.string.special_mailbox_name_trash)); - mAccount.setSentFolderName(getString(R.string.special_mailbox_name_sent)); - mAccount.setArchiveFolderName(getString(R.string.special_mailbox_name_archive)); - // Yahoo! has a special folder for Spam, called "Bulk Mail". - if (domain.endsWith(".yahoo.com")) { - mAccount.setSpamFolderName("Bulk Mail"); - } else { - mAccount.setSpamFolderName(getString(R.string.special_mailbox_name_spam)); - } - - AccountSetupAccountType.actionSelectAccountType(this, mAccount, mDefaultView.isChecked()); - finish(); - } - - public void onClick(View v) { - switch (v.getId()) { - case R.id.next: - onNext(); - break; - case R.id.manual_setup: - onManualSetup(); - break; - } - } - - /** - * Attempts to get the given attribute as a String resource first, and if it fails - * returns the attribute as a simple String value. - * @param xml - * @param name - * @return - */ - private String getXmlAttribute(XmlResourceParser xml, String name) { - int resId = xml.getAttributeResourceValue(null, name, 0); - if (resId == 0) { - return xml.getAttributeValue(null, name); - } else { - return getString(resId); - } - } - - private Provider findProviderForDomain(String domain) { - try { - XmlResourceParser xml = getResources().getXml(R.xml.providers); - int xmlEventType; - Provider provider = null; - while ((xmlEventType = xml.next()) != XmlResourceParser.END_DOCUMENT) { - if (xmlEventType == XmlResourceParser.START_TAG - && "provider".equals(xml.getName()) - && domain.equalsIgnoreCase(getXmlAttribute(xml, "domain"))) { - provider = new Provider(); - provider.id = getXmlAttribute(xml, "id"); - provider.label = getXmlAttribute(xml, "label"); - provider.domain = getXmlAttribute(xml, "domain"); - provider.note = getXmlAttribute(xml, "note"); - } else if (xmlEventType == XmlResourceParser.START_TAG - && "incoming".equals(xml.getName()) - && provider != null) { - provider.incomingUriTemplate = new URI(getXmlAttribute(xml, "uri")); - provider.incomingUsernameTemplate = getXmlAttribute(xml, "username"); - } else if (xmlEventType == XmlResourceParser.START_TAG - && "outgoing".equals(xml.getName()) - && provider != null) { - provider.outgoingUriTemplate = new URI(getXmlAttribute(xml, "uri")); - provider.outgoingUsernameTemplate = getXmlAttribute(xml, "username"); - } else if (xmlEventType == XmlResourceParser.END_TAG - && "provider".equals(xml.getName()) - && provider != null) { - return provider; - } - } - } catch (Exception e) { - Log.e(K9.LOG_TAG, "Error while trying to load provider settings.", e); - } - return null; - } - - private String[] splitEmail(String email) { - String[] retParts = new String[2]; - String[] emailParts = email.split("@"); - retParts[0] = (emailParts.length > 0) ? emailParts[0] : ""; - retParts[1] = (emailParts.length > 1) ? emailParts[1] : ""; - return retParts; - } - - static class Provider implements Serializable { - private static final long serialVersionUID = 8511656164616538989L; - - public String id; - - public String label; - - public String domain; - - public URI incomingUriTemplate; - - public String incomingUsernameTemplate; - - public URI outgoingUriTemplate; - - public String outgoingUsernameTemplate; - - public String note; - } -}