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 dda12f37..4636fa7b 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 bc6a991a..25774d04 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 8b9de996..a70f82e2 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 56a0a773..dd7fb962 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 12f9d323..b29c2cd8 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 cda0b32b..ad3e7c9c 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 247af434..e544a3d6 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 00000000..df51c5f9 --- /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 f17ec8df..1bbf0881 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 a56a0779..566535fd 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 4197c87e..82ccf5a2 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