cl.ipp.katbag.fragment.SlidePageBookFragment.java Source code

Java tutorial

Introduction

Here is the source code for cl.ipp.katbag.fragment.SlidePageBookFragment.java

Source

/*
 * Author: Miguel Angel Bravo (@MiguelAngelBrav)
 * The Android Open Source Project Katbag is licensed under the General GPLv3.
 * 
 */

package cl.ipp.katbag.fragment;

import java.util.ArrayList;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.ImageView.ScaleType;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;
import cl.ipp.katbag.MainActivity;
import cl.ipp.katbag.R;
import cl.ipp.katbag.core.KatbagDrawing;
import cl.ipp.katbag.core.KatbagDrawingBuilder;
import cl.ipp.katbag.core.KatbagEditText;

import com.google.analytics.tracking.android.EasyTracker;
import com.google.analytics.tracking.android.Fields;
import com.google.analytics.tracking.android.MapBuilder;
import com.google.analytics.tracking.android.Tracker;

public class SlidePageBookFragment extends Fragment {

    private Tracker tracker;

    public ViewGroup v;
    public static MainActivity mainActivity;
    public static final String ID_APP = "id_app";
    public static final String PAGE_NUMBER = "page";
    public ArrayList<String> page = new ArrayList<String>();
    public ArrayList<String> world = new ArrayList<String>();
    public String mCurrentPhotoPath = "";
    public RelativeLayout backgroundView;
    public boolean mMeasured = false;
    public int[] loc;
    private ArrayList<String> develop = new ArrayList<String>();

    public static final int PAGE_WORLD_ID = 0;
    public static final int PAGE_SOUND_ID = 1;
    public static final int PAGE_ORDER = 2;
    public static final int PAGE_ID = 3;

    public static final int WORLD_ARRAY_TYPE = 0;
    public static final int WORLD_ARRAY_SRC = 1;
    public static final int WORLD_ARRAY_SCALE_FACTOR = 2;

    public static final String WORLD_TYPE_COLOR = "color";
    public static final String WORLD_TYPE_CAMERA = "camera";
    public static final String WORLD_TYPE_LIBRARY = "library";

    private int mPageNumber;
    private long id_app;

    public static SlidePageBookFragment create(long id_app, int pageNumber) {
        SlidePageBookFragment fragment = new SlidePageBookFragment();
        Bundle args = new Bundle();
        args.putLong(ID_APP, id_app);
        args.putInt(PAGE_NUMBER, pageNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public SlidePageBookFragment() {

    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        id_app = getArguments().getLong(ID_APP);
        mPageNumber = getArguments().getInt(PAGE_NUMBER);

        this.tracker = EasyTracker.getInstance(this.getActivity());
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout containing a title and body text.
        v = (ViewGroup) inflater.inflate(R.layout.fragment_slide_page_book, container, false);
        mainActivity = (MainActivity) super.getActivity();

        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        backgroundView = (RelativeLayout) v.findViewById(R.id.one_page_background);
        backgroundView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (!mMeasured) {
                    loc = new int[2];
                    backgroundView.getLocationInWindow(loc);
                    mMeasured = true;
                    setDevelopBook();
                }
            }
        });

        page.clear();
        page = mainActivity.katbagHandler.selectOnePageForIdAndOrder(id_app, mPageNumber);

