summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Hibdon <mhibdon@google.com>2014-09-11 16:07:18 -0700
committerMartin Hibdon <mhibdon@google.com>2014-09-12 15:08:36 -0700
commit469817c69011b108f953ada64bf10eaf7dd31341 (patch)
tree01a440b332e036169821a75cf074ec1fdc93c6e3
parentf50fe88e49b0479b336f155db55714a75cc82504 (diff)
downloadandroid_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.pngbin0 -> 4101 bytes
-rw-r--r--res/drawable-mdpi/ic_warning_56dp.pngbin0 -> 3759 bytes
-rw-r--r--res/drawable-xhdpi/ic_warning_56dp.pngbin0 -> 4807 bytes
-rw-r--r--res/drawable-xxhdpi/ic_warning_56dp.pngbin0 -> 5552 bytes
-rw-r--r--res/layout/conversation_list.xml2
-rw-r--r--res/layout/security_hold_view.xml56
-rw-r--r--res/values/dimen.xml2
-rw-r--r--res/values/strings.xml6
-rw-r--r--src/com/android/mail/providers/Account.java33
-rw-r--r--src/com/android/mail/providers/UIProvider.java10
-rw-r--r--src/com/android/mail/ui/ConversationListFragment.java39
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
new file mode 100644
index 000000000..20a20e377
--- /dev/null
+++ b/res/drawable-hdpi/ic_warning_56dp.png
Binary files differ
diff --git a/res/drawable-mdpi/ic_warning_56dp.png b/res/drawable-mdpi/ic_warning_56dp.png
new file mode 100644
index 000000000..64799944d
--- /dev/null
+++ b/res/drawable-mdpi/ic_warning_56dp.png
Binary files differ
diff --git a/res/drawable-xhdpi/ic_warning_56dp.png b/res/drawable-xhdpi/ic_warning_56dp.png
new file mode 100644
index 000000000..e2000ee51
--- /dev/null
+++ b/res/drawable-xhdpi/ic_warning_56dp.png
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_warning_56dp.png b/res/drawable-xxhdpi/ic_warning_56dp.png
new file mode 100644
index 000000000..85db289bf
--- /dev/null
+++ b/res/drawable-xxhdpi/ic_warning_56dp.png
Binary files differ
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);
+ }
+ }
}