diff options
author | Martin Hibdon <mhibdon@google.com> | 2014-09-11 16:07:18 -0700 |
---|---|---|
committer | Martin Hibdon <mhibdon@google.com> | 2014-09-12 15:08:36 -0700 |
commit | 469817c69011b108f953ada64bf10eaf7dd31341 (patch) | |
tree | 01a440b332e036169821a75cf074ec1fdc93c6e3 | |
parent | f50fe88e49b0479b336f155db55714a75cc82504 (diff) | |
download | android_packages_apps_UnifiedEmail-469817c69011b108f953ada64bf10eaf7dd31341.tar.gz android_packages_apps_UnifiedEmail-469817c69011b108f953ada64bf10eaf7dd31341.tar.bz2 android_packages_apps_UnifiedEmail-469817c69011b108f953ada64bf10eaf7dd31341.zip |
Display a warning if account is on security hold
b/17258435
Change-Id: If9f069bad54076459957a700a7a5328940cf2536
-rw-r--r-- | res/drawable-hdpi/ic_warning_56dp.png | bin | 0 -> 4101 bytes | |||
-rw-r--r-- | res/drawable-mdpi/ic_warning_56dp.png | bin | 0 -> 3759 bytes | |||
-rw-r--r-- | res/drawable-xhdpi/ic_warning_56dp.png | bin | 0 -> 4807 bytes | |||
-rw-r--r-- | res/drawable-xxhdpi/ic_warning_56dp.png | bin | 0 -> 5552 bytes | |||
-rw-r--r-- | res/layout/conversation_list.xml | 2 | ||||
-rw-r--r-- | res/layout/security_hold_view.xml | 56 | ||||
-rw-r--r-- | res/values/dimen.xml | 2 | ||||
-rw-r--r-- | res/values/strings.xml | 6 | ||||
-rw-r--r-- | src/com/android/mail/providers/Account.java | 33 | ||||
-rw-r--r-- | src/com/android/mail/providers/UIProvider.java | 10 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationListFragment.java | 39 |
11 files changed, 145 insertions, 3 deletions
diff --git a/res/drawable-hdpi/ic_warning_56dp.png b/res/drawable-hdpi/ic_warning_56dp.png Binary files differnew file mode 100644 index 000000000..20a20e377 --- /dev/null +++ b/res/drawable-hdpi/ic_warning_56dp.png diff --git a/res/drawable-mdpi/ic_warning_56dp.png b/res/drawable-mdpi/ic_warning_56dp.png Binary files differnew file mode 100644 index 000000000..64799944d --- /dev/null +++ b/res/drawable-mdpi/ic_warning_56dp.png diff --git a/res/drawable-xhdpi/ic_warning_56dp.png b/res/drawable-xhdpi/ic_warning_56dp.png Binary files differnew file mode 100644 index 000000000..e2000ee51 --- /dev/null +++ b/res/drawable-xhdpi/ic_warning_56dp.png diff --git a/res/drawable-xxhdpi/ic_warning_56dp.png b/res/drawable-xxhdpi/ic_warning_56dp.png Binary files differnew file mode 100644 index 000000000..85db289bf --- /dev/null +++ b/res/drawable-xxhdpi/ic_warning_56dp.png diff --git a/res/layout/conversation_list.xml b/res/layout/conversation_list.xml index 64f8fde8e..a9eeb1823 100644 --- a/res/layout/conversation_list.xml +++ b/res/layout/conversation_list.xml @@ -37,6 +37,8 @@ <!-- Offset by height of undo bar and action bar --> <include layout="@layout/conversation_list_empty_view" /> + <include layout="@layout/security_hold_view" /> + <com.android.mail.ui.SwipeableListView android:id="@+id/conversation_list_view" android:layout_width="match_parent" diff --git a/res/layout/security_hold_view.xml b/res/layout/security_hold_view.xml new file mode 100644 index 000000000..025fd40a5 --- /dev/null +++ b/res/layout/security_hold_view.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2014 Google Inc. + Licensed to The Android Open Source Project. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/security_hold_view" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + android:visibility="invisible" > + + <ImageView + android:id="@+id/security_hold_icon" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:src="@drawable/ic_warning_56dp"/> + + <TextView + android:id="@+id/security_hold_text" + android:fontFamily="sans-serif-light" + android:gravity="center" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_marginTop="20dp" + android:maxWidth="@dimen/security_hold_text_width" + android:textAllCaps="true" + android:textColor="#212121" + android:textSize="@dimen/security_hold_view_text_size"/> + + <TextView + android:id="@+id/security_hold_button" + android:fontFamily="sans-serif-light" + android:gravity="center" + android:layout_height="wrap_content" + android:layout_width="wrap_content" + android:layout_marginTop="60dp" + android:text="@string/update_security_text" + android:textColor="#00BFD8" + android:textSize="@dimen/security_hold_view_text_size"/> + +</LinearLayout> diff --git a/res/values/dimen.xml b/res/values/dimen.xml index 6ec24cbdb..54be9dc01 100644 --- a/res/values/dimen.xml +++ b/res/values/dimen.xml @@ -225,4 +225,6 @@ <dimen name="account_item_name_end_padding">8dp</dimen> <dimen name="action_bar_content_inset_start">72dp</dimen> + <dimen name="security_hold_text_width">240dp</dimen> + <dimen name="security_hold_view_text_size">18sp</dimen> </resources> diff --git a/res/values/strings.xml b/res/values/strings.xml index 25e4923e1..26671e686 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1131,4 +1131,10 @@ <string name="overflow_description">More options</string> <string name="user_agent_format" translatable="false">%1$s AndroidUnifiedEmail/%2$s</string> + + <!-- Text when there is a security hold on an account that needs to be accepted. The email address param takes the for "abc@xyz.com" --> + <string name="security_hold_required_text">Security update required for <xliff:g id="email_address">%1$s</xliff:g></string> + + <!-- Text to go to the dialog to accept the security hold --> + <string name="update_security_text">update now</string> </resources> diff --git a/src/com/android/mail/providers/Account.java b/src/com/android/mail/providers/Account.java index 9a389f914..5a5322527 100644 --- a/src/com/android/mail/providers/Account.java +++ b/src/com/android/mail/providers/Account.java @@ -233,6 +233,16 @@ public class Account implements Parcelable { public final String settingsFragmentClass; /** + * Nonzero value indicates that this account is on a security hold. + */ + public final int securityHold; + + /** + * Uri to launch the account security activity. + */ + public final String accountSecurityUri; + + /** * Transient cache of parsed {@link #accountFromAddresses}, plus an entry for the main account * address. */ @@ -285,6 +295,8 @@ public class Account implements Parcelable { json.put(AccountColumns.SYNC_AUTHORITY, syncAuthority); json.put(AccountColumns.QUICK_RESPONSE_URI, quickResponseUri); json.put(AccountColumns.SETTINGS_FRAGMENT_CLASS, settingsFragmentClass); + json.put(AccountColumns.SECURITY_HOLD, securityHold); + json.put(AccountColumns.ACCOUNT_SECURITY_URI, accountSecurityUri); if (settings != null) { json.put(SETTINGS_KEY, settings.toJSON()); } @@ -417,6 +429,8 @@ public class Account implements Parcelable { syncAuthority = json.optString(AccountColumns.SYNC_AUTHORITY); quickResponseUri = Utils.getValidUri(json.optString(AccountColumns.QUICK_RESPONSE_URI)); settingsFragmentClass = json.optString(AccountColumns.SETTINGS_FRAGMENT_CLASS, ""); + securityHold = json.optInt(AccountColumns.SECURITY_HOLD); + accountSecurityUri = json.optString(AccountColumns.ACCOUNT_SECURITY_URI); final Settings jsonSettings = Settings.newInstance(json.optJSONObject(SETTINGS_KEY)); if (jsonSettings != null) { @@ -499,6 +513,13 @@ public class Account implements Parcelable { cursor.getColumnIndex(AccountColumns.QUICK_RESPONSE_URI))); settingsFragmentClass = cursor.getString(cursor.getColumnIndex( AccountColumns.SETTINGS_FRAGMENT_CLASS)); + final int securityHoldIndex = cursor.getColumnIndex(AccountColumns.SECURITY_HOLD); + securityHold = (securityHoldIndex >= 0 ? + cursor.getInt(cursor.getColumnIndex(AccountColumns.SECURITY_HOLD)) : 0); + final int accountSecurityIndex = + cursor.getColumnIndex(AccountColumns.ACCOUNT_SECURITY_URI); + accountSecurityUri = (accountSecurityIndex >= 0 ? + cursor.getString(accountSecurityIndex) : ""); settings = new Settings(cursor); } @@ -608,6 +629,8 @@ public class Account implements Parcelable { } quickResponseUri = in.readParcelable(null); settingsFragmentClass = in.readString(); + securityHold = in.readInt(); + accountSecurityUri = in.readString(); final int hasSettings = in.readInt(); if (hasSettings == 0) { LogUtils.e(LOG_TAG, new Throwable(), "Unexpected null settings in Account(Parcel)"); @@ -652,6 +675,8 @@ public class Account implements Parcelable { dest.writeString(syncAuthority); dest.writeParcelable(quickResponseUri, 0); dest.writeString(settingsFragmentClass); + dest.writeInt(securityHold); + dest.writeString(accountSecurityUri); if (settings == null) { LogUtils.e(LOG_TAG, "unexpected null settings object in writeToParcel"); dest.writeInt(0); @@ -716,6 +741,8 @@ public class Account implements Parcelable { Objects.equal(syncAuthority, other.syncAuthority) && Objects.equal(quickResponseUri, other.quickResponseUri) && Objects.equal(settingsFragmentClass, other.settingsFragmentClass) && + Objects.equal(securityHold, other.securityHold) && + Objects.equal(accountSecurityUri, other.accountSecurityUri) && Objects.equal(settings, other.settings); } @@ -768,7 +795,9 @@ public class Account implements Parcelable { updateSettingsUri, enableMessageTransforms, syncAuthority, - quickResponseUri); + quickResponseUri, + securityHold, + accountSecurityUri); } /** @@ -930,6 +959,8 @@ public class Account implements Parcelable { map.put(AccountColumns.SYNC_AUTHORITY, syncAuthority); map.put(AccountColumns.QUICK_RESPONSE_URI, quickResponseUri); map.put(AccountColumns.SETTINGS_FRAGMENT_CLASS, settingsFragmentClass); + map.put(AccountColumns.SECURITY_HOLD, securityHold); + map.put(AccountColumns.ACCOUNT_SECURITY_URI, accountSecurityUri); settings.getValueMap(map); return map; diff --git a/src/com/android/mail/providers/UIProvider.java b/src/com/android/mail/providers/UIProvider.java index b618804bd..ff021f837 100644 --- a/src/com/android/mail/providers/UIProvider.java +++ b/src/com/android/mail/providers/UIProvider.java @@ -199,6 +199,8 @@ public class UIProvider { .put(AccountColumns.SettingsColumns.MOVE_TO_INBOX, String.class) .put(AccountColumns.SettingsColumns.SHOW_IMAGES, Integer.class) .put(AccountColumns.SettingsColumns.WELCOME_TOUR_SHOWN_VERSION, Integer.class) + .put(AccountColumns.SECURITY_HOLD, Integer.class) + .put(AccountColumns.ACCOUNT_SECURITY_URI, String.class) .build(); public static final Map<String, Class<?>> ACCOUNTS_COLUMNS = @@ -527,6 +529,14 @@ public class UIProvider { * Fragment class name for account settings */ public static final String SETTINGS_FRAGMENT_CLASS = "settingsFragmentClass"; + /** + * Whether this account is on a security hold + */ + public static final String SECURITY_HOLD = "securityHold"; + /** + * Uri to access the account security activity. + */ + public static final String ACCOUNT_SECURITY_URI = "accountSecurityUri"; public static final class SettingsColumns { /** diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java index bf6895c24..62bd8b08d 100644 --- a/src/com/android/mail/ui/ConversationListFragment.java +++ b/src/com/android/mail/ui/ConversationListFragment.java @@ -21,8 +21,10 @@ import android.animation.LayoutTransition; import android.app.Activity; import android.app.Fragment; import android.app.LoaderManager; +import android.content.Intent; import android.content.res.Resources; import android.database.DataSetObserver; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Parcelable; @@ -78,7 +80,7 @@ import static android.view.View.OnKeyListener; */ public final class ConversationListFragment extends Fragment implements OnItemLongClickListener, ModeChangeListener, ListItemSwipedListener, OnRefreshListener, - SwipeListener, OnKeyListener, AdapterView.OnItemClickListener { + SwipeListener, OnKeyListener, AdapterView.OnItemClickListener, View.OnClickListener { /** Key used to pass data to {@link ConversationListFragment}. */ private static final String CONVERSATION_LIST_KEY = "conversation-list"; /** Key used to keep track of the scroll state of the list. */ @@ -135,6 +137,9 @@ public final class ConversationListFragment extends Fragment implements private ConversationListFooterView mFooterView; private ConversationListEmptyView mEmptyView; + private View mSecurityHoldView; + private TextView mSecurityHoldText; + private View mSecurityHoldButton; private View mLoadingView; private ErrorListener mErrorListener; private FolderObserver mFolderObserver; @@ -170,6 +175,15 @@ public final class ConversationListFragment extends Fragment implements mListView.setVisibility(View.VISIBLE); mEmptyView.setVisibility(View.INVISIBLE); mLoadingView.setVisibility(View.INVISIBLE); + mSecurityHoldView.setVisibility(View.INVISIBLE); + } + + private void showSecurityHoldView() { + mListView.setVisibility(View.INVISIBLE); + mEmptyView.setVisibility(View.INVISIBLE); + mLoadingView.setVisibility(View.INVISIBLE); + setupSecurityHoldView(); + mSecurityHoldView.setVisibility(View.VISIBLE); } private void showEmptyView() { @@ -178,12 +192,19 @@ public final class ConversationListFragment extends Fragment implements mListView.setVisibility(View.INVISIBLE); mEmptyView.setVisibility(View.VISIBLE); mLoadingView.setVisibility(View.INVISIBLE); + mSecurityHoldView.setVisibility(View.INVISIBLE); } private void showLoadingView() { mListView.setVisibility(View.INVISIBLE); mEmptyView.setVisibility(View.INVISIBLE); mLoadingView.setVisibility(View.VISIBLE); + mSecurityHoldView.setVisibility(View.INVISIBLE); + } + + private void setupSecurityHoldView() { + mSecurityHoldText.setText(getString(R.string.security_hold_required_text, + mAccount.getDisplayName())); } private final Runnable mLoadingViewRunnable = new FragmentRunnable("LoadingRunnable", this) { @@ -457,6 +478,10 @@ public final class ConversationListFragment extends Fragment implements public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) { View rootView = inflater.inflate(R.layout.conversation_list, null); mEmptyView = (ConversationListEmptyView) rootView.findViewById(R.id.empty_view); + mSecurityHoldView = rootView.findViewById(R.id.security_hold_view); + mSecurityHoldText = (TextView)rootView.findViewById(R.id.security_hold_text); + mSecurityHoldButton = rootView.findViewById(R.id.security_hold_button); + mSecurityHoldButton.setOnClickListener(this); mLoadingView = rootView.findViewById(R.id.background_view); mLoadingView.setVisibility(View.GONE); mLoadingView.findViewById(R.id.loading_progress).setVisibility(View.VISIBLE); @@ -960,7 +985,9 @@ public final class ConversationListFragment extends Fragment implements // Even though cursor might be empty, the list adapter might have teasers/footers. // So we check the list adapter count if the cursor is fully/partially loaded. - if (mListAdapter.getCount() == 0) { + if (mAccount.securityHold != 0) { + showSecurityHoldView(); + } else if (mListAdapter.getCount() == 0) { showEmptyView(); } else { showListView(); @@ -1245,4 +1272,12 @@ public final class ConversationListFragment extends Fragment implements mListView.setNextFocusRightId(mNextFocusStartId); } } + + public void onClick(View view) { + if (view == mSecurityHoldButton) { + final String accountSecurityUri = mAccount.accountSecurityUri; + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(accountSecurityUri)); + startActivity(intent); + } + } } |