From 145ede52658fd225d71aead5a944d52c5b630e25 Mon Sep 17 00:00:00 2001 From: Alexis Date: Fri, 5 Jun 2020 16:04:45 +0200 Subject: [PATCH 1/4] create new Branch --- .../ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java b/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java index b2a5c1a3..747cefd4 100644 --- a/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java +++ b/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java @@ -136,6 +136,7 @@ public void onConfirm(ConfirmDialog dialog) { if (currIndex == quiz.getQuestions().size() - 1) { // If the last question was answered, we finish the activity. // In the future, we have to go to the result page. + finish(); } else { // If there are remaining questions, we locate the next one From cfe1aa068efad9d05b8353e9605ff95e804228c4 Mon Sep 17 00:00:00 2001 From: Alexis Date: Fri, 5 Jun 2020 16:45:43 +0200 Subject: [PATCH 2/4] refactored correction methods in a util class and added treasureHunt correction --- .../epfl/qedit/model/answer/MatrixModel.java | 8 +++ .../epfl/qedit/view/quiz/CorrectionUtil.java | 69 +++++++++++++++++++ .../treasurehunt/TreasureHuntActivity.java | 10 ++- 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java diff --git a/app/src/main/java/ch/epfl/qedit/model/answer/MatrixModel.java b/app/src/main/java/ch/epfl/qedit/model/answer/MatrixModel.java index d5b90daf..c86dfbcc 100644 --- a/app/src/main/java/ch/epfl/qedit/model/answer/MatrixModel.java +++ b/app/src/main/java/ch/epfl/qedit/model/answer/MatrixModel.java @@ -68,6 +68,14 @@ private boolean checkFieldEquals( } } + public int getNumRows() { + return numRows; + } + + public int getNumCols() { + return numCols; + } + @Override public Map toMap() { Map map = new HashMap<>(); diff --git a/app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java b/app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java new file mode 100644 index 00000000..d4813020 --- /dev/null +++ b/app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java @@ -0,0 +1,69 @@ +package ch.epfl.qedit.view.quiz; + +import android.content.Context; +import android.content.Intent; +import android.opengl.Matrix; +import android.os.Bundle; + +import com.google.common.collect.ImmutableList; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import ch.epfl.qedit.model.Question; +import ch.epfl.qedit.model.Quiz; +import ch.epfl.qedit.model.User; +import ch.epfl.qedit.model.answer.AnswerModel; +import ch.epfl.qedit.model.answer.MatrixFormat; +import ch.epfl.qedit.model.answer.MatrixModel; + +import static ch.epfl.qedit.view.home.HomeActivity.USER; +import static ch.epfl.qedit.view.home.HomeQuizListFragment.QUIZ_ID; + +public final class CorrectionUtil { + private CorrectionUtil(){} + private static ArrayList correctedQuestions; + + public static List correctedQuestions(ImmutableList questions, HashMapanswers){ + correctedQuestions= new ArrayList<>(); + Listcorrected = new ArrayList<>(); + for(int i =0;i getGoodAnswers(){ + return correctedQuestions; + } + public static void startCorrection(ImmutableList questions, HashMap answers, Context context, User user){ + Quiz questionsLocked = new Quiz("Correction", correctedQuestions(questions,answers); + Intent intent = new Intent(context, QuizActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + Bundle bundle = new Bundle(); + bundle.putSerializable(QUIZ_ID,questionsLocked); + bundle.putIntegerArrayList(GOOD_ANSWERS,CorrectionUtil.getGoodAnswers()); + bundle.putSerializable(USER,user); + bundle.putBoolean(CORRECTION,true); + intent.putExtras(bundle); + context.startActivity(intent); + } +} diff --git a/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java b/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java index 747cefd4..799540fb 100644 --- a/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java +++ b/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java @@ -1,5 +1,6 @@ package ch.epfl.qedit.view.treasurehunt; +import static ch.epfl.qedit.view.home.HomeActivity.USER; import static ch.epfl.qedit.view.home.HomeQuizListFragment.QUIZ_ID; import android.content.Intent; @@ -14,7 +15,10 @@ import ch.epfl.qedit.R; import ch.epfl.qedit.model.Question; import ch.epfl.qedit.model.Quiz; +import ch.epfl.qedit.model.User; +import ch.epfl.qedit.view.quiz.CorrectionUtil; import ch.epfl.qedit.view.quiz.QuestionFragment; +import ch.epfl.qedit.view.quiz.QuizActivity; import ch.epfl.qedit.view.util.ConfirmDialog; import ch.epfl.qedit.viewmodel.QuizViewModel; import java.util.Objects; @@ -41,7 +45,7 @@ public class TreasureHuntActivity extends AppCompatActivity // to help the user, and the second is used to show the question. private View helperView; private FragmentContainerView questionView; - + private User user; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -54,7 +58,7 @@ protected void onCreate(Bundle savedInstanceState) { // We retrieve the quiz from the intent that started the activity Intent intent = getIntent(); quiz = (Quiz) Objects.requireNonNull(intent.getExtras()).getSerializable(QUIZ_ID); - + user = (User) Objects.requireNonNull(intent.getExtras().getSerializable(USER)); // Uncomment those lines (and comments the two above lines) to test the UI on your emulator // Location loc1 = new Location(""); // loc.setLongitude(1); @@ -136,8 +140,8 @@ public void onConfirm(ConfirmDialog dialog) { if (currIndex == quiz.getQuestions().size() - 1) { // If the last question was answered, we finish the activity. // In the future, we have to go to the result page. + CorrectionUtil.startCorrection(quiz.getQuestions(),model.getAnswers().getValue(),this,user); - finish(); } else { // If there are remaining questions, we locate the next one locateQuestion(currIndex + 1); From 5f5595c9415fe47dbd7a6ab60dc0dd6cd8d9ca22 Mon Sep 17 00:00:00 2001 From: Alexis Date: Fri, 5 Jun 2020 16:58:13 +0200 Subject: [PATCH 3/4] Added missing keys --- .../epfl/qedit/view/quiz/CorrectionUtil.java | 108 ++++++++++-------- .../ch/epfl/qedit/view/quiz/QuizActivity.java | 2 + .../treasurehunt/TreasureHuntActivity.java | 5 +- 3 files changed, 63 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java b/app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java index d4813020..925b86ba 100644 --- a/app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java +++ b/app/src/main/java/ch/epfl/qedit/view/quiz/CorrectionUtil.java @@ -1,69 +1,77 @@ package ch.epfl.qedit.view.quiz; +import static ch.epfl.qedit.view.home.HomeActivity.USER; +import static ch.epfl.qedit.view.home.HomeQuizListFragment.QUIZ_ID; +import static ch.epfl.qedit.view.quiz.QuizActivity.CORRECTION; +import static ch.epfl.qedit.view.quiz.QuizActivity.GOOD_ANSWERS; + import android.content.Context; import android.content.Intent; -import android.opengl.Matrix; import android.os.Bundle; - -import com.google.common.collect.ImmutableList; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import ch.epfl.qedit.model.Question; import ch.epfl.qedit.model.Quiz; import ch.epfl.qedit.model.User; import ch.epfl.qedit.model.answer.AnswerModel; import ch.epfl.qedit.model.answer.MatrixFormat; import ch.epfl.qedit.model.answer.MatrixModel; - -import static ch.epfl.qedit.view.home.HomeActivity.USER; -import static ch.epfl.qedit.view.home.HomeQuizListFragment.QUIZ_ID; +import com.google.common.collect.ImmutableList; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; public final class CorrectionUtil { - private CorrectionUtil(){} + private CorrectionUtil() {} + private static ArrayList correctedQuestions; - public static List correctedQuestions(ImmutableList questions, HashMapanswers){ - correctedQuestions= new ArrayList<>(); - Listcorrected = new ArrayList<>(); - for(int i =0;i correctedQuestions( + ImmutableList questions, HashMap answers) { + correctedQuestions = new ArrayList<>(); + List corrected = new ArrayList<>(); + for (int i = 0; i < questions.size(); i++) { MatrixModel answerModel = (MatrixModel) answers.get(i); - int goodAnswer = questions.get(i).getFormat().correct(answerModel) ? 1:0; - correctedQuestions.add(i,goodAnswer); - corrected.add(i,makePrefilledMatrixQuestion(answerModel,questions.get(i))); + int goodAnswer = questions.get(i).getFormat().correct(answerModel) ? 1 : 0; + correctedQuestions.add(i, goodAnswer); + corrected.add(i, makePrefilledMatrixQuestion(answerModel, questions.get(i))); } return corrected; - } - static Question makePrefilledMatrixQuestion(MatrixModel answerModel,Question quizQuestion){ - MatrixModel model; - if(answerModel==null){ - model = (MatrixModel)quizQuestion.getFormat().getEmptyAnswerModel(); - }else{ - model=answerModel; - } - MatrixFormat.Builder builder = new MatrixFormat.Builder(model.getNumRows(),model.getNumCols()); - for(int x =0;x getGoodAnswers(){ - return correctedQuestions; - } - public static void startCorrection(ImmutableList questions, HashMap answers, Context context, User user){ - Quiz questionsLocked = new Quiz("Correction", correctedQuestions(questions,answers); - Intent intent = new Intent(context, QuizActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - Bundle bundle = new Bundle(); - bundle.putSerializable(QUIZ_ID,questionsLocked); - bundle.putIntegerArrayList(GOOD_ANSWERS,CorrectionUtil.getGoodAnswers()); - bundle.putSerializable(USER,user); - bundle.putBoolean(CORRECTION,true); - intent.putExtras(bundle); - context.startActivity(intent); - } + } + + static Question makePrefilledMatrixQuestion(MatrixModel answerModel, Question quizQuestion) { + MatrixModel model; + if (answerModel == null) { + model = (MatrixModel) quizQuestion.getFormat().getEmptyAnswerModel(); + } else { + model = answerModel; + } + MatrixFormat.Builder builder = + new MatrixFormat.Builder(model.getNumRows(), model.getNumCols()); + for (int x = 0; x < model.getNumRows(); x++) { + for (int y = 0; y < model.getNumCols(); y++) { + builder.withField(x, y, MatrixFormat.Field.preFilledField(model.getAnswer(x, y))); + } + } + return new Question(quizQuestion.getTitle(), quizQuestion.getText(), builder.build()); + } + + public static ArrayList getGoodAnswers() { + return correctedQuestions; + } + + public static void startCorrection( + ImmutableList questions, + HashMap answers, + Context context, + User user) { + Quiz questionsLocked = new Quiz("Correction", correctedQuestions(questions, answers)); + Intent intent = new Intent(context, QuizActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + Bundle bundle = new Bundle(); + bundle.putSerializable(QUIZ_ID, questionsLocked); + bundle.putIntegerArrayList(GOOD_ANSWERS, CorrectionUtil.getGoodAnswers()); + bundle.putSerializable(USER, user); + bundle.putBoolean(CORRECTION, true); + intent.putExtras(bundle); + context.startActivity(intent); + } } diff --git a/app/src/main/java/ch/epfl/qedit/view/quiz/QuizActivity.java b/app/src/main/java/ch/epfl/qedit/view/quiz/QuizActivity.java index 56f8b342..8794fc00 100644 --- a/app/src/main/java/ch/epfl/qedit/view/quiz/QuizActivity.java +++ b/app/src/main/java/ch/epfl/qedit/view/quiz/QuizActivity.java @@ -25,6 +25,8 @@ import java.util.Objects; public class QuizActivity extends AppCompatActivity implements ConfirmDialog.ConfirmationListener { + public static final String GOOD_ANSWERS = "ch.epfl.qedit.quiz.GOOD_ANSWERS"; + public static final String CORRECTION = "ch.epfl.qedit.quiz.CORRECTION"; private QuizViewModel model; private Boolean overviewActive; diff --git a/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java b/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java index 799540fb..c75c3deb 100644 --- a/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java +++ b/app/src/main/java/ch/epfl/qedit/view/treasurehunt/TreasureHuntActivity.java @@ -18,7 +18,6 @@ import ch.epfl.qedit.model.User; import ch.epfl.qedit.view.quiz.CorrectionUtil; import ch.epfl.qedit.view.quiz.QuestionFragment; -import ch.epfl.qedit.view.quiz.QuizActivity; import ch.epfl.qedit.view.util.ConfirmDialog; import ch.epfl.qedit.viewmodel.QuizViewModel; import java.util.Objects; @@ -46,6 +45,7 @@ public class TreasureHuntActivity extends AppCompatActivity private View helperView; private FragmentContainerView questionView; private User user; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -140,7 +140,8 @@ public void onConfirm(ConfirmDialog dialog) { if (currIndex == quiz.getQuestions().size() - 1) { // If the last question was answered, we finish the activity. // In the future, we have to go to the result page. - CorrectionUtil.startCorrection(quiz.getQuestions(),model.getAnswers().getValue(),this,user); + CorrectionUtil.startCorrection( + quiz.getQuestions(), model.getAnswers().getValue(), this, user); } else { // If there are remaining questions, we locate the next one From 843175c3fbbbe38b28eef3cca634e13995fbe157 Mon Sep 17 00:00:00 2001 From: Alexis Date: Fri, 5 Jun 2020 17:19:38 +0200 Subject: [PATCH 4/4] added necessary extras to bundle when calling treasurehuntactivity and changed one test --- .../qedit/treasurehunt/TreasureHuntActivityTest.java | 12 +++++++----- .../epfl/qedit/view/home/HomeQuizListFragment.java | 7 +++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/androidTest/java/ch/epfl/qedit/treasurehunt/TreasureHuntActivityTest.java b/app/src/androidTest/java/ch/epfl/qedit/treasurehunt/TreasureHuntActivityTest.java index cb935fcf..a3546b08 100644 --- a/app/src/androidTest/java/ch/epfl/qedit/treasurehunt/TreasureHuntActivityTest.java +++ b/app/src/androidTest/java/ch/epfl/qedit/treasurehunt/TreasureHuntActivityTest.java @@ -11,12 +11,12 @@ import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static ch.epfl.qedit.view.home.HomeActivity.USER; import static ch.epfl.qedit.view.home.HomeQuizListFragment.QUIZ_ID; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; import android.content.Intent; import android.os.Bundle; @@ -29,8 +29,10 @@ import ch.epfl.qedit.backend.permission.PermManagerFactory; import ch.epfl.qedit.model.Question; import ch.epfl.qedit.model.Quiz; +import ch.epfl.qedit.model.User; import ch.epfl.qedit.model.answer.AnswerFormat; import ch.epfl.qedit.model.answer.MatrixFormat; +import ch.epfl.qedit.view.quiz.QuizActivity; import ch.epfl.qedit.view.treasurehunt.QuestionLocatorActivity; import ch.epfl.qedit.view.treasurehunt.TreasureHuntActivity; import java.util.Collections; @@ -50,7 +52,7 @@ public class TreasureHuntActivityTest { public void init(int numQuestions) { Intent intent = new Intent(); Bundle bundle = new Bundle(); - + User user = new User("Charles", "Magne"); // We create a mock permission service, otherwise the UI test might fail because // android shows a permission popup PermManagerFactory.setInstance(new MockPermManager()); @@ -66,7 +68,7 @@ public void init(int numQuestions) { AnswerFormat format = MatrixFormat.singleField(MatrixFormat.Field.textField("")); Question question = new Question("title", "text", format, 42, 43, 100); Quiz quiz = new Quiz("title", Collections.nCopies(numQuestions, question), true); - + bundle.putSerializable(USER, user); bundle.putSerializable(QUIZ_ID, quiz); intent.putExtras(bundle); @@ -149,10 +151,10 @@ public void testLastQuestionEndsTreasureHunt() { onView(withText(R.string.treasure_hunt_start)).perform(click()); findQuestion(); - // Clicking on "done" for the last question should finish the activity + // Clicking on "done" for the last question should start the correction assertFalse(testRule.getActivity().isFinishing()); onView(withId(R.id.question_done)).perform(click()); onView(withId(android.R.id.button1)).perform(click()); - assertTrue(testRule.getActivity().isFinishing()); + intended(allOf(hasComponent(QuizActivity.class.getName()))); } } diff --git a/app/src/main/java/ch/epfl/qedit/view/home/HomeQuizListFragment.java b/app/src/main/java/ch/epfl/qedit/view/home/HomeQuizListFragment.java index 46b88be1..0f1d82d7 100644 --- a/app/src/main/java/ch/epfl/qedit/view/home/HomeQuizListFragment.java +++ b/app/src/main/java/ch/epfl/qedit/view/home/HomeQuizListFragment.java @@ -7,6 +7,7 @@ import static ch.epfl.qedit.view.edit.EditQuizSettingsDialog.NO_FILTER; import static ch.epfl.qedit.view.edit.EditQuizSettingsDialog.QUIZ_BUILDER; import static ch.epfl.qedit.view.home.HomeActivity.USER; +import static ch.epfl.qedit.view.quiz.QuizActivity.CORRECTION; import android.content.Intent; import android.os.Bundle; @@ -58,7 +59,7 @@ public class HomeQuizListFragment extends Fragment private int deleteIndex; private int modifyIndex = -1; - + private User user; private List> quizzes; @Override @@ -78,7 +79,7 @@ public View onCreateView( createTextFilter(); // Get user from the bundle created by the parent activity and get his/her quizzes - User user = (User) Objects.requireNonNull(getArguments()).getSerializable(USER); + user = (User) Objects.requireNonNull(getArguments()).getSerializable(USER); quizzes = new ArrayList<>(user.getQuizzes().entrySet().asList()); // Create the list adapter and bind it to the list edit view @@ -221,6 +222,8 @@ private void launchQuizActivity(Quiz quiz) { // We put the quiz into the bundle Bundle bundle = new Bundle(); bundle.putSerializable(QUIZ_ID, quiz); + bundle.putBoolean(CORRECTION, false); + bundle.putSerializable(USER, user); intent.putExtras(bundle); // And start the activity