wire up snap headers pref

Have conversation view read the initial value upon view creation
and update the value in ConversationContainer via dataset
change, which is triggered by account change (which is triggered
by settings change!).

Bug: 7217360
Change-Id: I55ac947dea692af6ad32995d0970c69dbdf5c2ef
diff --git a/src/com/android/mail/browse/ConversationAccountController.java b/src/com/android/mail/browse/ConversationAccountController.java
new file mode 100644
index 0000000..6a86eb3
--- /dev/null
+++ b/src/com/android/mail/browse/ConversationAccountController.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+package com.android.mail.browse;
+
+import com.android.mail.providers.Account;
+
+public interface ConversationAccountController {
+    Account getAccount();
+}
\ No newline at end of file
diff --git a/src/com/android/mail/browse/ConversationContainer.java b/src/com/android/mail/browse/ConversationContainer.java
index 1319916..504ab9c 100644
--- a/src/com/android/mail/browse/ConversationContainer.java
+++ b/src/com/android/mail/browse/ConversationContainer.java
@@ -18,6 +18,7 @@
 package com.android.mail.browse;
 
 import android.content.Context;
+import android.content.res.Configuration;
 import android.database.DataSetObserver;
 import android.graphics.Canvas;
 import android.util.AttributeSet;
@@ -34,6 +35,7 @@
 
 import com.android.mail.R;
 import com.android.mail.browse.ScrollNotifier.ScrollListener;
+import com.android.mail.providers.UIProvider;
 import com.android.mail.ui.ConversationViewFragment;
 import com.android.mail.utils.DequeMap;
 import com.android.mail.utils.InputSmoother;
@@ -80,6 +82,7 @@
      */
     private static final float SNAP_HEADER_MAX_SCROLL_SPEED = 600f;
 
+    private ConversationAccountController mAccountController;
     private ConversationViewAdapter mOverlayAdapter;
     private OverlayPosition[] mOverlayPositions;
     private ConversationWebView mWebView;
@@ -178,6 +181,8 @@
      */
     private int mSnapIndex;
 
+    private boolean mSnapEnabled;
+
     /**
      * Child views of this container should implement this interface to be notified when they are
      * being detached.
@@ -270,6 +275,12 @@
         return mOverlayAdapter;
     }
 
+    public void setAccountController(ConversationAccountController controller) {
+        mAccountController = controller;
+
+        mSnapEnabled = isSnapEnabled();
+    }
+
     /**
      * Re-bind any existing views that correspond to the given adapter positions.
      *
@@ -305,6 +316,7 @@
         // also unbind the snap header view, so this "reset" causes the snap header to re-create
         // its view, just like all other headers
         mSnapHeader.unbind();
+        mSnapEnabled = isSnapEnabled();
         positionOverlays(0, mOffsetY);
     }
 
@@ -765,10 +777,21 @@
         return view;
     }
 
+    private boolean isSnapEnabled() {
+        if (mAccountController == null || mAccountController.getAccount() == null
+                || mAccountController.getAccount().settings == null) {
+            return true;
+        }
+        final int snap = mAccountController.getAccount().settings.snapHeaders;
+        return snap == UIProvider.SnapHeaderValue.ALWAYS ||
+                (snap == UIProvider.SnapHeaderValue.PORTRAIT_ONLY && getResources()
+                    .getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
+    }
+
     // render and/or re-position snap header
     private void positionSnapHeader(int snapIndex) {
         ConversationOverlayItem snapItem = null;
-        if (snapIndex != -1) {
+        if (mSnapEnabled && snapIndex != -1) {
             final ConversationOverlayItem item = mOverlayAdapter.getItem(snapIndex);
             if (item.canBecomeSnapHeader()) {
                 snapItem = item;
diff --git a/src/com/android/mail/browse/ConversationViewAdapter.java b/src/com/android/mail/browse/ConversationViewAdapter.java
index d28467f..be2ea91 100644
--- a/src/com/android/mail/browse/ConversationViewAdapter.java
+++ b/src/com/android/mail/browse/ConversationViewAdapter.java
@@ -33,7 +33,6 @@
 import com.android.mail.browse.MessageCursor.ConversationMessage;
 import com.android.mail.browse.MessageHeaderView.MessageHeaderViewCallbacks;
 import com.android.mail.browse.SuperCollapsedBlock.OnClickListener;
-import com.android.mail.providers.Account;
 import com.android.mail.providers.Address;
 import com.android.mail.providers.Conversation;
 import com.android.mail.providers.UIProvider;
@@ -78,10 +77,6 @@
     public static final int VIEW_TYPE_SUPER_COLLAPSED_BLOCK = 3;
     public static final int VIEW_TYPE_COUNT = 4;
 
-    public interface ConversationAccountController {
-        Account getAccount();
-    }
-
     public class ConversationHeaderItem extends ConversationOverlayItem {
         public final Conversation mConversation;
 
diff --git a/src/com/android/mail/browse/ConversationViewHeader.java b/src/com/android/mail/browse/ConversationViewHeader.java
index 2bc6dc1..6d37dd0 100644
--- a/src/com/android/mail/browse/ConversationViewHeader.java
+++ b/src/com/android/mail/browse/ConversationViewHeader.java
@@ -32,7 +32,6 @@
 import android.widget.TextView;
 
 import com.android.mail.R;
-import com.android.mail.browse.ConversationViewAdapter.ConversationAccountController;
 import com.android.mail.browse.ConversationViewAdapter.ConversationHeaderItem;
 import com.android.mail.browse.FolderSpan.FolderSpanDimensions;
 import com.android.mail.providers.Conversation;
diff --git a/src/com/android/mail/browse/MessageHeaderView.java b/src/com/android/mail/browse/MessageHeaderView.java
index 6ee746d..15448c9 100644
--- a/src/com/android/mail/browse/MessageHeaderView.java
+++ b/src/com/android/mail/browse/MessageHeaderView.java
@@ -44,7 +44,6 @@
 import com.android.mail.ContactInfoSource;
 import com.android.mail.FormattedDateBuilder;
 import com.android.mail.R;
-import com.android.mail.browse.ConversationViewAdapter.ConversationAccountController;
 import com.android.mail.browse.ConversationViewAdapter.MessageHeaderItem;
 import com.android.mail.browse.MessageCursor.ConversationMessage;
 import com.android.mail.compose.ComposeActivity;
diff --git a/src/com/android/mail/providers/Settings.java b/src/com/android/mail/providers/Settings.java
index e4ba546..74340b8 100644
--- a/src/com/android/mail/providers/Settings.java
+++ b/src/com/android/mail/providers/Settings.java
@@ -395,6 +395,7 @@
                 && mAutoAdvance == that.mAutoAdvance
                 && mTransientAutoAdvance == that.mTransientAutoAdvance
                 && messageTextSize == that.messageTextSize
+                && snapHeaders == that.snapHeaders
                 && replyBehavior == that.replyBehavior
                 && hideCheckboxes == that.hideCheckboxes
                 && confirmDelete == that.confirmDelete
@@ -420,13 +421,12 @@
 
     /**
      * Returns the hash code for this object.
-     * @return
      */
     private final int calculateHashCode() {
         return super.hashCode()
                 ^ Objects.hashCode(signature, mAutoAdvance, mTransientAutoAdvance, messageTextSize,
-                        replyBehavior, hideCheckboxes, confirmDelete, confirmArchive, confirmSend,
-                        defaultInbox, forceReplyFromDefault, maxAttachmentSize, swipe,
+                        snapHeaders, replyBehavior, hideCheckboxes, confirmDelete, confirmArchive,
+                        confirmSend, defaultInbox, forceReplyFromDefault, maxAttachmentSize, swipe,
                         priorityArrowsEnabled, setupIntentUri, conversationViewMode);
     }
 }
