nheyek/SDP-2018

View on GitHub
app/src/main/java/ch/epfl/sweng/studyup/questions/AddOrEditQuestionActivityHelperMethods.java

Summary

Maintainability
A
3 hrs
Test Coverage
package ch.epfl.sweng.studyup.questions;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.storage.FileDownloadTask;
import com.google.firebase.storage.StorageReference;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import ch.epfl.sweng.studyup.R;
import ch.epfl.sweng.studyup.firebase.FileStorage;

import static ch.epfl.sweng.studyup.utils.GlobalAccessVariables.MOCK_ENABLED;

abstract class AddOrEditQuestionActivityHelperMethods {
    private static final String TAG = AddOrEditQuestionActivityHelperMethods.class.getSimpleName();

    protected static void setupEditQuestion(Activity act, int trueFalseOrMCQId, int langButtonId, String questionTitle) {
        changeAddButtonToEditButton(act);
        setUpQuestionTitle(act, questionTitle);
        setTrueFasleMCQRadioButtonFirstTime(act, trueFalseOrMCQId);
        setUpMCQTrueFalseRadioButtons(act, trueFalseOrMCQId);
        setupTextAndImage(act);
        setupLang(act, langButtonId);

        String chosenCourseText = act.getString(R.string.chosen_course_for_question) + ((AddOrEditQuestionActivity) act).getChosenCourse().toString();
        ((TextView) act.findViewById(R.id.chosenCourseTextView)).setText(chosenCourseText);
    }

    private static void setupLang(Activity act, int langButtonId) {
        RadioButton langSelected = act.findViewById(langButtonId);
        langSelected.setChecked(true);
    }

    private static void changeAddButtonToEditButton(Activity act) {
        Button addEditButton = act.findViewById(R.id.addOrEditQuestionButton);
        addEditButton.setText(act.getString(R.string.edit_button_text));
    }

    private static void setUpQuestionTitle(Activity act, String title) {
        TextView questionTitle = act.findViewById(R.id.questionTitle);
        questionTitle.setText(title);
    }

    private static void setTrueFasleMCQRadioButtonFirstTime(Activity act, int trueFalseOrMCQId) {
        if (trueFalseOrMCQId == R.id.true_false_radio) {
            RadioButton tfRadio = act.findViewById(R.id.true_false_radio);
            tfRadio.setChecked(true);
        } else {
            RadioButton mcqRadio = act.findViewById(R.id.mcq_radio);
            mcqRadio.setChecked(true);
        }
    }

    /**
     * Sets the MCQ or True/False Radio Buttons. This method is used when a question is being edited
     * to display the corresponding checked radio buttons and is also used when the radio listener is being set
     *
     * @param trueFalseOrMCQID chooses between MCQ or True/False alternatives
     */
    private static void setUpMCQTrueFalseRadioButtons(Activity act, int trueFalseOrMCQID) {
        RadioButton firstRadioButton = act.findViewById(R.id.radio_answer1);
        RadioButton secondRadioButton = act.findViewById(R.id.radio_answer2);
        RadioButton thirdRadioButton = act.findViewById(R.id.radio_answer3);
        RadioButton fourthRadioButton = act.findViewById(R.id.radio_answer4);

        if (trueFalseOrMCQID == R.id.true_false_radio) {
            setupRadioButtonForTrueFalse(act, firstRadioButton, secondRadioButton, thirdRadioButton, fourthRadioButton);
        } else {
            setupRadioButtonForMCQ(act, firstRadioButton, secondRadioButton, thirdRadioButton, fourthRadioButton);
        }
    }

    private static void setupRadioButtonForMCQ(Activity act, RadioButton r1, RadioButton r2, RadioButton r3, RadioButton r4) {
        //unmask the last two buttons and set the text to the first ones to numbers
        r3.setVisibility(View.VISIBLE);
        r3.setChecked(false);
        r4.setVisibility(View.VISIBLE);
        r4.setChecked(false);
        if (!((AddOrEditQuestionActivity) act).isNewQuestion() && !((AddOrEditQuestionActivity) act).isTrueFalse()) {
            switch (((AddOrEditQuestionActivity) act).getAnswer()) {
                case 0:
                    r1.setChecked(true);
                    break;
                case 1:
                    r2.setChecked(true);
                    break;
                case 2:
                    r3.setChecked(true);
                    break;
                case 3:
                    r4.setChecked(true);
                    break;
            }
        } else {
            r1.setChecked(true);
        }
        //Change the text to the 1st and second button to True and False
        r1.setText("1");
        r2.setText("2");
    }

