/** * This file is part of Owlet. * * Owlet is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Owlet is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Owlet. If not, see <http://www.gnu.org/licenses/>. */ package com.sibext.owlet.tasks; import java.util.ArrayList; import java.util.Random; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.util.SparseArray; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.RelativeLayout; import com.sibext.owlet.R; import com.sibext.owlet.activity.ScreenOfTaskActivity; import com.sibext.owlet.player.MediaPlayerSingleton; import com.sibext.owlet.view.BaseTaskImageView; import com.sibext.owlet.view.TaskImageView; import com.sibext.owlet.view.conclusion.ConclusionViewFactory; import com.sibext.owlet.view.conclusion.View1; import com.sibext.owlet.view.conclusion.View2; import com.sibext.owlet.view.conclusion.View3; import com.sibext.owlet.view.conclusion.View4; import com.sibext.owlet.view.conclusion.View5; import com.sibext.owlet.view.conclusion.ViewTrans1; import com.sibext.owlet.view.conclusion.ViewTrans2; import com.sibext.owlet.view.conclusion.ViewTransFlag; import com.sibext.owlet.view.renderer.ConclusionRenderer; /** * Умозаключение * * @author Mike Osipov <osipov@sibext.com> */ public class ConclusionTask extends Task { private final static int FAIL_COUNT_LIMIT = 2; public static int EXAMPLE_ID = 0; public static int ARROW1_ID = 1; public static int EXAMPLE_ANSWER_ID = 2; public static int TEST_ID = 3; public static int ARROW2_ID = 4; public static int QUESTION_ID = 5; public static int TEST_ANSWER_ID = 3; public static int ANSWER_CODE = 111; private ConclusionViewFactory factory; private SparseArray<BaseTaskImageView> elements; private SparseArray<Class<?>> getCollectionOfTransformView(){ SparseArray<Class<?>> set = new SparseArray<Class<?>>(); set.put(0,ViewTrans1.class); set.put(1,ViewTrans2.class); set.put(2, ViewTransFlag.class); return set; } @Override protected Class<?>[] getCollectionOfView() { switch (complexity) { case COMPLEXITY_LOW: Class<?>[] collectionOfView = { View1.class, View5.class, getCollectionOfTransformView().get(0), }; return collectionOfView; case COMPLEXITY_MEDIUM: Class<?>[] collectionOfView1 = { View4.class, getCollectionOfTransformView().get(0), getCollectionOfTransformView().get(1), getCollectionOfTransformView().get(2), }; return collectionOfView1; case COMPLEXITY_HIGH: Class<?>[] collectionOfView2 = { View5.class, View2.class, View3.class, getCollectionOfTransformView().get(0), getCollectionOfTransformView().get(1), getCollectionOfTransformView().get(2), }; return collectionOfView2; //для отладки по дефолту ставим complexity=3, чтобы проверить все наборы в таске default: Class<?>[] collectionOfView3 = { View1.class, View2.class, View3.class, View4.class, View5.class }; return collectionOfView3; } } private int defineModeByType(Class<?> type){ if(getCollectionOfTransformView().indexOfValue(type)>=0){ return ConclusionViewFactory.TRANSFORM_VIEW_MODE; } return ConclusionViewFactory.SIMPLE_VIEW_MODE; } public ConclusionTask(Context context,TaskParamsContainer container) { super(CONCLUSION_TASK_TYPE, CONCLUSION_TASK_LEGTH_DEFAULT, R.string.task_types_message_conclusion, context, container); elements = new SparseArray<BaseTaskImageView>(); settingOfParameters( container.getBoardParams()[ScreenOfTaskActivity.MARGIN_LEFT_INDEX] + 20, container.getBoardParams()[ScreenOfTaskActivity.MARGIN_TOP_INDEX] + heightBoard + 7); colors = selectColors(ConclusionViewFactory.COLORS_SIZE); switch (complexity) { case Task.COMPLEXITY_HIGH: colorFlag = false; break; case Task.COMPLEXITY_MEDIUM: colorFlag = rand.nextBoolean(); break; default: colorFlag = true; break; } } private void settingOfParameters(int marginLeftAnswer, int marginTopAnswer) { int bound_size = context.getResources().getDimensionPixelSize(R.dimen.task_board_margin_up_down); heightTaskImage = (int) ((heightBoard - bound_size*2) / 2.5)+DISTANCE_BETWEEN_IMAGES; widthTaskImage = heightTaskImage; heightAnswerImage = (int) ((heightBoard - 80) / 2.5); widthAnswerImage = heightAnswerImage; marginLeftAnswerImage = marginLeftAnswer; marginTopTaskImage = 0;// + (heightBoard - 80 - heightTaskImage*2); marginLeftTaskImage = 0;//(int)((20+widthBoard - 40 - (3*widthTaskImage))/2-DISTANCE_BETWEEN_IMAGES); marginTopAnswerImage = marginTopAnswer; } public int getEveryFailCountLimit(){ return FAIL_COUNT_LIMIT; } public ViewGroup taskBuildView(final Context context, ViewGroup layout, final RelativeLayout root) { emptyCells = new ArrayList<TaskImageView>(); ConclusionRenderer renderer = new ConclusionRenderer(); renderer.setType(getImageGroupClass()); renderer.setColorFlag(colorFlag); renderer.setColors(colors); int mode = defineModeByType(getImageGroupClass()); // factory = new ConclusionViewFactory(context, renderer, mode); BaseTaskImageView example = factory.getExample(); BaseTaskImageView exampleAnswer = factory.getExampleAnswer(); BaseTaskImageView test = factory.getTest(); BaseTaskImageView testAnswer = factory.getTestAnswer(); testAnswer.setVariantAnswer(ANSWER_CODE); // int[] idx = new int[]{ EXAMPLE_ID, EXAMPLE_ANSWER_ID, TEST_ID, }; elements.put(EXAMPLE_ID, example); elements.put(EXAMPLE_ANSWER_ID, exampleAnswer); elements.put(TEST_ID, test); layout.addView(getArrow(ARROW1_ID)); layout.addView(getArrow(ARROW2_ID)); layout.addView(getQuestion()); for(int i=0; i<idx.length;i++){ BaseTaskImageView img = elements.get(idx[i]); img.setLayoutParams(calcEveryPointOfBeginningDrawing(idx[i])); layout.addView(img); } //variants of answer ArrayList<BaseTaskImageView> variants = factory.getVariants(); variants.add(testAnswer); int[] varPositions = selectImages(variants.size(), variants.size()); for(int i=0 ; i<variants.size(); i++){ BaseTaskImageView img = variants.get(varPositions[i]); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( widthAnswerImage, heightAnswerImage); params.leftMargin = i * (widthAnswerImage + DISTANCE_BETWEEN_IMAGES+10) + marginLeftAnswerImage; params.topMargin = marginTopAnswerImage; img.setLeftMargin(params.leftMargin); img.setTopMargin(params.topMargin); img.setLayoutParams(params); root.addView(img); img.setOnTouchListener(getMovebleListener(emptyCells)); answers.add(img); } return layout; } private FrameLayout.LayoutParams calcEveryPointOfBeginningDrawing(int s) { FrameLayout.LayoutParams params; int w = widthTaskImage - DISTANCE_BETWEEN_IMAGES; int h = heightTaskImage - DISTANCE_BETWEEN_IMAGES; int lm = 0; int tm = 0; if ((s == 0) || (s == 3)) { lm = (int) (0.5*this.widthBoard)-(int)(1.5*w)-DISTANCE_BETWEEN_IMAGES; } else if ((s == 1) || (s == 4)) { lm = (int) (0.5*this.widthBoard-(int)(0.5*w)); } else { lm = (int) (0.5*this.widthBoard+(int)(0.5*w)+DISTANCE_BETWEEN_IMAGES); } if ((s == 3) || (s == 4) || (s == 5)) { tm = (int) (0.5*this.heightBoard)+(int)(h*0.1); } else { tm = (int) (0.5*this.heightBoard)-(int)(h*1.1); } params = new FrameLayout.LayoutParams(w, h, Gravity.TOP); params.leftMargin = lm + marginLeftTaskImage; params.topMargin = tm + marginTopTaskImage ; return params; } private int[] arrayConclusionTask() { int[] randArray= new int[4]; int[] arrayForImageOnBoard = {0, 1, 2, 3, 4, 5}; int[] arrayCollective= new int[10]; //create random array (example: {6, 7, 8, 9}) Random random = new Random(); int j = 6+Math.abs( random.nextInt() ) % 4; for (int i = 0; i < 4; i++) { randArray[i]=(i+j)%4+6; } //randArray + arrayForImageOnBoard = arrayCollective System.arraycopy(arrayForImageOnBoard, 0, arrayCollective, 0, 6); System.arraycopy(randArray, 0, arrayCollective, 6, 4); //for (int i = 0; i < 10; i++) //Log.d("llolog", ""+arrayCollective[i]); return arrayCollective; } @Override public void playTaskMessage(MediaPlayerSingleton sound) { sound.play(R.raw.task_conclusion_message); } private ImageView getArrow(int arrowId){ ImageView res = new ImageView(context); Resources resources = context.getResources(); Drawable drawable = resources.getDrawable(R.drawable.arrow); res.setImageDrawable(drawable); /*Canvas canvas = new Canvas(); Bitmap b = Bitmap.createBitmap(widthTaskImage, heightTaskImage, Config.ARGB_8888); canvas.setBitmap(b); Paint paint = new Paint(); TaskImageHelper.Arrow.drawArrow(canvas, widthTaskImage, heightTaskImage,paint); res.setImageBitmap(b);*/ res.setLayoutParams(calcEveryPointOfBeginningDrawing(arrowId)); res.setBackgroundColor(0); return res; } private TaskImageView getQuestion(){ Resources res = context.getResources(); Drawable drawable = res.getDrawable(R.drawable.question); final TaskImageView img = new TaskImageView(context); FrameLayout.LayoutParams params = calcEveryPointOfBeginningDrawing(QUESTION_ID); img.setLayoutParams(params); img.setImageDrawable(drawable); img.setCorrectAnswer(ANSWER_CODE); img.setBackgroundResource(0); location = new int[2]; img.post(new Runnable() { public void run() { img.getLocationOnScreen(location); img.setCoordinate(location[0], location[1]); emptyCells.add(img); } }); return img; } }