Update project to Android SDK 31 (#1570)

This commit is contained in:
Rafał Borcz 2021-11-11 15:23:20 +01:00 committed by GitHub
parent f88d44f0ec
commit 007d62e61d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
76 changed files with 316 additions and 384 deletions

View File

@ -15,17 +15,16 @@ apply from: 'sonarqube.gradle'
apply from: 'hooks.gradle' apply from: 'hooks.gradle'
android { android {
compileSdkVersion 30 compileSdkVersion 31
defaultConfig { defaultConfig {
applicationId "io.github.wulkanowy" applicationId "io.github.wulkanowy"
testApplicationId "io.github.tests.wulkanowy" testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 30 targetSdkVersion 31
versionCode 97 versionCode 97
versionName "1.3.0" versionName "1.3.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
resValue "string", "app_name", "Wulkanowy" resValue "string", "app_name", "Wulkanowy"
@ -166,7 +165,7 @@ huaweiPublish {
} }
ext { ext {
work_manager = "2.6.0" work_manager = "2.7.0"
android_hilt = "1.0.0" android_hilt = "1.0.0"
room = "2.3.0" room = "2.3.0"
chucker = "3.5.2" chucker = "3.5.2"
@ -183,9 +182,9 @@ dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
implementation "androidx.core:core-ktx:1.6.0" implementation "androidx.core:core-ktx:1.6.0"
implementation 'androidx.core:core-splashscreen:1.0.0-alpha02'
implementation "androidx.activity:activity-ktx:1.3.1" implementation "androidx.activity:activity-ktx:1.3.1"
implementation "androidx.appcompat:appcompat:1.3.1" implementation "androidx.appcompat:appcompat:1.4.0-beta01"
implementation "androidx.appcompat:appcompat-resources:1.3.1"
implementation "androidx.fragment:fragment-ktx:1.3.6" implementation "androidx.fragment:fragment-ktx:1.3.6"
implementation "androidx.annotation:annotation:1.2.0" implementation "androidx.annotation:annotation:1.2.0"

View File

@ -42,7 +42,6 @@
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="false" android:supportsRtl="false"
android:theme="@style/WulkanowyTheme" android:theme="@style/WulkanowyTheme"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"> tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
<activity <activity
android:name=".ui.modules.splash.SplashActivity" android:name=".ui.modules.splash.SplashActivity"

View File

@ -22,11 +22,14 @@ class SharedPrefProvider @Inject constructor(
fun getString(key: String) = sharedPref.getString(key, null) fun getString(key: String) = sharedPref.getString(key, null)
fun getString(key: String, defaultValue: String): String = sharedPref.getString(key, defaultValue) ?: defaultValue fun getString(key: String, defaultValue: String): String =
sharedPref.getString(key, defaultValue) ?: defaultValue
fun getBoolean(key: String, defaultValue: Boolean): Boolean = sharedPref.getBoolean(key, defaultValue) fun getBoolean(key: String, defaultValue: Boolean): Boolean =
sharedPref.getBoolean(key, defaultValue)
fun putBoolean(key: String, value: Boolean, sync: Boolean = false) = sharedPref.edit(sync) { putBoolean(key, value) } fun putBoolean(key: String, value: Boolean, sync: Boolean = false) =
sharedPref.edit(sync) { putBoolean(key, value) }
fun putString(key: String, value: String?, sync: Boolean = false) { fun putString(key: String, value: String?, sync: Boolean = false) {
sharedPref.edit(sync) { putString(key, value) } sharedPref.edit(sync) { putString(key, value) }

View File

@ -1,7 +1,6 @@
package io.github.wulkanowy.services.alarm package io.github.wulkanowy.services.alarm
import android.app.PendingIntent import android.app.PendingIntent
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
@ -16,7 +15,8 @@ import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.services.HiltBroadcastReceiver import io.github.wulkanowy.services.HiltBroadcastReceiver
import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID import io.github.wulkanowy.services.sync.channels.UpcomingLessonsChannel.Companion.CHANNEL_ID
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.PendingIntentCompat
import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResource
import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.getCompatColor
import io.github.wulkanowy.utils.toLocalDateTime import io.github.wulkanowy.utils.toLocalDateTime
@ -138,8 +138,8 @@ class TimetableNotificationReceiver : HiltBroadcastReceiver() {
PendingIntent.getActivity( PendingIntent.getActivity(
context, context,
NOTIFICATION_ID, NOTIFICATION_ID,
MainActivity.getStartIntent(context, Destination.Timetable(), true), SplashActivity.getStartIntent(context, Destination.Timetable(), true),
FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
) )
) )
.build() .build()

View File

@ -3,7 +3,6 @@ package io.github.wulkanowy.services.alarm
import android.app.AlarmManager import android.app.AlarmManager
import android.app.AlarmManager.RTC_WAKEUP import android.app.AlarmManager.RTC_WAKEUP
import android.app.PendingIntent import android.app.PendingIntent
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import androidx.core.app.AlarmManagerCompat import androidx.core.app.AlarmManagerCompat
@ -26,6 +25,7 @@ import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companio
import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_ID import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_ID
import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME import io.github.wulkanowy.services.alarm.TimetableNotificationReceiver.Companion.STUDENT_NAME
import io.github.wulkanowy.utils.DispatchersProvider import io.github.wulkanowy.utils.DispatchersProvider
import io.github.wulkanowy.utils.PendingIntentCompat
import io.github.wulkanowy.utils.nickOrName import io.github.wulkanowy.utils.nickOrName
import io.github.wulkanowy.utils.toTimestamp import io.github.wulkanowy.utils.toTimestamp
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -72,8 +72,14 @@ class TimetableNotificationSchedulerHelper @Inject constructor(
private fun cancelScheduledTo(range: ClosedRange<LocalDateTime>, requestCode: Int) { private fun cancelScheduledTo(range: ClosedRange<LocalDateTime>, requestCode: Int) {
if (now() in range) cancelNotification() if (now() in range) cancelNotification()
alarmManager.cancel( alarmManager.cancel(
PendingIntent.getBroadcast(context, requestCode, Intent(), FLAG_UPDATE_CURRENT) PendingIntent.getBroadcast(
context,
requestCode,
Intent(),
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
)
) )
} }
@ -156,7 +162,7 @@ class TimetableNotificationSchedulerHelper @Inject constructor(
alarmManager, RTC_WAKEUP, time.toTimestamp(), alarmManager, RTC_WAKEUP, time.toTimestamp(),
PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also {
it.putExtra(LESSON_TYPE, notificationType) it.putExtra(LESSON_TYPE, notificationType)
}, FLAG_UPDATE_CURRENT) }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE)
) )
Timber.d( Timber.d(
"TimetableNotification scheduled: type: $notificationType, subject: ${ "TimetableNotification scheduled: type: $notificationType, subject: ${

View File

@ -8,7 +8,7 @@ import androidx.core.graphics.drawable.IconCompat
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import io.github.wulkanowy.R import io.github.wulkanowy.R
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@ -35,7 +35,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex
.setShortLabel(context.getString(R.string.grade_title)) .setShortLabel(context.getString(R.string.grade_title))
.setLongLabel(context.getString(R.string.grade_title)) .setLongLabel(context.getString(R.string.grade_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_grade)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_grade))
.setIntent(MainActivity.getStartIntent(context, startNewTask = true) .setIntent(SplashActivity.getStartIntent(context, startNewTask = true)
.apply { .apply {
action = Intent.ACTION_VIEW action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "grade") putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "grade")
@ -47,7 +47,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex
.setShortLabel(context.getString(R.string.attendance_title)) .setShortLabel(context.getString(R.string.attendance_title))
.setLongLabel(context.getString(R.string.attendance_title)) .setLongLabel(context.getString(R.string.attendance_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_attendance)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_attendance))
.setIntent(MainActivity.getStartIntent(context, startNewTask = true) .setIntent(SplashActivity.getStartIntent(context, startNewTask = true)
.apply { .apply {
action = Intent.ACTION_VIEW action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "attendance") putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "attendance")
@ -59,7 +59,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex
.setShortLabel(context.getString(R.string.exam_title)) .setShortLabel(context.getString(R.string.exam_title))
.setLongLabel(context.getString(R.string.exam_title)) .setLongLabel(context.getString(R.string.exam_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_exam)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_exam))
.setIntent(MainActivity.getStartIntent(context, startNewTask = true) .setIntent(SplashActivity.getStartIntent(context, startNewTask = true)
.apply { .apply {
action = Intent.ACTION_VIEW action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "exam") putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "exam")
@ -71,7 +71,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex
.setShortLabel(context.getString(R.string.timetable_title)) .setShortLabel(context.getString(R.string.timetable_title))
.setLongLabel(context.getString(R.string.timetable_title)) .setLongLabel(context.getString(R.string.timetable_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_timetable)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_timetable))
.setIntent(MainActivity.getStartIntent(context, startNewTask = true) .setIntent(SplashActivity.getStartIntent(context, startNewTask = true)
.apply { .apply {
action = Intent.ACTION_VIEW action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "timetable") putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "timetable")

View File

@ -13,6 +13,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.data.repositories.NotificationRepository import io.github.wulkanowy.data.repositories.NotificationRepository
import io.github.wulkanowy.utils.PendingIntentCompat
import io.github.wulkanowy.utils.getCompatBitmap import io.github.wulkanowy.utils.getCompatBitmap
import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.getCompatColor
import io.github.wulkanowy.utils.nickOrName import io.github.wulkanowy.utils.nickOrName
@ -45,7 +46,7 @@ class AppNotificationManager @Inject constructor(
context, context,
Random.nextInt(), Random.nextInt(),
notificationData.intentToStart, notificationData.intentToStart,
PendingIntent.FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
) )
) )
.setContentTitle(notificationData.title) .setContentTitle(notificationData.title)
@ -86,7 +87,7 @@ class AppNotificationManager @Inject constructor(
context, context,
Random.nextInt(), Random.nextInt(),
notificationData.intentToStart, notificationData.intentToStart,
PendingIntent.FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
) )
) )
.setContentTitle(notificationData.title) .setContentTitle(notificationData.title)
@ -134,7 +135,7 @@ class AppNotificationManager @Inject constructor(
context, context,
Random.nextInt(), Random.nextInt(),
groupNotificationData.intentToStart, groupNotificationData.intentToStart,
PendingIntent.FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
) )
) )
.setLocalOnly(true) .setLocalOnly(true)

View File

@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Timetable
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.toFormattedString
import java.time.LocalDate import java.time.LocalDate
@ -32,7 +32,7 @@ class ChangeTimetableNotification @Inject constructor(
1 1
), ),
content = it, content = it,
intentToStart = MainActivity.getStartIntent( intentToStart = SplashActivity.getStartIntent(
context = context, context = context,
destination = Destination.Timetable(date), destination = Destination.Timetable(date),
startNewTask = true startNewTask = true
@ -54,7 +54,7 @@ class ChangeTimetableNotification @Inject constructor(
changedLessons.size, changedLessons.size,
changedLessons.size changedLessons.size
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.Timetable(), true), intentToStart = SplashActivity.getStartIntent(context, Destination.Timetable(), true),
type = NotificationType.CHANGE_TIMETABLE type = NotificationType.CHANGE_TIMETABLE
) )

View File

@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.descriptionRes import io.github.wulkanowy.utils.descriptionRes
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.toFormattedString
@ -31,7 +31,7 @@ class NewAttendanceNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.attendance_notify_new_items_title, 1), title = context.getPlural(R.plurals.attendance_notify_new_items_title, 1),
content = it, content = it,
intentToStart = MainActivity.getStartIntent(context, Destination.Attendance, true) intentToStart = SplashActivity.getStartIntent(context, Destination.Attendance, true)
) )
} }
@ -46,7 +46,7 @@ class NewAttendanceNotification @Inject constructor(
notificationDataList.size, notificationDataList.size,
notificationDataList.size notificationDataList.size
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.Attendance, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Attendance, true),
type = NotificationType.NEW_ATTENDANCE type = NotificationType.NEW_ATTENDANCE
) )