        if (page.size() > 0) {
            if ((page.get(PAGE_WORLD_ID) != null) && (!page.get(PAGE_WORLD_ID).contentEquals("")))
                setWorld(Long.parseLong(page.get(PAGE_WORLD_ID)));
        }
    }

    public void setDevelopBook() {
        // add first drawing, then text, then motion
        develop.clear();
        develop = mainActivity.katbagHandler.selectDevelopBookForIdAppAndPageId(id_app,
                Integer.parseInt(page.get(PAGE_ID)));
        for (int i = 0; i < develop.size(); i++) {
            String[] line = develop.get(i).split("&&");
            if (line[1].contentEquals("drawing")) {
                setDrawing(line);
            }
        }

        for (int i = 0; i < develop.size(); i++) {
            String[] line = develop.get(i).split("&&");
            if (line[1].contentEquals("text")) {
                setText(line);
            }
        }

        for (int i = 0; i < develop.size(); i++) {
            String[] line = develop.get(i).split("&&");
            if (line[1].contentEquals("motion")) {
                if (backgroundView.findViewById(Integer.parseInt(line[4])) instanceof KatbagDrawing) {
                    KatbagDrawing drawingMove = (KatbagDrawing) backgroundView
                            .findViewById(Integer.parseInt(line[4]));
                    if (drawingMove != null)
                        drawingMove.moveToXY(Integer.parseInt(line[5]), Integer.parseInt(line[6]));

                } else if (backgroundView.findViewById(Integer.parseInt(line[4])) instanceof KatbagEditText) {
                    KatbagEditText textMove = (KatbagEditText) backgroundView
                            .findViewById(Integer.parseInt(line[4]));
                    if (textMove != null)
                        textMove.moveToXY(Integer.parseInt(line[5]), Integer.parseInt(line[6]));
                }
            }
        }
    }

    public void setDrawing(String[] line) {
        boolean exist = false;
        ArrayList<String> drw = new ArrayList<String>();
        drw = mainActivity.katbagHandler.selectDrawingsForIdApp(id_app);
        for (int i = 0; i < drw.size(); i++) {
            if (drw.get(i).contentEquals(line[3])) {
                exist = true;
                break;
            }
        }

        if (exist) {
            KatbagDrawingBuilder drawingBuilder = new KatbagDrawingBuilder(mainActivity.context);
            drawingBuilder.setIdDrawing(Long.parseLong(line[3])); // this build the drawing
            Bitmap bitmap = createBitmapFromRelativeLayout(drawingBuilder);
            KatbagDrawing drawing = new KatbagDrawing(mainActivity.context);
            drawing.setImageBitmap(bitmap);
            drawing.setId(Integer.parseInt(line[3]));
            drawing.setSizeFather(backgroundView.getWidth(), backgroundView.getHeight(), loc, backgroundView);
            drawing.setMySize(drawingBuilder.getMyWidth(), drawingBuilder.getMyHeight());
            drawing.setScaleType(ScaleType.MATRIX);
            backgroundView.addView(drawing);
        }
    }

    public void setText(String[] line) {
        KatbagEditText text = new KatbagEditText(mainActivity.context);
        text.setId(Integer.parseInt(line[0]));
        text.setText(line[2]);
        text.setTextAlign(line[4]);
        text.setFontSize(Integer.parseInt(line[3]));
        text.setColorText(Integer.parseInt(line[5]));
        text.setBackgroundResource(0);
        text.setKeyListener(null);
        backgroundView.addView(text);
    }

    public Bitmap createBitmapFromRelativeLayout(RelativeLayout view) {

        view.setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT));
        view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

        Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(),
                Bitmap.Config.ARGB_8888);

        Canvas c = new Canvas(bitmap);
        view.draw(c);

        return bitmap;
    }

    /**
     * Returns the page number represented by this fragment object.
     */
    public int getPageNumber() {
        return mPageNumber;
    }

    public void setWorld(long id_world) {
        world.clear();
        world = mainActivity.katbagHandler.selectWorldTypeSrcAndScaleFactorWorldForId(id_world);
        if (world.size() > 0) {
            if (world.get(WORLD_ARRAY_TYPE).contentEquals(WORLD_TYPE_COLOR)) {
                setColorBackground(Integer.parseInt(world.get(WORLD_ARRAY_SRC)));
            } else if (world.get(WORLD_ARRAY_TYPE).contentEquals(WORLD_TYPE_CAMERA)
                    || world.get(WORLD_ARRAY_TYPE).contentEquals(WORLD_TYPE_LIBRARY)) {
                mCurrentPhotoPath = world.get(WORLD_ARRAY_SRC);
                setPictureBackground(world.get(WORLD_ARRAY_TYPE),
                        Integer.parseInt(world.get(WORLD_ARRAY_SCALE_FACTOR)), id_world);
            }
        }
    }

    public void setColorBackground(int color) {
        backgroundView.setBackgroundColor(color);
    }

    @SuppressWarnings("deprecation")
    public void setPictureBackground(String type_world, int scaleFactor, long id_world) {
        // Get the dimensions of the View
        int targetW = backgroundView.getWidth();
        int targetH = backgroundView.getHeight();

        // Get the dimensions of the bitmap
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
        int photoW = bmOptions.outWidth;
        int photoH = bmOptions.outHeight;

        // Determine how much to scale down the image
        if (scaleFactor == -1) {
            if (photoW != 0 && targetW != 0 && photoH != 0 && targetH != 0)
                scaleFactor = Math.min(photoW / targetW, photoH / targetH);
            else
                scaleFactor = 1;

            mainActivity.katbagHandler.updateWorld(id_world, type_world, mCurrentPhotoPath, scaleFactor);
        }

        // Decode the image file into a Bitmap sized to fill the View
        bmOptions.inJustDecodeBounds = false;
        bmOptions.inSampleSize = scaleFactor;
        bmOptions.inPurgeable = true;

        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);

        } catch (OutOfMemoryError e) {
            e.printStackTrace();
            System.gc();

            try {
                bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath);
            } catch (OutOfMemoryError e2) {
                e2.printStackTrace();
                // handle gracefully.
            }
        }

        BitmapDrawable background = new BitmapDrawable(mainActivity.context.getResources(), bitmap);

        backgroundView.setBackgroundDrawable(background);
    }

    @Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        this.tracker.set(Fields.SCREEN_NAME, getClass().getSimpleName());
        this.tracker.send(MapBuilder.createAppView().build());
    }

    @Override
    public void onPause() {
        // TODO Auto-generated method stub
        System.gc();
        super.onPause();
    }

    @Override
    public void onStop() {
        // TODO Auto-generated method stub
        System.gc();
        super.onStop();
    }
}