Bug 1912288 - Add an about:glean page to fenix r=android-reviewers,007

Differential Revision: https://phabricator.services.mozilla.com/D225081
This commit is contained in:
Nicholas Poon
2025-01-20 20:03:26 +00:00
parent b899a4e0c6
commit 8b19ef0dc0
6 changed files with 129 additions and 0 deletions

View File

@@ -42,4 +42,5 @@ enum class BrowserDirection(@IdRes val fragmentId: Int) {
FromDownloadLanguagesPreferenceFragment(R.id.downloadLanguagesPreferenceFragment), FromDownloadLanguagesPreferenceFragment(R.id.downloadLanguagesPreferenceFragment),
FromMenuDialogFragment(R.id.menuDialogFragment), FromMenuDialogFragment(R.id.menuDialogFragment),
FromWebCompatReporterFragment(R.id.webCompatReporterFragment), FromWebCompatReporterFragment(R.id.webCompatReporterFragment),
FromGleanDebugToolsFragment(R.id.gleanDebugToolsFragment),
} }

View File

@@ -0,0 +1,101 @@
/* 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.debugsettings.gleandebugtools
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import android.widget.Toast
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.Scaffold
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.navigation.fragment.findNavController
import mozilla.telemetry.glean.Glean
import org.mozilla.fenix.R
import org.mozilla.fenix.components.lazyStore
import org.mozilla.fenix.compose.ComposeFragment
import org.mozilla.fenix.debugsettings.gleandebugtools.ui.GleanDebugToolsScreen
import org.mozilla.fenix.ext.requireComponents
import org.mozilla.fenix.theme.FirefoxTheme
/**
* [ComposeFragment] for displaying the Glean Debug Tools in the about:glean page.
*/
class GleanDebugToolsFragment : ComposeFragment() {
private val store by lazyStore {
GleanDebugToolsStore(
initialState = GleanDebugToolsState(
logPingsToConsoleEnabled = Glean.getLogPings(),
debugViewTag = Glean.getDebugViewTag() ?: "",
),
middlewares = listOf(
GleanDebugToolsMiddleware(
gleanDebugToolsStorage = DefaultGleanDebugToolsStorage(),
clipboardHandler = requireComponents.clipboardHandler,
openDebugView = { debugViewLink ->
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(debugViewLink)
requireContext().startActivity(intent)
},
showToast = { pingType ->
val toast = Toast.makeText(
requireContext(),
requireContext().getString(
R.string.glean_debug_tools_send_ping_toast_message,
pingType,
),
Toast.LENGTH_LONG,
)
toast.show()
},
),
),
)
}
@Composable
@SuppressLint("UnusedMaterialScaffoldPaddingParameter")
override fun UI() {
FirefoxTheme {
Scaffold(
topBar = {
TopAppBar(
title = {
Text(
text = stringResource(R.string.glean_debug_tools_title),
color = FirefoxTheme.colors.textPrimary,
style = FirefoxTheme.typography.headline6,
)
},
navigationIcon = {
val directions = GleanDebugToolsFragmentDirections.actionGlobalBrowser()
IconButton(onClick = { findNavController().navigate(directions) }) {
Icon(
painter = painterResource(R.drawable.mozac_ic_back_24),
contentDescription = stringResource(
R.string.bookmark_navigate_back_button_content_description,
),
tint = FirefoxTheme.colors.iconPrimary,
)
}
},
backgroundColor = FirefoxTheme.colors.layer1,
)
},
backgroundColor = FirefoxTheme.colors.layer1,
) {
GleanDebugToolsScreen(
gleanDebugToolsStore = store,
)
}
}
}
}

View File

