am 229c070b
: Change the concept of a default account
* commit '229c070b0b177793032ce9249cb77f6ca98e5aa4': Change the concept of a default account
This commit is contained in:
commit
d1ababe3b8
@ -99,13 +99,11 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
public static Uri CONTENT_URI;
|
||||
public static Uri RESET_NEW_MESSAGE_COUNT_URI;
|
||||
public static Uri NOTIFIER_URI;
|
||||
public static Uri DEFAULT_ACCOUNT_ID_URI;
|
||||
|
||||
public static void initAccount() {
|
||||
CONTENT_URI = Uri.parse(EmailContent.CONTENT_URI + "/account");
|
||||
RESET_NEW_MESSAGE_COUNT_URI = Uri.parse(EmailContent.CONTENT_URI + "/resetNewMessageCount");
|
||||
NOTIFIER_URI = Uri.parse(EmailContent.CONTENT_NOTIFIER_URI + "/account");
|
||||
DEFAULT_ACCOUNT_ID_URI = Uri.parse(EmailContent.CONTENT_URI + "/account/default");
|
||||
}
|
||||
|
||||
public String mDisplayName;
|
||||
@ -116,7 +114,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
public long mHostAuthKeyRecv;
|
||||
public long mHostAuthKeySend;
|
||||
public int mFlags;
|
||||
public boolean mIsDefault; // note: callers should use getDefaultAccountId()
|
||||
public String mCompatibilityUuid;
|
||||
public String mSenderName;
|
||||
public String mProtocolVersion;
|
||||
@ -141,20 +138,19 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
public static final int CONTENT_HOST_AUTH_KEY_RECV_COLUMN = 6;
|
||||
public static final int CONTENT_HOST_AUTH_KEY_SEND_COLUMN = 7;
|
||||
public static final int CONTENT_FLAGS_COLUMN = 8;
|
||||
public static final int CONTENT_IS_DEFAULT_COLUMN = 9;
|
||||
public static final int CONTENT_COMPATIBILITY_UUID_COLUMN = 10;
|
||||
public static final int CONTENT_SENDER_NAME_COLUMN = 11;
|
||||
public static final int CONTENT_PROTOCOL_VERSION_COLUMN = 12;
|
||||
public static final int CONTENT_NEW_MESSAGE_COUNT_COLUMN = 13;
|
||||
public static final int CONTENT_SECURITY_SYNC_KEY_COLUMN = 14;
|
||||
public static final int CONTENT_SIGNATURE_COLUMN = 15;
|
||||
public static final int CONTENT_POLICY_KEY = 16;
|
||||
public static final int CONTENT_COMPATIBILITY_UUID_COLUMN = 9;
|
||||
public static final int CONTENT_SENDER_NAME_COLUMN = 10;
|
||||
public static final int CONTENT_PROTOCOL_VERSION_COLUMN = 11;
|
||||
public static final int CONTENT_NEW_MESSAGE_COUNT_COLUMN = 12;
|
||||
public static final int CONTENT_SECURITY_SYNC_KEY_COLUMN = 13;
|
||||
public static final int CONTENT_SIGNATURE_COLUMN = 14;
|
||||
public static final int CONTENT_POLICY_KEY = 15;
|
||||
|
||||
public static final String[] CONTENT_PROJECTION = new String[] {
|
||||
RECORD_ID, AccountColumns.DISPLAY_NAME,
|
||||
AccountColumns.EMAIL_ADDRESS, AccountColumns.SYNC_KEY, AccountColumns.SYNC_LOOKBACK,
|
||||
AccountColumns.SYNC_INTERVAL, AccountColumns.HOST_AUTH_KEY_RECV,
|
||||
AccountColumns.HOST_AUTH_KEY_SEND, AccountColumns.FLAGS, AccountColumns.IS_DEFAULT,
|
||||
AccountColumns.HOST_AUTH_KEY_SEND, AccountColumns.FLAGS,
|
||||
AccountColumns.COMPATIBILITY_UUID, AccountColumns.SENDER_NAME,
|
||||
AccountColumns.PROTOCOL_VERSION,
|
||||
AccountColumns.NEW_MESSAGE_COUNT, AccountColumns.SECURITY_SYNC_KEY,
|
||||
@ -175,12 +171,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
public static final String[] ACCOUNT_FLAGS_PROJECTION = new String[] {
|
||||
AccountColumns.ID, AccountColumns.FLAGS};
|
||||
|
||||
public static final int ACCOUNT_IS_DEFAULT_COLUMN_ID = 0;
|
||||
public static final int ACCOUNT_IS_DEFAULT_COLUMN_IS_DEFAULT = 1;
|
||||
public static final String[] ACCOUNT_IS_DEFAULT_PROJECTION = new String[] {
|
||||
AccountColumns.ID, AccountColumns.IS_DEFAULT
|
||||
};
|
||||
|
||||
public static final String MAILBOX_SELECTION =
|
||||
MessageColumns.MAILBOX_KEY + " =?";
|
||||
|
||||
@ -252,7 +242,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
mHostAuthKeyRecv = cursor.getLong(CONTENT_HOST_AUTH_KEY_RECV_COLUMN);
|
||||
mHostAuthKeySend = cursor.getLong(CONTENT_HOST_AUTH_KEY_SEND_COLUMN);
|
||||
mFlags = cursor.getInt(CONTENT_FLAGS_COLUMN);
|
||||
mIsDefault = cursor.getInt(CONTENT_IS_DEFAULT_COLUMN) == 1;
|
||||
mCompatibilityUuid = cursor.getString(CONTENT_COMPATIBILITY_UUID_COLUMN);
|
||||
mSenderName = cursor.getString(CONTENT_SENDER_NAME_COLUMN);
|
||||
mProtocolVersion = cursor.getString(CONTENT_PROTOCOL_VERSION_COLUMN);
|
||||
@ -435,15 +424,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
return (account.mFlags & Account.FLAGS_SUPPORTS_SEARCH) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the account to be the default account. If this is set to "true", when the account
|
||||
* is saved, all other accounts will have the same value set to "false".
|
||||
* @param newDefaultState the new default state - if true, others will be cleared.
|
||||
*/
|
||||
public void setDefaultAccount(boolean newDefaultState) {
|
||||
mIsDefault = newDefaultState;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {@link Uri} to this {@link Account} in the
|
||||
* {@code content://com.android.email.provider/account/UUID} format, which is safe to use
|
||||
@ -509,24 +489,39 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the id of the default account. If one hasn't been explicitly specified, return
|
||||
* the first one in the database (the logic is provided within EmailProvider)
|
||||
* Return the id of the default account. If one hasn't been explicitly specified, return the
|
||||
* first one in the database. If no account exists, returns {@link #NO_ACCOUNT}.
|
||||
*
|
||||
* @param context the caller's context
|
||||
* @return the id of the default account, or Account.NO_ACCOUNT if there are no accounts
|
||||
* @param lastUsedAccountId the last used account id, which is the basis of the default account
|
||||
*/
|
||||
static public long getDefaultAccountId(Context context) {
|
||||
final Cursor c = context.getContentResolver().query(
|
||||
Account.DEFAULT_ACCOUNT_ID_URI, Account.ID_PROJECTION, null, null, null);
|
||||
public static long getDefaultAccountId(final Context context, final long lastUsedAccountId) {
|
||||
final Cursor cursor = context.getContentResolver().query(
|
||||
CONTENT_URI, ID_PROJECTION, null, null, null);
|
||||
|
||||
long firstAccount = NO_ACCOUNT;
|
||||
|
||||
try {
|
||||
if (c != null && c.moveToFirst()) {
|
||||
return c.getLong(Account.ID_PROJECTION_COLUMN);
|
||||
if (cursor != null && cursor.moveToFirst()) {
|
||||
do {
|
||||
final long accountId = cursor.getLong(Account.ID_PROJECTION_COLUMN);
|
||||
|
||||
if (accountId == lastUsedAccountId) {
|
||||
return accountId;
|
||||
}
|
||||
|
||||
if (firstAccount == NO_ACCOUNT) {
|
||||
firstAccount = accountId;
|
||||
}
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
} finally {
|
||||
if (c != null) {
|
||||
c.close();
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
}
|
||||
}
|
||||
return Account.NO_ACCOUNT;
|
||||
|
||||
return firstAccount;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -664,35 +659,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
return policy.mRequireManualSyncWhenRoaming;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override update to enforce a single default account, and do it atomically
|
||||
*/
|
||||
@Override
|
||||
public int update(Context context, ContentValues cv) {
|
||||
if (cv.containsKey(AccountColumns.IS_DEFAULT) &&
|
||||
cv.getAsBoolean(AccountColumns.IS_DEFAULT)) {
|
||||
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
|
||||
ContentValues cv1 = new ContentValues();
|
||||
cv1.put(AccountColumns.IS_DEFAULT, false);
|
||||
// Clear the default flag in all accounts
|
||||
ops.add(ContentProviderOperation.newUpdate(CONTENT_URI).withValues(cv1).build());
|
||||
// Update this account
|
||||
ops.add(ContentProviderOperation
|
||||
.newUpdate(ContentUris.withAppendedId(CONTENT_URI, mId))
|
||||
.withValues(cv).build());
|
||||
try {
|
||||
context.getContentResolver().applyBatch(EmailContent.AUTHORITY, ops);
|
||||
return 1;
|
||||
} catch (RemoteException e) {
|
||||
// There is nothing to be done here; fail by returning 0
|
||||
} catch (OperationApplicationException e) {
|
||||
// There is nothing to be done here; fail by returning 0
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return super.update(context, cv);
|
||||
}
|
||||
|
||||
/*
|
||||
* Override this so that we can store the HostAuth's first and link them to the Account
|
||||
* (non-Javadoc)
|
||||
@ -706,8 +672,7 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
// This logic is in place so I can (a) short circuit the expensive stuff when
|
||||
// possible, and (b) override (and throw) if anyone tries to call save() or update()
|
||||
// directly for Account, which are unsupported.
|
||||
if (mHostAuthRecv == null && mHostAuthSend == null && mIsDefault == false &&
|
||||
mPolicy != null) {
|
||||
if (mHostAuthRecv == null && mHostAuthSend == null && mPolicy != null) {
|
||||
return super.save(context);
|
||||
}
|
||||
|
||||
@ -731,15 +696,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
.build());
|
||||
}
|
||||
|
||||
// Create operations for making this the only default account
|
||||
// Note, these are always updates because they change existing accounts
|
||||
if (mIsDefault) {
|
||||
index++;
|
||||
ContentValues cv1 = new ContentValues();
|
||||
cv1.put(AccountColumns.IS_DEFAULT, 0);
|
||||
ops.add(ContentProviderOperation.newUpdate(CONTENT_URI).withValues(cv1).build());
|
||||
}
|
||||
|
||||
// Now do the Account
|
||||
ContentValues cv = null;
|
||||
if (recvIndex >= 0 || sendIndex >= 0) {
|
||||
@ -795,7 +751,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
values.put(AccountColumns.HOST_AUTH_KEY_RECV, mHostAuthKeyRecv);
|
||||
values.put(AccountColumns.HOST_AUTH_KEY_SEND, mHostAuthKeySend);
|
||||
values.put(AccountColumns.FLAGS, mFlags);
|
||||
values.put(AccountColumns.IS_DEFAULT, mIsDefault);
|
||||
values.put(AccountColumns.COMPATIBILITY_UUID, mCompatibilityUuid);
|
||||
values.put(AccountColumns.SENDER_NAME, mSenderName);
|
||||
values.put(AccountColumns.PROTOCOL_VERSION, mProtocolVersion);
|
||||
@ -845,7 +800,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
dest.writeLong(mHostAuthKeyRecv);
|
||||
dest.writeLong(mHostAuthKeySend);
|
||||
dest.writeInt(mFlags);
|
||||
dest.writeByte(mIsDefault ? (byte)1 : (byte)0);
|
||||
dest.writeString(mCompatibilityUuid);
|
||||
dest.writeString(mSenderName);
|
||||
dest.writeString(mProtocolVersion);
|
||||
@ -883,7 +837,6 @@ public final class Account extends EmailContent implements AccountColumns, Parce
|
||||
mHostAuthKeyRecv = in.readLong();
|
||||
mHostAuthKeySend = in.readLong();
|
||||
mFlags = in.readInt();
|
||||
mIsDefault = in.readByte() == 1;
|
||||
mCompatibilityUuid = in.readString();
|
||||
mSenderName = in.readString();
|
||||
mProtocolVersion = in.readString();
|
||||
|
@ -1552,7 +1552,13 @@ public abstract class EmailContent {
|
||||
public static final String HOST_AUTH_KEY_SEND = "hostAuthKeySend";
|
||||
// Flags
|
||||
public static final String FLAGS = "flags";
|
||||
// Default account
|
||||
/**
|
||||
* Default account
|
||||
*
|
||||
* @deprecated This should never be used any more, as default accounts are handled
|
||||
* differently now
|
||||
*/
|
||||
@Deprecated
|
||||
public static final String IS_DEFAULT = "isDefault";
|
||||
// Old-Style UUID for compatibility with previous versions
|
||||
public static final String COMPATIBILITY_UUID = "compatibilityUuid";
|
||||
|
@ -71,32 +71,4 @@
|
||||
android:nextFocusDown="@+id/next" />
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
|
||||
<!-- Note, the next three items should be shown/hidden as a group -->
|
||||
<View
|
||||
android:id="@+id/account_default_divider_1"
|
||||
android:layout_below="@+id/email_password_table"
|
||||
android:layout_marginTop="48dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1px"
|
||||
android:background="@color/account_setup_divider_color"
|
||||
android:visibility="gone" />
|
||||
<CheckBox
|
||||
android:id="@+id/account_default"
|
||||
android:layout_below="@+id/account_default_divider_1"
|
||||
android:layout_marginTop="16dip"
|
||||
android:layout_marginBottom="16dip"
|
||||
android:layout_marginLeft="32dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="wrap_content"
|
||||
android:text="@string/account_setup_basics_default_label"
|
||||
android:textAppearance="@style/accountSetupInfoText"
|
||||
android:visibility="gone" />
|
||||
<View
|
||||
android:id="@+id/account_default_divider_2"
|
||||
android:layout_below="@+id/account_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1px"
|
||||
android:background="@color/account_setup_divider_color"
|
||||
android:visibility="gone" />
|
||||
</RelativeLayout>
|
||||
|
@ -60,31 +60,9 @@
|
||||
android:layout_width="match_parent" />
|
||||
</TableRow>
|
||||
</TableLayout>
|
||||
<View
|
||||
android:id="@+id/account_default_divider_upper"
|
||||
android:layout_below="@+id/spinners_table"
|
||||
android:layout_marginTop="32dip"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1px"
|
||||
android:background="@color/account_setup_divider_color" />
|
||||
<CheckBox
|
||||
android:id="@+id/account_default"
|
||||
android:layout_below="@+id/account_default_divider_upper"
|
||||
android:layout_marginTop="16dip"
|
||||
android:layout_marginBottom="16dip"
|
||||
android:layout_marginLeft="32dip"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:text="@string/account_setup_options_default_label" />
|
||||
<View
|
||||
android:id="@+id/account_default_divider"
|
||||
android:layout_below="@+id/account_default"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1px"
|
||||
android:background="@color/account_setup_divider_color" />
|
||||
<CheckBox
|
||||
android:id="@+id/account_notify"
|
||||
android:layout_below="@+id/account_default_divider"
|
||||
android:layout_below="@+id/spinners_table"
|
||||
android:layout_marginTop="16dip"
|
||||
android:layout_marginBottom="16dip"
|
||||
android:layout_marginLeft="32dip"
|
||||
|
@ -50,11 +50,4 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:nextFocusDown="@+id/next" />
|
||||
<CheckBox
|
||||
android:id="@+id/account_default"
|
||||
android:layout_below="@+id/account_password"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:text="@string/account_setup_basics_default_label"
|
||||
android:visibility="gone" />
|
||||
</RelativeLayout>
|
||||
|
@ -59,11 +59,6 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent" />
|
||||
</LinearLayout>
|
||||
<CheckBox
|
||||
android:id="@+id/account_default"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:text="@string/account_setup_options_default_label" />
|
||||
<CheckBox
|
||||
android:id="@+id/account_notify"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -711,9 +711,6 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
|
||||
<string name="account_setup_options_mail_check_frequency_30min">Every 30 minutes</string>
|
||||
<!-- In Account setup options & Account Settings screens, email check frequency option -->
|
||||
<string name="account_setup_options_mail_check_frequency_1hour">Every hour</string>
|
||||
<!-- Check box label on "Set up email" screen to make this the default account -->
|
||||
<!-- Note, this should usually match the default account summary preference string -->
|
||||
<string name="account_setup_options_default_label">Send email from this account by default</string>
|
||||
<!-- In Account setup options & Account Settings screens, check box for new-mail notification -->
|
||||
<string name="account_setup_options_notify_label">Notify me when email arrives</string>
|
||||
<!-- In Account setup options screen, optional check box to also sync contacts -->
|
||||
@ -909,11 +906,6 @@ as <xliff:g id="filename">%s</xliff:g>.</string>
|
||||
Your login to <xliff:g id="account">%s</xliff:g> failed; the server said: <xliff:g id="reason">%s</xliff:g>
|
||||
Do you want to update your username and/or password?</string>
|
||||
|
||||
<!-- On Settings screen, setting option name -->
|
||||
<string name="account_settings_default_label">Default account</string>
|
||||
<!-- Check box "summary" label on "Account options" screen to make this the default account -->
|
||||
<!-- Note, this should usually match the default account account setup checkbox string -->
|
||||
<string name="account_settings_default_summary">Send email from this account by default</string>
|
||||
<!-- On Settings screen, setting option name -->
|
||||
<!-- Title of account preference for downloading attachments in background [CHAR LIMIT=32] -->
|
||||
<string name="account_settings_background_attachments_label">
|
||||
|
@ -41,11 +41,6 @@
|
||||
android:title="@string/account_settings_edit_quick_responses_label"
|
||||
android:summary="@string/account_settings_edit_quick_responses_summary" />
|
||||
|
||||
<CheckBoxPreference
|
||||
android:key="account_default"
|
||||
android:title="@string/account_settings_default_label"
|
||||
android:summary="@string/account_settings_default_summary" />
|
||||
|
||||
<PreferenceCategory
|
||||
android:key="data_usage"
|
||||
android:title="@string/account_settings_data_usage">
|
||||
|
@ -88,7 +88,6 @@ public class AccountSettingsFragment extends EmailPreferenceFragment
|
||||
private static final String PREFERENCE_FREQUENCY = "account_check_frequency";
|
||||
private static final String PREFERENCE_BACKGROUND_ATTACHMENTS =
|
||||
"account_background_attachments";
|
||||
private static final String PREFERENCE_DEFAULT = "account_default";
|
||||
private static final String PREFERENCE_CATEGORY_DATA_USAGE = "data_usage";
|
||||
private static final String PREFERENCE_CATEGORY_NOTIFICATIONS = "account_notifications";
|
||||
private static final String PREFERENCE_CATEGORY_SERVER = "account_servers";
|
||||
@ -115,7 +114,6 @@ public class AccountSettingsFragment extends EmailPreferenceFragment
|
||||
private ListPreference mCheckFrequency;
|
||||
private ListPreference mSyncWindow;
|
||||
private CheckBoxPreference mAccountBackgroundAttachments;
|
||||
private CheckBoxPreference mAccountDefault;
|
||||
private CheckBoxPreference mInboxNotify;
|
||||
private CheckBoxPreference mInboxVibrate;
|
||||
private Preference mInboxRingtone;
|
||||
@ -127,7 +125,6 @@ public class AccountSettingsFragment extends EmailPreferenceFragment
|
||||
private Context mContext;
|
||||
private Account mAccount;
|
||||
private boolean mAccountDirty;
|
||||
private long mDefaultAccountId;
|
||||
private Callback mCallback = EmptyCallback.INSTANCE;
|
||||
private boolean mStarted;
|
||||
private boolean mLoaded;
|
||||
@ -440,9 +437,9 @@ public class AccountSettingsFragment extends EmailPreferenceFragment
|
||||
/**
|
||||
* Async task to load account in order to view/edit it
|
||||
*/
|
||||
private class LoadAccountTask extends AsyncTask<Long, Void, Object[]> {
|
||||
private class LoadAccountTask extends AsyncTask<Long, Void, Account> {
|
||||
@Override
|
||||
protected Object[] doInBackground(Long... params) {
|
||||
protected Account doInBackground(Long... params) {
|
||||
long accountId = params[0];
|
||||
Account account = Account.restoreAccountWithId(mContext, accountId);
|
||||
if (account != null) {
|
||||
@ -454,20 +451,17 @@ public class AccountSettingsFragment extends EmailPreferenceFragment
|
||||
account = null;
|
||||
}
|
||||
}
|
||||
long defaultAccountId = Account.getDefaultAccountId(mContext);
|
||||
return new Object[] { account, Long.valueOf(defaultAccountId) };
|
||||
return account;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Object[] results) {
|
||||
if (results != null && !isCancelled()) {
|
||||
Account account = (Account) results[0];
|
||||
protected void onPostExecute(Account account) {
|
||||
if (!isCancelled()) {
|
||||
if (account == null) {
|
||||
mSaveOnExit = false;
|
||||
mCallback.abandonEdit();
|
||||
} else {
|
||||
mAccount = account;
|
||||
mDefaultAccountId = (Long) results[1];
|
||||
if (mStarted && !mLoaded) {
|
||||
loadSettings();
|
||||
}
|
||||
@ -727,10 +721,6 @@ public class AccountSettingsFragment extends EmailPreferenceFragment
|
||||
mAccountBackgroundAttachments.setOnPreferenceChangeListener(this);
|
||||
}
|
||||
|
||||
mAccountDefault = (CheckBoxPreference) findPreference(PREFERENCE_DEFAULT);
|
||||
mAccountDefault.setChecked(mAccount.mId == mDefaultAccountId);
|
||||
mAccountDefault.setOnPreferenceChangeListener(this);
|
||||
|
||||
mInboxNotify = (CheckBoxPreference) findPreference(
|
||||
FolderPreferences.PreferenceKeys.NOTIFICATIONS_ENABLED);
|
||||
mInboxNotify.setOnPreferenceChangeListener(this);
|
||||
@ -874,7 +864,6 @@ public class AccountSettingsFragment extends EmailPreferenceFragment
|
||||
|
||||
newFlags |= mAccountBackgroundAttachments.isChecked() ?
|
||||
Account.FLAGS_BACKGROUND_ATTACHMENTS : 0;
|
||||
mAccount.setDefaultAccount(mAccountDefault.isChecked());
|
||||
// If the display name has been cleared, we'll reset it to the default value (email addr)
|
||||
mAccount.setDisplayName(mAccountDescription.getText().trim());
|
||||
// The sender name must never be empty (this is enforced by the preference editor)
|
||||
|
@ -84,7 +84,6 @@ public class AccountSettingsUtils {
|
||||
*/
|
||||
public static ContentValues getAccountContentValues(Account account) {
|
||||
ContentValues cv = new ContentValues();
|
||||
cv.put(AccountColumns.IS_DEFAULT, account.mIsDefault);
|
||||
cv.put(AccountColumns.DISPLAY_NAME, account.getDisplayName());
|
||||
cv.put(AccountColumns.SENDER_NAME, account.getSenderName());
|
||||
cv.put(AccountColumns.SIGNATURE, account.getSignature());
|
||||
|
@ -35,11 +35,11 @@ import android.text.TextWatcher;
|
||||
import android.view.View;
|
||||
import android.view.View.OnClickListener;
|
||||
import android.widget.Button;
|
||||
import android.widget.CheckBox;
|
||||
import android.widget.EditText;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.email.EmailAddressValidator;
|
||||
import com.android.email.Preferences;
|
||||
import com.android.email.R;
|
||||
import com.android.email.activity.ActivityHelper;
|
||||
import com.android.email.activity.UiUtilities;
|
||||
@ -110,7 +110,6 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
// Support for UI
|
||||
private EditText mEmailView;
|
||||
private EditText mPasswordView;
|
||||
private CheckBox mDefaultView;
|
||||
private final EmailAddressValidator mEmailValidator = new EmailAddressValidator();
|
||||
private Provider mProvider;
|
||||
private Button mManualButton;
|
||||
@ -242,15 +241,10 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
|
||||
mEmailView = (EditText) UiUtilities.getView(this, R.id.account_email);
|
||||
mPasswordView = (EditText) UiUtilities.getView(this, R.id.account_password);
|
||||
mDefaultView = (CheckBox) UiUtilities.getView(this, R.id.account_default);
|
||||
|
||||
mEmailView.addTextChangedListener(this);
|
||||
mPasswordView.addTextChangedListener(this);
|
||||
|
||||
// If there are one or more accounts already in existence, then display
|
||||
// the "use as default" checkbox (it defaults to hidden).
|
||||
new DisplayCheckboxTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||
|
||||
boolean manualButtonDisplayed = true;
|
||||
|
||||
// Configure buttons
|
||||
@ -432,16 +426,20 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
private final Callable<String> mOwnerLookupCallable = new Callable<String>() {
|
||||
@Override
|
||||
public String call() {
|
||||
Context context = AccountSetupBasics.this;
|
||||
String name = null;
|
||||
long defaultId = Account.getDefaultAccountId(context);
|
||||
final Context context = AccountSetupBasics.this;
|
||||
|
||||
final long lastUsedAccountId =
|
||||
Preferences.getPreferences(context).getLastUsedAccountId();
|
||||
final long defaultId = Account.getDefaultAccountId(context, lastUsedAccountId);
|
||||
|
||||
if (defaultId != -1) {
|
||||
Account account = Account.restoreAccountWithId(context, defaultId);
|
||||
final Account account = Account.restoreAccountWithId(context, defaultId);
|
||||
if (account != null) {
|
||||
name = account.getSenderName();
|
||||
return account.getSenderName();
|
||||
}
|
||||
}
|
||||
return name;
|
||||
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
@ -469,7 +467,7 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
sendAuth.setLogin(mProvider.outgoingUsername, password);
|
||||
|
||||
// Populate the setup data, assuming that the duplicate account check will succeed
|
||||
populateSetupData(getOwnerName(), email, mDefaultView.isChecked());
|
||||
populateSetupData(getOwnerName(), email);
|
||||
|
||||
// Stop here if the login credentials duplicate an existing account
|
||||
// Launch an Async task to do the work
|
||||
@ -590,7 +588,7 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
sendAuth.setLogin(user, password);
|
||||
sendAuth.setConnection(null, domain, HostAuth.PORT_UNKNOWN, HostAuth.FLAG_NONE);
|
||||
|
||||
populateSetupData(getOwnerName(), email, mDefaultView.isChecked());
|
||||
populateSetupData(getOwnerName(), email);
|
||||
|
||||
SetupData.setAllowAutodiscover(allowAutoDiscover);
|
||||
AccountSetupType.actionSelectAccountType(this);
|
||||
@ -616,7 +614,7 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
HostAuth sendAuth = account.getOrCreateHostAuthSend(this);
|
||||
HostAuth.setHostAuthFromString(sendAuth, outgoing);
|
||||
|
||||
populateSetupData(user, email, false);
|
||||
populateSetupData(user, email);
|
||||
} catch (URISyntaxException e) {
|
||||
// If we can't set up the URL, don't continue - account setup pages will fail too
|
||||
Toast.makeText(
|
||||
@ -638,13 +636,11 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
/**
|
||||
* Populate SetupData's account with complete setup info.
|
||||
*/
|
||||
private void populateSetupData(String senderName, String senderEmail, boolean isDefault) {
|
||||
private void populateSetupData(String senderName, String senderEmail) {
|
||||
Account account = SetupData.getAccount();
|
||||
account.setSenderName(senderName);
|
||||
account.setEmailAddress(senderEmail);
|
||||
account.setDisplayName(senderEmail);
|
||||
account.setDefaultAccount(isDefault);
|
||||
SetupData.setDefault(isDefault); // TODO - why duplicated, if already set in account
|
||||
setDefaultsForProtocol(this, account);
|
||||
}
|
||||
|
||||
@ -674,28 +670,6 @@ public class AccountSetupBasics extends AccountSetupActivity
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
/**
|
||||
* AsyncTask checks count of accounts and displays "use this account as default" checkbox
|
||||
* if there are more than one.
|
||||
*/
|
||||
private class DisplayCheckboxTask extends AsyncTask<Void, Void, Integer> {
|
||||
|
||||
@Override
|
||||
protected Integer doInBackground(Void... params) {
|
||||
return EmailContent.count(AccountSetupBasics.this, Account.CONTENT_URI);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPostExecute(Integer numAccounts) {
|
||||
if (numAccounts > 0) {
|
||||
Activity a = AccountSetupBasics.this;
|
||||
UiUtilities.setVisibilitySafe(mDefaultView, View.VISIBLE);
|
||||
UiUtilities.setVisibilitySafe(a, R.id.account_default_divider_1, View.VISIBLE);
|
||||
UiUtilities.setVisibilitySafe(a, R.id.account_default_divider_2, View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void onEnableProceedButtons(boolean enabled) {
|
||||
mManualButton.setEnabled(enabled);
|
||||
mNextButton.setEnabled(enabled);
|
||||
|
@ -57,7 +57,6 @@ import java.io.IOException;
|
||||
public class AccountSetupOptions extends AccountSetupActivity implements OnClickListener {
|
||||
private Spinner mCheckFrequencyView;
|
||||
private Spinner mSyncWindowView;
|
||||
private CheckBox mDefaultView;
|
||||
private CheckBox mNotifyView;
|
||||
private CheckBox mSyncContactsView;
|
||||
private CheckBox mSyncCalendarView;
|
||||
@ -86,7 +85,6 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
|
||||
|
||||
mCheckFrequencyView = (Spinner) UiUtilities.getView(this, R.id.account_check_frequency);
|
||||
mSyncWindowView = (Spinner) UiUtilities.getView(this, R.id.account_sync_window);
|
||||
mDefaultView = (CheckBox) UiUtilities.getView(this, R.id.account_default);
|
||||
mNotifyView = (CheckBox) UiUtilities.getView(this, R.id.account_notify);
|
||||
mSyncContactsView = (CheckBox) UiUtilities.getView(this, R.id.account_sync_contacts);
|
||||
mSyncCalendarView = (CheckBox) UiUtilities.getView(this, R.id.account_sync_calendar);
|
||||
@ -121,12 +119,6 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
|
||||
enableLookbackSpinner();
|
||||
}
|
||||
|
||||
// Note: It is OK to use mAccount.mIsDefault here *only* because the account
|
||||
// has not been written to the DB yet. Ordinarily, call Account.getDefaultAccountId().
|
||||
if (account.mIsDefault || SetupData.isDefault()) {
|
||||
mDefaultView.setChecked(true);
|
||||
}
|
||||
|
||||
mNotifyView.setChecked(true); // By default, we want notifications on
|
||||
SpinnerOption.setSpinnerOptionValue(mCheckFrequencyView, account.getSyncInterval());
|
||||
|
||||
@ -221,7 +213,6 @@ public class AccountSetupOptions extends AccountSetupActivity implements OnClick
|
||||
int window = (Integer)((SpinnerOption)mSyncWindowView.getSelectedItem()).value;
|
||||
account.setSyncLookback(window);
|
||||
}
|
||||
account.setDefaultAccount(mDefaultView.isChecked());
|
||||
|
||||
if (account.mHostAuthRecv == null) {
|
||||
throw new IllegalStateException("in AccountSetupOptions with null mHostAuthRecv");
|
||||
|
@ -57,7 +57,6 @@ public class SetupData implements Parcelable {
|
||||
private boolean mAllowAutodiscover = true;
|
||||
private Policy mPolicy;
|
||||
private boolean mAutoSetup = false;
|
||||
private boolean mDefault = false;
|
||||
private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
|
||||
|
||||
// We only have one instance of SetupData; if/when the process is destroyed, this data will be
|
||||
@ -151,14 +150,6 @@ public class SetupData implements Parcelable {
|
||||
getInstance().mAutoSetup = autoSetup;
|
||||
}
|
||||
|
||||
static public boolean isDefault() {
|
||||
return getInstance().mDefault;
|
||||
}
|
||||
|
||||
static public void setDefault(boolean _default) {
|
||||
getInstance().mDefault = _default;
|
||||
}
|
||||
|
||||
static public AccountAuthenticatorResponse getAccountAuthenticatorResponse() {
|
||||
return getInstance().mAccountAuthenticatorResponse;
|
||||
}
|
||||
@ -197,7 +188,6 @@ public class SetupData implements Parcelable {
|
||||
mAllowAutodiscover = true;
|
||||
mCheckSettingsMode = 0;
|
||||
mAccount = new Account();
|
||||
mDefault = false;
|
||||
mUsername = null;
|
||||
mPassword = null;
|
||||
mAccountAuthenticatorResponse = null;
|
||||
@ -232,7 +222,6 @@ public class SetupData implements Parcelable {
|
||||
dest.writeInt(mAllowAutodiscover ? 1 : 0);
|
||||
dest.writeParcelable(mPolicy, 0);
|
||||
dest.writeInt(mAutoSetup ? 1 : 0);
|
||||
dest.writeInt(mDefault ? 1 : 0);
|
||||
dest.writeParcelable(mAccountAuthenticatorResponse, 0);
|
||||
}
|
||||
|
||||
@ -246,7 +235,6 @@ public class SetupData implements Parcelable {
|
||||
mAllowAutodiscover = in.readInt() == 1;
|
||||
mPolicy = in.readParcelable(loader);
|
||||
mAutoSetup = in.readInt() == 1;
|
||||
mDefault = in.readInt() == 1;
|
||||
mAccountAuthenticatorResponse = in.readParcelable(loader);
|
||||
}
|
||||
|
||||
@ -276,7 +264,6 @@ public class SetupData implements Parcelable {
|
||||
}
|
||||
sb.append(":a/d=" + data.mAllowAutodiscover);
|
||||
sb.append(":auto=" + data.mAutoSetup);
|
||||
sb.append(":default=" + data.mDefault);
|
||||
sb.append(":check=");
|
||||
if (SetupData.isCheckIncoming()) sb.append("in+");
|
||||
if (SetupData.isCheckOutgoing()) sb.append("out+");
|
||||
|
@ -166,10 +166,9 @@ public class EmailProvider extends ContentProvider {
|
||||
private static final int ACCOUNT_ID = ACCOUNT_BASE + 1;
|
||||
private static final int ACCOUNT_RESET_NEW_COUNT = ACCOUNT_BASE + 2;
|
||||
private static final int ACCOUNT_RESET_NEW_COUNT_ID = ACCOUNT_BASE + 3;
|
||||
private static final int ACCOUNT_DEFAULT_ID = ACCOUNT_BASE + 4;
|
||||
private static final int ACCOUNT_CHECK = ACCOUNT_BASE + 5;
|
||||
private static final int ACCOUNT_PICK_TRASH_FOLDER = ACCOUNT_BASE + 6;
|
||||
private static final int ACCOUNT_PICK_SENT_FOLDER = ACCOUNT_BASE + 7;
|
||||
private static final int ACCOUNT_CHECK = ACCOUNT_BASE + 4;
|
||||
private static final int ACCOUNT_PICK_TRASH_FOLDER = ACCOUNT_BASE + 5;
|
||||
private static final int ACCOUNT_PICK_SENT_FOLDER = ACCOUNT_BASE + 6;
|
||||
|
||||
private static final int MAILBOX_BASE = 0x1000;
|
||||
private static final int MAILBOX = MAILBOX_BASE;
|
||||
@ -856,7 +855,6 @@ public class EmailProvider extends ContentProvider {
|
||||
// A specific account
|
||||
// insert into this URI causes a mailbox to be added to the account
|
||||
matcher.addURI(EmailContent.AUTHORITY, "account/#", ACCOUNT_ID);
|
||||
matcher.addURI(EmailContent.AUTHORITY, "account/default", ACCOUNT_DEFAULT_ID);
|
||||
matcher.addURI(EmailContent.AUTHORITY, "accountCheck/#", ACCOUNT_CHECK);
|
||||
|
||||
// Special URI to reset the new message count. Only update works, and values
|
||||
@ -1096,31 +1094,6 @@ public class EmailProvider extends ContentProvider {
|
||||
case MAILBOX_MESSAGE_COUNT:
|
||||
c = getMailboxMessageCount(uri);
|
||||
return c;
|
||||
case ACCOUNT_DEFAULT_ID:
|
||||
// We want either the row which has isDefault set, or we want the lowest valued
|
||||
// account id if none are isDefault. I don't think there's a way to express this
|
||||
// simply in sql so we get all account ids and loop through them manually.
|
||||
final Cursor accounts = db.query(Account.TABLE_NAME,
|
||||
Account.ACCOUNT_IS_DEFAULT_PROJECTION,
|
||||
null, null, null, null, null, null);
|
||||
long defaultAccountId = Account.NO_ACCOUNT;
|
||||
while (accounts.moveToNext()) {
|
||||
final long accountId =
|
||||
accounts.getLong(Account.ACCOUNT_IS_DEFAULT_COLUMN_ID);
|
||||
if (accounts.getInt(Account.ACCOUNT_IS_DEFAULT_COLUMN_IS_DEFAULT) == 1) {
|
||||
defaultAccountId = accountId;
|
||||
break;
|
||||
} else if (defaultAccountId == Account.NO_ACCOUNT ||
|
||||
accountId < defaultAccountId) {
|
||||
defaultAccountId = accountId;
|
||||
}
|
||||
}
|
||||
// Return a cursor with an id projection
|
||||
final MatrixCursor mc =
|
||||
new MatrixCursorWithCachedColumns(EmailContent.ID_PROJECTION, 1);
|
||||
mc.addRow(new Object[] {defaultAccountId});
|
||||
c = mc;
|
||||
break;
|
||||
case BODY:
|
||||
case MESSAGE:
|
||||
case UPDATED_MESSAGE:
|
||||
@ -1617,8 +1590,13 @@ public class EmailProvider extends ContentProvider {
|
||||
Uri messageUri = null;
|
||||
if (TextUtils.equals(method, UIProvider.AccountCallMethods.SEND_MESSAGE)) {
|
||||
messageUri = uiSendDraftMessage(accountId, extras);
|
||||
Preferences.getPreferences(getContext()).setLastUsedAccountId(accountId);
|
||||
} else if (TextUtils.equals(method, UIProvider.AccountCallMethods.SAVE_MESSAGE)) {
|
||||
messageUri = uiSaveDraftMessage(accountId, extras);
|
||||
} else if (TextUtils.equals(method, UIProvider.AccountCallMethods.SET_CURRENT_ACCOUNT)) {
|
||||
LogUtils.d(TAG, "Unhandled (but expected) Content provider method: %s", method);
|
||||
} else {
|
||||
LogUtils.wtf(TAG, "Unexpected Content provider method: %s", method);
|
||||
}
|
||||
|
||||
final Bundle result;
|
||||
@ -2759,7 +2737,9 @@ public class EmailProvider extends ContentProvider {
|
||||
}
|
||||
|
||||
private void addCombinedAccountRow(MatrixCursor mc) {
|
||||
final long id = Account.getDefaultAccountId(getContext());
|
||||
final long lastUsedAccountId =
|
||||
Preferences.getPreferences(getContext()).getLastUsedAccountId();
|
||||
final long id = Account.getDefaultAccountId(getContext(), lastUsedAccountId);
|
||||
if (id == Account.NO_ACCOUNT) return;
|
||||
|
||||
// Build a map of the requested columns to the appropriate positions
|
||||
|
Loading…
Reference in New Issue
Block a user