    private static void setupRadioButtonForTrueFalse(Activity act, RadioButton r1, RadioButton r2, RadioButton r3, RadioButton r4) {
        //mask the 3rd and 4th radio button and uncheck them
        r3.setVisibility(View.INVISIBLE);
        r3.setChecked(false);
        r4.setVisibility(View.INVISIBLE);
        r4.setChecked(false);
        //Change the text to the 1st and second button to True and False
        r1.setText(act.getString(R.string.truth_value));
        r2.setText(act.getString(R.string.false_value));
        if (!((AddOrEditQuestionActivity) act).isNewQuestion() && ((AddOrEditQuestionActivity) act).isTrueFalse()) {
            switch (((AddOrEditQuestionActivity) act).getAnswer()) {
                case 0:
                    r1.setChecked(true);
                    break;
                case 1:
                    r2.setChecked(true);
                    break;
            }
        }  else {
            r1.setChecked(true);
        }
    }

    private static void setupTextAndImage(Activity act) {
        String questionID = ((AddOrEditQuestionActivity) act).getId();

        StorageReference questionImage = FileStorage.getProblemImageRef(Uri.parse(questionID + ".png"));
        final StorageReference questionText = FileStorage.getProblemImageRef(Uri.parse(questionID + ".txt"));
        try {
            final File tempImage = File.createTempFile(questionID, "png");
            final File tempText = File.createTempFile(questionID, "txt");
            setupImage(act, questionImage, tempImage);
            setupText(act, questionText, tempText);
        } catch (IOException e) {
            Toast.makeText(act, act.getString(R.string.error_when_download_question), Toast.LENGTH_SHORT).show();
            act.finish();
        }
    }

    private static void setupImage(final Activity act, StorageReference questionImage, final File tempImage) {
        questionImage.getFile(tempImage).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                Bitmap displayImage = BitmapFactory.decodeFile(tempImage.getAbsolutePath());
                ImageView displayImageView = act.findViewById(R.id.addQuestion_display_image);
                displayImageView.setImageBitmap(displayImage);

                setImageOrTextBasedRadioButtonFirstTime(act, R.id.image_radio_button);
                setUpImageOrTextBasedRadioButtons(act, R.id.image_radio_button);
                if(!MOCK_ENABLED) act.findViewById(R.id.progressBar).setVisibility(View.GONE);
                ((AddOrEditQuestionActivity) act).setBitmap(displayImage);
            }
        });
    }

    private static void setupText(final Activity act, StorageReference questionText, final File tempText) {
        questionText.getFile(tempText).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                String displayText = "";
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(tempText.getAbsolutePath())));
                    StringBuilder sb = new StringBuilder(); String line;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line).append("\n");
                    }

                    reader.close();

                    if (sb.length() > 0) {
                        displayText = sb.toString().substring(0, sb.length() - 1);
                    }
                } catch (Exception e) { Log.e(TAG, e.toString()); act.finish(); }
                if(!MOCK_ENABLED) act.findViewById(R.id.progressBar).setVisibility(View.GONE);
                ((EditText) act.findViewById(R.id.questionText)).setText(displayText);
                setImageOrTextBasedRadioButtonFirstTime(act, R.id.text_radio_button);
                setUpImageOrTextBasedRadioButtons(act, R.id.text_radio_button);
            }
        });
    }

    protected static void addRadioListener(final Activity act) {
        RadioGroup trueFalseRadioGroup = act.findViewById(R.id.true_false_or_mcq_radio_group);
        trueFalseRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                setUpMCQTrueFalseRadioButtons(act, checkedId);
            }
        });

        RadioGroup imageTextRadioGroup = act.findViewById(R.id.text_or_image_radio_group);
        imageTextRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                setUpImageOrTextBasedRadioButtons(act, checkedId);
            }
        });
    }

    /**
     * Sets the Image-based or Text-based Radio Buttons. This method is used when a question is being edited
     * to display the corresponding checked radio buttons and is also used when the radio listener is being set
     *
     * @param imageOrTextQuestioniD chooses between image-based or text-based alternatives
     */
    private static void setUpImageOrTextBasedRadioButtons(Activity act, int imageOrTextQuestioniD) {
        Button selectImageButton = act.findViewById(R.id.selectImageButton);
        ImageView imageQuestion = act.findViewById(R.id.addQuestion_display_image);
        TextView questionText = act.findViewById(R.id.questionText);
        if (imageOrTextQuestioniD == R.id.text_radio_button) {
            //mask everything related to the image-based question
            selectImageButton.setVisibility(View.GONE);
            imageQuestion.setVisibility(View.GONE);
            //display the text for the question
            questionText.setVisibility(View.VISIBLE);
        } else {
            //show everything related to the image-based question
            selectImageButton.setVisibility(View.VISIBLE);
            imageQuestion.setVisibility(View.VISIBLE);
            //mask the text for the question
            questionText.setVisibility(View.GONE);
        }
    }

    private static void setImageOrTextBasedRadioButtonFirstTime(Activity act, int imageOrTextQuestionId) {
        if (imageOrTextQuestionId == R.id.text_radio_button) {
            RadioButton tRadio = act.findViewById(R.id.text_radio_button);
            tRadio.setChecked(true);
        } else {
            RadioButton iRadio = act.findViewById(R.id.image_radio_button);
            iRadio.setChecked(true);
        }
    }
}