This commit is contained in:
Julien Papasian 2024-11-05 19:48:04 +01:00 committed by GitHub
commit a49649eeca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 101 additions and 45 deletions

View File

@ -51,6 +51,9 @@ jobs:
path: app/build/outputs/mapping/standardRelease path: app/build/outputs/mapping/standardRelease
# Sign APK and create release for tags # Sign APK and create release for tags
- name: Build FOSS flavor
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon'
run: ./gradlew assembleFossRelease
- name: Get tag name - name: Get tag name
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon' if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon'
@ -58,7 +61,7 @@ jobs:
set -x set -x
echo "VERSION_TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV echo "VERSION_TAG=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_ENV
- name: Sign APK - name: Sign APK (standard)
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon' if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon'
uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1 uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1
with: with:
@ -68,6 +71,16 @@ jobs:
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }} keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Sign APK (FOSS)
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon'
uses: r0adkll/sign-android-release@349ebdef58775b1e0d8099458af0816dc79b6407 # v1
with:
releaseDirectory: app/build/outputs/apk/foss/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Clean up build artifacts - name: Clean up build artifacts
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon' if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon'
run: | run: |
@ -93,6 +106,10 @@ jobs:
sha=`sha256sum mihon-x86_64-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'` sha=`sha256sum mihon-x86_64-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'`
echo "APK_X86_64_SHA=$sha" >> $GITHUB_ENV echo "APK_X86_64_SHA=$sha" >> $GITHUB_ENV
mv app/build/outputs/apk/foss/release/app-foss-universal-release-unsigned-signed.apk mihon-foss-${{ env.VERSION_TAG }}.apk
sha=`sha256sum mihon-foss-${{ env.VERSION_TAG }}.apk | awk '{ print $1 }'`
echo "APK_FOSS_UNIVERSAL_SHA=$sha" >> $GITHUB_ENV
- name: Create Release - name: Create Release
if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon' if: startsWith(github.ref, 'refs/tags/') && github.repository == 'mihonapp/mihon'
uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9
@ -104,13 +121,14 @@ jobs:
### Checksums ### Checksums
| Variant | SHA-256 | | Flavor | Variant | SHA-256 |
| ------- | ------- | | ------ | ------- | ------- |
| Universal | ${{ env.APK_UNIVERSAL_SHA }} | Standard | Universal | ${{ env.APK_UNIVERSAL_SHA }}
| arm64-v8a | ${{ env.APK_ARM64_V8A_SHA }} | Standard | arm64-v8a | ${{ env.APK_ARM64_V8A_SHA }}
| armeabi-v7a | ${{ env.APK_ARMEABI_V7A_SHA }} | Standard | armeabi-v7a | ${{ env.APK_ARMEABI_V7A_SHA }}
| x86 | ${{ env.APK_X86_SHA }} | | Standard | x86 | ${{ env.APK_X86_SHA }} |
| x86_64 | ${{ env.APK_X86_64_SHA }} | | Standard | x86_64 | ${{ env.APK_X86_64_SHA }} |
| FOSS | Universal | ${{ env.APK_FOSS_UNIVERSAL_SHA }} |
## If you are unsure which version to choose then go with mihon-${{ env.VERSION_TAG }}.apk ## If you are unsure which version to choose then go with mihon-${{ env.VERSION_TAG }}.apk
files: | files: |
@ -119,6 +137,7 @@ jobs:
mihon-armeabi-v7a-${{ env.VERSION_TAG }}.apk mihon-armeabi-v7a-${{ env.VERSION_TAG }}.apk
mihon-x86-${{ env.VERSION_TAG }}.apk mihon-x86-${{ env.VERSION_TAG }}.apk
mihon-x86_64-${{ env.VERSION_TAG }}.apk mihon-x86_64-${{ env.VERSION_TAG }}.apk
mihon-foss-${{ env.VERSION_TAG }}.apk
draft: true draft: true
prerelease: false prerelease: false
env: env:

View File