@@ -34,6 +34,7 @@ import org.mozilla.fenix.addons.AddonsManagementFragmentDirections
import org.mozilla.fenix.components.menu.MenuDialogFragmentDirections import org.mozilla.fenix.components.menu.MenuDialogFragmentDirections
import org.mozilla.fenix.customtabs.EXTRA_IS_SANDBOX_CUSTOM_TAB import org.mozilla.fenix.customtabs.EXTRA_IS_SANDBOX_CUSTOM_TAB
import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity import org.mozilla.fenix.customtabs.ExternalAppBrowserActivity
import org.mozilla.fenix.debugsettings.gleandebugtools.GleanDebugToolsFragmentDirections
import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExceptionsFragmentDirections import org.mozilla.fenix.exceptions.trackingprotection.TrackingProtectionExceptionsFragmentDirections
import org.mozilla.fenix.home.HomeFragmentDirections import org.mozilla.fenix.home.HomeFragmentDirections
import org.mozilla.fenix.library.bookmarks.BookmarkFragmentDirections import org.mozilla.fenix.library.bookmarks.BookmarkFragmentDirections
@@ -285,6 +286,8 @@ private fun getHomeNavDirections(
BrowserDirection.FromHistory -> HistoryFragmentDirections.actionGlobalBrowser() BrowserDirection.FromHistory -> HistoryFragmentDirections.actionGlobalBrowser()
BrowserDirection.FromGleanDebugToolsFragment -> GleanDebugToolsFragmentDirections.actionGlobalBrowser()
BrowserDirection.FromHistoryMetadataGroup -> HistoryMetadataGroupFragmentDirections.actionGlobalBrowser() BrowserDirection.FromHistoryMetadataGroup -> HistoryMetadataGroupFragmentDirections.actionGlobalBrowser()
BrowserDirection.FromTrackingProtectionExceptions -> BrowserDirection.FromTrackingProtectionExceptions ->

View File

@@ -93,6 +93,10 @@ class SearchDialogController(
navController.navigateSafe(R.id.searchDialogFragment, directions) navController.navigateSafe(R.id.searchDialogFragment, directions)
store.dispatch(AwesomeBarAction.EngagementFinished(abandoned = false)) store.dispatch(AwesomeBarAction.EngagementFinished(abandoned = false))
} }
"about:glean" -> {
val directions = SearchDialogFragmentDirections.actionGleanDebugToolsFragment()
navController.navigate(directions)
}
"moz://a" -> openSearchOrUrl( "moz://a" -> openSearchOrUrl(
SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.MANIFESTO), SupportUtils.getMozillaPageUrl(SupportUtils.MozillaPage.MANIFESTO),
) )

View File

@@ -288,6 +288,9 @@
android:defaultValue="@null" android:defaultValue="@null"
app:argType="string" app:argType="string"
app:nullable="true" /> app:nullable="true" />
<action
android:id="@+id/action_gleanDebugToolsFragment"
app:destination="@id/gleanDebugToolsFragment" />
</dialog> </dialog>
<fragment <fragment
@@ -1160,6 +1163,10 @@
app:argType="mozilla.components.feature.addons.Addon" /> app:argType="mozilla.components.feature.addons.Addon" />
</fragment> </fragment>
<fragment
android:id="@+id/gleanDebugToolsFragment"
android:name="org.mozilla.fenix.debugsettings.gleandebugtools.GleanDebugToolsFragment" />
<navigation <navigation
android:id="@+id/site_permissions_exceptions_graph" android:id="@+id/site_permissions_exceptions_graph"
app:startDestination="@id/sitePermissionsExceptionsFragment"> app:startDestination="@id/sitePermissionsExceptionsFragment">

View File

@@ -50,6 +50,7 @@ import org.mozilla.fenix.components.metrics.MetricsUtils
import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.components
import org.mozilla.fenix.helpers.FenixGleanTestRule import org.mozilla.fenix.helpers.FenixGleanTestRule
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGleanDebugToolsFragment
import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalAddonsManagementFragment import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalAddonsManagementFragment
import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalSearchEngineFragment import org.mozilla.fenix.search.SearchDialogFragmentDirections.Companion.actionGlobalSearchEngineFragment
import org.mozilla.fenix.search.toolbar.SearchSelectorMenu import org.mozilla.fenix.search.toolbar.SearchSelectorMenu
@@ -329,6 +330,18 @@ class SearchDialogControllerTest {
} }
} }
@Test
fun handleGleanUrlCommitted() {
val url = "about:glean"
val directions = actionGleanDebugToolsFragment()
createController().handleUrlCommitted(url)
browserStore.waitUntilIdle()
verify { navController.navigate(directions) }
}
@Test @Test
fun handleMozillaUrlCommitted() { fun handleMozillaUrlCommitted() {
val url = "moz://a" val url = "moz://a"