1
0
Fork 0

Copione merged onto master
continuous-integration/drone/push Build is failing Details

master
blallo 2020-07-28 00:00:37 +02:00
commit 6f7690e4a8
12 changed files with 230 additions and 151 deletions

View File

@ -17,7 +17,7 @@ object FeatureFlags {
/** /**
* Allows edit of saved logins. * Allows edit of saved logins.
*/ */
val loginsEdit = Config.channel.isNightlyOrDebug const val loginsEdit = true
/** /**
* Enable tab sync feature * Enable tab sync feature

View File

@ -17,6 +17,7 @@ import kotlinx.coroutines.launch
import mozilla.appservices.places.BookmarkRoot import mozilla.appservices.places.BookmarkRoot
import mozilla.components.browser.session.Session import mozilla.components.browser.session.Session
import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.SessionManager
import mozilla.components.concept.engine.EngineSession.LoadUrlFlags
import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.EngineView
import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.feature.session.SessionFeature import mozilla.components.feature.session.SessionFeature
@ -177,7 +178,15 @@ class DefaultBrowserToolbarController(
sessionUseCases.goForward.invoke(currentSession) sessionUseCases.goForward.invoke(currentSession)
} }
} }
ToolbarMenu.Item.Reload -> sessionUseCases.reload.invoke(currentSession) is ToolbarMenu.Item.Reload -> {
val flags = if (item.bypassCache) {
LoadUrlFlags.select(LoadUrlFlags.BYPASS_CACHE)
} else {
LoadUrlFlags.none()
}
sessionUseCases.reload.invoke(currentSession, flags = flags)
}
ToolbarMenu.Item.Stop -> sessionUseCases.stopLoading.invoke(currentSession) ToolbarMenu.Item.Stop -> sessionUseCases.stopLoading.invoke(currentSession)
ToolbarMenu.Item.Settings -> browserAnimator.captureEngineViewAndDrawStatically { ToolbarMenu.Item.Settings -> browserAnimator.captureEngineViewAndDrawStatically {
val directions = BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment() val directions = BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment()
@ -340,7 +349,7 @@ class DefaultBrowserToolbarController(
val eventItem = when (item) { val eventItem = when (item) {
ToolbarMenu.Item.Back -> Event.BrowserMenuItemTapped.Item.BACK ToolbarMenu.Item.Back -> Event.BrowserMenuItemTapped.Item.BACK
is ToolbarMenu.Item.Forward -> Event.BrowserMenuItemTapped.Item.FORWARD is ToolbarMenu.Item.Forward -> Event.BrowserMenuItemTapped.Item.FORWARD
ToolbarMenu.Item.Reload -> Event.BrowserMenuItemTapped.Item.RELOAD is ToolbarMenu.Item.Reload -> Event.BrowserMenuItemTapped.Item.RELOAD
ToolbarMenu.Item.Stop -> Event.BrowserMenuItemTapped.Item.STOP ToolbarMenu.Item.Stop -> Event.BrowserMenuItemTapped.Item.STOP
ToolbarMenu.Item.Settings -> Event.BrowserMenuItemTapped.Item.SETTINGS ToolbarMenu.Item.Settings -> Event.BrowserMenuItemTapped.Item.SETTINGS
is ToolbarMenu.Item.RequestDesktop -> is ToolbarMenu.Item.RequestDesktop ->

View File

@ -4,6 +4,7 @@
package org.mozilla.fenix.components.toolbar package org.mozilla.fenix.components.toolbar
import android.view.HapticFeedbackConstants
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@ -156,6 +157,7 @@ class BrowserToolbarView(
customTabSession?.id, customTabSession?.id,
shouldReverseItems = toolbarPosition == ToolbarPosition.TOP, shouldReverseItems = toolbarPosition == ToolbarPosition.TOP,
onItemTapped = { onItemTapped = {
it.performHapticIfNeeded(view)
interactor.onBrowserToolbarMenuItemTapped(it) interactor.onBrowserToolbarMenuItemTapped(it)
} }
) )
@ -164,7 +166,10 @@ class BrowserToolbarView(
context = this, context = this,
hasAccountProblem = components.backgroundServices.accountManager.accountNeedsReauth(), hasAccountProblem = components.backgroundServices.accountManager.accountNeedsReauth(),
shouldReverseItems = toolbarPosition == ToolbarPosition.TOP, shouldReverseItems = toolbarPosition == ToolbarPosition.TOP,
onItemTapped = { interactor.onBrowserToolbarMenuItemTapped(it) }, onItemTapped = {
it.performHapticIfNeeded(view)
interactor.onBrowserToolbarMenuItemTapped(it)
},
lifecycleOwner = lifecycleOwner, lifecycleOwner = lifecycleOwner,
sessionManager = sessionManager, sessionManager = sessionManager,
store = components.core.store, store = components.core.store,
@ -244,4 +249,12 @@ class BrowserToolbarView(
companion object { companion object {
private const val TOOLBAR_ELEVATION = 16 private const val TOOLBAR_ELEVATION = 16
} }
private fun ToolbarMenu.Item.performHapticIfNeeded(view: View) {
(this as? ToolbarMenu.Item.Reload)?.also { reload ->
if (reload.bypassCache) {
view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS)
}
}
}
} }

View File

@ -98,12 +98,13 @@ class DefaultToolbarMenu(
secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop, secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop,
secondaryContentDescription = context.getString(R.string.browser_menu_stop), secondaryContentDescription = context.getString(R.string.browser_menu_stop),
secondaryImageTintResource = primaryTextColor(), secondaryImageTintResource = primaryTextColor(),
disableInSecondaryState = false disableInSecondaryState = false,
longClickListener = { onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = true)) }
) { ) {
if (session?.loading == true) { if (session?.loading == true) {
onItemTapped.invoke(ToolbarMenu.Item.Stop) onItemTapped.invoke(ToolbarMenu.Item.Stop)
} else { } else {
onItemTapped.invoke(ToolbarMenu.Item.Reload) onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = false))
} }
} }

View File

@ -15,7 +15,7 @@ interface ToolbarMenu {
object Share : Item() object Share : Item()
object Back : Item() object Back : Item()
data class Forward(val viewHistory: Boolean) : Item() data class Forward(val viewHistory: Boolean) : Item()
object Reload : Item() data class Reload(val bypassCache: Boolean) : Item()
object Stop : Item() object Stop : Item()
object OpenInFenix : Item() object OpenInFenix : Item()
object SaveToCollection : Item() object SaveToCollection : Item()

View File

@ -91,12 +91,13 @@ class CustomTabToolbarMenu(
secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop, secondaryImageResource = mozilla.components.ui.icons.R.drawable.mozac_ic_stop,
secondaryContentDescription = context.getString(R.string.browser_menu_stop), secondaryContentDescription = context.getString(R.string.browser_menu_stop),
secondaryImageTintResource = primaryTextColor(), secondaryImageTintResource = primaryTextColor(),
disableInSecondaryState = false disableInSecondaryState = false,
longClickListener = { onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = true)) }
) { ) {
if (session?.loading == true) { if (session?.loading == true) {
onItemTapped.invoke(ToolbarMenu.Item.Stop) onItemTapped.invoke(ToolbarMenu.Item.Stop)
} else { } else {
onItemTapped.invoke(ToolbarMenu.Item.Reload) onItemTapped.invoke(ToolbarMenu.Item.Reload(bypassCache = false))
} }
} }

View File

@ -73,6 +73,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
accountUiView = AccountUiView( accountUiView = AccountUiView(
fragment = this, fragment = this,
scope = lifecycleScope,
accountManager = requireComponents.backgroundServices.accountManager, accountManager = requireComponents.backgroundServices.accountManager,
httpClient = requireComponents.core.client, httpClient = requireComponents.core.client,
updateFxASyncOverrideMenu = ::updateFxASyncOverrideMenu updateFxASyncOverrideMenu = ::updateFxASyncOverrideMenu
@ -137,6 +138,11 @@ class SettingsFragment : PreferenceFragmentCompat() {
creatingFragment = false creatingFragment = false
} }
override fun onDestroyView() {
super.onDestroyView()
accountUiView.cancel()
}
private fun update(shouldUpdateAccountUIState: Boolean) { private fun update(shouldUpdateAccountUIState: Boolean) {
val trackingProtectionPreference = val trackingProtectionPreference =
requirePreference<Preference>(R.string.pref_key_tracking_protection_settings) requirePreference<Preference>(R.string.pref_key_tracking_protection_settings)

View File

@ -7,10 +7,12 @@ package org.mozilla.fenix.settings.account
import android.content.Context import android.content.Context
import androidx.appcompat.content.res.AppCompatResources import androidx.appcompat.content.res.AppCompatResources
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceCategory import androidx.preference.PreferenceCategory
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import mozilla.components.concept.fetch.Client import mozilla.components.concept.fetch.Client
import mozilla.components.concept.sync.Profile import mozilla.components.concept.sync.Profile
@ -21,12 +23,12 @@ import org.mozilla.fenix.settings.requirePreference
class AccountUiView( class AccountUiView(
fragment: PreferenceFragmentCompat, fragment: PreferenceFragmentCompat,
private val scope: CoroutineScope,
private val accountManager: FxaAccountManager, private val accountManager: FxaAccountManager,
private val httpClient: Client, private val httpClient: Client,
private val updateFxASyncOverrideMenu: () -> Unit private val updateFxASyncOverrideMenu: () -> Unit
) { ) {
private val lifecycleScope = fragment.viewLifecycleOwner.lifecycleScope
private val preferenceSignIn = private val preferenceSignIn =
fragment.requirePreference<Preference>(R.string.pref_key_sign_in) fragment.requirePreference<Preference>(R.string.pref_key_sign_in)
private val preferenceFirefoxAccount = private val preferenceFirefoxAccount =
@ -36,6 +38,8 @@ class AccountUiView(
private val accountPreferenceCategory = private val accountPreferenceCategory =
fragment.requirePreference<PreferenceCategory>(R.string.pref_key_account_category) fragment.requirePreference<PreferenceCategory>(R.string.pref_key_account_category)
private var avatarJob: Job? = null
/** /**
* Updates the UI to reflect current account state. * Updates the UI to reflect current account state.
* Possible conditions are logged-in without problems, logged-out, and logged-in but needs to re-authenticate. * Possible conditions are logged-in without problems, logged-out, and logged-in but needs to re-authenticate.
@ -49,15 +53,16 @@ class AccountUiView(
if (account != null && !accountManager.accountNeedsReauth()) { if (account != null && !accountManager.accountNeedsReauth()) {
preferenceSignIn.isVisible = false preferenceSignIn.isVisible = false
profile?.avatar?.url?.let { avatarUrl -> avatarJob?.cancel()
lifecycleScope.launch { val avatarUrl = profile?.avatar?.url
val roundedDrawable = toRoundedDrawable(avatarUrl, context) if (avatarUrl != null) {
preferenceFirefoxAccount.icon = avatarJob = scope.launch {
roundedDrawable ?: AppCompatResources.getDrawable( val roundedAvatarDrawable = toRoundedDrawable(avatarUrl, context)
context, preferenceFirefoxAccount.icon = roundedAvatarDrawable ?: genericAvatar(context)
R.drawable.ic_account
)
} }
} else {
avatarJob = null
preferenceFirefoxAccount.icon = genericAvatar(context)
} }
preferenceSignIn.onPreferenceClickListener = null preferenceSignIn.onPreferenceClickListener = null
@ -88,6 +93,19 @@ class AccountUiView(
} }
} }
/**
* Cancel any running coroutine jobs for loading account images.
*/
fun cancel() {
scope.cancel()
}
/**
* Returns generic avatar for accounts.
*/
private fun genericAvatar(context: Context) =
AppCompatResources.getDrawable(context, R.drawable.ic_account)
/** /**
* Gets a rounded drawable from a URL if possible, else null. * Gets a rounded drawable from a URL if possible, else null.
*/ */

View File

@ -41,7 +41,8 @@ import org.mozilla.fenix.settings.SupportUtils
import java.util.Locale import java.util.Locale
@SuppressWarnings("LargeClass", "TooManyFunctions") @SuppressWarnings("LargeClass", "TooManyFunctions")
class AddSearchEngineFragment : Fragment(), CompoundButton.OnCheckedChangeListener { class AddSearchEngineFragment : Fragment(R.layout.fragment_add_search_engine),
CompoundButton.OnCheckedChangeListener {
private var availableEngines: List<SearchEngine> = listOf() private var availableEngines: List<SearchEngine> = listOf()
private var selectedIndex: Int = -1 private var selectedIndex: Int = -1
private val engineViews = mutableListOf<View>() private val engineViews = mutableListOf<View>()
@ -62,14 +63,6 @@ class AddSearchEngineFragment : Fragment(), CompoundButton.OnCheckedChangeListen
selectedIndex = if (availableEngines.isEmpty()) CUSTOM_INDEX else FIRST_INDEX selectedIndex = if (availableEngines.isEmpty()) CUSTOM_INDEX else FIRST_INDEX
} }
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_add_search_engine, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val layoutInflater = LayoutInflater.from(context) val layoutInflater = LayoutInflater.from(context)

View File

@ -19,6 +19,7 @@
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/fragment_site_permissions_exceptions_item"
tools:visibility="visible" /> tools:visibility="visible" />
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
@ -43,7 +44,6 @@
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent" />
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -38,10 +38,10 @@
app:destination="@id/turnOnSyncFragment" /> app:destination="@id/turnOnSyncFragment" />
<action <action
android:id="@+id/action_global_settings_addonsManagementFragment" android:id="@+id/action_global_settings_addonsManagementFragment"
app:destination="@id/addonsManagementFragment" /> app:destination="@id/addons_management_graph" />
<action <action
android:id="@+id/action_global_searchEngineFragment" android:id="@+id/action_global_searchEngineFragment"
app:destination="@id/searchEngineFragment" /> app:destination="@id/search_engine_graph" />
<action <action
android:id="@+id/action_global_accessibilityFragment" android:id="@+id/action_global_accessibilityFragment"
app:destination="@id/accessibilityFragment" /> app:destination="@id/accessibilityFragment" />
@ -80,7 +80,7 @@
app:destination="@id/bookmarkEditFragment" /> app:destination="@id/bookmarkEditFragment" />
<action <action
android:id="@+id/action_global_addonsManagementFragment" android:id="@+id/action_global_addonsManagementFragment"
app:destination="@id/addonsManagementFragment" /> app:destination="@id/addons_management_graph" />
<action <action
android:id="@+id/action_global_trackingProtectionFragment" android:id="@+id/action_global_trackingProtectionFragment"
app:destination="@id/trackingProtectionFragment" /> app:destination="@id/trackingProtectionFragment" />
@ -165,42 +165,6 @@
app:argType="org.mozilla.fenix.settings.PhoneFeature" /> app:argType="org.mozilla.fenix.settings.PhoneFeature" />
</fragment> </fragment>
<fragment
android:id="@+id/sitePermissionsExceptionsFragment"
android:name="org.mozilla.fenix.settings.sitepermissions.SitePermissionsExceptionsFragment"
android:label="@string/preference_exceptions"
tools:layout="@layout/fragment_site_permissions_exceptions">
<action
android:id="@+id/action_site_permissions_to_exceptions_to_site_permissions_details"
app:destination="@id/sitePermissionsDetailsExceptionsFragment"
app:popUpTo="@+id/sitePermissionsExceptionsFragment" />
</fragment>
<fragment
android:id="@+id/sitePermissionsDetailsExceptionsFragment"
android:name="org.mozilla.fenix.settings.sitepermissions.SitePermissionsDetailsExceptionsFragment"
tools:layout="@xml/site_permissions_details_exceptions_preferences">
<action
android:id="@+id/action_site_permissions_to_exceptions_to_manage_phone_feature"
app:destination="@id/sitePermissionsManageExceptionsPhoneFeatureFragment"
app:popUpTo="@+id/sitePermissionsDetailsExceptionsFragment" />
<argument
android:name="sitePermissions"
app:argType="mozilla.components.feature.sitepermissions.SitePermissions" />
</fragment>
<fragment
android:id="@+id/sitePermissionsManageExceptionsPhoneFeatureFragment"
android:name="org.mozilla.fenix.settings.sitepermissions.SitePermissionsManageExceptionsPhoneFeatureFragment"
tools:layout="@layout/fragment_manage_site_permissions_feature_phone">
<argument
android:name="phoneFeature"
app:argType="org.mozilla.fenix.settings.PhoneFeature" />
<argument
android:name="sitePermissions"
app:argType="mozilla.components.feature.sitepermissions.SitePermissions" />
</fragment>
<fragment <fragment
android:id="@+id/browserFragment" android:id="@+id/browserFragment"
android:name="org.mozilla.fenix.browser.BrowserFragment" android:name="org.mozilla.fenix.browser.BrowserFragment"
@ -459,7 +423,7 @@
app:popExitAnim="@anim/slide_out_right" /> app:popExitAnim="@anim/slide_out_right" />
<action <action
android:id="@+id/action_settingsFragment_to_searchEngineFragment" android:id="@+id/action_settingsFragment_to_searchEngineFragment"
app:destination="@id/searchEngineFragment" app:destination="@id/search_engine_graph"
app:enterAnim="@anim/slide_in_right" app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left" app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left" app:popEnterAnim="@anim/slide_in_left"
@ -536,7 +500,7 @@
app:popExitAnim="@anim/slide_out_right" /> app:popExitAnim="@anim/slide_out_right" />
<action <action
android:id="@+id/action_settingsFragment_to_addonsFragment" android:id="@+id/action_settingsFragment_to_addonsFragment"
app:destination="@id/addonsManagementFragment" app:destination="@id/addons_management_graph"
app:enterAnim="@anim/slide_in_right" app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left" app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left" app:popEnterAnim="@anim/slide_in_left"
@ -560,7 +524,7 @@
app:popUpTo="@id/sitePermissionsFragment" /> app:popUpTo="@id/sitePermissionsFragment" />
<action <action
android:id="@+id/action_site_permissions_to_exceptions" android:id="@+id/action_site_permissions_to_exceptions"
app:destination="@id/sitePermissionsExceptionsFragment" app:destination="@id/site_permissions_exceptions_graph"
app:enterAnim="@anim/slide_in_right" app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left" app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left" app:popEnterAnim="@anim/slide_in_left"
@ -580,17 +544,6 @@
android:id="@+id/action_accountSettingsFragment_to_signOutFragment" android:id="@+id/action_accountSettingsFragment_to_signOutFragment"
app:destination="@id/signOutFragment" /> app:destination="@id/signOutFragment" />
</fragment> </fragment>
<fragment
android:id="@+id/searchEngineFragment"
android:name="org.mozilla.fenix.settings.search.SearchEngineFragment"
android:label="@string/preferences_search">
<action
android:id="@+id/action_searchEngineFragment_to_addSearchEngineFragment"
app:destination="@+id/addSearchEngineFragment" />
<action
android:id="@+id/action_searchEngineFragment_to_editCustomSearchEngineFragment"
app:destination="@+id/editCustomSearchEngineFragment" />
</fragment>
<fragment <fragment
android:id="@+id/turnOnSyncFragment" android:id="@+id/turnOnSyncFragment"
@ -782,16 +735,6 @@
<fragment <fragment
android:id="@+id/addNewDeviceFragment" android:id="@+id/addNewDeviceFragment"
android:name="org.mozilla.fenix.share.AddNewDeviceFragment" /> android:name="org.mozilla.fenix.share.AddNewDeviceFragment" />
<fragment
android:id="@+id/addSearchEngineFragment"
android:name="org.mozilla.fenix.settings.search.AddSearchEngineFragment" />
<fragment
android:id="@+id/editCustomSearchEngineFragment"
android:name="org.mozilla.fenix.settings.search.EditCustomSearchEngineFragment">
<argument
android:name="searchEngineIdentifier"
app:argType="string" />
</fragment>
<fragment <fragment
android:id="@+id/localeSettingsFragment" android:id="@+id/localeSettingsFragment"
android:name="org.mozilla.fenix.settings.advanced.LocaleSettingsFragment" /> android:name="org.mozilla.fenix.settings.advanced.LocaleSettingsFragment" />
@ -799,63 +742,6 @@
android:id="@+id/saveLoginSettingFragment" android:id="@+id/saveLoginSettingFragment"
android:name="org.mozilla.fenix.settings.logins.fragment.SavedLoginsSettingFragment" android:name="org.mozilla.fenix.settings.logins.fragment.SavedLoginsSettingFragment"
android:label="SaveLoginSettingFragment" /> android:label="SaveLoginSettingFragment" />
<fragment
android:id="@+id/addonsManagementFragment"
android:name="org.mozilla.fenix.addons.AddonsManagementFragment">
<action
android:id="@+id/action_addonsManagementFragment_to_addonDetailsFragment"
app:destination="@id/addonDetailsFragment" />
<action
android:id="@+id/action_addonsManagementFragment_to_installedAddonDetails"
app:destination="@id/installedAddonDetailsFragment" />
<action
android:id="@+id/action_addonsManagementFragment_to_notYetSupportedAddonFragment"
app:destination="@id/notYetSupportedAddonFragment" />
</fragment>
<fragment
android:id="@+id/addonDetailsFragment"
android:name="org.mozilla.fenix.addons.AddonDetailsFragment">
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
<fragment
android:id="@+id/installedAddonDetailsFragment"
android:name="org.mozilla.fenix.addons.InstalledAddonDetailsFragment">
<action
android:id="@+id/action_installedAddonFragment_to_addonInternalSettingsFragment"
app:destination="@id/addonInternalSettingsFragment" />
<action
android:id="@+id/action_installedAddonFragment_to_addonDetailsFragment"
app:destination="@id/addonDetailsFragment" />
<action
android:id="@+id/action_installedAddonFragment_to_addonPermissionsDetailsFragment"
app:destination="@id/addonPermissionsDetailFragment" />
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
<fragment
android:id="@+id/notYetSupportedAddonFragment"
android:name="org.mozilla.fenix.addons.NotYetSupportedAddonFragment">
<argument
android:name="addons"
app:argType="mozilla.components.feature.addons.Addon[]" />
</fragment>
<fragment
android:id="@+id/addonInternalSettingsFragment"
android:name="org.mozilla.fenix.addons.AddonInternalSettingsFragment">
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
<fragment
android:id="@+id/addonPermissionsDetailFragment"
android:name="org.mozilla.fenix.addons.AddonPermissionsDetailsFragment">
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
<fragment <fragment
android:id="@+id/webExtensionActionPopupFragment" android:id="@+id/webExtensionActionPopupFragment"
android:name="org.mozilla.fenix.addons.WebExtensionActionPopupFragment"> android:name="org.mozilla.fenix.addons.WebExtensionActionPopupFragment">
@ -870,4 +756,137 @@
<dialog <dialog
android:id="@+id/tabHistoryDialogFragment" android:id="@+id/tabHistoryDialogFragment"
android:name="org.mozilla.fenix.tabhistory.TabHistoryDialogFragment" /> android:name="org.mozilla.fenix.tabhistory.TabHistoryDialogFragment" />
<navigation android:id="@+id/site_permissions_exceptions_graph"
app:startDestination="@id/sitePermissionsExceptionsFragment">
<fragment
android:id="@+id/sitePermissionsExceptionsFragment"
android:name="org.mozilla.fenix.settings.sitepermissions.SitePermissionsExceptionsFragment"
android:label="@string/preference_exceptions"
tools:layout="@layout/fragment_site_permissions_exceptions">
<action
android:id="@+id/action_site_permissions_to_exceptions_to_site_permissions_details"
app:destination="@id/sitePermissionsDetailsExceptionsFragment"
app:popUpTo="@+id/sitePermissionsExceptionsFragment" />
</fragment>
<fragment
android:id="@+id/sitePermissionsManageExceptionsPhoneFeatureFragment"
android:name="org.mozilla.fenix.settings.sitepermissions.SitePermissionsManageExceptionsPhoneFeatureFragment"
tools:layout="@layout/fragment_manage_site_permissions_feature_phone">
<argument
android:name="phoneFeature"
app:argType="org.mozilla.fenix.settings.PhoneFeature" />
<argument
android:name="sitePermissions"
app:argType="mozilla.components.feature.sitepermissions.SitePermissions" />
</fragment>
<fragment
android:id="@+id/sitePermissionsDetailsExceptionsFragment"
android:name="org.mozilla.fenix.settings.sitepermissions.SitePermissionsDetailsExceptionsFragment">
<action
android:id="@+id/action_site_permissions_to_exceptions_to_manage_phone_feature"
app:destination="@id/sitePermissionsManageExceptionsPhoneFeatureFragment"
app:popUpTo="@+id/sitePermissionsDetailsExceptionsFragment" />
<argument
android:name="sitePermissions"
app:argType="mozilla.components.feature.sitepermissions.SitePermissions" />
</fragment>
</navigation>
<navigation android:id="@+id/addons_management_graph"
app:startDestination="@id/addonsManagementFragment">
<fragment
android:id="@+id/addonsManagementFragment"
android:name="org.mozilla.fenix.addons.AddonsManagementFragment"
tools:layout="@layout/fragment_add_ons_management">
<action
android:id="@+id/action_addonsManagementFragment_to_addonDetailsFragment"
app:destination="@id/addonDetailsFragment" />
<action
android:id="@+id/action_addonsManagementFragment_to_installedAddonDetails"
app:destination="@id/installedAddonDetailsFragment" />
<action
android:id="@+id/action_addonsManagementFragment_to_notYetSupportedAddonFragment"
app:destination="@id/notYetSupportedAddonFragment" />
</fragment>
<fragment
android:id="@+id/installedAddonDetailsFragment"
android:name="org.mozilla.fenix.addons.InstalledAddonDetailsFragment"
tools:layout="@layout/fragment_installed_add_on_details">
<action
android:id="@+id/action_installedAddonFragment_to_addonInternalSettingsFragment"
app:destination="@id/addonInternalSettingsFragment" />
<action
android:id="@+id/action_installedAddonFragment_to_addonDetailsFragment"
app:destination="@id/addonDetailsFragment" />
<action
android:id="@+id/action_installedAddonFragment_to_addonPermissionsDetailsFragment"
app:destination="@id/addonPermissionsDetailFragment" />
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
<fragment
android:id="@+id/notYetSupportedAddonFragment"
android:name="org.mozilla.fenix.addons.NotYetSupportedAddonFragment"
tools:layout="@layout/fragment_not_yet_supported_addons">
<argument
android:name="addons"
app:argType="mozilla.components.feature.addons.Addon[]" />
</fragment>
<fragment
android:id="@+id/addonPermissionsDetailFragment"
android:name="org.mozilla.fenix.addons.AddonPermissionsDetailsFragment"
tools:layout="@layout/fragment_add_on_permissions">
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
<fragment
android:id="@+id/addonInternalSettingsFragment"
android:name="org.mozilla.fenix.addons.AddonInternalSettingsFragment"
tools:layout="@layout/fragment_add_on_internal_settings">
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
<fragment
android:id="@+id/addonDetailsFragment"
android:name="org.mozilla.fenix.addons.AddonDetailsFragment"
tools:layout="@layout/fragment_add_on_details">
<argument
android:name="addon"
app:argType="mozilla.components.feature.addons.Addon" />
</fragment>
</navigation>
<navigation android:id="@+id/search_engine_graph"
app:startDestination="@id/searchEngineFragment">
<fragment
android:id="@+id/searchEngineFragment"
android:name="org.mozilla.fenix.settings.search.SearchEngineFragment"
android:label="@string/preferences_search">
<action
android:id="@+id/action_searchEngineFragment_to_addSearchEngineFragment"
app:destination="@+id/addSearchEngineFragment" />
<action
android:id="@+id/action_searchEngineFragment_to_editCustomSearchEngineFragment"
app:destination="@+id/editCustomSearchEngineFragment" />
</fragment>
<fragment
android:id="@+id/addSearchEngineFragment"
android:name="org.mozilla.fenix.settings.search.AddSearchEngineFragment"
tools:layout="@layout/fragment_add_search_engine" />
<fragment
android:id="@+id/editCustomSearchEngineFragment"
android:name="org.mozilla.fenix.settings.search.EditCustomSearchEngineFragment"
tools:layout="@layout/fragment_add_search_engine">
<argument
android:name="searchEngineIdentifier"
app:argType="string" />
</fragment>
</navigation>
</navigation> </navigation>

View File

@ -30,6 +30,7 @@ import mozilla.components.browser.state.state.BrowserState
import mozilla.components.browser.state.state.ReaderState import mozilla.components.browser.state.state.ReaderState
import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.state.createTab
import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.state.store.BrowserStore
import mozilla.components.concept.engine.EngineSession
import mozilla.components.concept.engine.EngineView import mozilla.components.concept.engine.EngineView
import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.concept.engine.prompt.ShareData
import mozilla.components.feature.search.SearchUseCases import mozilla.components.feature.search.SearchUseCases
@ -235,7 +236,7 @@ class DefaultBrowserToolbarControllerTest {
@Test @Test
fun handleToolbarReloadPress() = runBlockingTest { fun handleToolbarReloadPress() = runBlockingTest {
val item = ToolbarMenu.Item.Reload val item = ToolbarMenu.Item.Reload(false)
every { activity.components.useCases.sessionUseCases } returns sessionUseCases every { activity.components.useCases.sessionUseCases } returns sessionUseCases
@ -246,6 +247,24 @@ class DefaultBrowserToolbarControllerTest {
verify { sessionUseCases.reload(currentSession) } verify { sessionUseCases.reload(currentSession) }
} }
@Test
fun handleToolbarReloadLongPress() = runBlockingTest {
val item = ToolbarMenu.Item.Reload(true)
every { activity.components.useCases.sessionUseCases } returns sessionUseCases
val controller = createController(scope = this)
controller.handleToolbarItemInteraction(item)
verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.RELOAD)) }
verify {
sessionUseCases.reload(
currentSession,
EngineSession.LoadUrlFlags.select(EngineSession.LoadUrlFlags.BYPASS_CACHE)
)
}
}
@Test @Test
fun handleToolbarStopPress() = runBlockingTest { fun handleToolbarStopPress() = runBlockingTest {
val item = ToolbarMenu.Item.Stop val item = ToolbarMenu.Item.Stop