nheyek/SDP-2018

View on GitHub
app/src/main/java/ch/epfl/sweng/studyup/teacher/QuestsActivityTeacher.java

Summary

Maintainability
A
2 hrs
Test Coverage
package ch.epfl.sweng.studyup.teacher;

import android.app.AlertDialog;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.Observer;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;

import java.util.ArrayList;
import java.util.List;

import ch.epfl.sweng.studyup.R;
import ch.epfl.sweng.studyup.firebase.FileStorage;
import ch.epfl.sweng.studyup.firebase.Firestore;
import ch.epfl.sweng.studyup.player.Player;
import ch.epfl.sweng.studyup.questions.AddOrEditQuestionActivity;
import ch.epfl.sweng.studyup.questions.Question;
import ch.epfl.sweng.studyup.utils.Callback;
import ch.epfl.sweng.studyup.utils.Utils;
import ch.epfl.sweng.studyup.utils.navigation.NavigationTeacher;

import static ch.epfl.sweng.studyup.questions.QuestionParser.parseQuestionsLiveData;
import static ch.epfl.sweng.studyup.teacher.ManageCourseActivity.refreshTeachingCourse;
import static ch.epfl.sweng.studyup.utils.Constants.COLOR_SETTINGS_KEYWORD;
import static ch.epfl.sweng.studyup.utils.Constants.FB_QUESTIONS;
import static ch.epfl.sweng.studyup.utils.Constants.QUESTS_INDEX_TEACHER;
import static ch.epfl.sweng.studyup.utils.Constants.SETTINGS_COLOR_DARK;
import static ch.epfl.sweng.studyup.utils.Constants.SETTINGS_COLOR_RED;
import static ch.epfl.sweng.studyup.utils.Constants.USER_PREFS;
import static ch.epfl.sweng.studyup.utils.Utils.setupToolbar;

public class QuestsActivityTeacher extends NavigationTeacher {
    private static final String TAG = QuestsActivityTeacher.class.getSimpleName();

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

        navigationSwitcher(QuestsActivityTeacher.this, QuestsActivityTeacher.class, QUESTS_INDEX_TEACHER);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Callback<List<Question>> onQuestionLoaded = new Callback<List<Question>>() {
            @Override
            public void call(List<Question> questions) {
                setupListView(questions);
            }
        };
        Firestore.get().loadQuestions(this, onQuestionLoaded);
        refreshTeachingCourse();
    }

    protected void setupListView(final List<Question> quests) {
        List<Integer> listLang = new ArrayList<>();

        for (Question q : quests) {
            switch (q.getLang().toLowerCase()) {
                case "fr":
                    listLang.add(R.drawable.ic_fr_flag);
                    break;
                case "en":
                    listLang.add(R.drawable.ic_en_flag);
                    break;
                default: // Error
                    listLang.add(R.drawable.ic_cross_red_24dp);
                    break;
            }
        }

        ListView listView = findViewById(R.id.listViewQuests);
        QuestListViewAdapterTeacher adapter = new QuestListViewAdapterTeacher(this, R.layout.quest_teacher_model, quests, listLang);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                startActivity(new Intent(parent.getContext(), AddOrEditQuestionActivity.class).putExtra(AddOrEditQuestionActivity.class.getSimpleName(), quests.get(position)));
            }
        });
    }

    public void addNewQuestion(View view) {
        if(Player.get().getCoursesTeached().isEmpty()) {
            Toast.makeText(QuestsActivityTeacher.this, R.string.not_teaching_any_course, Toast.LENGTH_SHORT).show();
        } else {
            startActivity(new Intent(this.getApplicationContext(), AddOrEditQuestionActivity.class));
        }
    }


    private class QuestListViewAdapterTeacher extends BaseAdapter {
        private Context cnx;
        private int idLayout;
        private List<Question> questions;
        private List<Integer> lang;

        public QuestListViewAdapterTeacher(Context cnx, int idLayout, List<Question> questions, List<Integer> lang) {
            this.cnx = cnx;
            this.questions = questions;
            this.idLayout = idLayout;
            this.lang = lang;
        }

        @Override
        public int getCount() {
            return questions.size();
        }

        @Override
        public Object getItem(int position) {
            return questions.get(position);
        }

        @Override
        public long getItemId(int position) {
            return questions.get(position).hashCode();
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                convertView = View.inflate(cnx, idLayout, null);
            }
            TextView text_view = convertView.findViewById(R.id.quest_title);
            text_view.setText(questions.get(position).getTitle());
            ImageView delete = convertView.findViewById(R.id.delete_question);
            delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String col = getSharedPreferences(USER_PREFS, MODE_PRIVATE)
                            .getString(COLOR_SETTINGS_KEYWORD, SETTINGS_COLOR_RED);
                    AlertDialog.Builder alertDialogDelete = col.equals(SETTINGS_COLOR_DARK) ?
                            new AlertDialog.Builder(cnx, AlertDialog.THEME_DEVICE_DEFAULT_DARK) : new AlertDialog.Builder(cnx);

                    alertDialogDelete.setTitle(R.string.ask_confirmation_deletion_quest)
                            .setNegativeButton(R.string.no_upper, null)
                            .setPositiveButton(R.string.yes_upper, new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    deleteQuestion(questions.get(position).getQuestionId());
                                    Utils.waitAndTag(1000, TAG);
                                    onResume();
                                }
                            });
                    alertDialogDelete.show();
                }
            });

            ImageView lang_view = convertView.findViewById(R.id.lang_img);
            lang_view.setImageResource(lang.get(position));

            TextView course = convertView.findViewById(R.id.course_quest);
            course.setText(questions.get(position).getCourseName());

            return convertView;
        }

        /**
         * Method that delete a question and its corresponding image
         *
         * @param questionId the id of the question
         */
        private void deleteQuestion(final String questionId) {
            Firestore.get().getDb().collection(FB_QUESTIONS).document(questionId).delete()
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            if (task.isSuccessful()) {
                                FileStorage.getProblemImageRef(Uri.parse(questionId + ".png")).delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        if(task.isSuccessful()) {
                                            Log.i(TAG, "The question image has been deleted from the database.");
                                        }
                                    }
                                });
                            } else {
                                Log.e(TAG, "Failed to delete the question's data from the database.");
                            }
                        }
                    });
        }
    }
}