/*
 * This is the source code of iGap for Android
 * It is licensed under GNU AGPL v3.0
 * You should have received a copy of the license in this archive (see LICENSE).
 * Copyright © 2017 , iGap - www.iGap.net
 * iGap Messenger | Free, Fast and Secure instant messaging application
 * The idea of the RooyeKhat Media Company - www.RooyeKhat.co
 * All rights reserved.
 */

package net.iGap.fragments;

import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.MediaController;
import android.widget.TextView;

import com.afollestad.materialdialogs.MaterialDialog;

import net.iGap.G;
import net.iGap.R;
import net.iGap.helper.HelperCalander;
import net.iGap.helper.HelperDownloadFile;
import net.iGap.helper.HelperSaveFile;
import net.iGap.libs.rippleeffect.RippleView;
import net.iGap.messageprogress.MessageProgress;
import net.iGap.messageprogress.OnProgress;
import net.iGap.module.AndroidUtils;
import net.iGap.module.AppUtils;
import net.iGap.module.DialogAnimation;
import net.iGap.module.EmojiTextViewE;
import net.iGap.module.MaterialDesignTextView;
import net.iGap.module.MusicPlayer;
import net.iGap.module.TouchImageView;
import net.iGap.module.structs.StructMessageInfo;
import net.iGap.module.transition.fragment.ExitFragmentTransition;
import net.iGap.proto.ProtoFileDownload;
import net.iGap.proto.ProtoGlobal;
import net.iGap.realm.RealmAttachment;
import net.iGap.realm.RealmRegisteredInfo;
import net.iGap.realm.RealmRoomMessage;
import net.iGap.realm.RealmRoomMessageFields;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import io.realm.Realm;
import io.realm.RealmResults;
import io.realm.Sort;

import static net.iGap.module.AndroidUtils.suitablePath;

public class FragmentShowImage extends BaseFragment {

    public static ArrayList<String> downloadedList = new ArrayList<>();
    public final String ROOM_ID = "roomId";
    public final String SELECTED_IMAGE = "selectedImage";
    public final String TYPE = "type";
    public View appBarLayout;
    public MediaController videoController;
    public int po;
    private TextView txtImageNumber;
    private TextView txtImageName;
    private TextView txtImageDate;
    private TextView txtImageTime;
    private EmojiTextViewE txtImageDesc;
    private LinearLayout toolbarShowImage;
    private boolean isShowToolbar = true;
    private ViewGroup ltImageName;
    private ViewPager viewPager;
    private boolean isFirstPlay = true;
    private boolean isReadyToPause = true;
    private int selectedFile = 0;
    private AdapterViewPager mAdapter;
    private RealmResults<RealmRoomMessage> mRealmList;
    private ArrayList<RealmRoomMessage> mFList = new ArrayList<>();
    private Long mRoomId;
    private Long selectedFileToken;
    private MediaPlayer mMediaPlayer;
    private String path;
    private String type = null;
    private boolean isLockScreen = false;
    private boolean isFocusable = false;
    private Realm realmShowImage;
    private ViewGroup rooShowImage;
    private ViewGroup mainShowImage;
    private ExitFragmentTransition exitFragmentTransition;
    private TouchImageView touchImageViewTmp = null;
    private int lastOrientation = 0;
    public static FocusAudioListener focusAudioListener;
    private ProtoGlobal.RoomMessageType messageType;
    ArrayList<TextureView> mTextureViewTmp = new ArrayList<>();

