From f4b997b41fbfa1747624659f8cd94274bd339db8 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sat, 28 Sep 2019 22:14:57 +0200 Subject: [PATCH 1/5] [Api/Librus] Add syncing and saving teacher absence --- .../edziennik/data/api/Librus.java | 45 ++- .../edziennik/data/db/AppDb.java | 24 +- .../db/modules/lessons/LessonChangeDao.java | 2 +- .../data/db/modules/metadata/Metadata.java | 1 + .../data/db/modules/metadata/MetadataDao.java | 2 +- .../db/modules/teachers/TeacherAbsence.kt | 27 ++ .../db/modules/teachers/TeacherAbsenceDao.kt | 26 ++ .../db/modules/teachers/TeacherAbsenceFull.kt | 14 + .../modules/agenda/AgendaDefaultFragment.java | 337 +++++++++--------- .../modules/agenda}/LessonChangeCounter.java | 2 +- .../utils/models/{db => }/UnreadCounter.kt | 2 +- 11 files changed, 298 insertions(+), 184 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsence.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt rename app/src/main/java/pl/szczodrzynski/edziennik/{utils/models/db => ui/modules/agenda}/LessonChangeCounter.java (77%) rename app/src/main/java/pl/szczodrzynski/edziennik/utils/models/{db => }/UnreadCounter.kt (86%) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java index aa7f635f..0887267f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Librus.java @@ -72,6 +72,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile; import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileFull; import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject; import pl.szczodrzynski.edziennik.data.db.modules.teachers.Teacher; +import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsence; import pl.szczodrzynski.edziennik.data.db.modules.teams.Team; import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesComposeInfo; import pl.szczodrzynski.edziennik.utils.models.Date; @@ -170,6 +171,7 @@ public class Librus implements EdziennikInterface { private List teamList; private List teacherList; + private List teacherAbsenceList; private List subjectList; private List lessonList; private List lessonChangeList; @@ -240,6 +242,7 @@ public class Librus implements EdziennikInterface { teamList = profileId == -1 ? new ArrayList<>() : app.db.teamDao().getAllNow(profileId); teacherList = profileId == -1 ? new ArrayList<>() : app.db.teacherDao().getAllNow(profileId); + teacherAbsenceList = new ArrayList<>(); subjectList = new ArrayList<>(); lessonList = new ArrayList<>(); lessonChangeList = new ArrayList<>(); @@ -293,6 +296,7 @@ public class Librus implements EdziennikInterface { targetEndpoints.add("BehaviourGrades"); targetEndpoints.add("Events"); + targetEndpoints.add("TeacherFreeDays"); targetEndpoints.add("CustomTypes"); targetEndpoints.add("Homework"); targetEndpoints.add("LuckyNumbers"); @@ -349,6 +353,7 @@ public class Librus implements EdziennikInterface { targetEndpoints.add("CustomTypes"); targetEndpoints.add("PtMeetings"); targetEndpoints.add("SchoolFreeDays"); + targetEndpoints.add("TeacherFreeDays"); break; case FEATURE_GRADES: targetEndpoints.add("SavedGradeCategories"); @@ -589,6 +594,8 @@ public class Librus implements EdziennikInterface { } if (eventTypeList.size() > 0) app.db.eventTypeDao().addAll(eventTypeList); + if (teacherAbsenceList.size() > 0) + app.db.teacherAbsenceDao().addAll(teacherAbsenceList); if (noticeList.size() > 0) { app.db.noticeDao().clear(profileId); app.db.noticeDao().addAll(noticeList); @@ -3107,6 +3114,10 @@ public class Librus implements EdziennikInterface { private SparseArray teacherFreeDaysTypes = new SparseArray<>(); private void getTeacherFreeDaysTypes() { + if (!fullSync) { + r("finish", "TeacherFreeDaysTypes"); + return; + } callback.onActionStarted(R.string.sync_action_syncing_teacher_free_days_types); apiRequest("TeacherFreeDays/Types", data -> { if (data == null) { @@ -3141,27 +3152,35 @@ public class Librus implements EdziennikInterface { JsonObject freeDay = freeDayEl.getAsJsonObject(); long id = freeDay.get("Id").getAsLong(); + long teacherId = freeDay.getAsJsonObject("Teacher").get("Id").getAsLong(); Date dateFrom = Date.fromY_m_d(freeDay.get("DateFrom").getAsString()); Date dateTo = Date.fromY_m_d(freeDay.get("DateTo").getAsString()); - int type = freeDay.getAsJsonObject("Type").get("Id").getAsInt(); - String topic = teacherFreeDaysTypes.get(type)+"\n"+(dateFrom.getValue() != dateTo.getValue() ? dateFrom.getFormattedString()+" - "+dateTo.getFormattedString() : ""); - Event eventObject = new Event( + long type = freeDay.getAsJsonObject("Type").get("Id").getAsLong(); + + //String topic = teacherFreeDaysTypes.get(type)+"\n"+(dateFrom.getValue() != dateTo.getValue() ? dateFrom.getFormattedString()+" - "+dateTo.getFormattedString() : ""); + + TeacherAbsence teacherAbsence = new TeacherAbsence( profileId, id, + teacherId, + type, dateFrom, - null, - topic, - -1, - TYPE_TEACHER_ABSENCE, - false, - freeDay.getAsJsonObject("Teacher").get("Id").getAsLong(), - -1, - -1 + dateTo ); - eventList.add(eventObject); - metadataList.add(new Metadata(profileId, Metadata.TYPE_EVENT, eventObject.id, profile.getEmpty(), profile.getEmpty(), System.currentTimeMillis())); + + teacherAbsenceList.add(teacherAbsence); + metadataList.add( + new Metadata( + profileId, + Metadata.TYPE_TEACHER_ABSENCE, + teacherAbsence.getId(), + true, + true, + System.currentTimeMillis()) + ); + } r("finish", "TeacherFreeDays"); } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java index 647a94aa..207bd749 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/AppDb.java @@ -1,5 +1,6 @@ package pl.szczodrzynski.edziennik.data.db; +import androidx.annotation.NonNull; import androidx.sqlite.db.SupportSQLiteDatabase; import androidx.room.Database; import androidx.room.Room; @@ -49,6 +50,8 @@ import pl.szczodrzynski.edziennik.data.db.modules.profiles.ProfileDao; import pl.szczodrzynski.edziennik.data.db.modules.subjects.Subject; import pl.szczodrzynski.edziennik.data.db.modules.subjects.SubjectDao; import pl.szczodrzynski.edziennik.data.db.modules.teachers.Teacher; +import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsence; +import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceDao; import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherDao; import pl.szczodrzynski.edziennik.data.db.modules.teams.Team; import pl.szczodrzynski.edziennik.data.db.modules.teams.TeamDao; @@ -60,6 +63,7 @@ import android.content.Context; Grade.class, //GradeCategory.class, Teacher.class, + TeacherAbsence.class, Subject.class, Notice.class, Lesson.class, @@ -77,7 +81,7 @@ import android.content.Context; Message.class, MessageRecipient.class, DebugLog.class, - Metadata.class}, version = 52) + Metadata.class}, version = 53) @TypeConverters({ ConverterTime.class, ConverterDate.class, @@ -89,6 +93,7 @@ public abstract class AppDb extends RoomDatabase { public abstract GradeDao gradeDao(); //public abstract GradeCategoryDao gradeCategoryDao(); public abstract TeacherDao teacherDao(); + public abstract TeacherAbsenceDao teacherAbsenceDao(); public abstract SubjectDao subjectDao(); public abstract NoticeDao noticeDao(); public abstract LessonDao lessonDao(); @@ -532,6 +537,20 @@ public abstract class AppDb extends RoomDatabase { database.execSQL("ALTER TABLE teachers ADD teacherTypeDescription TEXT DEFAULT NULL"); } }; + private static final Migration MIGRATION_52_53 = new Migration(52, 53) { + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("CREATE TABLE IF NOT EXISTS teacherAbsence (" + + "profileId INTEGER NOT NULL," + + "teacherAbsenceId INTEGER NOT NULL," + + "teacherId INTEGER NOT NULL," + + "teacherAbsenceType INTEGER NOT NULL," + + "teacherAbsenceDateFrom TEXT NOT NULL," + + "teacherAbsenceDateTo TEXT NOT NULL," + + "PRIMARY KEY(profileId, teacherAbsenceId)" + + ")"); + } + }; public static AppDb getDatabase(final Context context) { @@ -581,7 +600,8 @@ public abstract class AppDb extends RoomDatabase { MIGRATION_48_49, MIGRATION_49_50, MIGRATION_50_51, - MIGRATION_51_52) + MIGRATION_51_52, + MIGRATION_52_53) .allowMainThreadQueries() //.fallbackToDestructiveMigration() .build(); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java index d270eed3..2200ccd6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java @@ -12,7 +12,7 @@ import androidx.room.RawQuery; import java.util.List; import pl.szczodrzynski.edziennik.utils.models.Date; -import pl.szczodrzynski.edziennik.utils.models.db.LessonChangeCounter; +import pl.szczodrzynski.edziennik.ui.modules.agenda.LessonChangeCounter; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_LESSON_CHANGE; import static pl.szczodrzynski.edziennik.utils.Utils.d; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/Metadata.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/Metadata.java index 3e5be9f0..a621fe26 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/Metadata.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/Metadata.java @@ -18,6 +18,7 @@ public class Metadata { public static final int TYPE_LESSON_CHANGE = 6; public static final int TYPE_ANNOUNCEMENT = 7; public static final int TYPE_MESSAGE = 8; + public static final int TYPE_TEACHER_ABSENCE = 9; public int profileId; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java index e7f3a410..d86b9f16 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/metadata/MetadataDao.java @@ -17,7 +17,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.grades.Grade; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonChange; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; import pl.szczodrzynski.edziennik.data.db.modules.messages.Message; -import pl.szczodrzynski.edziennik.utils.models.db.UnreadCounter; +import pl.szczodrzynski.edziennik.utils.models.UnreadCounter; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ANNOUNCEMENT; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_ATTENDANCE; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsence.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsence.kt new file mode 100644 index 00000000..a8839fc9 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsence.kt @@ -0,0 +1,27 @@ +package pl.szczodrzynski.edziennik.data.db.modules.teachers + +import androidx.room.ColumnInfo +import androidx.room.Entity +import pl.szczodrzynski.edziennik.utils.models.Date + +@Entity(tableName = "teacherAbsence", + primaryKeys = ["profileId", "teacherAbsenceId"]) +open class TeacherAbsence ( + + val profileId: Int, + + @ColumnInfo(name = "teacherAbsenceId") + val id: Long, + + val teacherId: Long, + + @ColumnInfo(name = "teacherAbsenceType") + val type: Long, + + @ColumnInfo(name = "teacherAbsenceDateFrom") + val dateFrom: Date, + + @ColumnInfo(name = "teacherAbsenceDateTo") + val dateTo: Date + +) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt new file mode 100644 index 00000000..68f2ae95 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt @@ -0,0 +1,26 @@ +package pl.szczodrzynski.edziennik.data.db.modules.teachers + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import pl.szczodrzynski.edziennik.utils.models.Date + +@Dao +interface TeacherAbsenceDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun add(teacherAbsence: TeacherAbsence) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun addAll(teacherAbsenceList: List) + + @Query("SELECT profileId, teacherAbsenceDateFrom, teacherAbsenceDateTo, COUNT(*) as teacherAbsenceCount" + + "from teacherAbsence WHERE profileId = :profileId GROUP BY teacherAbsenceDateFrom, teacherAbsenceDateTo") + fun getCounters(profileId: Int) + + @Query("SELECT profileId, teacherAbsenceDateFrom, teacherAbsenceDateTo, COUNT(*) as teacherAbsenceCount" + + "from teacherAbsence WHERE profileId = :profileId AND :date BETWEEN teacherAbsenceDateFrom and teacherAbsenceDateTo" + + "GROUP BY teacherAbsenceDateFrom, teacherAbsenceDateTo") + fun getCounterByDate(profileId: Int, date: Date) +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt new file mode 100644 index 00000000..b37f24f1 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt @@ -0,0 +1,14 @@ +package pl.szczodrzynski.edziennik.data.db.modules.teachers + +import pl.szczodrzynski.edziennik.utils.models.Date + +class TeacherAbsenceFull(profileId: Int, id: Long, teacherId: Long, type: Long, dateFrom: Date, dateTo: Date) + : TeacherAbsence(profileId, id, teacherId, type, dateFrom, dateTo) { + + var teacherFullName = "" + + // metadata + var seen: Boolean = false + var notified: Boolean = false + var addedDate: Long = 0 +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaDefaultFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaDefaultFragment.java index ec5f847b..98a2f18f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaDefaultFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaDefaultFragment.java @@ -45,7 +45,6 @@ import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog; import pl.szczodrzynski.edziennik.ui.dialogs.lessonchange.LessonChangeDialog; import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Time; -import pl.szczodrzynski.edziennik.utils.models.db.LessonChangeCounter; import pl.szczodrzynski.edziennik.utils.Colors; import pl.szczodrzynski.edziennik.utils.Themes; import pl.szczodrzynski.edziennik.utils.Utils; @@ -136,68 +135,76 @@ public class AgendaDefaultFragment extends Fragment { activity.gainAttention(); if (viewType == AGENDA_DEFAULT) { - List unreadEventDates = new ArrayList<>(); + createDefaultAgendaView(); + } + else { + createCalendarAgendaView(); + } + } - final Handler handler = new Handler(); - handler.postDelayed(() -> AsyncTask.execute(() -> { - if (app == null || app.profile == null || activity == null || b_default == null || !isAdded()) - return; + private void createDefaultAgendaView() { + List unreadEventDates = new ArrayList<>(); - List eventList = new ArrayList<>(); + final Handler handler = new Handler(); + handler.postDelayed(() -> AsyncTask.execute(() -> { + if (app == null || app.profile == null || activity == null || b_default == null || !isAdded()) + return; - List lessonChangeCounters = app.db.lessonChangeDao().getLessonChangeCountersNow(App.profileId); - for (LessonChangeCounter counter : lessonChangeCounters) { - Calendar startTime = Calendar.getInstance(); - Calendar endTime = Calendar.getInstance(); - if (counter.lessonChangeDate == null) { - continue; - } - startTime.set(counter.lessonChangeDate.year, counter.lessonChangeDate.month - 1, counter.lessonChangeDate.day, 10, 0, 0); - endTime.setTimeInMillis(startTime.getTimeInMillis() + (1000 * 60 * 45)); - eventList.add(new LessonChangeEvent( - counter.lessonChangeDate.getInMillis(), - 0xff78909c, - Colors.legibleTextColor(0xff78909c), - startTime, - endTime, - counter.profileId, - counter.lessonChangeDate, - counter.lessonChangeCount - )); + List eventList = new ArrayList<>(); + + List lessonChangeCounters = app.db.lessonChangeDao().getLessonChangeCountersNow(App.profileId); + for (LessonChangeCounter counter : lessonChangeCounters) { + Calendar startTime = Calendar.getInstance(); + Calendar endTime = Calendar.getInstance(); + if (counter.lessonChangeDate == null) { + continue; } + startTime.set(counter.lessonChangeDate.year, counter.lessonChangeDate.month - 1, counter.lessonChangeDate.day, 10, 0, 0); + endTime.setTimeInMillis(startTime.getTimeInMillis() + (1000 * 60 * 45)); + eventList.add(new LessonChangeEvent( + counter.lessonChangeDate.getInMillis(), + 0xff78909c, + Colors.legibleTextColor(0xff78909c), + startTime, + endTime, + counter.profileId, + counter.lessonChangeDate, + counter.lessonChangeCount + )); + } - List events = app.db.eventDao().getAllNow(App.profileId); - for (EventFull event : events) { - Calendar startTime = Calendar.getInstance(); - Calendar endTime = Calendar.getInstance(); - if (event.eventDate == null) - continue; - startTime.set( - event.eventDate.year, - event.eventDate.month - 1, - event.eventDate.day, - event.startTime == null ? 0 : event.startTime.hour, - event.startTime == null ? 0 : event.startTime.minute, - event.startTime == null ? 0 : event.startTime.second - ); - endTime.setTimeInMillis(startTime.getTimeInMillis() + (1000 * 60 * 45)); - eventList.add(new BaseCalendarEvent(event.typeName + " - " + event.topic, - "", - (event.startTime == null ? getString(R.string.agenda_event_all_day) : event.startTime.getStringHM()) + - Utils.bs(", ", event.subjectLongName) + - Utils.bs(", ", event.teacherFullName) + - Utils.bs(", ", event.teamName), - event.getColor(), - Colors.legibleTextColor(event.getColor()), - startTime, - endTime, - event.startTime == null, - event.id, !event.seen)); - if (!event.seen) { - unreadEventDates.add(event.eventDate.getValue()); - } + List events = app.db.eventDao().getAllNow(App.profileId); + for (EventFull event : events) { + Calendar startTime = Calendar.getInstance(); + Calendar endTime = Calendar.getInstance(); + if (event.eventDate == null) + continue; + startTime.set( + event.eventDate.year, + event.eventDate.month - 1, + event.eventDate.day, + event.startTime == null ? 0 : event.startTime.hour, + event.startTime == null ? 0 : event.startTime.minute, + event.startTime == null ? 0 : event.startTime.second + ); + endTime.setTimeInMillis(startTime.getTimeInMillis() + (1000 * 60 * 45)); + eventList.add(new BaseCalendarEvent(event.typeName + " - " + event.topic, + "", + (event.startTime == null ? getString(R.string.agenda_event_all_day) : event.startTime.getStringHM()) + + Utils.bs(", ", event.subjectLongName) + + Utils.bs(", ", event.teacherFullName) + + Utils.bs(", ", event.teamName), + event.getColor(), + Colors.legibleTextColor(event.getColor()), + startTime, + endTime, + event.startTime == null, + event.id, !event.seen)); + if (!event.seen) { + unreadEventDates.add(event.eventDate.getValue()); } + } /*List lessonChanges = app.db.lessonChangeDao().getAllChangesWithLessonsNow(App.profileId); for (LessonFull lesson: lessonChanges) { @@ -232,126 +239,126 @@ public class AgendaDefaultFragment extends Fragment { (int)lesson.changeId, false)); }*/ - activity.runOnUiThread(() -> { - AgendaCalendarView mAgendaCalendarView = b_default.agendaDefaultView; - // minimum and maximum date of our calendar - // 2 month behind, one year ahead, example: March 2015 <-> May 2015 <-> May 2016 - Calendar minDate = Calendar.getInstance(); - Calendar maxDate = Calendar.getInstance(); + activity.runOnUiThread(() -> { + AgendaCalendarView mAgendaCalendarView = b_default.agendaDefaultView; + // minimum and maximum date of our calendar + // 2 month behind, one year ahead, example: March 2015 <-> May 2015 <-> May 2016 + Calendar minDate = Calendar.getInstance(); + Calendar maxDate = Calendar.getInstance(); - minDate.add(Calendar.MONTH, -2); - minDate.set(Calendar.DAY_OF_MONTH, 1); - maxDate.add(Calendar.MONTH, 2); + minDate.add(Calendar.MONTH, -2); + minDate.set(Calendar.DAY_OF_MONTH, 1); + maxDate.add(Calendar.MONTH, 2); - mAgendaCalendarView.init(eventList, minDate, maxDate, Locale.getDefault(), new CalendarPickerController() { - @Override - public void onDaySelected(IDayItem dayItem) { - } - - @Override - public void onScrollToDate(Calendar calendar) { - int scrolledDate = Date.fromCalendar(calendar).getValue(); - if (unreadEventDates.contains(scrolledDate)) { - AsyncTask.execute(() -> app.db.eventDao().setSeenByDate(App.profileId, Date.fromYmd(intToStr(scrolledDate)), true)); - unreadEventDates.remove(unreadEventDates.indexOf(scrolledDate)); - } - } - - @Override - public void onEventSelected(CalendarEvent calendarEvent) { - if (calendarEvent instanceof BaseCalendarEvent) { - if (!calendarEvent.isPlaceholder() && !calendarEvent.isAllDay()) { - new EventListDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay()), Time.fromMillis(calendarEvent.getStartTime().getTimeInMillis()), true); - } else { - new EventListDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); - } - } else if (calendarEvent instanceof LessonChangeEvent) { - new LessonChangeDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); - //Toast.makeText(app, "Clicked "+((LessonChangeEvent) calendarEvent).getLessonChangeDate().getFormattedString(), Toast.LENGTH_SHORT).show(); - } - } - }, new LessonChangeEventRenderer()); - b_default.progressBar.setVisibility(View.GONE); - }); - }), 500); - } - else { - List unreadEventDates = new ArrayList<>(); - - final Handler handler = new Handler(); - handler.postDelayed(() -> AsyncTask.execute(() -> { - if (app == null || app.profile == null || activity == null || b_calendar == null || !isAdded()) - return; - Context c = getContext(); - Activity a = getActivity(); - assert c != null; - assert a != null; - if (!isAdded()) { - return; - } - - List eventList = new ArrayList<>(); - - List events = app.db.eventDao().getAllNow(App.profileId); - for (EventFull event : events) { - if (event.eventDate == null) - continue; - Calendar startTime = Calendar.getInstance(); - startTime.set( - event.eventDate.year, - event.eventDate.month - 1, - event.eventDate.day, - event.startTime == null ? 0 : event.startTime.hour, - event.startTime == null ? 0 : event.startTime.minute, - event.startTime == null ? 0 : event.startTime.second - ); - Drawable eventIcon = new IconicsDrawable(activity).icon(CommunityMaterial.Icon.cmd_checkbox_blank_circle).size(IconicsSize.dp(10)).color(IconicsColor.colorInt(event.getColor())); - eventList.add(new EventDay(startTime, eventIcon)); - if (!event.seen) { - unreadEventDates.add(event.eventDate.getValue()); + mAgendaCalendarView.init(eventList, minDate, maxDate, Locale.getDefault(), new CalendarPickerController() { + @Override + public void onDaySelected(IDayItem dayItem) { } - } - List lessonChanges = app.db.lessonChangeDao().getAllChangesWithLessonsNow(App.profileId); - - for (LessonFull lesson: lessonChanges) { - Calendar startTime = Calendar.getInstance(); - if (lesson.lessonDate == null) { - continue; - } - startTime.set( - lesson.lessonDate.year, - lesson.lessonDate.month - 1, - lesson.lessonDate.day, - lesson.startTime.hour, - lesson.startTime.minute, - lesson.startTime.second); - Drawable eventIcon = new IconicsDrawable(activity).icon(CommunityMaterial.Icon.cmd_checkbox_blank_circle).size(IconicsSize.dp(10)).color(IconicsColor.colorInt(0xff78909c)); - eventList.add(new EventDay(startTime, eventIcon)); - } - - getActivity().runOnUiThread(() -> { - //List eventList = new ArrayList<>(); - - //Collections.sort(eventList, new EventListComparator()); - - CalendarView calendarView = b_calendar.agendaCalendarView; - calendarView.setEvents(eventList); - calendarView.setOnDayClickListener(eventDay -> { - Date dayDate = Date.fromCalendar(eventDay.getCalendar()); - int scrolledDate = dayDate.getValue(); + @Override + public void onScrollToDate(Calendar calendar) { + int scrolledDate = Date.fromCalendar(calendar).getValue(); if (unreadEventDates.contains(scrolledDate)) { AsyncTask.execute(() -> app.db.eventDao().setSeenByDate(App.profileId, Date.fromYmd(intToStr(scrolledDate)), true)); unreadEventDates.remove(unreadEventDates.indexOf(scrolledDate)); } + } - new EventListDialog(getContext()).show(app, dayDate); - }); - b_calendar.progressBar.setVisibility(View.GONE); + @Override + public void onEventSelected(CalendarEvent calendarEvent) { + if (calendarEvent instanceof BaseCalendarEvent) { + if (!calendarEvent.isPlaceholder() && !calendarEvent.isAllDay()) { + new EventListDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay()), Time.fromMillis(calendarEvent.getStartTime().getTimeInMillis()), true); + } else { + new EventListDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); + } + } else if (calendarEvent instanceof LessonChangeEvent) { + new LessonChangeDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); + //Toast.makeText(app, "Clicked "+((LessonChangeEvent) calendarEvent).getLessonChangeDate().getFormattedString(), Toast.LENGTH_SHORT).show(); + } + } + }, new LessonChangeEventRenderer()); + b_default.progressBar.setVisibility(View.GONE); + }); + }), 500); + } + + private void createCalendarAgendaView() { + List unreadEventDates = new ArrayList<>(); + + final Handler handler = new Handler(); + handler.postDelayed(() -> AsyncTask.execute(() -> { + if (app == null || app.profile == null || activity == null || b_calendar == null || !isAdded()) + return; + Context c = getContext(); + Activity a = getActivity(); + assert c != null; + assert a != null; + if (!isAdded()) { + return; + } + + List eventList = new ArrayList<>(); + + List events = app.db.eventDao().getAllNow(App.profileId); + for (EventFull event : events) { + if (event.eventDate == null) + continue; + Calendar startTime = Calendar.getInstance(); + startTime.set( + event.eventDate.year, + event.eventDate.month - 1, + event.eventDate.day, + event.startTime == null ? 0 : event.startTime.hour, + event.startTime == null ? 0 : event.startTime.minute, + event.startTime == null ? 0 : event.startTime.second + ); + Drawable eventIcon = new IconicsDrawable(activity).icon(CommunityMaterial.Icon.cmd_checkbox_blank_circle).size(IconicsSize.dp(10)).color(IconicsColor.colorInt(event.getColor())); + eventList.add(new EventDay(startTime, eventIcon)); + if (!event.seen) { + unreadEventDates.add(event.eventDate.getValue()); + } + } + + List lessonChanges = app.db.lessonChangeDao().getAllChangesWithLessonsNow(App.profileId); + + for (LessonFull lesson: lessonChanges) { + Calendar startTime = Calendar.getInstance(); + if (lesson.lessonDate == null) { + continue; + } + startTime.set( + lesson.lessonDate.year, + lesson.lessonDate.month - 1, + lesson.lessonDate.day, + lesson.startTime.hour, + lesson.startTime.minute, + lesson.startTime.second); + Drawable eventIcon = new IconicsDrawable(activity).icon(CommunityMaterial.Icon.cmd_checkbox_blank_circle).size(IconicsSize.dp(10)).color(IconicsColor.colorInt(0xff78909c)); + eventList.add(new EventDay(startTime, eventIcon)); + } + + getActivity().runOnUiThread(() -> { + //List eventList = new ArrayList<>(); + + //Collections.sort(eventList, new EventListComparator()); + + CalendarView calendarView = b_calendar.agendaCalendarView; + calendarView.setEvents(eventList); + calendarView.setOnDayClickListener(eventDay -> { + Date dayDate = Date.fromCalendar(eventDay.getCalendar()); + int scrolledDate = dayDate.getValue(); + if (unreadEventDates.contains(scrolledDate)) { + AsyncTask.execute(() -> app.db.eventDao().setSeenByDate(App.profileId, Date.fromYmd(intToStr(scrolledDate)), true)); + unreadEventDates.remove(unreadEventDates.indexOf(scrolledDate)); + } + + new EventListDialog(getContext()).show(app, dayDate); }); - }), 300); - } + b_calendar.progressBar.setVisibility(View.GONE); + }); + }), 300); } public static class EventListComparator implements java.util.Comparator { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/db/LessonChangeCounter.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeCounter.java similarity index 77% rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/models/db/LessonChangeCounter.java rename to app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeCounter.java index 2ebf319a..799794d8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/db/LessonChangeCounter.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeCounter.java @@ -1,4 +1,4 @@ -package pl.szczodrzynski.edziennik.utils.models.db; +package pl.szczodrzynski.edziennik.ui.modules.agenda; import pl.szczodrzynski.edziennik.utils.models.Date; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/db/UnreadCounter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/UnreadCounter.kt similarity index 86% rename from app/src/main/java/pl/szczodrzynski/edziennik/utils/models/db/UnreadCounter.kt rename to app/src/main/java/pl/szczodrzynski/edziennik/utils/models/UnreadCounter.kt index 7e05bc2b..73fbb1a8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/db/UnreadCounter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/models/UnreadCounter.kt @@ -1,4 +1,4 @@ -package pl.szczodrzynski.edziennik.utils.models.db +package pl.szczodrzynski.edziennik.utils.models import pl.szczodrzynski.navlib.drawer.IUnreadCounter From 0b0cd4c76e75bfaf8360f8a4744cc277e4825eea Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sun, 29 Sep 2019 00:07:29 +0200 Subject: [PATCH 2/5] [Agenda] Add teachers absence counting as event --- .../szczodrzynski/edziennik/MainActivity.kt | 4 +- .../db/modules/lessons/LessonChangeDao.java | 2 +- .../db/modules/teachers/TeacherAbsenceDao.kt | 17 +- .../db/modules/teachers/TeacherAbsenceFull.kt | 2 - .../agenda/AgendaCalendarFragment.java | 138 ------------- ...faultFragment.java => AgendaFragment.java} | 50 ++++- .../LessonChangeCounter.java | 2 +- .../{ => lessonchange}/LessonChangeEvent.java | 2 +- .../LessonChangeEventRenderer.java | 2 +- .../teacherabsence/TeacherAbsenceCounter.kt | 10 + .../teacherabsence/TeacherAbsenceEvent.kt | 188 ++++++++++++++++++ .../TeacherAbsenceEventRenderer.kt | 21 ++ .../layout/agenda_event_teacher_absence.xml | 14 ++ .../row_dialog_teacher_absence_item.xml | 35 ++++ app/src/main/res/values-en/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 16 files changed, 333 insertions(+), 156 deletions(-) delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaCalendarFragment.java rename app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/{AgendaDefaultFragment.java => AgendaFragment.java} (87%) rename app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/{ => lessonchange}/LessonChangeCounter.java (73%) rename app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/{ => lessonchange}/LessonChangeEvent.java (98%) rename app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/{ => lessonchange}/LessonChangeEventRenderer.java (93%) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceCounter.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEvent.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt create mode 100644 app/src/main/res/layout/agenda_event_teacher_absence.xml create mode 100644 app/src/main/res/layout/row_dialog_teacher_absence_item.xml diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index 4995f873..3d931e25 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -56,7 +56,7 @@ import pl.szczodrzynski.edziennik.ui.modules.messages.MessagesFragment import pl.szczodrzynski.edziennik.utils.models.NavTarget import pl.szczodrzynski.edziennik.network.ServerRequest import pl.szczodrzynski.edziennik.sync.SyncJob -import pl.szczodrzynski.edziennik.ui.modules.agenda.AgendaDefaultFragment +import pl.szczodrzynski.edziennik.ui.modules.agenda.AgendaFragment import pl.szczodrzynski.edziennik.ui.modules.announcements.AnnouncementsFragment import pl.szczodrzynski.edziennik.ui.modules.attendance.AttendanceFragment import pl.szczodrzynski.edziennik.ui.modules.base.DebugFragment @@ -128,7 +128,7 @@ class MainActivity : AppCompatActivity() { .withBadgeTypeId(TYPE_LESSON_CHANGE) .isInDrawer(true) - list += NavTarget(DRAWER_ITEM_AGENDA, R.string.menu_agenda, AgendaDefaultFragment::class) + list += NavTarget(DRAWER_ITEM_AGENDA, R.string.menu_agenda, AgendaFragment::class) .withIcon(CommunityMaterial.Icon.cmd_calendar) .withBadgeTypeId(TYPE_EVENT) .isInDrawer(true) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java index 2200ccd6..c854ce99 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/lessons/LessonChangeDao.java @@ -12,7 +12,7 @@ import androidx.room.RawQuery; import java.util.List; import pl.szczodrzynski.edziennik.utils.models.Date; -import pl.szczodrzynski.edziennik.ui.modules.agenda.LessonChangeCounter; +import pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange.LessonChangeCounter; import static pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata.TYPE_LESSON_CHANGE; import static pl.szczodrzynski.edziennik.utils.Utils.d; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt index 68f2ae95..35387742 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt @@ -4,7 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import pl.szczodrzynski.edziennik.utils.models.Date +import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata @Dao interface TeacherAbsenceDao { @@ -15,12 +15,13 @@ interface TeacherAbsenceDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun addAll(teacherAbsenceList: List) - @Query("SELECT profileId, teacherAbsenceDateFrom, teacherAbsenceDateTo, COUNT(*) as teacherAbsenceCount" + - "from teacherAbsence WHERE profileId = :profileId GROUP BY teacherAbsenceDateFrom, teacherAbsenceDateTo") - fun getCounters(profileId: Int) + @Query("SELECT * FROM teacherAbsence WHERE profileId = :profileId") + fun getAll(profileId: Int): List - @Query("SELECT profileId, teacherAbsenceDateFrom, teacherAbsenceDateTo, COUNT(*) as teacherAbsenceCount" + - "from teacherAbsence WHERE profileId = :profileId AND :date BETWEEN teacherAbsenceDateFrom and teacherAbsenceDateTo" + - "GROUP BY teacherAbsenceDateFrom, teacherAbsenceDateTo") - fun getCounterByDate(profileId: Int, date: Date) + @Query("SELECT *, teachers.teacherName || ' ' || teachers.teacherSurname as teacherFullName, " + + "metadata.seen, metadata.notified, metadata.addedDate FROM teacherAbsence " + + "LEFT JOIN teachers USING (profileId, teacherId) " + + "LEFT JOIN metadata ON teacherAbsenceId = thingId AND metadata.thingType = " + Metadata.TYPE_TEACHER_ABSENCE + + " AND metadata.profileId = :profileId WHERE teachers.profileId = :profileId") + fun getAllFull(profileId: Int): List } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt index b37f24f1..aec02ee3 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt @@ -5,8 +5,6 @@ import pl.szczodrzynski.edziennik.utils.models.Date class TeacherAbsenceFull(profileId: Int, id: Long, teacherId: Long, type: Long, dateFrom: Date, dateTo: Date) : TeacherAbsence(profileId, id, teacherId, type, dateFrom, dateTo) { - var teacherFullName = "" - // metadata var seen: Boolean = false var notified: Boolean = false diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaCalendarFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaCalendarFragment.java deleted file mode 100644 index ffd58d51..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaCalendarFragment.java +++ /dev/null @@ -1,138 +0,0 @@ -package pl.szczodrzynski.edziennik.ui.modules.agenda; - -import android.app.Activity; -import android.content.Context; -import android.graphics.drawable.Drawable; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.databinding.DataBindingUtil; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.applandeo.materialcalendarview.CalendarView; -import com.applandeo.materialcalendarview.EventDay; -import com.mikepenz.iconics.IconicsColor; -import com.mikepenz.iconics.IconicsDrawable; -import com.mikepenz.iconics.IconicsSize; -import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; - -import pl.szczodrzynski.edziennik.App; -import pl.szczodrzynski.edziennik.R; -import pl.szczodrzynski.edziennik.databinding.FragmentAgendaCalendarBinding; -import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull; -import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; -import pl.szczodrzynski.edziennik.ui.dialogs.event.EventListDialog; -import pl.szczodrzynski.edziennik.utils.models.Date; -import pl.szczodrzynski.edziennik.utils.Themes; - -import static pl.szczodrzynski.edziennik.utils.Utils.intToStr; - -public class AgendaCalendarFragment extends Fragment { - - private App app = null; - private Activity activity = null; - private FragmentAgendaCalendarBinding b = null; - - @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - activity = getActivity(); - if (getActivity() == null || getContext() == null) - return null; - app = (App) activity.getApplication(); - getContext().getTheme().applyStyle(Themes.INSTANCE.getAppTheme(), true); - if (app.profile == null) - return inflater.inflate(R.layout.fragment_loading, container, false); - // activity, context and profile is valid - b = DataBindingUtil.inflate(inflater, R.layout.fragment_agenda_calendar, container, false); - return b.getRoot(); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - if (app == null || app.profile == null || activity == null || b == null || !isAdded()) - return; - - List unreadEventDates = new ArrayList<>(); - - final Handler handler = new Handler(); - handler.postDelayed(() -> AsyncTask.execute(() -> { - Context c = getContext(); - Activity a = getActivity(); - assert c != null; - assert a != null; - if (!isAdded()) { - return; - } - - List eventList = new ArrayList<>(); - - List events = app.db.eventDao().getAllNow(App.profileId); - for (EventFull event : events) { - if (event.eventDate == null) - continue; - Calendar startTime = Calendar.getInstance(); - startTime.set( - event.eventDate.year, - event.eventDate.month - 1, - event.eventDate.day, - event.startTime == null ? 0 : event.startTime.hour, - event.startTime == null ? 0 : event.startTime.minute, - event.startTime == null ? 0 : event.startTime.second - ); - Drawable eventIcon = new IconicsDrawable(activity).icon(CommunityMaterial.Icon.cmd_checkbox_blank_circle).size(IconicsSize.dp(10)).color(IconicsColor.colorInt(event.getColor())); - eventList.add(new EventDay(startTime, eventIcon)); - if (!event.seen) { - unreadEventDates.add(event.eventDate.getValue()); - } - } - - List lessonChanges = app.db.lessonChangeDao().getAllChangesWithLessonsNow(App.profileId); - - for (LessonFull lesson: lessonChanges) { - Calendar startTime = Calendar.getInstance(); - if (lesson.lessonDate == null) { - continue; - } - startTime.set( - lesson.lessonDate.year, - lesson.lessonDate.month - 1, - lesson.lessonDate.day, - lesson.startTime.hour, - lesson.startTime.minute, - lesson.startTime.second); - Drawable eventIcon = new IconicsDrawable(activity).icon(CommunityMaterial.Icon.cmd_checkbox_blank_circle).size(IconicsSize.dp(10)).color(IconicsColor.colorInt(0xff78909c)); - eventList.add(new EventDay(startTime, eventIcon)); - } - - getActivity().runOnUiThread(() -> { - //List eventList = new ArrayList<>(); - - //Collections.sort(eventList, new EventListComparator()); - - CalendarView calendarView = b.agendaCalendarView; - calendarView.setEvents(eventList); - calendarView.setOnDayClickListener(eventDay -> { - Date dayDate = Date.fromCalendar(eventDay.getCalendar()); - int scrolledDate = dayDate.getValue(); - if (unreadEventDates.contains(scrolledDate)) { - AsyncTask.execute(() -> app.db.eventDao().setSeenByDate(App.profileId, Date.fromYmd(intToStr(scrolledDate)), true)); - unreadEventDates.remove(unreadEventDates.indexOf(scrolledDate)); - } - - new EventListDialog(getContext()).show(app, dayDate); - }); - b.progressBar.setVisibility(View.GONE); - }); - }), 300); - } - -} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaDefaultFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java similarity index 87% rename from app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaDefaultFragment.java rename to app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java index 98a2f18f..758db9eb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaDefaultFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java @@ -36,6 +36,7 @@ import java.util.Locale; import pl.szczodrzynski.edziennik.App; import pl.szczodrzynski.edziennik.R; import pl.szczodrzynski.edziennik.MainActivity; +import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceFull; import pl.szczodrzynski.edziennik.databinding.FragmentAgendaCalendarBinding; import pl.szczodrzynski.edziennik.databinding.FragmentAgendaDefaultBinding; import pl.szczodrzynski.edziennik.data.db.modules.events.EventFull; @@ -43,6 +44,12 @@ import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; import pl.szczodrzynski.edziennik.ui.dialogs.event.EventListDialog; import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog; import pl.szczodrzynski.edziennik.ui.dialogs.lessonchange.LessonChangeDialog; +import pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange.LessonChangeCounter; +import pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange.LessonChangeEvent; +import pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange.LessonChangeEventRenderer; +import pl.szczodrzynski.edziennik.ui.modules.agenda.teacherabsence.TeacherAbsenceCounter; +import pl.szczodrzynski.edziennik.ui.modules.agenda.teacherabsence.TeacherAbsenceEvent; +import pl.szczodrzynski.edziennik.ui.modules.agenda.teacherabsence.TeacherAbsenceEventRenderer; import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Time; import pl.szczodrzynski.edziennik.utils.Colors; @@ -56,7 +63,7 @@ import static pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile.AGENDA import static pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile.AGENDA_DEFAULT; import static pl.szczodrzynski.edziennik.utils.Utils.intToStr; -public class AgendaDefaultFragment extends Fragment { +public class AgendaFragment extends Fragment { private App app = null; private MainActivity activity = null; @@ -174,6 +181,45 @@ public class AgendaDefaultFragment extends Fragment { } + List teacherAbsenceList = app.db.teacherAbsenceDao().getAllFull(App.profileId); + List teacherAbsenceCounters = new ArrayList<>(); + + for (TeacherAbsenceFull absence : teacherAbsenceList) { + for (Date date = absence.getDateFrom().clone(); date.compareTo(absence.getDateTo()) < 1; date.stepForward(0, 0, 1)) { + boolean counterFound = false; + for (TeacherAbsenceCounter counter : teacherAbsenceCounters) { + if (counter.getTeacherAbsenceDate().compareTo(date) == 0) { + counter.setTeacherAbsenceCount(counter.getTeacherAbsenceCount() + 1); + counterFound = true; + break; + } + } + + if (!counterFound) { + teacherAbsenceCounters.add(new TeacherAbsenceCounter(date.clone(), 1)); + } + } + } + + for (TeacherAbsenceCounter counter : teacherAbsenceCounters) { + Calendar startTime = Calendar.getInstance(); + Calendar endTime = Calendar.getInstance(); + Date date = counter.getTeacherAbsenceDate(); + startTime.set(date.year, date.month - 1, date.day, 10, 0, 0); + endTime.setTimeInMillis(startTime.getTimeInMillis() + (1000 * 60 * 45)); + eventList.add(new TeacherAbsenceEvent( + date.getInMillis(), + 0xff8f0119, + Colors.legibleTextColor(0xff8f0119), + startTime, + endTime, + App.profileId, + date, + counter.getTeacherAbsenceCount() + )); + } + + List events = app.db.eventDao().getAllNow(App.profileId); for (EventFull event : events) { Calendar startTime = Calendar.getInstance(); @@ -278,7 +324,7 @@ public class AgendaDefaultFragment extends Fragment { //Toast.makeText(app, "Clicked "+((LessonChangeEvent) calendarEvent).getLessonChangeDate().getFormattedString(), Toast.LENGTH_SHORT).show(); } } - }, new LessonChangeEventRenderer()); + }, new LessonChangeEventRenderer(), new TeacherAbsenceEventRenderer()); b_default.progressBar.setVisibility(View.GONE); }); }), 500); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeCounter.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeCounter.java similarity index 73% rename from app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeCounter.java rename to app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeCounter.java index 799794d8..6c2cfaf2 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeCounter.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeCounter.java @@ -1,4 +1,4 @@ -package pl.szczodrzynski.edziennik.ui.modules.agenda; +package pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange; import pl.szczodrzynski.edziennik.utils.models.Date; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeEvent.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEvent.java similarity index 98% rename from app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeEvent.java rename to app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEvent.java index 41e3f44a..077c2206 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeEvent.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEvent.java @@ -1,4 +1,4 @@ -package pl.szczodrzynski.edziennik.ui.modules.agenda; +package pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange; import com.github.tibolte.agendacalendarview.models.CalendarEvent; import com.github.tibolte.agendacalendarview.models.IDayItem; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeEventRenderer.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEventRenderer.java similarity index 93% rename from app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeEventRenderer.java rename to app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEventRenderer.java index b0e529cf..8aa8f4b0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/LessonChangeEventRenderer.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEventRenderer.java @@ -1,4 +1,4 @@ -package pl.szczodrzynski.edziennik.ui.modules.agenda; +package pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange; import android.view.View; import android.widget.TextView; diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceCounter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceCounter.kt new file mode 100644 index 00000000..6017be16 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceCounter.kt @@ -0,0 +1,10 @@ +package pl.szczodrzynski.edziennik.ui.modules.agenda.teacherabsence + +import pl.szczodrzynski.edziennik.utils.models.Date + +class TeacherAbsenceCounter ( + val teacherAbsenceDate: Date, + var teacherAbsenceCount: Int = 0 +) + + diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEvent.kt new file mode 100644 index 00000000..fc1c28db --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEvent.kt @@ -0,0 +1,188 @@ +package pl.szczodrzynski.edziennik.ui.modules.agenda.teacherabsence + +import com.github.tibolte.agendacalendarview.models.CalendarEvent +import com.github.tibolte.agendacalendarview.models.IDayItem +import com.github.tibolte.agendacalendarview.models.IWeekItem +import pl.szczodrzynski.edziennik.utils.models.Date +import java.util.* + +class TeacherAbsenceEvent : CalendarEvent { + /** + * Id of the event. + */ + private var mId: Long = 0 + /** + * Color to be displayed in the agenda view. + */ + private var mColor: Int = 0 + /** + * Text color displayed on the background color + */ + private var mTextColor: Int = 0 + /** + * Calendar instance helping sorting the events per section in the agenda view. + */ + private var mInstanceDay: Calendar? = null + /** + * Start time of the event. + */ + private var mStartTime: Calendar? = null + /** + * End time of the event. + */ + private var mEndTime: Calendar? = null + /** + * References to a DayItem instance for that event, used to link interaction between the + * calendar view and the agenda view. + */ + private var mDayReference: IDayItem? = null + /** + * References to a WeekItem instance for that event, used to link interaction between the + * calendar view and the agenda view. + */ + private var mWeekReference: IWeekItem? = null + + + private var profileId: Int = 0 + var teacherAbsenceDate: Date? = null + var teacherAbsenceCount: Int = 0 + + constructor(calendarEvent: TeacherAbsenceEvent) { + this.mId = calendarEvent.id + this.mColor = calendarEvent.color + this.mTextColor = calendarEvent.textColor + this.mStartTime = calendarEvent.startTime + this.mEndTime = calendarEvent.endTime + this.profileId = calendarEvent.profileId + this.teacherAbsenceDate = calendarEvent.teacherAbsenceDate + this.teacherAbsenceCount = calendarEvent.teacherAbsenceCount + } + + constructor(mId: Long, mColor: Int, mTextColor: Int, mStartTime: Calendar, mEndTime: Calendar, profileId: Int, teacherAbsenceDate: Date, teacherAbsenceCount: Int) { + this.mId = mId + this.mColor = mColor + this.mTextColor = mTextColor + this.mStartTime = mStartTime + this.mEndTime = mEndTime + this.profileId = profileId + this.teacherAbsenceDate = teacherAbsenceDate + this.teacherAbsenceCount = teacherAbsenceCount + } + + override fun setPlaceholder(placeholder: Boolean) { + + } + + override fun isPlaceholder(): Boolean { + return false + } + + override fun getLocation(): String? { + return null + } + + override fun setLocation(mLocation: String) { + + } + + override fun getId(): Long { + return mId + } + + override fun setId(mId: Long) { + this.mId = mId + } + + override fun getShowBadge(): Boolean { + return false + } + + override fun setShowBadge(mShowBadge: Boolean) { + + } + + override fun getTextColor(): Int { + return mTextColor + } + + override fun setTextColor(mTextColor: Int) { + this.mTextColor = mTextColor + } + + override fun getDescription(): String? { + return null + } + + override fun setDescription(mDescription: String) { + + } + + override fun isAllDay(): Boolean { + return false + } + + override fun setAllDay(allDay: Boolean) { + + } + + override fun getStartTime(): Calendar? { + return mStartTime + } + + override fun setStartTime(mStartTime: Calendar) { + this.mStartTime = mStartTime + } + + override fun getEndTime(): Calendar? { + return mEndTime + } + + override fun setEndTime(mEndTime: Calendar) { + this.mEndTime = mEndTime + } + + override fun getTitle(): String? { + return null + } + + override fun setTitle(mTitle: String) { + + } + + override fun getInstanceDay(): Calendar? { + return mInstanceDay + } + + override fun setInstanceDay(mInstanceDay: Calendar) { + this.mInstanceDay = mInstanceDay + this.mInstanceDay!!.set(Calendar.HOUR, 0) + this.mInstanceDay!!.set(Calendar.MINUTE, 0) + this.mInstanceDay!!.set(Calendar.SECOND, 0) + this.mInstanceDay!!.set(Calendar.MILLISECOND, 0) + this.mInstanceDay!!.set(Calendar.AM_PM, 0) + } + + override fun getDayReference(): IDayItem? { + return mDayReference + } + + override fun setDayReference(mDayReference: IDayItem) { + this.mDayReference = mDayReference + } + + override fun getWeekReference(): IWeekItem? { + return mWeekReference + } + + override fun setWeekReference(mWeekReference: IWeekItem) { + this.mWeekReference = mWeekReference + } + + override fun copy(): CalendarEvent { + return TeacherAbsenceEvent(this) + } + + override fun getColor(): Int { + return mColor + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt new file mode 100644 index 00000000..541c0ea5 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt @@ -0,0 +1,21 @@ +package pl.szczodrzynski.edziennik.ui.modules.agenda.teacherabsence + +import android.view.View +import android.widget.TextView +import androidx.cardview.widget.CardView +import com.github.tibolte.agendacalendarview.render.EventRenderer +import pl.szczodrzynski.edziennik.R + +class TeacherAbsenceEventRenderer : EventRenderer() { + override fun render(view: View?, event: TeacherAbsenceEvent) { + val card = view?.findViewById(R.id.teacher_absence_card) + val changeText = view?.findViewById(R.id.teacher_absence_text) + val changeCount = view?.findViewById(R.id.teacher_absence_count) + card?.setCardBackgroundColor(event.color) + changeText?.setTextColor(event.textColor) + changeCount?.setTextColor(event.textColor) + changeCount?.text = event.teacherAbsenceCount.toString() + } + + override fun getEventLayout(): Int { return R.layout.agenda_event_teacher_absence } +} diff --git a/app/src/main/res/layout/agenda_event_teacher_absence.xml b/app/src/main/res/layout/agenda_event_teacher_absence.xml new file mode 100644 index 00000000..2a4dea9f --- /dev/null +++ b/app/src/main/res/layout/agenda_event_teacher_absence.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/layout/row_dialog_teacher_absence_item.xml b/app/src/main/res/layout/row_dialog_teacher_absence_item.xml new file mode 100644 index 00000000..cc9a88af --- /dev/null +++ b/app/src/main/res/layout/row_dialog_teacher_absence_item.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 599c4191..068666e5 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -851,4 +851,5 @@ Abort message Save draft Send + Teachers absence diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b9de8bbb..dc7a4fb9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -908,4 +908,5 @@ Aktualne Minione Brak zadań domowych. + Nieobecność nauczycieli From c8f24611ba6aa5dd7e35a4ccbdec2cacca8cc126 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sun, 29 Sep 2019 01:17:08 +0200 Subject: [PATCH 3/5] [Agenda] Add teachers absence dialog --- .../db/modules/teachers/TeacherAbsenceDao.kt | 10 ++++ .../db/modules/teachers/TeacherAbsenceFull.kt | 2 + .../teacherabsence/TeacherAbsenceAdapter.kt | 38 +++++++++++++ .../teacherabsence/TeacherAbsenceDialog.kt | 43 +++++++++++++++ .../ui/modules/agenda/AgendaFragment.java | 3 + .../TeacherAbsenceEventRenderer.kt | 6 +- .../res/layout/agenda_event_lesson_change.xml | 4 +- .../layout/agenda_event_teacher_absence.xml | 2 +- app/src/main/res/layout/dialog_event_list.xml | 4 +- .../layout/dialog_teacher_absence_list.xml | 14 +++++ .../row_dialog_teacher_absence_item.xml | 55 +++++++++---------- ...ge_item.xml => row_lesson_change_item.xml} | 0 .../res/layout/row_teacher_absence_item.xml | 35 ++++++++++++ 13 files changed, 180 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt create mode 100644 app/src/main/res/layout/dialog_teacher_absence_list.xml rename app/src/main/res/layout/{row_dialog_lesson_change_item.xml => row_lesson_change_item.xml} (100%) create mode 100644 app/src/main/res/layout/row_teacher_absence_item.xml diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt index 35387742..543d8fab 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceDao.kt @@ -1,10 +1,12 @@ package pl.szczodrzynski.edziennik.data.db.modules.teachers +import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import pl.szczodrzynski.edziennik.data.db.modules.metadata.Metadata +import pl.szczodrzynski.edziennik.utils.models.Date @Dao interface TeacherAbsenceDao { @@ -24,4 +26,12 @@ interface TeacherAbsenceDao { "LEFT JOIN metadata ON teacherAbsenceId = thingId AND metadata.thingType = " + Metadata.TYPE_TEACHER_ABSENCE + " AND metadata.profileId = :profileId WHERE teachers.profileId = :profileId") fun getAllFull(profileId: Int): List + + @Query("SELECT *, teachers.teacherName || ' ' || teachers.teacherSurname as teacherFullName, " + + "metadata.seen, metadata.notified, metadata.addedDate FROM teacherAbsence " + + "LEFT JOIN teachers USING (profileId, teacherId) " + + "LEFT JOIN metadata ON teacherAbsenceId = thingId AND metadata.thingType = " + Metadata.TYPE_TEACHER_ABSENCE + + " AND metadata.profileId = :profileId WHERE teachers.profileId = :profileId " + + "AND :date BETWEEN teacherAbsenceDateFrom AND teacherAbsenceDateTo") + fun getAllByDateFull(profileId: Int, date: Date): LiveData> } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt index aec02ee3..b37f24f1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/db/modules/teachers/TeacherAbsenceFull.kt @@ -5,6 +5,8 @@ import pl.szczodrzynski.edziennik.utils.models.Date class TeacherAbsenceFull(profileId: Int, id: Long, teacherId: Long, type: Long, dateFrom: Date, dateTo: Date) : TeacherAbsence(profileId, id, teacherId, type, dateFrom, dateTo) { + var teacherFullName = "" + // metadata var seen: Boolean = false var notified: Boolean = false diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt new file mode 100644 index 00000000..35292685 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt @@ -0,0 +1,38 @@ +package pl.szczodrzynski.edziennik.ui.dialogs.teacherabsence + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import pl.szczodrzynski.edziennik.R +import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceFull +import pl.szczodrzynski.edziennik.utils.models.Date + +class TeacherAbsenceAdapter( + private val context: Context, + private val date: Date, + private val teacherAbsenceList: List +) : RecyclerView.Adapter() { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflater: LayoutInflater = LayoutInflater.from(context) + val view: View = inflater.inflate(R.layout.row_dialog_teacher_absence_item, parent, false) + return ViewHolder(view) + } + + override fun getItemCount(): Int { + return teacherAbsenceList.size + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val teacherAbsence: TeacherAbsenceFull = teacherAbsenceList[position] + + holder.teacherAbsenceTeacher.text = teacherAbsence.teacherFullName + } + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + var teacherAbsenceTeacher: TextView = itemView.findViewById(R.id.teacherAbsenceTeacher) + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt new file mode 100644 index 00000000..802f404a --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceDialog.kt @@ -0,0 +1,43 @@ +package pl.szczodrzynski.edziennik.ui.dialogs.teacherabsence + +import android.content.Context +import android.view.View +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.Observer +import androidx.recyclerview.widget.LinearLayoutManager +import com.afollestad.materialdialogs.MaterialDialog +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.R +import pl.szczodrzynski.edziennik.databinding.DialogTeacherAbsenceListBinding +import pl.szczodrzynski.edziennik.utils.models.Date + +class TeacherAbsenceDialog(val context: Context) { + + val profileId: Int = App.profileId + private lateinit var b: DialogTeacherAbsenceListBinding + + fun show(app: App, date: Date) { + val dialog = MaterialDialog.Builder(context) + .title(date.formattedString) + .customView(R.layout.dialog_teacher_absence_list, true) + .positiveText(R.string.close) + .autoDismiss(false) + .onPositive { dialog, _ -> dialog.dismiss()} + .show() + + val customView: View = dialog.customView ?: return + b = DataBindingUtil.bind(customView) ?: return + + b.teacherAbsenceView.setHasFixedSize(false) + b.teacherAbsenceView.isNestedScrollingEnabled = false + b.teacherAbsenceView.layoutManager = LinearLayoutManager(context) + + app.db.teacherAbsenceDao().getAllByDateFull(profileId, date).observe(context as LifecycleOwner, Observer { absenceList -> + val adapter = TeacherAbsenceAdapter(context, date, absenceList) + b.teacherAbsenceView.adapter = adapter + b.teacherAbsenceView.visibility = View.VISIBLE + }) + } + +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java index 758db9eb..8d4e47ca 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java @@ -44,6 +44,7 @@ import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; import pl.szczodrzynski.edziennik.ui.dialogs.event.EventListDialog; import pl.szczodrzynski.edziennik.ui.dialogs.event.EventManualDialog; import pl.szczodrzynski.edziennik.ui.dialogs.lessonchange.LessonChangeDialog; +import pl.szczodrzynski.edziennik.ui.dialogs.teacherabsence.TeacherAbsenceDialog; import pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange.LessonChangeCounter; import pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange.LessonChangeEvent; import pl.szczodrzynski.edziennik.ui.modules.agenda.lessonchange.LessonChangeEventRenderer; @@ -322,6 +323,8 @@ public class AgendaFragment extends Fragment { } else if (calendarEvent instanceof LessonChangeEvent) { new LessonChangeDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); //Toast.makeText(app, "Clicked "+((LessonChangeEvent) calendarEvent).getLessonChangeDate().getFormattedString(), Toast.LENGTH_SHORT).show(); + } else if (calendarEvent instanceof TeacherAbsenceEvent) { + new TeacherAbsenceDialog(activity).show(app, Date.fromCalendar(calendarEvent.getInstanceDay())); } } }, new LessonChangeEventRenderer(), new TeacherAbsenceEventRenderer()); diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt index 541c0ea5..3789beb8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/teacherabsence/TeacherAbsenceEventRenderer.kt @@ -8,9 +8,9 @@ import pl.szczodrzynski.edziennik.R class TeacherAbsenceEventRenderer : EventRenderer() { override fun render(view: View?, event: TeacherAbsenceEvent) { - val card = view?.findViewById(R.id.teacher_absence_card) - val changeText = view?.findViewById(R.id.teacher_absence_text) - val changeCount = view?.findViewById(R.id.teacher_absence_count) + val card = view?.findViewById(R.id.teacherAbsenceCard) + val changeText = view?.findViewById(R.id.teacherAbsenceText) + val changeCount = view?.findViewById(R.id.teacherAbsenceCount) card?.setCardBackgroundColor(event.color) changeText?.setTextColor(event.textColor) changeCount?.setTextColor(event.textColor) diff --git a/app/src/main/res/layout/agenda_event_lesson_change.xml b/app/src/main/res/layout/agenda_event_lesson_change.xml index 36a9a36d..c51f9b35 100644 --- a/app/src/main/res/layout/agenda_event_lesson_change.xml +++ b/app/src/main/res/layout/agenda_event_lesson_change.xml @@ -9,8 +9,8 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/agenda_event_teacher_absence.xml b/app/src/main/res/layout/agenda_event_teacher_absence.xml index 2a4dea9f..785256d0 100644 --- a/app/src/main/res/layout/agenda_event_teacher_absence.xml +++ b/app/src/main/res/layout/agenda_event_teacher_absence.xml @@ -7,7 +7,7 @@ diff --git a/app/src/main/res/layout/dialog_event_list.xml b/app/src/main/res/layout/dialog_event_list.xml index d1ff5684..4489f929 100644 --- a/app/src/main/res/layout/dialog_event_list.xml +++ b/app/src/main/res/layout/dialog_event_list.xml @@ -16,7 +16,7 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/dialog_teacher_absence_list.xml b/app/src/main/res/layout/dialog_teacher_absence_list.xml new file mode 100644 index 00000000..2608ce0d --- /dev/null +++ b/app/src/main/res/layout/dialog_teacher_absence_list.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/app/src/main/res/layout/row_dialog_teacher_absence_item.xml b/app/src/main/res/layout/row_dialog_teacher_absence_item.xml index cc9a88af..c7befdf2 100644 --- a/app/src/main/res/layout/row_dialog_teacher_absence_item.xml +++ b/app/src/main/res/layout/row_dialog_teacher_absence_item.xml @@ -1,35 +1,34 @@ - + + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="wrap_content"> - + android:layout_marginStart="8dp" + android:layout_marginTop="4dp" + android:layout_marginEnd="8dp" + android:layout_marginBottom="4dp" + android:background="?selectableItemBackground" + app:cardCornerRadius="5dp" + app:cardElevation="4dp"> - + - - - - - + + + + diff --git a/app/src/main/res/layout/row_dialog_lesson_change_item.xml b/app/src/main/res/layout/row_lesson_change_item.xml similarity index 100% rename from app/src/main/res/layout/row_dialog_lesson_change_item.xml rename to app/src/main/res/layout/row_lesson_change_item.xml diff --git a/app/src/main/res/layout/row_teacher_absence_item.xml b/app/src/main/res/layout/row_teacher_absence_item.xml new file mode 100644 index 00000000..2099699f --- /dev/null +++ b/app/src/main/res/layout/row_teacher_absence_item.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + From 2c4e0e3121bb71f4a1d4b7a7b30ed7286d72d743 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sun, 29 Sep 2019 17:40:54 +0200 Subject: [PATCH 4/5] [Agenda] Add teacher absence in event list dialog --- .../ui/dialogs/event/EventListDialog.java | 33 +++++++++++++++++-- .../ui/modules/agenda/AgendaFragment.java | 4 +-- .../LessonChangeEventRenderer.java | 2 +- app/src/main/res/layout/dialog_event_list.xml | 11 ++++++- .../res/layout/row_lesson_change_item.xml | 4 +-- app/src/main/res/values-en/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 7 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.java index 6cd3fbbd..b4e7c6db 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/event/EventListDialog.java @@ -20,7 +20,9 @@ import pl.szczodrzynski.edziennik.App; import pl.szczodrzynski.edziennik.R; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonChange; import pl.szczodrzynski.edziennik.data.db.modules.lessons.LessonFull; +import pl.szczodrzynski.edziennik.data.db.modules.teachers.TeacherAbsenceFull; import pl.szczodrzynski.edziennik.ui.dialogs.lessonchange.LessonChangeDialog; +import pl.szczodrzynski.edziennik.ui.dialogs.teacherabsence.TeacherAbsenceDialog; import pl.szczodrzynski.edziennik.utils.models.Date; import pl.szczodrzynski.edziennik.utils.models.Time; @@ -171,7 +173,8 @@ public class EventListDialog { examsView.setNestedScrollingEnabled(false); examsView.setLayoutManager(new LinearLayoutManager(context)); - CardView lessonChangeContainer = dialogView.findViewById(R.id.lesson_change_container); + CardView lessonChangeContainer = dialogView.findViewById(R.id.lessonChangeContainer); + CardView teacherAbsenceContainer = dialogView.findViewById(R.id.teacherAbsenceContainer); //lessonChangeContainer.setVisibility(View.GONE); if (time == null) { app.db.lessonChangeDao().getLessonChangeCounterByDate(App.profileId, date).observe((LifecycleOwner) context, counter -> { @@ -179,14 +182,38 @@ public class EventListDialog { return; if (counter.lessonChangeCount > 0) { lessonChangeContainer.setVisibility(View.VISIBLE); - TextView lessonChangeCount = dialogView.findViewById(R.id.lesson_change_count); - lessonChangeCount.setText(Integer.toString(counter.lessonChangeCount)); + TextView lessonChangeCount = dialogView.findViewById(R.id.lessonChangeCount); + lessonChangeCount.setText(String.valueOf(counter.lessonChangeCount)); lessonChangeContainer.setCardBackgroundColor(0xff78909c); lessonChangeContainer.setOnClickListener((v -> { new LessonChangeDialog(context).show(app, date); })); } }); + + app.db.teacherAbsenceDao().getAllByDateFull(App.profileId, date).observe((LifecycleOwner) context, teacherAbsenceList -> { + if (teacherAbsenceList == null) + return; + if (teacherAbsenceList.size() > 0) { + int count = 0; + for (TeacherAbsenceFull teacherAbsence : teacherAbsenceList) { + Date dateFrom = teacherAbsence.getDateFrom(); + Date dateTo = teacherAbsence.getDateTo(); + + if (date.compareTo(dateFrom) >= 0 && date.compareTo(dateTo) <= 0) { + count++; + } + } + + teacherAbsenceContainer.setVisibility(View.VISIBLE); + TextView teacherAbsenceCount = dialogView.findViewById(R.id.teacherAbsenceCount); + teacherAbsenceCount.setText(String.valueOf(count)); + teacherAbsenceContainer.setCardBackgroundColor(0xffff1744); + teacherAbsenceContainer.setOnClickListener(( v -> { + new TeacherAbsenceDialog(context).show(app, date); + })); + } + }); } app.db.eventDao().getAllByDateTime(profileId, date, time).observe((LifecycleOwner) context, events -> { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java index 8d4e47ca..726a8637 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/AgendaFragment.java @@ -210,8 +210,8 @@ public class AgendaFragment extends Fragment { endTime.setTimeInMillis(startTime.getTimeInMillis() + (1000 * 60 * 45)); eventList.add(new TeacherAbsenceEvent( date.getInMillis(), - 0xff8f0119, - Colors.legibleTextColor(0xff8f0119), + 0xffff1744, + Colors.legibleTextColor(0xffff1744), startTime, endTime, App.profileId, diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEventRenderer.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEventRenderer.java index 8aa8f4b0..2490e1bf 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEventRenderer.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/agenda/lessonchange/LessonChangeEventRenderer.java @@ -14,7 +14,7 @@ public class LessonChangeEventRenderer extends EventRenderer public void render(View view, LessonChangeEvent event) { CardView card = view.findViewById(R.id.lesson_change_card); TextView changeText = view.findViewById(R.id.lesson_change_text); - TextView changeCount = view.findViewById(R.id.lesson_change_count); + TextView changeCount = view.findViewById(R.id.lessonChangeCount); card.setCardBackgroundColor(event.getColor()); changeText.setTextColor(event.getTextColor()); changeCount.setTextColor(event.getTextColor()); diff --git a/app/src/main/res/layout/dialog_event_list.xml b/app/src/main/res/layout/dialog_event_list.xml index 4489f929..0e9f6120 100644 --- a/app/src/main/res/layout/dialog_event_list.xml +++ b/app/src/main/res/layout/dialog_event_list.xml @@ -15,7 +15,7 @@ app:layout_constraintTop_toTopOf="parent"> + + - \ No newline at end of file + diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 87ad1860..863f9802 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -851,7 +851,7 @@ Abort message Save draft Send - Teachers absence + Absent teachers Getting grade comments Getting school free days diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e617bdd3..b081c59e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -908,6 +908,6 @@ Aktualne Minione Brak zadań domowych. - Nieobecność nauczycieli + Nieobecni nauczyciele Pobieranie komentarzy ocen From d7b2369a321464bb1398fee94cf340551c6e5aff Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sun, 29 Sep 2019 17:57:10 +0200 Subject: [PATCH 5/5] [Agenda] Add showing teachers absence time --- .../ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt | 8 ++++++++ .../main/res/layout/row_dialog_teacher_absence_item.xml | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt index 35292685..c64ea891 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/teacherabsence/TeacherAbsenceAdapter.kt @@ -30,9 +30,17 @@ class TeacherAbsenceAdapter( val teacherAbsence: TeacherAbsenceFull = teacherAbsenceList[position] holder.teacherAbsenceTeacher.text = teacherAbsence.teacherFullName + + val time = when(teacherAbsence.dateFrom.compareTo(teacherAbsence.dateTo)) { + 0 -> teacherAbsence.dateFrom.formattedStringShort + else -> teacherAbsence.dateFrom.formattedStringShort + " - " + teacherAbsence.dateTo.formattedStringShort + } + + holder.teacherAbsenceTime.text = time } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { var teacherAbsenceTeacher: TextView = itemView.findViewById(R.id.teacherAbsenceTeacher) + var teacherAbsenceTime: TextView = itemView.findViewById(R.id.teacherAbsenceTime) } } diff --git a/app/src/main/res/layout/row_dialog_teacher_absence_item.xml b/app/src/main/res/layout/row_dialog_teacher_absence_item.xml index c7befdf2..6aacce23 100644 --- a/app/src/main/res/layout/row_dialog_teacher_absence_item.xml +++ b/app/src/main/res/layout/row_dialog_teacher_absence_item.xml @@ -21,9 +21,16 @@ + +