View File

@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.toFormattedString
import java.time.LocalDateTime import java.time.LocalDateTime
@ -31,7 +31,7 @@ class NewConferenceNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.conference_notify_new_item_title, 1), title = context.getPlural(R.plurals.conference_notify_new_item_title, 1),
content = it, content = it,
intentToStart = MainActivity.getStartIntent(context, Destination.Conference, true) intentToStart = SplashActivity.getStartIntent(context, Destination.Conference, true)
) )
} }
@ -43,7 +43,7 @@ class NewConferenceNotification @Inject constructor(
lines.size, lines.size,
lines.size lines.size
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.Conference, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Conference, true),
type = NotificationType.NEW_CONFERENCE type = NotificationType.NEW_CONFERENCE
) )

View File

@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.toFormattedString
import java.time.LocalDate import java.time.LocalDate
@ -31,7 +31,7 @@ class NewExamNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.exam_notify_new_item_title, 1), title = context.getPlural(R.plurals.exam_notify_new_item_title, 1),
content = it, content = it,
intentToStart = MainActivity.getStartIntent(context, Destination.Exam, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Exam, true),
) )
} }
@ -43,7 +43,7 @@ class NewExamNotification @Inject constructor(
lines.size, lines.size,
lines.size lines.size
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.Exam, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Exam, true),
type = NotificationType.NEW_EXAM type = NotificationType.NEW_EXAM
) )

View File

@ -9,7 +9,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import javax.inject.Inject import javax.inject.Inject
@ -23,7 +23,7 @@ class NewGradeNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.grade_new_items, 1), title = context.getPlural(R.plurals.grade_new_items, 1),
content = "${it.subject}: ${it.entry}", content = "${it.subject}: ${it.entry}",
intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true),
) )
} }
@ -31,7 +31,7 @@ class NewGradeNotification @Inject constructor(
notificationDataList = notificationDataList, notificationDataList = notificationDataList,
title = context.getPlural(R.plurals.grade_new_items, items.size), title = context.getPlural(R.plurals.grade_new_items, items.size),
content = context.getPlural(R.plurals.grade_notify_new_items, items.size, items.size), content = context.getPlural(R.plurals.grade_notify_new_items, items.size, items.size),
intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true),
type = NotificationType.NEW_GRADE_DETAILS type = NotificationType.NEW_GRADE_DETAILS
) )
@ -43,7 +43,7 @@ class NewGradeNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.grade_new_items_predicted, 1), title = context.getPlural(R.plurals.grade_new_items_predicted, 1),
content = "${it.subject}: ${it.predictedGrade}", content = "${it.subject}: ${it.predictedGrade}",
intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true),
) )
} }
@ -55,7 +55,7 @@ class NewGradeNotification @Inject constructor(
items.size, items.size,
items.size items.size
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true),
type = NotificationType.NEW_GRADE_PREDICTED type = NotificationType.NEW_GRADE_PREDICTED
) )
@ -67,7 +67,7 @@ class NewGradeNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.grade_new_items_final, 1), title = context.getPlural(R.plurals.grade_new_items_final, 1),
content = "${it.subject}: ${it.finalGrade}", content = "${it.subject}: ${it.finalGrade}",
intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true),
) )
} }
@ -79,7 +79,7 @@ class NewGradeNotification @Inject constructor(
items.size, items.size,
items.size items.size
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true),
type = NotificationType.NEW_GRADE_FINAL type = NotificationType.NEW_GRADE_FINAL
) )

View File

@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import io.github.wulkanowy.utils.toFormattedString import io.github.wulkanowy.utils.toFormattedString
import java.time.LocalDate import java.time.LocalDate
@ -31,7 +31,7 @@ class NewHomeworkNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.homework_notify_new_item_title, 1), title = context.getPlural(R.plurals.homework_notify_new_item_title, 1),
content = it, content = it,
intentToStart = MainActivity.getStartIntent(context, Destination.Homework, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Homework, true),
) )
} }
@ -42,7 +42,7 @@ class NewHomeworkNotification @Inject constructor(
lines.size, lines.size,
lines.size lines.size
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.Homework, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Homework, true),
type = NotificationType.NEW_HOMEWORK, type = NotificationType.NEW_HOMEWORK,
notificationDataList = notificationDataList notificationDataList = notificationDataList
) )

View File

@ -7,7 +7,7 @@ import io.github.wulkanowy.data.db.entities.LuckyNumber
import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import javax.inject.Inject import javax.inject.Inject
class NewLuckyNumberNotification @Inject constructor( class NewLuckyNumberNotification @Inject constructor(
@ -22,7 +22,7 @@ class NewLuckyNumberNotification @Inject constructor(
R.string.lucky_number_notify_new_item, R.string.lucky_number_notify_new_item,
item.luckyNumber.toString() item.luckyNumber.toString()
), ),
intentToStart = MainActivity.getStartIntent(context, Destination.LuckyNumber, true) intentToStart = SplashActivity.getStartIntent(context, Destination.LuckyNumber, true)
) )
appNotificationManager.sendSingleNotification( appNotificationManager.sendSingleNotification(

View File

@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import javax.inject.Inject import javax.inject.Inject
@ -22,7 +22,7 @@ class NewMessageNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(R.plurals.message_new_items, 1), title = context.getPlural(R.plurals.message_new_items, 1),
content = "${it.sender}: ${it.subject}", content = "${it.sender}: ${it.subject}",
intentToStart = MainActivity.getStartIntent(context, Destination.Message, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Message, true),
) )
} }
@ -30,7 +30,7 @@ class NewMessageNotification @Inject constructor(
notificationDataList = notificationDataList, notificationDataList = notificationDataList,
title = context.getPlural(R.plurals.message_new_items, items.size), title = context.getPlural(R.plurals.message_new_items, items.size),
content = context.getPlural(R.plurals.message_notify_new_items, items.size, items.size), content = context.getPlural(R.plurals.message_notify_new_items, items.size, items.size),
intentToStart = MainActivity.getStartIntent(context, Destination.Message, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Message, true),
type = NotificationType.NEW_MESSAGE type = NotificationType.NEW_MESSAGE
) )

View File

