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

[android] Enable the connect assist experiments on alpha

parent 03f8b1e8
No related branches found
No related tags found
1 merge request!1462BB/TB 43584: Rebased stable again onto 128.9.0esr build2
Showing
with 256 additions and 3 deletions
......@@ -1502,6 +1502,8 @@ class GeckoEngine(
installedExtension.registerTabHandler(webExtensionTabHandler, defaultSettings)
onSuccess(installedExtension)
}
fun getTorIntegrationController() = runtime.getTorIntegrationController()
}
internal fun ContentBlockingController.LogEntry.BlockingData.hasBlockedCookies(): Boolean {
......
......@@ -311,7 +311,6 @@ data class DefaultSettings(
override var emailTrackerBlockingPrivateBrowsing: Boolean = false,
override var torSecurityLevel: Int = 4,
override var spoofEnglish: Boolean = false,
override var prioritizeOnions: Boolean = false,
) : Settings()
class UnsupportedSetting<T> {
......
......@@ -150,6 +150,11 @@ import org.mozilla.fenix.utils.Settings
import java.lang.ref.WeakReference
import java.util.Locale
import androidx.navigation.fragment.findNavController
import mozilla.components.browser.engine.gecko.GeckoEngine
import mozilla.components.browser.state.selector.findCustomTab
import org.mozilla.geckoview.TorIntegrationAndroid
/**
* The main activity of the application. The application is primarily a single Activity (this one)
* with fragments switching out to display different views. The most important views shown here are the:
......@@ -157,7 +162,7 @@ import java.util.Locale
* - browser screen
*/
@SuppressWarnings("TooManyFunctions", "LargeClass", "LongMethod")
open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorIntegrationAndroid.BootstrapStateChangeListener {
private lateinit var binding: ActivityHomeBinding
lateinit var themeManager: ThemeManager
lateinit var browsingModeManager: BrowsingModeManager
......@@ -445,6 +450,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
components.notificationsDelegate.bindToActivity(this)
val engine = components.core.engine
if (engine is GeckoEngine) {
val torIntegration = engine.getTorIntegrationController()
torIntegration.registerBootstrapStateChangeListener(this)
}
StartupTimeline.onActivityCreateEndHome(this) // DO NOT MOVE ANYTHING BELOW HERE.
}
......@@ -646,6 +657,12 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
// underlying Application, as well.
(application as FenixApplication).terminate()
}
val engine = components.core.engine
if (engine is GeckoEngine) {
val torIntegration = engine.getTorIntegrationController()
torIntegration.unregisterBootstrapStateChangeListener(this)
}
}
final override fun onConfigurationChanged(newConfig: Configuration) {
......@@ -1235,7 +1252,20 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
// return
// }
navHost.navController.navigate(NavGraphDirections.actionStartupTorbootstrap())
if (settings().useNewBootstrap) {
if (settings().useNewBootstrapNativeUi) {
navController.navigate(NavGraphDirections.actionStartupTorConnectionAssist())
} else {
navController.navigate(NavGraphDirections.actionStartupHome())
openToBrowserAndLoad(
searchTermOrURL = "about:torconnect",
newTab = true,
from = BrowserDirection.FromHome,
)
}
} else {
navController.navigate(NavGraphDirections.actionStartupTorbootstrap())
}
}
final override fun attachBaseContext(base: Context) {
......@@ -1402,4 +1432,15 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity {
// telemetry purposes.
private const val PWA_RECENTLY_USED_THRESHOLD = DateUtils.DAY_IN_MILLIS * 30L
}
override fun onBootstrapStateChange(state: String) = Unit
override fun onBootstrapProgress(progress: Double, hasWarnings: Boolean) = Unit
override fun onBootstrapComplete() {
components.useCases.tabsUseCases.removeAllTabs()
navHost.navController.navigate(NavGraphDirections.actionStartupHome())
}
override fun onBootstrapError(code: String?, message: String?, phase: String?, reason: String?) = Unit
override fun onSettingsRequested() {
navHost.navController.navigate(NavGraphDirections.actionGlobalSettingsFragment())
}
}
......@@ -1549,6 +1549,9 @@ abstract class BaseBrowserFragment :
val bottomToolbarHeight = context.settings().getBottomToolbarHeight()
resumeDownloadDialogState(selectedTab.id, context.components.core.store, context, bottomToolbarHeight)
it.announceForAccessibility(selectedTab.toDisplayTitle())
if (getCurrentTab()?.content?.url == "about:torconnect") {
browserToolbarView.view.visibility = View.GONE
}
}
} else {
view?.let { view -> initializeUI(view) }
......@@ -1573,6 +1576,27 @@ abstract class BaseBrowserFragment :
openLinksInExternalApp
}
}
handleBetaHtmlTorConnect()
}
private fun handleBetaHtmlTorConnect() {
val currentTab = getCurrentTab() ?: return
if (currentTab.content.url == "about:torconnect") {
if (!requireActivity().settings().useNewBootstrap) {
requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id)
(requireActivity() as HomeActivity).navHost.navController.navigate(
NavGraphDirections.actionStartupTorbootstrap(),
)
} else if (!requireActivity().settings().useNewBootstrapHtmlUi) {
requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id)
(requireActivity() as HomeActivity).navigateToHome(findNavController())
} else {
// This just makes it not flash (be visible for a split second) before handleTabSelected() hides it again
browserToolbarView.view.visibility = View.GONE
}
} else if (currentTab.content.url == "about:tor") {
requireContext().components.useCases.tabsUseCases.removeTab(currentTab.id)
}
}
@CallSuper
......
......@@ -159,6 +159,7 @@ class Core(
emailTrackerBlockingPrivateBrowsing = false,
torSecurityLevel = context.settings().torSecurityLevel().intRepresentation,
spoofEnglish = context.settings().spoofEnglish,
useNewBootstrap = context.settings().useNewBootstrap,
)
GeckoEngine(
......
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.tor
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.children
import androidx.fragment.app.Fragment
import org.mozilla.fenix.databinding.TorNetworkSettingsBetaConnectionFeaturesBinding
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.settings
/**
* Lets the user customize beta connection features mode.
*/
class TorBetaConnectionFeaturesFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?,
): View {
val binding = TorNetworkSettingsBetaConnectionFeaturesBinding.inflate(inflater)
binding.enableBetaConnectionFeaturesSwitch.run {
isChecked = context.settings().useNewBootstrap
setConnectionAssistUI(binding, isChecked)
setOnCheckedChangeListener { _, isConnectionAssistEnabled ->
context.settings().useNewBootstrap = isConnectionAssistEnabled
setConnectionAssistUI(binding, isConnectionAssistEnabled)
updateEngineConnectionAssistMode()
}
}
// Since the beta connection features modes are in a RadioGroup we only need one listener to know of all their changes.
binding.useNewBootstrapWithNativeUiRadioButton.setOnCheckedChangeListener { _, _ ->
updateEngineConnectionAssistMode()
}
return binding.root
}
private fun setConnectionAssistUI(
binding: TorNetworkSettingsBetaConnectionFeaturesBinding,
isBetaConnectionAssistEnabled: Boolean,
) {
if (!isBetaConnectionAssistEnabled) {
binding.enableBetaConnectionFeaturesModes.apply {
clearCheck()
children.forEach { it.isEnabled = false }
}
} else {
binding.enableBetaConnectionFeaturesModes.children.forEach { it.isEnabled = true }
}
}
private fun updateEngineConnectionAssistMode() {
requireContext().components.core.engine.settings.useNewBootstrap =
requireContext().settings().useNewBootstrap
}
}
......@@ -2106,4 +2106,19 @@ class Settings(private val appContext: Context) : PreferencesHolder {
default = { false },
featureFlag = FxNimbus.features.toolbarRedesign.value().enabled,
)
var useNewBootstrap by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap),
default = true,
)
var useNewBootstrapNativeUi by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap_with_android_native),
default = true,
)
var useNewBootstrapHtmlUi by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_use_new_bootstrap_with_html),
default = false
)
}
<?xml version="1.0" encoding="utf-8"?><!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/enable_beta_connection_features_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="2dp"
android:clickable="false"
android:text="Enable beta connection features"
android:textAppearance="@style/ListItemTextStyle"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@id/enable_beta_connection_features_summary"
app:layout_constraintEnd_toStartOf="@id/enable_beta_connection_features_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:lineHeight="24.sp" />
<TextView
android:id="@+id/enable_beta_connection_features_summary"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Help us test our new connection assist features which focuses on a streamlined connection with better integration with bridges"
android:textColor="?attr/textSecondary"
android:textColorLink="?attr/textSecondary"
android:textSize="12sp"
app:layout_constraintBottom_toTopOf="@id/enable_beta_connection_features_modes"
app:layout_constraintEnd_toEndOf="@id/enable_beta_connection_features_title"
app:layout_constraintStart_toStartOf="@id/enable_beta_connection_features_title"
app:layout_constraintTop_toBottomOf="@id/enable_beta_connection_features_title"
app:lineHeight="16.sp" />
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/enable_beta_connection_features_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:paddingStart="18dp"
android:paddingEnd="18dp"
android:textColor="@color/state_list_text_color"
android:textOff="@string/studies_off"
android:textOn="@string/studies_on"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@id/enable_beta_connection_features_title" />
<RadioGroup
android:id="@+id/enable_beta_connection_features_modes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/enable_beta_connection_features_summary">
<org.mozilla.fenix.settings.PreferenceBackedRadioButton
android:id="@+id/use_new_bootstrap_with_native_ui_radio_button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:button="@null"
android:drawablePadding="@dimen/radio_button_preference_drawable_padding"
android:paddingStart="@dimen/radio_button_preference_horizontal"
android:paddingTop="@dimen/radio_button_preference_vertical"
android:paddingEnd="@dimen/radio_button_preference_horizontal"
android:paddingBottom="@dimen/radio_button_preference_vertical"
android:text="Native Android UI"
android:textAppearance="?android:attr/textAppearanceListItem"
android:textSize="16sp"
app:drawableStartCompat="?android:attr/listChoiceIndicatorSingle"
app:preferenceKey="@string/pref_key_use_new_bootstrap_with_android_native"
app:preferenceKeyDefaultValue="true" />
<org.mozilla.fenix.settings.PreferenceBackedRadioButton
android:id="@+id/use_new_bootstrap_with_html_ui_radio_button"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="?android:attr/selectableItemBackground"
android:button="@null"
android:drawablePadding="@dimen/radio_button_preference_drawable_padding"
android:paddingStart="@dimen/radio_button_preference_horizontal"
android:paddingTop="@dimen/radio_button_preference_vertical"
android:paddingEnd="@dimen/radio_button_preference_horizontal"
android:paddingBottom="@dimen/radio_button_preference_vertical"
android:text="HTML UI"
android:textAppearance="?android:attr/textAppearanceListItem"
android:textSize="16sp"
app:drawableStartCompat="?android:attr/listChoiceIndicatorSingle"
app:preferenceKey="@string/pref_key_use_new_bootstrap_with_html"
app:preferenceKeyDefaultValue="false" />
</RadioGroup>
</androidx.constraintlayout.widget.ConstraintLayout>
......@@ -21,6 +21,12 @@
app:popUpTo="@id/startupFragment"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_startup_tor_connection_assist"
app:destination="@+id/torConnectionAssistFragment"
app:popUpTo="@id/startupFragment"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_global_home"
app:destination="@id/homeFragment"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment