Store the "Show pictures" state on rotation

Keep track of whether the user has selected "Show pictures" so that
we don't prompt them again if they rotate the device.

Bug: 7255132
Change-Id: I7109465e79a7a0d6c126dcf3cef614eae8cb81f8
diff --git a/src/com/android/mail/browse/ConversationViewAdapter.java b/src/com/android/mail/browse/ConversationViewAdapter.java
index d28467f..45fe0c8 100644
--- a/src/com/android/mail/browse/ConversationViewAdapter.java
+++ b/src/com/android/mail/browse/ConversationViewAdapter.java
@@ -128,15 +128,17 @@
         // view state variables
         private boolean mExpanded;
         public boolean detailsExpanded;
+        private boolean mShowImages;
 
         // cached values to speed up re-rendering during view recycling
         public CharSequence timestampShort;
         public CharSequence timestampLong;
         public CharSequence recipientSummaryText;
 
-        MessageHeaderItem(ConversationMessage message, boolean expanded) {
+        MessageHeaderItem(ConversationMessage message, boolean expanded, boolean showImages) {
             mMessage = message;
             mExpanded = expanded;
+            mShowImages = showImages;
 
             detailsExpanded = false;
         }
@@ -187,6 +189,14 @@
             }
         }
 
+        public boolean getShowImages() {
+            return mShowImages;
+        }
+
+        public void setShowImages(boolean showImages) {
+            mShowImages = showImages;
+        }
+
         @Override
         public boolean canBecomeSnapHeader() {
             return isExpanded();
@@ -392,16 +402,17 @@
         return addItem(new ConversationHeaderItem(conv));
     }
 