    public static FragmentShowImage newInstance() {
        return new FragmentShowImage();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        realmShowImage = Realm.getDefaultInstance();

        //View view = inflater.inflate(R.layout.activity_show_image, container, false);
        //exitFragmentTransition = FragmentTransition.with(this).duration(200).interpolator(new LinearOutSlowInInterpolator()).to(view.findViewById(R.id.asi_view_pager)).start(savedInstanceState);
        //
        //exitFragmentTransition.exitListener(new AnimatorListenerAdapter() {
        //    @Override
        //    public void onAnimationStart(Animator animation) {
        //        Log.d("FFFFFFF", "onAnimationStart: ");
        //    }
        //
        //    @Override
        //    public void onAnimationEnd(Animator animation) {
        //        Log.d("FFFFFFF", "onAnimationEnd: ");
        //    }
        //}).interpolator(new FastOutSlowInInterpolator());
        //exitFragmentTransition.startExitListening(view.findViewById(R.id.rooShowImage));

        return inflater.inflate(R.layout.activity_show_image, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (getIntentData(this.getArguments())) {
            initComponent(view);
        }
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation != lastOrientation) {
            lastOrientation = newConfig.orientation;
            if (touchImageViewTmp != null && videoController != null && mMediaPlayer != null) {
                touchImageViewTmp.setVisibility(View.GONE);
                touchImageViewTmp.setVisibility(View.VISIBLE);
                if (mMediaPlayer.isPlaying()) {
                    videoController.show();
                }

                if (mTextureViewTmp.size() > 0) {
                    getRealSize(mMediaPlayer, mTextureViewTmp.get(0));
                }
            }
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (appBarLayout != null) {
            appBarLayout.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public void onAttach(Context context) {
        if (appBarLayout != null) {
            appBarLayout.setVisibility(View.GONE);
        }
        super.onAttach(context);
    }

    private Realm getRealm() {
        if (realmShowImage == null || !realmShowImage.isClosed()) {
            realmShowImage = Realm.getDefaultInstance();
        }
        return realmShowImage;
    }

    private boolean getIntentData(Bundle bundle) {
        if (G.fragmentActivity != null) {
            G.fragmentActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        }

        if (bundle != null) { // get a list of image
            mRoomId = bundle.getLong("RoomId");
            selectedFileToken = bundle.getLong("SelectedImage");
            if (bundle.getString("TYPE") != null) {
//                type = bundle.getString("TYPE");
                messageType = convertType(bundle.getString("TYPE"));
            }
            if (mRoomId == null) {
                // G.fragmentActivity.getSupportFragmentManager().beginTransaction().remove(FragmentShowImage.this).commit();

                popBackStackFragment();

                return false;
            }

            mRealmList = RealmRoomMessage.findSorted(getRealm(), mRoomId, RealmRoomMessageFields.UPDATE_TIME, Sort.ASCENDING);
            if (mRealmList.size() < 1) {
                popBackStackFragment();
                return false;
            }

            for (RealmRoomMessage roomMessage : mRealmList) {
                if (RealmRoomMessage.isImageOrVideo(roomMessage, convertType(type))) {
                    if ((roomMessage.getForwardMessage() != null ? roomMessage.getForwardMessage().getAttachment() : roomMessage.getAttachment()) != null)
                        mFList.add(roomMessage);
                }
            }

            if (selectedFileToken != null) {
                for (int i = mFList.size() - 1; i >= 0; i--) {
                    if (selectedFileToken == mFList.get(i).getMessageId()) {
                        selectedFile = i;
                        break;
                    }
                }
            }

            return true;
        } else {
            if (G.fragmentActivity != null) {
                popBackStackFragment();
            }
            return false;
        }
    }

    private ProtoGlobal.RoomMessageType convertType(String type) {
        if (type != null) {
            if (type.contains(ProtoGlobal.RoomMessageType.VIDEO.toString())) {
                return ProtoGlobal.RoomMessageType.VIDEO;
            } else if (type.contains(ProtoGlobal.RoomMessageType.IMAGE.toString())) {
                return ProtoGlobal.RoomMessageType.IMAGE;
            }
        }
        return null;
    }

    private void initComponent(View view) {

        downloadedList.clear();

        MaterialDesignTextView btnBack = (MaterialDesignTextView) view.findViewById(R.id.asi_btn_back);
        RippleView rippleBack = (RippleView) view.findViewById(R.id.asi_ripple_back);

        //rippleBack.setOnClickListener(new View.OnClickListener() {
        //    @Override
        //    public void onClick(View v) {
        //
        //        exitFragmentTransition.startButtonExitListening(rooShowImage);
        //
        //    }
        //});

        rippleBack.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {

            @Override
            public void onComplete(RippleView rippleView) {
                G.fragmentActivity.onBackPressed();
            }
        });

        MaterialDesignTextView btnMenu = (MaterialDesignTextView) view.findViewById(R.id.asi_btn_menu);
        RippleView rippleMenu = (RippleView) view.findViewById(R.id.asi_ripple_menu);
        rippleMenu.setOnRippleCompleteListener(new RippleView.OnRippleCompleteListener() {

            @Override
            public void onComplete(RippleView rippleView) {
                popUpMenuShowImage();
            }
        });

        //rooShowImage = (ViewGroup) view.findViewById(R.id.rooShowImage);
        //
        //int colorFrom = getResources().getColor(R.color.transparent);
        //int colorTo = getResources().getColor(R.color.black);
        //ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
        //colorAnimation.setDuration(300); // milliseconds
        //colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        //
        //    @Override
        //    public void onAnimationUpdate(ValueAnimator animator) {
        //        rooShowImage.setBackgroundColor((int) animator.getAnimatedValue());
        //    }
        //
        //});
        //
        //colorAnimation.start();


        viewPager = (ViewPager) view.findViewById(R.id.asi_view_pager);

        txtImageNumber = (TextView) view.findViewById(R.id.asi_txt_image_number);
        ltImageName = (ViewGroup) view.findViewById(R.id.asi_layout_image_name);
        txtImageName = (TextView) view.findViewById(R.id.asi_txt_image_name);
        txtImageDate = (TextView) view.findViewById(R.id.asi_txt_image_date);
        txtImageTime = (TextView) view.findViewById(R.id.asi_txt_image_time);
        txtImageDesc = (EmojiTextViewE) view.findViewById(R.id.asi_txt_image_desc);
        toolbarShowImage = (LinearLayout) view.findViewById(R.id.toolbarShowImage);

        initViewPager();


        focusAudioListener = new FocusAudioListener() {
            @Override
            public void audioPlay(boolean isPlay) {

                if (isPlay) {
                    if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                        mMediaPlayer.pause();
                        isLockScreen = true;
                        isFocusable = true;
                    }
                } else {
                    if (mMediaPlayer != null && isFocusable) {
                        int length = mMediaPlayer.getCurrentPosition();
                        mMediaPlayer.seekTo(length);
                        mMediaPlayer.start();
                        isLockScreen = true;
                        isFocusable = false;

                    }
                }

            }
        };
    }

    //***************************************************************************************

    private void initViewPager() {

        mAdapter = new AdapterViewPager();
        viewPager.setAdapter(mAdapter);

        viewPager.setCurrentItem(selectedFile);

        txtImageNumber.setText(selectedFile + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
        if (HelperCalander.isPersianUnicode) {
            txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
        }
        if (selectedFile >= mFList.size()) {
            return;
        }

        showImageInfo(mFList.get(selectedFile));

        viewPager.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

        viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
            @Override
            public void transformPage(View view, float position) {

                final float normalizedPosition = Math.abs(Math.abs(position) - 1);
                view.setScaleX(normalizedPosition / 2 + 0.5f);
                view.setScaleY(normalizedPosition / 2 + 0.5f);
            }
        });
    }

