From 007d62e61d79c89ab5d6f22563280f354086e32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Borcz?= Date: Thu, 11 Nov 2021 15:23:20 +0100 Subject: [PATCH] Update project to Android SDK 31 (#1570) --- app/build.gradle | 11 ++--- app/src/main/AndroidManifest.xml | 1 - .../wulkanowy/data/db/SharedPrefProvider.kt | 9 ++-- .../alarm/TimetableNotificationReceiver.kt | 8 ++-- .../TimetableNotificationSchedulerHelper.kt | 12 +++-- .../services/shortcuts/ShortcutsHelper.kt | 10 ++-- .../notifications/AppNotificationManager.kt | 7 +-- .../ChangeTimetableNotification.kt | 6 +-- .../NewAttendanceNotification.kt | 6 +-- .../NewConferenceNotification.kt | 6 +-- .../sync/notifications/NewExamNotification.kt | 6 +-- .../notifications/NewGradeNotification.kt | 14 +++--- .../notifications/NewHomeworkNotification.kt | 6 +-- .../NewLuckyNumberNotification.kt | 4 +- .../notifications/NewMessageNotification.kt | 6 +-- .../sync/notifications/NewNoteNotification.kt | 6 +-- .../NewSchoolAnnouncementNotification.kt | 6 +-- .../github/wulkanowy/ui/base/BaseActivity.kt | 8 +--- .../github/wulkanowy/ui/base/BasePresenter.kt | 2 +- .../github/wulkanowy/ui/base/ThemeManager.kt | 11 +++-- .../wulkanowy/ui/modules/Destination.kt | 30 ++++++------ .../accountedit/AccountEditColorAdapter.kt | 32 +++---------- .../modules/attendance/AttendanceFragment.kt | 6 +-- .../summary/AttendanceSummaryFragment.kt | 2 +- .../wulkanowy/ui/modules/exam/ExamFragment.kt | 2 +- .../ui/modules/grade/GradeFragment.kt | 4 +- .../statistics/GradeStatisticsFragment.kt | 2 +- .../ui/modules/homework/HomeworkFragment.kt | 2 +- .../ui/modules/login/LoginActivity.kt | 4 +- .../LoginStudentSelectFragment.kt | 13 ++---- .../history/LuckyNumberHistoryFragment.kt | 2 +- .../LuckyNumberWidgetProvider.kt | 8 ++-- .../wulkanowy/ui/modules/main/MainActivity.kt | 12 ----- .../ui/modules/message/MessageFragment.kt | 5 +- .../message/preview/MessagePreviewFragment.kt | 10 +--- .../preview/MessagePreviewPresenter.kt | 24 +++++----- .../message/preview/MessagePreviewView.kt | 7 +-- .../message/tab/MessageTabPresenter.kt | 9 ++-- .../SchoolAndTeachersFragment.kt | 4 +- .../notifications/NotificationsFragment.kt | 2 - .../ui/modules/splash/SplashActivity.kt | 43 +++++++++++++++--- .../ui/modules/splash/SplashPresenter.kt | 27 ++++++----- .../wulkanowy/ui/modules/splash/SplashView.kt | 3 +- .../ui/modules/timetable/TimetableFragment.kt | 2 +- .../additional/AdditionalLessonsFragment.kt | 2 +- .../completed/CompletedLessonsFragment.kt | 2 +- .../TimetableWidgetProvider.kt | 34 +++++++------- .../ui/widgets/FittedScrollableTabLayout.kt | 12 ++--- .../ui/widgets/MaterialLinearLayout.kt | 25 +++------- .../wulkanowy/ui/widgets/MaterialTabLayout.kt | 25 ---------- .../wulkanowy/utils/PendingIntentCompat.kt | 11 +++++ .../github/wulkanowy/utils/StringExtension.kt | 4 +- .../wulkanowy/utils/security/Scrambler.kt | 3 -- ...ompat_splash_screen_no_icon_background.xml | 24 ++++++++++ .../main/res/drawable-v23/img_splash_logo.png | Bin 19474 -> 0 bytes .../drawable-v23/layer_splash_background.xml | 12 ----- app/src/main/res/drawable/ic_splash_logo.xml | 12 +++++ app/src/main/res/drawable/img_splash_logo.png | Bin 20340 -> 0 bytes .../res/drawable/layer_splash_background.xml | 12 ----- .../main/res/layout/fragment_attendance.xml | 8 ++-- app/src/main/res/layout/fragment_exam.xml | 8 ++-- .../layout/fragment_lucky_number_history.xml | 8 ++-- app/src/main/res/layout/fragment_message.xml | 2 +- app/src/main/res/layout/fragment_school.xml | 8 ++-- .../res/layout/fragment_schoolandteachers.xml | 2 +- .../main/res/layout/fragment_timetable.xml | 8 ++-- .../layout/fragment_timetable_additional.xml | 8 ++-- .../layout/fragment_timetable_completed.xml | 8 ++-- .../layout/subitem_dashboard_conferences.xml | 7 +-- app/src/main/res/values-v23/styles.xml | 8 +--- app/src/main/res/values-v26/styles.xml | 7 --- app/src/main/res/values-v28/styles.xml | 8 ---- app/src/main/res/values-v29/styles.xml | 8 ---- app/src/main/res/values/styles.xml | 12 ++--- .../wulkanowy/utils/CrashlyticsUtils.kt | 6 --- .../ui/modules/splash/SplashPresenterTest.kt | 6 +-- 76 files changed, 316 insertions(+), 384 deletions(-) delete mode 100644 app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt create mode 100644 app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt create mode 100644 app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml delete mode 100644 app/src/main/res/drawable-v23/img_splash_logo.png delete mode 100644 app/src/main/res/drawable-v23/layer_splash_background.xml create mode 100644 app/src/main/res/drawable/ic_splash_logo.xml delete mode 100644 app/src/main/res/drawable/img_splash_logo.png delete mode 100644 app/src/main/res/drawable/layer_splash_background.xml diff --git a/app/build.gradle b/app/build.gradle index 53814dae..bef984aa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,17 +15,16 @@ apply from: 'sonarqube.gradle' apply from: 'hooks.gradle' android { - compileSdkVersion 30 + compileSdkVersion 31 defaultConfig { applicationId "io.github.wulkanowy" testApplicationId "io.github.tests.wulkanowy" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 31 versionCode 97 versionName "1.3.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - vectorDrawables.useSupportLibrary = true resValue "string", "app_name", "Wulkanowy" @@ -166,7 +165,7 @@ huaweiPublish { } ext { - work_manager = "2.6.0" + work_manager = "2.7.0" android_hilt = "1.0.0" room = "2.3.0" chucker = "3.5.2" @@ -183,9 +182,9 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines" 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.appcompat:appcompat:1.3.1" - implementation "androidx.appcompat:appcompat-resources:1.3.1" + implementation "androidx.appcompat:appcompat:1.4.0-beta01" implementation "androidx.fragment:fragment-ktx:1.3.6" implementation "androidx.annotation:annotation:1.2.0" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e43a0ec0..5928c23a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,7 +42,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="false" android:theme="@style/WulkanowyTheme" - android:usesCleartextTraffic="true" tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"> , requestCode: Int) { if (now() in range) cancelNotification() + 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(), PendingIntent.getBroadcast(context, getRequestCode(time, studentId), intent.also { it.putExtra(LESSON_TYPE, notificationType) - }, FLAG_UPDATE_CURRENT) + }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE) ) Timber.d( "TimetableNotification scheduled: type: $notificationType, subject: ${ diff --git a/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt b/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt index d1c215f2..bb09434b 100644 --- a/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt +++ b/app/src/main/java/io/github/wulkanowy/services/shortcuts/ShortcutsHelper.kt @@ -8,7 +8,7 @@ import androidx.core.graphics.drawable.IconCompat import dagger.hilt.android.qualifiers.ApplicationContext import io.github.wulkanowy.R 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.Singleton @@ -35,7 +35,7 @@ class ShortcutsHelper @Inject constructor(@ApplicationContext private val contex .setShortLabel(context.getString(R.string.grade_title)) .setLongLabel(context.getString(R.string.grade_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_grade)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW 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)) .setLongLabel(context.getString(R.string.attendance_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_attendance)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW 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)) .setLongLabel(context.getString(R.string.exam_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_exam)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW 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)) .setLongLabel(context.getString(R.string.timetable_title)) .setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_timetable)) - .setIntent(MainActivity.getStartIntent(context, startNewTask = true) + .setIntent(SplashActivity.getStartIntent(context, startNewTask = true) .apply { action = Intent.ACTION_VIEW putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "timetable") diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt index 542b9346..2848fe30 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/AppNotificationManager.kt @@ -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.NotificationData import io.github.wulkanowy.data.repositories.NotificationRepository +import io.github.wulkanowy.utils.PendingIntentCompat import io.github.wulkanowy.utils.getCompatBitmap import io.github.wulkanowy.utils.getCompatColor import io.github.wulkanowy.utils.nickOrName @@ -45,7 +46,7 @@ class AppNotificationManager @Inject constructor( context, Random.nextInt(), notificationData.intentToStart, - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) ) .setContentTitle(notificationData.title) @@ -86,7 +87,7 @@ class AppNotificationManager @Inject constructor( context, Random.nextInt(), notificationData.intentToStart, - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) ) .setContentTitle(notificationData.title) @@ -134,7 +135,7 @@ class AppNotificationManager @Inject constructor( context, Random.nextInt(), groupNotificationData.intentToStart, - PendingIntent.FLAG_UPDATE_CURRENT + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) ) .setLocalOnly(true) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt index 6d2d3a59..f8860b7f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/ChangeTimetableNotification.kt @@ -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.NotificationData 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.toFormattedString import java.time.LocalDate @@ -32,7 +32,7 @@ class ChangeTimetableNotification @Inject constructor( 1 ), content = it, - intentToStart = MainActivity.getStartIntent( + intentToStart = SplashActivity.getStartIntent( context = context, destination = Destination.Timetable(date), startNewTask = true @@ -54,7 +54,7 @@ class ChangeTimetableNotification @Inject constructor( changedLessons.size, changedLessons.size ), - intentToStart = MainActivity.getStartIntent(context, Destination.Timetable(), true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Timetable(), true), type = NotificationType.CHANGE_TIMETABLE ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt index 69555272..3792725c 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewAttendanceNotification.kt @@ -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.NotificationData 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.getPlural import io.github.wulkanowy.utils.toFormattedString @@ -31,7 +31,7 @@ class NewAttendanceNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.attendance_notify_new_items_title, 1), 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 ), - intentToStart = MainActivity.getStartIntent(context, Destination.Attendance, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Attendance, true), type = NotificationType.NEW_ATTENDANCE ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt index 97b1332d..4ec359b0 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewConferenceNotification.kt @@ -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.NotificationData 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.toFormattedString import java.time.LocalDateTime @@ -31,7 +31,7 @@ class NewConferenceNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.conference_notify_new_item_title, 1), 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 ), - intentToStart = MainActivity.getStartIntent(context, Destination.Conference, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Conference, true), type = NotificationType.NEW_CONFERENCE ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt index 6f8ed896..feb7c320 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewExamNotification.kt @@ -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.NotificationData 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.toFormattedString import java.time.LocalDate @@ -31,7 +31,7 @@ class NewExamNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.exam_notify_new_item_title, 1), 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 ), - intentToStart = MainActivity.getStartIntent(context, Destination.Exam, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Exam, true), type = NotificationType.NEW_EXAM ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt index 09692fb7..425a57fc 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewGradeNotification.kt @@ -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.NotificationData 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 javax.inject.Inject @@ -23,7 +23,7 @@ class NewGradeNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.grade_new_items, 1), 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, title = context.getPlural(R.plurals.grade_new_items, 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 ) @@ -43,7 +43,7 @@ class NewGradeNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.grade_new_items_predicted, 1), 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 ), - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), type = NotificationType.NEW_GRADE_PREDICTED ) @@ -67,7 +67,7 @@ class NewGradeNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.grade_new_items_final, 1), 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 ), - intentToStart = MainActivity.getStartIntent(context, Destination.Grade, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Grade, true), type = NotificationType.NEW_GRADE_FINAL ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt index cdada844..fcaed10f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewHomeworkNotification.kt @@ -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.NotificationData 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.toFormattedString import java.time.LocalDate @@ -31,7 +31,7 @@ class NewHomeworkNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.homework_notify_new_item_title, 1), 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 ), - intentToStart = MainActivity.getStartIntent(context, Destination.Homework, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Homework, true), type = NotificationType.NEW_HOMEWORK, notificationDataList = notificationDataList ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt index d9f138b5..ab2c1ca7 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewLuckyNumberNotification.kt @@ -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.pojos.NotificationData 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 class NewLuckyNumberNotification @Inject constructor( @@ -22,7 +22,7 @@ class NewLuckyNumberNotification @Inject constructor( R.string.lucky_number_notify_new_item, item.luckyNumber.toString() ), - intentToStart = MainActivity.getStartIntent(context, Destination.LuckyNumber, true) + intentToStart = SplashActivity.getStartIntent(context, Destination.LuckyNumber, true) ) appNotificationManager.sendSingleNotification( diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt index cdb5ab9c..1a06cf6f 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewMessageNotification.kt @@ -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.NotificationData 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 javax.inject.Inject @@ -22,7 +22,7 @@ class NewMessageNotification @Inject constructor( NotificationData( title = context.getPlural(R.plurals.message_new_items, 1), 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, title = context.getPlural(R.plurals.message_new_items, 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 ) diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt index 16be1ca5..533d7f38 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewNoteNotification.kt @@ -9,7 +9,7 @@ import io.github.wulkanowy.data.pojos.GroupNotificationData import io.github.wulkanowy.data.pojos.NotificationData import io.github.wulkanowy.sdk.scrapper.notes.NoteCategory 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 javax.inject.Inject @@ -29,13 +29,13 @@ class NewNoteNotification @Inject constructor( NotificationData( title = context.getPlural(titleRes, 1), content = "${it.teacher}: ${it.category}", - intentToStart = MainActivity.getStartIntent(context, Destination.Note, true), + intentToStart = SplashActivity.getStartIntent(context, Destination.Note, true), ) } val groupNotificationData = GroupNotificationData( 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), content = context.getPlural(R.plurals.note_notify_new_items, items.size, items.size), type = NotificationType.NEW_NOTE diff --git a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt index 1f603624..1efe13ae 100644 --- a/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt +++ b/app/src/main/java/io/github/wulkanowy/services/sync/notifications/NewSchoolAnnouncementNotification.kt @@ -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.NotificationData 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 javax.inject.Inject @@ -20,7 +20,7 @@ class NewSchoolAnnouncementNotification @Inject constructor( suspend fun notify(items: List, student: Student) { val notificationDataList = items.map { NotificationData( - intentToStart = MainActivity.getStartIntent( + intentToStart = SplashActivity.getStartIntent( context = context, destination = Destination.SchoolAnnouncement, startNewTask = true @@ -34,7 +34,7 @@ class NewSchoolAnnouncementNotification @Inject constructor( } val groupNotificationData = GroupNotificationData( type = NotificationType.NEW_ANNOUNCEMENT, - intentToStart = MainActivity.getStartIntent( + intentToStart = SplashActivity.getStartIntent( context = context, destination = Destination.SchoolAnnouncement, startNewTask = true diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt index 0521b4a0..075557a5 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BaseActivity.kt @@ -1,14 +1,11 @@ package io.github.wulkanowy.ui.base 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.view.View import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AppCompatDelegate import androidx.viewbinding.ViewBinding import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar.LENGTH_LONG @@ -40,7 +37,6 @@ abstract class BaseActivity, VB : ViewBinding> : themeManager.applyActivityTheme(this) super.onCreate(savedInstanceState) supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true) - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) @Suppress("DEPRECATION") setTaskDescription( @@ -83,8 +79,8 @@ abstract class BaseActivity, VB : ViewBinding> : } override fun openClearLoginView() { - startActivity(LoginActivity.getStartIntent(this) - .apply { addFlags(FLAG_ACTIVITY_CLEAR_TASK or FLAG_ACTIVITY_NEW_TASK) }) + startActivity(LoginActivity.getStartIntent(this)) + finishAffinity() } override fun onDestroy() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt index 5cd5d010..40d54860 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/BasePresenter.kt @@ -20,7 +20,7 @@ open class BasePresenter( ) { private val job = SupervisorJob() - protected val presenterScope = CoroutineScope(job + Dispatchers.Main) + protected val presenterScope = CoroutineScope(job + Dispatchers.Main.immediate) private val childrenJobs = mutableMapOf() diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt index b560ed2e..e934a182 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt @@ -41,14 +41,15 @@ class ThemeManager @Inject constructor(private val preferencesRepository: Prefer ) } - private fun isThemeApplicable(activity: AppCompatActivity): Boolean { - return activity.packageManager + private fun isThemeApplicable(activity: AppCompatActivity) = + activity.packageManager .getPackageInfo(activity.packageName, GET_ACTIVITIES) - .activities.singleOrNull { it.name == activity::class.java.canonicalName } - ?.theme.let { + .activities + .singleOrNull { it.name == activity::class.java.canonicalName } + ?.theme + .let { 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_MessageSend || it == R.style.WulkanowyTheme_MessageSend_Black } - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt index 0406afa4..43d4b5f9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/Destination.kt @@ -19,6 +19,10 @@ import java.time.LocalDate 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 fragment: Fragment @@ -41,91 +45,91 @@ sealed interface Destination : Serializable { object Dashboard : Destination { - override val type = Type.DASHBOARD + override val type get() = Type.DASHBOARD override val fragment get() = DashboardFragment.newInstance() } object Grade : Destination { - override val type = Type.GRADE + override val type get() = Type.GRADE override val fragment get() = GradeFragment.newInstance() } object Attendance : Destination { - override val type = Type.ATTENDANCE + override val type get() = Type.ATTENDANCE override val fragment get() = AttendanceFragment.newInstance() } object Exam : Destination { - override val type = Type.EXAM + override val type get() = Type.EXAM override val fragment get() = ExamFragment.newInstance() } 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) } object Homework : Destination { - override val type = Type.HOMEWORK + override val type get() = Type.HOMEWORK override val fragment get() = HomeworkFragment.newInstance() } object Note : Destination { - override val type = Type.NOTE + override val type get() = Type.NOTE override val fragment get() = NoteFragment.newInstance() } object Conference : Destination { - override val type = Type.CONFERENCE + override val type get() = Type.CONFERENCE override val fragment get() = ConferenceFragment.newInstance() } object SchoolAnnouncement : Destination { - override val type = Type.SCHOOL_ANNOUNCEMENT + override val type get() = Type.SCHOOL_ANNOUNCEMENT override val fragment get() = SchoolAnnouncementFragment.newInstance() } object School : Destination { - override val type = Type.SCHOOL + override val type get() = Type.SCHOOL override val fragment get() = SchoolFragment.newInstance() } object LuckyNumber : Destination { - override val type = Type.LUCKY_NUMBER + override val type get() = Type.LUCKY_NUMBER override val fragment get() = LuckyNumberFragment.newInstance() } object More : Destination { - override val type = Type.MORE + override val type get() = Type.MORE override val fragment get() = MoreFragment.newInstance() } object Message : Destination { - override val type = Type.MESSAGE + override val type get() = Type.MESSAGE override val fragment get() = MessageFragment.newInstance() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt index ab6eec41..66e39fc7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditColorAdapter.kt @@ -3,12 +3,9 @@ package io.github.wulkanowy.ui.modules.account.accountedit import android.annotation.SuppressLint import android.content.res.ColorStateList import android.graphics.Color -import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.graphics.drawable.RippleDrawable -import android.graphics.drawable.StateListDrawable -import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isVisible @@ -52,30 +49,13 @@ class AccountEditColorAdapter @Inject constructor() : } } - private fun Int.createForegroundDrawable(): Drawable = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - val mask = GradientDrawable().apply { - shape = GradientDrawable.OVAL - 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)) - } + private fun Int.createForegroundDrawable(): Drawable { + val mask = GradientDrawable().apply { + shape = GradientDrawable.OVAL + setColor(Color.BLACK) } + return RippleDrawable(ColorStateList.valueOf(this.rippleColor), null, mask) + } private inline val Int.rippleColor: Int get() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 092c9d0d..c6ee60ee 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -121,9 +121,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag attendanceSwipe.setOnRefreshListener(presenter::onSwipeRefresh) attendanceSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) attendanceSwipe.setProgressBackgroundColorSchemeColor( - requireContext().getThemeAttrColor( - R.attr.colorSwipeRefresh - ) + requireContext().getThemeAttrColor(R.attr.colorSwipeRefresh) ) attendanceErrorRetry.setOnClickListener { presenter.onRetry() } attendanceErrorDetails.setOnClickListener { presenter.onDetailsClick() } @@ -134,7 +132,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag attendanceExcuseButton.setOnClickListener { presenter.onExcuseButtonClick() } - attendanceNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + attendanceNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt index 118971e6..dd1644a9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/summary/AttendanceSummaryFragment.kt @@ -71,7 +71,7 @@ class AttendanceSummaryFragment : setOnItemSelectedListener { presenter.onSubjectSelected(it?.text?.toString()) } } - binding.attendanceSummarySubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) + binding.attendanceSummarySubjectsContainer.elevation = requireContext().dpToPx(1f) } override fun updateSubjects(data: ArrayList) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt index fb7939bc..ddd0e4a1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamFragment.kt @@ -64,7 +64,7 @@ class ExamFragment : BaseFragment(R.layout.fragment_exam), examPreviousButton.setOnClickListener { presenter.onPreviousWeek() } examNextButton.setOnClickListener { presenter.onNextWeek() } - examNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + examNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index f9ecb681..0a8561ee 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -96,9 +96,7 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade TabLayoutMediator(binding.gradeTabLayout, binding.gradeViewPager, this).attach() } - with(binding.gradeTabLayout) { - setElevationCompat(context.dpToPx(4f)) - } + binding.gradeTabLayout.elevation = requireContext().dpToPx(4f) with(binding) { gradeErrorRetry.setOnClickListener { presenter.onRetry() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt index 0adac300..dbc4c10c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt @@ -68,7 +68,7 @@ class GradeStatisticsFragment : } with(binding) { - gradeStatisticsSubjectsContainer.setElevationCompat(requireContext().dpToPx(1f)) + gradeStatisticsSubjectsContainer.elevation = requireContext().dpToPx(1f) gradeStatisticsSwipe.setOnRefreshListener(presenter::onSwipeRefresh) gradeStatisticsSwipe.setColorSchemeColors(requireContext().getThemeAttrColor(R.attr.colorPrimary)) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt index a723b048..d4eaade2 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkFragment.kt @@ -67,7 +67,7 @@ class HomeworkFragment : BaseFragment(R.layout.fragment openAddHomeworkButton.setOnClickListener { presenter.onHomeworkAddButtonClicked() } - homeworkNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + homeworkNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt index f7bab526..70b54c49 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt @@ -35,13 +35,13 @@ class LoginActivity : BaseActivity(), Logi @Inject lateinit var updateHelper: UpdateHelper + override val currentViewIndex get() = binding.loginViewpager.currentItem + companion object { fun getStartIntent(context: Context) = Intent(context, LoginActivity::class.java) } - override val currentViewIndex get() = binding.loginViewpager.currentItem - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityLoginBinding.inflate(layoutInflater).apply { binding = this }.root) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt index 04e35d31..87cb505c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt @@ -66,14 +66,8 @@ class LoginStudentSelectFragment : } override fun openMainView() { - activity?.let { - startActivity( - MainActivity.getStartIntent( - context = it, - startNewTask = true - ) - ) - } + startActivity(MainActivity.getStartIntent(requireContext())) + requireActivity().finish() } override fun showProgress(show: Boolean) { @@ -115,7 +109,8 @@ class LoginStudentSelectFragment : chooserTitle = requireContext().getString(R.string.login_email_intent_title), email = "wulkanowyinc@gmail.com", 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.versionName, "Select users to log in", diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt index 3a84b2dd..49d094b7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumber/history/LuckyNumberHistoryFragment.kt @@ -65,7 +65,7 @@ class LuckyNumberHistoryFragment : luckyNumberHistoryPreviousButton.setOnClickListener { presenter.onPreviousWeek() } luckyNumberHistoryNextButton.setOnClickListener { presenter.onNextWeek() } - luckyNumberHistoryNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + luckyNumberHistoryNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 51585ac5..9ef41068 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget import android.app.PendingIntent -import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT 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.StudentRepository 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 kotlinx.coroutines.runBlocking import timber.log.Timber @@ -62,8 +62,8 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() { val appIntent = PendingIntent.getActivity( context, LUCKY_NUMBER_PENDING_INTENT_ID, - MainActivity.getStartIntent(context, Destination.LuckyNumber, true), - FLAG_UPDATE_CURRENT + SplashActivity.getStartIntent(context, Destination.LuckyNumber, true), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) val remoteView = diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 92bc36bc..3969e1d3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -3,8 +3,6 @@ package io.github.wulkanowy.ui.modules.main import android.annotation.SuppressLint import android.content.Context 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.Bundle 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.StudentWithSemesters 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.modules.Destination import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog @@ -59,9 +56,6 @@ class MainActivity : BaseActivity(), MainVie @Inject lateinit var appInfo: AppInfo - @Inject - lateinit var shortcutsHelper: ShortcutsHelper - private var accountMenu: MenuItem? = null private val overlayProvider by lazy { ElevationOverlayProvider(this) } @@ -76,13 +70,8 @@ class MainActivity : BaseActivity(), MainVie fun getStartIntent( context: Context, destination: Destination? = null, - startNewTask: Boolean = false ) = Intent(context, MainActivity::class.java).apply { putExtra(EXTRA_START_DESTINATION, destination) - - if (startNewTask) { - flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK - } } } @@ -109,7 +98,6 @@ class MainActivity : BaseActivity(), MainVie updateHelper.messageContainer = binding.mainFragmentContainer val destination = intent.getSerializableExtra(EXTRA_START_DESTINATION) as Destination? - ?: shortcutsHelper.getDestination(intent) presenter.onAttachView(this, destination) updateHelper.checkAndInstallUpdates(this) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt index 51076c64..a45ab623 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/MessageFragment.kt @@ -77,9 +77,8 @@ class MessageFragment : BaseFragment(R.layout.fragment_m TabLayoutMediator(binding.messageTabLayout, binding.messageViewPager, this).attach() } - with(binding.messageTabLayout) { - setElevationCompat(context.dpToPx(4f)) - } + binding.messageTabLayout.elevation = requireContext().dpToPx(4f) + binding.openSendMessageButton.setOnClickListener { presenter.onSendMessageButtonClicked() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt index 74f8f57e..e1cc2e37 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewFragment.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.message.preview -import android.os.Build import android.os.Bundle import android.print.PrintAttributes import android.print.PrintManager @@ -13,7 +12,6 @@ import android.view.View.VISIBLE import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient -import androidx.annotation.RequiresApi import androidx.core.content.getSystemService import androidx.recyclerview.widget.LinearLayoutManager 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.MainView import io.github.wulkanowy.ui.modules.message.send.SendMessageActivity -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.shareText import javax.inject.Inject @@ -40,9 +37,6 @@ class MessagePreviewFragment : @Inject lateinit var previewAdapter: MessagePreviewAdapter - @Inject - lateinit var appInfo: AppInfo - private var menuReplyButton: MenuItem? = null private var menuForwardButton: MenuItem? = null @@ -140,7 +134,7 @@ class MessagePreviewFragment : menuForwardButton?.isVisible = show menuDeleteButton?.isVisible = show menuShareButton?.isVisible = show - menuPrintButton?.isVisible = show && appInfo.systemVersion >= Build.VERSION_CODES.LOLLIPOP + menuPrintButton?.isVisible = show } override fun setDeletedOptionsLabels() { @@ -175,7 +169,6 @@ class MessagePreviewFragment : context?.shareText(text, subject) } - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) override fun printDocument(html: String, jobName: String) { val webView = WebView(requireContext()) webView.webViewClient = object : WebViewClient() { @@ -190,7 +183,6 @@ class MessagePreviewFragment : webView.loadDataWithBaseURL("file:///android_asset/", html, "text/HTML", "UTF-8", null) } - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) private fun createWebPrintJob(webView: WebView, jobName: String) { activity?.getSystemService()?.let { printManager -> val printAdapter = webView.createPrintDocumentAdapter(jobName) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index 702e5467..eb33ee6e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -1,7 +1,6 @@ package io.github.wulkanowy.ui.modules.message.preview import android.annotation.SuppressLint -import android.os.Build import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.db.entities.Message 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.ErrorHandler import io.github.wulkanowy.utils.AnalyticsHelper -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.afterLoading import io.github.wulkanowy.utils.flowWithResource import io.github.wulkanowy.utils.flowWithResourceIn @@ -24,8 +22,7 @@ class MessagePreviewPresenter @Inject constructor( errorHandler: ErrorHandler, studentRepository: StudentRepository, private val messageRepository: MessageRepository, - private val analytics: AnalyticsHelper, - private var appInfo: AppInfo + private val analytics: AnalyticsHelper ) : BasePresenter(errorHandler, studentRepository) { var message: Message? = null @@ -112,10 +109,11 @@ class MessagePreviewPresenter @Inject constructor( fun onShare(): Boolean { message?.let { - var text = "Temat: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}\n" + when (it.sender.isNotEmpty()) { - true -> "Od: ${it.sender}\n" - false -> "Do: ${it.recipient}\n" - } + "Data: ${it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")}\n\n${it.content}" + var text = + "Temat: ${it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }}\n" + when (it.sender.isNotEmpty()) { + true -> "Od: ${it.sender}\n" + false -> "Do: ${it.recipient}\n" + } + "Data: ${it.date.toFormattedString("yyyy-MM-dd HH:mm:ss")}\n\n${it.content}" attachments?.let { attachments -> 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 false @@ -135,7 +136,6 @@ class MessagePreviewPresenter @Inject constructor( @SuppressLint("NewApi") fun onPrint(): Boolean { - if (appInfo.systemVersion < Build.VERSION_CODES.LOLLIPOP) return false message?.let { val dateString = it.date.toFormattedString("yyyy-MM-dd HH:mm:ss") val infoContent = "

Data wysłania

$dateString
" + when { @@ -154,7 +154,9 @@ class MessagePreviewPresenter @Inject constructor( view?.apply { val html = printHTML - .replace("%SUBJECT%", it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }) + .replace( + "%SUBJECT%", + it.subject.ifBlank { view?.messageNoSubjectString.orEmpty() }) .replace("%CONTENT%", messageContent) .replace("%INFO%", infoContent) printDocument(html, jobName) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt index 583ba687..88fe77d9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewView.kt @@ -1,7 +1,5 @@ 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.MessageWithAttachment import io.github.wulkanowy.ui.base.BaseView @@ -42,8 +40,7 @@ interface MessagePreviewView : BaseView { fun shareText(text: String, subject: String) - @RequiresApi(Build.VERSION_CODES.LOLLIPOP) - fun printDocument(html: String, jobName: String) - fun popView() + + fun printDocument(html: String, jobName: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt index 4571390b..9b76a7f0 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/tab/MessageTabPresenter.kt @@ -127,10 +127,13 @@ class MessageTabPresenter @Inject constructor( onlyUnread, onlyWithAttachments ) - val newItems = listOf(MessageTabDataItem.Header) + filteredData.map { - MessageTabDataItem.MessageItem(it) + val messageItems = filteredData.map { message -> + MessageTabDataItem.MessageItem(message) } - updateData(newItems, folder.id == MessageFolder.SENT.id) + val messageItemsWithHeader = + listOf(MessageTabDataItem.Header) + messageItems + + updateData(messageItemsWithHeader, folder.id == MessageFolder.SENT.id) notifyParentDataLoaded() } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt index 9892b77a..f4fa8e01 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/SchoolAndTeachersFragment.kt @@ -77,9 +77,7 @@ class SchoolAndTeachersFragment : ).attach() } - with(binding.schoolandteachersTabLayout) { - setElevationCompat(context.dpToPx(4f)) - } + binding.schoolandteachersTabLayout.elevation = requireContext().dpToPx(4f) } override fun showContent(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt index 43920588..dd6cf0ec 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/notifications/NotificationsFragment.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.settings.notifications -import android.annotation.SuppressLint import android.content.Intent import android.content.SharedPreferences import android.net.Uri @@ -152,7 +151,6 @@ class NotificationsFragment : PreferenceFragmentCompat(), .show() } - @SuppressLint("InlinedApi") override fun openSystemSettings() { val intent = if (appInfo.systemVersion >= Build.VERSION_CODES.O) { Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt index 376ef374..b27f06ef 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt @@ -1,29 +1,60 @@ 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.widget.Toast import android.widget.Toast.LENGTH_LONG +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.viewbinding.ViewBinding import dagger.hilt.android.AndroidEntryPoint +import io.github.wulkanowy.services.shortcuts.ShortcutsHelper 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.main.MainActivity -import io.github.wulkanowy.utils.AppInfo import io.github.wulkanowy.utils.openInternetBrowser import javax.inject.Inject +@SuppressLint("CustomSplashScreen") @AndroidEntryPoint class SplashActivity : BaseActivity(), SplashView { @Inject - lateinit var appInfo: AppInfo + override lateinit var presenter: SplashPresenter @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?) { 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() { @@ -31,8 +62,8 @@ class SplashActivity : BaseActivity(), SplashView finish() } - override fun openMainView() { - startActivity(MainActivity.getStartIntent(this)) + override fun openMainView(destination: Destination?) { + startActivity(MainActivity.getStartIntent(this, destination)) finish() } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index 03e43efa..0b740902 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -1,12 +1,10 @@ package io.github.wulkanowy.ui.modules.splash -import io.github.wulkanowy.data.Status import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler -import io.github.wulkanowy.utils.flowWithResource -import kotlinx.coroutines.flow.onEach -import timber.log.Timber +import io.github.wulkanowy.ui.modules.Destination +import kotlinx.coroutines.launch import javax.inject.Inject class SplashPresenter @Inject constructor( @@ -14,7 +12,7 @@ class SplashPresenter @Inject constructor( studentRepository: StudentRepository, ) : BasePresenter(errorHandler, studentRepository) { - fun onAttachView(view: SplashView, externalUrl: String?) { + fun onAttachView(view: SplashView, externalUrl: String?, startDestination: Destination?) { super.onAttachView(view) if (!externalUrl.isNullOrBlank()) { @@ -22,15 +20,16 @@ class SplashPresenter @Inject constructor( return } - flowWithResource { studentRepository.isCurrentStudentSet() }.onEach { - when (it.status) { - Status.LOADING -> Timber.d("Is current user set check started") - Status.SUCCESS -> { - if (it.data!!) view.openMainView() - else view.openLoginView() + presenterScope.launch { + runCatching { studentRepository.isCurrentStudentSet() } + .onFailure(errorHandler::dispatch) + .onSuccess { + if (it) { + view.openMainView(startDestination) + } else { + view.openLoginView() + } } - Status.ERROR -> errorHandler.dispatch(it.error!!) - } - }.launch() + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt index a5aa1409..1c5d8bfd 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt @@ -1,12 +1,13 @@ package io.github.wulkanowy.ui.modules.splash import io.github.wulkanowy.ui.base.BaseView +import io.github.wulkanowy.ui.modules.Destination interface SplashView : BaseView { fun openLoginView() - fun openMainView() + fun openMainView(destination: Destination?) fun openExternalUrlAndFinish(url: String) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt index 4478a2a6..07a9f6c7 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetableFragment.kt @@ -97,7 +97,7 @@ class TimetableFragment : BaseFragment(R.layout.fragme timetableNavDate.setOnClickListener { presenter.onPickDate() } timetableNextButton.setOnClickListener { presenter.onNextDay() } - timetableNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + timetableNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt index 47bee1e3..e8fb9e44 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/additional/AdditionalLessonsFragment.kt @@ -72,7 +72,7 @@ class AdditionalLessonsFragment : additionalLessonsNavDate.setOnClickListener { presenter.onPickDate() } additionalLessonsNextButton.setOnClickListener { presenter.onNextDay() } - additionalLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + additionalLessonsNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt index b8da1c0f..a6b12644 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsFragment.kt @@ -79,7 +79,7 @@ class CompletedLessonsFragment : completedLessonsNavDate.setOnClickListener { presenter.onPickDate() } completedLessonsNextButton.setOnClickListener { presenter.onNextDay() } - completedLessonsNavContainer.setElevationCompat(requireContext().dpToPx(8f)) + completedLessonsNavContainer.elevation = requireContext().dpToPx(8f) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt index 63fc8496..2c8c5a67 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetablewidget/TimetableWidgetProvider.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.ui.modules.timetablewidget import android.annotation.SuppressLint import android.app.PendingIntent -import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED 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.widgets.TimetableWidgetService 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.PendingIntentCompat import io.github.wulkanowy.utils.capitalise import io.github.wulkanowy.utils.createNameInitialsDrawable import io.github.wulkanowy.utils.getCompatColor @@ -167,18 +167,20 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { action = appWidgetId.toString() } val accountIntent = PendingIntent.getActivity( - context, -Int.MAX_VALUE + appWidgetId, + context, + -Int.MAX_VALUE + appWidgetId, Intent(context, TimetableWidgetConfigureActivity::class.java).apply { addFlags(FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK) putExtra(EXTRA_APPWIDGET_ID, appWidgetId) putExtra(EXTRA_FROM_PROVIDER, true) - }, FLAG_UPDATE_CURRENT + }, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE + ) val appIntent = PendingIntent.getActivity( context, TIMETABLE_PENDING_INTENT_ID, - MainActivity.getStartIntent(context, Destination.Timetable(), true), - FLAG_UPDATE_CURRENT + SplashActivity.getStartIntent(context, Destination.Timetable(), true), + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE ) val remoteView = RemoteViews(context.packageName, layoutId).apply { @@ -222,16 +224,16 @@ class TimetableWidgetProvider : HiltBroadcastReceiver() { code: Int, appWidgetId: Int, buttonType: String - ): PendingIntent { - return PendingIntent.getBroadcast( - context, code, - Intent(context, TimetableWidgetProvider::class.java).apply { - action = ACTION_APPWIDGET_UPDATE - putExtra(EXTRA_BUTTON_TYPE, buttonType) - putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId) - }, FLAG_UPDATE_CURRENT - ) - } + ) = PendingIntent.getBroadcast( + context, + code, + Intent(context, TimetableWidgetProvider::class.java).apply { + action = ACTION_APPWIDGET_UPDATE + putExtra(EXTRA_BUTTON_TYPE, buttonType) + putExtra(EXTRA_TOGGLED_WIDGET_ID, appWidgetId) + }, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE + ) private suspend fun getStudent(studentId: Long, appWidgetId: Int) = try { val students = studentRepository.getSavedStudents(false) diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt index 0f121dc5..6b7fb4aa 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/widgets/FittedScrollableTabLayout.kt @@ -3,17 +3,15 @@ package io.github.wulkanowy.ui.widgets import android.content.Context import android.util.AttributeSet import android.view.ViewGroup +import com.google.android.material.tabs.TabLayout /** * @see Tabs don't fit to screen with tabmode=scrollable, Even with a Custom Tab Layout */ -class FittedScrollableTabLayout : MaterialTabLayout { - - constructor(context: Context) : super(context) - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) +class FittedScrollableTabLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : TabLayout(context, attrs) { override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { setMeasuredDimension(widthMeasureSpec, heightMeasureSpec) diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt index a04922e5..4e1ca1a9 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialLinearLayout.kt @@ -1,24 +1,19 @@ 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 android.widget.LinearLayout import androidx.core.view.ViewCompat -import com.google.android.material.elevation.ElevationOverlayProvider import com.google.android.material.shape.MaterialShapeDrawable -class MaterialLinearLayout : LinearLayout { - - constructor(context: Context) : super(context) - - constructor(context: Context, attr: AttributeSet) : super(context, attr) - - constructor(context: Context, attr: AttributeSet, defStyleAttr: Int) : super(context, attr, defStyleAttr) +class MaterialLinearLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : LinearLayout(context, attrs) { init { - val drawable = MaterialShapeDrawable.createWithElevationOverlay(context, ViewCompat.getElevation(this)) + val drawable = + MaterialShapeDrawable.createWithElevationOverlay(context, ViewCompat.getElevation(this)) ViewCompat.setBackground(this, drawable) } @@ -28,12 +23,4 @@ class MaterialLinearLayout : LinearLayout { (background as MaterialShapeDrawable).elevation = elevation } } - - fun setElevationCompat(elevation: Float) { - if (SDK_INT >= LOLLIPOP) { - setElevation(elevation) - } else { - setBackgroundColor(ElevationOverlayProvider(context).compositeOverlayWithThemeSurfaceColorIfNeeded(elevation)) - } - } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt b/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt deleted file mode 100644 index e19d0111..00000000 --- a/app/src/main/java/io/github/wulkanowy/ui/widgets/MaterialTabLayout.kt +++ /dev/null @@ -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)) - } - } -} diff --git a/app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt b/app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt new file mode 100644 index 00000000..45ee431a --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/PendingIntentCompat.kt @@ -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 +} diff --git a/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt index 5c888f30..bddd7df4 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/StringExtension.kt @@ -4,6 +4,4 @@ inline fun String?.ifNullOrBlank(defaultValue: () -> String) = if (isNullOrBlank()) defaultValue() else this fun String.capitalise() = - replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } - -fun String.decapitalise() = replaceFirstChar { it.lowercase() } + replaceFirstChar { if (it.isLowerCase()) it.titlecase() else it.toString() } \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt b/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt index 74ae1932..c994ebab 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/security/Scrambler.kt @@ -2,10 +2,8 @@ package io.github.wulkanowy.utils.security -import android.annotation.TargetApi import android.content.Context 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.security.KeyPairGeneratorSpec import android.security.keystore.KeyGenParameterSpec @@ -116,7 +114,6 @@ fun decrypt(cipherText: String): String { } } -@TargetApi(JELLY_BEAN_MR2) private fun generateKeyPair(context: Context) { (if (SDK_INT >= M) { KeyGenParameterSpec.Builder(KEY_ALIAS, PURPOSE_DECRYPT or PURPOSE_ENCRYPT) diff --git a/app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml b/app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml new file mode 100644 index 00000000..dad56a17 --- /dev/null +++ b/app/src/main/res/drawable-v23/compat_splash_screen_no_icon_background.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v23/img_splash_logo.png b/app/src/main/res/drawable-v23/img_splash_logo.png deleted file mode 100644 index 61489d81b973aae9ed13341ea9bc0f0902168b82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19474 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 - - - - - - - diff --git a/app/src/main/res/drawable/ic_splash_logo.xml b/app/src/main/res/drawable/ic_splash_logo.xml new file mode 100644 index 00000000..e2e74731 --- /dev/null +++ b/app/src/main/res/drawable/ic_splash_logo.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/img_splash_logo.png b/app/src/main/res/drawable/img_splash_logo.png deleted file mode 100644 index fb521bf65ee01a4c75b85550fd214c7c606f4444..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20340 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.w?|NW*LK_QYcQ79sb63d!aAc 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 diff --git a/app/src/main/res/drawable/layer_splash_background.xml b/app/src/main/res/drawable/layer_splash_background.xml deleted file mode 100644 index 2cf46d1d..00000000 --- a/app/src/main/res/drawable/layer_splash_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_attendance.xml b/app/src/main/res/layout/fragment_attendance.xml index 8016081b..6f6f648a 100644 --- a/app/src/main/res/layout/fragment_attendance.xml +++ b/app/src/main/res/layout/fragment_attendance.xml @@ -142,8 +142,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_exam.xml b/app/src/main/res/layout/fragment_exam.xml index ca88849c..0c62aab5 100644 --- a/app/src/main/res/layout/fragment_exam.xml +++ b/app/src/main/res/layout/fragment_exam.xml @@ -128,8 +128,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_lucky_number_history.xml b/app/src/main/res/layout/fragment_lucky_number_history.xml index 5f50d126..a5698e2e 100644 --- a/app/src/main/res/layout/fragment_lucky_number_history.xml +++ b/app/src/main/res/layout/fragment_lucky_number_history.xml @@ -118,8 +118,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml index f6fe39dd..5269d95e 100644 --- a/app/src/main/res/layout/fragment_message.xml +++ b/app/src/main/res/layout/fragment_message.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:layout_gravity="center_vertical" + app:tint="?colorPrimary" /> + android:layout_gravity="center_vertical" + app:tint="?colorPrimary" /> - + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_timetable_additional.xml b/app/src/main/res/layout/fragment_timetable_additional.xml index 61eb4445..a71f7545 100644 --- a/app/src/main/res/layout/fragment_timetable_additional.xml +++ b/app/src/main/res/layout/fragment_timetable_additional.xml @@ -131,8 +131,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/fragment_timetable_completed.xml b/app/src/main/res/layout/fragment_timetable_completed.xml index 1a890fe1..e089275d 100644 --- a/app/src/main/res/layout/fragment_timetable_completed.xml +++ b/app/src/main/res/layout/fragment_timetable_completed.xml @@ -130,8 +130,8 @@ android:paddingRight="12dp" android:paddingBottom="8dp" android:scaleType="fitStart" - android:tint="?colorPrimary" - app:srcCompat="@drawable/ic_chevron_left" /> + app:srcCompat="@drawable/ic_chevron_left" + app:tint="?colorPrimary" /> + app:srcCompat="@drawable/ic_chevron_right" + app:tint="?colorPrimary" /> diff --git a/app/src/main/res/layout/subitem_dashboard_conferences.xml b/app/src/main/res/layout/subitem_dashboard_conferences.xml index e8080936..8da2e19b 100644 --- a/app/src/main/res/layout/subitem_dashboard_conferences.xml +++ b/app/src/main/res/layout/subitem_dashboard_conferences.xml @@ -2,7 +2,8 @@ + android:layout_height="wrap_content" + xmlns:tools="http://schemas.android.com/tools"> + - - \ No newline at end of file diff --git a/app/src/main/res/values-v26/styles.xml b/app/src/main/res/values-v26/styles.xml index 55413c05..3fb0a5dd 100644 --- a/app/src/main/res/values-v26/styles.xml +++ b/app/src/main/res/values-v26/styles.xml @@ -5,11 +5,4 @@ false @android:color/darker_gray - - diff --git a/app/src/main/res/values-v28/styles.xml b/app/src/main/res/values-v28/styles.xml index ee77091d..a936566f 100644 --- a/app/src/main/res/values-v28/styles.xml +++ b/app/src/main/res/values-v28/styles.xml @@ -6,12 +6,4 @@ true @android:color/white - - \ No newline at end of file diff --git a/app/src/main/res/values-v29/styles.xml b/app/src/main/res/values-v29/styles.xml index ee77091d..a936566f 100644 --- a/app/src/main/res/values-v29/styles.xml +++ b/app/src/main/res/values-v29/styles.xml @@ -6,12 +6,4 @@ true @android:color/white - - \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 45382e6d..7cd0f725 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -23,10 +23,11 @@ true - @@ -50,8 +50,6 @@ 11sp -