Add import profile from file
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user