From 04fff90d26be734e8e2dddd0a07958f06881b6cc Mon Sep 17 00:00:00 2001 From: Artem Chepurnoy Date: Wed, 24 Jan 2024 09:46:14 +0200 Subject: [PATCH] Show a build ref the app was built from in about section --- .github/workflows/new_apk.yaml | 1 + ...w_daily_tag_play_store_internal_track.yaml | 1 + .github/workflows/new_tag_release.yaml | 7 ++ buildSrc/src/main/kotlin/VersionCode.kt | 5 ++ common/build.gradle.kts | 1 + .../keyguard/common/usecase/GetAppBuildRef.kt | 5 ++ .../home/settings/SettingPaneContent.kt | 3 + .../component/SettingAboutAppBuildRef.kt | 76 +++++++++++++++++++ .../settings/other/OtherSettingsScreen.kt | 1 + .../commonMain/resources/MR/base/strings.xml | 5 ++ .../keyguard/copy/GetAppBuildRefImpl.kt | 15 ++++ .../artemchep/keyguard/di/GlobalModuleJvm.kt | 7 ++ 12 files changed, 127 insertions(+) create mode 100644 common/src/commonMain/kotlin/com/artemchep/keyguard/common/usecase/GetAppBuildRef.kt create mode 100644 common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/component/SettingAboutAppBuildRef.kt create mode 100644 common/src/jvmMain/kotlin/com/artemchep/keyguard/copy/GetAppBuildRefImpl.kt diff --git a/.github/workflows/new_apk.yaml b/.github/workflows/new_apk.yaml index ae87229..4a744b5 100644 --- a/.github/workflows/new_apk.yaml +++ b/.github/workflows/new_apk.yaml @@ -23,6 +23,7 @@ jobs: echo ${{ secrets.KEYSTORE_PROPS_B64 }} | base64 -d | zcat >> androidApp/keyguard-release.properties echo ${{ secrets.GOOGLE_SERVICES }} | base64 -d | zcat >> androidApp/google-services.json echo "" >> gradle.properties + echo "versionRef=$(git rev-parse --short HEAD)" >> gradle.properties echo buildkonfig.flavor=release >> gradle.properties - name: "Check and Build licenses" uses: eskatos/gradle-command-action@v2 diff --git a/.github/workflows/new_daily_tag_play_store_internal_track.yaml b/.github/workflows/new_daily_tag_play_store_internal_track.yaml index c28c53d..93c00d5 100644 --- a/.github/workflows/new_daily_tag_play_store_internal_track.yaml +++ b/.github/workflows/new_daily_tag_play_store_internal_track.yaml @@ -28,6 +28,7 @@ jobs: echo ${{ secrets.SERVICE_ACCOUNT_B64 }} | base64 -d | zcat >> service-account-google.json echo "" >> gradle.properties echo versionDate=${{ steps.vars.outputs.tag }} >> gradle.properties + echo "versionRef=${{ env.GITHUB_REF_NAME }}" >> gradle.properties echo buildkonfig.flavor=release >> gradle.properties - name: "Check and Build licenses" uses: eskatos/gradle-command-action@v2 diff --git a/.github/workflows/new_tag_release.yaml b/.github/workflows/new_tag_release.yaml index b3b92d4..12c4819 100644 --- a/.github/workflows/new_tag_release.yaml +++ b/.github/workflows/new_tag_release.yaml @@ -34,6 +34,8 @@ jobs: - name: "Setup build env" run: | echo "" >> gradle.properties + echo versionDate=${{ steps.vars.outputs.tag }} >> gradle.properties + echo "versionRef=${{ env.GITHUB_REF_NAME }}" >> gradle.properties echo buildkonfig.flavor=release >> gradle.properties - name: "Setup signing config" run: | @@ -87,6 +89,8 @@ jobs: - name: "Setup build env" run: | echo "" >> gradle.properties + echo versionDate=${{ steps.vars.outputs.tag }} >> gradle.properties + echo "versionRef=${{ env.GITHUB_REF_NAME }}" >> gradle.properties echo buildkonfig.flavor=release >> gradle.properties - name: "./gradlew :desktopApp:bundleFlatpak" uses: eskatos/gradle-command-action@v2 @@ -122,6 +126,8 @@ jobs: - name: "Setup build env" run: | echo "" >> gradle.properties + echo versionDate=${{ steps.vars.outputs.tag }} >> gradle.properties + echo "versionRef=${{ env.GITHUB_REF_NAME }}" >> gradle.properties echo buildkonfig.flavor=release >> gradle.properties - name: "./gradlew :desktopApp:packageMsi" uses: eskatos/gradle-command-action@v2 @@ -158,6 +164,7 @@ jobs: echo ${{ secrets.GOOGLE_SERVICES }} | base64 -d | zcat >> androidApp/google-services.json echo "" >> gradle.properties echo versionDate=${{ steps.vars.outputs.tag }} >> gradle.properties + echo "versionRef=${{ env.GITHUB_REF_NAME }}" >> gradle.properties echo buildkonfig.flavor=release >> gradle.properties - name: "Check and Build licenses" uses: eskatos/gradle-command-action@v2 diff --git a/buildSrc/src/main/kotlin/VersionCode.kt b/buildSrc/src/main/kotlin/VersionCode.kt index 63f5fd9..b728a32 100644 --- a/buildSrc/src/main/kotlin/VersionCode.kt +++ b/buildSrc/src/main/kotlin/VersionCode.kt @@ -8,12 +8,16 @@ data class VersionInfo( val marketingVersion: String, val logicalVersion: Int, val buildDate: String, + val buildRef: String, ) fun Project.createVersionInfo( marketingVersion: String, logicalVersion: Int, // max 9999 ): VersionInfo { + val buildRef = project.properties["versionRef"] + ?.let { it as? String } + .orEmpty() val dateFormat = SimpleDateFormat("yyyyMMdd") val calendar = Calendar.getInstance().apply { timeZone = TimeZone.getTimeZone("UTC") @@ -34,5 +38,6 @@ fun Project.createVersionInfo( marketingVersion = marketingVersion, logicalVersion = codeVersion, buildDate = buildDate, + buildRef = buildRef, ) } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index a9e6f8b..2e80d1f 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -260,6 +260,7 @@ buildkonfig { defaultConfigs { buildConfigField(STRING, "buildType", BuildType.DEV.name) buildConfigField(STRING, "buildDate", versionInfo.buildDate) + buildConfigField(STRING, "buildRef", versionInfo.buildRef) buildConfigField(STRING, "versionName", versionInfo.marketingVersion.toString()) buildConfigField(INT, "versionCode", versionInfo.logicalVersion.toString()) } diff --git a/common/src/commonMain/kotlin/com/artemchep/keyguard/common/usecase/GetAppBuildRef.kt b/common/src/commonMain/kotlin/com/artemchep/keyguard/common/usecase/GetAppBuildRef.kt new file mode 100644 index 0000000..c155a43 --- /dev/null +++ b/common/src/commonMain/kotlin/com/artemchep/keyguard/common/usecase/GetAppBuildRef.kt @@ -0,0 +1,5 @@ +package com.artemchep.keyguard.common.usecase + +import kotlinx.coroutines.flow.Flow + +interface GetAppBuildRef : () -> Flow diff --git a/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/SettingPaneContent.kt b/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/SettingPaneContent.kt index b9c0cc3..a48eabb 100644 --- a/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/SettingPaneContent.kt +++ b/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/SettingPaneContent.kt @@ -19,6 +19,7 @@ import com.artemchep.keyguard.common.util.flow.foldAsList import com.artemchep.keyguard.feature.EmptyView import com.artemchep.keyguard.feature.home.settings.component.SettingComponent import com.artemchep.keyguard.feature.home.settings.component.settingAboutAppBuildDateProvider +import com.artemchep.keyguard.feature.home.settings.component.settingAboutAppBuildRefProvider import com.artemchep.keyguard.feature.home.settings.component.settingAboutAppProvider import com.artemchep.keyguard.feature.home.settings.component.settingAboutTeamProvider import com.artemchep.keyguard.feature.home.settings.component.settingAboutTelegramProvider @@ -142,6 +143,7 @@ object Setting { const val OPEN_SOURCE_LICENSES = "open_source_licenses" const val ABOUT_APP = "about_app" const val ABOUT_APP_BUILD_DATE = "about_app_build_date" + const val ABOUT_APP_BUILD_REF = "about_app_build_ref" const val ABOUT_TEAM = "about_team" const val EXPERIMENTAL = "experimental" const val LAUNCH_APP_PICKER = "launch_app_picker" @@ -212,6 +214,7 @@ val hub = mapOf SettingComponent>( Setting.FEEDBACK_APP to ::settingFeedbackAppProvider, Setting.ABOUT_APP to ::settingAboutAppProvider, Setting.ABOUT_APP_BUILD_DATE to ::settingAboutAppBuildDateProvider, + Setting.ABOUT_APP_BUILD_REF to ::settingAboutAppBuildRefProvider, Setting.ABOUT_TEAM to ::settingAboutTeamProvider, Setting.REDDIT to ::settingAboutTelegramProvider, Setting.CROWDIN to ::settingLocalizationProvider, diff --git a/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/component/SettingAboutAppBuildRef.kt b/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/component/SettingAboutAppBuildRef.kt new file mode 100644 index 0000000..f882ae1 --- /dev/null +++ b/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/component/SettingAboutAppBuildRef.kt @@ -0,0 +1,76 @@ +package com.artemchep.keyguard.feature.home.settings.component + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.rememberUpdatedState +import com.artemchep.keyguard.common.usecase.GetAppBuildRef +import com.artemchep.keyguard.feature.navigation.LocalNavigationController +import com.artemchep.keyguard.feature.navigation.NavigationIntent +import com.artemchep.keyguard.res.Res +import com.artemchep.keyguard.ui.FlatItem +import com.artemchep.keyguard.ui.icons.ChevronIcon +import dev.icerock.moko.resources.compose.stringResource +import kotlinx.coroutines.flow.map +import org.kodein.di.DirectDI +import org.kodein.di.instance + +fun settingAboutAppBuildRefProvider( + directDI: DirectDI, +) = settingAboutAppBuildRefProvider( + getAppBuildRef = directDI.instance(), +) + +fun settingAboutAppBuildRefProvider( + getAppBuildRef: GetAppBuildRef, +): SettingComponent = getAppBuildRef() + .map { buildRef -> + if (buildRef.isNullOrBlank()) { + return@map null + } + + // composable + SettingIi( + search = SettingIi.Search( + group = "about", + tokens = listOf( + "about", + "app", + "build", + "ref", + ), + ), + ) { + SettingAboutAppBuildRef( + buildRef = buildRef, + ) + } + } + +@Composable +private fun SettingAboutAppBuildRef( + buildRef: String, +) { + val controller by rememberUpdatedState(LocalNavigationController.current) + FlatItem( + title = { + Text( + text = stringResource(Res.strings.pref_item_app_build_ref_title), + ) + }, + text = { + Text(buildRef) + }, + trailing = { + ChevronIcon() + }, + onClick = { + val intent = run { + val url = + "https://github.com/AChep/keyguard-app/tree/$buildRef" + NavigationIntent.NavigateToBrowser(url) + } + controller.queue(intent) + }, + ) +} diff --git a/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/other/OtherSettingsScreen.kt b/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/other/OtherSettingsScreen.kt index 476aade..c5966c0 100644 --- a/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/other/OtherSettingsScreen.kt +++ b/common/src/commonMain/kotlin/com/artemchep/keyguard/feature/home/settings/other/OtherSettingsScreen.kt @@ -53,6 +53,7 @@ fun OtherSettingsScreen() { ), SettingPaneItem.Item(Setting.ABOUT_APP), SettingPaneItem.Item(Setting.ABOUT_APP_BUILD_DATE), + SettingPaneItem.Item(Setting.ABOUT_APP_BUILD_REF), ), ) } diff --git a/common/src/commonMain/resources/MR/base/strings.xml b/common/src/commonMain/resources/MR/base/strings.xml index 4515d5d..d1f3f14 100644 --- a/common/src/commonMain/resources/MR/base/strings.xml +++ b/common/src/commonMain/resources/MR/base/strings.xml @@ -838,6 +838,11 @@ Show labels on navigation buttons App version App build date + + App build ref Team behind the app Reddit community GitHub project diff --git a/common/src/jvmMain/kotlin/com/artemchep/keyguard/copy/GetAppBuildRefImpl.kt b/common/src/jvmMain/kotlin/com/artemchep/keyguard/copy/GetAppBuildRefImpl.kt new file mode 100644 index 0000000..034ff3a --- /dev/null +++ b/common/src/jvmMain/kotlin/com/artemchep/keyguard/copy/GetAppBuildRefImpl.kt @@ -0,0 +1,15 @@ +package com.artemchep.keyguard.copy + +import com.artemchep.keyguard.build.BuildKonfig +import com.artemchep.keyguard.common.usecase.GetAppBuildRef +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import org.kodein.di.DirectDI + +class GetAppBuildRefImpl( +) : GetAppBuildRef { + constructor(directDI: DirectDI) : this( + ) + + override fun invoke(): Flow = flowOf(BuildKonfig.buildRef) +} diff --git a/common/src/jvmMain/kotlin/com/artemchep/keyguard/di/GlobalModuleJvm.kt b/common/src/jvmMain/kotlin/com/artemchep/keyguard/di/GlobalModuleJvm.kt index 4f86d6d..2af8cf3 100644 --- a/common/src/jvmMain/kotlin/com/artemchep/keyguard/di/GlobalModuleJvm.kt +++ b/common/src/jvmMain/kotlin/com/artemchep/keyguard/di/GlobalModuleJvm.kt @@ -85,6 +85,7 @@ import com.artemchep.keyguard.common.usecase.GetAllowScreenshots import com.artemchep.keyguard.common.usecase.GetAllowTwoPanelLayoutInLandscape import com.artemchep.keyguard.common.usecase.GetAllowTwoPanelLayoutInPortrait import com.artemchep.keyguard.common.usecase.GetAppBuildDate +import com.artemchep.keyguard.common.usecase.GetAppBuildRef import com.artemchep.keyguard.common.usecase.GetAppBuildType import com.artemchep.keyguard.common.usecase.GetAppIcons import com.artemchep.keyguard.common.usecase.GetAppVersion @@ -305,6 +306,7 @@ import com.artemchep.keyguard.copy.Base32ServiceJvm import com.artemchep.keyguard.copy.Base64ServiceJvm import com.artemchep.keyguard.copy.DateFormatterAndroid import com.artemchep.keyguard.copy.GetAppBuildDateImpl +import com.artemchep.keyguard.copy.GetAppBuildRefImpl import com.artemchep.keyguard.copy.GetPasswordStrengthJvm import com.artemchep.keyguard.copy.NumberFormatterJvm import com.artemchep.keyguard.copy.PasswordGeneratorDiceware @@ -903,6 +905,11 @@ fun globalModuleJvm() = DI.Module( directDI = this, ) } + bindSingleton { + GetAppBuildRefImpl( + directDI = this, + ) + } bindProvider { instance() }