@ -99,6 +99,10 @@ android {
buildConfigField("boolean", "INCLUDE_UPDATER", "true") buildConfigField("boolean", "INCLUDE_UPDATER", "true")
dimension = "default" dimension = "default"
} }
create("foss") {
buildConfigField("boolean", "INCLUDE_UPDATER", "true")
dimension = "default"
}
create("dev") { create("dev") {
// Include pseudolocales: https://developer.android.com/guide/topics/resources/pseudolocales // Include pseudolocales: https://developer.android.com/guide/topics/resources/pseudolocales
resourceConfigurations.addAll(listOf("en", "en_XA", "ar_XB", "xxhdpi")) resourceConfigurations.addAll(listOf("en", "en_XA", "ar_XB", "xxhdpi"))
@ -291,9 +295,12 @@ androidComponents {
) )
} }
} }
// Only excluding in standard and foss flavors because this breaks
// Layout Inspector's Compose tree
onVariants(selector().withFlavor("default" to "standard")) { onVariants(selector().withFlavor("default" to "standard")) {
// Only excluding in standard flavor because this breaks it.packaging.resources.excludes.add("META-INF/*.version")
// Layout Inspector's Compose tree }
onVariants(selector().withFlavor("default" to "foss")) {
it.packaging.resources.excludes.add("META-INF/*.version") it.packaging.resources.excludes.add("META-INF/*.version")
} }
} }

View File

@ -0,0 +1,11 @@
package mihon.core.firebase
import android.content.Context
object FirebaseConfig {
fun init(context: Context) = Unit
fun setAnalyticsEnabled(enabled: Boolean) = Unit
fun setCrashlyticsEnabled(enabled: Boolean) = Unit
}

View File

@ -37,6 +37,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.compose.LocalLifecycleOwner import androidx.lifecycle.compose.LocalLifecycleOwner
import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState import eu.kanade.presentation.util.rememberRequestPackageInstallsPermissionState
import eu.kanade.tachiyomi.core.security.PrivacyPreferences import eu.kanade.tachiyomi.core.security.PrivacyPreferences
import eu.kanade.tachiyomi.util.system.isFossFlavor
import eu.kanade.tachiyomi.util.system.launchRequestPackageInstallsPermission import eu.kanade.tachiyomi.util.system.launchRequestPackageInstallsPermission
import tachiyomi.i18n.MR import tachiyomi.i18n.MR
import tachiyomi.presentation.core.i18n.stringResource import tachiyomi.presentation.core.i18n.stringResource
@ -117,28 +118,30 @@ internal class PermissionStep : OnboardingStep {
}, },
) )
HorizontalDivider( if (!isFossFlavor) {
modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp), HorizontalDivider(
color = MaterialTheme.colorScheme.onPrimaryContainer, modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
) color = MaterialTheme.colorScheme.onPrimaryContainer,
)
val crashlyticsPref = privacyPreferences.crashlytics() val crashlyticsPref = privacyPreferences.crashlytics()
val crashlytics by crashlyticsPref.collectAsState() val crashlytics by crashlyticsPref.collectAsState()
PermissionSwitch( PermissionSwitch(
title = stringResource(MR.strings.onboarding_permission_crashlytics), title = stringResource(MR.strings.onboarding_permission_crashlytics),
subtitle = stringResource(MR.strings.onboarding_permission_crashlytics_description), subtitle = stringResource(MR.strings.onboarding_permission_crashlytics_description),
granted = crashlytics, granted = crashlytics,
onToggleChange = crashlyticsPref::set, onToggleChange = crashlyticsPref::set,
) )
val analyticsPref = privacyPreferences.analytics() val analyticsPref = privacyPreferences.analytics()
val analytics by analyticsPref.collectAsState() val analytics by analyticsPref.collectAsState()
PermissionSwitch( PermissionSwitch(
title = stringResource(MR.strings.onboarding_permission_analytics), title = stringResource(MR.strings.onboarding_permission_analytics),
subtitle = stringResource(MR.strings.onboarding_permission_analytics_description), subtitle = stringResource(MR.strings.onboarding_permission_analytics_description),
granted = analytics, granted = analytics,
onToggleChange = analyticsPref::set, onToggleChange = analyticsPref::set,
) )
}
} }
} }

