diff --git a/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt index 437c6700f54..605dda5691c 100644 --- a/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt +++ b/app/src/main/kotlin/io/element/android/x/ElementXApplication.kt @@ -36,6 +36,6 @@ class ElementXApplication : Application(), DaggerComponentOwner { initializeComponent(TracingInitializer::class.java) initializeComponent(CacheCleanerInitializer::class.java) } - logApplicationInfo() + logApplicationInfo(this) } } diff --git a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt index a121e0a6fb9..3187cae4104 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt @@ -26,6 +26,7 @@ import dagger.Provides import io.element.android.appconfig.ApplicationConfig import io.element.android.features.messages.impl.timeline.components.customreaction.DefaultEmojibaseProvider import io.element.android.features.messages.impl.timeline.components.customreaction.EmojibaseProvider +import io.element.android.libraries.androidutils.system.getVersionCodeFromManifest import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.core.meta.BuildType @@ -87,7 +88,7 @@ object AppModule { // TODO EAx Config.LOW_PRIVACY_LOG_ENABLE, lowPrivacyLoggingEnabled = false, versionName = BuildConfig.VERSION_NAME, - versionCode = BuildConfig.VERSION_CODE, + versionCode = context.getVersionCodeFromManifest(), gitRevision = BuildConfig.GIT_REVISION, gitBranchName = BuildConfig.GIT_BRANCH_NAME, flavorDescription = BuildConfig.FLAVOR_DESCRIPTION, diff --git a/app/src/main/kotlin/io/element/android/x/info/Logs.kt b/app/src/main/kotlin/io/element/android/x/info/Logs.kt index 3cabc937a17..53eaf8f8249 100644 --- a/app/src/main/kotlin/io/element/android/x/info/Logs.kt +++ b/app/src/main/kotlin/io/element/android/x/info/Logs.kt @@ -16,17 +16,19 @@ package io.element.android.x.info +import android.content.Context +import io.element.android.libraries.androidutils.system.getVersionCodeFromManifest import io.element.android.x.BuildConfig import timber.log.Timber import java.text.SimpleDateFormat import java.util.Date import java.util.Locale -fun logApplicationInfo() { +fun logApplicationInfo(context: Context) { val appVersion = buildString { append(BuildConfig.VERSION_NAME) append(" (") - append(BuildConfig.VERSION_CODE) + append(context.getVersionCodeFromManifest()) append(") - ") append(BuildConfig.BUILD_TYPE) append(" / ") diff --git a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/SystemUtils.kt b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/SystemUtils.kt index 737eab7ac78..49e055cc299 100644 --- a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/SystemUtils.kt +++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/system/SystemUtils.kt @@ -28,6 +28,7 @@ import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.annotation.ChecksSdkIntAtLeast import androidx.annotation.RequiresApi +import androidx.core.content.pm.PackageInfoCompat import io.element.android.libraries.androidutils.R import io.element.android.libraries.androidutils.compat.getApplicationInfoCompat import io.element.android.libraries.core.mimetype.MimeTypes @@ -47,6 +48,19 @@ fun Context.getApplicationLabel(packageName: String): String { } } +/** + * Retrieve the versionCode from the Manifest. + * The value is more accurate than BuildConfig.VERSION_CODE, as it is correct according to the + * computation in the `androidComponents` block of the app build.gradle.kts file. + * In other words, the last digit (for the architecture) will be set, whereas BuildConfig.VERSION_CODE + * last digit will always be 0. + */ +fun Context.getVersionCodeFromManifest(): Long { + return PackageInfoCompat.getLongVersionCode( + packageManager.getPackageInfo(packageName, 0) + ) +} + // ============================================================================================================== // Clipboard helper // ============================================================================================================== diff --git a/libraries/core/src/main/kotlin/io/element/android/libraries/core/meta/BuildMeta.kt b/libraries/core/src/main/kotlin/io/element/android/libraries/core/meta/BuildMeta.kt index ad5581f6313..a9cb78548f8 100644 --- a/libraries/core/src/main/kotlin/io/element/android/libraries/core/meta/BuildMeta.kt +++ b/libraries/core/src/main/kotlin/io/element/android/libraries/core/meta/BuildMeta.kt @@ -25,7 +25,7 @@ data class BuildMeta( val applicationId: String, val lowPrivacyLoggingEnabled: Boolean, val versionName: String, - val versionCode: Int, + val versionCode: Long, val gitRevision: String, val gitBranchName: String, val flavorDescription: String, diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/core/BuildMeta.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/core/BuildMeta.kt index 2a70a560519..52c15d05a4f 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/core/BuildMeta.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/core/BuildMeta.kt @@ -28,7 +28,7 @@ fun aBuildMeta( applicationId: String = "", lowPrivacyLoggingEnabled: Boolean = true, versionName: String = "", - versionCode: Int = 0, + versionCode: Long = 0, gitRevision: String = "", gitBranchName: String = "", flavorDescription: String = "", diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistContentTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistContentTest.kt new file mode 100644 index 00000000000..972bdcb606a --- /dev/null +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistContentTest.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.tests.konsist + +import com.lemonappdev.konsist.api.Konsist +import com.lemonappdev.konsist.api.ext.list.withImportNamed +import com.lemonappdev.konsist.api.verify.assertFalse +import org.junit.Test + +class KonsistContentTest { + @Test + fun `assert that BuildConfig dot VersionCode is not used`() { + Konsist + .scopeFromProduction() + .files + .withImportNamed("io.element.android.x.BuildConfig") + .assertFalse(additionalMessage = "Please do not use BuildConfig.VERSION_CODE, but use the versionCode from BuildMeta") { + it.text.contains("BuildConfig.VERSION_CODE") + } + } +}