diff --git a/.github/workflows/schedule-dispatch.yml b/.github/workflows/schedule-dispatch.yml index 24b63e9c..9b2ca12e 100644 --- a/.github/workflows/schedule-dispatch.yml +++ b/.github/workflows/schedule-dispatch.yml @@ -31,7 +31,7 @@ jobs: name: Build nightly release (APK) needs: - check - if: ${{ needs.check.outputs.hasNewChanges }} + if: ${{ needs.check.outputs.hasNewChanges == 'true' }} uses: szkolny-eu/szkolny-android/.github/workflows/_build.yml@develop with: nightly: true diff --git a/app/build.gradle b/app/build.gradle index cd002a96..08e69799 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,7 +50,7 @@ android { minifyEnabled = false applicationIdSuffix = ".debug" manifestPlaceholders = [ - buildTimestamp: 0 + buildTimestamp: "0" ] } @@ -133,7 +133,7 @@ android { } tasks.whenTaskAdded { task -> - if (!(task.name == "minifyUnofficialReleaseWithR8" || task.name == "minifyOfficialReleaseWithR8" || task.name == "signPlayReleaseBundle")) + if (!(task.name == "assembleUnofficialRelease" || task.name == "assembleOfficialRelease" || task.name == "signPlayReleaseBundle")) return def renameTaskName = "rename${task.name.capitalize()}" @@ -148,14 +148,12 @@ tasks.whenTaskAdded { task -> if (task.name.startsWith("sign")) flavor = task.name.substring("sign".length(), task.name.indexOf("Release")).uncapitalize() - def taskName = "package${flavor.capitalize()}Release" - if (flavor != "") { tasks.register(renameTaskName, Copy) { - dependsOn(taskName) + dependsOn(task.name) + duplicatesStrategy DuplicatesStrategy.FAIL from file("${projectDir}/${flavor}/release/"), file("${buildDir}/outputs/mapping/${flavor}Release/"), - file("${buildDir}/outputs/apk/${flavor}/release/"), file("${buildDir}/outputs/bundle/${flavor}Release/") include "*.aab", "*.apk", "mapping.txt", "output-metadata.json" destinationDir file("${projectDir}/release/") diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 1c69c9ce..c06827e5 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -25,7 +25,7 @@ -keep class * extends com.google.gson.reflect.TypeToken -keep class pl.szczodrzynski.edziennik.utils.models.** { *; } --keep class pl.szczodrzynski.edziennik.data.db.enums.* { *; } +-keep class pl.szczodrzynski.edziennik.data.enums.* { *; } -keep class pl.szczodrzynski.edziennik.data.db.entity.Event { *; } -keep class pl.szczodrzynski.edziennik.data.db.full.EventFull { *; } -keep class pl.szczodrzynski.edziennik.data.db.entity.FeedbackMessage { *; } @@ -100,29 +100,3 @@ -keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData { *; } -keepclassmembernames class pl.szczodrzynski.fslogin.realm.RealmData$Type { *; } - -# Exclude Retrofit2 --keepattributes Signature, InnerClasses, EnclosingMethod --keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations --keepattributes AnnotationDefault - --keepclassmembers,allowshrinking,allowobfuscation interface * { - @retrofit2.http.* ; -} - --dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement --dontwarn javax.annotation.** --dontwarn kotlin.Unit --dontwarn retrofit2.KotlinExtensions --dontwarn retrofit2.KotlinExtensions$* - --if interface * { @retrofit2.http.* ; } --keep,allowobfuscation interface <1> - --if interface * { @retrofit2.http.* ; } --keep,allowobfuscation interface * extends <1> - --keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation --if interface * { @retrofit2.http.* public *** *(...); } --keep,allowoptimization,allowshrinking,allowobfuscation class <3> --keep,allowobfuscation,allowshrinking class retrofit2.Response diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt index 5794365b..e558de53 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/App.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/App.kt @@ -90,7 +90,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { get() = profile.id var enableChucker = false - var debugMode = false var devMode = false } @@ -213,8 +212,11 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { App.db = AppDb(this) App.config = Config(this) App.config.migrate() - debugMode = BuildConfig.DEBUG - devMode = config.devMode ?: debugMode + + devMode = config.devMode ?: BuildConfig.DEBUG + if (config.devModePassword != null) + checkDevModePassword() + enableChucker = config.enableChucker ?: devMode uiManager.applyNightMode() uiManager.applyLanguage(this) @@ -240,9 +242,6 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { withContext(Dispatchers.Default) { SSLProviderInstaller.install(applicationContext, this@App::buildHttp) - if (config.devModePassword != null) - checkDevModePassword() - if (config.sync.enabled) SyncWorker.scheduleNext(this@App, false) else @@ -474,8 +473,8 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope { } fun checkDevModePassword() { - devMode = try { - Utils.AESCrypt.decrypt("nWFVxY65Pa8/aRrT7EylNAencmOD+IxUY2Gg/beiIWY=", config.devModePassword) == "ok here you go it's enabled now" || BuildConfig.DEBUG + devMode = devMode || try { + Utils.AESCrypt.decrypt("nWFVxY65Pa8/aRrT7EylNAencmOD+IxUY2Gg/beiIWY=", config.devModePassword) == "ok here you go it's enabled now" } catch (e: Exception) { e.printStackTrace() false diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt index b011c970..6e16443b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/Data.kt @@ -145,7 +145,7 @@ abstract class Data(val app: App, val profile: Profile?, val loginStore: LoginSt val db: AppDb by lazy { app.db } init { - if (App.debugMode) { + if (BuildConfig.DEBUG) { fakeLogin = loginStore.hasLoginData("fakeLogin") } clear() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt index 4c05a63f..ce2a2ebc 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/config/BaseConfig.kt @@ -11,6 +11,7 @@ import kotlinx.coroutines.launch import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.data.db.entity.ConfigEntry import pl.szczodrzynski.edziennik.ext.takePositive +import pl.szczodrzynski.edziennik.utils.Utils.d import kotlin.coroutines.CoroutineContext abstract class BaseConfig( @@ -19,6 +20,9 @@ abstract class BaseConfig( val profileId: Int? = null, protected var entries: List? = null, ) : CoroutineScope { + companion object { + private const val TAG = "BaseConfig" + } private val job = Job() override val coroutineContext: CoroutineContext @@ -66,6 +70,7 @@ abstract class BaseConfig( operator fun set(key: String, value: String?) { values[key] = value launch(Dispatchers.IO) { + d(TAG, "Setting config value ($profileId): $key = $value") app.db.configDao().add(ConfigEntry(profileId ?: -1, key, value)) } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt index 05249ca3..d80ef156 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/firebase/SzkolnyAppFirebase.kt @@ -114,6 +114,10 @@ class SzkolnyAppFirebase(val app: App, val profiles: List, val message: } withContext(Dispatchers.Default) { app.db.feedbackMessageDao().add(message) + if (message.text.startsWith("devmode")) { + app.config.devModePassword = message.text.substringAfter("devmode") + app.checkDevModePassword() + } if (!EventBus.getDefault().hasSubscriberForEvent(FeedbackMessageEvent::class.java)) { val notification = Notification( id = System.currentTimeMillis(), diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt index c9089c45..3004b35d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/feedback/FeedbackFragment.kt @@ -254,6 +254,11 @@ class FeedbackFragment : Fragment(), CoroutineScope { message } ?: return@launch + if (message.text.startsWith("devmode")) { + app.config.devModePassword = message.text.substringAfter("devmode") + app.checkDevModePassword() + } + b.chatLayout.visibility = View.VISIBLE b.inputLayout.visibility = View.GONE diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginFormFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginFormFragment.kt index 54bbcac9..e490a443 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginFormFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginFormFragment.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.BuildConfig import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.enums.LoginMode import pl.szczodrzynski.edziennik.data.enums.LoginType @@ -256,7 +257,7 @@ class LoginFormFragment : Fragment(), CoroutineScope { "loginMode" to loginMode ) - if (App.debugMode && b.fakeLogin.isChecked) { + if (BuildConfig.DEBUG && b.fakeLogin.isChecked) { payload.putBoolean("fakeLogin", true) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginPrizeFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginPrizeFragment.kt index 35c57041..8afbf81f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginPrizeFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginPrizeFragment.kt @@ -16,6 +16,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.BuildConfig import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.databinding.LoginPrizeFragmentBinding import pl.szczodrzynski.edziennik.ext.onClick @@ -67,8 +68,8 @@ class LoginPrizeFragment : Fragment(), CoroutineScope { .show() } .setNegativeButton(R.string.no) { _, _ -> - app.config.devMode = App.debugMode - App.devMode = App.debugMode + app.config.devMode = BuildConfig.DEBUG + App.devMode = BuildConfig.DEBUG activity.finish() } .show() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/BuildManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/BuildManager.kt index 2cbf4f23..91778906 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/BuildManager.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/BuildManager.kt @@ -55,7 +55,7 @@ class BuildManager(val app: App) : CoroutineScope { get() { val info = app.packageManager.getApplicationInfo(app.packageName, PackageManager.GET_META_DATA) val metadata = info.metaData - return metadata?.getFloat("buildTimestamp")?.toLong() ?: 0 + return metadata?.getString("buildTimestamp")?.toLongOrNull() ?: 0 } val gitHash = BuildConfig.GIT_INFO["hash"] diff --git a/gradle.properties b/gradle.properties index 9f9daba0..cc31f16a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,7 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. android.enableJetifier=true +android.enableR8.fullMode=false android.ndk.suppressMinSdkVersionError=21 android.nonFinalResIds=true android.nonTransitiveRClass=false