@ -9,7 +9,7 @@ import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import javax.inject.Inject import javax.inject.Inject
@ -29,13 +29,13 @@ class NewNoteNotification @Inject constructor(
NotificationData( NotificationData(
title = context.getPlural(titleRes, 1), title = context.getPlural(titleRes, 1),
content = "${it.teacher}: ${it.category}", content = "${it.teacher}: ${it.category}",
intentToStart = MainActivity.getStartIntent(context, Destination.Note, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Note, true),
) )
} }
val groupNotificationData = GroupNotificationData( val groupNotificationData = GroupNotificationData(
notificationDataList = notificationDataList, notificationDataList = notificationDataList,
intentToStart = MainActivity.getStartIntent(context, Destination.Note, true), intentToStart = SplashActivity.getStartIntent(context, Destination.Note, true),
title = context.getPlural(R.plurals.note_new_items, items.size), title = context.getPlural(R.plurals.note_new_items, items.size),
content = context.getPlural(R.plurals.note_notify_new_items, items.size, items.size), content = context.getPlural(R.plurals.note_notify_new_items, items.size, items.size),
type = NotificationType.NEW_NOTE type = NotificationType.NEW_NOTE

View File

@ -8,7 +8,7 @@ import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.GroupNotificationData
import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.data.pojos.NotificationData
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.getPlural import io.github.wulkanowy.utils.getPlural
import javax.inject.Inject import javax.inject.Inject
@ -20,7 +20,7 @@ class NewSchoolAnnouncementNotification @Inject constructor(
suspend fun notify(items: List<SchoolAnnouncement>, student: Student) { suspend fun notify(items: List<SchoolAnnouncement>, student: Student) {
val notificationDataList = items.map { val notificationDataList = items.map {
NotificationData( NotificationData(
intentToStart = MainActivity.getStartIntent( intentToStart = SplashActivity.getStartIntent(
context = context, context = context,
destination = Destination.SchoolAnnouncement, destination = Destination.SchoolAnnouncement,
startNewTask = true startNewTask = true
@ -34,7 +34,7 @@ class NewSchoolAnnouncementNotification @Inject constructor(
} }
val groupNotificationData = GroupNotificationData( val groupNotificationData = GroupNotificationData(
type = NotificationType.NEW_ANNOUNCEMENT, type = NotificationType.NEW_ANNOUNCEMENT,
intentToStart = MainActivity.getStartIntent( intentToStart = SplashActivity.getStartIntent(
context = context, context = context,
destination = Destination.SchoolAnnouncement, destination = Destination.SchoolAnnouncement,
startNewTask = true startNewTask = true

View File

@ -1,14 +1,11 @@
package io.github.wulkanowy.ui.base package io.github.wulkanowy.ui.base
import android.app.ActivityManager import android.app.ActivityManager
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.android.material.snackbar.Snackbar.LENGTH_LONG import com.google.android.material.snackbar.Snackbar.LENGTH_LONG
@ -40,7 +37,6 @@ abstract class BaseActivity<T : BasePresenter<out BaseView>, VB : ViewBinding> :
themeManager.applyActivityTheme(this) themeManager.applyActivityTheme(this)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true) supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true)
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
setTaskDescription( setTaskDescription(
@ -83,8 +79,8 @@ abstract class BaseActivity<T : BasePresenter<out BaseView>, VB : ViewBinding> :
} }
override fun openClearLoginView() { override fun openClearLoginView() {
startActivity(LoginActivity.getStartIntent(this) startActivity(LoginActivity.getStartIntent(this))
.apply { addFlags(FLAG_ACTIVITY_CLEAR_TASK or FLAG_ACTIVITY_NEW_TASK) }) finishAffinity()
} }
override fun onDestroy() { override fun onDestroy() {

View File

@ -20,7 +20,7 @@ open class BasePresenter<T : BaseView>(
) { ) {
private val job = SupervisorJob() private val job = SupervisorJob()
protected val presenterScope = CoroutineScope(job + Dispatchers.Main) protected val presenterScope = CoroutineScope(job + Dispatchers.Main.immediate)
private val childrenJobs = mutableMapOf<String, Job>() private val childrenJobs = mutableMapOf<String, Job>()

View File

@ -41,14 +41,15 @@ class ThemeManager @Inject constructor(private val preferencesRepository: Prefer
) )
} }
private fun isThemeApplicable(activity: AppCompatActivity): Boolean { private fun isThemeApplicable(activity: AppCompatActivity) =
return activity.packageManager activity.packageManager
.getPackageInfo(activity.packageName, GET_ACTIVITIES) .getPackageInfo(activity.packageName, GET_ACTIVITIES)
.activities.singleOrNull { it.name == activity::class.java.canonicalName } .activities
?.theme.let { .singleOrNull { it.name == activity::class.java.canonicalName }
?.theme
.let {
it == R.style.WulkanowyTheme_Black || it == R.style.WulkanowyTheme_NoActionBar it == R.style.WulkanowyTheme_Black || it == R.style.WulkanowyTheme_NoActionBar
|| it == R.style.WulkanowyTheme_Login || it == R.style.WulkanowyTheme_Login_Black || it == R.style.WulkanowyTheme_Login || it == R.style.WulkanowyTheme_Login_Black
|| it == R.style.WulkanowyTheme_MessageSend || it == R.style.WulkanowyTheme_MessageSend_Black || it == R.style.WulkanowyTheme_MessageSend || it == R.style.WulkanowyTheme_MessageSend_Black
} }
}
} }

View File

@ -19,6 +19,10 @@ import java.time.LocalDate
sealed interface Destination : Serializable { sealed interface Destination : Serializable {
/*
Type in children classes have to be as getter to avoid null in enums
https://stackoverflow.com/questions/68866453/kotlin-enum-val-is-returning-null-despite-being-set-at-compile-time
*/
val type: Type val type: Type
val fragment: Fragment val fragment: Fragment
@ -41,91 +45,91 @@ sealed interface Destination : Serializable {
object Dashboard : Destination { object Dashboard : Destination {
override val type = Type.DASHBOARD override val type get() = Type.DASHBOARD
override val fragment get() = DashboardFragment.newInstance() override val fragment get() = DashboardFragment.newInstance()
} }
object Grade : Destination { object Grade : Destination {
override val type = Type.GRADE override val type get() = Type.GRADE
override val fragment get() = GradeFragment.newInstance() override val fragment get() = GradeFragment.newInstance()
} }
object Attendance : Destination { object Attendance : Destination {
override val type = Type.ATTENDANCE override val type get() = Type.ATTENDANCE
override val fragment get() = AttendanceFragment.newInstance() override val fragment get() = AttendanceFragment.newInstance()
} }
object Exam : Destination { object Exam : Destination {
override val type = Type.EXAM override val type get() = Type.EXAM
override val fragment get() = ExamFragment.newInstance() override val fragment get() = ExamFragment.newInstance()
} }
data class Timetable(val date: LocalDate? = null) : Destination { data class Timetable(val date: LocalDate? = null) : Destination {
override val type = Type.TIMETABLE override val type get() = Type.TIMETABLE
override val fragment get() = TimetableFragment.newInstance(date) override val fragment get() = TimetableFragment.newInstance(date)
} }
object Homework : Destination { object Homework : Destination {
override val type = Type.HOMEWORK override val type get() = Type.HOMEWORK
override val fragment get() = HomeworkFragment.newInstance() override val fragment get() = HomeworkFragment.newInstance()
} }
object Note : Destination { object Note : Destination {
override val type = Type.NOTE override val type get() = Type.NOTE
override val fragment get() = NoteFragment.newInstance() override val fragment get() = NoteFragment.newInstance()
} }
object Conference : Destination { object Conference : Destination {
override val type = Type.CONFERENCE override val type get() = Type.CONFERENCE
override val fragment get() = ConferenceFragment.newInstance() override val fragment get() = ConferenceFragment.newInstance()
} }
object SchoolAnnouncement : Destination { object SchoolAnnouncement : Destination {
override val type = Type.SCHOOL_ANNOUNCEMENT override val type get() = Type.SCHOOL_ANNOUNCEMENT
override val fragment get() = SchoolAnnouncementFragment.newInstance() override val fragment get() = SchoolAnnouncementFragment.newInstance()
} }
object School : Destination { object School : Destination {
override val type = Type.SCHOOL override val type get() = Type.SCHOOL
override val fragment get() = SchoolFragment.newInstance() override val fragment get() = SchoolFragment.newInstance()
} }
object LuckyNumber : Destination { object LuckyNumber : Destination {
override val type = Type.LUCKY_NUMBER override val type get() = Type.LUCKY_NUMBER
override val fragment get() = LuckyNumberFragment.newInstance() override val fragment get() = LuckyNumberFragment.newInstance()
} }
object More : Destination { object More : Destination {
override val type = Type.MORE override val type get() = Type.MORE
override val fragment get() = MoreFragment.newInstance() override val fragment get() = MoreFragment.newInstance()
} }
object Message : Destination { object Message : Destination {
override val type = Type.MESSAGE override val type get() = Type.MESSAGE
override val fragment get() = MessageFragment.newInstance() override val fragment get() = MessageFragment.newInstance()
} }

View File

@ -3,12 +3,9 @@ package io.github.wulkanowy.ui.modules.account.accountedit
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.graphics.Color import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.graphics.drawable.GradientDrawable import android.graphics.drawable.GradientDrawable
import android.graphics.drawable.RippleDrawable import android.graphics.drawable.RippleDrawable
import android.graphics.drawable.StateListDrawable
import android.os.Build
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.ViewGroup import android.view.ViewGroup
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -52,30 +49,13 @@ class AccountEditColorAdapter @Inject constructor() :
} }
} }
private fun Int.createForegroundDrawable(): Drawable = private fun Int.createForegroundDrawable(): Drawable {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { val mask = GradientDrawable().apply {
val mask = GradientDrawable().apply { shape = GradientDrawable.OVAL
shape = GradientDrawable.OVAL setColor(Color.BLACK)
setColor(Color.BLACK)
}
RippleDrawable(ColorStateList.valueOf(this.rippleColor), null, mask)
} else {
val foreground = StateListDrawable().apply {
alpha = 80
setEnterFadeDuration(250)
setExitFadeDuration(250)
}
val mask = GradientDrawable().apply {
shape = GradientDrawable.OVAL
setColor(this@createForegroundDrawable.rippleColor)
}
foreground.apply {
addState(intArrayOf(android.R.attr.state_pressed), mask)
addState(intArrayOf(), ColorDrawable(Color.TRANSPARENT))
}
} }
return RippleDrawable(ColorStateList.valueOf(this.rippleColor), null, mask)
}
private inline val Int.rippleColor: Int private inline val Int.rippleColor: Int
get() { get() {

View File

@ -121,9 +121,7 @@ class AttendanceFragment : BaseFragment<FragmentAttendanceBinding>(R.layout.frag
attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh)
attendanceSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) attendanceSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary))
attendanceSwipe.setProgressBackgroundColorSchemeColor( attendanceSwipe.setProgressBackgroundColorSchemeColor(
requireContext().getThemeAttrColor( requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh)
R.attr.colorSwipeRefresh
)
) )
attendanceErrorRetry.setOnClickListener { presenter.onRetry() } attendanceErrorRetry.setOnClickListener { presenter.onRetry() }
attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() } attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() }
@ -134,7 +132,7 @@ class AttendanceFragment : BaseFragment<FragmentAttendanceBinding>(R.layout.frag
attendanceExcuseButton.setOnClickListener { presenter.onExcuseButtonClick() } attendanceExcuseButton.setOnClickListener { presenter.onExcuseButtonClick() }
attendanceNavContainer.setElevationCompat(requireContext().dpToPx(8f)) attendanceNavContainer.elevation = requireContext().dpToPx(8f)
} }
} }

View File

@ -71,7 +71,7 @@ class AttendanceSummaryFragment :
setOnItemSelectedListener<TextView> { presenter.onSubjectSelected(it?.text?.toString()) } setOnItemSelectedListener<TextView> { presenter.onSubjectSelected(it?.text?.toString()) }
} }
binding.attendanceSummarySubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) binding.attendanceSummarySubjectsContainer.elevation = requireContext().dpToPx(1f)
} }
override fun updateSubjects(data: ArrayList<String>) { override fun updateSubjects(data: ArrayList<String>) {

View File

@ -64,7 +64,7 @@ class ExamFragment : BaseFragment<FragmentExamBinding>(R.layout.fragment_exam),
examPreviousButton.setOnClickListener { presenter.onPreviousWeek() } examPreviousButton.setOnClickListener { presenter.onPreviousWeek() }
examNextButton.setOnClickListener { presenter.onNextWeek() } examNextButton.setOnClickListener { presenter.onNextWeek() }
examNavContainer.setElevationCompat(requireContext().dpToPx(8f)) examNavContainer.elevation = requireContext().dpToPx(8f)
} }
} }

