package com.avenwu.deepinandroid;

import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapRegionDecoder;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.os.AsyncTaskCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;

import java.io.IOException;

/**
 * Created by chaobin on 3/2/15.
 */
public class LargeHeightImageDisplayFragment extends Fragment {
    private static final String TAG = LargeHeightImageDisplayFragment.class.getSimpleName();
    private ViewGroup mContainer;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ScrollView scrollView = new ScrollView(getActivity());
        scrollView.setBackgroundColor(Color.WHITE);
        scrollView.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        LinearLayout linearLayout = new LinearLayout(getActivity());
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        linearLayout.setLayoutParams(new ScrollView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        mContainer = linearLayout;
        scrollView.addView(linearLayout);
        return scrollView;
    }

    AsyncTask<Context, Bitmap, Object> mDecodeTask;

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        mDecodeTask = new AsyncTask<Context, Bitmap, Object>() {
            @Override
            protected Object doInBackground(Context... params) {
                Log.d(TAG, "Start decode image...");
                BitmapRegionDecoder decoder = null;
                try {
                    //TODO According to api document both jpeg and png are supported, however jpeg image just failed to be decoded on this case
                    decoder = BitmapRegionDecoder.newInstance(params[0].getAssets().open("image.png", AssetManager.ACCESS_RANDOM), false);
                    final int screenWidth = params[0].getResources().getDisplayMetrics().widthPixels;
                    final int imageWidth = decoder.getWidth();
                    final int imageHeight = decoder.getHeight();
                    final int eachHeight = (int) (screenWidth * ((imageWidth + 0.5f) / screenWidth));
                    int heightRemained = imageHeight;
                    Rect corpRect = new Rect(0, 0, imageWidth, 0);
                    //TODO the while case is only for test, should only load specific bitmap data when scrolled to be visible
                    while (heightRemained > 0 && !isCancelled()) {
                        Log.d(TAG, "clip image");
                        if (heightRemained >= eachHeight) {
                            corpRect.set(corpRect.left, corpRect.bottom, corpRect.right, corpRect.bottom + eachHeight);
                            heightRemained -= eachHeight;
                        } else {
                            corpRect.set(corpRect.left, corpRect.bottom, corpRect.right, corpRect.bottom + heightRemained);
                            heightRemained = 0;
                        }
                        Log.d(TAG, "corptBitmap, " + corpRect.toString());
                        Bitmap corptBitmap = decoder.decodeRegion(corpRect, null);
                        publishProgress(corptBitmap);
                        try {
                            Log.d(TAG, "Sleep 2 seconds");
                            Thread.sleep(2 * 1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    Log.d(TAG, "Image decode finished");
                } catch (IOException e) {
                    Log.d(TAG, "Image decode failed");
                    e.printStackTrace();
                } finally {
                    if (decoder != null) {
                        decoder.recycle();
                    }
                }
                return null;
            }

            @Override
            protected void onProgressUpdate(Bitmap... values) {
                if (getActivity() != null && !isRemoving() && values[0] != null) {
                    ImageView imageView = new ImageView(getActivity());
                    imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                    imageView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                    imageView.setImageBitmap(values[0]);
                    mContainer.addView(imageView);
                }
            }
        };
        AsyncTaskCompat.executeParallel(mDecodeTask, getActivity());
    }

    @Override
    public void onDestroyView() {
        if (mContainer != null) {
            mContainer.removeAllViews();
        }
        if (mDecodeTask != null) {
            mDecodeTask.cancel(true);
        }
        super.onDestroyView();
    }
}

@@ -3846,283 +3846,8 @@
 p);%0A
-                        try %7B%0A                            Log.d(TAG, %22Sleep 2 seconds%22);%0A                            Thread.sleep(2 * 1000);%0A                        %7D catch (InterruptedException e) %7B%0A                            e.printStackTrace();%0A                        %7D%0A
     

remove test code