Support install CI apk

This commit is contained in:
tarsin committed 2023-07-05 10:47:36 +08:00
1 parent 79e0b33aad
commit 0b95c340d6
4 files changed
+47 -1

No files matched your search

+1
View File
@@ -13,6 +13,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="28" />
@@ -18,6 +18,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.core.text.parseAsHtml
import com.hippo.ehviewer.AppConfig
@@ -28,8 +29,10 @@ import com.hippo.ehviewer.client.execute
import com.hippo.ehviewer.ui.LICENSE_SCREEN
import com.hippo.ehviewer.ui.LocalNavController
import com.hippo.ehviewer.ui.tools.toAnnotatedString
import com.hippo.ehviewer.util.installPackage
import com.hippo.ehviewer.util.iter
import com.hippo.ehviewer.yorozuya.FileUtils
import eu.kanade.tachiyomi.util.lang.withUIContext
import io.ktor.util.encodeBase64
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -52,6 +55,7 @@ private fun author() = stringResource(R.string.settings_about_author_summary).re
@Composable
fun AboutScreen() {
val context = LocalContext.current
val navController = LocalNavController.current
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
val snackbarHostState = remember { SnackbarHostState() }
@@ -117,8 +121,8 @@ fun AboutScreen() {
}
}?.getString("archive_download_url")
if (archiveUrl != null) {
val file = FileUtils.createTempFile(AppConfig.tempDir, "apk")!!
ghRequest(archiveUrl).execute {
val file = FileUtils.createTempFile(AppConfig.tempDir, "apk")!!
ZipInputStream(body.byteStream()).use { zip ->
zip.nextEntry
file.outputStream().use {
@@ -126,6 +130,7 @@ fun AboutScreen() {
}
}
}
withUIContext { context.installPackage(file) }
} else {
launchSnackBar("CI is still running, please wait")
}
@@ -1,9 +1,12 @@
package com.hippo.ehviewer.util
import android.Manifest
import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.provider.Settings
import androidx.activity.ComponentActivity
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.PickVisualMediaRequest
@@ -11,12 +14,14 @@ import androidx.activity.result.contract.ActivityResultContract
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType
import androidx.core.content.ContextCompat
import androidx.core.content.FileProvider
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
import androidx.lifecycle.LifecycleOwner
import arrow.atomic.AtomicInt
import eu.kanade.tachiyomi.util.lang.withUIContext
import rikka.core.util.ContextUtils.requireActivity
import java.io.File
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
@@ -67,3 +72,34 @@ suspend fun Context.requestPermission(key: String): Boolean {
}
suspend fun Context.pickVisualMedia(type: VisualMediaType): Uri? = awaitActivityResult(ActivityResultContracts.PickVisualMedia(), PickVisualMediaRequest.Builder().setMediaType(type).build())
suspend fun Context.requestInstallPermission(): Boolean {
if (packageManager.canRequestPackageInstalls()) return true
val granted = requestPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES)
if (!granted) {
awaitActivityResult(
ActivityResultContracts.StartActivityForResult(),
Intent(
Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES,
Uri.parse("package:$packageName"),
),
)
requestPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES)
}
return packageManager.canRequestPackageInstalls()
}
suspend fun Context.installPackage(file: File) {
val canInstall = requestInstallPermission()
if (canInstall) {
val contentUri = FileProvider.getUriForFile(this, "$packageName.fileprovider", file)
val intent = Intent(Intent.ACTION_VIEW).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
setDataAndType(contentUri, "application/vnd.android.package-archive")
}
if (packageManager.queryIntentActivities(intent, 0).size > 0) {
startActivity(intent)
}
}
}
+4
View File
@@ -20,6 +20,10 @@
name="temp"
path="." />
<cache-path
name="temp"
path="." />
<external-cache-path
name="copy"
path="." />