View File

@ -96,9 +96,7 @@ class GradeFragment : BaseFragment<FragmentGradeBinding>(R.layout.fragment_grade
TabLayoutMediator(binding.gradeTabLayout, binding.gradeViewPager, this).attach() TabLayoutMediator(binding.gradeTabLayout, binding.gradeViewPager, this).attach()
} }
with(binding.gradeTabLayout) { binding.gradeTabLayout.elevation = requireContext().dpToPx(4f)
setElevationCompat(context.dpToPx(4f))
}
with(binding) { with(binding) {
gradeErrorRetry.setOnClickListener { presenter.onRetry() } gradeErrorRetry.setOnClickListener { presenter.onRetry() }

View File

@ -68,7 +68,7 @@ class GradeStatisticsFragment :
} }
with(binding) { with(binding) {
gradeStatisticsSubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) gradeStatisticsSubjectsContainer.elevation = requireContext().dpToPx(1f)
gradeStatisticsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) gradeStatisticsSwipe.setOnRefreshListener(presenter::onSwipeRefresh)
gradeStatisticsSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) gradeStatisticsSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary))

View File

@ -67,7 +67,7 @@ class HomeworkFragment : BaseFragment<FragmentHomeworkBinding>(R.layout.fragment
openAddHomeworkButton.setOnClickListener { presenter.onHomeworkAddButtonClicked() } openAddHomeworkButton.setOnClickListener { presenter.onHomeworkAddButtonClicked() }
homeworkNavContainer.setElevationCompat(requireContext().dpToPx(8f)) homeworkNavContainer.elevation = requireContext().dpToPx(8f)
} }
} }

View File

@ -35,13 +35,13 @@ class LoginActivity : BaseActivity<LoginPresenter, ActivityLoginBinding>(), Logi
@Inject @Inject
lateinit var updateHelper: UpdateHelper lateinit var updateHelper: UpdateHelper
override val currentViewIndex get() = binding.loginViewpager.currentItem
companion object { companion object {
fun getStartIntent(context: Context) = Intent(context, LoginActivity::class.java) fun getStartIntent(context: Context) = Intent(context, LoginActivity::class.java)
} }
override val currentViewIndex get() = binding.loginViewpager.currentItem
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(ActivityLoginBinding.inflate(layoutInflater).apply { binding = this }.root) setContentView(ActivityLoginBinding.inflate(layoutInflater).apply { binding = this }.root)

View File

@ -66,14 +66,8 @@ class LoginStudentSelectFragment :
} }
override fun openMainView() { override fun openMainView() {
activity?.let { startActivity(MainActivity.getStartIntent(requireContext()))
startActivity( requireActivity().finish()
MainActivity.getStartIntent(
context = it,
startNewTask = true
)
)
}
} }
override fun showProgress(show: Boolean) { override fun showProgress(show: Boolean) {
@ -115,7 +109,8 @@ class LoginStudentSelectFragment :
chooserTitle = requireContext().getString(R.string.login_email_intent_title), chooserTitle = requireContext().getString(R.string.login_email_intent_title),
email = "wulkanowyinc@gmail.com", email = "wulkanowyinc@gmail.com",
subject = requireContext().getString(R.string.login_email_subject), subject = requireContext().getString(R.string.login_email_subject),
body = requireContext().getString(R.string.login_email_text, appInfo.systemModel, body = requireContext().getString(
R.string.login_email_text, appInfo.systemModel,
appInfo.systemVersion.toString(), appInfo.systemVersion.toString(),
appInfo.versionName, appInfo.versionName,
"Select users to log in", "Select users to log in",

View File

@ -65,7 +65,7 @@ class LuckyNumberHistoryFragment :
luckyNumberHistoryPreviousButton.setOnClickListener { presenter.onPreviousWeek() } luckyNumberHistoryPreviousButton.setOnClickListener { presenter.onPreviousWeek() }
luckyNumberHistoryNextButton.setOnClickListener { presenter.onNextWeek() } luckyNumberHistoryNextButton.setOnClickListener { presenter.onNextWeek() }
luckyNumberHistoryNavContainer.setElevationCompat(requireContext().dpToPx(8f)) luckyNumberHistoryNavContainer.elevation = requireContext().dpToPx(8f)
} }
} }

View File

@ -1,7 +1,6 @@
package io.github.wulkanowy.ui.modules.luckynumberwidget package io.github.wulkanowy.ui.modules.luckynumberwidget
import android.app.PendingIntent import android.app.PendingIntent
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT
import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH
@ -19,7 +18,8 @@ import io.github.wulkanowy.data.exceptions.NoCurrentStudentException
import io.github.wulkanowy.data.repositories.LuckyNumberRepository import io.github.wulkanowy.data.repositories.LuckyNumberRepository
import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.PendingIntentCompat
import io.github.wulkanowy.utils.toFirstResult import io.github.wulkanowy.utils.toFirstResult
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import timber.log.Timber import timber.log.Timber
@ -62,8 +62,8 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() {
val appIntent = PendingIntent.getActivity( val appIntent = PendingIntent.getActivity(
context, context,
LUCKY_NUMBER_PENDING_INTENT_ID, LUCKY_NUMBER_PENDING_INTENT_ID,
MainActivity.getStartIntent(context, Destination.LuckyNumber, true), SplashActivity.getStartIntent(context, Destination.LuckyNumber, true),
FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
) )
val remoteView = val remoteView =

View File

@ -3,8 +3,6 @@ package io.github.wulkanowy.ui.modules.main
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.os.Build.VERSION_CODES.P import android.os.Build.VERSION_CODES.P
import android.os.Bundle import android.os.Bundle
import android.view.Menu import android.view.Menu
@ -23,7 +21,6 @@ import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.db.entities.StudentWithSemesters import io.github.wulkanowy.data.db.entities.StudentWithSemesters
import io.github.wulkanowy.databinding.ActivityMainBinding import io.github.wulkanowy.databinding.ActivityMainBinding
import io.github.wulkanowy.services.shortcuts.ShortcutsHelper
import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.BaseActivity
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog
@ -59,9 +56,6 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
@Inject @Inject
lateinit var appInfo: AppInfo lateinit var appInfo: AppInfo
@Inject
lateinit var shortcutsHelper: ShortcutsHelper
private var accountMenu: MenuItem? = null private var accountMenu: MenuItem? = null
private val overlayProvider by lazy { ElevationOverlayProvider(this) } private val overlayProvider by lazy { ElevationOverlayProvider(this) }
@ -76,13 +70,8 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
fun getStartIntent( fun getStartIntent(
context: Context, context: Context,
destination: Destination? = null, destination: Destination? = null,
startNewTask: Boolean = false
) = Intent(context, MainActivity::class.java).apply { ) = Intent(context, MainActivity::class.java).apply {
putExtra(EXTRA_START_DESTINATION, destination) putExtra(EXTRA_START_DESTINATION, destination)
if (startNewTask) {
flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
}
} }
} }
@ -109,7 +98,6 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
updateHelper.messageContainer = binding.mainFragmentContainer updateHelper.messageContainer = binding.mainFragmentContainer
val destination = intent.getSerializableExtra(EXTRA_START_DESTINATION) as Destination? val destination = intent.getSerializableExtra(EXTRA_START_DESTINATION) as Destination?
?: shortcutsHelper.getDestination(intent)
presenter.onAttachView(this, destination) presenter.onAttachView(this, destination)
updateHelper.checkAndInstallUpdates(this) updateHelper.checkAndInstallUpdates(this)

View File

@ -77,9 +77,8 @@ class MessageFragment : BaseFragment<FragmentMessageBinding>(R.layout.fragment_m
TabLayoutMediator(binding.messageTabLayout, binding.messageViewPager, this).attach() TabLayoutMediator(binding.messageTabLayout, binding.messageViewPager, this).attach()
} }
with(binding.messageTabLayout) { binding.messageTabLayout.elevation = requireContext().dpToPx(4f)
setElevationCompat(context.dpToPx(4f))
}
binding.openSendMessageButton.setOnClickListener { presenter.onSendMessageButtonClicked() } binding.openSendMessageButton.setOnClickListener { presenter.onSendMessageButtonClicked() }
} }

View File