View File

@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.core.security.PrivacyPreferences
import eu.kanade.tachiyomi.core.security.SecurityPreferences import eu.kanade.tachiyomi.core.security.SecurityPreferences
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported
import eu.kanade.tachiyomi.util.system.isFossFlavor
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableMap import kotlinx.collections.immutable.toImmutableMap
import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.i18n.stringResource
@ -31,9 +32,9 @@ object SettingsSecurityScreen : SearchableSettings {
override fun getPreferences(): List<Preference> { override fun getPreferences(): List<Preference> {
val securityPreferences = remember { Injekt.get<SecurityPreferences>() } val securityPreferences = remember { Injekt.get<SecurityPreferences>() }
val privacyPreferences = remember { Injekt.get<PrivacyPreferences>() } val privacyPreferences = remember { Injekt.get<PrivacyPreferences>() }
return listOf( return listOfNotNull(
getSecurityGroup(securityPreferences), getSecurityGroup(securityPreferences),
getFirebaseGroup(privacyPreferences), if (!isFossFlavor) getFirebaseGroup(privacyPreferences) else null,
) )
} }

View File

@ -35,6 +35,7 @@ import eu.kanade.tachiyomi.ui.more.NewUpdateScreen
import eu.kanade.tachiyomi.util.CrashLogUtil import eu.kanade.tachiyomi.util.CrashLogUtil
import eu.kanade.tachiyomi.util.lang.toDateTimestampString import eu.kanade.tachiyomi.util.lang.toDateTimestampString
import eu.kanade.tachiyomi.util.system.copyToClipboard import eu.kanade.tachiyomi.util.system.copyToClipboard
import eu.kanade.tachiyomi.util.system.isFossFlavor
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import logcat.LogPriority import logcat.LogPriority
@ -121,7 +122,7 @@ object AboutScreen : Screen() {
versionName = result.release.version, versionName = result.release.version,
changelogInfo = result.release.info, changelogInfo = result.release.info,
releaseLink = result.release.releaseLink, releaseLink = result.release.releaseLink,
downloadLink = result.release.getDownloadLink(), downloadLink = result.release.getDownloadLink(isFossFlavor),
) )
navigator.push(updateScreen) navigator.push(updateScreen)
}, },

View File

@ -44,6 +44,7 @@ import eu.kanade.tachiyomi.util.system.DeviceUtil
import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.WebViewUtil
import eu.kanade.tachiyomi.util.system.animatorDurationScale import eu.kanade.tachiyomi.util.system.animatorDurationScale
import eu.kanade.tachiyomi.util.system.cancelNotification import eu.kanade.tachiyomi.util.system.cancelNotification
import eu.kanade.tachiyomi.util.system.isFossFlavor
import eu.kanade.tachiyomi.util.system.notify import eu.kanade.tachiyomi.util.system.notify
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.launchIn
@ -132,15 +133,17 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor
} }
.launchIn(scope) .launchIn(scope)
privacyPreferences.analytics() if (!isFossFlavor) {
.changes() privacyPreferences.analytics()
.onEach(FirebaseConfig::setAnalyticsEnabled) .changes()
.launchIn(scope) .onEach(FirebaseConfig::setAnalyticsEnabled)
.launchIn(scope)
privacyPreferences.crashlytics() privacyPreferences.crashlytics()
.changes() .changes()
.onEach(FirebaseConfig::setCrashlyticsEnabled) .onEach(FirebaseConfig::setCrashlyticsEnabled)
.launchIn(scope) .launchIn(scope)
}
setAppCompatDelegateThemeMode(Injekt.get<UiPreferences>().themeMode().get()) setAppCompatDelegateThemeMode(Injekt.get<UiPreferences>().themeMode().get())

