Fix nightly updates.

This commit is contained in:
Greyson Parrelli
2023-11-01 22:05:37 -04:00
parent e486a4baef
commit 2dd0899a3d
9 changed files with 111 additions and 8 deletions

View File

@@ -31,6 +31,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.registration.RegistrationNavigationActivity
import org.thoughtcrime.securesms.util.Environment
import org.thoughtcrime.securesms.util.FeatureFlags
import org.thoughtcrime.securesms.util.PlayStoreUtil
import org.thoughtcrime.securesms.util.Util
@@ -232,6 +233,16 @@ class AppSettingsFragment : DSLSettingsFragment(
}
)
if (Environment.IS_NIGHTLY) {
clickPref(
title = DSLSettingsText.from("App updates"),
icon = DSLSettingsIcon.from(R.drawable.symbol_calendar_24),
onClick = {
findNavController().safeNavigate(R.id.action_appSettingsFragment_to_appUpdatesSettingsFragment)
}
)
}
dividerPref()
if (SignalStore.paymentsValues().paymentsAvailability.showPaymentsMenu()) {

View File

@@ -0,0 +1,65 @@
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.thoughtcrime.securesms.components.settings.app.updates
import android.os.Build
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.components.settings.DSLConfiguration
import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment
import org.thoughtcrime.securesms.components.settings.DSLSettingsText
import org.thoughtcrime.securesms.components.settings.configure
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import org.thoughtcrime.securesms.jobs.ApkUpdateJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
/**
* Settings around app updates. Only shown for builds that manage their own app updates.
*/
class AppUpdatesSettingsFragment : DSLSettingsFragment(R.string.preferences_app_updates__title) {
override fun bindAdapter(adapter: MappingAdapter) {
adapter.submitList(getConfiguration().toMappingModelList())
}
private fun getConfiguration(): DSLConfiguration {
return configure {
if (Build.VERSION.SDK_INT >= 31) {
switchPref(
title = DSLSettingsText.from("Automatic updates"),
summary = DSLSettingsText.from("Automatically download and install app updates"),
isChecked = SignalStore.apkUpdate().autoUpdate,
onClick = {
SignalStore.apkUpdate().autoUpdate = !SignalStore.apkUpdate().autoUpdate
}
)
}
clickPref(
title = DSLSettingsText.from("Check for updates"),
summary = DSLSettingsText.from("Last checked on: $lastSuccessfulUpdateString"),
onClick = {
ApplicationDependencies.getJobManager().add(ApkUpdateJob())
}
)
}
}
private val lastSuccessfulUpdateString: String
get() {
val lastUpdateTime = SignalStore.apkUpdate().lastSuccessfulCheck
return if (lastUpdateTime > 0) {
val dateFormat = SimpleDateFormat("MMMM dd, yyyy 'at' h:mma", Locale.US)
dateFormat.format(Date(lastUpdateTime))
} else {
"Never"
}
}
}

View File

@@ -60,7 +60,7 @@ class ApkUpdateJob private constructor(parameters: Parameters) : BaseJob(paramet
return
}
Log.i(TAG, "Checking for APK update...")
Log.d(TAG, "Checking for APK update at ${BuildConfig.APK_UPDATE_MANIFEST_URL}")
val client = OkHttpClient()
val request = Request.Builder().url(BuildConfig.APK_UPDATE_MANIFEST_URL).build()
@@ -78,10 +78,11 @@ class ApkUpdateJob private constructor(parameters: Parameters) : BaseJob(paramet
Log.w(TAG, "Invalid update descriptor! $updateDescriptor")
return
} else {
Log.i(TAG, "Got descriptor: $updateDescriptor")
Log.d(TAG, "Got descriptor: $updateDescriptor")
}
if (updateDescriptor.versionCode > getCurrentAppVersionCode()) {
Log.i(TAG, "Newer version code available. Current: ${getCurrentAppVersionCode()}, Update: ${updateDescriptor.versionCode}")
val digest: ByteArray = Hex.fromStringCondensed(updateDescriptor.digest)
val downloadStatus: DownloadStatus = getDownloadStatus(updateDescriptor.url, digest)
@@ -94,7 +95,11 @@ class ApkUpdateJob private constructor(parameters: Parameters) : BaseJob(paramet
Log.i(TAG, "Download status missing, starting download...")
handleDownloadStart(updateDescriptor.url, updateDescriptor.versionName, digest)
}
} else {
Log.d(TAG, "Version code is the same or older than our own. Current: ${getCurrentAppVersionCode()}, Update: ${updateDescriptor.versionCode}")
}
SignalStore.apkUpdate().lastSuccessfulCheck = System.currentTimeMillis()
}
public override fun onShouldRetry(e: Exception): Boolean {

View File

@@ -10,6 +10,7 @@ internal class ApkUpdateValues(store: KeyValueStore) : SignalStoreValues(store)
private const val DOWNLOAD_ID = "apk_update.download_id"
private const val DIGEST = "apk_update.digest"
private const val AUTO_UPDATE = "apk_update.auto_update"
private const val LAST_SUCCESSFUL_CHECK = "apk_update.last_successful_check"
}
override fun onFirstEverAppLaunch() = Unit
@@ -17,7 +18,8 @@ internal class ApkUpdateValues(store: KeyValueStore) : SignalStoreValues(store)
val downloadId: Long by longValue(DOWNLOAD_ID, -2)
val digest: ByteArray? get() = store.getBlob(DIGEST, null)
val autoUpdate: Boolean by booleanValue(AUTO_UPDATE, true)
var autoUpdate: Boolean by booleanValue(AUTO_UPDATE, true)
var lastSuccessfulCheck: Long by longValue(LAST_SUCCESSFUL_CHECK, 0)
fun setDownloadAttributes(id: Long, digest: ByteArray?) {
store

View File

@@ -91,6 +91,9 @@ public class LogSectionSystemInfo implements LogSection {
builder.append("User-Agent : ").append(StandardUserAgentInterceptor.USER_AGENT).append("\n");
builder.append("SlowNotifications : ").append(SlowNotificationHeuristics.isHavingDelayedNotifications()).append("\n");
builder.append("PotentiallyBattery: ").append(SlowNotificationHeuristics.isPotentiallyCausedByBatteryOptimizations()).append("\n");
if (BuildConfig.MANAGES_APP_UPDATES) {
builder.append("ApkManifestUrl : ").append(BuildConfig.APK_UPDATE_MANIFEST_URL).append("\n");
}
builder.append("App : ");
try {