/*
* 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();
}
}