View File

@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.notification.NotificationHandler import eu.kanade.tachiyomi.data.notification.NotificationHandler
import eu.kanade.tachiyomi.data.notification.NotificationReceiver import eu.kanade.tachiyomi.data.notification.NotificationReceiver
import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.data.notification.Notifications
import eu.kanade.tachiyomi.util.system.isFossFlavor
import eu.kanade.tachiyomi.util.system.notificationBuilder import eu.kanade.tachiyomi.util.system.notificationBuilder
import eu.kanade.tachiyomi.util.system.notify import eu.kanade.tachiyomi.util.system.notify
import tachiyomi.core.common.i18n.stringResource import tachiyomi.core.common.i18n.stringResource
@ -38,7 +39,7 @@ internal class AppUpdateNotifier(private val context: Context) {
fun promptUpdate(release: Release) { fun promptUpdate(release: Release) {
val updateIntent = NotificationReceiver.downloadAppUpdatePendingBroadcast( val updateIntent = NotificationReceiver.downloadAppUpdatePendingBroadcast(
context, context,
release.getDownloadLink(), release.getDownloadLink(isFossFlavor),
release.version, release.version,
) )

View File

@ -78,6 +78,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaScreen
import eu.kanade.tachiyomi.ui.more.NewUpdateScreen import eu.kanade.tachiyomi.ui.more.NewUpdateScreen
import eu.kanade.tachiyomi.ui.more.OnboardingScreen import eu.kanade.tachiyomi.ui.more.OnboardingScreen
import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.isFossFlavor
import eu.kanade.tachiyomi.util.system.isNavigationBarNeedsScrim import eu.kanade.tachiyomi.util.system.isNavigationBarNeedsScrim
import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.openInBrowser
import eu.kanade.tachiyomi.util.view.setComposeContent import eu.kanade.tachiyomi.util.view.setComposeContent
@ -303,7 +304,7 @@ class MainActivity : BaseActivity() {
versionName = result.release.version, versionName = result.release.version,
changelogInfo = result.release.info, changelogInfo = result.release.info,
releaseLink = result.release.releaseLink, releaseLink = result.release.releaseLink,
downloadLink = result.release.getDownloadLink(), downloadLink = result.release.getDownloadLink(isFossFlavor),
) )
navigator.push(updateScreen) navigator.push(updateScreen)
} }

View File

@ -5,6 +5,9 @@ import eu.kanade.tachiyomi.BuildConfig
val isDevFlavor: Boolean val isDevFlavor: Boolean
get() = BuildConfig.FLAVOR == "dev" get() = BuildConfig.FLAVOR == "dev"
val isFossFlavor: Boolean
get() = BuildConfig.FLAVOR == "foss"
val isPreviewBuildType: Boolean val isPreviewBuildType: Boolean
get() = BuildConfig.BUILD_TYPE == "preview" get() = BuildConfig.BUILD_TYPE == "preview"

View File

@ -16,7 +16,13 @@ data class Release(
* Get download link of latest release from the assets. * Get download link of latest release from the assets.
* @return download link of latest release. * @return download link of latest release.
*/ */
fun getDownloadLink(): String { fun getDownloadLink(isFossFlavor: Boolean): String {
val fossFlavor = if (isFossFlavor) {
"-foss"
} else {
""
}
val apkVariant = when (Build.SUPPORTED_ABIS[0]) { val apkVariant = when (Build.SUPPORTED_ABIS[0]) {
"arm64-v8a" -> "-arm64-v8a" "arm64-v8a" -> "-arm64-v8a"
"armeabi-v7a" -> "-armeabi-v7a" "armeabi-v7a" -> "-armeabi-v7a"
@ -25,7 +31,7 @@ data class Release(
else -> "" else -> ""
} }
return assets.find { it.contains("mihon$apkVariant-") } ?: assets[0] return assets.find { it.contains("mihon$fossFlavor$apkVariant-") } ?: assets[0]
} }
/** /**