diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt index b7a0796c..bc6a991a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardFragment.kt @@ -125,6 +125,7 @@ class DashboardFragment : BaseFragment(R.layout.fragme mainActivity.pushView(ConferenceFragment.newInstance()) } onAdminMessageClickListener = presenter::onAdminMessageSelected + onPanicButtonClickListener = presenter::onPanicButtonClicked onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { @@ -208,7 +209,11 @@ class DashboardFragment : BaseFragment(R.layout.fragme binding = binding.dashboardErrorAdminMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, - ).bind(adminMessageItem.adminMessage) + onPanicButtonClickListener = presenter::onPanicButtonClicked, + ).bind( + item = adminMessageItem.adminMessage, + showPanicButton = true, + ) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt index 3fec6256..8b9de996 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardPresenter.kt @@ -11,6 +11,7 @@ import io.github.wulkanowy.data.errorOrNull import io.github.wulkanowy.data.flatResourceFlow import io.github.wulkanowy.data.mapResourceData import io.github.wulkanowy.data.onResourceError +import io.github.wulkanowy.data.onResourceSuccess import io.github.wulkanowy.data.repositories.AttendanceSummaryRepository import io.github.wulkanowy.data.repositories.ConferenceRepository import io.github.wulkanowy.data.repositories.ExamRepository @@ -23,6 +24,7 @@ import io.github.wulkanowy.data.repositories.SchoolAnnouncementRepository import io.github.wulkanowy.data.repositories.SemesterRepository import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.repositories.TimetableRepository +import io.github.wulkanowy.data.resourceFlow import io.github.wulkanowy.domain.adminmessage.GetAppropriateAdminMessageUseCase import io.github.wulkanowy.domain.timetable.IsStudentHasLessonsOnWeekendUseCase import io.github.wulkanowy.ui.base.BasePresenter @@ -44,6 +46,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import okhttp3.HttpUrl.Companion.toHttpUrl import timber.log.Timber import java.time.Instant import java.time.LocalDate @@ -282,6 +285,22 @@ class DashboardPresenter @Inject constructor( url?.let { view?.openInternetBrowser(it) } } + fun onPanicButtonClicked() { + resourceFlow { studentRepository.getCurrentStudent() } + .onResourceError { errorHandler.dispatch(it) } + .onResourceSuccess { + val baseUrl = it.scrapperBaseUrl.toHttpUrl() + val urlToOpen = baseUrl.newBuilder() + .host("uonetplus${it.scrapperDomainSuffix}.${baseUrl.host}") + .addPathSegment(it.symbol) + .build() + .toString() + + view?.openInternetBrowser(urlToOpen) + } + .launch("panic_button") + } + private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) { flow { val selectedTiles = selectedDashboardTiles diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt index 7c74cae8..e5197570 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/adapters/DashboardAdapter.kt @@ -59,6 +59,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter Unit = {} + var onPanicButtonClickListener: () -> Unit = {} + var onAdminMessageDismissClickListener: (AdminMessage) -> Unit = {} val items = mutableListOf() @@ -86,35 +88,46 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter AccountViewHolder( ItemDashboardAccountBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.HORIZONTAL_GROUP.ordinal -> HorizontalGroupViewHolder( ItemDashboardHorizontalGroupBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.GRADES.ordinal -> GradesViewHolder( ItemDashboardGradesBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.LESSONS.ordinal -> LessonsViewHolder( ItemDashboardLessonsBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.HOMEWORK.ordinal -> HomeworkViewHolder( ItemDashboardHomeworkBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.ANNOUNCEMENTS.ordinal -> AnnouncementsViewHolder( ItemDashboardAnnouncementsBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.EXAMS.ordinal -> ExamsViewHolder( ItemDashboardExamsBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.CONFERENCES.ordinal -> ConferencesViewHolder( ItemDashboardConferencesBinding.inflate(inflater, parent, false) ) + DashboardItem.Type.ADMIN_MESSAGE.ordinal -> AdminMessageViewHolder( ItemDashboardAdminMessageBinding.inflate(inflater, parent, false), onAdminMessageDismissClickListener = onAdminMessageDismissClickListener, onAdminMessageClickListener = onAdminMessageClickListener, + onPanicButtonClickListener = onPanicButtonClickListener, ) + DashboardItem.Type.ADS.ordinal -> AdsViewHolder( ItemDashboardAdsBinding.inflate(inflater, parent, false) ) + else -> throw IllegalArgumentException() } } @@ -129,7 +142,11 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter bindAnnouncementsViewHolder(holder, position) is ExamsViewHolder -> bindExamsViewHolder(holder, position) is ConferencesViewHolder -> bindConferencesViewHolder(holder, position) - is AdminMessageViewHolder -> holder.bind((items[position] as DashboardItem.AdminMessages).adminMessage) + is AdminMessageViewHolder -> holder.bind( + (items[position] as DashboardItem.AdminMessages).adminMessage, + showPanicButton = true + ) + is AdsViewHolder -> bindAdsViewHolder(holder, position) } } @@ -240,12 +257,15 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { root.context.getThemeAttrColor(R.attr.colorOnSurface) } + attendancePercentage <= ATTENDANCE_SECOND_WARNING_THRESHOLD -> { root.context.getThemeAttrColor(R.attr.colorPrimary) } + attendancePercentage <= ATTENDANCE_FIRST_WARNING_THRESHOLD -> { root.context.getThemeAttrColor(R.attr.colorTimetableChange) } + else -> root.context.getThemeAttrColor(R.attr.colorOnSurface) } val attendanceString = if (attendancePercentage == null || attendancePercentage == .0) { @@ -336,24 +356,28 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { dateToNavigate = tomorrowDate updateLessonView(item, tomorrowTimetable, binding) binding.dashboardLessonsItemTitleTomorrow.isVisible = true binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = false } + currentDayHeader != null && currentDayHeader.content.isNotBlank() -> { dateToNavigate = currentDate updateLessonView(item, emptyList(), binding, currentDayHeader) binding.dashboardLessonsItemTitleTomorrow.isVisible = false binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = false } + tomorrowDayHeader != null && tomorrowDayHeader.content.isNotBlank() -> { dateToNavigate = tomorrowDate updateLessonView(item, emptyList(), binding, tomorrowDayHeader) binding.dashboardLessonsItemTitleTomorrow.isVisible = true binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = false } + else -> { dateToNavigate = currentDate updateLessonView(item, emptyList(), binding) @@ -461,6 +485,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { firstTitleAndValueTextColor = context.getThemeAttrColor(R.attr.colorOnSurface) @@ -468,6 +493,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter { firstTitleAndValueTextColor = context.getThemeAttrColor(R.attr.colorOnSurface) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt index 1e0f0bdb..94a7686d 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/viewholders/AdminMessageViewHolder.kt @@ -13,9 +13,10 @@ class AdminMessageViewHolder( private val binding: ItemDashboardAdminMessageBinding, private val onAdminMessageDismissClickListener: (AdminMessage) -> Unit, private val onAdminMessageClickListener: (String?) -> Unit, + private val onPanicButtonClickListener: () -> Unit, ) : RecyclerView.ViewHolder(binding.root) { - fun bind(item: AdminMessage?) { + fun bind(item: AdminMessage?, showPanicButton: Boolean = false) { item ?: return val context = binding.root.context @@ -48,10 +49,14 @@ class AdminMessageViewHolder( dashboardAdminMessageItemClose.setOnClickListener { onAdminMessageDismissClickListener(item) } + dashboardPanicSection.root.isVisible = showPanicButton + dashboardPanicSection.dashboardPanicButton.setOnClickListener { + onPanicButtonClickListener() + } - root.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) + dashboardAdminMessage.setCardBackgroundColor(backgroundColor?.let { ColorStateList.valueOf(it) }) item.destinationUrl?.let { url -> - root.setOnClickListener { onAdminMessageClickListener(url) } + dashboardAdminMessage.setOnClickListener { onAdminMessageClickListener(url) } } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt index 1c492069..2d1a4824 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormFragment.kt @@ -238,6 +238,7 @@ class LoginFormFragment : BaseFragment(R.layout.fragme binding = binding.loginFormMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, + onPanicButtonClickListener = {}, ).bind(message) binding.loginFormMessage.root.isVisible = message != null } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 4eb60265..586c395c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -118,6 +118,7 @@ class LoginStudentSelectFragment : binding = binding.loginStudentSelectAdminMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, + onPanicButtonClickListener = {}, ).bind(adminMessage) binding.loginStudentSelectAdminMessage.root.isVisible = adminMessage != null } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt index a813e7c0..824d8d22 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt @@ -188,6 +188,7 @@ class LoginSymbolFragment : binding = binding.loginSymbolAdminMessage, onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed, onAdminMessageClickListener = presenter::onAdminMessageSelected, + onPanicButtonClickListener = {}, ).bind(adminMessage) binding.loginSymbolAdminMessage.root.isVisible = adminMessage != null } diff --git a/app/src/main/res/layout/item_dashboard_admin_message.xml b/app/src/main/res/layout/item_dashboard_admin_message.xml index 407e1292..0d519b7e 100644 --- a/app/src/main/res/layout/item_dashboard_admin_message.xml +++ b/app/src/main/res/layout/item_dashboard_admin_message.xml @@ -1,87 +1,105 @@ - + android:orientation="vertical"> - + android:layout_height="wrap_content" + android:layout_marginHorizontal="12dp" + android:layout_marginVertical="6dp"> - - + - + - + - - - + + + + + + + + + + diff --git a/app/src/main/res/layout/item_dashboard_panic_button.xml b/app/src/main/res/layout/item_dashboard_panic_button.xml new file mode 100644 index 00000000..5f5936cf --- /dev/null +++ b/app/src/main/res/layout/item_dashboard_panic_button.xml @@ -0,0 +1,28 @@ + + + + + + + + + +