Add application version to the setting screen.

This commit is contained in:
Benoit Marty 2023-06-30 17:50:13 +02:00 committed by Benoit Marty
parent da7e9a8bf2
commit 499a862bfc
9 changed files with 34 additions and 3 deletions

View file

@ -77,6 +77,7 @@ object AppModule {
applicationId = BuildConfig.APPLICATION_ID, applicationId = BuildConfig.APPLICATION_ID,
lowPrivacyLoggingEnabled = false, // TODO EAx Config.LOW_PRIVACY_LOG_ENABLE, lowPrivacyLoggingEnabled = false, // TODO EAx Config.LOW_PRIVACY_LOG_ENABLE,
versionName = BuildConfig.VERSION_NAME, versionName = BuildConfig.VERSION_NAME,
versionCode = BuildConfig.VERSION_CODE,
gitRevision = "TODO", // BuildConfig.GIT_REVISION, gitRevision = "TODO", // BuildConfig.GIT_REVISION,
gitRevisionDate = "TODO", // BuildConfig.GIT_REVISION_DATE, gitRevisionDate = "TODO", // BuildConfig.GIT_REVISION_DATE,
gitBranchName = "TODO", // BuildConfig.GIT_BRANCH_NAME, gitBranchName = "TODO", // BuildConfig.GIT_BRANCH_NAME,

View file

@ -26,6 +26,7 @@ val A_BUILD_META = BuildMeta(
applicationId = "", applicationId = "",
lowPrivacyLoggingEnabled = false, lowPrivacyLoggingEnabled = false,
versionName = "", versionName = "",
versionCode = 0,
gitRevision = "", gitRevision = "",
gitRevisionDate = "", gitRevisionDate = "",
gitBranchName = "", gitBranchName = "",

View file

@ -192,6 +192,7 @@ private fun aBuildMeta() =
applicationName = "An Application", applicationName = "An Application",
lowPrivacyLoggingEnabled = true, lowPrivacyLoggingEnabled = true,
versionName = "", versionName = "",
versionCode = 0,
gitRevision = "", gitRevision = "",
gitBranchName = "", gitBranchName = "",
gitRevisionDate = "", gitRevisionDate = "",

View file

@ -25,13 +25,16 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.res.stringResource
import io.element.android.features.logout.api.LogoutPreferencePresenter import io.element.android.features.logout.api.LogoutPreferencePresenter
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.core.meta.BuildType
import io.element.android.libraries.matrix.api.user.CurrentUserProvider import io.element.android.libraries.matrix.api.user.CurrentUserProvider
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.api.verification.SessionVerificationService
import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@ -40,7 +43,7 @@ class PreferencesRootPresenter @Inject constructor(
private val logoutPresenter: LogoutPreferencePresenter, private val logoutPresenter: LogoutPreferencePresenter,
private val currentUserProvider: CurrentUserProvider, private val currentUserProvider: CurrentUserProvider,
private val sessionVerificationService: SessionVerificationService, private val sessionVerificationService: SessionVerificationService,
private val buildType: BuildType, private val buildMeta: BuildMeta,
) : Presenter<PreferencesRootState> { ) : Presenter<PreferencesRootState> {
@Composable @Composable
@ -58,11 +61,17 @@ class PreferencesRootPresenter @Inject constructor(
derivedStateOf { sessionVerifiedStatus == SessionVerifiedStatus.NotVerified } derivedStateOf { sessionVerifiedStatus == SessionVerifiedStatus.NotVerified }
} }
val version = stringResource(
id = CommonStrings.settings_version_number,
buildMeta.versionName,
buildMeta.versionCode.toString()
)
val logoutState = logoutPresenter.present() val logoutState = logoutPresenter.present()
val showDeveloperSettings = buildType != BuildType.RELEASE val showDeveloperSettings = buildMeta.buildType != BuildType.RELEASE
return PreferencesRootState( return PreferencesRootState(
logoutState = logoutState, logoutState = logoutState,
myUser = matrixUser.value, myUser = matrixUser.value,
version = version,
showCompleteVerification = sessionIsNotVerified, showCompleteVerification = sessionIsNotVerified,
showDeveloperSettings = showDeveloperSettings showDeveloperSettings = showDeveloperSettings
) )

View file

@ -22,6 +22,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
data class PreferencesRootState( data class PreferencesRootState(
val logoutState: LogoutPreferenceState, val logoutState: LogoutPreferenceState,
val myUser: MatrixUser?, val myUser: MatrixUser?,
val version: String,
val showCompleteVerification: Boolean, val showCompleteVerification: Boolean,
val showDeveloperSettings: Boolean val showDeveloperSettings: Boolean
) )

View file

@ -21,6 +21,7 @@ import io.element.android.features.logout.api.aLogoutPreferenceState
fun aPreferencesRootState() = PreferencesRootState( fun aPreferencesRootState() = PreferencesRootState(
logoutState = aLogoutPreferenceState(), logoutState = aLogoutPreferenceState(),
myUser = null, myUser = null,
version = "Version 1.1 (1)",
showCompleteVerification = true, showCompleteVerification = true,
showDeveloperSettings = true showDeveloperSettings = true
) )

View file

@ -16,6 +16,8 @@
package io.element.android.features.preferences.impl.root package io.element.android.features.preferences.impl.root
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.DeveloperMode import androidx.compose.material.icons.filled.DeveloperMode
import androidx.compose.material.icons.outlined.BugReport import androidx.compose.material.icons.outlined.BugReport
@ -25,7 +27,9 @@ import androidx.compose.material.icons.outlined.VerifiedUser
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.features.logout.api.LogoutPreferenceView import io.element.android.features.logout.api.LogoutPreferenceView
import io.element.android.features.preferences.impl.user.UserPreferences import io.element.android.features.preferences.impl.user.UserPreferences
import io.element.android.libraries.designsystem.components.preferences.PreferenceText import io.element.android.libraries.designsystem.components.preferences.PreferenceText
@ -34,8 +38,10 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewDark
import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.preview.ElementPreviewLight
import io.element.android.libraries.designsystem.preview.LargeHeightPreview import io.element.android.libraries.designsystem.preview.LargeHeightPreview
import io.element.android.libraries.designsystem.theme.components.Divider import io.element.android.libraries.designsystem.theme.components.Divider
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.MatrixUserProvider import io.element.android.libraries.matrix.ui.components.MatrixUserProvider
import io.element.android.libraries.theme.ElementTheme
import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.ui.strings.CommonStrings
@Composable @Composable
@ -86,6 +92,15 @@ fun PreferencesRootView(
LogoutPreferenceView( LogoutPreferenceView(
state = state.logoutState, state = state.logoutState,
) )
Text(
modifier = Modifier
.fillMaxWidth()
.padding(top = 40.dp, bottom = 24.dp),
textAlign = TextAlign.Center,
text = state.version,
style = ElementTheme.typography.fontBodySmRegular,
color = ElementTheme.materialColors.secondary,
)
} }
} }

