ui: refactor AddTunnelsSheet's selection communication
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
This commit is contained in:
parent
e99ccf9013
commit
306d0648c6
@ -12,13 +12,13 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.ViewTreeObserver
|
import android.view.ViewTreeObserver
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
|
import androidx.core.os.bundleOf
|
||||||
|
import androidx.fragment.app.setFragmentResult
|
||||||
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
import com.google.android.material.bottomsheet.BottomSheetBehavior
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialog
|
import com.google.android.material.bottomsheet.BottomSheetDialog
|
||||||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
|
||||||
import com.google.zxing.integration.android.IntentIntegrator
|
|
||||||
import com.wireguard.android.R
|
import com.wireguard.android.R
|
||||||
import com.wireguard.android.activity.TunnelCreatorActivity
|
import com.wireguard.android.activity.TunnelCreatorActivity
|
||||||
import com.wireguard.android.util.requireTargetFragment
|
|
||||||
import com.wireguard.android.util.resolveAttribute
|
import com.wireguard.android.util.resolveAttribute
|
||||||
|
|
||||||
class AddTunnelsSheet : BottomSheetDialogFragment() {
|
class AddTunnelsSheet : BottomSheetDialogFragment() {
|
||||||
@ -82,23 +82,22 @@ class AddTunnelsSheet : BottomSheetDialogFragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun onRequestCreateConfig() {
|
private fun onRequestCreateConfig() {
|
||||||
startActivity(Intent(activity, TunnelCreatorActivity::class.java))
|
setFragmentResult(REQUEST_KEY_NEW_TUNNEL, bundleOf(REQUEST_METHOD to REQUEST_CREATE))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onRequestImportConfig() {
|
private fun onRequestImportConfig() {
|
||||||
val intent = Intent(Intent.ACTION_GET_CONTENT).apply {
|
setFragmentResult(REQUEST_KEY_NEW_TUNNEL, bundleOf(REQUEST_METHOD to REQUEST_IMPORT))
|
||||||
addCategory(Intent.CATEGORY_OPENABLE)
|
|
||||||
type = "*/*"
|
|
||||||
}
|
|
||||||
requireTargetFragment().startActivityForResult(intent, TunnelListFragment.REQUEST_IMPORT)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onRequestScanQRCode() {
|
private fun onRequestScanQRCode() {
|
||||||
val integrator = IntentIntegrator.forSupportFragment(requireTargetFragment()).apply {
|
setFragmentResult(REQUEST_KEY_NEW_TUNNEL, bundleOf(REQUEST_METHOD to REQUEST_SCAN))
|
||||||
setOrientationLocked(false)
|
}
|
||||||
setBeepEnabled(false)
|
|
||||||
setPrompt(getString(R.string.qr_code_hint))
|
companion object {
|
||||||
}
|
const val REQUEST_KEY_NEW_TUNNEL = "request_new_tunnel"
|
||||||
integrator.initiateScan(listOf(IntentIntegrator.QR_CODE))
|
const val REQUEST_METHOD = "request_method"
|
||||||
|
const val REQUEST_CREATE = "request_create"
|
||||||
|
const val REQUEST_IMPORT = "request_import"
|
||||||
|
const val REQUEST_SCAN = "request_scan"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,6 @@
|
|||||||
*/
|
*/
|
||||||
package com.wireguard.android.fragment
|
package com.wireguard.android.fragment
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
@ -19,6 +17,7 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.view.animation.Animation
|
import android.view.animation.Animation
|
||||||
import android.view.animation.AnimationUtils
|
import android.view.animation.AnimationUtils
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.appcompat.view.ActionMode
|
import androidx.appcompat.view.ActionMode
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
@ -26,6 +25,7 @@ import com.google.android.material.snackbar.Snackbar
|
|||||||
import com.google.zxing.integration.android.IntentIntegrator
|
import com.google.zxing.integration.android.IntentIntegrator
|
||||||
import com.wireguard.android.Application
|
import com.wireguard.android.Application
|
||||||
import com.wireguard.android.R
|
import com.wireguard.android.R
|
||||||
|
import com.wireguard.android.activity.TunnelCreatorActivity
|
||||||
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
|
import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler
|
||||||
import com.wireguard.android.databinding.TunnelListFragmentBinding
|
import com.wireguard.android.databinding.TunnelListFragmentBinding
|
||||||
import com.wireguard.android.databinding.TunnelListItemBinding
|
import com.wireguard.android.databinding.TunnelListItemBinding
|
||||||
@ -61,6 +61,15 @@ class TunnelListFragment : BaseFragment() {
|
|||||||
private val actionModeListener = ActionModeListener()
|
private val actionModeListener = ActionModeListener()
|
||||||
private var actionMode: ActionMode? = null
|
private var actionMode: ActionMode? = null
|
||||||
private var binding: TunnelListFragmentBinding? = null
|
private var binding: TunnelListFragmentBinding? = null
|
||||||
|
private val tunnelFileImportResultLauncher = registerForActivityResult(ActivityResultContracts.GetContent()) { data ->
|
||||||
|
importTunnel(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val qrImportResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
|
||||||
|
val qrCode = IntentIntegrator.parseActivityResult(result.resultCode, result.data)
|
||||||
|
qrCode?.contents?.let { importTunnel(it) }
|
||||||
|
}
|
||||||
|
|
||||||
private fun importTunnel(configText: String) {
|
private fun importTunnel(configText: String) {
|
||||||
try {
|
try {
|
||||||
// Ensure the config text is parseable before proceeding…
|
// Ensure the config text is parseable before proceeding…
|
||||||
@ -173,33 +182,31 @@ class TunnelListFragment : BaseFragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
|
||||||
when (requestCode) {
|
|
||||||
REQUEST_IMPORT -> {
|
|
||||||
if (resultCode == Activity.RESULT_OK && data != null) importTunnel(data.data)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
IntentIntegrator.REQUEST_CODE -> {
|
|
||||||
val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
|
|
||||||
if (result != null && result.contents != null) {
|
|
||||||
importTunnel(result.contents)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
else -> super.onActivityResult(requestCode, resultCode, data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("ClickableViewAccessibility")
|
|
||||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
|
||||||
savedInstanceState: Bundle?): View? {
|
savedInstanceState: Bundle?): View? {
|
||||||
super.onCreateView(inflater, container, savedInstanceState)
|
super.onCreateView(inflater, container, savedInstanceState)
|
||||||
binding = TunnelListFragmentBinding.inflate(inflater, container, false)
|
binding = TunnelListFragmentBinding.inflate(inflater, container, false)
|
||||||
|
val bottomSheet = AddTunnelsSheet()
|
||||||
binding?.apply {
|
binding?.apply {
|
||||||
createFab.setOnClickListener {
|
createFab.setOnClickListener {
|
||||||
val bottomSheet = AddTunnelsSheet()
|
childFragmentManager.setFragmentResultListener(AddTunnelsSheet.REQUEST_KEY_NEW_TUNNEL, viewLifecycleOwner) { _, bundle ->
|
||||||
bottomSheet.setTargetFragment(fragment, REQUEST_TARGET_FRAGMENT)
|
when (bundle.getString(AddTunnelsSheet.REQUEST_METHOD)) {
|
||||||
bottomSheet.show(parentFragmentManager, "BOTTOM_SHEET")
|
AddTunnelsSheet.REQUEST_CREATE -> {
|
||||||
|
startActivity(Intent(requireActivity(), TunnelCreatorActivity::class.java))
|
||||||
|
}
|
||||||
|
AddTunnelsSheet.REQUEST_IMPORT -> {
|
||||||
|
tunnelFileImportResultLauncher.launch("*/*")
|
||||||
|
}
|
||||||
|
AddTunnelsSheet.REQUEST_SCAN -> {
|
||||||
|
qrImportResultLauncher.launch(IntentIntegrator(requireActivity())
|
||||||
|
.setOrientationLocked(false)
|
||||||
|
.setBeepEnabled(false)
|
||||||
|
.setPrompt(getString(R.string.qr_code_hint))
|
||||||
|
.createScanIntent())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bottomSheet.show(childFragmentManager, "BOTTOM_SHEET")
|
||||||
}
|
}
|
||||||
executePendingBindings()
|
executePendingBindings()
|
||||||
setUpRoot(root as ViewGroup)
|
setUpRoot(root as ViewGroup)
|
||||||
|
@ -8,7 +8,6 @@ package com.wireguard.android.util
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import androidx.annotation.AttrRes
|
import androidx.annotation.AttrRes
|
||||||
import androidx.fragment.app.Fragment
|
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import com.wireguard.android.Application
|
import com.wireguard.android.Application
|
||||||
@ -21,10 +20,6 @@ fun Context.resolveAttribute(@AttrRes attrRes: Int): Int {
|
|||||||
return typedValue.data
|
return typedValue.data
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Fragment.requireTargetFragment(): Fragment {
|
|
||||||
return requireNotNull(targetFragment) { "A target fragment should always be set for $this" }
|
|
||||||
}
|
|
||||||
|
|
||||||
val Any.applicationScope: CoroutineScope
|
val Any.applicationScope: CoroutineScope
|
||||||
get() = Application.getCoroutineScope()
|
get() = Application.getCoroutineScope()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user