@ -1,6 +1,5 @@
package io.github.wulkanowy.ui.modules.message.preview package io.github.wulkanowy.ui.modules.message.preview
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.print.PrintAttributes import android.print.PrintAttributes
import android.print.PrintManager import android.print.PrintManager
@ -13,7 +12,6 @@ import android.view.View.VISIBLE
import android.webkit.WebResourceRequest import android.webkit.WebResourceRequest
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import androidx.annotation.RequiresApi
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
@ -25,7 +23,6 @@ import io.github.wulkanowy.ui.base.BaseFragment
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.ui.modules.main.MainView import io.github.wulkanowy.ui.modules.main.MainView
import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity
import io.github.wulkanowy.utils.AppInfo
import io.github.wulkanowy.utils.shareText import io.github.wulkanowy.utils.shareText
import javax.inject.Inject import javax.inject.Inject
@ -40,9 +37,6 @@ class MessagePreviewFragment :
@Inject @Inject
lateinit var previewAdapter: MessagePreviewAdapter lateinit var previewAdapter: MessagePreviewAdapter
@Inject
lateinit var appInfo: AppInfo
private var menuReplyButton: MenuItem? = null private var menuReplyButton: MenuItem? = null
private var menuForwardButton: MenuItem? = null private var menuForwardButton: MenuItem? = null
@ -140,7 +134,7 @@ class MessagePreviewFragment :
menuForwardButton?.isVisible = show menuForwardButton?.isVisible = show
menuDeleteButton?.isVisible = show menuDeleteButton?.isVisible = show
menuShareButton?.isVisible = show menuShareButton?.isVisible = show
menuPrintButton?.isVisible = show && appInfo.systemVersion >= Build.VERSION_CODES.LOLLIPOP menuPrintButton?.isVisible = show
} }
override fun setDeletedOptionsLabels() { override fun setDeletedOptionsLabels() {
@ -175,7 +169,6 @@ class MessagePreviewFragment :
context?.shareText(text, subject) context?.shareText(text, subject)
} }
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
override fun printDocument(html: String, jobName: String) { override fun printDocument(html: String, jobName: String) {
val webView = WebView(requireContext()) val webView = WebView(requireContext())
webView.webViewClient = object : WebViewClient() { webView.webViewClient = object : WebViewClient() {
@ -190,7 +183,6 @@ class MessagePreviewFragment :
webView.loadDataWithBaseURL("file:///android_asset/", html, "text/HTML", "UTF-8", null) webView.loadDataWithBaseURL("file:///android_asset/", html, "text/HTML", "UTF-8", null)
} }
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
private fun createWebPrintJob(webView: WebView, jobName: String) { private fun createWebPrintJob(webView: WebView, jobName: String) {
activity?.getSystemService<PrintManager>()?.let { printManager -> activity?.getSystemService<PrintManager>()?.let { printManager ->
val printAdapter = webView.createPrintDocumentAdapter(jobName) val printAdapter = webView.createPrintDocumentAdapter(jobName)

View File

@ -1,7 +1,6 @@
package io.github.wulkanowy.ui.modules.message.preview package io.github.wulkanowy.ui.modules.message.preview
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.os.Build
import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.Status
import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Message
import io.github.wulkanowy.data.db.entities.MessageAttachment import io.github.wulkanowy.data.db.entities.MessageAttachment
@ -11,7 +10,6 @@ import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AnalyticsHelper
import io.github.wulkanowy.utils.AppInfo
import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.afterLoading
import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResource
import io.github.wulkanowy.utils.flowWithResourceIn import io.github.wulkanowy.utils.flowWithResourceIn
@ -24,8 +22,7 @@ class MessagePreviewPresenter @Inject constructor(
errorHandler: ErrorHandler, errorHandler: ErrorHandler,
studentRepository: StudentRepository, studentRepository: StudentRepository,
private val messageRepository: MessageRepository, private val messageRepository: MessageRepository,
private val analytics: AnalyticsHelper, private val analytics: AnalyticsHelper
private var appInfo: AppInfo
) : BasePresenter<MessagePreviewView>(errorHandler, studentRepository) { ) : BasePresenter<MessagePreviewView>(errorHandler, studentRepository) {
var message: Message? = null var message: Message? = null
@ -112,10 +109,11 @@ class MessagePreviewPresenter @Inject constructor(
fun onShare(): Boolean { fun onShare(): Boolean {
message?.let { message?.let {
var text = "Temat: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}\n" + when (it.sender.isNotEmpty()) { var text =
true -> "Od: ${it.sender}\n" "Temat: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}\n" + when (it.sender.isNotEmpty()) {
false -> "Do: ${it.recipient}\n" true -> "Od: ${it.sender}\n"
} + "Data: ${it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")}\n\n${it.content}" false -> "Do: ${it.recipient}\n"
} + "Data: ${it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")}\n\n${it.content}"
attachments?.let { attachments -> attachments?.let { attachments ->
if (attachments.isNotEmpty()) { if (attachments.isNotEmpty()) {
@ -127,7 +125,10 @@ class MessagePreviewPresenter @Inject constructor(
} }
} }
view?.shareText(text, "FW: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}") view?.shareText(
text,
"FW: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}"
)
return true return true
} }
return false return false
@ -135,7 +136,6 @@ class MessagePreviewPresenter @Inject constructor(
@SuppressLint("NewApi") @SuppressLint("NewApi")
fun onPrint(): Boolean { fun onPrint(): Boolean {
if (appInfo.systemVersion < Build.VERSION_CODES.LOLLIPOP) return false
message?.let { message?.let {
val dateString = it.date.toFormattedString("yyyy-MM-dd HH:mm:ss") val dateString = it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")
val infoContent = "<div><h4>Data wysłania</h4>$dateString</div>" + when { val infoContent = "<div><h4>Data wysłania</h4>$dateString</div>" + when {
@ -154,7 +154,9 @@ class MessagePreviewPresenter @Inject constructor(
view?.apply { view?.apply {
val html = printHTML val html = printHTML
.replace("%SUBJECT%", it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }) .replace(
"%SUBJECT%",
it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() })
.replace("%CONTENT%", messageContent) .replace("%CONTENT%", messageContent)
.replace("%INFO%", infoContent) .replace("%INFO%", infoContent)
printDocument(html, jobName) printDocument(html, jobName)

View File

@ -1,7 +1,5 @@
package io.github.wulkanowy.ui.modules.message.preview package io.github.wulkanowy.ui.modules.message.preview
import android.os.Build
import androidx.annotation.RequiresApi
import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.db.entities.Message
import io.github.wulkanowy.data.db.entities.MessageWithAttachment import io.github.wulkanowy.data.db.entities.MessageWithAttachment
import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.base.BaseView
@ -42,8 +40,7 @@ interface MessagePreviewView : BaseView {
fun shareText(text: String, subject: String) fun shareText(text: String, subject: String)
@RequiresApi(Build.VERSION_CODES.LOLLIPOP)
fun printDocument(html: String, jobName: String)
fun popView() fun popView()
fun printDocument(html: String, jobName: String)
} }

View File

@ -127,10 +127,13 @@ class MessageTabPresenter @Inject constructor(
onlyUnread, onlyUnread,
onlyWithAttachments onlyWithAttachments
) )
val newItems = listOf(MessageTabDataItem.Header) + filteredData.map { val messageItems = filteredData.map { message ->
MessageTabDataItem.MessageItem(it) MessageTabDataItem.MessageItem(message)
} }
updateData(newItems, folder.id == MessageFolder.SENT.id) val messageItemsWithHeader =
listOf(MessageTabDataItem.Header) + messageItems
updateData(messageItemsWithHeader, folder.id == MessageFolder.SENT.id)
notifyParentDataLoaded() notifyParentDataLoaded()
} }
} }

View File

@ -77,9 +77,7 @@ class SchoolAndTeachersFragment :
).attach() ).attach()
} }
with(binding.schoolandteachersTabLayout) { binding.schoolandteachersTabLayout.elevation = requireContext().dpToPx(4f)
setElevationCompat(context.dpToPx(4f))
}
} }
override fun showContent(show: Boolean) { override fun showContent(show: Boolean) {

View File

@ -1,6 +1,5 @@
package io.github.wulkanowy.ui.modules.settings.notifications package io.github.wulkanowy.ui.modules.settings.notifications
import android.annotation.SuppressLint
import android.content.Intent import android.content.Intent
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.Uri import android.net.Uri
@ -152,7 +151,6 @@ class NotificationsFragment : PreferenceFragmentCompat(),
.show() .show()
} }
@SuppressLint("InlinedApi")
override fun openSystemSettings() { override fun openSystemSettings() {
val intent = if (appInfo.systemVersion >= Build.VERSION_CODES.O) { val intent = if (appInfo.systemVersion >= Build.VERSION_CODES.O) {
Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {

View File

@ -1,29 +1,60 @@
package io.github.wulkanowy.ui.modules.splash package io.github.wulkanowy.ui.modules.splash
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import android.widget.Toast.LENGTH_LONG import android.widget.Toast.LENGTH_LONG
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.viewbinding.ViewBinding import androidx.viewbinding.ViewBinding
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.services.shortcuts.ShortcutsHelper
import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.base.BaseActivity
import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.login.LoginActivity
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.utils.AppInfo
import io.github.wulkanowy.utils.openInternetBrowser import io.github.wulkanowy.utils.openInternetBrowser
import javax.inject.Inject import javax.inject.Inject
@SuppressLint("CustomSplashScreen")
@AndroidEntryPoint @AndroidEntryPoint
class SplashActivity : BaseActivity<SplashPresenter, ViewBinding>(), SplashView { class SplashActivity : BaseActivity<SplashPresenter, ViewBinding>(), SplashView {
@Inject @Inject
lateinit var appInfo: AppInfo override lateinit var presenter: SplashPresenter
@Inject @Inject
override lateinit var presenter: SplashPresenter lateinit var shortcutsHelper: ShortcutsHelper
companion object {
private const val EXTRA_START_DESTINATION = "start_destination"
private const val EXTRA_EXTERNAL_URL = "external_url"
fun getStartIntent(
context: Context,
destination: Destination? = null,
startNewTask: Boolean = false
) = Intent(context, SplashActivity::class.java).apply {
putExtra(EXTRA_START_DESTINATION, destination)
if (startNewTask) {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
}
}
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
presenter.onAttachView(this, intent?.getStringExtra("external_url")) installSplashScreen().setKeepVisibleCondition { true }
val externalLink = intent?.getStringExtra(EXTRA_EXTERNAL_URL)
val startDestination = intent?.getSerializableExtra(EXTRA_START_DESTINATION) as Destination?
?: shortcutsHelper.getDestination(intent)
presenter.onAttachView(this, externalLink, startDestination)
} }
override fun openLoginView() { override fun openLoginView() {
@ -31,8 +62,8 @@ class SplashActivity : BaseActivity<SplashPresenter, ViewBinding>(), SplashView
finish() finish()
} }
override fun openMainView() { override fun openMainView(destination: Destination?) {
startActivity(MainActivity.getStartIntent(this)) startActivity(MainActivity.getStartIntent(this, destination))
finish() finish()
} }

View File

@ -1,12 +1,10 @@
package io.github.wulkanowy.ui.modules.splash package io.github.wulkanowy.ui.modules.splash
import io.github.wulkanowy.data.Status
import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.ui.modules.Destination
import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class SplashPresenter @Inject constructor( class SplashPresenter @Inject constructor(
@ -14,7 +12,7 @@ class SplashPresenter @Inject constructor(
studentRepository: StudentRepository, studentRepository: StudentRepository,
) : BasePresenter<SplashView>(errorHandler, studentRepository) { ) : BasePresenter<SplashView>(errorHandler, studentRepository) {
fun onAttachView(view: SplashView, externalUrl: String?) { fun onAttachView(view: SplashView, externalUrl: String?, startDestination: Destination?) {
super.onAttachView(view) super.onAttachView(view)
if (!externalUrl.isNullOrBlank()) { if (!externalUrl.isNullOrBlank()) {
@ -22,15 +20,16 @@ class SplashPresenter @Inject constructor(
return return
} }
flowWithResource { studentRepository.isCurrentStudentSet() }.onEach { presenterScope.launch {
when (it.status) { runCatching { studentRepository.isCurrentStudentSet() }
Status.LOADING -> Timber.d("Is current user set check started") .onFailure(errorHandler::dispatch)
Status.SUCCESS -> { .onSuccess {
if (it.data!!) view.openMainView() if (it) {
else view.openLoginView() view.openMainView(startDestination)
} else {
view.openLoginView()
}
} }
Status.ERROR -> errorHandler.dispatch(it.error!!) }
}
}.launch()
} }
} }

View File

@ -1,12 +1,13 @@
package io.github.wulkanowy.ui.modules.splash package io.github.wulkanowy.ui.modules.splash
import io.github.wulkanowy.ui.base.BaseView import io.github.wulkanowy.ui.base.BaseView
import io.github.wulkanowy.ui.modules.Destination
interface SplashView : BaseView { interface SplashView : BaseView {
fun openLoginView() fun openLoginView()
fun openMainView() fun openMainView(destination: Destination?)
fun openExternalUrlAndFinish(url: String) fun openExternalUrlAndFinish(url: String)
} }

View File

@ -97,7 +97,7 @@ class TimetableFragment : BaseFragment<FragmentTimetableBinding>(R.layout.fragme
timetableNavDate.setOnClickListener { presenter.onPickDate() } timetableNavDate.setOnClickListener { presenter.onPickDate() }
timetableNextButton.setOnClickListener { presenter.onNextDay() } timetableNextButton.setOnClickListener { presenter.onNextDay() }
timetableNavContainer.setElevationCompat(requireContext().dpToPx(8f)) timetableNavContainer.elevation = requireContext().dpToPx(8f)
} }
} }

View File

@ -72,7 +72,7 @@ class AdditionalLessonsFragment :
additionalLessonsNavDate.setOnClickListener { presenter.onPickDate() } additionalLessonsNavDate.setOnClickListener { presenter.onPickDate() }
additionalLessonsNextButton.setOnClickListener { presenter.onNextDay() } additionalLessonsNextButton.setOnClickListener { presenter.onNextDay() }
additionalLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) additionalLessonsNavContainer.elevation = requireContext().dpToPx(8f)
} }
} }

View File

@ -79,7 +79,7 @@ class CompletedLessonsFragment :
completedLessonsNavDate.setOnClickListener { presenter.onPickDate() } completedLessonsNavDate.setOnClickListener { presenter.onPickDate() }
completedLessonsNextButton.setOnClickListener { presenter.onNextDay() } completedLessonsNextButton.setOnClickListener { presenter.onNextDay() }
completedLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) completedLessonsNavContainer.elevation = requireContext().dpToPx(8f)
} }
} }