diff --git a/src/com/android/mail/ui/AbstractConversationViewFragment.java b/src/com/android/mail/ui/AbstractConversationViewFragment.java
index 4bf6491..2ae6b80 100644
--- a/src/com/android/mail/ui/AbstractConversationViewFragment.java
+++ b/src/com/android/mail/ui/AbstractConversationViewFragment.java
@@ -51,7 +51,7 @@
 import com.android.mail.FormattedDateBuilder;
 import com.android.mail.R;
 import com.android.mail.SenderInfoLoader;
-import com.android.mail.browse.ConversationViewAdapter.ConversationAccountController;
+import com.android.mail.browse.ConversationAccountController;
 import com.android.mail.browse.ConversationViewHeader.ConversationViewHeaderCallbacks;
 import com.android.mail.browse.MessageCursor;
 import com.android.mail.browse.MessageCursor.ConversationController;
diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java
index d6cbe43..d5626ee 100644
--- a/src/com/android/mail/ui/ConversationViewFragment.java
+++ b/src/com/android/mail/ui/ConversationViewFragment.java
@@ -49,7 +49,6 @@
 import com.android.mail.browse.ConversationContainer.OverlayPosition;
 import com.android.mail.browse.ConversationOverlayItem;
 import com.android.mail.browse.ConversationViewAdapter;
-import com.android.mail.browse.ConversationViewAdapter.ConversationAccountController;
 import com.android.mail.browse.ConversationViewAdapter.MessageFooterItem;
 import com.android.mail.browse.ConversationViewAdapter.MessageHeaderItem;
 import com.android.mail.browse.ConversationViewAdapter.SuperCollapsedBlockItem;
@@ -84,10 +83,7 @@
  * The conversation view UI component.
  */
 public final class ConversationViewFragment extends AbstractConversationViewFragment implements
-        MessageHeaderViewCallbacks,
         SuperCollapsedBlock.OnClickListener,
-        ConversationController,
-        ConversationAccountController,
         OnLayoutChangeListener {
 
     private static final String LOG_TAG = LogTag.getLogTag();
@@ -315,6 +311,7 @@
         View rootView = inflater.inflate(R.layout.conversation_view, container, false);
         mConversationContainer = (ConversationContainer) rootView
                 .findViewById(R.id.conversation_container);
+        mConversationContainer.setAccountController(this);
 
         mNewMessageBar = mConversationContainer.findViewById(R.id.new_message_notification_bar);
         mNewMessageBar.setOnClickListener(new View.OnClickListener() {