    /**
     * show image info, time , name , description
     */
    private void showImageInfo(RealmRoomMessage realmRoomMessage) {
        if (realmRoomMessage == null || G.authorHash == null) {
            return;
        }
        RealmRoomMessage realmRoomMessageFinal = RealmRoomMessage.getFinalMessage(realmRoomMessage);

        if (realmRoomMessageFinal.getMessage() != null && !realmRoomMessageFinal.getMessage().isEmpty()) {
            txtImageDesc.setText(realmRoomMessageFinal.getMessage());
            txtImageDesc.setVisibility(View.VISIBLE);
        } else {
            txtImageDesc.setVisibility(View.GONE);
        }

        //+Realm realm = Realm.getDefaultInstance();
        RealmRegisteredInfo realmRegisteredInfo = RealmRegisteredInfo.getRegistrationInfo(getRealm(), realmRoomMessageFinal.getUserId());

        if (realmRegisteredInfo != null) {
            txtImageName.setText(realmRegisteredInfo.getDisplayName());
        } else {
            txtImageName.setText("");
        }

        if (realmRoomMessageFinal.getAuthorHash() != null && G.authorHash.equals(realmRoomMessageFinal.getAuthorHash())) {

            txtImageName.setText(R.string.you);
        }

        if (realmRoomMessageFinal.getUpdateTime() != 0) {
            txtImageTime.setText(HelperCalander.getClocktime(realmRoomMessageFinal.getUpdateTime(), true));
            txtImageDate.setText(HelperCalander.checkHijriAndReturnTime(realmRoomMessageFinal.getUpdateTime() / 1000));
        }

        if (HelperCalander.isPersianUnicode) {
            txtImageName.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageName.getText().toString()));
            txtImageTime.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageTime.getText().toString()));
            txtImageDate.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageDate.getText().toString()));
        }

        //realm.close();

    }

    public void popUpMenuShowImage() {

        final MaterialDialog dialog = new MaterialDialog.Builder(G.fragmentActivity).customView(R.layout.chat_popup_dialog_custom, true).build();
        View v = dialog.getCustomView();

        DialogAnimation.animationUp(dialog);
        dialog.show();

        ViewGroup root1 = (ViewGroup) v.findViewById(R.id.dialog_root_item1_notification);
        ViewGroup root2 = (ViewGroup) v.findViewById(R.id.dialog_root_item2_notification);

        final TextView txtShare = (TextView) v.findViewById(R.id.dialog_text_item1_notification);
        TextView txtSaveToGallery = (TextView) v.findViewById(R.id.dialog_text_item2_notification);

        TextView iconSaveToGallery = (TextView) v.findViewById(R.id.dialog_icon_item1_notification);
        iconSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.md_save));

        root1.setVisibility(View.VISIBLE);
        root2.setVisibility(View.VISIBLE);

        txtShare.setText(getResources().getString(R.string.save_to_gallery));
        if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
            txtSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.share_video_file_2));
        } else {
            txtSaveToGallery.setText(G.fragmentActivity.getResources().getString(R.string.share_image_2));
        }


        TextView iconShare = (TextView) v.findViewById(R.id.dialog_icon_item2_notification);
        iconShare.setText(G.fragmentActivity.getResources().getString(R.string.md_share_button));

        root1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialog.dismiss();
                saveToGallery();
            }
        });

        root2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
                shareImage();
            }
        });

    }

    /**
     * share Image and video
     */
    private void shareImage() {

        RealmRoomMessage roomMessage = mFList.get(viewPager.getCurrentItem());

        if (roomMessage != null) {
            roomMessage = RealmRoomMessage.getFinalMessage(roomMessage);
            String path = getFilePath(viewPager.getCurrentItem());
            File file = new File(path);
            if (file.exists()) {
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("image/*");
                //+Realm realm = Realm.getDefaultInstance();
                AppUtils.shareItem(intent, StructMessageInfo.convert(getRealm(), roomMessage));
                //putExtra(intent, StructMessageInfo.convert(getRealm(), roomMessage));
                startActivity(Intent.createChooser(intent, G.fragmentActivity.getResources().getString(R.string.share_image_from_igap)));
            }
        }
    }


    /**
     * share Image and video
     */
    private void saveToGallery() {
        RealmRoomMessage rm = mFList.get(viewPager.getCurrentItem());
        if (rm != null) {
            String path = getFilePath(viewPager.getCurrentItem());
            ProtoGlobal.RoomMessageType messageType;
            if (rm.getForwardMessage() != null) {
                messageType = rm.getForwardMessage().getMessageType();
            } else {
                messageType = rm.getMessageType();
            }
            File file = new File(path);
            if (file.exists()) {
                if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
                    HelperSaveFile.saveFileToDownLoadFolder(path, "VIDEO_" + System.currentTimeMillis() + ".mp4", HelperSaveFile.FolderType.video, R.string.file_save_to_video_folder);
                } else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                    HelperSaveFile.savePicToGallery(path, true);
                }
            }
        }
    }

    public String getFilePath(int position) {

        String result = "";

        RealmAttachment at = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment() : mFList.get(position).getAttachment();

        if (at != null) {
            if (at.getLocalFilePath() != null) result = at.getLocalFilePath();
        }

        ProtoGlobal.RoomMessageType messageType = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getMessageType() : mFList.get(position).getMessageType();

        if (result.length() < 1) {
            result = AndroidUtils.getFilePathWithCashId(at.getCacheId(), at.getName(), messageType);
        }

        return result;
    }

    public String getThumbnailPath(RealmRoomMessage roomMessage) {

        String result = "";

        if (roomMessage == null) {
            return "";
        }

        if (roomMessage.getAttachment() != null) {
            if (roomMessage.getAttachment().getLocalThumbnailPath() != null) {
                result = roomMessage.getAttachment().getLocalThumbnailPath();
            }

            if (result.length() < 1) {
                result = AndroidUtils.getFilePathWithCashId(roomMessage.getAttachment().getCacheId(), roomMessage.getAttachment().getName(), G.DIR_TEMP, true);
            }
        }

        return result;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        if (videoController != null) {
            videoController.hide();
            videoController = null;
        }

        if (realmShowImage != null && !realmShowImage.isClosed()) {
            realmShowImage.close();
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        if (mMediaPlayer != null) {
            mMediaPlayer.stop();
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
        if (videoController != null) {
            videoController.hide();
            videoController = null;
        }

        focusAudioListener = null;
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
            isLockScreen = true;
        }
        if (videoController != null && videoController.isShowing()) {
            videoController.hide();
        }
    }

    @Override
    public void onResume() {
        super.onResume();

        if (isLockScreen) {
            if (videoController != null) {
                videoController.show();
            }
        }
    }

    /**
     * adapter for view pager
     */
    private class AdapterViewPager extends PagerAdapter implements MediaController.MediaPlayerControl {

        private String videoPath;
        private int lastPosition;

        @Override
        public int getCount() {
            return mFList.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view.equals(object);
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {

            LayoutInflater inflater = LayoutInflater.from(G.fragmentActivity);
            ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.show_image_sub_layout, (ViewGroup) container, false);
            final TextureView mTextureView = (TextureView) layout.findViewById(R.id.textureView);
            final ImageView imgPlay = (ImageView) layout.findViewById(R.id.imgPlay);
            final TouchImageView touchImageView = (TouchImageView) layout.findViewById(R.id.sisl_touch_image_view);

            FrameLayout frameLayout = (FrameLayout) layout.findViewById(R.id.Layout_showImage);
            frameLayout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    touchImageView.performClick();
                }
            });

            final MessageProgress progress = (MessageProgress) layout.findViewById(R.id.progress);
            AppUtils.setProgresColor(progress.progressBar);

            final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));

            if (rm != null && rm.isValid()) {
                if (HelperDownloadFile.getInstance().isDownLoading(rm.getAttachment().getCacheId())) {
                    progress.withDrawable(R.drawable.ic_cancel, true);
                    startDownload(position, progress, touchImageView, imgPlay, mTextureView);
                } else {
                    progress.withDrawable(R.drawable.ic_download, true);
                }

                path = getFilePath(position);
                File file = new File(path);
                if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
                    mMediaPlayer.pause();
                    mMediaPlayer.seekTo(0);
                    if (videoController != null) videoController.hide();
                }
                if (file.exists()) {
                    progress.setVisibility(View.GONE);
                    G.imageLoader.displayImage(suitablePath(path), touchImageView);
                    if (rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || rm.getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                        touchImageView.setVisibility(View.VISIBLE);
                        imgPlay.setVisibility(View.GONE);
                        isFirstPlay = false;
                    } else {
                        if (isFirstPlay) {
                            mTextureView.setVisibility(View.VISIBLE);

                            G.handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    playVideo(position, mTextureView, imgPlay, touchImageView);
                                }
                            }, 100);
                            isFirstPlay = false;
                        }
                        imgPlay.setVisibility(View.VISIBLE);
                        mTextureView.setVisibility(View.INVISIBLE);
                        videoPath = path;
                    }
                } else {
                    imgPlay.setVisibility(View.GONE);
                    path = getThumbnailPath(rm);
                    touchImageView.setVisibility(View.VISIBLE);
                    file = new File(path);
                    if (file.exists()) {
                        G.imageLoader.displayImage(suitablePath(path), touchImageView);
                    } else if (rm.getAttachment() != null) {
                        // if thumpnail not exist download it
                        ProtoFileDownload.FileDownload.Selector selector = null;
                        long fileSize = 0;

                        if (rm.getAttachment().getSmallThumbnail() != null) {
                            selector = ProtoFileDownload.FileDownload.Selector.SMALL_THUMBNAIL;
                            fileSize = rm.getAttachment().getSmallThumbnail().getSize();
                        } else if (rm.getAttachment().getLargeThumbnail() != null) {
                            selector = ProtoFileDownload.FileDownload.Selector.LARGE_THUMBNAIL;
                            fileSize = rm.getAttachment().getLargeThumbnail().getSize();
                        }

                        final String filePathTumpnail = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), G.DIR_TEMP, true);

                        if (selector != null && fileSize > 0) {
                            HelperDownloadFile.getInstance().startDownload(rm.getMessageType(),System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), fileSize, selector, "", 4, new HelperDownloadFile.UpdateListener() {
                                @Override
                                public void OnProgress(final String path, int progress) {

                                    if (progress == 100) {

                                        G.currentActivity.runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {
                                                G.imageLoader.displayImage(AndroidUtils.suitablePath(path), touchImageView);
                                            }
                                        });
                                    }
                                }

                                @Override
                                public void OnError(String token) {

                                }
                            });
                        }
                    }
                }
            }

            progress.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    String _cashID = mFList.get(position).getForwardMessage() != null ? mFList.get(position).getForwardMessage().getAttachment().getCacheId() : mFList.get(position).getAttachment().getCacheId();

                    if (HelperDownloadFile.getInstance().isDownLoading(_cashID)) {
                        HelperDownloadFile.getInstance().stopDownLoad(_cashID);
                    } else {
                        progress.withDrawable(R.drawable.ic_cancel, true);
                        startDownload(position, progress, touchImageView, imgPlay, mTextureView);
                    }
                }
            });

            touchImageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (isShowToolbar) {
                        toolbarShowImage.animate().setDuration(150).alpha(0F).start();
                        ltImageName.setVisibility(View.GONE);
                        ltImageName.animate().setDuration(150).alpha(0F).start();
                        toolbarShowImage.setVisibility(View.GONE);
                        isShowToolbar = false;
                    } else {
                        toolbarShowImage.animate().setDuration(150).alpha(1F).start();
                        toolbarShowImage.setVisibility(View.VISIBLE);
                        ltImageName.animate().setDuration(150).alpha(1F).start();
                        ltImageName.setVisibility(View.VISIBLE);
                        isShowToolbar = true;
                    }

                    if (touchImageViewTmp != null && imgPlay.getVisibility() != View.VISIBLE && mMediaPlayer != null && videoController != null) {
                        if (videoController.isShowing()) {
                            videoController.hide();
                        } else {
                            videoController.show();
                        }
                    }
                }
            });

            imgPlay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    mTextureView.setVisibility(View.VISIBLE);
                    playVideo(position, mTextureView, imgPlay, touchImageView);
                }
            });

            mTextureView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    touchImageView.performClick();
                }
            });
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(final int position, float positionOffset, int positionOffsetPixels) {

                    if (isFirstPlay) {
                        if (mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE || mFList.get(position).getMessageType() == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                            isFirstPlay = false;
                        }
                    }
                }

                @Override
                public void onPageSelected(final int position) {

                    touchImageViewTmp = null;

                    txtImageNumber.setText(position + 1 + " " + G.fragmentActivity.getResources().getString(R.string.of) + " " + mFList.size());
                    if (HelperCalander.isPersianUnicode) {
                        txtImageNumber.setText(HelperCalander.convertToUnicodeFarsiNumber(txtImageNumber.getText().toString()));
                    }
                    showImageInfo(mFList.get(position));

                    if (mFList.get(position).getForwardMessage() != null) {
                        messageType = mFList.get(position).getForwardMessage().getMessageType();
                    } else {
                        messageType = mFList.get(position).getMessageType();
                    }

                    if (mMediaPlayer != null && mMediaPlayer.isPlaying()) mMediaPlayer.stop();
                    if (messageType == ProtoGlobal.RoomMessageType.VIDEO || messageType == ProtoGlobal.RoomMessageType.VIDEO_TEXT) {
                        File f = new File(getFilePath(position));
                        if (f.exists()) {
                            imgPlay.setVisibility(View.VISIBLE);
                            touchImageView.setVisibility(View.VISIBLE);
                        } else {
                            imgPlay.setVisibility(View.GONE);
                        }
                    } else if (messageType == ProtoGlobal.RoomMessageType.IMAGE || messageType == ProtoGlobal.RoomMessageType.IMAGE_TEXT) {
                        imgPlay.setVisibility(View.GONE);
                    }
                    if (videoController != null) {
                        videoController.hide();
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {
                }
            });

            ((ViewGroup) container).addView(layout);
            return layout;
        }

        /**
         * start download
         */
        private void startDownload(final int position, final MessageProgress progress, final TouchImageView touchImageView, final ImageView imgPlay, final TextureView mTextureView) {

            final RealmRoomMessage rm = RealmRoomMessage.getFinalMessage(mFList.get(position));

            String dirPath = AndroidUtils.getFilePathWithCashId(rm.getAttachment().getCacheId(), rm.getAttachment().getName(), rm.getMessageType());

            if (downloadedList.indexOf(rm.getAttachment().getToken()) == -1) {
                downloadedList.add(rm.getAttachment().getCacheId());
            }


            progress.withOnProgress(new OnProgress() {
                @Override
                public void onProgressFinished() {
                    G.currentActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progress.withProgress(0);
                            progress.setVisibility(View.GONE);
                            if (rm.getMessageType() == ProtoGlobal.RoomMessageType.VIDEO) {
                                imgPlay.setVisibility(View.VISIBLE);
                                //if (position == viewPager.getCurrentItem()) playVideo(position, mTextureView, imgPlay, touchImageView);
                            }
                        }
                    });
                }
            });


            HelperDownloadFile.getInstance().startDownload(rm.getMessageType(),System.currentTimeMillis() + "", rm.getAttachment().getToken(), rm.getAttachment().getUrl(), rm.getAttachment().getCacheId(), rm.getAttachment().getName(), rm.getAttachment().getSize(), ProtoFileDownload.FileDownload.Selector.FILE, dirPath, 4, new HelperDownloadFile.UpdateListener() {
                @Override
                public void OnProgress(final String path, final int progres) {
                    G.currentActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progress.withProgress(progres);
                            if (progres == 100) {
                                G.imageLoader.displayImage(AndroidUtils.suitablePath(path), touchImageView);
                            }
                        }
                    });

                }

                @Override
                public void OnError(String token) {
                    G.currentActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progress.withProgress(0);
                            progress.withDrawable(R.drawable.ic_download, true);
                        }
                    });

                }
            });
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        /**
         * video player
         */
        private void playVideo(final int position, final TextureView mTextureView, final ImageView imgPlay, final TouchImageView touchImageView) {

            touchImageViewTmp = touchImageView;
            if (mMediaPlayer == null) mMediaPlayer = new MediaPlayer();
            if (videoController == null) videoController = new MediaController(G.fragmentActivity);
            mTextureView.setVisibility(View.VISIBLE);

            videoPath = getFilePath(position);
            ViewCompat.setLayoutDirection(videoController, View.LAYOUT_DIRECTION_LTR);
            videoController.setAnchorView(touchImageView);
            videoController.setMediaPlayer(this);
            imgPlay.setVisibility(View.GONE);
            mMediaPlayer.reset();

            mTextureViewTmp.clear();
            mTextureViewTmp.add(mTextureView);

            try {
                mMediaPlayer.setDataSource(G.fragmentActivity, Uri.parse(videoPath));
                mTextureView.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
                    @Override
                    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                        setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, touchImageView);
                    }

                    @Override
                    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
                        Log.e("ddd", "width  :" + width + "    height  : " + height);
                    }

                    @Override
                    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {

                        return false;
                    }

                    @Override
                    public void onSurfaceTextureUpdated(SurfaceTexture surface) {

                    }
                });
                if (mTextureView.getSurfaceTexture() != null) {
                    setMediaPlayer(mMediaPlayer, mTextureView, imgPlay, touchImageView);
                }
            } catch (IOException | IllegalArgumentException e) {
                e.printStackTrace();
            }

            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    mp.seekTo(0);
                    imgPlay.setVisibility(View.VISIBLE);
                }
            });

            //mMediaPlayer.seekTo(100);
        }

        private void setMediaPlayer(MediaPlayer mMediaPlayer, final TextureView mTextureView, final ImageView imgPlay, final TouchImageView touchImageView) {

            if (mTextureView == null) {
                return;
            }
            Surface surfaceTexture = new Surface(mTextureView.getSurfaceTexture());

            if (surfaceTexture == null) {
                return;
            }

            try {
                if (mMediaPlayer != null) {
                    mMediaPlayer.setSurface(surfaceTexture);
                    mMediaPlayer.setLooping(false);
                    mMediaPlayer.prepareAsync();
                }
            } catch (IllegalStateException e) {
                e.getMessage();
            }


            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {

                    getRealSize(mp, mTextureView);
                    imgPlay.setVisibility(View.GONE);
                    mp.start();
                    MusicPlayer.pauseSound();
                    mTextureView.setVisibility(View.VISIBLE);
                    touchImageView.animate().setDuration(700).alpha(0F).start();

                    G.handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            touchImageView.setVisibility(View.GONE);
                            touchImageView.clearAnimation();
                        }
                    }, 700);

                    videoController.setEnabled(true);
                    videoController.show();
                }
            });

        }


        @Override
        public void start() {
            if (mMediaPlayer != null) mMediaPlayer.start();
            MusicPlayer.pauseSound();
        }

        @Override
        public void pause() {
            if (mMediaPlayer != null) mMediaPlayer.pause();
        }

        @Override
        public int getDuration() {
            if (mMediaPlayer != null) {
                return mMediaPlayer.getDuration();
            }
            return 0;
        }

        @Override
        public int getCurrentPosition() {
            if (mMediaPlayer != null) {
                return mMediaPlayer.getCurrentPosition();
            }
            return 0;
        }

        @Override
        public void seekTo(int pos) {
            if (mMediaPlayer != null) mMediaPlayer.seekTo(pos);
        }

        @Override
        public boolean isPlaying() {
            return mMediaPlayer != null && mMediaPlayer.isPlaying();
        }

        @Override
        public int getBufferPercentage() {
            return 0;
        }

        @Override
        public boolean canPause() {
            return true;
        }

        @Override
        public boolean canSeekBackward() {
            return true;
        }

        @Override
        public boolean canSeekForward() {
            return true;
        }

        @Override
        public int getAudioSessionId() {
            return 0;
        }
    }


    /**
     * get real width and height video
     */
    private void getRealSize(MediaPlayer mp, TextureView mTextureView) {

        if (mp == null || mTextureView == null) {
            return;
        }

        //Get the dimensions of the video
        int videoWidth = mp.getVideoWidth();
        int videoHeight = mp.getVideoHeight();

        Display display = G.fragmentActivity.getWindowManager().getDefaultDisplay();

        int finalWith, finalHeight;

        finalWith = display.getWidth();
        finalHeight = (int) (((float) videoHeight / (float) videoWidth) * (float) display.getWidth());

        if (finalHeight > display.getHeight()) {
            finalWith = (int) (((float) finalWith / (float) finalHeight) * (float) display.getHeight());
            finalHeight = display.getHeight();
        }

        ViewGroup.LayoutParams lp = mTextureView.getLayoutParams();
        lp.width = finalWith;
        lp.height = finalHeight;
        mTextureView.setLayoutParams(lp);
    }

    public interface FocusAudioListener {

        void audioPlay(boolean isPlay);

    }

}