View File

@ -2,7 +2,6 @@ package io.github.wulkanowy.ui.modules.timetablewidget
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.PendingIntent import android.app.PendingIntent
import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED
import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE
@ -25,8 +24,9 @@ import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.services.HiltBroadcastReceiver import io.github.wulkanowy.services.HiltBroadcastReceiver
import io.github.wulkanowy.services.widgets.TimetableWidgetService import io.github.wulkanowy.services.widgets.TimetableWidgetService
import io.github.wulkanowy.ui.modules.Destination import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.main.MainActivity import io.github.wulkanowy.ui.modules.splash.SplashActivity
import io.github.wulkanowy.utils.AnalyticsHelper import io.github.wulkanowy.utils.AnalyticsHelper
import io.github.wulkanowy.utils.PendingIntentCompat
import io.github.wulkanowy.utils.capitalise import io.github.wulkanowy.utils.capitalise
import io.github.wulkanowy.utils.createNameInitialsDrawable import io.github.wulkanowy.utils.createNameInitialsDrawable
import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.getCompatColor
@ -167,18 +167,20 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() {
action = appWidgetId.toString() action = appWidgetId.toString()
} }
val accountIntent = PendingIntent.getActivity( val accountIntent = PendingIntent.getActivity(
context, -Int.MAX_VALUE + appWidgetId, context,
-Int.MAX_VALUE + appWidgetId,
Intent(context, TimetableWidgetConfigureActivity::class.java).apply { Intent(context, TimetableWidgetConfigureActivity::class.java).apply {
addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK) addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK)
putExtra(EXTRA_APPWIDGET_ID, appWidgetId) putExtra(EXTRA_APPWIDGET_ID, appWidgetId)
putExtra(EXTRA_FROM_PROVIDER, true) putExtra(EXTRA_FROM_PROVIDER, true)
}, FLAG_UPDATE_CURRENT }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
) )
val appIntent = PendingIntent.getActivity( val appIntent = PendingIntent.getActivity(
context, context,
TIMETABLE_PENDING_INTENT_ID, TIMETABLE_PENDING_INTENT_ID,
MainActivity.getStartIntent(context, Destination.Timetable(), true), SplashActivity.getStartIntent(context, Destination.Timetable(), true),
FLAG_UPDATE_CURRENT PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
) )
val remoteView = RemoteViews(context.packageName, layoutId).apply { val remoteView = RemoteViews(context.packageName, layoutId).apply {
@ -222,16 +224,16 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() {
code: Int, code: Int,
appWidgetId: Int, appWidgetId: Int,
buttonType: String buttonType: String
): PendingIntent { ) = PendingIntent.getBroadcast(
return PendingIntent.getBroadcast( context,
context, code, code,
Intent(context, TimetableWidgetProvider::class.java).apply { Intent(context, TimetableWidgetProvider::class.java).apply {
action = ACTION_APPWIDGET_UPDATE action = ACTION_APPWIDGET_UPDATE
putExtra(EXTRA_BUTTON_TYPE, buttonType) putExtra(EXTRA_BUTTON_TYPE, buttonType)
putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId) putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId)
}, FLAG_UPDATE_CURRENT },
) PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
} )
private suspend fun getStudent(studentId: Long, appWidgetId: Int) = try { private suspend fun getStudent(studentId: Long, appWidgetId: Int) = try {
val students = studentRepository.getSavedStudents(false) val students = studentRepository.getSavedStudents(false)

View File

@ -3,17 +3,15 @@ package io.github.wulkanowy.ui.widgets
import android.content.Context import android.content.Context
import android.util.AttributeSet import android.util.AttributeSet
import android.view.ViewGroup import android.view.ViewGroup
import com.google.android.material.tabs.TabLayout
/** /**
* @see <a href="https://stackoverflow.com/a/50382854">Tabs don't fit to screen with tabmode=scrollable, Even with a Custom Tab Layout</a> * @see <a href="https://stackoverflow.com/a/50382854">Tabs don't fit to screen with tabmode=scrollable, Even with a Custom Tab Layout</a>
*/ */
class FittedScrollableTabLayout : MaterialTabLayout { class FittedScrollableTabLayout @JvmOverloads constructor(
context: Context,
constructor(context: Context) : super(context) attrs: AttributeSet? = null
) : TabLayout(context, attrs) {
constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec) setMeasuredDimension(widthMeasureSpec, heightMeasureSpec)

View File

@ -1,24 +1,19 @@
package io.github.wulkanowy.ui.widgets package io.github.wulkanowy.ui.widgets
import android.content.Context import android.content.Context
import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION_CODES.LOLLIPOP
import android.util.AttributeSet import android.util.AttributeSet
import android.widget.LinearLayout import android.widget.LinearLayout
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import com.google.android.material.elevation.ElevationOverlayProvider
import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.MaterialShapeDrawable
class MaterialLinearLayout : LinearLayout { class MaterialLinearLayout @JvmOverloads constructor(
context: Context,
constructor(context: Context) : super(context) attrs: AttributeSet? = null
) : LinearLayout(context, attrs) {
constructor(context: Context, attr: AttributeSet) : super(context, attr)
constructor(context: Context, attr: AttributeSet, defStyleAttr: Int) : super(context, attr, defStyleAttr)
init { init {
val drawable = MaterialShapeDrawable.createWithElevationOverlay(context, ViewCompat.getElevation(this)) val drawable =
MaterialShapeDrawable.createWithElevationOverlay(context, ViewCompat.getElevation(this))
ViewCompat.setBackground(this, drawable) ViewCompat.setBackground(this, drawable)
} }
@ -28,12 +23,4 @@ class MaterialLinearLayout : LinearLayout {
(background as MaterialShapeDrawable).elevation = elevation (background as MaterialShapeDrawable).elevation = elevation
} }
} }
fun setElevationCompat(elevation: Float) {
if (SDK_INT >= LOLLIPOP) {
setElevation(elevation)
} else {
setBackgroundColor(ElevationOverlayProvider(context).compositeOverlayWithThemeSurfaceColorIfNeeded(elevation))
}
}
} }

