From 7dde13585c8eeb08a60b31abe152f482568671e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Fri, 27 Apr 2018 00:03:37 +0200 Subject: [PATCH] Add info about predicted and final ratings (#88) --- .../io/github/wulkanowy/data/Repository.java | 5 ++ .../wulkanowy/data/RepositoryContract.java | 2 + .../wulkanowy/data/db/shared/SharedPref.java | 5 ++ .../data/db/shared/SharedPrefContract.java | 2 + .../data/sync/subjects/SubjectSync.java | 8 ++- .../ui/main/grades/GradeHeaderItem.java | 62 +++++++++++++++++-- .../ui/main/grades/GradesPresenter.java | 3 +- .../ui/main/settings/SettingsFragment.java | 2 + .../wulkanowy/utils/AnimationUtils.java | 40 ++++++++++++ app/src/main/res/layout/grade_header.xml | 26 +++++++- app/src/main/res/values-pl/strings.xml | 12 +++- app/src/main/res/values/strings.xml | 11 +++- app/src/main/res/xml/preferences.xml | 12 ++-- 13 files changed, 170 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/utils/AnimationUtils.java diff --git a/app/src/main/java/io/github/wulkanowy/data/Repository.java b/app/src/main/java/io/github/wulkanowy/data/Repository.java index f5773eb4..39af21f4 100644 --- a/app/src/main/java/io/github/wulkanowy/data/Repository.java +++ b/app/src/main/java/io/github/wulkanowy/data/Repository.java @@ -88,6 +88,11 @@ public class Repository implements RepositoryContract { return sharedPref.getStartupTab(); } + @Override + public boolean isShowGradesSummary() { + return sharedPref.isShowGradesSummary(); + } + @Override public int getServicesInterval() { return sharedPref.getServicesInterval(); diff --git a/app/src/main/java/io/github/wulkanowy/data/RepositoryContract.java b/app/src/main/java/io/github/wulkanowy/data/RepositoryContract.java index 5c815f1d..60599cf9 100644 --- a/app/src/main/java/io/github/wulkanowy/data/RepositoryContract.java +++ b/app/src/main/java/io/github/wulkanowy/data/RepositoryContract.java @@ -29,6 +29,8 @@ public interface RepositoryContract extends ResourcesContract, AccountSyncContra boolean isNotifyEnable(); + boolean isShowGradesSummary(); + int getServicesInterval(); boolean isMobileDisable(); diff --git a/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPref.java b/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPref.java index 915beedb..35c62368 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPref.java +++ b/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPref.java @@ -55,6 +55,11 @@ public class SharedPref implements SharedPrefContract { return Integer.parseInt(settingsSharedPref.getString(SettingsFragment.SHARED_KEY_START_TAB, "2")); } + @Override + public boolean isShowGradesSummary() { + return settingsSharedPref.getBoolean(SettingsFragment.SHARED_KEY_GRADES_SUMMARY, false); + } + @Override public int getServicesInterval() { return Integer.parseInt(settingsSharedPref.getString(SettingsFragment.SHARED_KEY_SERVICES_INTERVAL, "60")); diff --git a/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPrefContract.java b/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPrefContract.java index 113dc282..57a7222e 100644 --- a/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPrefContract.java +++ b/app/src/main/java/io/github/wulkanowy/data/db/shared/SharedPrefContract.java @@ -12,6 +12,8 @@ public interface SharedPrefContract { int getStartupTab(); + boolean isShowGradesSummary(); + int getServicesInterval(); boolean isMobileDisable(); diff --git a/app/src/main/java/io/github/wulkanowy/data/sync/subjects/SubjectSync.java b/app/src/main/java/io/github/wulkanowy/data/sync/subjects/SubjectSync.java index 078c3e69..c1b8ccbf 100644 --- a/app/src/main/java/io/github/wulkanowy/data/sync/subjects/SubjectSync.java +++ b/app/src/main/java/io/github/wulkanowy/data/sync/subjects/SubjectSync.java @@ -35,7 +35,9 @@ public class SubjectSync implements SyncContract { public void sync(long semesterId) throws VulcanException, IOException { this.semesterId = semesterId; - List lastList = getUpdatedList(getSubjectsFromNet()); + Semester semester = daoSession.getSemesterDao().load(semesterId); + + List lastList = getUpdatedList(getSubjectsFromNet(semester)); daoSession.getSubjectDao().deleteInTx(getSubjectsFromDb()); daoSession.getSubjectDao().insertInTx(lastList); @@ -43,9 +45,9 @@ public class SubjectSync implements SyncContract { LogUtils.debug("Synchronization subjects (amount = " + lastList.size() + ")"); } - private List getSubjectsFromNet() throws VulcanException, IOException { + private List getSubjectsFromNet(Semester semester) throws VulcanException, IOException { return DataObjectConverter.subjectsToSubjectEntities( - vulcan.getSubjectsList().getAll(String.valueOf(semesterId)), semesterId); + vulcan.getSubjectsList().getAll(semester.getValue()), semesterId); } private List getSubjectsFromDb() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradeHeaderItem.java b/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradeHeaderItem.java index 77a87a3b..55609fc3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradeHeaderItem.java +++ b/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradeHeaderItem.java @@ -17,6 +17,7 @@ import eu.davidea.flexibleadapter.items.AbstractExpandableHeaderItem; import eu.davidea.viewholders.ExpandableViewHolder; import io.github.wulkanowy.R; import io.github.wulkanowy.data.db.dao.entities.Subject; +import io.github.wulkanowy.utils.AnimationUtils; import io.github.wulkanowy.utils.AverageCalculator; public class GradeHeaderItem @@ -24,8 +25,11 @@ public class GradeHeaderItem private Subject subject; - GradeHeaderItem(Subject subject) { + private final boolean isShowSummary; + + GradeHeaderItem(Subject subject, boolean isShowSummary) { this.subject = subject; + this.isShowSummary = isShowSummary; } @Override @@ -55,7 +59,7 @@ public class GradeHeaderItem @Override public HeaderViewHolder createViewHolder(View view, FlexibleAdapter adapter) { - return new HeaderViewHolder(view, adapter); + return new HeaderViewHolder(view, adapter, isShowSummary); } @Override @@ -74,16 +78,27 @@ public class GradeHeaderItem @BindView(R.id.grade_header_number_of_grade_text) TextView numberText; + @BindView(R.id.grade_header_predicted_rating_text) + TextView predictedTest; + + @BindView(R.id.grade_header_final_rating_text) + TextView finalText; + @BindView(R.id.grade_header_alert_image) View alertImage; Resources resources; - HeaderViewHolder(View view, FlexibleAdapter adapter) { + private boolean isSummaryTogglable = true; + + private boolean isShowSummary; + + HeaderViewHolder(View view, FlexibleAdapter adapter, boolean isShowSummary) { super(view, adapter); ButterKnife.bind(this, view); resources = view.getResources(); view.setOnClickListener(this); + this.isShowSummary = isShowSummary; } void onBind(Subject item, List subItems) { @@ -91,6 +106,29 @@ public class GradeHeaderItem numberText.setText(resources.getQuantityString(R.plurals.numberOfGradesPlurals, subItems.size(), subItems.size())); averageText.setText(getGradesAverageString(item)); + + predictedTest.setText(resources.getString(R.string.info_grades_predicted_rating, + item.getPredictedRating())); + finalText.setText(resources.getString(R.string.info_grades_final_rating, + item.getFinalRating())); + predictedTest.setVisibility(View.GONE); + finalText.setVisibility(View.GONE); + + boolean isSummaryEmpty = true; + + if (!"-".equals(item.getPredictedRating()) || !"-".equals(item.getFinalRating())) { + isSummaryEmpty = false; + } + + if (isSummaryEmpty) { + isSummaryTogglable = false; + } else if (isShowSummary) { + predictedTest.setVisibility(View.VISIBLE); + finalText.setVisibility(View.VISIBLE); + + isSummaryTogglable = false; + } + alertImage.setVisibility(isSubItemsReadAndSaveAlertView(subItems) ? View.INVISIBLE : View.VISIBLE); } @@ -103,6 +141,19 @@ public class GradeHeaderItem } else { subjectName.setMaxLines(1); } + + if (isSummaryTogglable) { + toggleText(predictedTest); + toggleText(finalText); + } + } + + private void toggleText(final View view) { + if (view.getVisibility() == View.GONE) { + AnimationUtils.slideDown(view); + } else { + AnimationUtils.slideUp(view); + } } private boolean isSubItemsReadAndSaveAlertView(List subItems) { @@ -112,6 +163,7 @@ public class GradeHeaderItem isRead = item.getGrade().getRead(); item.setSubjectAlertImage(alertImage); } + return isRead; } @@ -120,9 +172,9 @@ public class GradeHeaderItem if (average < 0) { return resources.getString(R.string.info_no_average); - } else { - return resources.getString(R.string.info_average_grades, average); } + + return resources.getString(R.string.info_average_grades, average); } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradesPresenter.java b/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradesPresenter.java index 43efa486..c1da919f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradesPresenter.java +++ b/app/src/main/java/io/github/wulkanowy/ui/main/grades/GradesPresenter.java @@ -105,6 +105,7 @@ public class GradesPresenter extends BasePresenter @Override public void onDoInBackgroundLoading() { List subjectList = getRepository().getSubjectList(); + boolean isShowSummary = getRepository().isShowGradesSummary(); headerItems = new ArrayList<>(); @@ -113,7 +114,7 @@ public class GradesPresenter extends BasePresenter List gradeList = subject.getGradeList(); if (!gradeList.isEmpty()) { - GradeHeaderItem headerItem = new GradeHeaderItem(subject); + GradeHeaderItem headerItem = new GradeHeaderItem(subject, isShowSummary); List subItems = new ArrayList<>(); diff --git a/app/src/main/java/io/github/wulkanowy/ui/main/settings/SettingsFragment.java b/app/src/main/java/io/github/wulkanowy/ui/main/settings/SettingsFragment.java index fd686fae..0359baca 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/main/settings/SettingsFragment.java +++ b/app/src/main/java/io/github/wulkanowy/ui/main/settings/SettingsFragment.java @@ -12,6 +12,8 @@ public class SettingsFragment extends PreferenceFragmentCompat public static final String SHARED_KEY_START_TAB = "startup_tab"; + public static final String SHARED_KEY_GRADES_SUMMARY = "grades_summary"; + public static final String SHARED_KEY_SERVICES_ENABLE = "services_enable"; public static final String SHARED_KEY_NOTIFY_ENABLE = "notify_enable"; diff --git a/app/src/main/java/io/github/wulkanowy/utils/AnimationUtils.java b/app/src/main/java/io/github/wulkanowy/utils/AnimationUtils.java new file mode 100644 index 00000000..04116423 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/AnimationUtils.java @@ -0,0 +1,40 @@ +package io.github.wulkanowy.utils; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.view.View; + +public final class AnimationUtils { + + public static void slideDown(final View view) { + view.setVisibility(View.VISIBLE); + view.setAlpha(0.f); + + view.setTranslationY(-(view.getHeight() / 2)); + view.animate() + .translationY(0) + .alpha(1.f) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + view.setVisibility(View.VISIBLE); + view.setAlpha(1.f); + } + }); + } + + public static void slideUp(final View view) { + view.animate() + .translationY(-(view.getHeight() / 2)) + .alpha(0.f) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + // superfluous restoration + view.setVisibility(View.GONE); + view.setAlpha(1.f); + view.setTranslationY(0.f); + } + }); + } +} diff --git a/app/src/main/res/layout/grade_header.xml b/app/src/main/res/layout/grade_header.xml index 2dcf12e8..032ad675 100644 --- a/app/src/main/res/layout/grade_header.xml +++ b/app/src/main/res/layout/grade_header.xml @@ -46,6 +46,30 @@ android:textColor="@color/secondary_text" android:textSize="12sp" /> + + + + - \ No newline at end of file + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2f325f2a..af534e36 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -72,6 +72,8 @@ Średnia: %1$.2f Brak średniej + Przewidywana: %1$s + Końcowa: %1$s Brak lekcji w tym tygodniu Sala %s @@ -114,11 +116,15 @@ %1$d nieobecności - Widok + + Widok Domyślny widok - Powiadomienia + Pokazuj podsumowanie w ocenach + + Powiadomienia Pokazuj powiadomienia - Usługi + + Usługi Włącz odświeżanie danych w tle Interwał między odświeżaniem danych Synchronizacja tylko przez WiFi diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e2587718..59d1cb8b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,6 +72,8 @@ Average: %1$.2f No average + Predicted: %1$s + Final: %1$s No lesson in this week Room %s @@ -110,11 +112,14 @@ %1$d absences + View Default view after startup - View - Notifications + Show summary in grades + + Notifications Show the notifications - Services + + Services Enable background data refreshing Interval between data refreshing Synchronization via WiFi only diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index f2a8ce6e..bc4f8130 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,6 +1,6 @@ - + + - + - + - \ No newline at end of file +