Compare commits
7 Commits
Author | SHA1 | Date | |
---|---|---|---|
05c6c8bc96 | |||
ca9caeca66 | |||
e971eb7821 | |||
c7afa262d9 | |||
1f0b400e5a | |||
b622c09e56 | |||
87fb1916d8 |
@ -27,8 +27,8 @@ android {
|
||||
testApplicationId "io.github.tests.wulkanowy"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 34
|
||||
versionCode 171
|
||||
versionName "2.6.11"
|
||||
versionCode 173
|
||||
versionName "2.6.13"
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
resValue "string", "app_name", "Wulkanowy"
|
||||
@ -160,7 +160,7 @@ play {
|
||||
defaultToAppBundles = false
|
||||
track = 'production'
|
||||
releaseStatus = ReleaseStatus.IN_PROGRESS
|
||||
userFraction = 0.99d
|
||||
userFraction = 0.1d
|
||||
updatePriority = 2
|
||||
enabled.set(false)
|
||||
}
|
||||
@ -191,7 +191,7 @@ ext {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'io.github.wulkanowy:sdk:2.6.10'
|
||||
implementation 'io.github.wulkanowy:sdk:2.6.11'
|
||||
|
||||
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
|
||||
|
||||
|
@ -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
|
||||
@ -125,6 +126,7 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>(R.layout.fragme
|
||||
mainActivity.pushView(ConferenceFragment.newInstance())
|
||||
}
|
||||
onAdminMessageClickListener = presenter::onAdminMessageSelected
|
||||
onPanicButtonClickListener = presenter::onPanicButtonClicked
|
||||
onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed
|
||||
|
||||
registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
|
||||
@ -208,7 +210,11 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>(R.layout.fragme
|
||||
binding = binding.dashboardErrorAdminMessage,
|
||||
onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed,
|
||||
onAdminMessageClickListener = presenter::onAdminMessageSelected,
|
||||
).bind(adminMessageItem.adminMessage)
|
||||
onPanicButtonClickListener = presenter::onPanicButtonClicked,
|
||||
).bind(
|
||||
item = adminMessageItem.adminMessage,
|
||||
showPanicButton = true,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,6 +242,10 @@ class DashboardFragment : BaseFragment<FragmentDashboardBinding>(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()
|
||||
|
@ -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?.openPanicWebView(urlToOpen)
|
||||
}
|
||||
.launch("panic_button")
|
||||
}
|
||||
|
||||
private fun loadHorizontalGroup(student: Student, forceRefresh: Boolean) {
|
||||
flow {
|
||||
val selectedTiles = selectedDashboardTiles
|
||||
|
@ -31,4 +31,6 @@ interface DashboardView : BaseView {
|
||||
fun openNotificationsCenterView()
|
||||
|
||||
fun openInternetBrowser(url: String)
|
||||
|
||||
fun openPanicWebView(url: String)
|
||||
}
|
||||
|
@ -59,6 +59,8 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
||||
|
||||
var onAdminMessageClickListener: (String?) -> Unit = {}
|
||||
|
||||
var onPanicButtonClickListener: () -> Unit = {}
|
||||
|
||||
var onAdminMessageDismissClickListener: (AdminMessage) -> Unit = {}
|
||||
|
||||
val items = mutableListOf<DashboardItem>()
|
||||
@ -86,35 +88,46 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
||||
DashboardItem.Type.ACCOUNT.ordinal -> 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<RecyclerView
|
||||
is AnnouncementsViewHolder -> 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<RecyclerView
|
||||
attendancePercentage == null || attendancePercentage == .0 -> {
|
||||
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<RecyclerView
|
||||
binding.dashboardLessonsItemTitleTomorrow.isVisible = false
|
||||
binding.dashboardLessonsItemTitleTodayAndTomorrow.isVisible = false
|
||||
}
|
||||
|
||||
tomorrowTimetable.isNotEmpty() -> {
|
||||
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<RecyclerView
|
||||
firstTitleText =
|
||||
context.getString(R.string.dashboard_timetable_first_lesson_title_moment)
|
||||
}
|
||||
|
||||
minutesToStartLesson < 240 -> {
|
||||
firstTitleAndValueTextColor =
|
||||
context.getThemeAttrColor(R.attr.colorOnSurface)
|
||||
@ -468,6 +493,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
|
||||
firstTitleText =
|
||||
context.getString(R.string.dashboard_timetable_first_lesson_title_soon)
|
||||
}
|
||||
|
||||
else -> {
|
||||
firstTitleAndValueTextColor =
|
||||
context.getThemeAttrColor(R.attr.colorOnSurface)
|
||||
|
@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -238,6 +238,7 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
|
||||
binding = binding.loginFormMessage,
|
||||
onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed,
|
||||
onAdminMessageClickListener = presenter::onAdminMessageSelected,
|
||||
onPanicButtonClickListener = {},
|
||||
).bind(message)
|
||||
binding.loginFormMessage.root.isVisible = message != null
|
||||
}
|
||||
|
@ -118,6 +118,7 @@ class LoginStudentSelectFragment :
|
||||
binding = binding.loginStudentSelectAdminMessage,
|
||||
onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed,
|
||||
onAdminMessageClickListener = presenter::onAdminMessageSelected,
|
||||
onPanicButtonClickListener = {},
|
||||
).bind(adminMessage)
|
||||
binding.loginStudentSelectAdminMessage.root.isVisible = adminMessage != null
|
||||
}
|
||||
|
@ -188,6 +188,7 @@ class LoginSymbolFragment :
|
||||
binding = binding.loginSymbolAdminMessage,
|
||||
onAdminMessageDismissClickListener = presenter::onAdminMessageDismissed,
|
||||
onAdminMessageClickListener = presenter::onAdminMessageSelected,
|
||||
onPanicButtonClickListener = {},
|
||||
).bind(adminMessage)
|
||||
binding.loginSymbolAdminMessage.root.isVisible = adminMessage != null
|
||||
}
|
||||
|
@ -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<FragmentMessageTabBinding>(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<FragmentMessageTabBinding>(R.layout.frag
|
||||
)
|
||||
}
|
||||
|
||||
override fun openPanicWebView(url: String) {
|
||||
(requireActivity() as MainActivity).pushView(PanicModeFragment.newInstance(url))
|
||||
}
|
||||
|
||||
override fun hideKeyboard() {
|
||||
activity?.hideSoftInput()
|
||||
}
|
||||
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
@ -50,4 +50,6 @@ interface MessageTabView : BaseView {
|
||||
fun showRecyclerBottomPadding(show: Boolean)
|
||||
|
||||
fun showMailboxChooser(mailboxes: List<Mailbox>)
|
||||
|
||||
fun openPanicWebView(url: String)
|
||||
}
|
||||
|
@ -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<FragmentPanicModeBinding>(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()
|
||||
}
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
Wersja 2.6.11
|
||||
Wersja 2.6.13
|
||||
|
||||
— naprawiliśmy obsługę wiadomości i ucznia plus u osób, u których działało na wcześniejszej wersji
|
||||
— dodaliśmy tryb awaryjny (no w sensie taka przeglądarka z dziennikiem w apce, ale nie trzeba się ręcznie logować)
|
||||
— naprawiliśmy ładowania ucznia na tle klasy i lekcji zrealizowanych
|
||||
|
||||
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases
|
||||
|
@ -60,6 +60,16 @@
|
||||
tools:ignore="UseCompoundDrawables"
|
||||
tools:visibility="invisible">
|
||||
|
||||
<include
|
||||
android:id="@+id/message_tab_panic_section"
|
||||
layout="@layout/item_dashboard_panic_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:layout_marginVertical="16dp"
|
||||
android:visibility="visible"
|
||||
app:layout_constraintTop_toBottomOf="@id/dashboard_error_admin_message" />
|
||||
|
||||
<ImageView
|
||||
android:layout_width="100dp"
|
||||
android:layout_height="100dp"
|
||||
|
69
app/src/main/res/layout/fragment_panic_mode.xml
Normal file
69
app/src/main/res/layout/fragment_panic_mode.xml
Normal file
@ -0,0 +1,69 @@
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical"
|
||||
tools:context=".ui.modules.panicmode.PanicModeFragment">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:background="?colorControlHighlight">
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/panic_mode_share"
|
||||
style="@style/Widget.Material3.Button.IconButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
app:icon="@drawable/ic_share"
|
||||
app:iconTint="?colorOnSurface" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/panic_mode_home"
|
||||
style="@style/Widget.Material3.Button.IconButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
app:icon="@drawable/ic_all_home"
|
||||
app:iconTint="?colorOnSurface" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/panic_mode_refresh"
|
||||
style="@style/Widget.Material3.Button.IconButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
android:contentDescription="@string/logviewer_refresh"
|
||||
app:icon="@drawable/ic_refresh"
|
||||
app:iconTint="?colorOnSurface" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/panic_mode_back"
|
||||
style="@style/Widget.Material3.Button.IconButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
app:icon="@drawable/ic_chevron_left"
|
||||
app:iconTint="?colorOnSurface" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/panic_mode_forward"
|
||||
style="@style/Widget.Material3.Button.IconButton"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="end"
|
||||
app:icon="@drawable/ic_chevron_right"
|
||||
app:iconTint="?colorOnSurface" />
|
||||
</LinearLayout>
|
||||
|
||||
<WebView
|
||||
android:id="@+id/panic_mode_webview"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</LinearLayout>
|
@ -1,87 +1,105 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="12dp"
|
||||
android:layout_marginVertical="6dp">
|
||||
android:orientation="vertical">
|
||||
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/dashboard_admin_message_item_content"
|
||||
<com.google.android.material.card.MaterialCardView
|
||||
android:id="@+id/dashboard_admin_message"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="12dp"
|
||||
android:layout_marginVertical="6dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/dashboard_admin_message_item_icon"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:src="@drawable/ic_error"
|
||||
app:layout_constraintBottom_toBottomOf="@id/dashboard_admin_message_item_title"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/dashboard_admin_message_item_title"
|
||||
tools:ignore="ContentDescription"
|
||||
tools:tint="@android:color/black" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dashboard_admin_message_item_title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toStartOf="@id/dashboard_admin_message_item_close"
|
||||
app:layout_constraintStart_toEndOf="@id/dashboard_admin_message_item_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="@tools:sample/lorem" />
|
||||
<androidx.constraintlayout.widget.ConstraintLayout
|
||||
android:id="@+id/dashboard_admin_message_item_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/dashboard_admin_message_item_close"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginEnd="4dp"
|
||||
android:padding="12dp"
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:src="@drawable/ic_close"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:ignore="ContentDescription" />
|
||||
<ImageView
|
||||
android:id="@+id/dashboard_admin_message_item_icon"
|
||||
android:layout_width="24dp"
|
||||
android:layout_height="24dp"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:src="@drawable/ic_error"
|
||||
app:layout_constraintBottom_toBottomOf="@id/dashboard_admin_message_item_title"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="@id/dashboard_admin_message_item_title"
|
||||
tools:ignore="ContentDescription"
|
||||
tools:tint="@android:color/black" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dashboard_admin_message_item_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/dashboard_admin_message_item_title"
|
||||
app:layout_constraintVertical_bias="0"
|
||||
app:lineHeight="20dp"
|
||||
tools:maxLines="5"
|
||||
tools:text="@tools:sample/lorem/random" />
|
||||
<TextView
|
||||
android:id="@+id/dashboard_admin_message_item_title"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="8dp"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
app:layout_constraintEnd_toStartOf="@id/dashboard_admin_message_item_close"
|
||||
app:layout_constraintStart_toEndOf="@id/dashboard_admin_message_item_icon"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:text="@tools:sample/lorem" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/dashboard_admin_message_item_dismiss"
|
||||
style="@style/Widget.Material3.Button.TextButton.Dialog"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@android:string/ok"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/dashboard_admin_message_item_description"
|
||||
app:layout_constraintVertical_bias="0" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
<ImageView
|
||||
android:id="@+id/dashboard_admin_message_item_close"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_marginTop="4dp"
|
||||
android:layout_marginEnd="4dp"
|
||||
android:background="?selectableItemBackgroundBorderless"
|
||||
android:padding="12dp"
|
||||
android:src="@drawable/ic_close"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:ignore="ContentDescription" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/dashboard_admin_message_item_description"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:textSize="14sp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/dashboard_admin_message_item_title"
|
||||
app:layout_constraintVertical_bias="0"
|
||||
app:lineHeight="20dp"
|
||||
tools:maxLines="5"
|
||||
tools:text="@tools:sample/lorem/random" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/dashboard_admin_message_item_dismiss"
|
||||
style="@style/Widget.Material3.Button.TextButton.Dialog"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:text="@android:string/ok"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/dashboard_admin_message_item_description"
|
||||
app:layout_constraintVertical_bias="0" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</com.google.android.material.card.MaterialCardView>
|
||||
|
||||
<include
|
||||
android:id="@+id/dashboard_panic_section"
|
||||
layout="@layout/item_dashboard_panic_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="16dp"
|
||||
android:layout_marginVertical="16dp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintTop_toBottomOf="@id/dashboard_error_admin_message" />
|
||||
</LinearLayout>
|
||||
|
28
app/src/main/res/layout/item_dashboard_panic_button.xml
Normal file
28
app/src/main/res/layout/item_dashboard_panic_button.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="12dp"
|
||||
android:layout_marginVertical="6dp">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_margin="16dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Aplikacja nie działa?"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/dashboard_panic_button"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="10dp"
|
||||
android:text="Otwórz stronę dziennika" />
|
||||
</LinearLayout>
|
||||
|
||||
</com.google.android.material.card.MaterialCardView>
|
@ -872,6 +872,8 @@
|
||||
<string name="captcha_dialog_title">Strona dziennika VULCAN wymaga weryfikacji</string>
|
||||
<string name="captcha_dialog_description"><b>Dlaczego to widzę?</b>\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ść</string>
|
||||
<string name="captcha_verified_message">Pomyślnie zweryfikowano</string>
|
||||
<!--Panic mode-->
|
||||
<string name="panic_mode_title">Awaryjny dostęp</string>
|
||||
<!--Errors-->
|
||||
<string name="error_no_internet">Brak połączenia z internetem</string>
|
||||
<string name="error_invalid_device_datetime">Wystąpił błąd. Sprawdź poprawność daty w urządzeniu</string>
|
||||
|
@ -869,6 +869,9 @@
|
||||
<string name="captcha_dialog_description"><b>Why am I seeing this?</b>\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</string>
|
||||
<string name="captcha_verified_message">Verified successfully</string>
|
||||
|
||||
<!--Panic mode-->
|
||||
<string name="panic_mode_title">Emergency access</string>
|
||||
|
||||
|
||||
<!--Errors-->
|
||||
<string name="error_no_internet">No internet connection</string>
|
||||
|
Reference in New Issue
Block a user