Skip to content

Commit 4156b83

Browse files
committed
ui: bifurcate only parts of release but nag about wrong context
Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent f829b8a commit 4156b83

File tree

5 files changed

+65
-7
lines changed

5 files changed

+65
-7
lines changed

ui/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ android {
4949
applicationIdSuffix = ".debug"
5050
versionNameSuffix = "-debug"
5151
}
52+
create("googleplay") {
53+
initWith(getByName("release"))
54+
matchingFallbacks += "release"
55+
}
5256
}
5357
lint {
5458
disable += "LongLogTag"

ui/src/googleplay/AndroidManifest.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools">
4+
5+
<uses-permission
6+
android:name="android.permission.REQUEST_INSTALL_PACKAGES"
7+
tools:node="remove" />
8+
</manifest>

ui/src/main/java/com/wireguard/android/updater/SnackbarUpdateShower.kt

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55

66
package com.wireguard.android.updater
77

8+
import android.content.Intent
9+
import android.net.Uri
810
import android.view.View
11+
import android.widget.Toast
912
import androidx.activity.result.contract.ActivityResultContracts
1013
import androidx.fragment.app.Fragment
1114
import androidx.lifecycle.lifecycleScope
@@ -27,10 +30,11 @@ class SnackbarUpdateShower(private val fragment: Fragment) {
2730
}
2831

2932
private class SwapableSnackbar(fragment: Fragment, view: View, anchor: View?) {
30-
val actionSnackbar = makeSnackbar(fragment, view, anchor)
31-
val statusSnackbar = makeSnackbar(fragment, view, anchor)
32-
var showingAction: Boolean = false
33-
var showingStatus: Boolean = false
33+
private val actionSnackbar = makeSnackbar(fragment, view, anchor)
34+
private val statusSnackbar = makeSnackbar(fragment, view, anchor)
35+
private var showingAction: Boolean = false
36+
private var showingStatus: Boolean = false
37+
private var permanentAction: Boolean = false
3438

3539
private fun makeSnackbar(fragment: Fragment, view: View, anchor: View?): Snackbar {
3640
val snackbar = Snackbar.make(fragment.requireContext(), view, "", Snackbar.LENGTH_INDEFINITE)
@@ -45,7 +49,7 @@ class SnackbarUpdateShower(private val fragment: Fragment) {
4549
snackbar.addCallback(object : BaseTransientBottomBar.BaseCallback<Snackbar>() {
4650
override fun onDismissed(snackbar: Snackbar?, @DismissEvent event: Int) {
4751
super.onDismissed(snackbar, event)
48-
if (event == DISMISS_EVENT_MANUAL || event == DISMISS_EVENT_ACTION ||
52+
if (event == DISMISS_EVENT_MANUAL || (event == DISMISS_EVENT_ACTION && !permanentAction) ||
4953
(snackbar == actionSnackbar && !showingAction) || (snackbar == statusSnackbar && !showingStatus)
5054
)
5155
return
@@ -58,11 +62,12 @@ class SnackbarUpdateShower(private val fragment: Fragment) {
5862
return snackbar
5963
}
6064

61-
fun showAction(text: String, action: String, listener: View.OnClickListener) {
65+
fun showAction(text: String, action: String, permanent: Boolean = false, listener: View.OnClickListener) {
6266
if (showingStatus) {
6367
showingStatus = false
6468
statusSnackbar.dismiss()
6569
}
70+
permanentAction = permanent
6671
actionSnackbar.setText(text)
6772
actionSnackbar.setAction(action, listener)
6873
if (!showingAction) {
@@ -141,6 +146,18 @@ class SnackbarUpdateShower(private val fragment: Fragment) {
141146
delay(5.seconds)
142147
progress.retry()
143148
}
149+
150+
is Updater.Progress.Corrupt -> {
151+
snackbar.showAction(context.getString(R.string.updater_corrupt), context.getString(R.string.updater_corrupt_navigate), true) {
152+
val intent = Intent(Intent.ACTION_VIEW)
153+
intent.data = Uri.parse(progress.downloadUrl)
154+
try {
155+
context.startActivity(intent)
156+
} catch (e: Throwable) {
157+
Toast.makeText(context, ErrorMessages[e], Toast.LENGTH_SHORT).show()
158+
}
159+
}
160+
}
144161
}
145162
}.launchIn(fragment.lifecycleScope)
146163
}

ui/src/main/java/com/wireguard/android/updater/Updater.kt

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
*/
55
package com.wireguard.android.updater
66

7+
import android.Manifest
78
import android.app.PendingIntent
89
import android.content.BroadcastReceiver
910
import android.content.Context
1011
import android.content.Intent
1112
import android.content.IntentFilter
1213
import android.content.pm.PackageInstaller
14+
import android.content.pm.PackageManager
1315
import android.os.Build
1416
import android.util.Base64
1517
import android.util.Log
@@ -116,6 +118,11 @@ object Updater {
116118
}
117119
}
118120
}
121+
122+
class Corrupt(private val betterFile: String?) : Progress() {
123+
val downloadUrl: String
124+
get() = UPDATE_URL_FMT.format(betterFile ?: "")
125+
}
119126
}
120127

121128
private val mutableState = MutableStateFlow<Progress>(Progress.Complete)
@@ -357,9 +364,29 @@ object Updater {
357364
}
358365

359366
fun monitorForUpdates() {
360-
if (installerIsGooglePlay(Application.get()))
367+
val context = Application.get()
368+
369+
if (installerIsGooglePlay(context))
361370
return
362371

372+
if (!if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
373+
@Suppress("DEPRECATION")
374+
context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS)
375+
} else {
376+
context.packageManager.getPackageInfo(context.packageName, PackageManager.PackageInfoFlags.of(PackageManager.GET_PERMISSIONS.toLong()))
377+
}.requestedPermissions.contains(Manifest.permission.REQUEST_INSTALL_PACKAGES)
378+
) {
379+
updaterScope.launch {
380+
val update = try {
381+
checkForUpdates()
382+
} catch (_: Throwable) {
383+
null
384+
}
385+
emitProgress(Progress.Corrupt(update?.fileName))
386+
}
387+
return
388+
}
389+
363390
updaterScope.launch {
364391
if (UserKnobs.updaterNewerVersionSeen.firstOrNull()?.let { Version(it) > CURRENT_VERSION } == true)
365392
return@launch

ui/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@
236236
<string name="updater_download_progress_nototal">Downloading update: %s</string>
237237
<string name="updater_installing">Installing update…</string>
238238
<string name="updater_failure">Update failure: %s. Will retry momentarily…</string>
239+
<string name="updater_corrupt">This application is corrupt. Please re-download it.</string>
240+
<string name="updater_corrupt_navigate">Open Website</string>
239241
<string name="version_summary">%1$s backend %2$s</string>
240242
<string name="version_summary_checking">Checking %s backend version</string>
241243
<string name="version_summary_unknown">Unknown %s version</string>

0 commit comments

Comments
 (0)