From fd557a60e60df193e80abedc97e60f5292080069 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 14 Feb 2024 20:04:51 +0530 Subject: [PATCH] WiFiNetwork: Extract WiFi dialog logic to separate fragment Signed-off-by: Aayush Gupta --- .../app/opass/ccip/model/WifiNetworkInfo.kt | 5 +- .../java/app/opass/ccip/ui/MainActivity.kt | 57 ++------------- .../WiFiNetworkAdapter.kt} | 2 +- .../opass/ccip/ui/wifi/WiFiNetworkFragment.kt | 69 +++++++++++++++++++ 4 files changed, 78 insertions(+), 55 deletions(-) rename app/src/main/java/app/opass/ccip/ui/{WifiNetworkAdapter.kt => wifi/WiFiNetworkAdapter.kt} (98%) create mode 100644 app/src/main/java/app/opass/ccip/ui/wifi/WiFiNetworkFragment.kt diff --git a/app/src/main/java/app/opass/ccip/model/WifiNetworkInfo.kt b/app/src/main/java/app/opass/ccip/model/WifiNetworkInfo.kt index 451689f4..eee28147 100644 --- a/app/src/main/java/app/opass/ccip/model/WifiNetworkInfo.kt +++ b/app/src/main/java/app/opass/ccip/model/WifiNetworkInfo.kt @@ -1,10 +1,13 @@ package app.opass.ccip.model +import android.os.Parcelable import com.google.gson.annotations.SerializedName +import kotlinx.parcelize.Parcelize +@Parcelize data class WifiNetworkInfo( @SerializedName("SSID") val ssid: String, @SerializedName("password") val password: String? -) +) : Parcelable diff --git a/app/src/main/java/app/opass/ccip/ui/MainActivity.kt b/app/src/main/java/app/opass/ccip/ui/MainActivity.kt index d965d68a..8df18b4c 100644 --- a/app/src/main/java/app/opass/ccip/ui/MainActivity.kt +++ b/app/src/main/java/app/opass/ccip/ui/MainActivity.kt @@ -1,8 +1,6 @@ package app.opass.ccip.ui import android.app.Activity -import android.content.ClipData -import android.content.ClipboardManager import android.content.Intent import android.content.res.Configuration import android.os.Bundle @@ -12,11 +10,9 @@ import android.widget.ImageView import android.widget.RelativeLayout import android.widget.TextView import androidx.appcompat.app.ActionBarDrawerToggle -import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout -import androidx.core.content.getSystemService import androidx.core.net.toUri import androidx.core.view.GravityCompat import androidx.core.view.updatePadding @@ -30,19 +26,17 @@ import app.opass.ccip.extension.setOnApplyWindowInsetsListenerCompat import app.opass.ccip.extension.updateMargin import app.opass.ccip.model.Feature import app.opass.ccip.model.FeatureType -import app.opass.ccip.model.WifiNetworkInfo import app.opass.ccip.network.PortalClient import app.opass.ccip.ui.announcement.AnnouncementFragment import app.opass.ccip.ui.event.EventActivity import app.opass.ccip.ui.fastpass.FastPassFragment import app.opass.ccip.ui.fastpass.MyTicketFragment import app.opass.ccip.ui.schedule.ScheduleTabFragment +import app.opass.ccip.ui.wifi.WiFiNetworkFragment import app.opass.ccip.util.CryptoUtil import app.opass.ccip.util.PreferenceUtil -import app.opass.ccip.util.WifiUtil import coil.load import com.google.android.material.navigation.NavigationView -import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -275,7 +269,9 @@ class MainActivity : AppCompatActivity(), CoroutineScope { val feature = item.origFeature if (item.shouldShowLaunchIcon) return this.startActivity(Intent(Intent.ACTION_VIEW, feature.url!!.toUri())) if (feature.feature == FeatureType.WIFI) { - feature.wifiNetworks?.let(::showWifiDialog) + feature.wifiNetworks?.let { + WiFiNetworkFragment.show(it, supportFragmentManager) + } mDrawerLayout.closeDrawers() return } @@ -309,51 +305,6 @@ class MainActivity : AppCompatActivity(), CoroutineScope { mDrawerLayout.closeDrawers() } - private fun onWifiSelected(info: WifiNetworkInfo) { - val success = WifiUtil.installNetwork(this, info) - if (success) { - Snackbar - .make(mDrawerLayout, R.string.wifi_saved, Snackbar.LENGTH_SHORT) - .setAnchorView(navbarAnchor) - .show() - } else { - val hasPassword = !info.password.isNullOrEmpty() - if (!hasPassword) { - Snackbar - .make(mDrawerLayout, R.string.failed_to_save_wifi, Snackbar.LENGTH_LONG) - .setAnchorView(navbarAnchor) - .show() - return - } - - getSystemService()?.run { - setPrimaryClip(ClipData.newPlainText("", info.password)) - } ?: return - Snackbar - .make(mDrawerLayout, R.string.failed_to_save_wifi_copied_to_clipboard, Snackbar.LENGTH_LONG) - .setAnchorView(navbarAnchor) - .show() - } - } - - private fun showWifiDialog(networks: List) { - val dialog = AlertDialog.Builder(this).setTitle(R.string.choose_network_to_connect).create() - val rv = RecyclerView(this).apply { - layoutParams = RecyclerView.LayoutParams( - RecyclerView.LayoutParams.MATCH_PARENT, - RecyclerView.LayoutParams.MATCH_PARENT - ) - layoutManager = LinearLayoutManager(this@MainActivity) - adapter = WifiNetworkAdapter(networks) { info -> - dialog.dismiss() - onWifiSelected(info) - } - } - - dialog.setView(rv) - dialog.show() - } - private fun isFeatureValid(f: Feature) : Boolean { return when (f.feature) { FeatureType.FAST_PASS, diff --git a/app/src/main/java/app/opass/ccip/ui/WifiNetworkAdapter.kt b/app/src/main/java/app/opass/ccip/ui/wifi/WiFiNetworkAdapter.kt similarity index 98% rename from app/src/main/java/app/opass/ccip/ui/WifiNetworkAdapter.kt rename to app/src/main/java/app/opass/ccip/ui/wifi/WiFiNetworkAdapter.kt index 71fc2dde..5e2bcf96 100644 --- a/app/src/main/java/app/opass/ccip/ui/WifiNetworkAdapter.kt +++ b/app/src/main/java/app/opass/ccip/ui/wifi/WiFiNetworkAdapter.kt @@ -1,4 +1,4 @@ -package app.opass.ccip.ui +package app.opass.ccip.ui.wifi import android.view.LayoutInflater import android.view.View diff --git a/app/src/main/java/app/opass/ccip/ui/wifi/WiFiNetworkFragment.kt b/app/src/main/java/app/opass/ccip/ui/wifi/WiFiNetworkFragment.kt new file mode 100644 index 00000000..3a0d7f9b --- /dev/null +++ b/app/src/main/java/app/opass/ccip/ui/wifi/WiFiNetworkFragment.kt @@ -0,0 +1,69 @@ +package app.opass.ccip.ui.wifi + +import android.app.Dialog +import android.content.ClipData +import android.content.ClipboardManager +import android.os.Bundle +import androidx.core.content.getSystemService +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import app.opass.ccip.R +import app.opass.ccip.model.WifiNetworkInfo +import app.opass.ccip.util.WifiUtil +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.snackbar.Snackbar + +class WiFiNetworkFragment(private val wifiNetworkInfoList: List) : + DialogFragment() { + + companion object { + private const val TAG = "WiFiNetworkFragment" + + fun show(wifiNetworkInfoList: List, fragmentManager: FragmentManager) { + WiFiNetworkFragment(wifiNetworkInfoList).show(fragmentManager, TAG) + } + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val recyclerView = RecyclerView(requireContext()).apply { + layoutParams = RecyclerView.LayoutParams( + RecyclerView.LayoutParams.MATCH_PARENT, + RecyclerView.LayoutParams.MATCH_PARENT + ) + layoutManager = LinearLayoutManager(requireContext()) + adapter = WifiNetworkAdapter(wifiNetworkInfoList) { info -> + onWifiSelected(info) + dialog?.dismiss() + } + } + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.choose_network_to_connect) + .setView(recyclerView) + .create() + } + + private fun onWifiSelected(info: WifiNetworkInfo) { + val rootView = requireActivity().window.decorView.rootView + + // Return early if password is null or empty + if (info.password.isNullOrEmpty()) { + Snackbar.make(rootView, R.string.failed_to_save_wifi, Snackbar.LENGTH_LONG).show() + return + } + + if (WifiUtil.installNetwork(requireContext(), info)) { + Snackbar.make(rootView, R.string.wifi_saved, Snackbar.LENGTH_SHORT).show() + } else { + requireContext().getSystemService()?.run { + setPrimaryClip(ClipData.newPlainText("", info.password)) + } ?: return + Snackbar.make( + rootView, + R.string.failed_to_save_wifi_copied_to_clipboard, + Snackbar.LENGTH_LONG + ).show() + } + } +}