From e99ccf901312a0c4f995b2f286feb0fd87ad9c88 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 17 Sep 2020 17:52:12 +0530 Subject: ui: refactor AppListDialogFragment's selection communication Signed-off-by: Harsh Shandilya --- .../android/fragment/AppListDialogFragment.kt | 22 ++++++------ .../android/fragment/TunnelEditorFragment.kt | 42 +++++++++++----------- 2 files changed, 31 insertions(+), 33 deletions(-) (limited to 'ui/src/main/java/com/wireguard/android') diff --git a/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt b/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt index 88701ec3..7a51a757 100644 --- a/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt +++ b/ui/src/main/java/com/wireguard/android/fragment/AppListDialogFragment.kt @@ -10,9 +10,10 @@ import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.appcompat.app.AlertDialog +import androidx.core.os.bundleOf import androidx.databinding.Observable import androidx.fragment.app.DialogFragment -import androidx.fragment.app.Fragment +import androidx.fragment.app.setFragmentResult import androidx.lifecycle.lifecycleScope import com.google.android.material.tabs.TabLayout import com.wireguard.android.BR @@ -21,7 +22,6 @@ import com.wireguard.android.databinding.AppListDialogFragmentBinding import com.wireguard.android.databinding.ObservableKeyedArrayList import com.wireguard.android.model.ApplicationData import com.wireguard.android.util.ErrorMessages -import com.wireguard.android.util.requireTargetFragment import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -73,7 +73,6 @@ class AppListDialogFragment : DialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - require(requireTargetFragment() is AppSelectionListener) { "${requireTargetFragment()} must implement AppSelectionListener" } currentlySelectedApps = (arguments?.getStringArrayList(KEY_SELECTED_APPS) ?: emptyList()) initiallyExcluded = arguments?.getBoolean(KEY_IS_EXCLUDED) ?: true } @@ -130,23 +129,22 @@ class AppListDialogFragment : DialogFragment() { selectedApps.add(data.packageName) } } - (requireTargetFragment() as AppSelectionListener).onSelectedAppsSelected(selectedApps, tabs?.selectedTabPosition == 0) + setFragmentResult(REQUEST_SELECTION, bundleOf( + KEY_SELECTED_APPS to selectedApps.toTypedArray(), + KEY_IS_EXCLUDED to (tabs?.selectedTabPosition == 0) + )) dismiss() } - interface AppSelectionListener { - fun onSelectedAppsSelected(selectedApps: List, isExcluded: Boolean) - } - companion object { - private const val KEY_SELECTED_APPS = "selected_apps" - private const val KEY_IS_EXCLUDED = "is_excluded" - fun newInstance(selectedApps: ArrayList?, isExcluded: Boolean, target: T): AppListDialogFragment where T : Fragment?, T : AppSelectionListener? { + const val KEY_SELECTED_APPS = "selected_apps" + const val KEY_IS_EXCLUDED = "is_excluded" + const val REQUEST_SELECTION = "request_selection" + fun newInstance(selectedApps: ArrayList?, isExcluded: Boolean): AppListDialogFragment { val extras = Bundle() extras.putStringArrayList(KEY_SELECTED_APPS, selectedApps) extras.putBoolean(KEY_IS_EXCLUDED, isExcluded) val fragment = AppListDialogFragment() - fragment.setTargetFragment(target, 0) fragment.arguments = extras return fragment } diff --git a/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt b/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt index bb09c5eb..f26862ac 100644 --- a/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt +++ b/ui/src/main/java/com/wireguard/android/fragment/TunnelEditorFragment.kt @@ -24,7 +24,6 @@ import com.wireguard.android.Application import com.wireguard.android.R import com.wireguard.android.backend.Tunnel import com.wireguard.android.databinding.TunnelEditorFragmentBinding -import com.wireguard.android.fragment.AppListDialogFragment.AppSelectionListener import com.wireguard.android.model.ObservableTunnel import com.wireguard.android.util.AdminKnobs import com.wireguard.android.util.BiometricAuthenticator @@ -38,7 +37,7 @@ import kotlinx.coroutines.launch /** * Fragment for editing a WireGuard configuration. */ -class TunnelEditorFragment : BaseFragment(), AppSelectionListener { +class TunnelEditorFragment : BaseFragment() { private var haveShownKeys = false private var binding: TunnelEditorFragmentBinding? = null private var tunnel: ObservableTunnel? = null @@ -91,23 +90,6 @@ class TunnelEditorFragment : BaseFragment(), AppSelectionListener { super.onDestroyView() } - override fun onSelectedAppsSelected(selectedApps: List, isExcluded: Boolean) { - requireNotNull(binding) { "Tried to set excluded/included apps while no view was loaded" } - if (isExcluded) { - binding!!.config!!.`interface`.includedApplications.clear() - binding!!.config!!.`interface`.excludedApplications.apply { - clear() - addAll(selectedApps) - } - } else { - binding!!.config!!.`interface`.excludedApplications.clear() - binding!!.config!!.`interface`.includedApplications.apply { - clear() - addAll(selectedApps) - } - } - } - private fun onFinished() { // Hide the keyboard; it rarely goes away on its own. val activity = activity ?: return @@ -183,8 +165,26 @@ class TunnelEditorFragment : BaseFragment(), AppSelectionListener { if (selectedApps.isNotEmpty()) isExcluded = false } - val fragment = AppListDialogFragment.newInstance(selectedApps, isExcluded, this) - fragment.show(parentFragmentManager, null) + val fragment = AppListDialogFragment.newInstance(selectedApps, isExcluded) + childFragmentManager.setFragmentResultListener(AppListDialogFragment.REQUEST_SELECTION, viewLifecycleOwner) { _, bundle -> + requireNotNull(binding) { "Tried to set excluded/included apps while no view was loaded" } + val newSelections = requireNotNull(bundle.getStringArray(AppListDialogFragment.KEY_SELECTED_APPS)) + val excluded = requireNotNull(bundle.getBoolean(AppListDialogFragment.KEY_IS_EXCLUDED)) + if (excluded) { + binding!!.config!!.`interface`.includedApplications.clear() + binding!!.config!!.`interface`.excludedApplications.apply { + clear() + addAll(newSelections) + } + } else { + binding!!.config!!.`interface`.excludedApplications.clear() + binding!!.config!!.`interface`.includedApplications.apply { + clear() + addAll(newSelections) + } + } + } + fragment.show(childFragmentManager, null) } } -- cgit v1.2.3