Proyectos de Subversion Android Microlearning

Rev

Rev 1 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

package com.cesams.twogetskills.activity;

import android.content.Intent;
import android.os.Bundle;

import com.cesams.twogetskills.Constants;
import com.cesams.twogetskills.dao.AnswerDao;
import com.cesams.twogetskills.dao.QuestionDao;
import com.cesams.twogetskills.dao.QuizDao;
import com.cesams.twogetskills.fragment.QuizFailFragment;
import com.cesams.twogetskills.fragment.QuizIntroFragment;
import com.cesams.twogetskills.fragment.QuizMultipleAnswerFragment;
import com.cesams.twogetskills.fragment.QuizPassFragment;
import com.cesams.twogetskills.fragment.QuizRangeSimpleFragment;
import com.cesams.twogetskills.fragment.QuizSingleAnswerFragment;
import com.cesams.twogetskills.entity.Answer;
import com.cesams.twogetskills.entity.Question;
import com.cesams.twogetskills.entity.Quiz;
import com.cesams.twogetskills.pojo.QuizResponse;
import com.cesams.twogetskills.skeleton.IQuizActivity;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.cesams.twogetskills.R;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

public class QuizActivity extends AppCompatActivity implements IQuizActivity {

    private final static String TAG = "C2GS - QuizActivity";
    private final static String PREFIX_FRAG = "FRAG";
    private Quiz quiz;
    private String quizUuid;
    private ArrayList<Question> questions;
    private HashMap<String, ArrayList<Answer>> answers;
    private ArrayList<QuizResponse> quizResponses;
    private TextView textViewScore;
    private TextView textViewQuestion;
    private TextView textChronometer;
    private HashMap<String, Fragment> fragmentHashMap;
    private Button btnPrevious;
    private Button btnNext;
    private Button btnStart;
    private Button btnFinish;
    private Button btnExit;
    private int questionIdxActive;
    private int fragmentIdxActive;
    private int totalPoints;
    private CountDownTimer countDownTimer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_quiz);

        questionIdxActive = 0;
        fragmentIdxActive = 0;
        questions = new ArrayList<>();
        answers = new HashMap<>();
        quizResponses = new ArrayList<>();
        fragmentHashMap = new HashMap<>();

        //companyUuid = getIntent().getStringExtra("companyUuid");
        //topicUuid = getIntent().getStringExtra("topicUuid");
        //capsuleUuid = getIntent().getStringExtra("capsuleUuid");
       // slideUuid = getIntent().getStringExtra("slideUuid");
        quizUuid = getIntent().getStringExtra("quizUuid");
        //userUuid = getIntent().getStringExtra("userUuid");

        quiz = new Quiz();
        quiz.setCompanyUuid(getIntent().getStringExtra("quiz_company_uuid"));
        quiz.setUuid(getIntent().getStringExtra("quiz_uuid"));
        quiz.setName(getIntent().getStringExtra("quiz_name"));
        quiz.setText(getIntent().getStringExtra("quiz_text"));
        quiz.setFailed(getIntent().getStringExtra("quiz_failed"));
        quiz.setPoints(getIntent().getIntExtra("quiz_points", 0));
        quiz.setMinimumPointsRequired(getIntent().getIntExtra("quiz_minimum_points_required", 0));
        quiz.setMaxTime(getIntent().getIntExtra("quiz_max_time", 0));



        int maxAnswer = 0;
        int maxQuestion = getIntent().getIntExtra("questions", 0);
        Question question;
        Answer answer;
        ArrayList<Answer> questionAnswers;
        for(int i = 1; i <= maxQuestion; i++){
            question = new Question();
            question.setQuizUuid(quizUuid);
            question.setUuid(getIntent().getStringExtra("question" + i + "_uuid"));
            question.setText(getIntent().getStringExtra("question" + i + "_text"));
            question.setPoints(getIntent().getIntExtra("question" + i + "_points", 0));
            question.setMaxlength(getIntent().getIntExtra("question" + i + "_max_length", 0));
            question.setType(getIntent().getStringExtra("question" + i + "_type"));

            questions.add(question);

            maxAnswer = getIntent().getIntExtra("question" + i + "_answers", 0);


            questionAnswers = new ArrayList<>();
            for(int j = 1; j <= maxAnswer; j++ ) {
                answer = new Answer();
                answer.setQuestionUuid(question.getUuid());
                answer.setUuid(getIntent().getStringExtra("question" + i + "_answer_uuid" + j));
                answer.setText(getIntent().getStringExtra("question" + i + "_answer_text" + j));
                answer.setPoints(getIntent().getIntExtra("question" + i + "_answer_points" + j, 0));
                answer.setCorrect(getIntent().getStringExtra("question" + i + "_answer_correct" + j));

                questionAnswers.add(answer);
            }


            answers.put(question.getUuid(), questionAnswers);
        }


        textViewScore = (TextView) findViewById(R.id.activity_quiz_textview_score);
        textViewScore.setText("0");

        textViewQuestion = (TextView) findViewById(R.id.activity_quiz_textview_question_count);
        textViewQuestion.setText(String.valueOf(questions.size()));

        textChronometer = (TextView) findViewById(R.id.activity_quiz_textview_chronometer);
        textChronometer.setText("00:00");

        btnPrevious = (Button) findViewById(R.id.activity_quiz_button_previous);
        btnPrevious.setVisibility(View.INVISIBLE);

        btnPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (questionIdxActive > 0) {
                    questionIdxActive--;
                }
                showQuestions();
            }
        });

        btnNext = (Button) findViewById(R.id.activity_quiz_button_next);
        btnNext.setVisibility(View.INVISIBLE);
        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (questionIdxActive < (questions.size() - 1)) {
                    questionIdxActive++;
                    showQuestions();
                }
            }
        });

        btnExit = (Button) findViewById(R.id.activity_quiz_button_exit);
        btnExit.setVisibility(View.INVISIBLE);
        btnExit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               if(totalPoints >= quiz.getMinimumPointsRequired()) {
                   exitQuizPass();
               } else {
                   exitQuizFail();
               }
            }
        });

        btnStart = (Button) findViewById(R.id.activity_quiz_button_start);
        btnStart.setVisibility(View.VISIBLE);
        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Calendar calendar = Calendar.getInstance();
                Date date = calendar.getTime();
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constants.FORMAT_DATETIME_SERVICE);
                String dateOn = simpleDateFormat.format(date);

                long millisInFuture = quiz.getMaxTime() * 60000;

                countDownTimer = new CountDownTimer(millisInFuture, 1000) {

                    public void onTick(long millisUntilFinished) {
                        long minutes = millisUntilFinished / 60000;
                        long seconds = (millisUntilFinished - (minutes * 60000)) / 1000;

                        String sMinutes = minutes < 10 ? "0" + minutes : String.valueOf(minutes);
                        String sSeconds = seconds < 10 ? "0" + seconds : String.valueOf(seconds);

                        textChronometer.setText(sMinutes + ":" + sSeconds);

                    }

                    public void onFinish() {
                        textChronometer.setText("--:--");
                        finishQuiz();
                    }
                }.start();

                btnStart.setVisibility(View.INVISIBLE);

                if (questions.size() == 1) {
                    btnFinish.setVisibility(View.VISIBLE);
                } else {
                    btnNext.setVisibility(View.VISIBLE);
                }

                showQuestions();
            }

        });

        btnFinish = (Button) findViewById(R.id.activity_quiz_button_finish);
        btnFinish.setVisibility(View.INVISIBLE);
        btnFinish.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finishQuiz();

            }
        });

        invokeFragment(Constants.IDX_QUIZ_FRAGMENT_INTRO);


    }

    @Override
    public int getTotalPoints() {
        return totalPoints;
    }



    @Override
    public void exitQuizFail()
    {
        Intent intent = new Intent();
        intent.putExtra("completed", false);
        intent.putExtra("requestCode", Constants.REQUEST_CODE_QUIZ);
        setResult(RESULT_CANCELED, intent);
        finish();
    }

    @Override
    public void exitQuizPass()
    {
        Intent intent = new Intent();
        intent.putExtra("completed", true);
        intent.putExtra("requestCode", Constants.REQUEST_CODE_QUIZ);
        setResult(RESULT_OK, intent);
        finish();
    }

    public void finishQuiz()
    {
        if(countDownTimer != null) {
            countDownTimer.cancel();
        }
        textChronometer.setText("--:--");

        totalPoints = 0;
        for(int i = 0; i < quizResponses.size(); i++)
        {
            totalPoints += quizResponses.get(i).getPoints();
        }

        textViewScore.setText(totalPoints + " / " + quiz.getPoints());

        btnFinish.setVisibility(View.INVISIBLE);
        btnExit.setVisibility(View.VISIBLE);
        if(totalPoints >= quiz.getMinimumPointsRequired()) {
            //Pass

            invokeFragment(Constants.IDX_QUIZ_FRAGMENT_PASS);
        } else {
            //Fail
            invokeFragment(Constants.IDX_QUIZ_FRAGMENT_FAIL);
        }
    }

    public void showQuestions()
    {
        btnStart.setVisibility(View.INVISIBLE);
        btnFinish.setVisibility(View.INVISIBLE);
        btnNext.setVisibility(View.INVISIBLE);
        btnPrevious.setVisibility(View.INVISIBLE);

        if(questionIdxActive == 0) {

            if(questions.size() > 1) {
                btnNext.setVisibility(View.VISIBLE);
            } else {
                btnFinish.setVisibility(View.VISIBLE);
            }
        } else {
            if(questionIdxActive == (questions.size() - 1)) {
                btnFinish.setVisibility(View.VISIBLE);
            } else {
                btnNext.setVisibility(View.VISIBLE);
            }
        }

        int score = 0;
        for(int i = 0; i < quizResponses.size(); i++)
        {
            score += quizResponses.get(i).getPoints();
        }

        textViewQuestion.setText((1 + questionIdxActive) + " / " + questions.size()  );
        textViewScore.setText(String.valueOf(score));


        Question question = questions.get(questionIdxActive);
        if(question.getType().equals(Constants.QUESTION_TYPE_RANGE_1_10)) {
            invokeFragment(Constants.IDX_QUIZ_FRAGMENT_QUESTION_RANGE_SIMPLE);
        } else if(question.getType().equals(Constants.QUESTION_TYPE_RANGE_1_6)) {
            invokeFragment(Constants.IDX_QUIZ_FRAGMENT_QUESTION_RANGE_SIMPLE);
        } else if(question.getType().equals(Constants.QUESTION_TYPE_RANGE_1_5)) {
            invokeFragment(Constants.IDX_QUIZ_FRAGMENT_QUESTION_RANGE_SIMPLE);
        } else if(question.getType().equals(Constants.QUESTION_TYPE_SINGLE_SELECTION)) {
            invokeFragment(Constants.IDX_QUIZ_FRAGMENT_QUESTION_SIMPLE);
        } else if(question.getType().equals(Constants.QUESTION_TYPE_MULTIPLE_SELECTION)) {
            invokeFragment(Constants.IDX_QUIZ_FRAGMENT_QUESTION_MULTIPLE);
        }

    }


    @Override
    public void onBackPressed() {

        return;
          /*
        Intent intent = new Intent();
        setResult(RESULT_CANCELED, intent);
        finish();*/
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();


    }


    @Override
    public Quiz getQuiz()
    {
        return quiz;
    }

    @Override
    public ArrayList<Question> getQuestions()
    {
        return questions;
    }

    @Override
    public ArrayList<Answer> getAnswers(String questionUuid)
    {
        if(answers.containsKey(questionUuid)) {
            return answers.get(questionUuid);
        } else {
            return null;
        }


    }

    @Override
    public ArrayList<QuizResponse> getQuizResponses()
    {
        return quizResponses;
    }

    @Override
    public Question getQuestionActive()
    {
        return questions.get(questionIdxActive);
    }


    public void invokeFragment(int fragmentIdxActiveNuevo)
    {
        String fragmentKeyActual        = PREFIX_FRAG + fragmentIdxActive;
        String fragmentKeyNuevo         = PREFIX_FRAG + fragmentIdxActiveNuevo;
        fragmentIdxActive = fragmentIdxActiveNuevo;

        Fragment fragment;
       // if(!fragmentKeyActual.equalsIgnoreCase(fragmentKeyNuevo)) {
            if(fragmentHashMap.containsKey(fragmentKeyActual)) {
                fragment = fragmentHashMap.get(fragmentKeyActual);
                if(fragment != null) {
                    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                    fragmentTransaction.hide(fragment);
                    fragmentTransaction.commit();
                }
            }
        //}

        boolean add = false;
        fragment = null;


        switch(fragmentIdxActiveNuevo) {

            case Constants.IDX_QUIZ_FRAGMENT_QUESTION_RANGE_SIMPLE :
                if(fragmentHashMap.containsKey(fragmentKeyNuevo)) {
                    fragment = fragmentHashMap.get(fragmentKeyNuevo);
                } else {
                    add = true;
                    fragment = new QuizRangeSimpleFragment(this);
                }
                break;

            case Constants.IDX_QUIZ_FRAGMENT_QUESTION_SIMPLE :
                if(fragmentHashMap.containsKey(fragmentKeyNuevo)) {
                    fragment = fragmentHashMap.get(fragmentKeyNuevo);
                } else {
                    add = true;
                    fragment = new QuizSingleAnswerFragment(this);
                }
                break;

            case Constants.IDX_QUIZ_FRAGMENT_QUESTION_MULTIPLE :
                if(fragmentHashMap.containsKey(fragmentKeyNuevo)) {
                    fragment = fragmentHashMap.get(fragmentKeyNuevo);
                } else {
                    add = true;
                    fragment = new QuizMultipleAnswerFragment(this);
                }
                break;

            case Constants.IDX_QUIZ_FRAGMENT_PASS :
                if(fragmentHashMap.containsKey(fragmentKeyNuevo)) {
                    fragment = fragmentHashMap.get(fragmentKeyNuevo);
                } else {
                    add = true;
                    fragment = new QuizPassFragment(this);
                }
                break;

            case Constants.IDX_QUIZ_FRAGMENT_FAIL :
                if(fragmentHashMap.containsKey(fragmentKeyNuevo)) {
                    fragment = fragmentHashMap.get(fragmentKeyNuevo);
                } else {
                    add = true;
                    fragment = new QuizFailFragment(this);
                }
                break;

            default :
                if(fragmentHashMap.containsKey(fragmentKeyNuevo)) {
                    fragment = fragmentHashMap.get(fragmentKeyNuevo);
                } else {
                    add = true;
                    fragment = new QuizIntroFragment();
                }
                break;


        }

        if(add) {
            fragmentHashMap.put(fragmentKeyNuevo, fragment);

            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.add(R.id.activity_quiz_fragment_container, fragment, fragmentKeyNuevo);
            fragmentTransaction.commit();
        }


        if(fragment != null) {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.show(fragment);
            fragmentTransaction.commit();
        }

    }


}