nheyek/SDP-2018

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

Summary

Maintainability
B
4 hrs
Test Coverage
package ch.epfl.sweng.studyup.teacher;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import ch.epfl.sweng.studyup.R;
import ch.epfl.sweng.studyup.player.UserData;
import ch.epfl.sweng.studyup.questions.DisplayQuestionActivity;
import ch.epfl.sweng.studyup.questions.Question;
import ch.epfl.sweng.studyup.utils.Constants.Course;

import static ch.epfl.sweng.studyup.utils.StatsUtils.getQuestionIdsForCourse;
import static ch.epfl.sweng.studyup.utils.StatsUtils.getStudentsForCourse;
import static ch.epfl.sweng.studyup.utils.Utils.setupToolbar;


public class DisplayCourseStatsActivity extends CourseStatsActivity {

    private Course course;

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

        Intent intent = getIntent();
        course = Course.valueOf(intent.getStringExtra(DisplayQuestionActivity.class.getName()));

        TextView name_course = findViewById(R.id.course_name);
        name_course.setText(course.toString());

        TextView nb_students = findViewById(R.id.nb_students);
        List<UserData> userList = getStudentsForCourse(allUsers, course);
        nb_students.setText("Number of enrolled students: " + String.valueOf(userList.size()));
        setupListViewP(userList);


