From 8209d6c081243d58cf9957c1900e550b440af431 Mon Sep 17 00:00:00 2001 From: Martin Hibdon Date: Wed, 10 Sep 2014 10:14:11 -0700 Subject: [PATCH] Display a warning if account is on security hold b/17258435 Change-Id: I654db15d59338621829cbb6df106b490ab7bb628 --- .../email/activity/setup/AccountSecurity.java | 34 +++++++++++++++++-- .../android/email/provider/EmailProvider.java | 33 ++++++++++++++---- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/com/android/email/activity/setup/AccountSecurity.java b/src/com/android/email/activity/setup/AccountSecurity.java index 5da0d4113..c2be45928 100644 --- a/src/com/android/email/activity/setup/AccountSecurity.java +++ b/src/com/android/email/activity/setup/AccountSecurity.java @@ -28,16 +28,20 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.Loader; import android.content.res.Resources; +import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.text.TextUtils; import com.android.email.DebugUtils; import com.android.email.R; import com.android.email.SecurityPolicy; import com.android.emailcommon.provider.Account; +import com.android.emailcommon.provider.EmailContent; import com.android.emailcommon.provider.HostAuth; import com.android.emailcommon.provider.Policy; +import com.android.emailcommon.utility.IntentUtilities; import com.android.mail.ui.MailAsyncTaskLoader; import com.android.mail.utils.LogUtils; @@ -87,6 +91,14 @@ public class AccountSecurity extends Activity { private AccountAndPolicyLoaderCallbacks mAPLoaderCallbacks; private Bundle mAPLoaderArgs; + public static Uri getUpdateSecurityUri(final long accountId, final boolean showDialog) { + final Uri.Builder baseUri = Uri.parse("auth://" + EmailContent.EMAIL_PACKAGE_NAME + + ".ACCOUNT_SECURITY/").buildUpon(); + IntentUtilities.setAccountId(baseUri, accountId); + baseUri.appendQueryParameter(EXTRA_SHOW_DIALOG, Boolean.toString(showDialog)); + return baseUri.build(); + } + /** * Used for generating intent for this activity (which is intended to be launched * from a notification.) @@ -126,7 +138,25 @@ public class AccountSecurity extends Activity { mHandler = new Handler(); final Intent i = getIntent(); - final long accountId = i.getLongExtra(EXTRA_ACCOUNT_ID, -1); + final long accountId; + Bundle extras = i.getExtras(); + if (extras == null) { + // We have been invoked via a uri. We need to get our parameters from the URI instead + // of looking in the intent extras. + extras = new Bundle(); + accountId = IntentUtilities.getAccountIdFromIntent(i); + extras.putLong(EXTRA_ACCOUNT_ID, accountId); + boolean showDialog = false; + final String value = i.getData().getQueryParameter(EXTRA_SHOW_DIALOG); + if (!TextUtils.isEmpty(value)) { + showDialog = Boolean.getBoolean(value); + } + extras.putBoolean(EXTRA_SHOW_DIALOG, showDialog); + } else { + accountId = i.getLongExtra(EXTRA_ACCOUNT_ID, -1); + extras = i.getExtras(); + } + final SecurityPolicy security = SecurityPolicy.getInstance(this); security.clearNotification(); if (accountId == -1) { @@ -148,7 +178,7 @@ public class AccountSecurity extends Activity { } if (!mInitialized) { - startAccountAndPolicyLoader(i.getExtras()); + startAccountAndPolicyLoader(extras); } } diff --git a/src/com/android/email/provider/EmailProvider.java b/src/com/android/email/provider/EmailProvider.java index a4490cb7e..893fecc4d 100644 --- a/src/com/android/email/provider/EmailProvider.java +++ b/src/com/android/email/provider/EmailProvider.java @@ -67,6 +67,7 @@ import com.android.email.DebugUtils; import com.android.email.Preferences; import com.android.email.R; import com.android.email.SecurityPolicy; +import com.android.email.activity.setup.AccountSecurity; import com.android.email.activity.setup.AccountSettingsFragment; import com.android.email.activity.setup.AccountSettingsUtils; import com.android.email.activity.setup.HeadlessAccountSettingsLoader; @@ -3332,10 +3333,8 @@ public class EmailProvider extends ContentProvider return sb.toString(); } - private static int getCapabilities(Context context, long accountId) { - final Account account = Account.restoreAccountWithId(context, accountId); + private static int getCapabilities(Context context, final Account account) { if (account == null) { - LogUtils.d(TAG, "Account %d not found during getCapabilities", accountId); return 0; } // Account capabilities are based on protocol -- different protocols (and, for EAS, @@ -3376,10 +3375,10 @@ public class EmailProvider extends ContentProvider AccountCapabilities.DISCARD_CONVERSATION_DRAFTS; } } else { - LogUtils.w(TAG, "Unknown protocol for account %d", accountId); + LogUtils.w(TAG, "Unknown protocol for account %d", account.getId()); return 0; } - LogUtils.d(TAG, "getCapabilities() for %d (protocol %s): 0x%x %s", accountId, protocol, + LogUtils.d(TAG, "getCapabilities() for %d (protocol %s): 0x%x %s", account.getId(), protocol, capabilities, getBits(capabilities)); // If the configuration states that feedback is supported, add that capability @@ -3421,9 +3420,14 @@ public class EmailProvider extends ContentProvider // TODO: If uiProjection is null, this will NPE. We should do everything here if it's null. final Set projectionColumns = ImmutableSet.copyOf(uiProjection); + final Account account = Account.restoreAccountWithId(context, accountId); + if (account == null) { + LogUtils.d(TAG, "Account %d not found during genQueryAccount", accountId); + } if (projectionColumns.contains(UIProvider.AccountColumns.CAPABILITIES)) { // Get account capabilities from the service - values.put(UIProvider.AccountColumns.CAPABILITIES, getCapabilities(context, accountId)); + values.put(UIProvider.AccountColumns.CAPABILITIES, + (account == null ? 0 : getCapabilities(context, account))); } if (projectionColumns.contains(UIProvider.AccountColumns.SETTINGS_INTENT_URI)) { values.put(UIProvider.AccountColumns.SETTINGS_INTENT_URI, @@ -3502,6 +3506,16 @@ public class EmailProvider extends ContentProvider // Email is now sanitized, which grants the ability to inject beautifying javascript. values.put(UIProvider.AccountColumns.ENABLE_MESSAGE_TRANSFORMS, 1); } + if (projectionColumns.contains(UIProvider.AccountColumns.SECURITY_HOLD)) { + final int hold = ((account != null && + ((account.getFlags() & Account.FLAGS_SECURITY_HOLD) == 0)) ? 0 : 1); + values.put(UIProvider.AccountColumns.SECURITY_HOLD, hold); + } + if (projectionColumns.contains(UIProvider.AccountColumns.ACCOUNT_SECURITY_URI)) { + values.put(UIProvider.AccountColumns.ACCOUNT_SECURITY_URI, + (account == null ? "" : AccountSecurity.getUpdateSecurityUri( + account.getId(), true).toString())); + } if (projectionColumns.contains( UIProvider.AccountColumns.SettingsColumns.IMPORTANCE_MARKERS_ENABLED)) { // Email doesn't support priority inbox, so always state importance markers disabled. @@ -3631,7 +3645,6 @@ public class EmailProvider extends ContentProvider final Map colPosMap = builder.build(); final MailPrefs mailPrefs = MailPrefs.get(getContext()); - final Object[] values = new Object[columnNames.length]; if (colPosMap.containsKey(BaseColumns._ID)) { values[colPosMap.get(BaseColumns._ID)] = 0; @@ -3670,6 +3683,12 @@ public class EmailProvider extends ContentProvider values[colPosMap.get(UIProvider.AccountColumns.MIME_TYPE)] = EMAIL_APP_MIME_TYPE; } + if (colPosMap.containsKey(UIProvider.AccountColumns.SECURITY_HOLD)) { + values[colPosMap.get(UIProvider.AccountColumns.SECURITY_HOLD)] = 0; + } + if (colPosMap.containsKey(UIProvider.AccountColumns.ACCOUNT_SECURITY_URI)) { + values[colPosMap.get(UIProvider.AccountColumns.ACCOUNT_SECURITY_URI)] = ""; + } if (colPosMap.containsKey(UIProvider.AccountColumns.SETTINGS_INTENT_URI)) { values[colPosMap.get(UIProvider.AccountColumns.SETTINGS_INTENT_URI)] = getExternalUriString("settings", COMBINED_ACCOUNT_ID_STRING);