Add import profile from file

This commit is contained in:
世界
2024-03-17 01:00:21 +08:00
parent 720b5621d2
commit ae7166a699
14 changed files with 105 additions and 14 deletions

View File

@@ -2,10 +2,12 @@ package io.nekohasekai.sfa.ui.main
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.PopupMenu
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@@ -84,12 +86,18 @@ class ConfigurationFragment : Fragment() {
class AddProfileDialog : BottomSheetDialogFragment(R.layout.sheet_add_profile) {
private val importFromFile =
registerForActivityResult(ActivityResultContracts.GetContent(), ::onImportResult)
private val scanQrCode =
registerForActivityResult(QRScanActivity.Contract(), ::onScanResult)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val binding = SheetAddProfileBinding.bind(view)
binding.importFromFile.setOnClickListener {
importFromFile.launch("*/*")
}
binding.scanQrCode.setOnClickListener {
scanQrCode.launch(null)
}
@@ -99,6 +107,11 @@ class ConfigurationFragment : Fragment() {
}
}
private fun onImportResult(result: Uri?) {
dismiss()
(activity as? MainActivity ?: return).onNewIntent(Intent(Intent.ACTION_VIEW, result))
}
private fun onScanResult(result: Intent?) {
dismiss()
(activity as? MainActivity ?: return).onNewIntent(result ?: return)

View File

@@ -15,7 +15,9 @@ import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageAnalysis
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.camera.view.PreviewView
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import io.nekohasekai.libbox.Libbox
import io.nekohasekai.sfa.R
@@ -36,6 +38,13 @@ class QRScanActivity : AbstractActivity<ActivityQrScanBinding>() {
setTitle(R.string.profile_add_scan_qr_code)
analysisExecutor = Executors.newSingleThreadExecutor()
binding.previewView.implementationMode = PreviewView.ImplementationMode.COMPATIBLE
binding.previewView.previewStreamState.observe(this) {
if (it === PreviewView.StreamState.STREAMING) {
binding.progress.isVisible = false
binding.previewView.implementationMode = PreviewView.ImplementationMode.PERFORMANCE
}
}
if (ContextCompat.checkSelfPermission(
this, Manifest.permission.CAMERA
) == PackageManager.PERMISSION_GRANTED

View File

@@ -30,10 +30,13 @@ import io.nekohasekai.sfa.databinding.ViewAppListItemBinding
import io.nekohasekai.sfa.ktx.clipboardText
import io.nekohasekai.sfa.ui.shared.AbstractActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.File
import java.util.concurrent.atomic.AtomicInteger
import java.util.zip.ZipFile
class PerAppProxyActivity : AbstractActivity<ActivityPerAppProxyBinding>() {
@@ -530,18 +533,26 @@ class PerAppProxyActivity : AbstractActivity<ActivityPerAppProxyBinding>() {
).setView(binding.root).setCancelable(false).create()
progress.show()
lifecycleScope.launch {
val foundApps = withContext(Dispatchers.IO) {
val startTime = System.currentTimeMillis()
val foundApps = withContext(Dispatchers.Default) {
mutableMapOf<String, PackageCache>().also { foundApps ->
currentPackages.forEachIndexed { index, it ->
if (scanChinaPackage(it.packageName)) {
foundApps[it.packageName] = it
val progressInt = AtomicInteger()
currentPackages.map { it ->
async {
if (scanChinaPackage(it.packageName)) {
foundApps[it.packageName] = it
}
runOnUiThread {
binding.progress.progress = progressInt.addAndGet(1)
}
}
withContext(Dispatchers.Main) {
binding.progress.progress = index + 1
}
}
}.awaitAll()
}
}
Log.d(
"PerAppProxyActivity",
"Scan China apps took ${(System.currentTimeMillis() - startTime).toDouble() / 1000}s"
)
withContext(Dispatchers.Main) {
progress.dismiss()
if (foundApps.isEmpty()) {