Add Beta flavor builds

Use Beta tag instead of version check in advanced settings

Simplify beta check logic in advanced settings

new version app check fixes for beta
This commit is contained in:
Jays2Kings 2022-05-21 15:24:35 -04:00
parent 4b24dfc9f9
commit 2040462c49
8 changed files with 98 additions and 42 deletions

View file

@ -17,10 +17,6 @@ if (gradle.startParameter.taskRequests.toString().contains("Standard")) {
apply<com.google.gms.googleservices.GoogleServicesPlugin>()
}
fun getBuildTime() = DateTimeFormatter.ISO_DATE_TIME.format(LocalDateTime.now(ZoneOffset.UTC))
fun getCommitCount() = runCommand("git rev-list --count HEAD")
fun getGitSha() = runCommand("git rev-parse --short HEAD")
fun runCommand(command: String): String {
val byteOut = ByteArrayOutputStream()
project.exec {
@ -46,9 +42,11 @@ android {
multiDexEnabled = true
buildConfigField("String", "COMMIT_COUNT", "\"${getCommitCount()}\"")
buildConfigField("String", "BETA_COMMIT_COUNT", "\"${getCommitCountSinceLastRelease()}\"")
buildConfigField("String", "COMMIT_SHA", "\"${getGitSha()}\"")
buildConfigField("String", "BUILD_TIME", "\"${getBuildTime()}\"")
buildConfigField("Boolean", "INCLUDE_UPDATER", "false")
buildConfigField("boolean", "BETA", "false")
ndk {
abiFilters += supportedAbis
@ -81,6 +79,7 @@ android {
buildTypes {
getByName("debug") {
applicationIdSuffix = ".debugJ2K"
versionNameSuffix = "-d${getCommitCount()}"
}
getByName("release") {
applicationIdSuffix = ".j2k"
@ -88,6 +87,12 @@ android {
isMinifyEnabled = true
proguardFiles("proguard-android-optimize.txt", "proguard-rules.pro")
}
create("beta") {
initWith(getByName("release"))
buildConfigField("boolean", "BETA", "true")
versionNameSuffix = "-b${getCommitCountSinceLastRelease()}"
}
}
buildFeatures {
@ -178,6 +183,7 @@ dependencies {
val chuckerVersion = "3.5.2"
debugImplementation("com.github.ChuckerTeam.Chucker:library:$chuckerVersion")
releaseImplementation("com.github.ChuckerTeam.Chucker:library-no-op:$chuckerVersion")
add("betaImplementation", "com.github.ChuckerTeam.Chucker:library-no-op:$chuckerVersion")
implementation(kotlin("reflect", version = AndroidVersions.kotlin))

View file

@ -225,8 +225,6 @@ object PreferenceKeys {
const val sideNavMode = "side_nav_mode"
const val checkForBetas = "check_for_betas"
const val shouldAutoUpdate = "should_auto_update"
const val autoUpdateExtensions = "auto_update_extensions"

View file

@ -8,6 +8,7 @@ import androidx.preference.PreferenceManager
import com.fredporciuncula.flow.preferences.FlowSharedPreferences
import com.fredporciuncula.flow.preferences.Preference
import com.google.android.material.color.DynamicColors
import eu.kanade.tachiyomi.BuildConfig
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.track.TrackService
@ -373,7 +374,7 @@ class PreferencesHelper(val context: Context) {
fun lastAppCheck() = flowPrefs.getLong("last_app_check", 0)
fun checkForBetas() = prefs.getBoolean(Keys.checkForBetas, false)
fun checkForBetas() = flowPrefs.getBoolean("check_for_betas", BuildConfig.BETA)
fun unreadBadgeType() = flowPrefs.getInt("unread_badge_type", 2)

View file

@ -25,7 +25,7 @@ class AppUpdateChecker {
}
return withIOContext {
val result = if (preferences.checkForBetas()) {
val result = if (preferences.checkForBetas().get()) {
networkService.client
.newCall(GET("https://api.github.com/repos/$GITHUB_REPO/releases"))
.await()
@ -72,17 +72,25 @@ class AppUpdateChecker {
private fun isNewVersion(versionTag: String): Boolean {
// Removes prefixes like "r" or "v"
val newVersion = versionTag.replace("-", ".").replace("[^\\d.]".toRegex(), "")
val oldVersion = BuildConfig.VERSION_NAME.replace("-", ".").replace("[^\\d.]".toRegex(), "")
val newSemVer = newVersion.split(".").map { it.toInt() }
val oldSemVer = oldVersion.split(".").map { it.toInt() }
val newVersion = versionTag.replace("[^\\d.-]".toRegex(), "")
val oldVersion = BuildConfig.VERSION_NAME.replace("[^\\d.-]".toRegex(), "")
val newPreReleaseVer = newVersion.split("-")
val oldPreReleaseVer = oldVersion.split("-")
val newSemVer = newPreReleaseVer.first().split(".").map { it.toInt() }
val oldSemVer = oldPreReleaseVer.first().split(".").map { it.toInt() }
oldSemVer.mapIndexed { index, i ->
if (newSemVer.getOrElse(index) { i } > i) {
return true
}
}
return newSemVer.size > oldSemVer.size
// For cases of extreme patch versions (new: 1.2.3.1 vs old: 1.2.3, return true)
return if (newSemVer.size > oldSemVer.size) {
true
} else {
// For production versions from beta (new: 1.2.3 vs old: 1.2.3-b1, return true)
(newPreReleaseVer.getOrNull(1) != null) != (oldPreReleaseVer.getOrNull(1) != null)
}
}
}

View file

@ -5,6 +5,8 @@ import android.content.res.ColorStateList
import android.graphics.Color
import android.view.ViewGroup
import androidx.core.graphics.ColorUtils
import androidx.core.text.buildSpannedString
import androidx.core.text.color
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.updateLayoutParams
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
@ -14,6 +16,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.toggle
import eu.kanade.tachiyomi.databinding.TachiOverflowLayoutBinding
import eu.kanade.tachiyomi.ui.main.MainActivity
import eu.kanade.tachiyomi.util.lang.addBetaTag
import eu.kanade.tachiyomi.util.lang.withSubtitle
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.getResourceColor
@ -79,7 +82,17 @@ class OverflowDialog(activity: MainActivity) : Dialog(activity, R.style.Overflow
dismiss()
}
binding.aboutItem.text = context.getString(R.string.about).withSubtitle(binding.aboutItem.context, "v${BuildConfig.VERSION_NAME}")
val vName = "v${BuildConfig.VERSION_NAME}".substringBefore("-")
val newVName = buildSpannedString {
color(context.getResourceColor(android.R.attr.textColorSecondary)) {
append(vName)
}
if (BuildConfig.BETA) {
append("".addBetaTag(context, false))
}
}
binding.aboutItem.text = context.getString(R.string.about).withSubtitle(newVName)
binding.aboutItem.setOnClickListener {
activity.showAbout()

View file

@ -58,7 +58,6 @@ import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy
import java.io.File
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
class SettingsAdvancedController : SettingsController() {
@ -129,27 +128,15 @@ class SettingsAdvancedController : SettingsController() {
switchPreference {
titleRes = R.string.check_for_beta_releases
summaryRes = R.string.try_new_features
key = Keys.checkForBetas
bindTo(preferences.checkForBetas())
onChange {
it as Boolean
if (!it && BuildConfig.VERSION_NAME.contains("-b")) {
if ((!it && BuildConfig.BETA) || (it && !BuildConfig.BETA)) {
activity!!.materialAlertDialog()
.setTitle(R.string.warning)
.setMessage(R.string.warning_unenroll_from_beta)
.setPositiveButton(android.R.string.ok) { _, _ ->
isChecked = false
}
.setNegativeButton(android.R.string.cancel, null)
.show()
false
} else if (it && !BuildConfig.VERSION_NAME.contains("-b")) {
activity!!.materialAlertDialog()
.setTitle(R.string.warning)
.setMessage(R.string.warning_enroll_into_beta)
.setPositiveButton(android.R.string.ok) { _, _ ->
isChecked = true
}
.setMessage(if (it) R.string.warning_enroll_into_beta else R.string.warning_unenroll_from_beta)
.setPositiveButton(android.R.string.ok) { _, _ -> isChecked = it }
.setNegativeButton(android.R.string.cancel, null)
.show()
false

View file

@ -1,7 +1,6 @@
package eu.kanade.tachiyomi.util.lang
import android.content.Context
import android.graphics.Typeface
import android.text.Spannable
import android.text.SpannableString
import android.text.SpannableStringBuilder
@ -9,15 +8,15 @@ import android.text.Spanned
import android.text.SpannedString
import android.text.style.BackgroundColorSpan
import android.text.style.ForegroundColorSpan
import android.text.style.RelativeSizeSpan
import android.text.style.StyleSpan
import android.text.style.SuperscriptSpan
import android.text.style.TextAppearanceSpan
import androidx.annotation.ColorInt
import androidx.annotation.StringRes
import androidx.core.text.bold
import androidx.core.text.buildSpannedString
import androidx.core.text.color
import androidx.core.text.inSpans
import androidx.core.text.scale
import androidx.core.text.superscript
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.system.getResourceColor
import net.greypanther.natsort.CaseInsensitiveSimpleNaturalComparator
@ -155,6 +154,9 @@ fun String.indexesOf(substr: String, ignoreCase: Boolean = true): List<Int> {
fun String.withSubtitle(context: Context, @StringRes subtitleRes: Int) =
withSubtitle(context, context.getString(subtitleRes))
fun String.withSubtitle(subtitle: Spanned): Spanned =
SpannableStringBuilder(this + "\n").append(subtitle)
fun String.withSubtitle(context: Context, subtitle: String): Spanned {
val spannable = SpannableStringBuilder(this + "\n" + subtitle)
spannable.setSpan(
@ -166,14 +168,16 @@ fun String.withSubtitle(context: Context, subtitle: String): Spanned {
return spannable
}
fun String.addBetaTag(context: Context): Spanned {
fun String.addBetaTag(context: Context, useSuperScript: Boolean = true): Spanned {
val betaText = context.getString(R.string.beta)
val betaSpan = SpannableStringBuilder(this + betaText)
betaSpan.setSpan(SuperscriptSpan(), length, length + betaText.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
betaSpan.setSpan(RelativeSizeSpan(0.75f), length, length + betaText.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
betaSpan.setSpan(StyleSpan(Typeface.BOLD), length, length + betaText.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
betaSpan.setSpan(ForegroundColorSpan(context.getResourceColor(R.attr.colorSecondary)), length, length + betaText.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return betaSpan
val colorS = context.getResourceColor(R.attr.colorSecondary)
return buildSpannedString {
append(this@addBetaTag)
val buttonSpan: SpannableStringBuilder.() -> Unit = {
bold { scale(0.75f) { color(colorS) { append(betaText) } } }
}
if (useSuperScript) superscript(buttonSpan) else buttonSpan()
}
}
fun String.toNormalized(): String = replace("", "'")

View file

@ -0,0 +1,39 @@
import org.gradle.api.Project
import java.io.ByteArrayOutputStream
import java.text.SimpleDateFormat
import java.util.TimeZone
import java.util.Date
// Git is needed in your system PATH for these commands to work.
// If it's not installed, you can return a random value as a workaround
fun Project.getCommitCount(): String {
return runCommand("git rev-list --count HEAD")
// return "1"
}
fun Project.getCommitCountSinceLastRelease(): String {
val lastTag = runCommand("git describe --tags --abbrev=0")
return runCommand("git rev-list --count $lastTag..HEAD").toIntOrNull()?.toString() ?: "1"
// return "1"
}
fun Project.getGitSha(): String {
return runCommand("git rev-parse --short HEAD")
// return "1"
}
fun Project.getBuildTime(): String {
val df = SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'")
df.timeZone = TimeZone.getTimeZone("UTC")
return df.format(Date())
}
fun Project.runCommand(command: String): String {
val byteOut = ByteArrayOutputStream()
project.exec {
commandLine = command.split(" ")
standardOutput = byteOut
}
return String(byteOut.toByteArray()).trim()
}