        TextView nb_quests = findViewById(R.id.nb_questions);
        List<String> qList = getQuestionIdsForCourse(allQuestions, course);
        nb_quests.setText("Number of questions for this course: " + String.valueOf(qList.size()));
        setupListViewQ(qList);

    }

    public void onBackButton(View view) {
        finish();
    }

    protected void setupListViewP(final List<UserData> userList) {
        ListView listView = findViewById(R.id.listViewPlayer);

        ArrayList<Integer> rates = new ArrayList<>();
        ArrayList<Integer> nb_answer = new ArrayList<>();

        List<String> quests_course = getQuestionIdsForCourse(allQuestions, course);
        Set<String> s1 = new HashSet<>(quests_course);

        for (UserData user : userList) {
            HashMap<String, List<String>> answered_total = new HashMap<>(user.getAnsweredQuestions());

            double nb_good_answer_course = 0;
            int nb_answer_course;
            Set<String> s2 = answered_total.keySet();
            s2.retainAll(s1); //s2 = only String Question Id (from course) which user answered to
            nb_answer_course = s2.size();
            for (String s : s2) {
                if(answered_total.get(s) != null) {
                    boolean isAnswerTrue = Boolean.parseBoolean(answered_total.get(s).get(0));
                    if(isAnswerTrue) nb_good_answer_course++;
                }
            }
            int rate_user_in_a_course = nb_answer_course == 0 ? 0 : (int)(100*nb_good_answer_course/nb_answer_course);
            rates.add(rate_user_in_a_course);
            nb_answer.add(nb_answer_course);
        }


        ListUserAdapter listUserAdapter = new ListUserAdapter(this,  userList, rates, nb_answer, quests_course.size());
        listView.setAdapter(listUserAdapter);
    }

    protected void setupListViewQ(final List<String> questions_course) {
        ListView listView = findViewById(R.id.listViewQuestionForStats);

        ArrayList<Integer> rates = new ArrayList<>();
        ArrayList<Integer> nb_answer = new ArrayList<>();

        List<UserData> students_in_course = getStudentsForCourse(allUsers, course);

        for (String question_string : questions_course) {
            int a_user_ans = 0;
            int a_user_good_ans = 0;
            for(UserData user : students_in_course) {
                HashMap<String, List<String>> user_ans_q = new HashMap<>(user.getAnsweredQuestions());
                if (user_ans_q.containsKey(question_string)) {
                    a_user_ans++;
                    boolean isAnswerTrue = Boolean.parseBoolean(user_ans_q.get(question_string).get(0));
                    if (isAnswerTrue) {
                        a_user_good_ans++;
                    }
                }
            }
            int rate = a_user_ans == 0 ? 0 : 100*a_user_good_ans/a_user_ans;
            rates.add(rate);
            nb_answer.add(a_user_ans);
        }
        ListQuestionStatAdapter listQAdapter = new ListQuestionStatAdapter(this, questions_course, rates, nb_answer, students_in_course.size());
        listView.setAdapter(listQAdapter);
    }



    private class ListUserAdapter extends BaseAdapter {

        private Context cnx;
        private List<UserData> user;
        private ArrayList<Integer> rates;
        private ArrayList<Integer> nb_answer;
        private int total_quests_for_course;

        ListUserAdapter(Context cnx,
                        List<UserData> user,
                        ArrayList<Integer> rates,
                        ArrayList<Integer> nb_answer,
                        int total_quests_for_course) {
            this.cnx=cnx;
            this.user =user;
            this.nb_answer=nb_answer;
            this.rates=rates;
            this.total_quests_for_course=total_quests_for_course;
        }

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

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

        @Override
        public long getItemId(int position) {
            return Integer.parseInt(user.get(position).getSciperNum());

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView==null){
                convertView=View.inflate(cnx, R.layout.player_stat_item_model, null);
            }
            TextView text_view_last = convertView.findViewById(R.id.last_name);
            TextView text_view_success = convertView.findViewById(R.id.success_rate);
            TextView text_view_sciper = convertView.findViewById(R.id.sciper);
            TextView text_view_nb_answer = convertView.findViewById(R.id.quests_answered);

            String name = user.get(position).getLastName();
            String first_firstname = user.get(position).getFirstName();
            if(first_firstname.contains(" ")) {
                first_firstname = first_firstname.substring(0, first_firstname.indexOf(' '));
            }
            name = name + ' ' + first_firstname;
            text_view_last.setText(name);
            String successString = "Success on answered : "+rates.get(position)+"%";
            text_view_success.setTextColor(setColor(rates.get(position), nb_answer.get(position)));
            text_view_success.setText(successString);
            text_view_sciper.setText(user.get(position).getSciperNum());
            String qAnsString = "Quests answered : "+nb_answer.get(position)+"/"+total_quests_for_course;
            text_view_nb_answer.setText(qAnsString);

            return convertView;
        }
    }

    private class ListQuestionStatAdapter extends BaseAdapter {

        private Context cnx;
        private List<String> questions;
        private ArrayList<Integer> rates;
        private ArrayList<Integer> nb_answer;
        private int total_questions_for_course;

        ListQuestionStatAdapter(Context cnx,
                                List<String> questions,
                                ArrayList<Integer> rates,
                                ArrayList<Integer> nb_answer,
                                int total_quests_for_course) {
            this.cnx=cnx;
            this.questions =questions;
            this.nb_answer=nb_answer;
            this.rates=rates;
            this.total_questions_for_course =total_quests_for_course;
        }

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

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

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView==null){
                convertView=View.inflate(cnx, R.layout.player_stat_item_model, null);
            }
            TextView text_view_last = convertView.findViewById(R.id.last_name);
            TextView text_view_success = convertView.findViewById(R.id.success_rate);
            TextView text_view_sciper = convertView.findViewById(R.id.sciper);
            TextView text_view_nb_answer = convertView.findViewById(R.id.quests_answered);

            String Title = "";
            boolean isTF = false;
            List<Question> allQ = allQuestions;
            for (Question q: allQ) {
                if(q.getQuestionId().equals(questions.get(position))) {
                    Title = q.getTitle();
                    isTF = q.isTrueFalse();
                }
            }
            text_view_last.setText(Title.substring(0, Math.min(Title.length(), 25)));
            if(isTF) text_view_sciper.setText("T/F");
            else text_view_sciper.setText("MCQ");
            String successString = "Success answers : "+rates.get(position)+"%";
            text_view_success.setTextColor(setColor(rates.get(position), nb_answer.get(position)));
            text_view_success.setText(successString);
            String qAnsString = "Student answers : "+nb_answer.get(position)+"/"+ total_questions_for_course;
            text_view_nb_answer.setText(qAnsString);

            return convertView;
        }
    }

}