Skip to content
Snippets Groups Projects
Commit 13a160f6 authored by clairehurst's avatar clairehurst Committed by Pier Angelo Vendrame
Browse files

fixup! [android] Implement Android-native Connection Assist UI

parent f3fdc38f
Branches
1 merge request!1500TB 43415: Rebased onto 134.0a1
......@@ -4,6 +4,8 @@
package org.mozilla.fenix.tor
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Build
......@@ -41,7 +43,6 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler {
private val progressViewModel: TorBootstrapProgressViewModel by viewModels()
private val quickstartViewModel: QuickstartViewModel by activityViewModels()
private val torConnectionAssistViewModel : TorConnectionAssistViewModel by viewModels()
private val urlQuickLoadViewModel : UrlQuickLoadViewModel by activityViewModels()
private var _binding: FragmentTorConnectionAssistBinding? = null
private val binding get() = _binding!!
......@@ -55,6 +56,15 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler {
inflater, container, false,
)
object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action === Intent.ACTION_LOCALE_CHANGED) {
Log.v("LocaleReceiver", "received ACTION_LOCALE_CHANGED")
torConnectionAssistViewModel.fetchCountryNamesGet()
}
}
}
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
torConnectionAssistViewModel.collectTorConnectStage()
......@@ -68,12 +78,6 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler {
}
}
urlQuickLoadViewModel.urlToLoadAfterConnecting.observe(viewLifecycleOwner) { url ->
if (!url.isNullOrBlank()) {
torConnectionAssistViewModel.handleConnect()
}
}
return binding.root
}
......@@ -203,12 +207,11 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler {
if (screen.countryDropDownVisible) {
val spinnerAdapter: ArrayAdapter<String> = initializeSpinner()
if (binding.countryDropDown.isEmpty()) {
spinnerAdapter.add(getString(screen.countryDropDownDefaultItem))
populateCountryDropDown(spinnerAdapter)
setOnItemSelectedListener()
}
spinnerAdapter.remove(spinnerAdapter.getItem(0))
spinnerAdapter.insert(getString(screen.countryDropDownDefaultItem), 0)
setFirstItemInCountryDropDown(spinnerAdapter, getString(screen.countryDropDownDefaultItem))
if (screen == ConnectAssistUiState.ChooseRegion || screen == ConnectAssistUiState.ConfirmRegion || screen == ConnectAssistUiState.RegionNotFound) {
torConnectionAssistViewModel.selectDefaultRegion()
......@@ -223,6 +226,16 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler {
}
}
private fun setFirstItemInCountryDropDown(
spinnerAdapter: ArrayAdapter<String>,
item: String,
) {
if (!spinnerAdapter.isEmpty) {
spinnerAdapter.remove(spinnerAdapter.getItem(0))
}
spinnerAdapter.insert(item, 0)
}
private fun initializeSpinner(): ArrayAdapter<String> {
val spinnerAdapter: ArrayAdapter<String> =
ArrayAdapter<String>(
......@@ -236,16 +249,19 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler {
}
private fun populateCountryDropDown(spinnerAdapter: ArrayAdapter<String>) {
torConnectionAssistViewModel.fetchCountryNamesGet()
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
torConnectionAssistViewModel.countryCodeNameMap.collect {
Log.d(TAG, "countryCodeNameMap: $it")
if (it != null) {
spinnerAdapter.clear()
spinnerAdapter.add(getString(torConnectionAssistViewModel.torConnectScreen.value.countryDropDownDefaultItem))
spinnerAdapter.addAll(it.values)
}
}
}
}
spinnerAdapter.notifyDataSetChanged()
}
private fun setOnItemSelectedListener() {
......
......@@ -13,6 +13,7 @@ import kotlinx.coroutines.flow.StateFlow
import org.mozilla.fenix.HomeActivity
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.gecko.util.GeckoBundle
import org.mozilla.geckoview.TorAndroidIntegration.BootstrapStateChangeListener
import org.mozilla.geckoview.TorConnectStage
import org.mozilla.geckoview.TorConnectStageName
......@@ -27,10 +28,17 @@ class TorConnectionAssistViewModel(
init {
torAndroidIntegration.registerBootstrapStateChangeListener(this)
}
torAndroidIntegration.countryNamesGet { countryNamesMap : Map<String, String>? ->
if (countryNamesMap != null) {
countryCodeNameMap.value = countryNamesMap
fun fetchCountryNamesGet() {
torAndroidIntegration.countryNamesGet { countryNames : GeckoBundle? ->
if (countryNames != null) {
val codes: Array<String> = countryNames.keys()
val regions = mutableMapOf<String, String>()
for (code in codes) {
regions[code] = countryNames.getString(code)
}
countryCodeNameMap.value = regions
}
}
}
......@@ -41,7 +49,7 @@ class TorConnectionAssistViewModel(
}
private val torConnectStage: MutableStateFlow<TorConnectStage?> by lazy {
MutableStateFlow(null)
MutableStateFlow(torAndroidIntegration.lastKnowStage.value)
}
private val _torConnectScreen = MutableStateFlow(ConnectAssistUiState.Loading)
......
package org.mozilla.fenix.tor
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import org.mozilla.fenix.ext.components
import org.mozilla.geckoview.TorConnectStageName
class UrlQuickLoadViewModel(application: Application) : AndroidViewModel(application) {
private val torAndroidIntegration =
application.components.core.geckoRuntime.torIntegrationController
class UrlQuickLoadViewModel : ViewModel() {
val urlToLoadAfterConnecting: MutableLiveData<String?> by lazy {
MutableLiveData<String?>(null)
}
fun maybeBeginBootstrap() {
when (torAndroidIntegration.lastKnowStage.value?.name) {
TorConnectStageName.Offline -> torAndroidIntegration.beginBootstrap()
TorConnectStageName.Start -> torAndroidIntegration.beginBootstrap()
else -> {}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment