Home | History | Annotate | Download | only in browse
      1 package com.android.mail.browse;
      2 
      3 import android.content.Context;
      4 import android.util.AttributeSet;
      5 import android.view.View;
      6 import android.view.ViewGroup;
      7 import android.widget.LinearLayout;
      8 
      9 import com.android.mail.R;
     10 import com.android.mail.browse.ConversationViewAdapter.ConversationFooterItem;
     11 import com.android.mail.browse.ConversationViewAdapter.MessageHeaderItem;
     12 import com.android.mail.compose.ComposeActivity;
     13 import com.android.mail.providers.Account;
     14 import com.android.mail.providers.Message;
     15 import com.android.mail.utils.LogTag;
     16 import com.android.mail.utils.LogUtils;
     17 import com.android.mail.utils.Utils;
     18 
     19 /**
     20  * A view placed at the bottom of the conversation view that allows the user to
     21  * reply/reply all/forward to the last message in the conversation.
     22  */
     23 public class ConversationFooterView extends LinearLayout implements View.OnClickListener {
     24 
     25     public interface ConversationFooterCallbacks {
     26         /**
     27          * Called when the height of the {@link ConversationFooterView} changes.
     28          *
     29          * @param newHeight the new height in px
     30          */
     31         void onConversationFooterHeightChange(int newHeight);
     32     }
     33     private static final String LOG_TAG = LogTag.getLogTag();
     34 
     35     private ConversationFooterItem mFooterItem;
     36     private ConversationAccountController mAccountController;
     37     private ConversationFooterCallbacks mCallbacks;
     38 
     39     private View mFooterButtons;
     40 
     41     public ConversationFooterView(Context context) {
     42         super(context);
     43     }
     44 
     45     public ConversationFooterView(Context context, AttributeSet attrs) {
     46         super(context, attrs);
     47     }
     48 
     49     public ConversationFooterView(Context context, AttributeSet attrs, int defStyle) {
     50         super(context, attrs, defStyle);
     51     }
     52 
     53     @Override
     54     protected void onFinishInflate() {
     55         super.onFinishInflate();
     56 
     57         mFooterButtons = findViewById(R.id.footer_buttons);
     58 
     59         findViewById(R.id.reply_button).setOnClickListener(this);
     60         findViewById(R.id.reply_all_button).setOnClickListener(this);
     61         findViewById(R.id.forward_button).setOnClickListener(this);
     62     }
     63 
     64     @Override
     65     public void onClick(View v) {
     66         if (mFooterItem == null) {
     67             LogUtils.i(LOG_TAG, "ignoring conversation footer tap on unbound view");
     68             return;
     69         }
     70         final MessageHeaderItem headerItem = mFooterItem.getLastMessageHeaderItem();
     71         if (headerItem == null) {
     72             LogUtils.i(LOG_TAG, "ignoring conversation footer tap on null header item");
     73             return;
     74         }
     75         final Message message = headerItem.getMessage();
     76         if (message == null) {
     77             LogUtils.i(LOG_TAG, "ignoring conversation footer tap on null message");
     78             return;
     79         }
     80         final int id = v.getId();
     81         if (id == R.id.reply_button) {
     82             ComposeActivity.reply(getContext(), getAccount(), message);
     83         } else if (id == R.id.reply_all_button) {
     84             ComposeActivity.replyAll(getContext(), getAccount(), message);
     85         } else if (id == R.id.forward_button) {
     86             ComposeActivity.forward(getContext(), getAccount(), message);
     87         }
     88     }
     89 
     90     public void bind(ConversationFooterItem footerItem) {
     91         mFooterItem = footerItem;
     92 
     93         if (mFooterItem == null) {
     94             LogUtils.i(LOG_TAG, "ignoring conversation footer tap on unbound view");
     95             return;
     96         }
     97         final MessageHeaderItem headerItem = mFooterItem.getLastMessageHeaderItem();
     98         if (headerItem == null) {
     99             LogUtils.i(LOG_TAG, "ignoring conversation footer tap on null header item");
    100             return;
    101         }
    102         final Message message = headerItem.getMessage();
    103         if (message == null) {
    104             LogUtils.i(LOG_TAG, "ignoring conversation footer tap on null message");
    105             return;
    106         }
    107 
    108         // hide the footer icons
    109         mFooterButtons.setVisibility(message.isDraft() ? GONE : VISIBLE);
    110     }
    111 
    112     public void rebind(ConversationFooterItem footerItem) {
    113         bind(footerItem);
    114 
    115         if (mFooterItem != null) {
    116             final int h = measureHeight();
    117             if (mFooterItem.setHeight(h)) {
    118                 mCallbacks.onConversationFooterHeightChange(h);
    119             }
    120         }
    121     }
    122 
    123     private int measureHeight() {
    124         ViewGroup parent = (ViewGroup) getParent();
    125         if (parent == null) {
    126             LogUtils.e(LOG_TAG, "Unable to measure height of conversation header");
    127             return getHeight();
    128         }
    129         final int h = Utils.measureViewHeight(this, parent);
    130         return h;
    131     }
    132 
    133     public void setAccountController(ConversationAccountController accountController) {
    134         mAccountController = accountController;
    135     }
    136 
    137     public void setConversationFooterCallbacks(ConversationFooterCallbacks callbacks) {
    138         mCallbacks = callbacks;
    139     }
    140 
    141     private Account getAccount() {
    142         return mAccountController != null ? mAccountController.getAccount() : null;
    143     }
    144 }
    145