View File

@ -1,25 +0,0 @@
package io.github.wulkanowy.ui.widgets
import android.content.Context
import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION_CODES.LOLLIPOP
import android.util.AttributeSet
import com.google.android.material.elevation.ElevationOverlayProvider
import com.google.android.material.tabs.TabLayout
open class MaterialTabLayout : TabLayout {
constructor(context: Context) : super(context)
constructor(context: Context, attr: AttributeSet) : super(context, attr)
constructor(context: Context, attr: AttributeSet, defStyleAttr: Int) : super(context, attr, defStyleAttr)
fun setElevationCompat(elevation: Float) {
if (SDK_INT >= LOLLIPOP) {
setElevation(elevation)
} else {
setBackgroundColor(ElevationOverlayProvider(context).compositeOverlayWithThemeSurfaceColorIfNeeded(elevation))
}
}
}

View File

@ -0,0 +1,11 @@
package io.github.wulkanowy.utils
import android.app.PendingIntent
import android.os.Build
object PendingIntentCompat {
val FLAG_IMMUTABLE = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.FLAG_IMMUTABLE
} else 0
}

View File

@ -4,6 +4,4 @@ inline fun String?.ifNullOrBlank(defaultValue: () -> String) =
if (isNullOrBlank()) defaultValue() else this if (isNullOrBlank()) defaultValue() else this
fun String.capitalise() = fun String.capitalise() =
replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() }
fun String.decapitalise() = replaceFirstChar { it.lowercase() }

View File