-    public int addMessageHeader(ConversationMessage msg, boolean expanded) {
-        return addItem(new MessageHeaderItem(msg, expanded));
+    public int addMessageHeader(ConversationMessage msg, boolean expanded, boolean showImages) {
+        return addItem(new MessageHeaderItem(msg, expanded, showImages));
     }
 
     public int addMessageFooter(MessageHeaderItem headerItem) {
         return addItem(new MessageFooterItem(headerItem));
     }
 
-    public MessageHeaderItem newMessageHeaderItem(ConversationMessage message, boolean expanded) {
-        return new MessageHeaderItem(message, expanded);
+    public MessageHeaderItem newMessageHeaderItem(ConversationMessage message, boolean expanded,
+            boolean showImages) {
+        return new MessageHeaderItem(message, expanded, showImages);
     }
 
     public MessageFooterItem newMessageFooterItem(MessageHeaderItem headerItem) {
diff --git a/src/com/android/mail/browse/MessageHeaderView.java b/src/com/android/mail/browse/MessageHeaderView.java
index 6ee746d..b94c75f 100644
--- a/src/com/android/mail/browse/MessageHeaderView.java
+++ b/src/com/android/mail/browse/MessageHeaderView.java
@@ -562,6 +562,13 @@
         }
     }
 
+    private void setShowImages(final boolean showImages) {
+        // use View's 'show images' flag to store whether we are currently displaying images
+        if (mMessageHeaderItem != null) {
+            mMessageHeaderItem.setShowImages(showImages);
+        }
+    }
+
     /**
      * Update the visibility of the many child views based on expanded/collapsed
      * and draft/normal state.
@@ -958,7 +965,11 @@
                 showSpamWarning();
             }
             if (mShowImagePrompt) {
-                showImagePrompt();
+                if (mMessageHeaderItem.getShowImages()) {
+                    showImagePromptAlways(true);
+                } else {
+                    showImagePromptOnce();
+                }
             } else {
                 hideShowImagePrompt();
             }
@@ -1011,7 +1022,7 @@
         }
     }
 
-    private void showImagePrompt() {
+    private void showImagePromptOnce() {
         if (mImagePromptView == null) {
             ViewGroup v = (ViewGroup) mInflater.inflate(R.layout.conversation_message_show_pics,
                     this, false);
@@ -1024,6 +1035,33 @@
         mImagePromptView.setVisibility(VISIBLE);
     }
 
+    /**
+     * Shows the "Always show pictures" message
+     *
+     * @param initialShowing <code>true</code> if this is the first time we are showing the prompt
+     *        for "show images", <code>false</code> if we are transitioning from "Show pictures"
+     */
+    private void showImagePromptAlways(final boolean initialShowing) {
+        if (initialShowing) {
+            // Initialize the view
+            showImagePromptOnce();
+        }
+
+        ImageView descriptionViewIcon =
+                (ImageView) mImagePromptView.findViewById(R.id.show_pictures_icon);
+        descriptionViewIcon.setContentDescription(
+                getResources().getString(R.string.always_show_images));
+        TextView descriptionView =
+                (TextView) mImagePromptView.findViewById(R.id.show_pictures_text);
+        descriptionView.setText(R.string.always_show_images);
+        mImagePromptView.setTag(SHOW_IMAGE_PROMPT_ALWAYS);
+
+        if (!initialShowing) {
+            // the new text's line count may differ, so update the spacer height
+            updateSpacerHeight();
+        }
+    }
+
     private void hideSpamWarning() {
         if (mSpamWarningView != null) {
             mSpamWarningView.setVisibility(GONE);
@@ -1050,14 +1088,7 @@
                 if (mCallbacks != null) {
                     mCallbacks.showExternalResources(mMessage);
                 }
-                ImageView descriptionViewIcon = (ImageView) v.findViewById(R.id.show_pictures_icon);
-                descriptionViewIcon.setContentDescription(getResources().getString(
-                        R.string.always_show_images));
-                TextView descriptionView = (TextView) v.findViewById(R.id.show_pictures_text);
-                descriptionView.setText(R.string.always_show_images);
-                v.setTag(SHOW_IMAGE_PROMPT_ALWAYS);
-                // the new text's line count may differ, so update the spacer height
-                updateSpacerHeight();
+                showImagePromptAlways(false);
                 break;
             case SHOW_IMAGE_PROMPT_ALWAYS:
                 mMessage.markAlwaysShowImages(getQueryHandler(), 0 /* token */, null /* cookie */);
diff --git a/src/com/android/mail/browse/SecureConversationViewFragment.java b/src/com/android/mail/browse/SecureConversationViewFragment.java
index 7f70ba6..5c765d7 100644
--- a/src/com/android/mail/browse/SecureConversationViewFragment.java
+++ b/src/com/android/mail/browse/SecureConversationViewFragment.java
@@ -228,7 +228,8 @@
             mWebView.loadDataWithBaseURL(mBaseUri, convHtml.toString(), "text/html", "utf-8", null);
             ConversationViewAdapter mAdapter = new ConversationViewAdapter(mActivity, null, null,
                     null, null, null, null, null, null);
-            MessageHeaderItem item = mAdapter.newMessageHeaderItem(mMessage, true);
+            MessageHeaderItem item = mAdapter.newMessageHeaderItem(mMessage, true,
+                    mMessage.alwaysShowImages);
             mMessageHeaderView.initialize(mDateBuilder, this, mAddressCache);
             mMessageHeaderView.setExpandMode(MessageHeaderView.POPUP_MODE);
             mMessageHeaderView.bind(item, false);
diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java
index d6cbe43..fa48b1c 100644
--- a/src/com/android/mail/ui/ConversationViewFragment.java
+++ b/src/com/android/mail/ui/ConversationViewFragment.java
@@ -609,8 +609,8 @@
         while (messageCursor.moveToPosition(++pos)) {
             final ConversationMessage msg = messageCursor.getMessage();
 
-            // TODO: save/restore 'show pics' state
-            final boolean safeForImages = msg.alwaysShowImages /* || savedStateSaysSafe */;
+            final boolean safeForImages =
+                    msg.alwaysShowImages || prevState.getShouldShowImages(msg);
             allowNetworkImages |= safeForImages;
 
             final Integer savedExpanded = prevState.getExpansionState(msg);
@@ -628,6 +628,7 @@
                 expandedState = (!msg.read || msg.starred || messageCursor.isLast()) ?
                         ExpansionState.EXPANDED : ExpansionState.SUPER_COLLAPSED;
             }
+            mViewState.setShouldShowImages(msg, prevState.getShouldShowImages(msg));
             mViewState.setExpansionState(msg, expandedState);
 
             // save off "read" state from the cursor
@@ -685,7 +686,8 @@
 
     private void renderMessage(ConversationMessage msg, boolean expanded,
             boolean safeForImages) {
-        final int headerPos = mAdapter.addMessageHeader(msg, expanded);
+        final int headerPos = mAdapter.addMessageHeader(msg, expanded,
+                mViewState.getShouldShowImages(msg));
         final MessageHeaderItem headerItem = (MessageHeaderItem) mAdapter.getItem(headerPos);
 
         final int footerPos = mAdapter.addMessageFooter(headerItem);
@@ -713,7 +715,7 @@
             cursor.moveToPosition(i);
             final ConversationMessage msg = cursor.getMessage();
             final MessageHeaderItem header = mAdapter.newMessageHeaderItem(msg,
-                    false /* expanded */);
+                    false /* expanded */, mViewState.getShouldShowImages(msg));
             final MessageFooterItem footer = mAdapter.newMessageFooterItem(header);
 
             final int headerPx = measureOverlayHeight(header);
@@ -815,6 +817,7 @@
 
     @Override
     public void showExternalResources(Message msg) {
+        mViewState.setShouldShowImages(msg, true);
         mWebView.getSettings().setBlockNetworkImage(false);
         mWebView.loadUrl("javascript:unblockImages('" + mTemplates.getMessageDomId(msg) + "');");
     }
diff --git a/src/com/android/mail/ui/ConversationViewState.java b/src/com/android/mail/ui/ConversationViewState.java
index b6cc288..76dcbdc 100644
--- a/src/com/android/mail/ui/ConversationViewState.java
+++ b/src/com/android/mail/ui/ConversationViewState.java
@@ -81,6 +81,20 @@
         mMessageViewStates.put(m.uri, mvs);
     }
 
+    public boolean getShouldShowImages(Message m) {
+        final MessageViewState mvs = mMessageViewStates.get(m.uri);
+        return (mvs != null && mvs.showImages);
+    }
+
+    public void setShouldShowImages(Message m, boolean showImages) {
+        MessageViewState mvs = mMessageViewStates.get(m.uri);
+        if (mvs == null) {
+            mvs = new MessageViewState();
+        }
+        mvs.showImages = showImages;
+        mMessageViewStates.put(m.uri, mvs);
+    }
+
     /**
      * Returns the expansion state of a message in a conversation view.
      *
@@ -180,6 +194,7 @@
          *
          */
         public Integer expansionState;
+        public boolean showImages;
 
         public MessageViewState() {}
 
@@ -192,12 +207,14 @@
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeInt(read ? 1 : 0);
             dest.writeInt(expansionState == null ? -1 : expansionState.intValue());
+            dest.writeInt(showImages ? 1 : 0);
         }
 
         private MessageViewState(Parcel source) {
             read = (source.readInt() != 0);
             final int expandedVal = source.readInt();
             expansionState = (expandedVal == -1) ? null : expandedVal;
+            showImages = (source.readInt() != 0);
         }
 
         @SuppressWarnings("hiding")