package com.fsck.k9.view;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import com.fsck.k9.Account;
import com.fsck.k9.K9;
import com.fsck.k9.R;
import com.fsck.k9.controller.MessagingController;
import com.fsck.k9.controller.MessagingListener;
import com.fsck.k9.crypto.CryptoProvider;
import com.fsck.k9.crypto.PgpData;
import com.fsck.k9.mail.*;
import com.fsck.k9.mail.internet.MimeUtility;
import com.fsck.k9.mail.store.LocalStore;


/**
 */
public class SingleMessageView extends LinearLayout {
    private boolean mScreenReaderEnabled;
    private MessageCryptoView mCryptoView;
    private MessageWebView mMessageContentView;
    private AccessibleWebView mAccessibleMessageContentView;
    private MessageHeader mHeaderContainer;
    private LinearLayout        mAttachments;
    private View mShowPicturesSection;
    private boolean mShowPictures;
    private Button mDownloadRemainder;
    private Activity mActivity;


    public void initialize(Activity activity, Boolean isScreenReaderActive) {
        mMessageContentView = (MessageWebView) findViewById(R.id.message_content);
        mAccessibleMessageContentView = (AccessibleWebView) findViewById(R.id.accessible_message_content);
        mAttachments = (LinearLayout) findViewById(R.id.attachments);
        mHeaderContainer = (MessageHeader) findViewById(R.id.header_container);
        mCryptoView = (MessageCryptoView) findViewById(R.id.layout_decrypt);
        mCryptoView.setActivity(activity);
        mCryptoView.setupChildViews();
        mShowPicturesSection = findViewById(R.id.show_pictures_section);
        mShowPictures = false;

        mActivity = activity;

        mDownloadRemainder = (Button) findViewById(R.id.download_remainder);
        mMessageContentView.configure();


        mAttachments.setVisibility(View.GONE);
        if (isScreenReaderActive) {
            mAccessibleMessageContentView.setVisibility(View.VISIBLE);
            mMessageContentView.setVisibility(View.GONE);
        } else {
            mAccessibleMessageContentView.setVisibility(View.GONE);
            mMessageContentView.setVisibility(View.VISIBLE);
        }
        mScreenReaderEnabled = isScreenReaderActive;

    }

    public SingleMessageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public boolean showPictures() {
        return mShowPictures;
    }
    public void setShowPictures(Boolean show) {
        mShowPictures = show;
    }

    public void blockNetworkData(Boolean block) {
        mMessageContentView.blockNetworkData(block);
    }

    public Button downloadRemainderButton() {
        return  mDownloadRemainder;
    }

    public void showShowPicturesSection(boolean show) {
        mShowPicturesSection.setVisibility(show ? View.VISIBLE : View.GONE);
    }

    public void setHeaders(final Message message, Account account) {
        try {
            mHeaderContainer.populate(message, account);


        } catch (Exception me) {
            Log.e(K9.LOG_TAG, "setHeaders - error", me);
        }
    }

    public void setShowDownloadButton(Message message) {
        if (message.isSet(Flag.X_DOWNLOADED_FULL)) {
            mDownloadRemainder.setVisibility(View.GONE);
        } else {
            mDownloadRemainder.setEnabled(true);
            mDownloadRemainder.setVisibility(View.VISIBLE);
        }
    }

    public void setOnFlagListener(OnClickListener listener) {
        mHeaderContainer.setOnFlagListener(listener);
    }

    public void showAllHeaders() {
        mHeaderContainer.onShowAdditionalHeaders();
    }

    public boolean additionalHeadersVisible() {
        return mHeaderContainer.additionalHeadersVisible();
    }


    public void loadBodyFromUrl(String url) {
        mMessageContentView.loadUrl(url);
        mCryptoView.hide();

    }

    public void loadBodyFromText(CryptoProvider cryptoProvider, PgpData pgpData, Message message, String emailText, String contentType) {
        if (mScreenReaderEnabled) {
            mAccessibleMessageContentView.loadDataWithBaseURL("http://", emailText, contentType, "utf-8", null);
        } else {
            mMessageContentView.loadDataWithBaseURL("http://", emailText, contentType, "utf-8", null);
            mMessageContentView.scrollTo(0, 0);
        }
        updateCryptoLayout(cryptoProvider, pgpData, message);

    }

    public void updateCryptoLayout(CryptoProvider cp, PgpData pgpData, Message message) {
        mCryptoView.updateLayout(cp, pgpData, message);
    }

    public void setAttachmentsEnabled(boolean enabled) {
        for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) {
            AttachmentView attachment = (AttachmentView) mAttachments.getChildAt(i);
            attachment.viewButton.setEnabled(enabled);
            attachment.downloadButton.setEnabled(enabled);
        }
    }


    public void removeAllAttachments() {
        for (int i = 0, count = mAttachments.getChildCount(); i < count; i++) {
            mAttachments.removeView(mAttachments.getChildAt(i));
        }
    }

    public void renderAttachments(Part part, int depth,

                                  Message message, Account account, MessagingController controller, MessagingListener listener) throws MessagingException {

        if (part.getBody() instanceof Multipart) {
            Multipart mp = (Multipart) part.getBody();
            for (int i = 0; i < mp.getCount(); i++) {
                renderAttachments(mp.getBodyPart(i), depth + 1, message, account, controller, listener);
            }
        } else if (part instanceof LocalStore.LocalAttachmentBodyPart) {
            String contentDisposition = MimeUtility.unfoldAndDecode(part.getDisposition());
            // Inline parts with a content-id are almost certainly components of an HTML message
            // not attachments. Don't show attachment download buttons for them.
            if (contentDisposition != null &&
                    MimeUtility.getHeaderParameter(contentDisposition, null).matches("^(?i:inline)")
                    && part.getHeader("Content-ID") != null) {
                return;
            }
            LayoutInflater inflater = mActivity.getLayoutInflater();
            AttachmentView view = (AttachmentView)inflater.inflate(R.layout.message_view_attachment, null);
            if (view.populateFromPart(part, message, account, controller, listener)) {
                addAttachment(view);
            }
        }
    }


    public void addAttachment(View attachmentView) {
        mAttachments.addView(attachmentView);
        mAttachments.setVisibility(View.VISIBLE);
    }
    public void zoom(KeyEvent event) {
        if (mScreenReaderEnabled) {
            mAccessibleMessageContentView.zoomIn();
        } else {
            if (event.isShiftPressed()) {
                mMessageContentView.zoomIn();
            } else {
                mMessageContentView.zoomOut();
            }
        }
    }
    public void beginSelectingText() {
        mMessageContentView.emulateShiftHeld();
    }


    public void resetView() {

        mMessageContentView.scrollTo(0, 0);
        mHeaderContainer.setVisibility(View.GONE);
        mMessageContentView.clearView();
        mAttachments.removeAllViews();
    }
}

@@ -1140,26 +1140,32 @@
 ate 
-Activity mActivity
+LayoutInflater mInflater
 ;%0A%0A%0A
@@ -1855,24 +1855,24 @@
        m
-Activity
+Inflater
  = activ
@@ -1874,18 +1874,37 @@
 activity
+.getLayoutInflater()
 ;
-%0A
 %0A       
@@ -6396,77 +6396,8 @@
   %7D%0A
-            LayoutInflater inflater = mActivity.getLayoutInflater();%0A
     
@@ -6442,17 +6442,18 @@
 entView)
-i
+mI
 nflater.

use a single layout inflater for loading attachments