@ -2,10 +2,8 @@
package io.github.wulkanowy.utils.security package io.github.wulkanowy.utils.security
import android.annotation.TargetApi
import android.content.Context import android.content.Context
import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION_CODES.JELLY_BEAN_MR2
import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.M
import android.security.KeyPairGeneratorSpec import android.security.KeyPairGeneratorSpec
import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyGenParameterSpec
@ -116,7 +114,6 @@ fun decrypt(cipherText: String): String {
} }
} }
@TargetApi(JELLY_BEAN_MR2)
private fun generateKeyPair(context: Context) { private fun generateKeyPair(context: Context) {
(if (SDK_INT >= M) { (if (SDK_INT >= M) {
KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_DECRYPT or PURPOSE_ENCRYPT) KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_DECRYPT or PURPOSE_ENCRYPT)

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:gravity="fill">
<color android:color="?attr/windowSplashScreenBackground" />
</item>
<item
android:width="@dimen/splashscreen_icon_size_no_background"
android:height="@dimen/splashscreen_icon_size_no_background"
android:drawable="?windowSplashScreenAnimatedIcon"
android:gravity="center" />
<!-- We mask the outer bounds of the icon like we do on Android 12 -->
<item
android:width="@dimen/splashscreen_icon_mask_size_no_background"
android:height="@dimen/splashscreen_icon_mask_size_no_background"
android:gravity="center">
<shape android:shape="oval">
<stroke
android:width="@dimen/splashscreen_icon_mask_stroke_no_background"
android:color="?windowSplashScreenBackground" />
<solid android:color="@android:color/transparent" />
</shape>
</item>
</layer-list>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1,12 +0,0 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="@color/colorPrimaryDark" />
</shape>
</item>
<item
android:width="200dp"
android:height="200dp"
android:drawable="@drawable/img_splash_logo"
android:gravity="center" />
</layer-list>

View File

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="1926"
android:viewportHeight="1926">
<path
android:fillColor="#fff"
android:pathData="M1082,1260v4l-6,73c0,5 -5,9 -10,9H879c-4,0 -8,-2 -10,-5l-31,-58 -29,-71v-8l48,-94c2,-3 2,-5 1, -8l-24,-65c-1,-2 0,-5 1,-7l39,-84c4,-8 17,-8 20,1l12,38 38,101c1,2 3,5 6,6l80,27c3,1 6,3 7,6l45,135zM852,717c0,-23 15,-43 35,-52l-2,-8c0,-11 13,-20 29,-20h1a38,38 0,0 1,36 -18l3,-2c11,-16 37,-27 68,-27 12,0 23,2 32,4 3,-3 8,-6 14,-6s12,3 14,8c8,-9 22,-16 38,-16 25,0 45,16 45,36l-1,7 3,4c16,6 27,17 27,30 0,14 -15,27 -34,32 -2,0 -3,1 -3,3 0,11 -11,21 -26,22v1c0,22 -41,40 -92,40 -11,0 -21,-1 -31,-3v1c0,9 -12,16 -26,16h-2l2,7c0,14 -18,25 -40,25h-7l-4, 2c-2,7 -8,12 -15,12 -9,0 -16,-7 -16,-16 0,-5 1,-8 4,-11l1,-4c-2,-3 -2,-5 -2,-8 0,-2 -2,-3 -3,-3 -27,-6 -48,-29 -48,-56z" />
<path
android:fillColor="#fff"
android:pathData="M1336,1346h-125c-3,0 -6,-1 -8,-4l-84,-118 -1,-2 -42,-122 -5,-5 -102,-52 -5,-6 -15,-75 -2,-3 -34,-51c-2,-3 -2,-6 -1,-9l21,-45c2,-4 5,-6 9,-6l39,-2c3,0 5,-1 6,-3l29,-22c5,-4 14,-2 17,4l98,201 1,2 13,81 2,5 197,216c6,6 1,16 -8,16zM801,1302c1,3 1,6 -1,8l-19,31c-2,3 -5,5 -9,5H591c-8,0 -13,-8 -9,-15l116,-171 2,-3 53, -228c1,-3 3,-5 5,-6l72,-40c3,-1 5,-4 5,-7l10,-42c2,-9 15,-11 20,-3l3,6c2,2 2,5 1,8l-66,190v5l16,91v5l-40,88v6l22,72z" />
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,12 +0,0 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="@color/colorPrimaryDark" />
</shape>
</item>
<item>
<bitmap
android:gravity="left|right|top|bottom"
android:src="@drawable/img_splash_logo" />
</item>
</layer-list>

View File

@ -142,8 +142,8 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitStart" android:scaleType="fitStart"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_left"
app:srcCompat="@drawable/ic_chevron_left" /> app:tint="?colorPrimary" />
<TextView <TextView
android:id="@+id/attendanceNavDate" android:id="@+id/attendanceNavDate"
@ -167,7 +167,7 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitEnd" android:scaleType="fitEnd"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_right"
app:srcCompat="@drawable/ic_chevron_right" /> app:tint="?colorPrimary" />
</io.github.wulkanowy.ui.widgets.MaterialLinearLayout> </io.github.wulkanowy.ui.widgets.MaterialLinearLayout>
</FrameLayout> </FrameLayout>

View File

@ -128,8 +128,8 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitStart" android:scaleType="fitStart"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_left"
app:srcCompat="@drawable/ic_chevron_left" /> app:tint="?colorPrimary" />
<TextView <TextView
android:id="@+id/examNavDate" android:id="@+id/examNavDate"
@ -152,7 +152,7 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitEnd" android:scaleType="fitEnd"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_right"
app:srcCompat="@drawable/ic_chevron_right" /> app:tint="?colorPrimary" />
</io.github.wulkanowy.ui.widgets.MaterialLinearLayout> </io.github.wulkanowy.ui.widgets.MaterialLinearLayout>
</FrameLayout> </FrameLayout>

View File

@ -118,8 +118,8 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitStart" android:scaleType="fitStart"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_left"
app:srcCompat="@drawable/ic_chevron_left" /> app:tint="?colorPrimary" />
<TextView <TextView
android:id="@+id/luckyNumberHistoryNavDate" android:id="@+id/luckyNumberHistoryNavDate"
@ -143,7 +143,7 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitEnd" android:scaleType="fitEnd"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_right"
app:srcCompat="@drawable/ic_chevron_right" /> app:tint="?colorPrimary" />
</io.github.wulkanowy.ui.widgets.MaterialLinearLayout> </io.github.wulkanowy.ui.widgets.MaterialLinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -5,7 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<io.github.wulkanowy.ui.widgets.MaterialTabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/messageTabLayout" android:id="@+id/messageTabLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"

View File

@ -95,12 +95,12 @@
app:srcCompat="@drawable/ic_school_directions" app:srcCompat="@drawable/ic_school_directions"
android:contentDescription="@string/school_address_button" android:contentDescription="@string/school_address_button"
android:background="?attr/selectableItemBackgroundBorderless" android:background="?attr/selectableItemBackgroundBorderless"
android:tint="?colorPrimary"
android:padding="4dp" android:padding="4dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:layout_gravity="center_vertical" /> android:layout_gravity="center_vertical"
app:tint="?colorPrimary" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout
@ -142,12 +142,12 @@
app:srcCompat="@drawable/ic_all_phone" app:srcCompat="@drawable/ic_all_phone"
android:contentDescription="@string/school_telephone_button" android:contentDescription="@string/school_telephone_button"
android:background="?attr/selectableItemBackgroundBorderless" android:background="?attr/selectableItemBackgroundBorderless"
android:tint="?colorPrimary"
android:padding="4dp" android:padding="4dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:layout_marginLeft="8dp" android:layout_marginLeft="8dp"
android:layout_gravity="center_vertical" /> android:layout_gravity="center_vertical"
app:tint="?colorPrimary" />
</LinearLayout> </LinearLayout>
<LinearLayout <LinearLayout

View File

@ -5,7 +5,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<io.github.wulkanowy.ui.widgets.MaterialTabLayout <com.google.android.material.tabs.TabLayout
android:id="@+id/schoolandteachersTabLayout" android:id="@+id/schoolandteachersTabLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" android:layout_height="48dp"

View File

@ -142,8 +142,8 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitStart" android:scaleType="fitStart"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_left"
app:srcCompat="@drawable/ic_chevron_left" /> app:tint="?colorPrimary" />
<TextView <TextView
android:id="@+id/timetableNavDate" android:id="@+id/timetableNavDate"
@ -167,7 +167,7 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitEnd" android:scaleType="fitEnd"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_right"
app:srcCompat="@drawable/ic_chevron_right" /> app:tint="?colorPrimary" />
</io.github.wulkanowy.ui.widgets.MaterialLinearLayout> </io.github.wulkanowy.ui.widgets.MaterialLinearLayout>
</FrameLayout> </FrameLayout>

View File

@ -131,8 +131,8 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitStart" android:scaleType="fitStart"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_left"
app:srcCompat="@drawable/ic_chevron_left" /> app:tint="?colorPrimary" />
<TextView <TextView
android:id="@+id/additionalLessonsNavDate" android:id="@+id/additionalLessonsNavDate"
@ -156,7 +156,7 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitEnd" android:scaleType="fitEnd"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_right"
app:srcCompat="@drawable/ic_chevron_right" /> app:tint="?colorPrimary" />
</io.github.wulkanowy.ui.widgets.MaterialLinearLayout> </io.github.wulkanowy.ui.widgets.MaterialLinearLayout>
</FrameLayout> </FrameLayout>

View File

@ -130,8 +130,8 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitStart" android:scaleType="fitStart"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_left"
app:srcCompat="@drawable/ic_chevron_left" /> app:tint="?colorPrimary" />
<TextView <TextView
android:id="@+id/completedLessonsNavDate" android:id="@+id/completedLessonsNavDate"
@ -155,7 +155,7 @@
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingBottom="8dp" android:paddingBottom="8dp"
android:scaleType="fitEnd" android:scaleType="fitEnd"
android:tint="?colorPrimary" app:srcCompat="@drawable/ic_chevron_right"
app:srcCompat="@drawable/ic_chevron_right" /> app:tint="?colorPrimary" />
</io.github.wulkanowy.ui.widgets.MaterialLinearLayout> </io.github.wulkanowy.ui.widgets.MaterialLinearLayout>
</FrameLayout> </FrameLayout>

View File

@ -2,7 +2,8 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
xmlns:tools="http://schemas.android.com/tools">
<TextView <TextView
android:id="@+id/dashboard_homework_subitem_title" android:id="@+id/dashboard_homework_subitem_title"
@ -12,7 +13,7 @@
android:layout_marginEnd="24dp" android:layout_marginEnd="24dp"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:text="Spotaknie z rodzicami/opiekunami" tools:text="Spotaknie z rodzicami/opiekunami"
android:textSize="13sp" android:textSize="13sp"
app:layout_constraintEnd_toStartOf="@id/dashboard_homework_subitem_time" app:layout_constraintEnd_toStartOf="@id/dashboard_homework_subitem_time"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@ -24,7 +25,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="6dp" android:layout_marginTop="6dp"
android:layout_marginEnd="12dp" android:layout_marginEnd="12dp"
android:text="17:00 02.11.2020" tools:text="17:00 02.11.2020"
android:textSize="13sp" android:textSize="13sp"
android:textColor="?android:textColorSecondary" android:textColor="?android:textColorSecondary"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@ -1,14 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="WulkanowyTheme" parent="BaseWulkanowyTheme"> <style name="WulkanowyTheme" parent="BaseWulkanowyTheme">
<item name="android:windowLightStatusBar">true</item> <item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">@android:color/white</item> <item name="android:statusBarColor">@android:color/white</item>
</style> </style>
<style name="WulkanowyTheme.SplashScreen" parent="WulkanowyTheme.NoActionBar">
<item name="android:windowBackground">@drawable/layer_splash_background</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">false</item>
</style>
</resources> </resources>

View File

@ -5,11 +5,4 @@
<item name="android:windowLightStatusBar">false</item> <item name="android:windowLightStatusBar">false</item>
<item name="android:statusBarColor">@android:color/darker_gray</item> <item name="android:statusBarColor">@android:color/darker_gray</item>
</style> </style>
<style name="WulkanowyTheme.SplashScreen" parent="WulkanowyTheme.NoActionBar">
<item name="android:windowBackground">@drawable/layer_splash_background</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightStatusBar">false</item>
</style>
</resources> </resources>

View File

@ -6,12 +6,4 @@
<item name="android:windowLightStatusBar">true</item> <item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">@android:color/white</item> <item name="android:statusBarColor">@android:color/white</item>
</style> </style>
<style name="WulkanowyTheme.SplashScreen" parent="WulkanowyTheme.NoActionBar">
<item name="android:windowBackground">@drawable/layer_splash_background</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightNavigationBar">false</item>
<item name="android:windowLightStatusBar">false</item>
</style>
</resources> </resources>

View File

@ -6,12 +6,4 @@
<item name="android:windowLightStatusBar">true</item> <item name="android:windowLightStatusBar">true</item>
<item name="android:statusBarColor">@android:color/white</item> <item name="android:statusBarColor">@android:color/white</item>
</style> </style>
<style name="WulkanowyTheme.SplashScreen" parent="WulkanowyTheme.NoActionBar">
<item name="android:windowBackground">@drawable/layer_splash_background</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:navigationBarColor">@color/colorPrimaryDark</item>
<item name="android:windowLightNavigationBar">false</item>
<item name="android:windowLightStatusBar">false</item>
</style>
</resources> </resources>

View File

@ -23,10 +23,11 @@
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
</style> </style>
<style name="WulkanowyTheme.SplashScreen" parent="WulkanowyTheme.NoActionBar"> <style name="WulkanowyTheme.SplashScreen" parent="Theme.SplashScreen">
<item name="android:windowBackground">@drawable/layer_splash_background</item> <item name="windowSplashScreenBackground">@color/colorPrimaryDark</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item> <item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash_logo</item>
<item name="android:navigationBarColor">@color/colorPrimaryDark</item> <item name="postSplashScreenTheme">@style/WulkanowyTheme.NoActionBar</item>
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
</style> </style>
<style name="WulkanowyTheme.WidgetAccountSwitcher" parent="Theme.MaterialComponents.Light.Dialog"> <style name="WulkanowyTheme.WidgetAccountSwitcher" parent="Theme.MaterialComponents.Light.Dialog">
@ -38,7 +39,6 @@
</style> </style>
<style name="Widget.Wulkanowy.Chip.Choice" parent="Widget.MaterialComponents.Chip.Choice"> <style name="Widget.Wulkanowy.Chip.Choice" parent="Widget.MaterialComponents.Chip.Choice">
...
<item name="materialThemeOverlay">@style/ThemeOverlay.Wulkanowy.Chip.Choice</item> <item name="materialThemeOverlay">@style/ThemeOverlay.Wulkanowy.Chip.Choice</item>
</style> </style>
@ -50,8 +50,6 @@
<item name="android:textSize">11sp</item> <item name="android:textSize">11sp</item>
</style> </style>
<style name="mdtp_ActionButton.Text" parent="Widget.MaterialComponents.Button.TextButton.Dialog" />
<style name="WulkanowyTheme.Login" parent="WulkanowyTheme.NoActionBar" /> <style name="WulkanowyTheme.Login" parent="WulkanowyTheme.NoActionBar" />
<style name="WulkanowyTheme.MessageSend" parent="WulkanowyTheme.NoActionBar" /> <style name="WulkanowyTheme.MessageSend" parent="WulkanowyTheme.NoActionBar" />

View File

@ -4,12 +4,6 @@ import android.util.Log
import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.FirebaseCrashlytics
import fr.bipi.tressence.base.FormatterPriorityTree import fr.bipi.tressence.base.FormatterPriorityTree
import fr.bipi.tressence.common.StackTraceRecorder import fr.bipi.tressence.common.StackTraceRecorder
import fr.bipi.tressence.common.filters.Filter
import io.github.wulkanowy.sdk.exception.FeatureNotAvailableException
import io.github.wulkanowy.sdk.scrapper.exception.FeatureDisabledException
import java.io.InterruptedIOException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) { class CrashLogTree : FormatterPriorityTree(Log.VERBOSE) {

View File

@ -37,7 +37,7 @@ class SplashPresenterTest {
fun testOpenLoginView() { fun testOpenLoginView() {
coEvery { studentRepository.isCurrentStudentSet() } returns false coEvery { studentRepository.isCurrentStudentSet() } returns false
presenter.onAttachView(splashView, null) presenter.onAttachView(splashView, null, null)
verify { splashView.openLoginView() } verify { splashView.openLoginView() }
} }
@ -45,7 +45,7 @@ class SplashPresenterTest {
fun testMainMainView() { fun testMainMainView() {
coEvery { studentRepository.isCurrentStudentSet() } returns true coEvery { studentRepository.isCurrentStudentSet() } returns true
presenter.onAttachView(splashView, null) presenter.onAttachView(splashView, null, null)
verify { splashView.openMainView() } verify { splashView.openMainView(null) }
} }
} }