mirror of
https://github.com/moparisthebest/k-9
synced 2024-11-11 20:15:03 -05:00
Dialogs in place to continue after selecting an account. No input validation for now.
This commit is contained in:
parent
002f1a7429
commit
694b643a7c
49
res/layout/account_dialog_new.xml
Normal file
49
res/layout/account_dialog_new.xml
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<TextView android:id="@+id/form_label_email"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/account_setup_basics_email_hint"
|
||||||
|
android:layout_marginBottom="10dp"/>
|
||||||
|
|
||||||
|
<EditText android:id="@+id/account_dialog_address_field"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:inputType="textEmailAddress"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="fill_parent"/>
|
||||||
|
|
||||||
|
<TextView android:id="@+id/form_label_password"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/account_setup_basics_password_hint"
|
||||||
|
android:layout_marginBottom="10dp"/>
|
||||||
|
|
||||||
|
<EditText android:id="@+id/account_dialog_password_field"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
android:password="true"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:nextFocusDown="@+id/next"/>
|
||||||
|
|
||||||
|
<CheckBox android:id="@+id/account_dialog_manual_box"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:text="@string/account_setup_basics_manual_setup_action"/>
|
||||||
|
|
||||||
|
<Button android:id="@+id/account_dialog_next"
|
||||||
|
android:text="@string/next_action"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:drawableRight="@drawable/button_indicator_next" />
|
||||||
|
<!-- android:layout_marginBottom="-4dip"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_centerVertical="false"-->
|
||||||
|
|
||||||
|
</LinearLayout>
|
38
res/layout/account_dialog_password.xml
Normal file
38
res/layout/account_dialog_password.xml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="10dp">
|
||||||
|
|
||||||
|
<TextView android:id="@+id/account_dialog_password_help"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="10dp"/>
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/account_dialog_password_field"
|
||||||
|
android:inputType="textPassword"
|
||||||
|
android:password="true"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:nextFocusDown="@+id/next"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<CheckBox android:id="@+id/account_dialog_manual_box"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:text="@string/account_setup_basics_manual_setup_action"/>
|
||||||
|
|
||||||
|
<Button android:id="@+id/account_dialog_next"
|
||||||
|
android:text="@string/next_action"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:drawableRight="@drawable/button_indicator_next" />
|
||||||
|
<!-- android:layout_marginBottom="-4dip"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:layout_centerVertical="false"-->
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
@ -351,6 +351,7 @@ http://k9mail.googlecode.com/
|
|||||||
<string name="accounts_setup_help">
|
<string name="accounts_setup_help">
|
||||||
Select an account here to setup, press menu to load more backup files or create an new account.
|
Select an account here to setup, press menu to load more backup files or create an new account.
|
||||||
</string>
|
</string>
|
||||||
|
<string name="account_setup_device_sectionheader">Device</string>
|
||||||
<string name="account_setup_basics_instructions">Enter this account\'s email address:</string>
|
<string name="account_setup_basics_instructions">Enter this account\'s email address:</string>
|
||||||
<string name="account_setup_basics_email_hint">Email address</string>
|
<string name="account_setup_basics_email_hint">Email address</string>
|
||||||
<string name="account_setup_basics_password_hint">Password</string>
|
<string name="account_setup_basics_password_hint">Password</string>
|
||||||
|
@ -6,37 +6,57 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Parcelable;
|
||||||
|
import android.provider.ContactsContract;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.widget.*;
|
import android.widget.*;
|
||||||
import android.widget.AdapterView.OnItemClickListener;
|
import android.widget.AdapterView.OnItemClickListener;
|
||||||
import com.fsck.k9.EmailAddressValidator;
|
import com.fsck.k9.*;
|
||||||
import com.fsck.k9.R;
|
|
||||||
import com.fsck.k9.activity.K9ListActivity;
|
import com.fsck.k9.activity.K9ListActivity;
|
||||||
|
import com.fsck.k9.helper.Contacts;
|
||||||
import com.fsck.k9.helper.SectionListAdapter;
|
import com.fsck.k9.helper.SectionListAdapter;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.net.URLEncoder;
|
||||||
|
|
||||||
import static com.fsck.k9.activity.setup.AccountSetupBasics.*;
|
import static com.fsck.k9.activity.setup.AccountSetupBasics.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User: dzan
|
* User: dzan
|
||||||
* Date: 18/06/11
|
* Date: 18/06/11
|
||||||
|
*
|
||||||
|
* TODO: Encapsulate accountAdaptor. No need for this to be global except due the test-data.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class AccountSetupIndex extends K9ListActivity implements OnItemClickListener, OnClickListener {
|
public class AccountSetupIndex extends K9ListActivity implements OnItemClickListener, OnClickListener {
|
||||||
|
|
||||||
private static final String DEVICE_STRING = "Device";
|
|
||||||
private static final int DIALOG_NEW_ACCOUNT = 0;
|
private static final int DIALOG_NEW_ACCOUNT = 0;
|
||||||
private static final int DIALOG_DEVICE_ACCOUNT = 1;
|
private static final int DIALOG_DEVICE_ACCOUNT = 1;
|
||||||
private static final int DIALOG_BACKUP_ACCOUNT = 2;
|
private static final int DIALOG_BACKUP_ACCOUNT = 2;
|
||||||
|
|
||||||
|
private static final String BUNDLE_TYPE_SUGGESTION = "SUGGESTION";
|
||||||
public enum SuggestionType { DEVICE, BACKUP, NEW }
|
public enum SuggestionType { DEVICE, BACKUP, NEW }
|
||||||
|
|
||||||
|
// temp hard coded value ( since we don't ask if it should be default account for now )
|
||||||
|
private boolean bTmpDefaultAccount = true;
|
||||||
|
|
||||||
|
private Account mAccount;
|
||||||
|
private Button mNewAccountDialogButton;
|
||||||
|
private Button mPasswordDialogButton;
|
||||||
|
private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
|
||||||
|
|
||||||
public static void actionNewAccount(Context context) {
|
public static void actionNewAccount(Context context) {
|
||||||
Intent i = new Intent(context, AccountSetupIndex.class);
|
Intent i = new Intent(context, AccountSetupIndex.class);
|
||||||
context.startActivity(i);
|
context.startActivity(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Button mNewAccountButton;
|
|
||||||
private SectionListAdapter<AccountSuggestion> accountAdapter;
|
private SectionListAdapter<AccountSuggestion> accountAdapter;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -45,7 +65,7 @@ public class AccountSetupIndex extends K9ListActivity implements OnItemClickList
|
|||||||
|
|
||||||
// layout
|
// layout
|
||||||
setContentView(R.layout.account_setup_index);
|
setContentView(R.layout.account_setup_index);
|
||||||
mNewAccountButton = (Button)findViewById(R.id.new_account);
|
Button mNewAccountButton = (Button)findViewById(R.id.new_account);
|
||||||
|
|
||||||
// button callbacks
|
// button callbacks
|
||||||
mNewAccountButton.setOnClickListener(this);
|
mNewAccountButton.setOnClickListener(this);
|
||||||
@ -64,54 +84,153 @@ public class AccountSetupIndex extends K9ListActivity implements OnItemClickList
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
|
public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) {
|
||||||
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
|
SectionListAdapter<AccountSuggestion> adapter = (SectionListAdapter<AccountSuggestion>)adapterView.getAdapter();
|
||||||
Toast.LENGTH_SHORT).show();
|
AccountSuggestion suggestion = (AccountSuggestion)adapter.getItem(pos);
|
||||||
|
|
||||||
|
Bundle tmp = new Bundle();
|
||||||
|
tmp.putString(BUNDLE_TYPE_SUGGESTION,suggestion.getAccount());
|
||||||
|
|
||||||
|
switch(suggestion.getSuggestionType()){
|
||||||
|
case DEVICE:
|
||||||
|
showDialog(DIALOG_DEVICE_ACCOUNT,tmp);
|
||||||
|
break;
|
||||||
|
case BACKUP:
|
||||||
|
showDialog(DIALOG_BACKUP_ACCOUNT,tmp);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onClick(View view) {
|
public void onClick(View view) {
|
||||||
switch (view.getId()) {
|
switch (view.getId()) {
|
||||||
case R.id.new_account:
|
case R.id.new_account:
|
||||||
onNew();
|
showDialog(DIALOG_NEW_ACCOUNT);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void onNew() {
|
|
||||||
AccountSetupBasics.actionNewAccount(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Dialogues
|
Dialogues
|
||||||
*/
|
*/
|
||||||
protected Dialog onCreateDialog(int dialog_id){
|
protected Dialog onCreateDialog(int dialog_id){
|
||||||
Dialog dialog;
|
|
||||||
|
|
||||||
switch (dialog_id){
|
Dialog dialog = new Dialog(this);
|
||||||
|
|
||||||
|
switch(dialog_id){
|
||||||
case DIALOG_NEW_ACCOUNT:
|
case DIALOG_NEW_ACCOUNT:
|
||||||
dialog = new Dialog(this);
|
dialog.setContentView(R.layout.account_dialog_new);
|
||||||
|
dialog.setTitle("Setup a new account.");
|
||||||
|
|
||||||
|
final EditText emailField = ((EditText)dialog.findViewById(R.id.account_dialog_address_field));
|
||||||
|
final EditText passwordField = ((EditText)dialog.findViewById(R.id.account_dialog_password_field));
|
||||||
|
final CheckBox manualCheck = (CheckBox)dialog.findViewById(R.id.account_dialog_manual_box);
|
||||||
|
|
||||||
|
mNewAccountDialogButton = ((Button)dialog.findViewById(R.id.account_dialog_next));
|
||||||
|
|
||||||
|
mNewAccountDialogButton.setOnClickListener(new OnClickListener() {
|
||||||
|
public void onClick(View view) {
|
||||||
|
String email = emailField.getText().toString();
|
||||||
|
String password = passwordField.getText().toString();
|
||||||
|
|
||||||
|
// TODO: replace this with a few listeners on the fields that activate/deactive the button on acceptable values
|
||||||
|
if( !mEmailValidator.isValidAddressOnly(email) || password.isEmpty() ) return;
|
||||||
|
|
||||||
|
if(manualCheck.isChecked())
|
||||||
|
onManualSetup(email, password);
|
||||||
|
else startSettingsDetection(email, password);
|
||||||
|
}
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DIALOG_DEVICE_ACCOUNT:
|
case DIALOG_DEVICE_ACCOUNT:
|
||||||
dialog = new Dialog(this);
|
|
||||||
break;
|
|
||||||
case DIALOG_BACKUP_ACCOUNT:
|
case DIALOG_BACKUP_ACCOUNT:
|
||||||
dialog = new Dialog(this);
|
dialog.setContentView(R.layout.account_dialog_password);
|
||||||
|
dialog.setTitle("Enter password.");
|
||||||
|
mPasswordDialogButton = ((Button)dialog.findViewById(R.id.account_dialog_next));
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
dialog = null;
|
default: dialog = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dialog.show();
|
||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void onPrepareDialog(int id, Dialog dialog, final Bundle args){
|
||||||
|
switch(id){
|
||||||
|
case DIALOG_DEVICE_ACCOUNT:
|
||||||
|
case DIALOG_BACKUP_ACCOUNT:
|
||||||
|
((TextView)dialog.findViewById(R.id.account_dialog_password_help)).setText
|
||||||
|
("Enter the password for the '" + args.get(BUNDLE_TYPE_SUGGESTION) + "' account: ");
|
||||||
|
|
||||||
|
final EditText passwordField = ((EditText) dialog.findViewById(R.id.account_dialog_password_field));
|
||||||
|
final CheckBox manualCheck = (CheckBox)dialog.findViewById(R.id.account_dialog_manual_box);
|
||||||
|
|
||||||
|
mPasswordDialogButton.setOnClickListener(new OnClickListener() {
|
||||||
|
public void onClick(View view) {
|
||||||
|
String email = args.get(BUNDLE_TYPE_SUGGESTION).toString();
|
||||||
|
String password = passwordField.getText().toString();
|
||||||
|
|
||||||
|
// TODO: replace this with a few listeners on the fields that activate/deactive the button on acceptable values
|
||||||
|
if( password.isEmpty() ) return;
|
||||||
|
|
||||||
|
if (manualCheck.isChecked())
|
||||||
|
onManualSetup(email, password);
|
||||||
|
else startSettingsDetection(email, password);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onManualSetup(String email, String password) {
|
||||||
|
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));
|
||||||
|
|
||||||
|
AccountSetupAccountType.actionSelectAccountType(this, mAccount, bTmpDefaultAccount);
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startSettingsDetection(String email, String password) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Scans device for email addresses and adds them as suggestions
|
Scans device for email addresses and adds them as suggestions
|
||||||
*/
|
*/
|
||||||
private void fillFromDevice(SectionListAdapter<AccountSuggestion> adp){
|
private void fillFromDevice(SectionListAdapter<AccountSuggestion> adp){
|
||||||
EmailAddressValidator mEmailValidator = new EmailAddressValidator();
|
|
||||||
for( android.accounts.Account acc : AccountManager.get(this).getAccounts() )
|
for( android.accounts.Account acc : AccountManager.get(this).getAccounts() )
|
||||||
if( mEmailValidator.isValidAddressOnly(acc.name) )
|
if( mEmailValidator.isValidAddressOnly(acc.name) )
|
||||||
adp.add(DEVICE_STRING, new AccountSuggestion(acc.name, SuggestionType.DEVICE));
|
adp.add(getString(R.string.account_setup_device_sectionheader), new AccountSuggestion(acc.name, SuggestionType.DEVICE));
|
||||||
|
|
||||||
// TEMP DATA TO TEST
|
// TEMP DATA TO TEST
|
||||||
accountAdapter.add("file1", new AccountSuggestion("piet@snot.com",SuggestionType.BACKUP));
|
accountAdapter.add("file1", new AccountSuggestion("piet@snot.com",SuggestionType.BACKUP));
|
||||||
@ -135,6 +254,46 @@ public class AccountSetupIndex extends K9ListActivity implements OnItemClickList
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Some helpers copy pasted from previous setup. Need a review.
|
||||||
|
*/
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getOwnerName() {
|
||||||
|
String name = null;
|
||||||
|
try {
|
||||||
|
name = Contacts.getInstance(this).getOwnerName();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(K9.LOG_TAG, "Could not get owner name, using default account name", e);
|
||||||
|
}
|
||||||
|
if (name == null || name.length() == 0) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Simple class to wrap account suggestion data
|
Simple class to wrap account suggestion data
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user