From e971eb7821a2de1d3faf4ab585f2b020f16745fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Thu, 23 May 2024 23:15:47 +0200 Subject: [PATCH] Add full panic mode (#2569) --- app/build.gradle | 2 +- .../ui/modules/dashboard/DashboardFragment.kt | 5 + .../modules/dashboard/DashboardPresenter.kt | 2 +- .../ui/modules/dashboard/DashboardView.kt | 2 + .../modules/message/tab/MessageTabFragment.kt | 6 ++ .../message/tab/MessageTabPresenter.kt | 17 ++++ .../ui/modules/message/tab/MessageTabView.kt | 2 + .../ui/modules/panicmode/PanicModeFragment.kt | 99 +++++++++++++++++++ .../main/res/layout/fragment_message_tab.xml | 10 ++ .../main/res/layout/fragment_panic_mode.xml | 69 +++++++++++++ app/src/main/res/values-pl/strings.xml | 2 + app/src/main/res/values/strings.xml | 3 + 12 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/ui/modules/panicmode/PanicModeFragment.kt create mode 100644 app/src/main/res/layout/fragment_panic_mode.xml diff --git a/app/build.gradle b/app/build.gradle index dda12f37a..4636fa7b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -191,7 +191,7 @@ ext { } dependencies { - implementation 'io.github.wulkanowy:sdk:2.6.10' + implementation 'io.github.wulkanowy:sdk:2.6.11-SNAPSHOT' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' 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 bc6a991a9..25774d044 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 @@ -30,6 +30,7 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.notificationscenter.NotificationsCenterFragment +import io.github.wulkanowy.ui.modules.panicmode.PanicModeFragment import io.github.wulkanowy.ui.modules.schoolannouncement.SchoolAnnouncementFragment import io.github.wulkanowy.ui.modules.timetable.TimetableFragment import io.github.wulkanowy.utils.capitalise @@ -241,6 +242,10 @@ class DashboardFragment : BaseFragment(R.layout.fragme requireContext().openInternetBrowser(url) } + override fun openPanicWebView(url: String) { + (requireActivity() as MainActivity).pushView(PanicModeFragment.newInstance(url)) + } + override fun onDestroyView() { dashboardAdapter.clearTimers() presenter.onDetachView() 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 8b9de9960..a70f82e20 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 @@ -296,7 +296,7 @@ class DashboardPresenter @Inject constructor( .build() .toString() - view?.openInternetBrowser(urlToOpen) + view?.openPanicWebView(urlToOpen) } .launch("panic_button") } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt index 56a0a773a..dd7fb962f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/dashboard/DashboardView.kt @@ -31,4 +31,6 @@ interface DashboardView : BaseView { fun openNotificationsCenterView() fun openInternetBrowser(url: String) + + fun openPanicWebView(url: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt index 12f9d3234..b29c2cd85 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabFragment.kt @@ -27,6 +27,7 @@ import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.message.MessageFragment import io.github.wulkanowy.ui.modules.message.mailboxchooser.MailboxChooserDialog import io.github.wulkanowy.ui.modules.message.preview.MessagePreviewFragment +import io.github.wulkanowy.ui.modules.panicmode.PanicModeFragment import io.github.wulkanowy.ui.widgets.DividerItemDecoration import io.github.wulkanowy.utils.dpToPx import io.github.wulkanowy.utils.getThemeAttrColor @@ -132,6 +133,7 @@ class MessageTabFragment : BaseFragment(R.layout.frag ) messageTabErrorRetry.setOnClickListener { presenter.onRetry() } messageTabErrorDetails.setOnClickListener { presenter.onDetailsClick() } + messageTabPanicSection.dashboardPanicButton.setOnClickListener { presenter.onPanicButtonClicked() } } setFragmentResultListener(requireArguments().getString(MESSAGE_TAB_FOLDER_ID)!!) { _, bundle -> @@ -283,6 +285,10 @@ class MessageTabFragment : BaseFragment(R.layout.frag ) } + override fun openPanicWebView(url: String) { + (requireActivity() as MainActivity).pushView(PanicModeFragment.newInstance(url)) + } + override fun hideKeyboard() { activity?.hideSoftInput() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index cda0b32bd..ad3e7c9cd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -20,6 +20,7 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import me.xdrop.fuzzywuzzy.FuzzySearch +import okhttp3.HttpUrl.Companion.toHttpUrl import timber.log.Timber import javax.inject.Inject import kotlin.math.pow @@ -429,4 +430,20 @@ class MessageTabPresenter @Inject constructor( + dateRatio.toDouble().pow(2) * 2 ).toInt() } + + fun onPanicButtonClicked() { + resourceFlow { studentRepository.getCurrentStudent() } + .onResourceError { errorHandler.dispatch(it) } + .onResourceSuccess { + val baseUrl = it.scrapperBaseUrl.toHttpUrl() + val urlToOpen = baseUrl.newBuilder() + .host("uonetplus${it.scrapperDomainSuffix}-wiadomosciplus.${baseUrl.host}") + .addPathSegment(it.symbol) + .build() + .toString() + + view?.openPanicWebView(urlToOpen) + } + .launch("panic_button") + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt index 247af4342..e544a3d68 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabView.kt @@ -50,4 +50,6 @@ interface MessageTabView : BaseView { fun showRecyclerBottomPadding(show: Boolean) fun showMailboxChooser(mailboxes: List) + + fun openPanicWebView(url: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/panicmode/PanicModeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/panicmode/PanicModeFragment.kt new file mode 100644 index 000000000..df51c5f94 --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/panicmode/PanicModeFragment.kt @@ -0,0 +1,99 @@ +package io.github.wulkanowy.ui.modules.panicmode + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.View +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.activity.addCallback +import androidx.core.os.bundleOf +import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.R +import io.github.wulkanowy.data.WulkanowySdkFactory +import io.github.wulkanowy.databinding.FragmentPanicModeBinding +import io.github.wulkanowy.ui.base.BaseFragment +import io.github.wulkanowy.ui.modules.main.MainView +import io.github.wulkanowy.utils.WebkitCookieManagerProxy +import io.github.wulkanowy.utils.openInternetBrowser +import javax.inject.Inject + +@AndroidEntryPoint +class PanicModeFragment : BaseFragment(R.layout.fragment_panic_mode), + MainView.TitledView { + + @Inject + lateinit var wulkanowySdkFactory: WulkanowySdkFactory + + @Inject + lateinit var webkitCookieManagerProxy: WebkitCookieManagerProxy + + private var webView: WebView? = null + + override val titleStringId: Int get() = R.string.panic_mode_title + + companion object { + + private const val PANIC_URL = "panic_mode_url" + fun newInstance(url: String?): PanicModeFragment { + return PanicModeFragment().apply { + arguments = bundleOf(PANIC_URL to url) + } + } + } + + @SuppressLint("SetJavaScriptEnabled") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding = FragmentPanicModeBinding.bind(view) + + binding.panicModeRefresh.setOnClickListener { + binding.panicModeWebview.loadUrl( + binding.panicModeWebview.url ?: arguments?.getString(PANIC_URL).orEmpty() + ) + } + binding.panicModeBack.setOnClickListener { binding.panicModeWebview.goBack() } + binding.panicModeHome.setOnClickListener { + binding.panicModeWebview.loadUrl( + arguments?.getString(PANIC_URL).orEmpty() + ) + } + binding.panicModeForward.setOnClickListener { binding.panicModeWebview.goForward() } + binding.panicModeShare.setOnClickListener { + requireContext().openInternetBrowser( + binding.panicModeWebview.url.toString(), + ) + } + + val onBackPressedCallback = requireActivity().onBackPressedDispatcher + .addCallback(viewLifecycleOwner) { + binding.panicModeWebview.goBack() + } + + with(binding.panicModeWebview) { + webView = this + with(settings) { + javaScriptEnabled = true + userAgentString = wulkanowySdkFactory.createBase().userAgent + } + + webViewClient = object : WebViewClient() { + override fun doUpdateVisitedHistory( + view: WebView?, + url: String?, + isReload: Boolean + ) { + binding.panicModeBack.isEnabled = binding.panicModeWebview.canGoBack() + binding.panicModeForward.isEnabled = binding.panicModeWebview.canGoForward() + onBackPressedCallback.isEnabled = binding.panicModeWebview.canGoBack() + } + } + loadUrl(arguments?.getString(PANIC_URL).orEmpty()) + } + } + + override fun onDestroy() { + webkitCookieManagerProxy.webkitCookieManager?.flush() + webView?.destroy() + super.onDestroy() + } +} diff --git a/app/src/main/res/layout/fragment_message_tab.xml b/app/src/main/res/layout/fragment_message_tab.xml index f17ec8df9..1bbf08817 100644 --- a/app/src/main/res/layout/fragment_message_tab.xml +++ b/app/src/main/res/layout/fragment_message_tab.xml @@ -60,6 +60,16 @@ tools:ignore="UseCompoundDrawables" tools:visibility="invisible"> + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a56a07791..566535fd8 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -872,6 +872,8 @@ Strona dziennika VULCAN wymaga weryfikacji Dlaczego to widzę?\nStrona internetowa dziennika, z której Wulkanowy pobiera dane, wyświetla ten sam ekran jak powyżej, więc Wulkanowy musi również ją pokazać, aby móc pobrać dane z tej witryny. Nie da się tego obejść Pomyślnie zweryfikowano + + Awaryjny dostęp Brak połączenia z internetem Wystąpił błąd. Sprawdź poprawność daty w urządzeniu diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4197c87e4..82ccf5a2a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -869,6 +869,9 @@ Why am I seeing this?\nThe register website from which Wulkanowy downloads data displays the same screen as above, so Wulkanowy must also show it to be able to download data from this website. There\'s no way around it Verified successfully + + Emergency access + No internet connection