View file

@ -41,13 +41,14 @@ class PreferencesRootPresenterTest {
logoutPresenter, logoutPresenter,
CurrentUserProvider(matrixClient), CurrentUserProvider(matrixClient),
FakeSessionVerificationService(), FakeSessionVerificationService(),
A_BUILD_META.buildType A_BUILD_META
) )
moleculeFlow(RecompositionClock.Immediate) { moleculeFlow(RecompositionClock.Immediate) {
presenter.present() presenter.present()
}.test { }.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.myUser).isNull() assertThat(initialState.myUser).isNull()
assertThat(initialState.version).isEqualTo("Version " + A_BUILD_META.versionName + " (" + A_BUILD_META.versionCode + ")")
val loadedState = awaitItem() val loadedState = awaitItem()
assertThat(loadedState.logoutState.logoutAction).isEqualTo(Async.Uninitialized) assertThat(loadedState.logoutState.logoutAction).isEqualTo(Async.Uninitialized)
assertThat(loadedState.myUser).isEqualTo( assertThat(loadedState.myUser).isEqualTo(

View file

@ -23,6 +23,7 @@ data class BuildMeta(
val applicationId: String, val applicationId: String,
val lowPrivacyLoggingEnabled: Boolean, val lowPrivacyLoggingEnabled: Boolean,
val versionName: String, val versionName: String,
val versionCode: Int,
val gitRevision: String, val gitRevision: String,
val gitRevisionDate: String, val gitRevisionDate: String,
val gitBranchName: String, val gitBranchName: String,