From d2b8decaeb28057471e1dbc579825dc15a6d7cc6 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Mon, 14 Dec 2020 14:45:10 +0100 Subject: [PATCH 001/205] Switch to new feature-tab-collections API. --- .../mozilla/fenix/browser/BrowserFragment.kt | 5 +- .../CollectionCreationController.kt | 23 +++---- .../collections/CollectionCreationFragment.kt | 2 +- .../java/org/mozilla/fenix/components/Core.kt | 1 - .../fenix/components/TabCollectionStorage.kt | 24 ++----- .../org/mozilla/fenix/home/HomeFragment.kt | 1 + .../SessionControlController.kt | 8 ++- .../fenix/tabtray/TabTrayController.kt | 9 +-- .../fenix/tabtray/TabTrayDialogFragment.kt | 8 +-- ...DefaultCollectionCreationControllerTest.kt | 65 ++++++++++--------- .../DefaultSessionControlControllerTest.kt | 23 +++++-- .../tabtray/DefaultTabTrayControllerTest.kt | 27 ++++---- 12 files changed, 105 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 6958a3233..7acebb187 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -19,6 +19,7 @@ import kotlinx.android.synthetic.main.fragment_browser.view.* import kotlinx.coroutines.ExperimentalCoroutinesApi import mozilla.components.browser.session.Session import mozilla.components.browser.state.selector.findTab +import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.thumbnails.BrowserThumbnails import mozilla.components.browser.toolbar.BrowserToolbar import mozilla.components.feature.app.links.AppLinksUseCases @@ -257,11 +258,11 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { } private val collectionStorageObserver = object : TabCollectionStorage.Observer { - override fun onCollectionCreated(title: String, sessions: List, id: Long?) { + override fun onCollectionCreated(title: String, sessions: List, id: Long?) { showTabSavedToCollectionSnackbar(sessions.size, true) } - override fun onTabsAdded(tabCollection: TabCollection, sessions: List) { + override fun onTabsAdded(tabCollection: TabCollection, sessions: List) { showTabSavedToCollectionSnackbar(sessions.size) } diff --git a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt index 0429f6b7c..a55e65957 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationController.kt @@ -9,14 +9,15 @@ package org.mozilla.fenix.collections import androidx.annotation.VisibleForTesting import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import mozilla.components.browser.session.Session -import mozilla.components.browser.session.SessionManager +import mozilla.components.browser.state.selector.findTab +import mozilla.components.browser.state.selector.normalTabs +import mozilla.components.browser.state.state.TabSessionState +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.tab.collections.TabCollection import org.mozilla.fenix.components.TabCollectionStorage import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.MetricController import org.mozilla.fenix.ext.getDefaultCollectionNumber -import org.mozilla.fenix.ext.normalSessionSize import org.mozilla.fenix.home.Tab interface CollectionCreationController { @@ -59,24 +60,24 @@ interface CollectionCreationController { fun removeTabFromSelection(tab: Tab) } -fun List.toSessionBundle(sessionManager: SessionManager): List { - return this.mapNotNull { sessionManager.findSessionById(it.sessionId) } +fun List.toTabSessionStateList(store: BrowserStore): List { + return this.mapNotNull { store.state.findTab(it.sessionId) } } /** * @param store Store used to hold in-memory collection state. + * @param browserStore The global `BrowserStore` instance. * @param dismiss Callback to dismiss the collection creation dialog. * @param metrics Controller that handles telemetry events. * @param tabCollectionStorage Storage used to save tab collections to disk. - * @param sessionManager Used to query and serialize tabs. * @param scope Coroutine scope to launch coroutines. */ class DefaultCollectionCreationController( private val store: CollectionCreationStore, + private val browserStore: BrowserStore, private val dismiss: () -> Unit, private val metrics: MetricController, private val tabCollectionStorage: TabCollectionStorage, - private val sessionManager: SessionManager, private val scope: CoroutineScope ) : CollectionCreationController { @@ -88,13 +89,13 @@ class DefaultCollectionCreationController( override fun saveCollectionName(tabs: List, name: String) { dismiss() - val sessionBundle = tabs.toSessionBundle(sessionManager) + val sessionBundle = tabs.toTabSessionStateList(browserStore) scope.launch { tabCollectionStorage.createCollection(name, sessionBundle) } metrics.track( - Event.CollectionSaved(sessionManager.normalSessionSize(), sessionBundle.size) + Event.CollectionSaved(browserStore.state.normalTabs.size, sessionBundle.size) ) } @@ -129,14 +130,14 @@ class DefaultCollectionCreationController( override fun selectCollection(collection: TabCollection, tabs: List) { dismiss() - val sessionBundle = tabs.toList().toSessionBundle(sessionManager) + val sessionBundle = tabs.toList().toTabSessionStateList(browserStore) scope.launch { tabCollectionStorage .addTabsToCollection(collection, sessionBundle) } metrics.track( - Event.CollectionTabsAdded(sessionManager.normalSessionSize(), sessionBundle.size) + Event.CollectionTabsAdded(browserStore.state.normalTabs.size, sessionBundle.size) ) } diff --git a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt index bb09b0d9c..012a73c88 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationFragment.kt @@ -55,10 +55,10 @@ class CollectionCreationFragment : DialogFragment() { collectionCreationInteractor = DefaultCollectionCreationInteractor( DefaultCollectionCreationController( collectionCreationStore, + requireComponents.core.store, ::dismiss, requireComponents.analytics.metrics, requireComponents.core.tabCollectionStorage, - requireComponents.core.sessionManager, scope = lifecycleScope ) ) diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 1161ae7fa..8b04d719b 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -346,7 +346,6 @@ class Core( val tabCollectionStorage by lazyMonitored { TabCollectionStorage( context, - sessionManager, strictMode ) } diff --git a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt index 39da157c8..2347fe706 100644 --- a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt @@ -8,12 +8,11 @@ import android.content.Context import android.os.StrictMode import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData -import androidx.paging.DataSource import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import mozilla.components.browser.session.Session -import mozilla.components.browser.session.SessionManager +import mozilla.components.browser.session.storage.BrowserStateSerializer +import mozilla.components.browser.state.state.TabSessionState import mozilla.components.feature.tab.collections.Tab import mozilla.components.feature.tab.collections.TabCollection import mozilla.components.feature.tab.collections.TabCollectionStorage @@ -28,7 +27,6 @@ import org.mozilla.fenix.utils.Mockable @Mockable class TabCollectionStorage( private val context: Context, - private val sessionManager: SessionManager, strictMode: StrictModeManager, private val delegate: Observable = ObserverRegistry() ) : Observable by delegate { @@ -40,12 +38,12 @@ class TabCollectionStorage( /** * A collection has been created */ - fun onCollectionCreated(title: String, sessions: List, id: Long?) = Unit + fun onCollectionCreated(title: String, sessions: List, id: Long?) = Unit /** * Tab(s) have been added to collection */ - fun onTabsAdded(tabCollection: TabCollection, sessions: List) = Unit + fun onTabsAdded(tabCollection: TabCollection, sessions: List) = Unit /** * Collection has been renamed @@ -58,32 +56,24 @@ class TabCollectionStorage( private val collectionStorage by lazy { strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { - TabCollectionStorage(context, sessionManager) + TabCollectionStorage(context, BrowserStateSerializer()) } } - suspend fun createCollection(title: String, sessions: List) = ioScope.launch { + suspend fun createCollection(title: String, sessions: List) = ioScope.launch { val id = collectionStorage.createCollection(title, sessions) notifyObservers { onCollectionCreated(title, sessions, id) } }.join() - suspend fun addTabsToCollection(tabCollection: TabCollection, sessions: List) = ioScope.launch { + suspend fun addTabsToCollection(tabCollection: TabCollection, sessions: List) = ioScope.launch { collectionStorage.addTabsToCollection(tabCollection, sessions) notifyObservers { onTabsAdded(tabCollection, sessions) } }.join() - fun getTabCollectionsCount(): Int { - return collectionStorage.getTabCollectionsCount() - } - fun getCollections(): LiveData> { return collectionStorage.getCollections().asLiveData() } - fun getCollectionsPaged(): DataSource.Factory { - return collectionStorage.getCollectionsPaged() - } - suspend fun removeCollection(tabCollection: TabCollection) = ioScope.launch { collectionStorage.removeCollection(tabCollection) }.join() diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index a6da5c157..9de1ca29a 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -239,6 +239,7 @@ class HomeFragment : Fragment() { sessionManager = sessionManager, tabCollectionStorage = components.core.tabCollectionStorage, addTabUseCase = components.useCases.tabsUseCases.addTab, + restoreUseCase = components.useCases.tabsUseCases.restore, reloadUrlUseCase = components.useCases.sessionUseCases.reload, fragmentStore = homeFragmentStore, navController = findNavController(), diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt index a7c1ac97b..d73d57aa1 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/SessionControlController.kt @@ -18,7 +18,7 @@ import mozilla.components.concept.engine.Engine import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.feature.session.SessionUseCases import mozilla.components.feature.tab.collections.TabCollection -import mozilla.components.feature.tab.collections.ext.restore +import mozilla.components.feature.tab.collections.ext.invoke import mozilla.components.feature.tabs.TabsUseCases import mozilla.components.feature.top.sites.TopSite import mozilla.components.support.ktx.android.view.showKeyboard @@ -177,6 +177,7 @@ class DefaultSessionControlController( private val store: BrowserStore, private val tabCollectionStorage: TabCollectionStorage, private val addTabUseCase: TabsUseCases.AddNewTabUseCase, + private val restoreUseCase: TabsUseCases.RestoreUseCase, private val reloadUrlUseCase: SessionUseCases.ReloadUrlUseCase, private val fragmentStore: HomeFragmentStore, private val navController: NavController, @@ -208,7 +209,8 @@ class DefaultSessionControlController( override fun handleCollectionOpenTabClicked(tab: ComponentTab) { dismissSearchDialogIfDisplayed() - sessionManager.restore( + + restoreUseCase.invoke( activity, engine, tab, @@ -229,7 +231,7 @@ class DefaultSessionControlController( } override fun handleCollectionOpenTabsTapped(collection: TabCollection) { - sessionManager.restore( + restoreUseCase.invoke( activity, engine, collection, diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt index f6e4ce768..4a5dfa5a4 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayController.kt @@ -9,11 +9,12 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.launch import mozilla.appservices.places.BookmarkRoot -import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager +import mozilla.components.browser.state.selector.findTab import mozilla.components.browser.state.selector.getNormalOrPrivateTabs import mozilla.components.browser.state.selector.normalTabs import mozilla.components.browser.state.state.BrowserState +import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.base.profiler.Profiler import mozilla.components.concept.engine.prompt.ShareData @@ -100,8 +101,8 @@ class DefaultTabTrayController( private val registerCollectionStorageObserver: () -> Unit, private val tabTrayDialogFragmentStore: TabTrayDialogFragmentStore, private val selectTabUseCase: TabsUseCases.SelectTabUseCase, - private val showChooseCollectionDialog: (List) -> Unit, - private val showAddNewCollectionDialog: (List) -> Unit, + private val showChooseCollectionDialog: (List) -> Unit, + private val showAddNewCollectionDialog: (List) -> Unit, private val showUndoSnackbarForTabs: () -> Unit, private val showBookmarksSnackbar: () -> Unit ) : TabTrayController { @@ -129,7 +130,7 @@ class DefaultTabTrayController( metrics.track(Event.TabsTraySaveToCollectionPressed) val sessionList = selectedTabs.map { - sessionManager.findSessionById(it.id) ?: return + browserStore.state.findTab(it.id) ?: return } // Only register the observer right before moving to collection creation diff --git a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt index 88317629c..7cb011e2a 100644 --- a/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/tabtray/TabTrayDialogFragment.kt @@ -86,11 +86,11 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler else null private val collectionStorageObserver = object : TabCollectionStorage.Observer { - override fun onCollectionCreated(title: String, sessions: List, id: Long?) { + override fun onCollectionCreated(title: String, sessions: List, id: Long?) { showCollectionSnackbar(sessions.size, true, collectionToSelect = id) } - override fun onTabsAdded(tabCollection: TabCollection, sessions: List) { + override fun onTabsAdded(tabCollection: TabCollection, sessions: List) { showCollectionSnackbar( sessions.size, collectionToSelect = tabCollection.id @@ -424,7 +424,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler return true } - private fun showChooseCollectionDialog(sessionList: List) { + private fun showChooseCollectionDialog(sessionList: List) { context?.let { val tabCollectionStorage = it.components.core.tabCollectionStorage val collections = @@ -467,7 +467,7 @@ class TabTrayDialogFragment : AppCompatDialogFragment(), UserInteractionHandler } } - private fun showAddNewCollectionDialog(sessionList: List) { + private fun showAddNewCollectionDialog(sessionList: List) { context?.let { val tabCollectionStorage = it.components.core.tabCollectionStorage val customLayout = diff --git a/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt b/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt index 0869cdd11..5af2f79a6 100644 --- a/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/collections/DefaultCollectionCreationControllerTest.kt @@ -1,3 +1,7 @@ +/* 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.collections import io.mockk.MockKAnnotations @@ -10,10 +14,12 @@ import io.mockk.verifyAll import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.TestCoroutineScope import kotlinx.coroutines.test.runBlockingTest -import mozilla.components.browser.session.Session -import mozilla.components.browser.session.SessionManager +import mozilla.components.browser.state.action.TabListAction import mozilla.components.browser.state.state.MediaState +import mozilla.components.browser.state.state.createTab +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.tab.collections.TabCollection +import mozilla.components.support.test.ext.joinBlocking import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertNull @@ -35,7 +41,7 @@ class DefaultCollectionCreationControllerTest { @MockK(relaxed = true) private lateinit var dismiss: () -> Unit @MockK(relaxUnitFun = true) private lateinit var metrics: MetricController @MockK(relaxUnitFun = true) private lateinit var tabCollectionStorage: TabCollectionStorage - @MockK private lateinit var sessionManager: SessionManager + private lateinit var browserStore: BrowserStore @Before fun before() { @@ -47,9 +53,15 @@ class DefaultCollectionCreationControllerTest { ) every { store.state } answers { state } + browserStore = BrowserStore() + controller = DefaultCollectionCreationController( - store, dismiss, metrics, - tabCollectionStorage, sessionManager, testCoroutineScope + store, + browserStore, + dismiss, + metrics, + tabCollectionStorage, + testCoroutineScope ) } @@ -60,14 +72,13 @@ class DefaultCollectionCreationControllerTest { @Test fun `GIVEN tab list WHEN saveCollectionName is called THEN collection should be created`() { - val session = mockSession(sessionId = "session-1") - val sessions = listOf( - session, - mockSession(sessionId = "session-2") - ) - every { sessionManager.findSessionById("session-1") } returns session - every { sessionManager.findSessionById("null-session") } returns null - every { sessionManager.sessions } returns sessions + val tab1 = createTab("https://www.mozilla.org", id = "session-1") + val tab2 = createTab("https://www.mozilla.org", id = "session-2") + + browserStore.dispatch( + TabListAction.AddMultipleTabsAction(listOf(tab1, tab2)) + ).joinBlocking() + val tabs = listOf( Tab("session-1", "", "", "", mediaState = MediaState.State.NONE), Tab("null-session", "", "", "", mediaState = MediaState.State.NONE) @@ -76,7 +87,7 @@ class DefaultCollectionCreationControllerTest { controller.saveCollectionName(tabs, "name") verify { dismiss() } - coVerify { tabCollectionStorage.createCollection("name", listOf(session)) } + coVerify { tabCollectionStorage.createCollection("name", listOf(tab1)) } verify { metrics.track(Event.CollectionSaved(2, 1)) } } @@ -154,13 +165,13 @@ class DefaultCollectionCreationControllerTest { @Test fun `WHEN selectCollection is called THEN add tabs should be added to collection`() { - val session = mockSession(sessionId = "session-1") - val sessions = listOf( - session, - mockSession(sessionId = "session-2") - ) - every { sessionManager.findSessionById("session-1") } returns session - every { sessionManager.sessions } returns sessions + val tab1 = createTab("https://www.mozilla.org", id = "session-1") + val tab2 = createTab("https://www.mozilla.org", id = "session-2") + + browserStore.dispatch( + TabListAction.AddMultipleTabsAction(listOf(tab1, tab2)) + ).joinBlocking() + val tabs = listOf( Tab("session-1", "", "", "", mediaState = MediaState.State.NONE) ) @@ -169,7 +180,7 @@ class DefaultCollectionCreationControllerTest { controller.selectCollection(collection, tabs) verify { dismiss() } - coVerify { tabCollectionStorage.addTabsToCollection(collection, listOf(session)) } + coVerify { tabCollectionStorage.addTabsToCollection(collection, listOf(tab1)) } verify { metrics.track(Event.CollectionTabsAdded(2, 1)) } } @@ -246,14 +257,4 @@ class DefaultCollectionCreationControllerTest { verify { store.dispatch(CollectionCreationAction.StepChanged(SaveCollectionStep.SelectCollection, 2)) } } - - private fun mockSession( - sessionId: String? = null, - isPrivate: Boolean = false, - isCustom: Boolean = false - ) = mockk { - sessionId?.let { every { id } returns it } - every { private } returns isPrivate - every { isCustomTabSession() } returns isCustom - } } diff --git a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt index 28211359f..fb9545bfe 100644 --- a/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/home/DefaultSessionControlControllerTest.kt @@ -15,7 +15,9 @@ import kotlinx.coroutines.test.TestCoroutineScope import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.search.SearchEngine import mozilla.components.browser.state.state.BrowserState +import mozilla.components.browser.state.state.ReaderState import mozilla.components.browser.state.state.SearchState +import mozilla.components.browser.state.state.recover.RecoverableTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.engine.Engine import mozilla.components.feature.session.SessionUseCases @@ -108,6 +110,8 @@ class DefaultSessionControlControllerTest { every { activity.components.analytics } returns analytics every { analytics.metrics } returns metrics + val restoreUseCase: TabsUseCases.RestoreUseCase = mockk(relaxed = true) + controller = DefaultSessionControlController( activity = activity, store = store, @@ -118,6 +122,7 @@ class DefaultSessionControlControllerTest { tabCollectionStorage = tabCollectionStorage, addTabUseCase = tabsUseCases.addTab, reloadUrlUseCase = reloadUrlUseCase.reload, + restoreUseCase = restoreUseCase, fragmentStore = fragmentStore, navController = navController, viewLifecycleScope = scope, @@ -173,12 +178,22 @@ class DefaultSessionControlControllerTest { @Test fun `handleCollectionOpenTabClicked onTabRestored`() { + val restoredTab = RecoverableTab( + id = "test", + parentId = null, + url = "https://www.mozilla.org", + title = "Mozilla", + state = null, + contextId = null, + readerState = ReaderState(), + lastAccess = 0, + private = false + ) + val tab = mockk { - every { restore(activity, engine, restoreSessionId = false) } returns mockk { - every { session } returns mockk() - every { engineSessionState } returns mockk() - } + every { restore(activity, engine, restoreSessionId = false) } returns restoredTab } + controller.handleCollectionOpenTabClicked(tab) verify { metrics.track(Event.CollectionTabRestored) } diff --git a/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt b/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt index 284bb0de9..7beace900 100644 --- a/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt +++ b/app/src/test/java/org/mozilla/fenix/tabtray/DefaultTabTrayControllerTest.kt @@ -21,6 +21,7 @@ import kotlinx.coroutines.test.TestCoroutineScope import mozilla.components.browser.session.Session import mozilla.components.browser.session.SessionManager import mozilla.components.browser.state.state.BrowserState +import mozilla.components.browser.state.state.TabSessionState import mozilla.components.browser.state.state.createTab import mozilla.components.browser.state.store.BrowserStore import mozilla.components.concept.base.profiler.Profiler @@ -48,20 +49,12 @@ class DefaultTabTrayControllerTest { private val profiler: Profiler? = mockk(relaxed = true) private val navController: NavController = mockk() private val sessionManager: SessionManager = mockk(relaxed = true) - var store = BrowserStore( - BrowserState( - tabs = listOf( - createTab(url = "http://firefox.com", id = "5678"), - createTab(url = "http://mozilla.org", id = "1234") - ), selectedTabId = "1234" - ) - ) private val browsingModeManager: BrowsingModeManager = mockk(relaxed = true) private val dismissTabTray: (() -> Unit) = mockk(relaxed = true) private val dismissTabTrayAndNavigateHome: ((String) -> Unit) = mockk(relaxed = true) private val registerCollectionStorageObserver: (() -> Unit) = mockk(relaxed = true) - private val showChooseCollectionDialog: ((List) -> Unit) = mockk(relaxed = true) - private val showAddNewCollectionDialog: ((List) -> Unit) = mockk(relaxed = true) + private val showChooseCollectionDialog: ((List) -> Unit) = mockk(relaxed = true) + private val showAddNewCollectionDialog: ((List) -> Unit) = mockk(relaxed = true) private val tabCollectionStorage: TabCollectionStorage = mockk(relaxed = true) private val bookmarksStorage: BookmarksStorage = mockk(relaxed = true) private val tabCollection: TabCollection = mockk() @@ -76,6 +69,9 @@ class DefaultTabTrayControllerTest { private lateinit var controller: DefaultTabTrayController + private val tab1 = createTab(url = "http://firefox.com", id = "5678") + private val tab2 = createTab(url = "http://mozilla.org", id = "1234") + private val session = Session( "mozilla.org", true @@ -90,6 +86,12 @@ class DefaultTabTrayControllerTest { fun setUp() { mockkStatic("org.mozilla.fenix.ext.SessionManagerKt") + val store = BrowserStore( + BrowserState( + tabs = listOf(tab1, tab2), selectedTabId = tab2.id + ) + ) + every { sessionManager.sessionsOfType(private = true) } returns listOf(session).asSequence() every { sessionManager.sessionsOfType(private = false) } returns listOf(nonPrivateSession).asSequence() every { sessionManager.createSessionSnapshot(any()) } returns SessionManager.Snapshot.Item( @@ -268,13 +270,14 @@ class DefaultTabTrayControllerTest { @Test fun onSaveToCollectionClicked() { - val tab = Tab("1234", "mozilla.org") + val tab = Tab(tab2.id, tab2.content.url) controller.handleSaveToCollectionClicked(setOf(tab)) + verify { metrics.track(Event.TabsTraySaveToCollectionPressed) registerCollectionStorageObserver() - showChooseCollectionDialog(listOf(session)) + showChooseCollectionDialog(listOf(tab2)) } } From 219029363396a0370f8ee75e10d408034e962ff3 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 16 Dec 2020 14:47:16 +0100 Subject: [PATCH 002/205] Update Android Components to 70.0.20201216094408 --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index ffa2b76a1..c2a084dfd 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "70.0.20201215143131" + const val VERSION = "70.0.20201216094408" } From d9db260d192038a1d7ce304faf5de7211f7d23c0 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Wed, 16 Dec 2020 15:49:11 +0100 Subject: [PATCH 003/205] Update Android Components version to 71.0.20201216143107. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index c2a084dfd..3532681c1 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "70.0.20201216094408" + const val VERSION = "71.0.20201216143107" } From b0277c3f390b1e1890c649a6bf54be47d8e393e3 Mon Sep 17 00:00:00 2001 From: Oana Horvath Date: Thu, 17 Dec 2020 10:13:35 +0200 Subject: [PATCH 004/205] For #16615: UI smoke test noCrashWithAddonInstalledTest --- .../java/org/mozilla/fenix/ui/SmokeTest.kt | 55 ++++++++++++++++++- .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 9 +++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 881855d37..a6c3e1d4c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -15,15 +15,14 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.mozilla.fenix.R +import org.mozilla.fenix.ext.settings import org.mozilla.fenix.helpers.AndroidAssetDispatcher import org.mozilla.fenix.helpers.HomeActivityTestRule import org.mozilla.fenix.helpers.RecyclerViewIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource -import org.mozilla.fenix.ui.robots.clickUrlbar -import org.mozilla.fenix.ui.robots.homeScreen -import org.mozilla.fenix.ui.robots.navigationToolbar +import org.mozilla.fenix.ui.robots.* /** * Test Suite that contains tests defined as part of the Smoke and Sanity check defined in Test rail. @@ -35,6 +34,7 @@ class SmokeTest { private lateinit var mockWebServer: MockWebServer private var awesomeBar: ViewVisibilityIdlingResource? = null private var searchSuggestionsIdlingResource: RecyclerViewIdlingResource? = null + private var addonsListIdlingResource: RecyclerViewIdlingResource? = null // This finds the dialog fragment child of the homeFragment, otherwise the awesomeBar would return null private fun getAwesomebarView(): View? { @@ -59,6 +59,18 @@ class SmokeTest { @After fun tearDown() { mockWebServer.shutdown() + + if (awesomeBar != null) { + IdlingRegistry.getInstance().unregister(awesomeBar!!) + } + + if (searchSuggestionsIdlingResource != null) { + IdlingRegistry.getInstance().unregister(searchSuggestionsIdlingResource!!) + } + + if (addonsListIdlingResource != null) { + IdlingRegistry.getInstance().unregister(addonsListIdlingResource!!) + } } // copied over from HomeScreenTest @@ -490,4 +502,41 @@ class SmokeTest { verifyUnblockedByAndroid() } } + + // Installs uBlock add-on and checks that the app doesn't crash while loading pages with trackers + @Test + fun noCrashWithAddonInstalledTest() { + //setting ETP to Strict mode to test it works with add-ons + activityTestRule.activity.settings().setStrictETP() + + val addonName = "uBlock Origin" + val trackingProtectionPage = + TestAssetHelper.getEnhancedTrackingProtectionAsset(mockWebServer) + + homeScreen { + }.openThreeDotMenu { + }.openAddonsManagerMenu { + addonsListIdlingResource = + RecyclerViewIdlingResource( + activityTestRule.activity.findViewById(R.id.add_ons_list), + 1 + ) + IdlingRegistry.getInstance().register(addonsListIdlingResource!!) + clickInstallAddon(addonName) + acceptInstallAddon() + verifyDownloadAddonPrompt(addonName, activityTestRule) + IdlingRegistry.getInstance().unregister(addonsListIdlingResource!!) + }.goBack { + }.openNavigationToolbar { + }.enterURLAndEnterToBrowser(trackingProtectionPage.url){} + enhancedTrackingProtection { + verifyEnhancedTrackingProtectionNotice() + }.closeNotificationPopup {} + + browserScreen { + }.openThreeDotMenu { + }.openReportSiteIssue { + verifyUrl("webcompat.com/issues/new") + } + } } diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index bbcd60285..e4e5768e4 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -251,6 +251,13 @@ class ThreeDotMenuMainRobot { return HomeScreenRobot.Transition() } + fun openReportSiteIssue(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { + reportSiteIssueButton().click() + + BrowserRobot().interact() + return BrowserRobot.Transition() + } + fun openFindInPage(interact: FindInPageRobot.() -> Unit): FindInPageRobot.Transition { onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) mDevice.waitNotNull(Until.findObject(By.text("Find in page")), waitingTime) @@ -444,6 +451,8 @@ private fun collectionNameTextField() = private fun assertCollectionNameTextField() = collectionNameTextField() .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) +private fun reportSiteIssueButton() = onView(withText("Report Site Issue…")) + private fun findInPageButton() = onView(allOf(withText("Find in page"))) private fun assertFindInPageButton() = findInPageButton() From 0a0dbeb13293317ee6fe89afd42359e7d2a2ea31 Mon Sep 17 00:00:00 2001 From: Oana Horvath Date: Thu, 17 Dec 2020 11:09:47 +0200 Subject: [PATCH 005/205] Added a description to each smoke test --- .../java/org/mozilla/fenix/ui/SmokeTest.kt | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index a6c3e1d4c..39e8dae1d 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -22,7 +22,11 @@ import org.mozilla.fenix.helpers.RecyclerViewIdlingResource import org.mozilla.fenix.helpers.TestAssetHelper import org.mozilla.fenix.helpers.TestHelper import org.mozilla.fenix.helpers.ViewVisibilityIdlingResource -import org.mozilla.fenix.ui.robots.* +import org.mozilla.fenix.ui.robots.browserScreen +import org.mozilla.fenix.ui.robots.clickUrlbar +import org.mozilla.fenix.ui.robots.enhancedTrackingProtection +import org.mozilla.fenix.ui.robots.homeScreen +import org.mozilla.fenix.ui.robots.navigationToolbar /** * Test Suite that contains tests defined as part of the Smoke and Sanity check defined in Test rail. @@ -124,6 +128,7 @@ class SmokeTest { } @Test + // Verifies the functionality of the onboarding Start Browsing button fun startBrowsingButtonTest() { homeScreen { verifyStartBrowsingButton() @@ -133,6 +138,13 @@ class SmokeTest { } @Test + /* Verifies the nav bar: + - opening a web page + - the existence of nav bar items + - editing the url bar + - the tab drawer button + - opening a new search and dismissing the nav bar + */ fun verifyBasicNavigationToolbarFunctionality() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -153,6 +165,7 @@ class SmokeTest { } @Test + // Verifies the list of items in a tab's 3 dot menu fun verifyPageMainMenuItemsTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -165,6 +178,7 @@ class SmokeTest { // Could be removed when more smoke tests from the History category are added @Test + // Verifies the History menu opens from a tab's 3 dot menu fun openMainMenuHistoryItemTest() { homeScreen { }.openThreeDotMenu { @@ -175,6 +189,7 @@ class SmokeTest { // Could be removed when more smoke tests from the Bookmarks category are added @Test + // Verifies the Bookmarks menu opens from a tab's 3 dot menu fun openMainMenuBookmarksItemTest() { homeScreen { }.openThreeDotMenu { @@ -184,6 +199,7 @@ class SmokeTest { } @Test + // Verifies the Synced tabs menu opens from a tab's 3 dot menu fun openMainMenuSyncedTabsItemTest() { homeScreen { }.openThreeDotMenu { @@ -194,6 +210,7 @@ class SmokeTest { // Could be removed when more smoke tests from the Settings category are added @Test + // Verifies the Settings menu opens from a tab's 3 dot menu fun openMainMenuSettingsItemTest() { homeScreen { }.openThreeDotMenu { @@ -203,6 +220,7 @@ class SmokeTest { } @Test + // Verifies the Find in page option in a tab's 3 dot menu fun openMainMenuFindInPageTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -215,6 +233,7 @@ class SmokeTest { } @Test + // Verifies the Add to top sites option in a tab's 3 dot menu fun openMainMenuAddTopSiteTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -231,6 +250,7 @@ class SmokeTest { } @Test + // Verifies the Add to home screen option in a tab's 3 dot menu fun mainMenuAddToHomeScreenTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -247,6 +267,7 @@ class SmokeTest { } @Test + // Verifies the Add to collection option in a tab's 3 dot menu fun openMainMenuAddToCollectionTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -259,6 +280,7 @@ class SmokeTest { } @Test + // Verifies the Bookmark button in a tab's 3 dot menu fun mainMenuBookmarkButtonTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -271,6 +293,7 @@ class SmokeTest { } @Test + // Verifies the Share button in a tab's 3 dot menu fun mainMenuShareButtonTest() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -283,6 +306,7 @@ class SmokeTest { } @Test + // Verifies the refresh button in a tab's 3 dot menu fun mainMenuRefreshButtonTest() { val refreshWebPage = TestAssetHelper.getRefreshAsset(mockWebServer) @@ -298,6 +322,7 @@ class SmokeTest { } @Test + // Turns ETP toggle off from Settings and verifies the ETP shield is not displayed in the nav bar fun verifyETPShieldNotDisplayedIfOFFGlobally() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -325,6 +350,7 @@ class SmokeTest { } @Test + // Verifies changing the default engine from the Search Shortcut menu fun verifySearchEngineCanBeChangedTemporarilyUsingShortcuts() { val defaultWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) @@ -373,6 +399,7 @@ class SmokeTest { } @Test + // Ads a new search engine from the list of custom engines fun addPredefinedSearchEngineTest() { homeScreen { }.openThreeDotMenu { @@ -392,8 +419,9 @@ class SmokeTest { } @Test + // Goes through the settings and changes the search suggestion toggle, then verifies it changes. fun toggleSearchSuggestions() { - // Goes through the settings and changes the search suggestion toggle, then verifies it changes. + homeScreen { }.openNavigationToolbar { typeSearchTerm("mozilla") @@ -425,6 +453,7 @@ class SmokeTest { } @Test + // Swipes the nav bar left/right to switch between tabs fun swipeToSwitchTabTest() { val firstWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 1) val secondWebPage = TestAssetHelper.getGenericAsset(mockWebServer, 2) @@ -442,6 +471,7 @@ class SmokeTest { } @Test + // Saves a login, then changes it and verifies the update fun updateSavedLoginTest() { val saveLoginTest = TestAssetHelper.getSaveLoginAsset(mockWebServer) @@ -473,6 +503,7 @@ class SmokeTest { } @Test + // Verifies that you can go to System settings and change app's permissions from inside the app fun redirectToAppPermissionsSystemSettingsTest() { homeScreen { }.openThreeDotMenu { @@ -503,10 +534,10 @@ class SmokeTest { } } - // Installs uBlock add-on and checks that the app doesn't crash while loading pages with trackers @Test + // Installs uBlock add-on and checks that the app doesn't crash while loading pages with trackers fun noCrashWithAddonInstalledTest() { - //setting ETP to Strict mode to test it works with add-ons + // setting ETP to Strict mode to test it works with add-ons activityTestRule.activity.settings().setStrictETP() val addonName = "uBlock Origin" @@ -528,7 +559,7 @@ class SmokeTest { IdlingRegistry.getInstance().unregister(addonsListIdlingResource!!) }.goBack { }.openNavigationToolbar { - }.enterURLAndEnterToBrowser(trackingProtectionPage.url){} + }.enterURLAndEnterToBrowser(trackingProtectionPage.url) {} enhancedTrackingProtection { verifyEnhancedTrackingProtectionNotice() }.closeNotificationPopup {} From 0b99669753b84970400fa89f684b25f9e2d0bf40 Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Wed, 16 Dec 2020 15:06:33 -0500 Subject: [PATCH 006/205] Closes #16949: Refactor OpenInAppOnboardingObserver to use browser store --- .../mozilla/fenix/browser/BrowserFragment.kt | 43 ++--- .../browser/OpenInAppOnboardingObserver.kt | 88 +++++++--- .../OpenInAppOnboardingObserverTest.kt | 152 +++++++++++------- 3 files changed, 178 insertions(+), 105 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 7acebb187..4dbf65271 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -51,9 +51,9 @@ import org.mozilla.fenix.trackingprotection.TrackingProtectionOverlay class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val windowFeature = ViewBoundFeatureWrapper() + private val openInAppOnboardingObserver = ViewBoundFeatureWrapper() private var readerModeAvailable = false - private var openInAppOnboardingObserver: OpenInAppOnboardingObserver? = null private var pwaOnboardingObserver: PwaOnboardingObserver? = null override fun onCreateView( @@ -142,6 +142,22 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { owner = this, view = view ) + + if (context.settings().shouldShowOpenInAppCfr) { + openInAppOnboardingObserver.set( + feature = OpenInAppOnboardingObserver( + context = context, + store = context.components.core.store, + lifecycleOwner = this, + navController = findNavController(), + settings = context.settings(), + appLinksUseCases = context.components.useCases.appLinksUseCases, + container = browserLayout as ViewGroup + ), + owner = this, + view = view + ) + } } } @@ -163,23 +179,6 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { // TODO Use browser store instead of session observer: https://github.com/mozilla-mobile/fenix/issues/16945 session?.register(toolbarSessionObserver, viewLifecycleOwner, autoPause = true) - if (settings.shouldShowOpenInAppCfr && session != null) { - openInAppOnboardingObserver = OpenInAppOnboardingObserver( - context = context, - navController = findNavController(), - settings = settings, - appLinksUseCases = context.components.useCases.appLinksUseCases, - container = browserLayout as ViewGroup - ) - @Suppress("DEPRECATION") - // TODO Use browser store instead of session observer: https://github.com/mozilla-mobile/fenix/issues/16949 - session.register( - openInAppOnboardingObserver!!, - owner = this, - autoPause = true - ) - } - if (!settings.userKnowsAboutPwas) { pwaOnboardingObserver = PwaOnboardingObserver( store = context.components.core.store, @@ -197,14 +196,6 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { override fun onStop() { super.onStop() - // This observer initialized in onStart has a reference to fragment's view. - // Prevent it leaking the view after the latter onDestroyView. - if (openInAppOnboardingObserver != null) { - @Suppress("DEPRECATION") - // TODO Use browser store instead of session observer: https://github.com/mozilla-mobile/fenix/issues/16949 - getSessionById()?.unregister(openInAppOnboardingObserver!!) - openInAppOnboardingObserver = null - } pwaOnboardingObserver?.stop() } diff --git a/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt index 0abb13a5d..1d129a027 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserver.kt @@ -7,10 +7,20 @@ package org.mozilla.fenix.browser import android.content.Context import android.view.ViewGroup import androidx.annotation.VisibleForTesting +import androidx.lifecycle.LifecycleOwner import androidx.navigation.NavController -import mozilla.components.browser.session.Session +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.cancel +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.mapNotNull +import mozilla.components.browser.state.selector.selectedTab +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.app.links.AppLinksUseCases +import mozilla.components.lib.state.ext.flowScoped +import mozilla.components.support.base.feature.LifecycleAwareFeature import mozilla.components.support.ktx.kotlin.tryGetHostFromUrl +import mozilla.components.support.ktx.kotlinx.coroutines.flow.ifAnyChanged import org.mozilla.fenix.R import org.mozilla.fenix.ext.nav import org.mozilla.fenix.utils.Settings @@ -18,51 +28,79 @@ import org.mozilla.fenix.utils.Settings /** * Displays an [InfoBanner] when a user visits a website that can be opened in an installed native app. */ +@ExperimentalCoroutinesApi +@Suppress("LongParameterList") class OpenInAppOnboardingObserver( private val context: Context, + private val store: BrowserStore, + private val lifecycleOwner: LifecycleOwner, private val navController: NavController, private val settings: Settings, private val appLinksUseCases: AppLinksUseCases, private val container: ViewGroup -) : Session.Observer { +) : LifecycleAwareFeature { + private var scope: CoroutineScope? = null + private var currentUrl: String? = null + private var sessionDomainForDisplayedBanner: String? = null - @VisibleForTesting - internal var sessionDomainForDisplayedBanner: String? = null @VisibleForTesting internal var infoBanner: InfoBanner? = null - override fun onUrlChanged(session: Session, url: String) { - sessionDomainForDisplayedBanner?.let { - if (url.tryGetHostFromUrl() != it) { - infoBanner?.dismiss() + override fun start() { + scope = store.flowScoped(lifecycleOwner) { flow -> + flow.mapNotNull { state -> + state.selectedTab + } + .ifAnyChanged { + tab -> arrayOf(tab.content.url, tab.content.loading) + } + .collect { tab -> + if (tab.content.url != currentUrl) { + sessionDomainForDisplayedBanner?.let { + if (tab.content.url.tryGetHostFromUrl() != it) { + infoBanner?.dismiss() + } + } + currentUrl = tab.content.url + } else { + // Loading state has changed + maybeShowOpenInAppBanner(tab.content.url, tab.content.loading) + } } } } - override fun onLoadingStateChanged(session: Session, loading: Boolean) { + override fun stop() { + scope?.cancel() + } + + private fun maybeShowOpenInAppBanner(url: String, loading: Boolean) { if (loading || settings.openLinksInExternalApp || !settings.shouldShowOpenInAppCfr) { return } val appLink = appLinksUseCases.appLinkRedirect - - if (appLink(session.url).hasExternalApp()) { - infoBanner = InfoBanner( - context = context, - message = context.getString(R.string.open_in_app_cfr_info_message), - dismissText = context.getString(R.string.open_in_app_cfr_negative_button_text), - actionText = context.getString(R.string.open_in_app_cfr_positive_button_text), - container = container - ) { - val directions = BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment( - preferenceToScrollTo = context.getString(R.string.pref_key_open_links_in_external_app) - ) - navController.nav(R.id.browserFragment, directions) - } - + if (appLink(url).hasExternalApp()) { + infoBanner = createInfoBanner() infoBanner?.showBanner() - sessionDomainForDisplayedBanner = session.url.tryGetHostFromUrl() + sessionDomainForDisplayedBanner = url.tryGetHostFromUrl() settings.shouldShowOpenInAppBanner = false } } + + @VisibleForTesting + internal fun createInfoBanner(): InfoBanner { + return InfoBanner( + context = context, + message = context.getString(R.string.open_in_app_cfr_info_message), + dismissText = context.getString(R.string.open_in_app_cfr_negative_button_text), + actionText = context.getString(R.string.open_in_app_cfr_positive_button_text), + container = container + ) { + val directions = BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment( + preferenceToScrollTo = context.getString(R.string.pref_key_open_links_in_external_app) + ) + navController.nav(R.id.browserFragment, directions) + } + } } diff --git a/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt b/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt index bc297d0c5..179d524d8 100644 --- a/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt @@ -5,16 +5,26 @@ package org.mozilla.fenix.browser import android.content.Context -import io.mockk.MockKAnnotations +import android.view.ViewGroup +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LifecycleRegistry +import androidx.navigation.NavController import io.mockk.every -import io.mockk.impl.annotations.MockK import io.mockk.mockk +import io.mockk.spyk import io.mockk.verify import kotlinx.coroutines.ExperimentalCoroutinesApi -import mozilla.components.browser.session.Session -import mozilla.components.feature.app.links.AppLinkRedirect +import kotlinx.coroutines.test.TestCoroutineDispatcher +import mozilla.components.browser.state.action.ContentAction +import mozilla.components.browser.state.state.BrowserState +import mozilla.components.browser.state.state.createTab +import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.app.links.AppLinksUseCases +import mozilla.components.support.test.ext.joinBlocking +import mozilla.components.support.test.rule.MainCoroutineRule import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mozilla.fenix.helpers.FenixRobolectricTestRunner @@ -24,90 +34,124 @@ import org.mozilla.fenix.utils.Settings @RunWith(FenixRobolectricTestRunner::class) class OpenInAppOnboardingObserverTest { - @MockK(relaxed = true) private lateinit var context: Context - @MockK(relaxed = true) private lateinit var settings: Settings - @MockK(relaxed = true) private lateinit var session: Session - @MockK(relaxed = true) private lateinit var appLinksUseCases: AppLinksUseCases - @MockK(relaxed = true) private lateinit var applinksRedirect: AppLinkRedirect - @MockK(relaxed = true) private lateinit var getAppLinkRedirect: AppLinksUseCases.GetAppLinkRedirect - @MockK(relaxed = true) private lateinit var infoBanner: InfoBanner + private lateinit var store: BrowserStore + private lateinit var lifecycleOwner: MockedLifecycleOwner + private lateinit var openInAppOnboardingObserver: OpenInAppOnboardingObserver + private lateinit var navigationController: NavController + private lateinit var settings: Settings + private lateinit var appLinksUseCases: AppLinksUseCases + private lateinit var context: Context + private lateinit var container: ViewGroup + private lateinit var infoBanner: InfoBanner + + private val testDispatcher = TestCoroutineDispatcher() + + @get:Rule + val coroutinesTestRule = MainCoroutineRule(testDispatcher) @Before - fun setup() { - MockKAnnotations.init(this) + fun setUp() { + store = BrowserStore( + BrowserState( + tabs = listOf( + createTab(url = "https://www.mozilla.org", id = "1") + ), selectedTabId = "1" + ) + ) + lifecycleOwner = MockedLifecycleOwner(Lifecycle.State.STARTED) + navigationController = mockk(relaxed = true) + settings = mockk(relaxed = true) + appLinksUseCases = mockk(relaxed = true) + container = mockk(relaxed = true) + context = mockk(relaxed = true) + infoBanner = mockk(relaxed = true) + openInAppOnboardingObserver = spyk(OpenInAppOnboardingObserver( + context = context, + store = store, + lifecycleOwner = lifecycleOwner, + navController = navigationController, + settings = settings, + appLinksUseCases = appLinksUseCases, + container = container + )) + every { openInAppOnboardingObserver.createInfoBanner() } returns infoBanner } @Test - fun `do not show banner when openLinksInExternalApp is set to true`() { + fun `GIVEN user configured to open links in external app WHEN page finishes loading THEN do not show banner`() { every { settings.openLinksInExternalApp } returns true every { settings.shouldShowOpenInAppCfr } returns true + every { appLinksUseCases.appLinkRedirect.invoke(any()).hasExternalApp() } returns true + store.dispatch(ContentAction.UpdateLoadingStateAction("1", true)).joinBlocking() - val observer = OpenInAppOnboardingObserver(context, mockk(), settings, appLinksUseCases, mockk()) - observer.onLoadingStateChanged(session, false) - - verify(exactly = 0) { appLinksUseCases.appLinkRedirect } + openInAppOnboardingObserver.start() + store.dispatch(ContentAction.UpdateLoadingStateAction("1", false)).joinBlocking() + verify(exactly = 0) { infoBanner.showBanner() } + } + @Test + fun `GIVEN user has not configured to open links in external app WHEN page finishes loading THEN show banner`() { every { settings.openLinksInExternalApp } returns false - observer.onLoadingStateChanged(session, false) + every { settings.shouldShowOpenInAppCfr } returns true + every { appLinksUseCases.appLinkRedirect.invoke(any()).hasExternalApp() } returns true + store.dispatch(ContentAction.UpdateLoadingStateAction("1", true)).joinBlocking() - verify(exactly = 1) { appLinksUseCases.appLinkRedirect } + openInAppOnboardingObserver.start() + + store.dispatch(ContentAction.UpdateLoadingStateAction("1", false)).joinBlocking() + verify(exactly = 1) { infoBanner.showBanner() } } @Test - fun `do not show banner when shouldShowOpenInAppCfr is set to false`() { + fun `GIVEN banner was already displayed WHEN page finishes loading THEN do not show banner`() { every { settings.openLinksInExternalApp } returns false every { settings.shouldShowOpenInAppCfr } returns false + every { appLinksUseCases.appLinkRedirect.invoke(any()).hasExternalApp() } returns true + store.dispatch(ContentAction.UpdateLoadingStateAction("1", true)).joinBlocking() - val observer = OpenInAppOnboardingObserver(context, mockk(), settings, appLinksUseCases, mockk()) - observer.onLoadingStateChanged(session, false) - - verify(exactly = 0) { appLinksUseCases.appLinkRedirect } - - every { settings.shouldShowOpenInAppCfr } returns true - observer.onLoadingStateChanged(session, false) - - verify(exactly = 1) { appLinksUseCases.appLinkRedirect } + openInAppOnboardingObserver.start() + store.dispatch(ContentAction.UpdateLoadingStateAction("1", false)).joinBlocking() + verify(exactly = 0) { infoBanner.showBanner() } } @Test - fun `do not show banner when URL is loading`() { + fun `GIVEN banner should be displayed WHEN no application found THEN do not show banner`() { every { settings.openLinksInExternalApp } returns false every { settings.shouldShowOpenInAppCfr } returns true + every { appLinksUseCases.appLinkRedirect.invoke(any()).hasExternalApp() } returns false + store.dispatch(ContentAction.UpdateLoadingStateAction("1", true)).joinBlocking() - val observer = OpenInAppOnboardingObserver(context, mockk(), settings, appLinksUseCases, mockk()) + openInAppOnboardingObserver.start() - observer.onLoadingStateChanged(session, true) - - verify(exactly = 0) { appLinksUseCases.appLinkRedirect } - - observer.onLoadingStateChanged(session, false) - - verify(exactly = 1) { appLinksUseCases.appLinkRedirect } + store.dispatch(ContentAction.UpdateLoadingStateAction("1", false)).joinBlocking() + verify(exactly = 0) { infoBanner.showBanner() } } @Test - fun `do not show banner when external app is not found`() { + fun `GIVEN banner is displayed WHEN user navigates to different domain THEN banner is dismissed`() { every { settings.openLinksInExternalApp } returns false every { settings.shouldShowOpenInAppCfr } returns true - every { appLinksUseCases.appLinkRedirect } returns getAppLinkRedirect - every { getAppLinkRedirect.invoke(any()) } returns applinksRedirect + every { appLinksUseCases.appLinkRedirect.invoke(any()).hasExternalApp() } returns true + store.dispatch(ContentAction.UpdateLoadingStateAction("1", true)).joinBlocking() - val observer = OpenInAppOnboardingObserver(context, mockk(), settings, appLinksUseCases, mockk()) - observer.onLoadingStateChanged(session, false) - - verify(exactly = 0) { settings.shouldShowOpenInAppBanner } - } + openInAppOnboardingObserver.start() - @Test - fun `do not dismiss banner when URL is the same`() { - val observer = OpenInAppOnboardingObserver(context, mockk(), settings, appLinksUseCases, mockk()) - observer.infoBanner = infoBanner - observer.sessionDomainForDisplayedBanner = "mozilla.com" - observer.onUrlChanged(session, "https://mozilla.com") + store.dispatch(ContentAction.UpdateLoadingStateAction("1", false)).joinBlocking() + verify(exactly = 1) { infoBanner.showBanner() } + verify(exactly = 0) { infoBanner.dismiss() } + store.dispatch(ContentAction.UpdateUrlAction("1", "https://www.mozilla.org/en-US/")).joinBlocking() verify(exactly = 0) { infoBanner.dismiss() } - observer.onUrlChanged(session, "https://abc.com") + store.dispatch(ContentAction.UpdateUrlAction("1", "https://www.firefox.com")).joinBlocking() verify(exactly = 1) { infoBanner.dismiss() } } + + internal class MockedLifecycleOwner(initialState: Lifecycle.State) : LifecycleOwner { + val lifecycleRegistry = LifecycleRegistry(this).apply { + currentState = initialState + } + + override fun getLifecycle(): Lifecycle = lifecycleRegistry + } } From 451f7ae31c8350e749a3f2579d78d5fe867384dd Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 17 Dec 2020 15:36:02 +0000 Subject: [PATCH 007/205] Update Android Components version to 71.0.20201217143211. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 3532681c1..f1a7b0f41 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201216143107" + const val VERSION = "71.0.20201217143211" } From afc8c26e31405f7165afebc4777dab796a558a29 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Thu, 17 Dec 2020 19:35:54 -0500 Subject: [PATCH 008/205] Update mergify to use new release branch name format (#17107) --- .mergify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mergify.yml b/.mergify.yml index 47be03822..75fe865ac 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -31,7 +31,7 @@ pull_request_rules: strict: smart - name: Release automation conditions: - - base~=releases/.* + - base~=releases_.* - author=github-actions[bot] # Listing checks manually beause we do not have a "push complete" check yet. - check-success=build-android-test-debug From ca36ffe061f8ab878502b3f53d4ea580372b1420 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Fri, 18 Dec 2020 09:50:47 -0500 Subject: [PATCH 009/205] Let Mergify know about the change of branch name (#17119) --- .mergify.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mergify.yml b/.mergify.yml index 75fe865ac..1f3f66814 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -31,7 +31,7 @@ pull_request_rules: strict: smart - name: Release automation conditions: - - base~=releases_.* + - base~=releases[_/].* - author=github-actions[bot] # Listing checks manually beause we do not have a "push complete" check yet. - check-success=build-android-test-debug From 258f1abc458c3ee316a5fd38c0200d5c43843366 Mon Sep 17 00:00:00 2001 From: Stefan Arentz Date: Fri, 18 Dec 2020 10:51:55 -0500 Subject: [PATCH 010/205] Update mergify to recognize old and new task graphs for release builds (#17121) --- .mergify.yml | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/.mergify.yml b/.mergify.yml index 1f3f66814..77dd75d3f 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -29,7 +29,7 @@ pull_request_rules: merge: method: rebase strict: smart - - name: Release automation + - name: Release automation (Old) conditions: - base~=releases[_/].* - author=github-actions[bot] @@ -56,3 +56,31 @@ pull_request_rules: strict: smart delete_head_branch: force: false + - name: Release automation (New) + conditions: + - base~=releases[_/].* + - author=github-actions[bot] + # Listing checks manually beause we do not have a "push complete" check yet. + - check-success=build-android-test-beta + - check-success=build-android-test-debug + - check-success=build-beta-firebase + - check-success=build-debug + - check-success=build-nightly-simulation + - check-success=lint-compare-locales + - check-success=lint-detekt + - check-success=lint-ktlint + - check-success=lint-lint + - check-success=signing-android-test-beta + - check-success=signing-beta-firebase + - check-success=signing-nightly-simulation + - check-success=test-debug + - files~=(AndroidComponents.kt) + actions: + review: + type: APPROVE + message: 🚢 + merge: + method: rebase + strict: smart + delete_head_branch: + force: false From 6962c967ee3828a570ce300ba2cd74a5816bfe5a Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 18 Dec 2020 15:32:33 +0000 Subject: [PATCH 011/205] Update Android Components version to 71.0.20201218143041. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index f1a7b0f41..02569de70 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201217143211" + const val VERSION = "71.0.20201218143041" } From 4565d7381b6d6cd157ebc774dcc30f296ab389b4 Mon Sep 17 00:00:00 2001 From: jhugman Date: Sat, 19 Dec 2020 15:26:48 +0000 Subject: [PATCH 012/205] No bug- protect nimbus init from StrictMode (#17033) r=christian --- .../java/org/mozilla/fenix/components/Analytics.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt index 4614614a3..681260bd1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Analytics.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Analytics.kt @@ -9,6 +9,7 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.net.Uri +import android.os.StrictMode import mozilla.components.lib.crash.CrashReporter import mozilla.components.lib.crash.service.CrashReporterService import mozilla.components.lib.crash.service.GleanCrashReporterService @@ -117,12 +118,15 @@ class Analytics( // from the app unless the user does so from a UI control. // However, the user may have opt-ed out of mako experiments already, so // we should respect that setting here. - val enabled = context.settings().isExperimentationEnabled + val enabled = context.components.strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { + context.settings().isExperimentationEnabled + } if (!enabled) { globalUserParticipation = enabled } - context.settings().isExperimentationEnabled = globalUserParticipation - + } + }.apply { + if (FeatureFlags.nimbusExperiments) { // Nimbus should look after downloading experiment definitions from remote settings // on another thread, and making sure we don't hit the server each time we start. updateExperiments() From 46af06bfa8313b775f0d4ff208acb9b1541ba448 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 19 Dec 2020 15:33:28 +0000 Subject: [PATCH 013/205] Update Android Components version to 71.0.20201218190337. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 02569de70..0d74f276a 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201218143041" + const val VERSION = "71.0.20201218190337" } From 36a6d364a7f64cf12181b70ce692f864b5c9d920 Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Mon, 21 Dec 2020 09:06:31 -0500 Subject: [PATCH 014/205] For #17086 #17143: Temporarily turn off Nimbus --- .../ui/robots/SettingsSubMenuDataCollectionRobot.kt | 10 +++++++--- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 9 ++++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDataCollectionRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDataCollectionRobot.kt index 431680d24..07f36c0ff 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDataCollectionRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuDataCollectionRobot.kt @@ -38,7 +38,9 @@ class SettingsSubMenuDataCollectionRobot { verifyDataCollectionOptions() verifyUsageAndTechnicalDataSwitchDefault() verifyMarketingDataSwitchDefault() - verifyExperimentsSwitchDefault() + // Temporarily disabled until https://github.com/mozilla-mobile/fenix/issues/17086 and + // https://github.com/mozilla-mobile/fenix/issues/17143 are resolved: + // verifyExperimentsSwitchDefault() } class Transition { @@ -80,8 +82,10 @@ private fun assertDataCollectionOptions() { onView(withText(marketingDataText)) .check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - onView(withText(R.string.preference_experiments_2)).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) - onView(withText(R.string.preference_experiments_summary_2)).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + // Temporarily disabled until https://github.com/mozilla-mobile/fenix/issues/17086 and + // https://github.com/mozilla-mobile/fenix/issues/17143 are resolved: + // onView(withText(R.string.preference_experiments_2)).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) + // onView(withText(R.string.preference_experiments_summary_2)).check(matches(withEffectiveVisibility(Visibility.VISIBLE))) } private fun usageAndTechnicalDataButton() = onView(withText(R.string.preference_usage_data)) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index b604402d0..2386c3107 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -35,7 +35,14 @@ object FeatureFlags { * Enables the Nimbus experiments library, especially the settings toggle to opt-out of * all experiments. */ - val nimbusExperiments = Config.channel.isNightlyOrDebug + // IMPORTANT: Only turn this back on once the following issues are resolved: + // - https://github.com/mozilla-mobile/fenix/issues/17086: Calls to + // getExperimentBranch seem to block on updateExperiments causing a + // large performance regression loading the home screen. + // - https://github.com/mozilla-mobile/fenix/issues/17143: Despite + // having wrapped getExperimentBranch/withExperiments in a catch-all + // users are still experiencing crashes. + const val nimbusExperiments = false /** * Enables the new MediaSession API. From e1e21669b2e277a51d869561b9b290c967680bb2 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 21 Dec 2020 15:37:19 +0000 Subject: [PATCH 015/205] Update Android Components version to 71.0.20201221143158. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0d74f276a..63ef392f0 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201218190337" + const val VERSION = "71.0.20201221143158" } From 095d07598a4fa76a9d3389ab16fc74cf59952268 Mon Sep 17 00:00:00 2001 From: Oana Horvath Date: Mon, 21 Dec 2020 19:18:51 +0200 Subject: [PATCH 016/205] Code cleanup in BookmarksRobot and BookmarksTest --- .../org/mozilla/fenix/ui/BookmarksTest.kt | 10 +---- .../mozilla/fenix/ui/robots/BookmarksRobot.kt | 45 +++---------------- .../fenix/ui/robots/ThreeDotMenuMainRobot.kt | 7 ++- 3 files changed, 13 insertions(+), 49 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt index 8be03fb46..73a28d231 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/BookmarksTest.kt @@ -466,20 +466,12 @@ class BookmarksTest { bookmarksListIdlingResource = RecyclerViewIdlingResource(activityTestRule.activity.findViewById(R.id.bookmark_list), 2) IdlingRegistry.getInstance().register(bookmarksListIdlingResource!!) - }.openThreeDotMenu(defaultWebPage.url) { - IdlingRegistry.getInstance().unregister(bookmarksListIdlingResource!!) - }.clickEdit { - verifyEditBookmarksView() - changeBookmarkTitle(testBookmark.title) - saveEditBookmark() - - IdlingRegistry.getInstance().register(bookmarksListIdlingResource!!) createFolder(bookmarksFolderName) IdlingRegistry.getInstance().unregister(bookmarksListIdlingResource!!) - }.openThreeDotMenu(testBookmark.title) { + }.openThreeDotMenu(defaultWebPage.title) { }.clickEdit { clickParentFolderSelector() selectFolder(bookmarksFolderName) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt index 36b014071..ffc4c397c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt @@ -132,8 +132,6 @@ class BookmarksRobot { addFolderButton().click() } - fun clickdeleteBookmarkButton() = deleteBookmarkButton().click() - fun addNewFolderName(name: String) { addFolderTitleField() .click() @@ -166,7 +164,7 @@ class BookmarksRobot { fun saveEditBookmark() { saveBookmarkButton().click() - mDevice.findObject(UiSelector().resourceId("R.id.bookmark_list")).waitForExists(waitingTime) + mDevice.findObject(UiSelector().resourceId("org.mozilla.fenix.debug:id/bookmark_list")).waitForExists(waitingTime) } fun clickParentFolderSelector() = bookmarkFolderSelector().click() @@ -190,31 +188,6 @@ class BookmarksRobot { return Transition() } - fun goBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { - closeButton().click() - - BrowserRobot().interact() - return BrowserRobot.Transition() - } - - fun confirmBookmarkFolderDeletionAndGoBackToBrowser(interact: BrowserRobot.() -> Unit): BrowserRobot.Transition { - onView(withText(R.string.delete_browsing_data_prompt_allow)) - .inRoot(RootMatchers.isDialog()) - .check(matches(isDisplayed())) - .click() - - BrowserRobot().interact() - return BrowserRobot.Transition() - } - - fun openThreeDotMenu(interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition { - mDevice.waitNotNull(Until.findObject(res("org.mozilla.fenix.debug:id/overflow_menu"))) - threeDotMenu().click() - - ThreeDotMenuBookmarksRobot().interact() - return ThreeDotMenuBookmarksRobot.Transition() - } - fun openThreeDotMenu(bookmarkTitle: String, interact: ThreeDotMenuBookmarksRobot.() -> Unit): ThreeDotMenuBookmarksRobot.Transition { mDevice.waitNotNull(Until.findObject(res("org.mozilla.fenix.debug:id/overflow_menu"))) threeDotMenu(bookmarkTitle).click() @@ -259,7 +232,7 @@ private fun bookmarkFavicon(url: String) = onView( ) ) -private fun bookmarkURL(url: String) = onView(allOf(withId(R.id.url), withText(url))) +private fun bookmarkURL(url: String) = onView(allOf(withId(R.id.url), withText(containsString(url)))) private fun addFolderButton() = onView(withId(R.id.add_bookmark_folder)) @@ -267,8 +240,6 @@ private fun addFolderTitleField() = onView(withId(R.id.bookmarkNameEdit)) private fun saveFolderButton() = onView(withId(R.id.confirm_add_folder_button)) -private fun deleteBookmarkButton() = onView(withId(R.id.delete_bookmark_button)) - private fun threeDotMenu(bookmarkUrl: Uri) = onView( allOf( withId(R.id.overflow_menu), @@ -283,8 +254,6 @@ private fun threeDotMenu(bookmarkTitle: String) = onView( ) ) -private fun threeDotMenu() = onView(withId(R.id.overflow_menu)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) - private fun snackBarText() = onView(withId(R.id.snackbar_text)) private fun snackBarUndoButton() = onView(withId(R.id.snackbar_btn)) @@ -306,7 +275,7 @@ private fun assertBookmarksView() { withParent(withId(R.id.navigationToolbar)) ) ) - .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) + .check(matches(isDisplayed())) } private fun assertEmptyBookmarksList() = @@ -321,7 +290,7 @@ private fun assertBookmarkFavicon(forUrl: Uri) = bookmarkFavicon(forUrl.toString ) private fun assertBookmarkURL(expectedURL: String) = - mDevice.findObject(UiSelector().text(expectedURL)) + bookmarkURL(expectedURL).check(matches(isDisplayed())) private fun assertFolderTitle(expectedTitle: String) = onView(withText(expectedTitle)).check(matches(isDisplayed())) @@ -359,13 +328,13 @@ private fun assertKeyboardVisibility(isExpectedToBeVisible: Boolean) = ) private fun assertShareOverlay() = - onView(withId(R.id.shareWrapper)).check(matches(ViewMatchers.isDisplayed())) + onView(withId(R.id.shareWrapper)).check(matches(isDisplayed())) private fun assertShareBookmarkTitle() = - onView(withId(R.id.share_tab_title)).check(matches(ViewMatchers.isDisplayed())) + onView(withId(R.id.share_tab_title)).check(matches(isDisplayed())) private fun assertShareBookmarkFavicon() = - onView(withId(R.id.share_tab_favicon)).check(matches(ViewMatchers.isDisplayed())) + onView(withId(R.id.share_tab_favicon)).check(matches(isDisplayed())) private fun assertShareBookmarkUrl() = onView(withId(R.id.share_tab_url)).check(matches(isDisplayed())) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt index e4e5768e4..982fa613c 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/ThreeDotMenuMainRobot.kt @@ -37,6 +37,7 @@ import androidx.test.uiautomator.UiSelector import androidx.test.uiautomator.Until import org.hamcrest.Matcher import org.hamcrest.Matchers.allOf +import org.junit.Assert.assertTrue import org.mozilla.fenix.R import org.mozilla.fenix.helpers.TestAssetHelper.waitingTime import org.mozilla.fenix.helpers.click @@ -160,9 +161,11 @@ class ThreeDotMenuMainRobot { } fun openBookmarks(interact: BookmarksRobot.() -> Unit): BookmarksRobot.Transition { - onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(ViewActions.swipeDown()) - mDevice.findObject(UiSelector().resourceId("R.id.bookmark_list")).waitForExists(waitingTime) + onView(withId(R.id.mozac_browser_menu_recyclerView)).perform(swipeDown()) + mDevice.waitNotNull(Until.findObject(By.text("Bookmarks")), waitingTime) + bookmarksButton().click() + assertTrue(mDevice.findObject(UiSelector().resourceId("org.mozilla.fenix.debug:id/bookmark_list")).waitForExists(waitingTime)) BookmarksRobot().interact() return BookmarksRobot.Transition() From 7a01fcbfa9f063326e43812cef428dabcdf3186c Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Tue, 22 Dec 2020 11:10:31 -0500 Subject: [PATCH 017/205] Closes #17073: Fix intermittent failures in PwaOnboardingObserverTest --- .../fenix/shortcut/PwaOnboardingObserverTest.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt b/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt index 9ed456972..0c277d205 100644 --- a/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt @@ -68,8 +68,10 @@ class PwaOnboardingObserverTest { @Test fun `GIVEN cfr should not yet be shown WHEN installable page is loaded THEN counter is incremented`() { - pwaOnboardingObserver.start() every { webAppUseCases.isInstallable() } returns true + every { settings.userKnowsAboutPwas } returns false + every { settings.shouldShowPwaCfr } returns false + pwaOnboardingObserver.start() store.dispatch(ContentAction.UpdateWebAppManifestAction("1", mockk())).joinBlocking() verify { settings.incrementVisitedInstallableCount() } @@ -81,9 +83,10 @@ class PwaOnboardingObserverTest { @Test fun `GIVEN cfr should be shown WHEN installable page is loaded THEN we navigate to onboarding fragment`() { - pwaOnboardingObserver.start() every { webAppUseCases.isInstallable() } returns true + every { settings.userKnowsAboutPwas } returns false every { settings.shouldShowPwaCfr } returns true + pwaOnboardingObserver.start() store.dispatch(ContentAction.UpdateWebAppManifestAction("1", mockk())).joinBlocking() verify { settings.incrementVisitedInstallableCount() } @@ -95,8 +98,10 @@ class PwaOnboardingObserverTest { @Test fun `GIVEN web app is not installable WHEN page with manifest is loaded THEN nothing happens`() { - pwaOnboardingObserver.start() every { webAppUseCases.isInstallable() } returns false + every { settings.userKnowsAboutPwas } returns false + every { settings.shouldShowPwaCfr } returns true + pwaOnboardingObserver.start() store.dispatch(ContentAction.UpdateWebAppManifestAction("1", mockk())).joinBlocking() verify(exactly = 0) { settings.incrementVisitedInstallableCount() } From d3e1045ab956e60664d6d72313eb5aca64885b99 Mon Sep 17 00:00:00 2001 From: ekager Date: Mon, 21 Dec 2020 15:19:26 -0800 Subject: [PATCH 018/205] For #17165 - Use application context to get notification localized strings --- .../org/mozilla/fenix/customtabs/PoweredByNotification.kt | 2 +- .../org/mozilla/fenix/session/PrivateNotificationService.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/customtabs/PoweredByNotification.kt b/app/src/main/java/org/mozilla/fenix/customtabs/PoweredByNotification.kt index 7a79fe61f..9e4ce375c 100644 --- a/app/src/main/java/org/mozilla/fenix/customtabs/PoweredByNotification.kt +++ b/app/src/main/java/org/mozilla/fenix/customtabs/PoweredByNotification.kt @@ -58,7 +58,7 @@ class PoweredByNotification( val appName = getString(R.string.app_name) return NotificationCompat.Builder(this, channelId) .setSmallIcon(R.drawable.ic_status_logo) - .setContentTitle(getString(R.string.browser_menu_powered_by2, appName)) + .setContentTitle(applicationContext.getString(R.string.browser_menu_powered_by2, appName)) .setBadgeIconType(BADGE_ICON_NONE) .setColor(ContextCompat.getColor(this, R.color.primary_text_light_theme)) .setPriority(NotificationCompat.PRIORITY_MIN) diff --git a/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt b/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt index 843a638d3..94f21a60a 100644 --- a/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt +++ b/app/src/main/java/org/mozilla/fenix/session/PrivateNotificationService.kt @@ -33,8 +33,8 @@ class PrivateNotificationService : AbstractPrivateNotificationService() { override fun NotificationCompat.Builder.buildNotification() { setSmallIcon(R.drawable.ic_private_browsing) - setContentTitle(getString(R.string.app_name_private_4, getString(R.string.app_name))) - setContentText(getString(R.string.notification_pbm_delete_text_2)) + setContentTitle(applicationContext.getString(R.string.app_name_private_4, getString(R.string.app_name))) + setContentText(applicationContext.getString(R.string.notification_pbm_delete_text_2)) color = ContextCompat.getColor(this@PrivateNotificationService, R.color.pbm_notification_color) } From 6dadecacc2479995f63ea592fc25c65d1cd54650 Mon Sep 17 00:00:00 2001 From: Elise Richards Date: Tue, 22 Dec 2020 11:43:04 -0600 Subject: [PATCH 019/205] For #15703 and #17133: allow ETP redirect trackers setting to be customized (#17137) * Remove ETP redirect trackers feature flag. Add category to ETP panel view. * Add redirect tracker category to ETP custom settings --- .../java/org/mozilla/fenix/FeatureFlags.kt | 5 ----- .../TrackingProtectionPolicyFactory.kt | 10 ++++++---- .../settings/TrackingProtectionFragment.kt | 13 +++++++++++++ .../TrackingProtectionBlockingFragment.kt | 4 ++-- .../TrackingProtectionPanelView.kt | 15 +++++++++++++-- .../TrackingProtectionStore.kt | 14 ++++++++++++-- .../java/org/mozilla/fenix/utils/Settings.kt | 5 +++++ .../component_tracking_protection_panel.xml | 18 ++++++++++++++++++ .../fragment_tracking_protection_blocking.xml | 1 - app/src/main/res/values/preference_keys.xml | 1 + .../xml/tracking_protection_preferences.xml | 6 ++++++ .../TrackingProtectionPolicyFactoryTest.kt | 10 ++++++---- .../TrackingProtectionPanelInteractorTest.kt | 16 ++++++++++++++++ 13 files changed, 98 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 2386c3107..32d1d85d8 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -26,11 +26,6 @@ object FeatureFlags { */ const val externalDownloadManager = true - /** - * Enables ETP cookie purging - */ - val etpCookiePurging = Config.channel.isNightlyOrDebug - /** * Enables the Nimbus experiments library, especially the settings toggle to opt-out of * all experiments. diff --git a/app/src/main/java/org/mozilla/fenix/components/TrackingProtectionPolicyFactory.kt b/app/src/main/java/org/mozilla/fenix/components/TrackingProtectionPolicyFactory.kt index bc614aef1..4dd0a4b00 100644 --- a/app/src/main/java/org/mozilla/fenix/components/TrackingProtectionPolicyFactory.kt +++ b/app/src/main/java/org/mozilla/fenix/components/TrackingProtectionPolicyFactory.kt @@ -7,8 +7,6 @@ package org.mozilla.fenix.components import androidx.annotation.VisibleForTesting import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicy import mozilla.components.concept.engine.EngineSession.TrackingProtectionPolicyForSessionTypes -import org.mozilla.fenix.Config -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.utils.Settings /** @@ -49,7 +47,7 @@ class TrackingProtectionPolicyFactory(private val settings: Settings) { return TrackingProtectionPolicy.select( cookiePolicy = getCustomCookiePolicy(), trackingCategories = getCustomTrackingCategories(), - cookiePurging = Config.channel.isNightlyOrDebug + cookiePurging = getCustomCookiePurgingPolicy() ).let { if (settings.blockTrackingContentSelectionInCustomTrackingProtection == "private") { it.forPrivateSessionsOnly() @@ -95,6 +93,10 @@ class TrackingProtectionPolicyFactory(private val settings: Settings) { return categories.toTypedArray() } + + private fun getCustomCookiePurgingPolicy(): Boolean { + return settings.blockRedirectTrackersInCustomTrackingProtection + } } @VisibleForTesting @@ -103,6 +105,6 @@ internal fun TrackingProtectionPolicyForSessionTypes.adaptPolicyToChannel(): Tra trackingCategories = trackingCategories, cookiePolicy = cookiePolicy, strictSocialTrackingProtection = strictSocialTrackingProtection, - cookiePurging = FeatureFlags.etpCookiePurging + cookiePurging = cookiePurging ) } diff --git a/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt b/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt index 029183ac5..66bb347cc 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/TrackingProtectionFragment.kt @@ -41,6 +41,7 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { private lateinit var customTrackingSelect: DropDownPreference private lateinit var customCryptominers: CheckBoxPreference private lateinit var customFingerprinters: CheckBoxPreference + private lateinit var customRedirectTrackers: CheckBoxPreference override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.tracking_protection_preferences, rootKey) @@ -145,6 +146,9 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { customFingerprinters = requirePreference(R.string.pref_key_tracking_protection_custom_fingerprinters) + customRedirectTrackers = + requirePreference(R.string.pref_key_tracking_protection_redirect_trackers) + customCookies.onPreferenceChangeListener = object : SharedPreferenceUpdater() { override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { customCookiesSelect.isVisible = !customCookies.isChecked @@ -196,6 +200,14 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { } } + customRedirectTrackers.onPreferenceChangeListener = object : SharedPreferenceUpdater() { + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { + return super.onPreferenceChange(preference, newValue).also { + updateTrackingProtectionPolicy() + } + } + } + updateCustomOptionsVisibility() return radio @@ -218,5 +230,6 @@ class TrackingProtectionFragment : PreferenceFragmentCompat() { customTrackingSelect.isVisible = isCustomSelected && customTracking.isChecked customCryptominers.isVisible = isCustomSelected customFingerprinters.isVisible = isCustomSelected + customRedirectTrackers.isVisible = isCustomSelected } } diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionBlockingFragment.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionBlockingFragment.kt index bbc8832f4..d071e887a 100644 --- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionBlockingFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionBlockingFragment.kt @@ -10,7 +10,6 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.navigation.fragment.navArgs import kotlinx.android.synthetic.main.fragment_tracking_protection_blocking.* -import org.mozilla.fenix.FeatureFlags import org.mozilla.fenix.R import org.mozilla.fenix.ext.settings import org.mozilla.fenix.ext.showToolbar @@ -23,7 +22,6 @@ class TrackingProtectionBlockingFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - category_redirect_trackers.isVisible = FeatureFlags.etpCookiePurging when (args.protectionMode) { TrackingProtectionMode.STANDARD -> { @@ -41,6 +39,8 @@ class TrackingProtectionBlockingFragment : settings.blockCookiesInCustomTrackingProtection category_tracking_content.isVisible = settings.blockTrackingContentInCustomTrackingProtection + category_redirect_trackers.isVisible = + settings.blockRedirectTrackersInCustomTrackingProtection } } } diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt index 624a76526..ea9be1214 100644 --- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt +++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionPanelView.kt @@ -18,6 +18,7 @@ import androidx.core.view.isVisible import kotlinx.android.extensions.LayoutContainer import kotlinx.android.synthetic.main.component_tracking_protection_panel.* import kotlinx.android.synthetic.main.component_tracking_protection_panel.details_blocking_header +import kotlinx.android.synthetic.main.fragment_tracking_protection_blocking.* import kotlinx.android.synthetic.main.switch_with_description.view.* import mozilla.components.support.ktx.android.net.hostWithoutCommonPrefixes import org.mozilla.fenix.R @@ -28,6 +29,7 @@ import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.CRYPTOMIN import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.FINGERPRINTERS import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.SOCIAL_MEDIA_TRACKERS import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.TRACKING_CONTENT +import org.mozilla.fenix.trackingprotection.TrackingProtectionCategory.REDIRECT_TRACKERS /** * Interface for the TrackingProtectionPanelViewInteractor. This interface is implemented by objects that want @@ -170,6 +172,9 @@ class TrackingProtectionPanelView( CRYPTOMINERS.name -> { if (cryptominers.isGone) cryptominers_loaded else cryptominers } + REDIRECT_TRACKERS.name -> { + if (redirect_trackers.isGone) redirect_trackers_loaded else redirect_trackers + } else -> null } @@ -181,6 +186,7 @@ class TrackingProtectionPanelView( fingerprinters.isGone = bucketedTrackers.get(FINGERPRINTERS, true).isEmpty() tracking_content.isGone = bucketedTrackers.get(TRACKING_CONTENT, true).isEmpty() cryptominers.isGone = bucketedTrackers.get(CRYPTOMINERS, true).isEmpty() + redirect_trackers.isGone = bucketedTrackers.get(REDIRECT_TRACKERS, true).isEmpty() cross_site_tracking_loaded.isGone = bucketedTrackers.get(CROSS_SITE_TRACKING_COOKIES, false).isEmpty() @@ -189,6 +195,7 @@ class TrackingProtectionPanelView( fingerprinters_loaded.isGone = bucketedTrackers.get(FINGERPRINTERS, false).isEmpty() tracking_content_loaded.isGone = bucketedTrackers.get(TRACKING_CONTENT, false).isEmpty() cryptominers_loaded.isGone = bucketedTrackers.get(CRYPTOMINERS, false).isEmpty() + redirect_trackers_loaded.isGone = bucketedTrackers.get(REDIRECT_TRACKERS, false).isEmpty() } private fun setCategoryClickListeners() { @@ -202,6 +209,7 @@ class TrackingProtectionPanelView( fingerprinters_loaded.setOnClickListener(this) tracking_content_loaded.setOnClickListener(this) cryptominers_loaded.setOnClickListener(this) + redirect_trackers_loaded.setOnClickListener(this) } override fun onClick(v: View) { @@ -263,6 +271,7 @@ class TrackingProtectionPanelView( R.id.cross_site_tracking, R.id.cross_site_tracking_loaded -> CROSS_SITE_TRACKING_COOKIES R.id.tracking_content, R.id.tracking_content_loaded -> TRACKING_CONTENT R.id.cryptominers, R.id.cryptominers_loaded -> CRYPTOMINERS + R.id.redirect_trackers, R.id.redirect_trackers_loaded -> REDIRECT_TRACKERS else -> null } @@ -274,13 +283,15 @@ class TrackingProtectionPanelView( R.id.cross_site_tracking_loaded, R.id.fingerprinters_loaded, R.id.tracking_content_loaded, - R.id.cryptominers_loaded -> true + R.id.cryptominers_loaded, + R.id.redirect_trackers_loaded -> true R.id.social_media_trackers, R.id.fingerprinters, R.id.cross_site_tracking, R.id.tracking_content, - R.id.cryptominers -> false + R.id.cryptominers, + R.id.redirect_trackers -> false else -> false } } diff --git a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionStore.kt b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionStore.kt index f83a18532..8e957a522 100644 --- a/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionStore.kt +++ b/app/src/main/java/org/mozilla/fenix/trackingprotection/TrackingProtectionStore.kt @@ -90,8 +90,18 @@ enum class TrackingProtectionCategory( R.string.etp_cryptominers_title, R.string.etp_cryptominers_description ), - FINGERPRINTERS(R.string.etp_fingerprinters_title, R.string.etp_fingerprinters_description), - TRACKING_CONTENT(R.string.etp_tracking_content_title, R.string.etp_tracking_content_description) + FINGERPRINTERS( + R.string.etp_fingerprinters_title, + R.string.etp_fingerprinters_description + ), + TRACKING_CONTENT( + R.string.etp_tracking_content_title, + R.string.etp_tracking_content_description + ), + REDIRECT_TRACKERS( + R.string.etp_redirect_trackers_title, + R.string.etp_redirect_trackers_description + ) } /** diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 008f42687..6ba49e750 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -466,6 +466,11 @@ class Settings(private val appContext: Context) : PreferencesHolder { true ) + val blockRedirectTrackersInCustomTrackingProtection by booleanPreference( + appContext.getPreferenceKey(R.string.pref_key_tracking_protection_redirect_trackers), + true + ) + val shouldUseFixedTopToolbar: Boolean get() { return touchExplorationIsEnabled || switchServiceIsEnabled diff --git a/app/src/main/res/layout/component_tracking_protection_panel.xml b/app/src/main/res/layout/component_tracking_protection_panel.xml index e363deb9f..b58da52d5 100644 --- a/app/src/main/res/layout/component_tracking_protection_panel.xml +++ b/app/src/main/res/layout/component_tracking_protection_panel.xml @@ -99,6 +99,15 @@ android:visibility="gone" app:layout_constraintTop_toBottomOf="@id/social_media_trackers" /> + + + + diff --git a/app/src/main/res/values/preference_keys.xml b/app/src/main/res/values/preference_keys.xml index b4cb114df..073b48bf5 100644 --- a/app/src/main/res/values/preference_keys.xml +++ b/app/src/main/res/values/preference_keys.xml @@ -149,6 +149,7 @@ pref_key_tracking_protection_custom_tracking_content_select pref_key_tracking_protection_custom_cryptominers pref_key_tracking_protection_custom_fingerprinters + pref_key_tracking_protection_redirect_trackers pref_key_tracking_protection_onboarding diff --git a/app/src/main/res/xml/tracking_protection_preferences.xml b/app/src/main/res/xml/tracking_protection_preferences.xml index 226f213d1..f8742e610 100644 --- a/app/src/main/res/xml/tracking_protection_preferences.xml +++ b/app/src/main/res/xml/tracking_protection_preferences.xml @@ -70,6 +70,12 @@ android:key="@string/pref_key_tracking_protection_custom_fingerprinters" android:layout="@layout/checkbox_left_preference_etp" android:title="@string/preference_enhanced_tracking_protection_custom_fingerprinters" /> + Date: Tue, 22 Dec 2020 19:18:13 +0000 Subject: [PATCH 020/205] Update Android Components version to 71.0.20201222143201. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 63ef392f0..55810a90c 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201221143158" + const val VERSION = "71.0.20201222143201" } From 7bf0f7595c7d91c531530da8236f1061e9479dd3 Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Wed, 23 Dec 2020 01:02:42 +0000 Subject: [PATCH 021/205] Import l10n. --- app/src/main/res/values-ast/strings.xml | 74 ++++++++--- app/src/main/res/values-be/strings.xml | 24 +++- app/src/main/res/values-cak/strings.xml | 16 ++- app/src/main/res/values-co/strings.xml | 60 +++++---- app/src/main/res/values-cy/strings.xml | 16 ++- app/src/main/res/values-de/strings.xml | 16 ++- app/src/main/res/values-dsb/strings.xml | 16 ++- app/src/main/res/values-el/strings.xml | 18 ++- app/src/main/res/values-en-rGB/strings.xml | 24 +++- app/src/main/res/values-es-rAR/strings.xml | 16 ++- app/src/main/res/values-es-rCL/strings.xml | 24 +++- app/src/main/res/values-es-rES/strings.xml | 16 ++- app/src/main/res/values-es/strings.xml | 116 +++++++++++++--- app/src/main/res/values-fa/strings.xml | 147 +++++++++++++++++++-- app/src/main/res/values-fi/strings.xml | 16 ++- app/src/main/res/values-fr/strings.xml | 8 +- app/src/main/res/values-fy-rNL/strings.xml | 16 ++- app/src/main/res/values-gn/strings.xml | 16 ++- app/src/main/res/values-hr/strings.xml | 24 +++- app/src/main/res/values-hsb/strings.xml | 16 ++- app/src/main/res/values-hu/strings.xml | 16 ++- app/src/main/res/values-hy-rAM/strings.xml | 8 +- app/src/main/res/values-in/strings.xml | 8 +- app/src/main/res/values-it/strings.xml | 16 ++- app/src/main/res/values-iw/strings.xml | 16 ++- app/src/main/res/values-ja/strings.xml | 24 +++- app/src/main/res/values-kab/strings.xml | 24 +++- app/src/main/res/values-kk/strings.xml | 24 +++- app/src/main/res/values-ko/strings.xml | 16 ++- app/src/main/res/values-lt/strings.xml | 24 +++- app/src/main/res/values-nb-rNO/strings.xml | 16 ++- app/src/main/res/values-nl/strings.xml | 16 ++- app/src/main/res/values-nn-rNO/strings.xml | 2 + app/src/main/res/values-pa-rIN/strings.xml | 8 +- app/src/main/res/values-pt-rBR/strings.xml | 16 ++- app/src/main/res/values-pt-rPT/strings.xml | 24 +++- app/src/main/res/values-rm/strings.xml | 24 +++- app/src/main/res/values-ru/strings.xml | 42 +++--- app/src/main/res/values-sk/strings.xml | 24 +++- app/src/main/res/values-sl/strings.xml | 8 +- app/src/main/res/values-sr/strings.xml | 8 +- app/src/main/res/values-sv-rSE/strings.xml | 16 ++- app/src/main/res/values-th/strings.xml | 26 ++-- app/src/main/res/values-tl/strings.xml | 43 +++++- app/src/main/res/values-tr/strings.xml | 16 ++- app/src/main/res/values-uk/strings.xml | 18 ++- app/src/main/res/values-ur/strings.xml | 104 ++++++++++++++- app/src/main/res/values-vi/strings.xml | 24 +++- app/src/main/res/values-zh-rCN/strings.xml | 16 ++- app/src/main/res/values-zh-rTW/strings.xml | 16 ++- 50 files changed, 1004 insertions(+), 318 deletions(-) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 580c7c95c..70b11eca9 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -146,12 +146,12 @@ Instalar Llingüetes sincronizaes + + Resincronizar - Alcontrar na páxina + Atopar na páxina Llingüeta privada - - Llingüeta nueva Guardar nuna coleición @@ -178,7 +178,7 @@ - Nun pue coneutase porque nun se reconoz l\'esquema de la URL. + Nun pue conectase porque nun se reconoz l\'esquema de la URL. @@ -215,6 +215,9 @@ Deprender más + + + Abrir nuna llingüeta nueva de Firefox Buscar @@ -340,12 +343,20 @@ Avisos + + Aceutar Encaboxar Modificóse la coleición de complementos. L\'aplicación va zarrase p\'aplicar los cambeos… + + + El complementu nun ta sofitáu + + El complementu yá ta instaláu + Sincronizar agora @@ -438,7 +449,7 @@ Activación de Sync - Aniciar sesión pa reconeutar + Aniciar sesión pa reconectar Desaniciar la cuenta @@ -516,7 +527,7 @@ Llingüetes - Llista de les llinguüetes + Llista de llingüetes En llista @@ -553,8 +564,12 @@ Amestar una llingüeta En privao + + Llingüetes abiertes Guardar nuna coleición + + Esbillar Compartir toles llingüetes @@ -606,7 +621,11 @@ Renomar la coleición Abrir lo qu\'heba - + + Nome de la coleición + + Renomar + Desaniciar @@ -626,6 +645,8 @@ Desaniciáronse elementos del historial Desanicióse %1$s + + Llimpiar Copiar @@ -658,8 +679,14 @@ Desaniciar les descargues ¿De xuru que quies llimpiar les descargues? - - Equí nun hai descargues + + + + Desaniciáronse les descargues + + Desanicióse %1$s + + Desaniciar @@ -768,10 +795,14 @@ Avisos Almacenamientu permanente + + Conteníu con DRM Entrugar pa permitir Blóquiase + + Permítese Blóquiase por Android @@ -873,7 +904,7 @@ Unviu a un preséu - Nun hai preseos coneutaos + Nun hai preseos conectaos Deprender tocante al unviu de llingüetes… @@ -904,6 +935,12 @@ Zarróse la llingüeta Zarráronse les llingüetes + + ¡Zarráronse les llingüetes! + + ¡Guardáronse los marcadores! + + Ver ¡Amestóse a los sitios destacaos! @@ -954,7 +991,7 @@ Tamañu de fontes automáticu - El tamañu de les fontes van casar colos tos axustes d\'Android. Desactiva esta opción pa xestionar esi tamañu equí. + El tamañu de les fontes va casar colos tos axustes d\'Android. Desactiva esta opción pa xestionar esi tamañu equí. Desaniciu de los datos de restolar @@ -1154,7 +1191,7 @@ %s va dexar de sincronizase cola to cuenta mas nun va desaniciar nengún datu d\'esti preséu. - Desconeutar + Desconectar Encaboxar @@ -1332,7 +1369,7 @@ Non - Calca equí pa reconeutar + Calca equí pa reconectar Anicia sesión en Sync @@ -1454,7 +1491,7 @@ Comprueba que la cadena de busca concase col formatu del exemplu - Fallu al coneutar con «%s» + Fallu al conectar con «%s» Creóse %s @@ -1556,11 +1593,18 @@ Amosar los sitios más visitaos - + + Nome + + Nome del sitiu destacáu + Aceutar Encaboxar + + Desaniciar + Aprovecha %s al máximu. diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 5fedcb8c4..91d67a267 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -152,8 +152,6 @@ Знайсці на старонцы Прыватная картка - - Новая картка Захаваць у калекцыі @@ -362,6 +360,12 @@ Калекцыя дадаткаў зменена. Выхад з праграмы, каб прымяніць змены… + + + Дадатак не падтрымліваецца + + Дадатак ужо ўсталяваны + Сінхранізаваць @@ -724,10 +728,12 @@ Выдаліць сцягванні Вы сапраўды хочаце выдаліць свае сцягванні? - - Сцягванні выдалены + + Сцягванні выдалены + + Выдалена %1$s - Тут яшчэ няма спамповак + Няма сцягнутых файлаў Вылучана: %1$d @@ -735,8 +741,10 @@ Адкрыць - - Выдаліць + + + + Выдаліць @@ -864,6 +872,8 @@ Абвестка Пастаяннае сховішча + + Змесціва пад DRM кантролем Запытваць дазвол diff --git a/app/src/main/res/values-cak/strings.xml b/app/src/main/res/values-cak/strings.xml index 432e82423..f5964eabf 100644 --- a/app/src/main/res/values-cak/strings.xml +++ b/app/src/main/res/values-cak/strings.xml @@ -745,18 +745,22 @@ Keyuj taq qasanïk ¿La kan nawajo\' nayüj el rupam aqasanik? - - Xeyuj taq Qasanïk + + Xesilöx taq Qasanïk + + Xsilöx %1$s - Majun taq qasanïk wawe\' + Man xeqasäx ta taq yakb\'äl %1$d xcha\' Tijaq - - Tiyuj + + + + Tiyuj @@ -884,6 +888,8 @@ Rutzijol Jutaqil taq Yakoj + + DRM-chajin rupam Tik\'utüx q\'ij diff --git a/app/src/main/res/values-co/strings.xml b/app/src/main/res/values-co/strings.xml index c6fab8fcc..2559443ce 100644 --- a/app/src/main/res/values-co/strings.xml +++ b/app/src/main/res/values-co/strings.xml @@ -63,7 +63,7 @@ ¶ - · %1$s squassa e vostre crunulogie di ricerca è di navigazione da l’unghjette private quandu vò chjuditele o chitate l’appiecazione. Benchè quessu ùn vi rende micca anonimu nant’à i siti web nè da u vostru furnidore d’accessu à internet, vi permette di cunservà sicreta a vostra attività in linea per tutte l’altre persone chì impiegherianu u vostru apparechju. + · %1$s squassa e vostre cronolugie di ricerca è di navigazione da l’unghjette private quandu vò chjuditele o chitate l’appiecazione. Benchè quessu ùn vi rende micca anonimu nant’à i siti web nè da u vostru furnidore d’accessu à internet, vi permette di cunservà sicreta a vostra attività in linea per tutte l’altre persone chì impiegherianu u vostru apparechju. ¶ Idee precuncepite apprupositu di a navigazione privata¶ @@ -205,7 +205,7 @@ Preferenze di u mutore di ricerca - Per sta volta, circà cù : + Per sta volta, ricercà cù : Riempie da u preme’papei @@ -304,7 +304,7 @@ Persunalizà - Sincrunizate l’indette, a crunulogia è ancu di più cù u vostru contu Firefox + Sincrunizate l’indette, a cronolugia è ancu di più cù u vostru contu Firefox Contu Firefox @@ -332,9 +332,9 @@ Affissà e suggestioni di u preme’papei - Circà in a crunulogia di navigazione + Ricercà in a cronolugia di navigazione - Circà in l’indette + Ricercà in l’indette Ricercà in l’unghjette sincrunizate @@ -342,7 +342,7 @@ Preferenze di u contu - Compie autumaticamente l’URL + Compie autumaticamente l’indirizzi Apre i liami in appiecazioni @@ -371,9 +371,9 @@ - U modulu addiziunale ùn hè micca accettatu + Stu modulu addiziunale ùn hè micca accettatu - U modulu addiziunale hè dighjà installatu + Stu modulu addiziunale hè dighjà installatu @@ -381,7 +381,7 @@ Sceglie l’infurmazioni à sincrunizà - Crunulogia + Cronolugia Indette @@ -533,7 +533,7 @@ Altre indette - Crunulogia + Cronolugia Unghjette sincrunizate @@ -544,14 +544,14 @@ Preferenze - Listinu di l’elementi di crunulogia + Listinu di l’elementi di cronolugia Chjode Unghjette chjose pocu fà - Affissà a crunulogia sana + Affissà a cronolugia sana %d unghjette @@ -677,7 +677,7 @@ Caccià - Squassà da a crunulogia + Squassà da a cronolugia %1$s (navigazione privata) @@ -686,11 +686,11 @@ - Squassà a crunulogia + Squassà a cronolugia - Site sicuru di vulè squassà a crunulogia ? + Site sicuru di vulè squassà a cronolugia ? - Crunulogia squassata + Cronolugia squassata %1$s squassatu @@ -724,17 +724,19 @@ Nanzu u mese scorsu - Alcuna crunulogia + Alcuna cronolugia Squassà a lista di i scaricamenti Site sicuru di vulè squassà a lista di i vostri scaricamenti ? - - Lista di i scaricamenti squassata + + Scaricamenti cacciati + + %1$s hè statu cacciatu - Alcunu scaricamentu quì + Nisunu schedariu scaricatu %1$d selezziunatu(i) @@ -742,8 +744,10 @@ Apre - - Squassà + + + + Caccià @@ -871,6 +875,8 @@ Allucamentu permanente + + Cuntenutu cuntrollatu da DRM Dumandà per permette @@ -1072,12 +1078,12 @@ %d unghjette - Crunulogia di navigazione è dati di siti + Cronolugia di navigazione è dati di siti %d indirizzi web - Crunulogia + Cronolugia %d pagine @@ -1133,7 +1139,7 @@ ¶ · St’appiecazione ùn riciverà più mudificazione di sicurità. Fermate d’impiegalla è cambiate per u novu Nightly.¶ - · \n\nPer trasferà e vostre indette, identificazioni di cunnessione, è crunulogia ver di un’altra appiecazione, create un contu Firefox. + · \n\nPer trasferà e vostre indette, identificazioni di cunnessione, è a cronolugia ver di un’altra appiecazione, create un contu Firefox. Cambià ver di u novu Nightly @@ -1142,7 +1148,7 @@ ¶ · St’appiecazione ùn riciverà più mudificazione di sicurità. Ottene u novu Nightly è fermà d’impiegà st’appiecazione.¶ - · \n\nPer trasferà e vostre indette, identificazioni di cunnessione, è crunulogia ver di un’altra appiecazione, create un contu Firefox. + · \n\nPer trasferà e vostre indette, identificazioni di cunnessione, è a cronolugia ver di un’altra appiecazione, create un contu Firefox. Ottene u novu Nightly @@ -1458,7 +1464,7 @@ Squassà tutte l’eccezzioni - Circà identificazioni di cunnessione + Ricercà identificazioni di cunnessione Ordine alfabeticu diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index f8702ad70..257c3f899 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -722,10 +722,12 @@ Dileu llwythi Ydych chi’n siŵr eich bod eisiau clirio eich hanes? - - Llwythi Wedi’u Dileu + + Llwythi Wedi’u Tynnu + + Wedi tynnu %1$s - Dim llwythi yma + Dim ffeiliau wedi’u llwytho %1$d wedi’u dewis @@ -733,8 +735,10 @@ Agor - - Dileu + + + + Tynnu @@ -860,6 +864,8 @@ Hysbysiad Storfa Barhaol + + Cynnwys wedi’i reoli gan DRM Gofyn i ganiatáu diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index ec0d5ec5d..389dbd672 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -735,18 +735,22 @@ Downloads löschen Sollen Ihre Downloads wirklich gelöscht werden? - - Downloads gelöscht + + Downloads entfernt + + %1$s entfernt - Keine Downloads vorhanden + Keine heruntergeladenen Dateien %1$d ausgewählt Öffnen - - Löschen + + + + Entfernen @@ -875,6 +879,8 @@ Benachrichtigung Dauerhafter Speicher + + Inhalte mit DRM-Kopierschutz Um Erlaubnis fragen diff --git a/app/src/main/res/values-dsb/strings.xml b/app/src/main/res/values-dsb/strings.xml index cd08f671d..d856bcb82 100644 --- a/app/src/main/res/values-dsb/strings.xml +++ b/app/src/main/res/values-dsb/strings.xml @@ -722,18 +722,22 @@ Ześěgnjenja lašowaś Cośo napšawdu swóje ześěgnjenja lašowaś? - - Ześěgnjenja su wulašowane + + Ześěgnjenja wótwónoźone + + %1$s jo se wótwónoźeł - Žedne ześěgnjenja how + Žadne ześěgnjone dataje Wubrane: %1$d Wócyniś - - Lašowaś + + + + Wótwónoźeś @@ -860,6 +864,8 @@ Powěźeńka Trajny składowak + + Wopśimjeśe wóźone pśez DRM Wó dowólnosć se pšašaś diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 51e9a7f5e..f06b59b84 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -733,19 +733,23 @@ Διαγραφή λήψεων Θέλετε σίγουρα να διαγράψετε τις λήψεις σας; - - Οι λήψεις διαγράφηκαν - - Καμία λήψη + + Οι λήψεις διαγράφηκαν + + Το %1$s αφαιρέθηκε + + Κανένα ληφθέν αρχείο %1$d επιλογή(ές) Άνοιγμα - - Διαγραφή + + + + Αφαίρεση @@ -870,6 +874,8 @@ Ειδοποιήσεις Μόνιμη αποθήκευση + + Περιεχόμενο με έλεγχο DRM Ερώτηση για αποδοχή diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 85b7d4018..9dac8aa44 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -153,8 +153,6 @@ Find in page Private tab - - New tab Save to collection @@ -362,6 +360,12 @@ Add-on collection modified. Quitting the application to apply changes… + + + Add-on is not supported + + Add-on is already installed + Synchronise now @@ -716,18 +720,22 @@ Delete downloads Are you sure you want to clear your downloads? - - Downloads Deleted + + Downloads Removed + + Removed %1$s - No downloads here + No downloaded files %1$d selected Open - - Delete + + + + Remove @@ -851,6 +859,8 @@ Notification Persistent Storage + + DRM-controlled content Ask to allow diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 761d0cb25..7b81e3f56 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -740,18 +740,22 @@ Eliminar descargas ¿Seguro que quieres eliminar las descargas? - - Descargas eliminadas + + Descargas eliminadas + + %1$s eliminado - No hay descargas aquí + No hay archivos descargados Se seleccionó %1$d Abrir - - Eliminar + + + + Eliminar @@ -878,6 +882,8 @@ Notificación Almacenamiento persistente + + Contenido controlado por DRM Pedir permiso diff --git a/app/src/main/res/values-es-rCL/strings.xml b/app/src/main/res/values-es-rCL/strings.xml index e04303375..9674d3733 100644 --- a/app/src/main/res/values-es-rCL/strings.xml +++ b/app/src/main/res/values-es-rCL/strings.xml @@ -153,8 +153,6 @@ Buscar en la página Pestaña privada - - Nueva pestaña Guardar en la colección @@ -362,6 +360,12 @@ Colección de complementos modificada. Cerrando la aplicación para aplicar los cambios… + + + Complemento no compatible + + Complemento ya está instalado + Sincronizar ahora @@ -718,18 +722,22 @@ Eliminar descargas ¿De verdad quieres limpiar tus descargas? - - Descargas eliminadas + + Descargas removidas + + %1$s removido - No hay descargas aquí + No hay archivos descargados %1$d seleccionadas Abrir - - Eliminar + + + + Remover @@ -853,6 +861,8 @@ Notificación Almacenamiento persistente + + Contenido controlado por DRM Pedir permiso diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 15ca71e5d..733006fb9 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -735,18 +735,22 @@ Eliminar descargas ¿Seguro que quieres eliminar tus descargas? - - Descargas eliminadas + + Descargas eliminadas + + %1$s eliminado - No hay descargas + No hay archivos descargados %1$d seleccionado(s) Abrir - - Eliminar + + + + Eliminar @@ -873,6 +877,8 @@ Notificación Almacenamiento persistente + + Contenido controlado por DRM Pedir permiso diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index b906c5240..2c2eeb479 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -12,16 +12,20 @@ Habilitar la navegación privada - Deshabilitar la navegación privada + Deshabilitar navegación privada Buscar o ingresar dirección - Las pestañas abiertas aparecerán aquí. + Sus pestañas abiertas se mostrarán aquí. Tus pestañas privadas se mostrarán aquí. + + Baidu + + JD 1 pestaña abierta. Tocar para cambiar de pestaña. @@ -72,18 +76,10 @@ Agregar un acceso directo para abrir pestañas privadas desde su pantalla de inicio. - Agregar acceso directo + Agregar atajo No, gracias - - - Accede a Firefox más rápido. Agrega un widget a tu pantalla de inicio. - - Agregar widget - - Ahora no - Puedes configurar Firefox para que abra automáticamente enlaces en aplicaciones. @@ -107,6 +103,13 @@ Descartar + + Cambia el diseño de las pestañas abiertas. Ve a Ajustes y selecciona cuadrícula bajo vista de pestañas. + + Ir a ajustes + + Ignorar + Nueva pestaña @@ -118,7 +121,7 @@ - Abrir pestañas + Pestañas abiertas Atrás @@ -157,8 +160,6 @@ Buscar en la página Pestaña privada - - Nueva pestaña Guardar en la colección @@ -222,6 +223,8 @@ Saber más + + Abrir una nueva pestaña de Firefox Buscar @@ -366,6 +369,12 @@ Colección de complementos modificada. Cerrando la aplicación para aplicar los cambios… + + + Complemento no compatible + + Complemento ya está instalado + Sincronizar ahora @@ -435,7 +444,7 @@ Más información - Desactivado de forma geneal, ve a Ajustes para activarlo. + Desactivado de forma general, ve a Ajustes para activarlo. Telemetry @@ -447,6 +456,10 @@ Datos de marketing Comparte datos acerca de las funcionalidades que usas en %1$s con Leanplum, nuestro proveedor de marketing para móviles. + + Estudios + + Permite a Mozilla instalar y ejecutar estudios Experimentos @@ -570,6 +583,15 @@ Después de un mes + + Cerrar manualmente + + Cerrar después de un día + + Cerrar después de una semana + + Cerrar después de un mes + Pestañas abiertas @@ -587,6 +609,8 @@ Abrir pestañas Guardar en colección + + Seleccionar Compartir todas las pestañas @@ -601,8 +625,18 @@ Ir a inicio Alternar modo pestaña + + Marcador + + Cerrar + + Compartir pestañas seleccionadas + + Menú de pestañas seleccionadas Eliminar pestaña de la colección + + Seleccionar pestañas Cerrar pestaña @@ -637,8 +671,12 @@ Abrir pestañas - - Eliminar + + Nombre de la colección + + Renombrar + + Eliminar Eliminar del historial @@ -692,12 +730,27 @@ No hay ningún historial + + Eliminar descargas + + ¿Seguro que quieres eliminar tus descargas? + + Descargas removidas - No hay descargas aquí + No hay archivos descargados %1$d seleccionado + + + Abrir + + + + Remover + + Lo sentimos. %1$s no puede cargar esa página. @@ -977,6 +1030,12 @@ Pestaña cerrada Pestañas cerradas + + ¡Pestañas cerradas! + + ¡Marcadores guardados! + + Ver ¡Añadido a sitios favoritos! @@ -1055,7 +1114,7 @@ Libera espacio de almacenamiento - Permisos del sitio + Permisos de los sitios Eliminar datos de navegación @@ -1124,6 +1183,8 @@ ¿Tienes preguntas sobre el rediseño de %s? ¿Quieres saber qué ha cambiado? Obtén respuestas aquí + + Empieza a sincronizar marcadores, contraseñas y más con tu cuenta de Firefox. Aprender más Nombre del acceso directo + + Puedes añadir fácilmente este sitio web a la pantalla de inicio de tu dispositivo para tener acceso instantáneo y navegar rápidamente, consiguiendo una experiencia similar a la de una aplicación real. + Inicios de sesión y contraseñas @@ -1459,6 +1523,8 @@ Borrar nombre de usuario Copiar sitio + + Abrir sitio en navegador Mostrar contraseña @@ -1640,6 +1706,15 @@ Mostrar los sitios más visitados + + Nombre + + Nombre del sitio principal + + Aceptar + + Cancelar + Eliminar @@ -1647,6 +1722,9 @@ The first parameter is the name of the app (e.g. Firefox Preview) --> Sácale el máximo provecho a %s. + + Clic para más detalles + Colecciona las cosas que te importan diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 4ebbdf6d1..ca33925c9 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -12,7 +12,7 @@ غیر فعال شده در حالت مرور خصوصی - جست‌وجو یا ورود نشانی + جست‌وجو یا ورود آدرس زبانه های باز شما در اینجا نشان داده می شود. @@ -95,6 +95,8 @@ رد کردن + + طرح بندی برگه های باز را تغییر دهید. به تنظیمات بروید و شبکه را در زیر نمای برگه انتخاب کنید. برو به تنظیمات @@ -139,7 +141,7 @@ سایت دسک تاپ - افزودن به صفحه‌ی خانه + افزودن به صفحه خانگی نصب @@ -150,8 +152,6 @@ پیدا کردن در صفحه برگه خصوصی - - زبانه جدید افزودن به مجموعه @@ -178,7 +178,7 @@ - اتصال امکان پذیر نیست. طرح URL غیرقابل تشخیص است. + اتصال امکان پذیر نیست. طرح آدرس غیرقابل تشخیص است. @@ -269,6 +269,8 @@ باز کردن پیوند در زبانه خصوصی اجازه گرفتن تصویر از صفحه در حالت مرور خصوصی + + در صورت اجازه ، هنگام باز شدن چندین برنامه ، برگه های خصوصی نیز قابل مشاهده هستند میانبر مرور خصوصی را اضافه کنید @@ -289,6 +291,8 @@ زمینه خانه + + اشارات سفارشی‌سازی @@ -324,6 +328,8 @@ جست‌و‌جو نشانک‌ها + + جست‌وجو در زبانه‌های همگام‌سازی شده تنظیمات حساب @@ -338,6 +344,26 @@ اعلان‌ها + + + مجموعه افزودنی سفارشی + + تایید + + لغو + + نام مجموعه + + مالک مجموعه (شناسه کاربری) + + مجموعه افزونه اصلاح شده است. ترک برنامه برای اعمال تغییرات… + + + + افزونه پشتیبانی نمی شود + + افزونه قبلا نصب شده است + هم اکنون همگام سازی کن @@ -416,6 +442,10 @@ ارزیابی داده به اشتراک‌ گذاری داده‌هایی در خصوص ویژیگی که شما در %1$s با Leanplum تیم فروش موبایل ما. + + مطالعات + + به موزیلا اجازه دهید تا افزونه‌های مطالعاتی را نصب و اجرا کند آزمون ها @@ -463,6 +493,11 @@ موضوع دستگاه را دنبال کنید + + برای جابجایی بین زبانه‌ها، نوار ابزار را به طرفین بکشید + + برای باز کردن زبانه‌ها، نوار ابزار را به سمت بالا بکشید + جلسات @@ -508,6 +543,15 @@ زبانه‌هایی که اخیرا بسته نشدند + + + زبانه‌ها + + نمای زبانه‌ها + + فهرستی + + شبکه‌ای بستن زبانه‌ها @@ -519,6 +563,15 @@ بعد از یک ماه + + بستن دستی + + بستن پس از یک روز + + بستن پس از یک هفته + + بستن پس از یک ماه + زبانه‌های باز @@ -536,6 +589,8 @@ زبانه‌های باز افزودن به مجموعه + + انتخاب به اشتراک‌گذار همه‌ی زبانه‌ها @@ -550,8 +605,18 @@ برو به خانه تغییر حالت زبانه + + نشانک‌گذاری + + بستن + + هم‌رسانی زبانه‌های انتخاب شده + + منوی زبانه‌های انتخاب شده حذف زبانه از مجموعه + + انتخاب زبانه‌ها بستن زبانه @@ -587,7 +652,11 @@ تغییر نام مجموعه زبانه‌های باز - + + نام مجموعه + + تغییر نام + حذف @@ -625,6 +694,10 @@ حذف %1$d مورد + + امروز + + دیروز 24 ساعت گذشته @@ -636,13 +709,28 @@ هیچ تاریخیچه‌ای در اینجا نیست + + + پاک کردن در بارگیری‌ها + + آیا از پاک کردن بارگیری‌ها مطمئن هستید؟ + + بارگیری‌ها حذف شدند + + %1$s حذف شد - اینجا هیچ بارگیری وجود ندارد + تا به حال پرونده‌ای بارگیری نشده است %1$d انتخاب شد + + باز کردن + + حذف + + متاسفیم. %1$s نمی‌تواند این صفحه را بار کند. @@ -763,6 +851,10 @@ مکان اعلان‌ + + حافظهٔ دائمی + + محتوای کنترل شده با DRM درخواست برای اجازه دادن @@ -903,6 +995,12 @@ زبانه بسته شده زبانه‌های بسته شده + + زبانه بسته شد! + + نشانک‌ها ذخیره شدند! + + نما به سایت های برتر اضافه شد! @@ -1135,11 +1233,13 @@ https://firefox.com/pair بروید]]> - آماده برای اسکن + آمادهٔ اسکن با دوربین خود وارد سیستم شوید به جای آن از ایمیل استفاده کنید + + یکی ایجاد کنید.]]> فایرفاکس همگام سازی با حساب شما را متوقف خواهد کرد، ولی هیچ کدوم از اطلاعات شما بر روی این مرورگر حذف نخواهد شد. @@ -1155,7 +1255,7 @@ تنظیمات حفاظتی - بهینه سازی محافظت از دنبال کنندگان + محافظت پیشرفته در برابر ردیابی بدون دنبال شدن مرور کنید @@ -1248,6 +1348,11 @@ The first parameter is the app name --> %s | کتابخانه های OSS + + ردیاب‌هایِ تغییر مسیر + + کوکی‌های تنظیم شده توسطِ تغییر مسیر به وبسایت‌های ردیابیِ شناخته شده را پاک می‌کند. + پشتیبانی @@ -1282,7 +1387,7 @@ آدرس به کلیپ‌بورد ریخته شد - افزودن به صفحه‌ی خانه + افزودن به صفحه خانگی انصراف @@ -1315,7 +1420,7 @@ ورودهای ذخیره شده - ورود به سیستم ذخیره شده یا همگام سازی با%s در اینجا نشان داده می شود. + اطلاعاتِ ورودی سایت‌هایی که وارد یا به %s همرسانی می‌کنید در اینجا نشان داده می‌شوند. در مورد همگام‌سازی بیشتر بدانید. @@ -1324,7 +1429,7 @@ ورود و گذرواژه‌های ذخیره نشده در اینجا نشان داده خواهد شد. - ورود به سیستم و کلمه عبور برای این سایت ها ذخیره نمی شود. + اطلاعات ورود و گذرواژهٔ مربوط به این سایت‌ها ذخیره نخواهند شد. حذف تمام استثاناها @@ -1362,8 +1467,12 @@ آدرس به داخل کلیپ بورد ریخته شد رونوشت گذرواژه + + پاک کردن گذرواژه رونوشت نام کاربری + + پاک کردن نام‌کاربری رونوشت از سایت @@ -1538,11 +1647,22 @@ حد نصاب سایت‌های برتر شما پر شده است + + برای افزودن یک سایت برتر جدید، یکی را حذف کنید. سایت را لمس و نگه دارید و سپس حذف را انتخاب کنید. باشه،‌ متوجه شدم نمایش سایت های پربازدید + + نام + + نامِ سایتِ برتر + + تایید + + انصراف + حذف @@ -1550,6 +1670,9 @@ The first parameter is the name of the app (e.g. Firefox Preview) --> نهایت استفاده از %s ببرید. + + برای جزئیات بیشتر کلیک کنید + ذخیره کردن چیزهایی که برای شما اهمیت دارد diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 4723f3501..1219cf950 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -733,18 +733,22 @@ Poista lataukset Haluatko varmasti tyhjentää lataukset? - - Lataukset poistettu + + Lataukset poistettu + + Poistettiin %1$s - Ei latauksia + Ei ladattuja tiedostoja %1$d valittu Avaa - - Poista + + + + Poista @@ -869,6 +873,8 @@ Ilmoitus Pysyvä tallennustila + + DRM-suojattu sisältö Kysy lupaa diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index a2d4137e7..768611904 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -155,8 +155,6 @@ Rechercher dans la page Onglet privé - - Nouvel onglet Enregistrer dans une collection @@ -368,6 +366,12 @@ Collection de modules complémentaires modifiée. Fermeture de l’application pour appliquer les modifications… + + + Ce module complémentaire n’est pas pris en charge + + Ce module complémentaire est déjà installé + Synchroniser maintenant diff --git a/app/src/main/res/values-fy-rNL/strings.xml b/app/src/main/res/values-fy-rNL/strings.xml index 0c4f0a0f6..2f9ed558f 100644 --- a/app/src/main/res/values-fy-rNL/strings.xml +++ b/app/src/main/res/values-fy-rNL/strings.xml @@ -723,18 +723,22 @@ Downloads wiskje Binne jo wis dat jo jo downloads wiskje wolle? - - Downloads fuortsmiten + + Downloads fuortsmiten + + %1$s fuortsmiten - Gjin downloads hjir + Gjin downloade bestannen %1$d selektearre Iepenje - - Fuortsmite + + + + Fuortsmite @@ -858,6 +862,8 @@ Notifikaasje Fêst ûnthâld + + DRM-behearde ynhâld Freegje om tastimming diff --git a/app/src/main/res/values-gn/strings.xml b/app/src/main/res/values-gn/strings.xml index 6b0801f43..d0da23ce6 100644 --- a/app/src/main/res/values-gn/strings.xml +++ b/app/src/main/res/values-gn/strings.xml @@ -734,10 +734,12 @@ Emboguete ñemboguejy ¿Añetehápe emboguetese umi ñemboguejy? - - Ñemboguejy Mboguetepyre + + Ñemboguejy Mboguetepyre + + Emboguete %1$s - Ndaipóri ñemboguejy ápe + Ndaipóri marandurenda mboguejypyre %1$d poravopyre @@ -745,8 +747,10 @@ Jeike - - Mboguete + + + + Mboguete @@ -874,6 +878,8 @@ Ñemomarandu Ñongatuharenda areguáva + + Tetepy ohechajeýva DRM Ejerure ñemoneĩ diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 14132a2e7..cb21da545 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -153,8 +153,6 @@ Pronađi na stranici Privatna kartica - - Nova kartica Spremi u zbirku @@ -363,6 +361,12 @@ Izmijenjena je kolekcija dodataka. Napuštanje aplikacije za primjenu izmjena… + + + Dodatak nije podržan + + Dodatak je već instaliran + Sinkroniziraj sada @@ -724,18 +728,22 @@ Izbriši preuzimanja Sigurno želiš očistiti svoja preuzimanja? - - Preuzimanja su izbrisana + + Uklonjena preuzimanja + + %1$s uklonjen - Ovdje nema preuzimanja + Nema preuzetih datoteka Odabrano: %1$d Otvori - - Izbriši + + + + Ukloni @@ -862,6 +870,8 @@ Obavijest Trajna pohrana + + Sadržaj određen pravima digitalnog sadržaja Zatraži dozvolu diff --git a/app/src/main/res/values-hsb/strings.xml b/app/src/main/res/values-hsb/strings.xml index f91f2f461..67fdeee69 100644 --- a/app/src/main/res/values-hsb/strings.xml +++ b/app/src/main/res/values-hsb/strings.xml @@ -727,18 +727,22 @@ Sćehnjenja zhašeć Chceće woprawdźe swoje sćehnjenja zhašeć? - - Sćehnjenja su zhašane + + Sćehnjenja wotstronjene + + %1$s je so wotstronił - Žane sćehnjenja tu + Žane sćehnjene dataje Wubrane: %1$d Wočinić - - Zhašeć + + + + Wotstronić @@ -863,6 +867,8 @@ Zdźělenka Trajny składowak + + Wobsah wodźeny přez DRM Wo dowolnosć so prašeć diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index a3f8238fc..29e538d98 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -728,18 +728,22 @@ Letöltések törlése Biztos, hogy törli a letöltéseket? - - Letöltések törölve + + Letöltések eltávolítva + + %1$s eltávolítva - Nincs itt letőltés + Nincsenek letöltött fájlok %1$d kiválasztva Megnyitás - - Törlés + + + + Eltávolítás @@ -864,6 +868,8 @@ Értesítés Állandó tároló + + DRM-vezérelt tartalom Kérdezzen rá diff --git a/app/src/main/res/values-hy-rAM/strings.xml b/app/src/main/res/values-hy-rAM/strings.xml index f454bc3f7..5cb22d516 100644 --- a/app/src/main/res/values-hy-rAM/strings.xml +++ b/app/src/main/res/values-hy-rAM/strings.xml @@ -155,8 +155,6 @@ Գտնել էջում Գաղտնի ներդիր - - Նոր ներդիր Պահպանել հավաքածուում @@ -364,6 +362,12 @@ Հավելումների հավաքածուն փոփոխվել է: Հավելվածը փակելիս փոփոխությունները կգործադրվեն: + + + Հավելումը չի աջակցվում + + Հավելումն արդեն տեղադրված է + Համաժամեցնել diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index fab2f316f..3b0a5a53a 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -156,8 +156,6 @@ Temukan di laman Tab pribadi - - Tab baru Simpan ke koleksi @@ -372,6 +370,12 @@ Koleksi pengaya dimodifikasi. Keluar dari aplikasi untuk menerapkan pengubahan… + + + Pengaya tidak didukung + + Pengaya telah didukung + Sinkronkan sekarang diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 07504d730..f20529db4 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -738,18 +738,22 @@ Cancella download Cancellare i download? - - Download cancellati + + Download eliminati + + È stato eliminato %1$s - Nessun download disponibile + Nessun file scaricato %1$d selezionati Apri - - Elimina + + + + Elimina @@ -876,6 +880,8 @@ Notifica Archiviazione permanente + + Contenuti protetti da DRM Chiedi il consenso diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index 4c720eccc..acf41442b 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -719,18 +719,22 @@ מחיקת הורדות האם ברצונך לנקות את ההורדות שלך? - - ההורדות נמחקו + + ההורדות הוסרו + + הוסר %1$s - אין כאן הורדות + אין קבצים שהורדו %1$d נבחרו פתיחה - - מחיקה + + + + הסרה @@ -855,6 +859,8 @@ התרעה אחסון קבוע + + תוכן מוגן DRM לבקש לאפשר diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 541ddb8be..cba9739e3 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -157,8 +157,6 @@ ページ内検索 プライベートタブ - - 新しいタブ コレクションに保存 @@ -371,6 +369,12 @@ アドオンコレクションが変更されました。変更を適用するためにアプリケーションを終了しています… + + + サポートされていないアドオンです + + アドオンはすでにインストールされています。 + 今すぐ同期 @@ -731,18 +735,22 @@ ダウンロード履歴を消去 本当にダウンロード履歴を消去しますか? - - ダウンロード履歴を消去しました + + ダウンロード履歴を削除しました + + %1$s を削除しました - ダウンロードしたファイルはありません + ダウンロード済みのファイルはありません %1$d 件選択 開く - - 削除 + + + + 削除 @@ -870,6 +878,8 @@ 通知 永続ストレージ + + DRM 制御されたコンテンツ 許可を求める diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index 6c592a52e..2ae9c95b1 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -157,8 +157,6 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Nadi deg usebter Iccer uslig - - Iccer amaynut Sekles ɣer tegrumma @@ -368,6 +366,12 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Tagrumma n yizegrar tettwabeddel. Ffeɣ seg usnas akken ad ddun yibeddilen… + + + Azegrir ur yettusefrak ara + + Azegrir yettusebded yakan + Mtawi tura @@ -729,10 +733,12 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Kkes isadaren D tidet tebɣiḍ ad tsefḍeḍ isadaren? - - Isadaren ttwakksen + + Isadaren ttwakksen + + Yettwakkes %1$s - Ulac isidar da + Ulac ifuyla i d-yettusadren %1$d yettwafren @@ -740,8 +746,10 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Ldi - - Kkes + + + + Kkes @@ -867,6 +875,8 @@ Tiktiwin tigejdanin yuzzlen ur nṣeḥḥi ara Alɣu Aklas imezgi + + Agbur yettwaḥerzen s DRM Suter asireg diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index f7a115a62..8ed61d8f4 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -151,8 +151,6 @@ Беттен табу Жекелік бет - - Жаңа бет Жинаққа сақтау @@ -358,6 +356,12 @@ Қосымшалар жинағы өзгертілген. Өзгерістерді іске асыру үшін қолданба жұмысын аяқтау… + + + Қосымшаға қолдау жоқ + + Қосымша орнатылған болып тұр + Қазір синхрондау @@ -711,18 +715,22 @@ Жүктемелерді тазарту Жүктемелеріңізді өшіруді шынымен қалайсыз ба? - - Жүктемелер өшірілді + + Жүктемелер өшірілді + + %1$s өшірілді - Жүктемелер жоқ + Жүктеліп алынған файлдар жоқ %1$d таңдалды Ашу - - Өшіру + + + + Өшіру @@ -846,6 +854,8 @@ Хабарлама Тұрақты қойма + + DRM-мен басқарылатын құрама Рұқсат ету үшін сұрау diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 52a999f62..7708f480a 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -741,10 +741,12 @@ 다운로드 삭제 다운로드를 삭제하시겠습니까? - - 다운로드 삭제됨 + + 다운로드 삭제됨 + + %1$s 삭제됨 - 다운로드 없음 + 다운로드한 파일 없음 %1$d개 선택됨 @@ -752,8 +754,10 @@ 열기 - - 삭제 + + + + 삭제 @@ -884,6 +888,8 @@ 알림 영구 저장소 + + DRM 제어 콘텐츠 항상 확인 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 83f3212d8..294d1cd32 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -154,8 +154,6 @@ Privačioji kortelė - - Nauja kortelė Įtraukti į rinkinį @@ -362,6 +360,12 @@ Pakeistas priedų rinkinys. Išeinama iš programos, kad būtų pritaikyti pakeitimai… + + + Priedas nepalaikomas + + Priedas jau įdiegtas + Sinchronizuoti dabar @@ -719,10 +723,12 @@ Pašalinti atsiuntimus Ar tikrai norite išvalyti savo atsiuntimus? - - Atsiuntimai pašalinti + + Atsiuntimai pašalinti + + Pašalinta %1$s - Atsiuntimų nėra + Nėra atsiųstų failų Pasirinkta: %1$d @@ -730,8 +736,10 @@ Atverti - - Pašalinti + + + + Pašalinti @@ -857,6 +865,8 @@ Pranešimas Išliekanti atmintis + + DRM valdomas turinį Prašyti leidimo diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 49dc30e35..358720913 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -731,18 +731,22 @@ Slett nedlastinger Er du sikker på at du vil tømme nedlastningene dine? - - Nedlastinger slettet + + Nedlastinger fjernet + + Fjernet %1$s - Ingen nedlastinger her + Ingen nedlastede filer %1$d valgt Åpne - - Slett + + + + Fjern @@ -869,6 +873,8 @@ Varsel Vedvarende lagring + + DRM-kontrollert innhold Be om å tillate diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index aea3c4c3d..213f26635 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -732,18 +732,22 @@ Downloads verwijderen Weet u zeker dat u uw downloads wilt wissen? - - Downloads verwijderd + + Downloads verwijderd + + %1$s verwijderd - Geen downloads hier + Geen gedownloade bestanden %1$d geselecteerd Openen - - Verwijderen + + + + Verwijderen @@ -867,6 +871,8 @@ Notificatie Vaste opslag + + DRM-beheerde inhoud Vragen om toestemming diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 134585abe..efe54c81e 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -100,6 +100,8 @@ Ignorer + + Endre utsjånad av opne faner. Gå til innstillingar og vel rutenett under fanevising. Gå til Innstillingar diff --git a/app/src/main/res/values-pa-rIN/strings.xml b/app/src/main/res/values-pa-rIN/strings.xml index 7d725afba..d0c77e636 100644 --- a/app/src/main/res/values-pa-rIN/strings.xml +++ b/app/src/main/res/values-pa-rIN/strings.xml @@ -159,8 +159,6 @@ ਸਫ਼ੇ ‘ਚ ਲੱਭੋ ਪ੍ਰਾਈਵੇਟ ਟੈਬ - - ਨਵੀਂ ਟੈਬ ਭੰਡਾਰ ‘ਚ ਸੰਭਾਲੋ @@ -373,6 +371,12 @@ ਐਡ-ਆਨ ਭੰਡਾਰ ਸੋਧਿਆ ਗਿਆ। ਤਬਦੀਲੀਆਂ ਲਾਗੂ ਕਰਨ ਲਈ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ… + + + ਐਡ-ਆਨ ਸਹਾਇਕ ਨਹੀਂ ਹੈ + + ਐਡ-ਆਨ ਪਹਿਲਾਂ ਹੀ ਇੰਸਟਾਲ ਹੈ + ਹੁਣੇ ਸਿੰਕ ਕਰੋ diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 0e86624d4..980235ec4 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -723,18 +723,22 @@ Excluir downloads Tem certeza que quer limpar seus downloads? - - Downloads excluídos + + Downloads removidos + + %1$s removido - Nenhum download aqui + Nenhum arquivo baixado %1$d selecionados Abrir - - Excluir + + + + Remover @@ -859,6 +863,8 @@ Notificações Armazenamento persistente + + Conteúdo controlado por direitos autorais Perguntar se deve permitir diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 225aeb63f..735fa8edc 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -155,8 +155,6 @@ Encontrar na página Separador privado - - Novo separador Guardar na coleção @@ -364,6 +362,12 @@ Coleção de extras modificada. A sair da aplicação para aplicar alterações… + + + O extra não é suportado + + O extra já está instalado + Sincronizar agora @@ -722,18 +726,22 @@ Limpar transferências Tem certeza de que pretende limpar as transferências? - - Transferências eliminadas + + Transferências removidas + + %1$s removido - Sem transferências aqui + Sem ficheiros transferidos %1$d selecionados Abrir - - Apagar + + + + Remover @@ -859,6 +867,8 @@ Armazenamento persistente + + Conteúdo controlado por DRM Solicitar permissão diff --git a/app/src/main/res/values-rm/strings.xml b/app/src/main/res/values-rm/strings.xml index cc79a52be..e8ef71c65 100644 --- a/app/src/main/res/values-rm/strings.xml +++ b/app/src/main/res/values-rm/strings.xml @@ -152,8 +152,6 @@ Tschertgar en la pagina Tab privat - - Nov tab Memorisar en ina collecziun @@ -360,6 +358,12 @@ Modifitgà la collecziun da supplements. L\'applicaziun vegn serrada per applitgar las midadas… + + + Il supplement na vegn betg sustegnì + + Il supplement è gia installà + Sincronisar ussa @@ -713,10 +717,12 @@ Stizzar la glista da telechargiadas Vuls ti propi stizzar tia glista da telechargiadas? - - Stizzà la glista da telechargiadas + + Allontanà las telechargiadas + + Allontanà %1$s - Naginas telechargiadas disponiblas + Naginas datotecas telechargiadas %1$d tschernidas @@ -724,8 +730,10 @@ Avrir - - Stizzar + + + + Allontanar @@ -849,6 +857,8 @@ Communicaziuns Memoria durabla + + Cuntegn controllà da DRM Dumandar il permiss diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 02d5172ea..839c0d245 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -49,7 +49,7 @@ Снят выбор с %1$s - Режим множественного выбора отключен + Режим множественного выбора отключён Включен режим множественного выбора, выберите вкладки для сохранения в коллекцию @@ -88,7 +88,7 @@ Пропустить - Требуется доступ к камере. Перейдите в настройки системы, коснитесь разрешений и нажмите «разрешить». + Требуется доступ к камере. Перейдите в системные настройки приложения, выберите «Разрешения», затем нажмите «Камера» и выберите «Разрешить». Перейти в настройки @@ -162,8 +162,6 @@ Найти на странице Приватная вкладка - - Новая вкладка В коллекцию @@ -375,6 +373,12 @@ Коллекция дополнений была изменена. Закрываем приложение, чтобы применить изменения… + + + Дополнение не поддерживается + + Дополнение уже установлено + Синхронизировать @@ -561,7 +565,7 @@ %d вкладка - Здесь нет недавно закрытых вкладок + Нет недавно закрытых вкладок @@ -626,7 +630,7 @@ Переключить режим просмотра - Закладка + Добавить в закладки Закрыть @@ -734,18 +738,22 @@ Удалить загрузки Вы уверены, что хотите удалить свои загрузки? - - Загрузки удалены + + Загрузки удалены + + Файл %1$s удалён - Здесь ещё нет загрузок + Нет загруженных файлов Выбрано: %1$d Открыть - - Удалить + + + + Удалить @@ -779,7 +787,7 @@ %s удалит выбранные элементы. - %1$s удалён + %1$s удалена Создать папку @@ -872,6 +880,8 @@ Уведомления Постоянное хранилище + + Защищённое DRM содержимое Всегда спрашивать @@ -1162,7 +1172,7 @@ Это приложение больше не будет получать обновлений безопасности. Загрузите новый Nightly и прекратите использование этого приложения. \n\nЧтобы переместить ваши закладки, логины и историю в другое приложение, создайте аккаунт Firefox. - Получить новый Nightly + Загрузить новый Nightly Достигнут лимит топа сайтов - Чтобы добавить новый сайт в топ, удалите другой. Нажмите и удерживайте карточку с сайтом, затем откройте меню и нажмите удалить. + Чтобы добавить новый сайт в топ, удалите другой. Нажмите и удерживайте карточку с сайтом, а затем нажмите «Удалить». OK, понятно - Показать самые посещаемые сайты + Показывать самые посещаемые сайты Имя @@ -1713,7 +1723,7 @@ Получите максимум от %s. - Щёлкните, чтобы узнать больше + Нажмите, чтобы узнать больше Собирайте то, что важно для вас diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index cb2840c87..1608efc70 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -155,8 +155,6 @@ Hľadať na stránke Súkromná karta - - Nová karta Uložiť do kolekcie @@ -370,6 +368,12 @@ Kolekcia doplnkov bola upravená. Aplikácia sa ukončuje a zmeny budú použité… + + + Doplnok nie je podporovaný + + Doplnok je už nainštalovaný + Synchronizovať @@ -728,18 +732,22 @@ Vymazať zoznam prevzatých súborov Naozaj chcete vymazať svoju históriu preberania? - - História bola vymazaná + + Prevzaté súbory boli odstránené + + Súbor %1$s bol odstránený - Žiadne prevzaté súbory + Žiadne prevzaté súbory Počet vybraných položiek: %1$d Otvoriť - - Odstrániť + + + + Odstrániť @@ -863,6 +871,8 @@ Upozornenia Trvalé úložisko + + Obsah chránený pomocou DRM Vždy sa spýtať diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index c88bde699..b0be8590c 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -155,8 +155,6 @@ Najdi na strani Zasebni zavihek - - Nov zavihek Shrani v zbirko @@ -366,6 +364,12 @@ Zbirka dodatkov je spremenjena. Zapiranje aplikacije za uveljavitev sprememb … + + + Dodatek ni podprt + + Dodatek je že nameščen + Sinhroniziraj zdaj diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 391d52f44..525d11c83 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -152,8 +152,6 @@ Нађи на страници Приватни језичак - - Нови језичак Сачувај у збирку @@ -362,6 +360,12 @@ Колекција додатака је промењена. Затварам апликацију да би промене ступиле на снагу… + + + Додатак није подржан + + Додатак је већ инсталиран + Синхронизуј сада diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index b4b1d0436..44bcff087 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -735,18 +735,22 @@ Ta bort nedladdningar Är du säker på att du vill rensa nedladdningarna? - - Nedladdningar borttagna + + Nedladdningar har tagits bort + + Tog bort %1$s - Inga hämtningar här + Inga nedladdade filer %1$d markerad Öppen - - Ta bort + + + + Ta bort @@ -870,6 +874,8 @@ Meddelanden Beständig lagring + + DRM-kontrollerat innehåll Fråga för att tillåta diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index c1d8082f8..796c45851 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -153,8 +153,6 @@ ค้นหาในหน้า แท็บส่วนตัว - - แท็บใหม่ บันทึกไปยังชุดสะสม @@ -363,6 +361,12 @@ ชุดสะสมส่วนเสริมได้ถูกแก้ไขแล้ว ออกจากแอปพลิเคชันเพื่อใช้การเปลี่ยนแปลง… + + + ไม่รองรับส่วนเสริม + + ส่วนเสริมถูกติดตั้งแล้ว + ซิงค์ตอนนี้ @@ -718,19 +722,23 @@ ลบการดาวน์โหลด คุณแน่ใจหรือไม่ว่าต้องการล้างการดาวน์โหลดของคุณ? - - การดาวน์โหลดถูกลบ - - ไม่มีการดาวน์โหลด + + การดาวน์โหลดถูกลบ + + เอา %1$s ออกแล้ว + + ไม่มีไฟล์ที่ดาวน์โหลด เลือกอยู่ %1$d เปิด - - ลบ + + + + เอาออก @@ -854,6 +862,8 @@ การแจ้งเตือน ที่เก็บถาวร + + เนื้อหาที่ควบคุมด้วย DRM ถามเพื่ออนุญาต diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index 4970cb31b..d59696360 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -58,6 +58,8 @@ Alisin + + Pumunta sa settings Alisin @@ -108,8 +110,6 @@ Hanapin sa pahina Pribadong tab - - Bagong tab i-Save sa koleksyon @@ -133,6 +133,9 @@ Itsura + + + Mamili ng wika Hanapin @@ -244,9 +247,13 @@ Telemetry Marketing data + + Mga pag-aaral Mga eksperimento + + Crash reporter Mozilla location service @@ -313,18 +320,38 @@ Grid + + Isara ang mga tab + + + + Buksan ang mga tab Magdagdag ng Tab + + Pribado + + Buksan ang mga Tab Pumili Bagong Tab + + Bookmark + + Isara + + Ibahagi ang mga tab + + Ibahagi ang tab Burahin i-Save + + Ibahagi Alisin @@ -335,6 +362,8 @@ Kopyahin + + Ibahagi Ngayon @@ -355,6 +384,8 @@ Kopyahin + + Ibahagi Burahin @@ -385,6 +416,14 @@ Isara + + Ibahagi + + Ibahagi + + + Tingnan Kopyahin ang URL diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 6713da475..706ce0602 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -725,18 +725,22 @@ İndirmeleri sil İndirmelerinizi temizlemek istediğinizden emin misiniz? - - İndirmeler silindi + + İndirmeler kaldırıldı + + %1$s kaldırıldı - Hiçbir şey indirilmemiş + Hiçbir şey indirilmemiş %1$d indirme seçildi - - Sil + + + + Kaldır @@ -860,6 +864,8 @@ Bildirim Kalıcı depolama + + DRM denetimli içerikler İzin iste diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a79f1388b..3599ea954 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -731,18 +731,22 @@ Видалити завантаження Ви впевнені, що хочете очистити завантаження? - - Завантаження видалено + + Завантаження вилучено + + Вилучено %1$s - Завантажень немає + Завантажених файлів немає Вибрано %1$d Відкрити - - Видалити + + + + Вилучити @@ -867,6 +871,8 @@ Сповіщення Постійне сховище + + Вміст, контрольований DRM Запитувати дозвіл @@ -1160,7 +1166,7 @@ Отримайте відповіді тут - Почніть синхронізувати закладки, паролі та інші дані з Обліковим записом Firefox. + Почніть синхронізувати закладки, паролі та інші дані з обліковим записом Firefox. Докладніше آپ کے نجی ٹیبز یہاں دکھائے جائیں گے۔ + + بیدو + + JD 1 کھلا ٹیب۔ ٹیبز بدلنے کے لئے دبائیں۔ @@ -78,9 +82,16 @@ برخاست کریں + + اختیارات دیکھیں برخاست کریں + + سیٹنگز پر جائیں + + برخاست کریں + نیا ٹیب @@ -125,12 +136,12 @@ تنصیب کریں سینک ہو چکے ٹیبز + + دوباره سینک کریں صفحہ میں ڈھونڈیں نجی ٹیب - - نیا ٹیب مجموعہ میں محفوظ کریں @@ -194,6 +205,9 @@ مزید سیکھیں + + + ایک نیا Firefox ٹیب کھولیں تلاش کریں @@ -266,6 +280,8 @@ ٹول بار تھیم + + ابتدائی صفحہ تخصیص کریں @@ -300,6 +316,8 @@ براؤزنگ کی تاریخ تلاش کریں بک مارک تلاش کریں + + اکاؤنٹ کی سیٹنگز @@ -318,6 +336,11 @@ منسوخ کریں + + مجموعہ کا نام + + مجموعہ کرنے والا مالک (صارف شناخت) + ابھی sync کریں @@ -399,6 +422,8 @@ مارکیٹنگ کا ڈیٹا ہمارے موبائل مارکیٹنگ کے وینڈر، Leanplum کے ساتھ %1$s میں آپکے ذریعہ استعمال کی جانے والی خصوصیات کے کوائف کو بانٹتا ہے۔ + + مطالعہ تجربات @@ -481,6 +506,10 @@ بند کریں + + حالیہ بند کیے گئے ٹیب + + تمام سابقات دکھائیں %d ٹیب @@ -488,6 +517,16 @@ %d is a placeholder for the number of tabs selected. --> %d ٹیب + + یہاں حالیہ بند کیے گئے ٹیبز نہیں ہیں + + + + ٹیبس + + فہرست + + گرڈ ٹیب بند کریں @@ -500,6 +539,16 @@ ایک مہینے کے بعد + + دستی طور پر بند کریں + + ایک دن کے بعد بند کریں + + ایک ہفتے کے بعد بند کریں + + + ایک ماہ کے بعد بند کریں + ٹیبس کھولیں @@ -517,8 +566,12 @@ ٹیب کھولیں مجموعہ میں محفوظ کریں + + منتخب کریں تمام ٹیبز شیئر کریں + + حالیہ بند کیے گئے ٹیبز ٹیب کی سیٹنگز @@ -529,8 +582,16 @@ ہوم پے جائیں ٹیب موڈ ٹوگل کریں + + بک مارک + + بند كریں + + منتخب شدہ ٹیبز کا اشتراک کریں مجموعہ سے ٹیب کو ہٹا دیں + + ٹیب منتخب کریں ٹیب بند کریں @@ -564,9 +625,15 @@ مجموعہ کا نام تبدیل کریں ٹیب کھولیں - + + مجموعہ کا نام + + نام تبدیل کریں + ہٹائیں + + سابقات سے حذف کریں %1$s (نجی موڈ) @@ -616,14 +683,24 @@ یہاں کوئی سابقات نہیں ہے - - یہاں کوئی ڈاؤن لوڈ نہیں - + + + ڈاؤن لوڈ حذف کریں + + ڈاؤن لوڈز کو ہٹا دیا گیا + + %1$s ہٹائیں %1$d منتخب کیا گیا + + کھولیں + + ہٹائیں + + معاف کریں۔ %1$s اس صفحہ کو لوڈ نہیں کر سکتا ہے۔ @@ -745,6 +822,8 @@ مقام اعلانات + + DRM کے زیرانتظام مواد اجازت کے لئے پوچھیں @@ -887,6 +966,10 @@ ٹیبز بند ہوگئیں + + ٹیبز بند ہوگئیں + + دیکھیں سر فہرست سائٹوں میں شامل! @@ -1044,6 +1127,8 @@ سخت (سفارش شدا) سخت + + زیادہ ٹریکر ، اشتہارات اور پاپ اپ کو بلاک کرتا ہے۔ صفحات تیزی سے لوڈ ہوتے ہے ، لیکن کچھ فعالیت کام نہیں کرسکتی ہے۔ @@ -1483,6 +1568,13 @@ ٹھیک ہے سمجھ گیا + + نام + + ٹھیک ہے + + منسوخ کریں + ہٹائیں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index cf5cf4b56..bcce9062f 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -155,8 +155,6 @@ Tìm trong trang Thẻ riêng tư - - Thẻ mới Lưu vào bộ sưu tập @@ -363,6 +361,12 @@ Đã sửa đổi bộ sưu tập tiện ích mở rộng. Thoát ứng dụng để áp dụng các thay đổi… + + + Tiện ích mở rộng không được hỗ trợ + + Tiện ích mở rộng đã được cài đặt trước đó + Đồng bộ ngay @@ -717,18 +721,22 @@ Xóa nội dung tải xuống Bạn có chắc chắn muốn xóa nội dung tải xuống của mình không? - - Đã xóa nội dung tải xuống + + Đã xóa tải xuống + + Đã xóa %1$s - Không có tải xuống ở đây + Không có tập tin đã tải xuống %1$d đã chọn Mở - - Xóa + + + + Xóa @@ -853,6 +861,8 @@ Thông báo Bộ nhớ liên tục + + Nội dung DRM được kiểm soát Hỏi để cho phép diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e2172d6da..506cac81b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -741,18 +741,22 @@ 删除下载项 您确定要清除下载项吗? - - 下载项已删除 + + 下载项已移除 + + 已移除 %1$s - 暂无下载项 + 暂无下载的文件 已选择 %1$d 个下载项 打开 - - 删除 + + + + 移除 @@ -881,6 +885,8 @@ 通知 持久存储 + + 受 DRM 控制的内容 始终询问 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ef49bf6ae..5d1dae634 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -734,18 +734,22 @@ 清除下載紀錄 您確定要清除下載紀錄? - - 已清除下載紀錄 + + 已移除下載紀錄 + + 已移除 %1$s - 沒有下載的檔案 + 無已下載的檔案 已選擇 %1$d 個下載的檔案 開啟 - - 刪除 + + + + 移除 @@ -872,6 +876,8 @@ 通知 持續性儲存空間 + + 由 DRM 控制的內容 總是詢問 From 81f208bda11a83309d3bc602f4d929595b9459fc Mon Sep 17 00:00:00 2001 From: Arturo Mejia Date: Fri, 18 Dec 2020 16:55:41 -0500 Subject: [PATCH 022/205] For issue #13981 Use DEEP_LINK_SCHEME instead of hard-coded fenix --- app/src/main/java/org/mozilla/fenix/components/Components.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/components/Components.kt b/app/src/main/java/org/mozilla/fenix/components/Components.kt index 869317964..2edb47980 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Components.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -117,7 +117,7 @@ class Components(private val context: Context) { onNotificationClickIntent = Intent(context, HomeActivity::class.java).apply { action = Intent.ACTION_VIEW flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK - data = "fenix://settings_addon_manager".toUri() + data = "${BuildConfig.DEEP_LINK_SCHEME}://settings_addon_manager".toUri() } ) } From 8d01991363040eea9deb829d36d9fdd1cd3e2560 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 23 Dec 2020 15:36:08 +0000 Subject: [PATCH 023/205] Update Android Components version to 71.0.20201223143139. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 55810a90c..8233d032b 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201222143201" + const val VERSION = "71.0.20201223143139" } From 5445e61b6aa3d03bbea390200e5536f493a7e38b Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Thu, 24 Dec 2020 00:06:08 +0000 Subject: [PATCH 024/205] Import l10n. --- app/src/main/res/values-cs/strings.xml | 9 ++++++--- app/src/main/res/values-in/strings.xml | 16 +++++++++++----- app/src/main/res/values-nn-rNO/strings.xml | 18 ++++++++++++------ app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-te/strings.xml | 10 +++++----- 5 files changed, 35 insertions(+), 20 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 1ed02a0c8..e71658096 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -155,8 +155,6 @@ Najít na stránce Anonymní panel - - Nový panel Uložit do sbírky @@ -369,6 +367,9 @@ Nastavení sbírky změněno. Pro aplikování změn se nyní aplikace ukončí… + + Doplněk je již nainstalován + Synchronizovat @@ -605,6 +606,8 @@ Otevřené panely Uložit do sbírky + + Vybrat Sdílet všechny panely @@ -730,7 +733,7 @@ Zatím nemáte žádnou historii prohlížení - Žádná stahování + Žádné stažené soubory Vybráno stahování: %1$d diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 3b0a5a53a..6e9623b70 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -737,18 +737,22 @@ Hapus unduhan Yakin akan membersihkan unduhan Anda? - - Unduhan Dihapus + + Unduhan Dihapus + + %1$s telah dihapus - Tidak ada unduhan di sini + Tidak ada unduhan file %1$d terpilih Buka - - Hapus + + + + Hapus @@ -873,6 +877,8 @@ Pemberitahuan Penyimpanan Persisten + + Konten yang diatur DRM Meminta izin diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index efe54c81e..58d1377c7 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -731,11 +731,13 @@ Slett nedlastingar Er du sikker på at du vil rydde vekk nedlastingane dine? - - Nedlastingar sletta - - Ingen nedlastingar her + + Nedlastingar fjerna + + Fjerna %1$s + + Ingen nedlasta filer %1$d valde @@ -743,8 +745,10 @@ Opne - - Slett + + + + Fjern @@ -871,6 +875,8 @@ Vedvarande lagring + + DRM-kontrollert innhald Spør om løyve diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 839c0d245..3790dfce4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -328,7 +328,7 @@ Удалённая отладка по USB - Показать поисковые системы + Показывать поисковые системы Поисковые предложения diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 9323a6a0c..0a829536e 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -672,10 +672,8 @@ దింపుకోళ్ళను తొలగించు నిజంగానే మీ దింపుకోళ్ళను తుడిచేయాలనుకుంటున్నారా? - - దింపుకోలు తొలగించబడింది - దింపుకోళ్ళేమీ లేవు + దించుకున్న ఫైళ్ళేమీ లేవు %1$d ఎంచుకున్నారు @@ -683,8 +681,10 @@ తెరువు - - తొలగించు + + + + తొలగించు From 801ce85898789c62895360946da1d06aad09953f Mon Sep 17 00:00:00 2001 From: Christian Sadilek Date: Thu, 24 Dec 2020 09:55:08 -0500 Subject: [PATCH 025/205] For #17073: Stop observers after test run --- .../fenix/browser/OpenInAppOnboardingObserverTest.kt | 6 ++++++ .../org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt b/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt index 179d524d8..ce0cf7f01 100644 --- a/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/browser/OpenInAppOnboardingObserverTest.kt @@ -23,6 +23,7 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.app.links.AppLinksUseCases import mozilla.components.support.test.ext.joinBlocking import mozilla.components.support.test.rule.MainCoroutineRule +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -77,6 +78,11 @@ class OpenInAppOnboardingObserverTest { every { openInAppOnboardingObserver.createInfoBanner() } returns infoBanner } + @After + fun teardown() { + openInAppOnboardingObserver.stop() + } + @Test fun `GIVEN user configured to open links in external app WHEN page finishes loading THEN do not show banner`() { every { settings.openLinksInExternalApp } returns true diff --git a/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt b/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt index 0c277d205..1002264ca 100644 --- a/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shortcut/PwaOnboardingObserverTest.kt @@ -20,6 +20,7 @@ import mozilla.components.browser.state.store.BrowserStore import mozilla.components.feature.pwa.WebAppUseCases import mozilla.components.support.test.ext.joinBlocking import mozilla.components.support.test.rule.MainCoroutineRule +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -66,6 +67,11 @@ class PwaOnboardingObserverTest { ) } + @After + fun teardown() { + pwaOnboardingObserver.stop() + } + @Test fun `GIVEN cfr should not yet be shown WHEN installable page is loaded THEN counter is incremented`() { every { webAppUseCases.isInstallable() } returns true From eff234c7b5a9e296e6ab83e9ac9d2f84b7af720c Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 24 Dec 2020 15:33:38 +0000 Subject: [PATCH 026/205] Update Android Components version to 71.0.20201224143124. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 8233d032b..0fb5f7876 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201223143139" + const val VERSION = "71.0.20201224143124" } From 57d453dc7fe3f3d52b9196162b4a8e38b0b88442 Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Fri, 25 Dec 2020 00:04:05 +0000 Subject: [PATCH 027/205] Import l10n. --- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-te/strings.xml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index cb21da545..12a4ca67d 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -871,7 +871,7 @@ Trajna pohrana - Sadržaj određen pravima digitalnog sadržaja + Sadržaj kontroliran DRM-om Zatraži dozvolu diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 0a829536e..cddc39be9 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -575,6 +575,8 @@ మూసివేయి ట్యాబును సేకరణ నుండి తీసివేయి + + ట్యాబులను ఎంచుకో ట్యాబును మూసివేయి @@ -672,6 +674,8 @@ దింపుకోళ్ళను తొలగించు నిజంగానే మీ దింపుకోళ్ళను తుడిచేయాలనుకుంటున్నారా? + + దింపుకోళ్ళు తొలగించబడ్డాయి దించుకున్న ఫైళ్ళేమీ లేవు பரவாயில்லை நன்றி - - - பயர்பாக்சை வேகமாக அடைய. உங்கள் முகப்புத் திரையில் ஒரு சட்டகத்தைச் சேர். - - சட்டகத்தைச் சேர்க்கவும் - - இப்போதில்லை - தொடுப்புகள் செயலியில் திறக்கும்படி பயர்பாக்சை அமைக்கவும் @@ -149,8 +141,6 @@ பக்கத்தில் தேடு கமுக்கக் கீற்று - - புதிய கீற்று திரட்டில் சேமி @@ -564,6 +554,8 @@ முகப்பிற்கு செல் கீற்று முறையை நிலைமாற்று + + மூடு திரட்டிலிருந்து கீற்றை நீக்கு @@ -600,7 +592,7 @@ கீற்றுகளைத் திற - நீக்கு + நீக்கு வரலாற்றிலிருந்து அழி @@ -647,13 +639,11 @@ வரலாறு ஏதுமில்லை - - - பதிவிறக்கங்கள் இல்லை %1$d தேர்ந்தது + மன்னிக்கவும். %1$s பக்கத்தை ஏற்ற முடியாது. From b31493f25245726d85feed0a68aa33059bf85a4b Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 26 Dec 2020 15:34:46 +0000 Subject: [PATCH 029/205] Update Android Components version to 71.0.20201226143141. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0fb5f7876..bf91b4c97 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201224143124" + const val VERSION = "71.0.20201226143141" } From 33272d5447491f92249da61f13f3c3543ccc36f1 Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Sun, 27 Dec 2020 00:04:29 +0000 Subject: [PATCH 030/205] Import l10n. --- app/src/main/res/values-da/strings.xml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index f2200eb90..0e01ba854 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -154,8 +154,6 @@ Find på siden Privat faneblad - - Nyt faneblad Gem til samling @@ -361,6 +359,12 @@ Tilføjelses-samling ændret. Afslutter applikationen for at anvende ændringerne… + + + Tilføjelsen understøttes ikke + + Tilføjelsen er allerede installeret + Synkroniser nu @@ -714,18 +718,22 @@ Ryd filhentninger Er du sikker på, at du vil rydde dine filhentninger? - - Filhentninger ryddet + + Filhentninger fjernet + + Fjernede %1$s - Ingen filhentninger her + Ingen hentede filer %1$d valgt Åbn - - Slet + + + + Fjern @@ -849,6 +857,8 @@ Meddelelser Vedvarende lager + + DRM-kontrolleret indhold Spørg om tilladelse From 6e3deddebf28a8d504cefd8097c01d4c74af6df3 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 27 Dec 2020 15:35:43 +0000 Subject: [PATCH 031/205] Update Android Components version to 71.0.20201227143154. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index bf91b4c97..eb1aa89c2 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201226143141" + const val VERSION = "71.0.20201227143154" } From 16ab8bf1abf651e1410705f3b4236667aa386957 Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Mon, 28 Dec 2020 00:03:59 +0000 Subject: [PATCH 032/205] Import l10n. --- app/src/main/res/values-cs/strings.xml | 7 +++++++ app/src/main/res/values-eo/strings.xml | 16 +++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index e71658096..2020c1940 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -732,6 +732,11 @@ Zatím nemáte žádnou historii prohlížení + + + Smazat stažené soubory + + Opravdu chcete smazat všechny stažené soubory? Žádné stažené soubory Oznámení + + Obsah chráněný pomocí DRM Vždy se zeptat diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index 6d5814894..a32a44b64 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -725,10 +725,12 @@ Forigi elŝutojn Ĉu vi certe volas forigi viajn elŝutojn? - - Elŝutoj forigitaj + + Elŝutoj forigitaj + + %1$s forigita - Neniu elŝuto ĉi tie + Neniu elŝutita dosiero %1$d elektitaj @@ -736,8 +738,10 @@ Malfermi - - Forigi + + + + Forigi @@ -864,6 +868,8 @@ Konstanta konservejo + + Enhavo protektita de DRM Demandi antaŭ ol permesi From 96be55067dd0e1894d7d634567a9e8a3f2164c41 Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Tue, 29 Dec 2020 00:03:51 +0000 Subject: [PATCH 033/205] Import l10n. --- app/src/main/res/values-bn/strings.xml | 305 +++++++++++++++++++++---- 1 file changed, 255 insertions(+), 50 deletions(-) diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index b4c62f917..0963aabf2 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -14,14 +14,34 @@ ব্যক্তিগত ব্রাউজিং নিস্ক্রিয় করুন। অনুসন্ধান করুন বা ঠিকানা লিখুন - - কোনো খোলা ট্যাব নেই আপনার খোলা ট্যাবগুলি এখানে দেখানো হবে। + + Baidu + + JD + + + %1$d নির্বাচিত + + নতুন সংগ্রহ যুক্ত করুন + + নাম + + সংগ্রহ নির্বাচন করুন + + মাল্টিলেক্ট মোড থেকে প্রস্থান করুন + + + %1$s হচ্ছে Mozilla দ্বারা তৈরি। + আপনি একটি ব্যক্তিগত সেশনে আছেন + + ব্যাক্তিগত ব্রাউজিং সম্পর্কে কিছু ভুল ধারণা + সেশন মুছুন @@ -33,6 +53,26 @@ না ধন্যবাদ + + সেটিং এ যাও + + বাতিল + + + সেটিং এ যাও + + বাতিল + + + অপশন দেখাও + + বাতিল + + + সেটিং এ যাও + + বাতিল + নতুন ট্যাব @@ -80,12 +120,8 @@ পাতায় অনুসন্ধান করুন ব্যক্তিগত ট্যাব - - নতুন ট্যাব সংগ্রহে সংরক্ষণ করুন - - সাইটের সমস্যা রিপোর্ট করুন শেয়ার @@ -99,13 +135,17 @@ %1$s দ্বারা চালিত - + পাঠক দর্শন অ্যাপে খুলুন আবির্ভাব + + সংযোগ স্থাপন করতে ব্যর্থ। অজানা URL স্কিম। + নির্বাচিত ভাষা @@ -119,26 +159,30 @@ স্ক্যান - - শর্টকাটগুলি সার্চ ইঞ্জিন সেটিংস - - যা দিয়ে অনুসন্ধান করবেন: + + ক্লিপবোর্ড থেকে লিঙ্কটি পূরণ করুন অনুমতি দিন অনুমতি দিবেন না + + ব্যক্তিগত সেশনে অনুসন্ধানের পরামর্শ দেওয়ার অনুমতি দেবেন? + + ঠিকানা বারে টাইপ করা সবকিছ %s আপনার ডিফল্ট অনুসন্ধান ইঞ্জিনের মাধ্যমে আপনার সাথে শেয়ার করবে। আরও জানুন - অনুসন্ধান করুন ওয়েবে সন্ধান করুন + + কণ্ঠে অনুসন্ধান + সেটিংস @@ -181,10 +225,20 @@ সাইটের অনুমতি ব্যক্তিগত ব্রাউজিং + + লিঙ্ক ব্যক্তিগত ট্যাবে খুলুন + + ব্যক্তিগত ব্রাউজিং এ স্ক্রিনশটের অনুমতি দিন ব্যক্তিগত ব্রাউজিং শর্টকাটে যুক্ত করুন প্রবেশযোগ্যতা + + কাস্টম Firefox Account সার্ভার + + কাস্টম Sync সার্ভার + + Firefox Account/Sync সার্ভার সংশোধিত হয়েছে। পরিবর্তনগুলি প্রয়োগ করতে অ্যাপ্লিকেশন বন্ধ করুন… অ্যাকাউন্ট @@ -193,12 +247,16 @@ টুলবার থিম + + হোম কাস্টমাইজ আপনার Firefox অ্যাকাউন্ট দিয়ে বুকমার্কগুলো, পাসওয়ার্ড এবং আরও অনেক কিছু Sync করুন Firefox অ্যাকাউন্ট + + সিঙ্ক শুরু করতে পুনরায় সংযোগ দিন ভাষা @@ -212,8 +270,8 @@ ডেভেলপার টুলস USB এর মাধ্যমে রিমোট ডিবাগিং - - অনুসন্ধানের শর্টকাটগুলি দেখান + + অনুসন্ধান ইঞ্জিনগুলি দেখাও অনুসন্ধানের পরামর্শগুলি দেখান @@ -231,6 +289,16 @@ অ্যাড-অনগুলো + + নোটিফিকেশন + + + ঠিক আছে + + বাতিল + + সংগ্রহের নাম + এখনি Sync করুন @@ -242,6 +310,8 @@ বুকমার্কসমূহ লগইন + + ট্যাব খুলুন সাইন আউট @@ -260,6 +330,16 @@ শেষ Sync হয়েছিল: কখনো না + + %2$s %3$s তে %1$s + + + + প্রাপ্ত ট্যাবগুলো + + অন্যান্য Firefox ডিভাইস থেকে প্রাপ্ত ট্যাবগুলির জন্য নোটিফিকেশন। ট্যাব এসেছে @@ -272,6 +352,8 @@ ট্র্যাকিং সুরক্ষা ট্র্যাকিং সুরক্ষা + + অনলাইনে আপনাকে ট্র্যাক করে এমন কন্টেন্ট এবং স্ক্রিপ্টগুলি ব্লক করুন ব্যতিক্রমসমূহ @@ -289,8 +371,12 @@ টেলিমেট্রি ব্যবহার এবং প্রযুক্তিগত তথ্য + + আমাদের %1$s আরও উন্নত করতে সহায়তা করতে Mozilla -র সাথে আপনার ব্রাউজার সম্পর্কিত কর্মক্ষমতা, ব্যবহার, হার্ডওয়্যার এবং কাস্টমাইজেশন তথ্য শেয়ার করুন বিপণন তথ্য + + আমাদের মোবাইল বিপণন বিক্রেতা লিয়ানপ্লামের সাথে আপনি %1$s এ কী বৈশিষ্ট্যগুলি ব্যবহার করেন সে সম্পর্কে তথ্য শেয়ার করুন। পরীক্ষানিরীক্ষা @@ -358,15 +444,74 @@ অনুসন্ধান সেটিংস + + ইতিহাস আইটেম মেনু বন্ধ করুন + + %d ট্যাব + + %d ট্যাব + + + + ট্যাব + + তালিকা + + গ্রিড + + সব ট্যাব বন্ধ + + ম্যানুয়ালি + + একদিন পর + + এক সপ্তাহ পরে + + এক মাস পরে + + + ম্যানুয়ালি বন্ধ করুন + + একদিন পর বন্ধ + + এক সপ্তাহ পর বন্ধ + + এক মাস পর বন্ধ + + + + ট্যাব খুলুন ব্যক্তিগত সেশন ব্যক্তিগত ট্যাব ট্যাব যোগ করুন + + ব্যক্তিগত + + ট্যাব খুলুন + + সংগ্রহে সংরক্ষণ করুন + + নির্বাচন + + সম্প্রতি বন্ধ করা ট্যাব + + ট্যাবের সেটিংস + + সব ট্যাব বন্ধ করুন + + নতুন ট্যাব + + বুকমার্ক + + বন্ধ ট্যাব বন্ধ করুন @@ -375,8 +520,8 @@ ট্যাব মেনু খুলুন সব ট্যাব বন্ধ করুন - - সংগ্রহে সংরক্ষণ করুন + + ট্যাব শেয়ার করুন ট্যাব মেনু @@ -387,14 +532,30 @@ সংরক্ষণ শেয়ার + + বর্তমান সেশনের চিত্র সংগ্রহে সংরক্ষণ করুন সংগ্রহ মুছে ফেলুন সংগ্রহর নাম পরিবর্তন করুন - - অপসারণ + + ট্যাব খুলুন + + সংগ্রহের নাম + + পুনঃনামকরণ + + অপসারণ + + + ইতিহাস থেকে মুছে ফেলুন + + %1$s (ব্যক্তিগত মোড) + + + সংরক্ষণ @@ -407,6 +568,8 @@ %1$s মুছে ফেলা হয়েছে পরিষ্কার + + অনুলিপি শেয়ার @@ -421,6 +584,10 @@ %1$d আইটেমগুলি মুছুন + + আজ + + গতকাল শেষ 24 ঘন্টা @@ -433,6 +600,16 @@ এখানে কোন ইতিহাস নেই + + + + ডাউনলোডসমূহ মুছুন + + খুলুন + + অপসারণ + + দুঃখিত। %1$s পৃষ্ঠাটি লোড করতে পারেছে না। @@ -445,6 +622,9 @@ ট্যাব পুনরুদ্ধার করুন + + সেশন অপশন + শেয়ার সেশন @@ -455,6 +635,8 @@ বুকমার্ক সম্পাদনা করুন ফোল্ডার নির্বাচন করুন + + আপনি কি নিশ্চিত যে আপনি এই ফোল্ডারটি মুছতে চান? %1$s কে মুছে ফেলা হয়েছে @@ -510,6 +692,8 @@ %1$s মুছে ফেলা হয়েছে + + বুকমার্ক মুছে ফেলা হয়েছে UNDO @@ -556,6 +740,10 @@ বন্ধ অডিও এবং ভিডিওর অনুমোদন দিন + + অডিও ও ভিডিও শুধু সেলুলার ডাটাতে ব্লক করুন + + অডিও এবং ভিডিও Wi-Fi চালু হবে কেবল অডিওকে অবরুদ্ধ করুন @@ -566,16 +754,10 @@ বন্ধ - - আপনার গুরুত্বপূর্ণ বিষয়গুলি সংগ্রহ করুন। শুরু করতে, একটি নতুন সংগ্রহে খোলা ট্যাবগুলি সংরক্ষণ করুন। সংগ্রহগুলি সংগ্রহ মেনু - - কোনও সংগ্রহ নেই - - আপনার সংগ্রহগুলি এখানে প্রদর্শিত হবে। ট্যাব নির্বাচন করুন @@ -605,6 +787,9 @@ সংরক্ষণ + + প্রদর্শন + %d সংগ্রহ @@ -644,24 +829,46 @@ ডিভাইসে পাঠান কোন ডিভাইস সংযুক্ত নয় + + ট্যাব পাঠানো নিয়ে আরও জানুন… অন্য ডিভাইস সংযুক্ত করুন… ব্যক্তিগত ব্রাউজিং সেশন + + ব্যক্তিগত ট্যাবগুলি মুছুন + + ব্যক্তিগত ট্যাবগুলি বন্ধ করুন খুলুন মুছুন এবং খুলুন + + যার দ্বারা চালিত সংগ্রহ মুছে ফেলা হয়েছে + + সংগ্রহের নামকরণ ট্যাব মোছা হয়েছে + + ট্যাব মোছা হয়েছে ট্যাব বন্ধ করা হয়েছে + + ট্যাব বন্ধ করা হয়েছে + + ট্যাব বন্ধ করা হয়েছে! শীর্ষ সাইটগুলিতে যুক্ত হয়েছে! + + ব্যক্তিগত ট্যাব বন্ধ হয়েছে + + ব্যক্তিগত ট্যাব বন্ধ হয়েছে + + ব্যক্তিগত ট্যাব মোছা হয়েছে UNDO @@ -679,6 +886,8 @@ DENY আপনি কি নিশ্চিত আপনি %1$s মুছতে চান? + + %1$s মুছে ফেলবেন? মুছে ফেলুন @@ -696,6 +905,10 @@ ব্রাউজিং ডেটা মুছুন + + ট্যাব খুলুন + + %d ট্যাব ব্রাউজিংয়ের ইতিহাস এবং সাইটের তথ্য আপনি মূল মেনু থেকে \"Quit\" নির্বাচন করলে স্বয়ংক্রিয়ভাবে ব্রাউজিং ডেটা মুছে যাবে - - ব্রাউজিং ইতিহাস প্রস্থান @@ -753,9 +964,6 @@ পুনরায় নকশাকৃত %s গুলো সম্পর্কে প্রশ্ন আছে? কি পরিবর্তন হয়েছে জানতে চান? উত্তরগুলি এখানে পান - - %s থেকে সর্বোচ্চ সুবিধা নিন হ্যাঁ, আমাকে সাইন ইন করুন @@ -768,17 +976,8 @@ Sync চালু আছে সাইন-ইন করতে ব্যর্থ - - নিজেকে রক্ষা করুন - - %s আপনাকে অনলাইনে ট্র্যাকিং থেকে ওয়েবসাইটগুলি বন্ধ করতে সহায়তা করে। - - আদর্শ কঠোর (প্রস্তাবিত) - - উন্নত সুরক্ষা এবং কার্য সম্পাদনের জন্য আরো ট্র্যাকার ব্লক করুন, কিন্তু তা কিছু সাইট সঠিকভাবে কাজ না করার কারণ হতে পারে @@ -848,22 +1047,10 @@ আপনার ডেটা নিজের কাছে রাখুন। %s আপনাকে অনেক সাধারণ ট্র্যাকার থেকে রক্ষা করে যা আপনি অনলাইনে কি করেন তা অনুসরণ করে। আরো জানুন - - আদর্শ - - আদর্শ (প্রস্তাবিত) - - সুরক্ষা এবং কর্মক্ষমতার জন্য ভারসাম্যপূর্ণ। কঠোর - - কঠোর (ডিফল্ট) - - কঠোর (প্রস্তাবিত) স্বনির্ধারিত - - কোন ট্র্যাকার এবং স্ক্রিপ্টগুলো ব্লক করতে হবে তা বাছাই করুন। কুকিস @@ -871,10 +1058,17 @@ সমস্ত কুকিস (ওয়েবসাইট ভাঙার কারণ হতে পারে) ট্র্যাকিং কন্টেন্ট + + সমস্ত ট্যাবে + + শুধুমাত্র ব্যক্তিগত ট্যাবগুলিতে + + শুধুমাত্র কাস্টম ট্যাবগুলিতে ক্রিপ্টোমাইনারস ফিঙ্গারপ্রিন্টারস + ব্লক করা হয়েছে অনুমতি দেওয়া হয়েছে @@ -1003,6 +1197,9 @@ সব ওয়েবসাইটে জুম করুন + + সর্বশেষ ব্যবহৃত + সার্চ ইঞ্জিন যোগ করুন @@ -1044,6 +1241,8 @@ %s আপডেট হচ্ছে… %s শুরু করুন + + মাইগ্রেশন সম্পন্ন হয়েছে পাসওয়ার্ডগুলো @@ -1076,7 +1275,13 @@ আপনি কি নিশ্চিত যে আপনি এই লগইনটি মুছতে চান? মুছে ফেলুন + + পরিবর্তনসমূহ বাতিল করুন পাসওয়ার্ড প্রয়োজন + + %s থেকে সর্বোচ্চ সুবিধা নিন + From ca0b4b3a491f6c5e40602455e671fd7af6221fe5 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 29 Dec 2020 15:35:24 +0000 Subject: [PATCH 034/205] Update Android Components version to 71.0.20201229143146. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index eb1aa89c2..08ed7824e 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201227143154" + const val VERSION = "71.0.20201229143146" } From f8f677ce7f5200025cbf3efd6a7383e789f0a993 Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Wed, 30 Dec 2020 00:05:57 +0000 Subject: [PATCH 035/205] Import l10n. --- app/src/main/res/values-oc/strings.xml | 16 ++++++++-------- app/src/main/res/values-sr/strings.xml | 16 +++++++++++----- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 8d4c52133..f7a507e64 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -153,8 +153,6 @@ Recercar dins la pagina Onglet privat - - Onglet novèl Salvar a la colleccion @@ -725,18 +723,20 @@ Suprimir los telecargaments Volètz vertadièrament escafar los telecargaments ? - - Telecargament suprimits - - Pas cap de telecargament + + Telecargament suprimits + + %1$s suprimit %1$d seleccionats Dobrir - - Suprimir + + + + Suprimir diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 525d11c83..4b6c5d08f 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -723,10 +723,12 @@ Обриши преузимања Јесте ли сигурни да желите да обришете преузимања? - - Преузимања обрисана + + Преузимања уклоњена + + Уклоњено %1$s - Овде нема преузимања + Нема преузетих датотека Изабрано %1$d @@ -734,8 +736,10 @@ Отвори - - Избриши + + + + Уклони @@ -860,6 +864,8 @@ Обавештење Трајно складиште + + Садржај контолисан DRM-ом Упитај за дозволу From f24dda924f269f7572f644b94c4316af0355b513 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Wed, 30 Dec 2020 15:35:20 +0000 Subject: [PATCH 036/205] Update Android Components version to 71.0.20201230143210. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 08ed7824e..3e9461c86 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201229143146" + const val VERSION = "71.0.20201230143210" } From 5e95ad3e3b5c0a1a9fade18a615e846c23e10433 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Thu, 31 Dec 2020 15:34:49 +0000 Subject: [PATCH 037/205] Update Android Components version to 71.0.20201231143148. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 3e9461c86..e1176b7a2 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201230143210" + const val VERSION = "71.0.20201231143148" } From bad65b501782dd1945e03cf42bfadd3c28a2408b Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Fri, 1 Jan 2021 00:05:05 +0000 Subject: [PATCH 038/205] Import l10n. --- app/src/main/res/values-cs/strings.xml | 5 +++++ app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-te/strings.xml | 7 +++++++ app/src/main/res/values-tg/strings.xml | 24 +++++++++++++++++------- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 2020c1940..17f92a0d0 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -367,6 +367,9 @@ Nastavení sbírky změněno. Pro aplikování změn se nyní aplikace ukončí… + + + Doplněk není podporován Doplněk je již nainstalován @@ -1044,6 +1047,8 @@ ZAKÁZAT Opravdu chcete odstranit sbírku „%1$s“? + + Smazat %1$s? Odstranit diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index cba9739e3..b3834ea38 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -387,7 +387,7 @@ ログイン情報 - タブを開く + 開いているタブ ログアウト diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index cddc39be9..f0fd341b7 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -539,6 +539,13 @@ ఒక నెల తరువాత + + ఒక రోజు తర్వాత మూసివేయి + + ఒక వారం తర్వాత మూసివేయి + + ఒక నెల తర్వాత మూసివేయి + తెరిచివున్న ట్యాబులు diff --git a/app/src/main/res/values-tg/strings.xml b/app/src/main/res/values-tg/strings.xml index 5b060ee41..c7722a4d1 100644 --- a/app/src/main/res/values-tg/strings.xml +++ b/app/src/main/res/values-tg/strings.xml @@ -155,8 +155,6 @@ Ҷустуҷӯ дар саҳифа Варақаи махфӣ - - Варақаи нав Нигоҳ доштан дар маҷмӯа @@ -361,6 +359,12 @@ Маҷмӯаи ҷузъҳои иловагӣ тағйир ёфт. Барои татбиқ кардани тағйирот барнома бояд хомӯш карда шавад… + + + Ҷузъи иловагӣ дастгирӣ намешавад + + Ҷузъи иловагӣ аллакай насб карда шуд + Ҳозир ҳамоҳанг кунед @@ -715,10 +719,12 @@ Нест кардани богириҳо Шумо мутмаин ҳастед, ки мехоҳед боргириҳои худро нест намоед? - - Боргириҳо нест карда шуданд + + Боргириҳо тоза шуданд + + Файли %1$s тоза шуд - Ягон боргирӣ нест + Ягон файли боргиришуда нест %1$d интихоб шуд @@ -726,8 +732,10 @@ Кушодан - - Нест кардан + + + + Тоза кардан @@ -855,6 +863,8 @@ Огоҳинома Захирагоҳи доимӣ + + Муҳтавои идорашавандаи DRM Дархости иҷозат From 1666280ae1aaecadae612d9e8ee8b347d29593a5 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Fri, 1 Jan 2021 15:34:41 +0000 Subject: [PATCH 039/205] Update Android Components version to 71.0.20210101143133. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index e1176b7a2..5f37c9407 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20201231143148" + const val VERSION = "71.0.20210101143133" } From 9c776f1d7fe9d6091e1e8b03e6d509dc5a88214d Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Sat, 2 Jan 2021 00:04:47 +0000 Subject: [PATCH 040/205] Import l10n. --- app/src/main/res/values-cs/strings.xml | 6 + app/src/main/res/values-eu/strings.xml | 16 ++- app/src/main/res/values-gd/strings.xml | 176 ++++++++++++++++++++++--- app/src/main/res/values-sl/strings.xml | 12 +- 4 files changed, 181 insertions(+), 29 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 17f92a0d0..e996cc238 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -740,6 +740,8 @@ Smazat stažené soubory Opravdu chcete smazat všechny stažené soubory? + + Soubor %1$s odebrán Žádné stažené soubory + Smazat + + Promiňte, aplikace %1$s nemůže tuto stránku načíst. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 67930a212..38d615fca 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -734,10 +734,12 @@ Ezabatu deskargak Ziur zaude zure deskargak garbitu nahi dituzula? - - Deskargak ezabatuta + + Deskargak kenduta + + %1$s kenduta - Deskargarik ez hemen + Deskargatutako fitxategirik ez %1$d hautatuta @@ -745,8 +747,10 @@ Ireki - - Ezabatu + + + + Kendu @@ -871,6 +875,8 @@ Jakinarazpena Biltegiratze iraunkorra + + DRM bidez kontrolatutako edukia Galdetu baimentzeko diff --git a/app/src/main/res/values-gd/strings.xml b/app/src/main/res/values-gd/strings.xml index 9bdcc6068..6cf7846f2 100644 --- a/app/src/main/res/values-gd/strings.xml +++ b/app/src/main/res/values-gd/strings.xml @@ -18,6 +18,10 @@ Nochdaidh na tabaichean prìobhaideach agad an-seo. + + Baidu + + JD Tha taba fosgailte. Thoir gnogag airson leum a ghearradh gu taba eile. @@ -68,14 +72,6 @@ Cha chuir, mòran taing - - - Faigh greim air Firefox nas luaithe, cuir widget ris an sgrìn-dhachaigh agad. - - Cuir widget ris - - Chan ann an-dràsta - ’S urrainn dhut iarraidh air Firefox ceanglaichean fhosgladh ann an aplacaidean gu fèin-obrachail. @@ -98,6 +94,13 @@ Leig seachad + + Atharraich co-dhealbhachd de thabaichean fosgailte. Tadhail air na roghainnean is tagh “Griod” fo “Sealladh nan taba”. + + Tadhail air na roghainnean + + Leig seachad + Taba ùr @@ -142,12 +145,12 @@ Stàlaich Tabaichean sioncronaichte + + Ath-shiocronaich Lorg air an duilleag Taba prìobhaideach - - Taba ùr Sàbhail ann an cruinneachadh @@ -209,6 +212,8 @@ Barrachd fiosrachaidh + + Fosgail taba Firefox ùr Lorg @@ -264,6 +269,8 @@ Fosgail na ceanglaichean ann an taba prìobhaideach Ceadaich glacaidhean-sgrìn sa bhrabhsadh phrìobhaideach + + Ma cheadaicheas tu seo, chithear na tabaichean prìobhaideach cuideachd nuair a bhios iomadh aplacaid fosgailte Cuir ath-ghoirid brabhsaidh prìobhaideach ris @@ -284,6 +291,8 @@ An t-ùrlar Dhachaigh + + Gluasadan Gnàthaich @@ -318,8 +327,12 @@ Lorg san eachdraidh bhrabhsaidh Lorg sna comharran-lìn + + Lorg am measg nan tabaichean sioncronaichte Roghainnean a’ chunntais + + URLaichean fèin-choileanaidh Fosgail ceanglaichean ann an aplacaidean @@ -330,6 +343,27 @@ Brathan + + + Cruinneachadh de thuilleadain ghnàthaichte + + Ceart ma-thà + + Sguir dheth + + Ainm a’ chruinneachaidh + + Sealbhadair a’ chruinneachaidh (ID a’ chleachdaiche) + + + Chaidh cruinneachadh nan tuilleadan atharrachadh. Fàg an aplacaid gus na h-atharraichean a chur an gnìomh… + + + + Chan eil taic ris an tuilleadan seo + + Chaidh an tuilleadan seo a stàladh mu thràth + Sioncronaich an-dràsta @@ -408,6 +442,10 @@ Dàta margaideachd Co-roinnidh seo dàta mu na gleusan a chleachdas tu ann am %1$s le Leanplum, reiceadair na margaideachd mobile againn. + + Rannsachadh + + Leig le Mozilla rannsachadh a stàladh is a ruith an-còmhnaidh Deuchainnean @@ -455,6 +493,16 @@ A-rèir ùrlar an uidheim + + + Tarraing airson ath-nuadhachadh + + Dèan sgroladh airson am bàr-inneal a chur am falach + + Grad-shlaighd am bàr-inneal gun taobh airson leum a ghearradh gu taba eile + + Grad-shlaighd am bàr-inneal suas airson tabaichean fhosgladh + Seiseanan @@ -501,6 +549,14 @@ Chan eil taba sam bith an-seo a dhùin thu o chionn goirid + + Tabaichean + + Sealladh nan taba + + Liosta + + Griod Dùin na tabaichean @@ -512,6 +568,15 @@ An dèidh mìos + + Dùin de làimh + + Dùin an dèidh latha + + Dùin an dèidh seachdain + + Dùin an dèidh mìos + Tabaichean fosgailte @@ -529,6 +594,8 @@ Tabaichean fosgailte Sàbhail ann an cruinneachadh + + Tagh Co-roinn a h-uile taga @@ -543,8 +610,18 @@ Dhachaigh Toglaich modh nan taba + + Comharra-lìn + + Dùin + + Co-roinn na tabaichean a thagh thu + + Clàr-taice nan tabaichean a thagh thu Thoir an taba air falbh on chruinneachadh + + Tagh tabaichean Dùin an taba @@ -579,8 +656,12 @@ Thoir ainm ùr air a’ chruinneachadh Fosgail na tabaichean - - Thoir air falbh + + Ainm a’ chruinneachaidh + + Thoir ainm ùr air + + Thoir air falbh Sguab às an eachdraidh @@ -616,6 +697,10 @@ Sguab na nithean (%1$d) às + + An-diugh + + An-dè Sna 24 uair a thìde seo chaidh @@ -628,12 +713,27 @@ Chan eil eachdraidh an-seo + + Sguab às sìos uaithe seo + + A bheil thu cinnteach gu bheil thu airson na luchdaich thu a-nuas fhalamhachadh? + + Chaidh na luchdaich thu a-nuas a thoirt air falbh + + Chaidh %1$s a thoirt air falbh - Cha deach dad a luchdadh a-nuas an-seo + Cha deach dad a luchdadh a-nuas %1$d air an taghadh + + + Fosgail + + Thoir air falbh + + Tha sinn duilich ach chan urrainn dha %1$s an duilleag a luchdadh. @@ -753,6 +853,10 @@ Ionad Brath + + Stòras buan + + Susbaint fo smachd DRM Iarr cead @@ -893,6 +997,12 @@ Chaidh an taba a dhùnadh Chaidh na tabaichean a dhùnadh + + Chaidh na tabaichean a dhùnadh! + + Chaidh na comharran-lìn a shàbhaladh! + + Seall Chaidh a chur ri brod nan làrach! @@ -1044,7 +1154,7 @@ - Rinn thu clàradh a-steach mar %s air brabhsair Firefox eile air an fhòn seo. Am bu toil leat clàradh a-steach leis a’ cunntas ud? + Rinn thu clàradh a-steach mar %s air brabhsair Firefox eile air an uidheam seo. Am bu toil leat clàradh a-steach leis a’ cunntas ud? Bu toil, clàraich a-steach mi @@ -1135,6 +1245,8 @@ Clàraich a-steach leis a’ chamara agad Cleachd post-d na àite + + Cruthaich fear airson Firefox a shioncronachadh eadar uidheaman.]]> Sguiridh Firefox de shioncronachadh a’ chunntais agad ach cha sguab e às gin dhen dàta brabhsaidh agad air an uidheam seo. @@ -1244,6 +1356,11 @@ The first parameter is the app name --> %s | Leabhar-lannan OSS + + Ath-stiùirich tracaichean + + Falamhaich briosgaidean a chaidh a shuidheachadh an cois ath-stiùiridh gu làraichean-lìn a tha nan tracaichean aithnichte. + Taic @@ -1289,7 +1406,7 @@ Ainm na h-ath-ghoirid - Tha e furasta an duilleag seo a chur ri duilleag-dhachaigh an fhòn agad airson greim fhaighinn air gu luath. + Tha e furasta an duilleag seo a chur ri duilleag-dhachaigh an uidheim agad airson greim fhaighinn air gu luath. Clàraidhean a-steach is faclan-faire @@ -1360,8 +1477,12 @@ Chaidh lethbhreac dhen làrach a chur air an stòr-bhòrd Dèan lethbhreac dhen fhacal-fhaire + + Falamhaich am facal-faire Dèan lethbhreac dhen ainm-chleachdaiche + + Falamhaich an t-ainm-cleachdaiche Dèan lethbhreac dhen làrach @@ -1518,7 +1639,7 @@ Tha clàradh a-steach ann mu thràth aig a bheil an t-ainm-cleachdaiche seo - + Ceangail uidheam eile ris. Dèan dearbhadh às ùr. @@ -1537,21 +1658,38 @@ Ràinig thu crìoch brod nan làrach - Airson brod làraich ùr a chur ris, thoir fear air falbh an toiseach. Dèan brùthadh fada air an làrach is tagh “Thoir air falbh”. + Airson brod làraich ùr a chur ris, thoir fear air falbh an toiseach. Suath ris an làrach, cùm e is tagh “Thoir air falbh”. Ceart, tha mi agaibh Seall na làraichean air a do thadhail thu as trice + + Ainm + + Ainm brod nan làrach + + Ceart ma-thà + + Sguir dheth + Thoir air falbh - Cuir %s gu làn-fheum. + + Briog an-seo airson mion-fhiosrachadh + Cruinnich na rudan a tha cudromach dhut Buidhnich luirg, làraichean is tabaichean a tha coltach ri chèile airson greim fhaighinn orra a-rithist gu luath. - + + Rinn thu clàradh a-steach mar %s air brabhsair Firefox eile air an fhòn seo. Am bu toil leat clàradh a-steach leis a’ cunntas ud? + + Tha e furasta an duilleag seo a chur ri duilleag-dhachaigh an fhòn agad airson greim fhaighinn air gu luath. + + diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index b0be8590c..e80e08b19 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -733,18 +733,20 @@ Izbriši prenose Ste prepričani, da želite počistiti vaše prenose? - - Prenosi izbrisani + + Prenosi odstranjeni - Ni prenosov + Ni prenesenih datotek %1$d izbranih Odpri - - Izbriši + + + + Odstrani From 425ce84d4cb8d5c6e0b1ea16916da27f9f004113 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sat, 2 Jan 2021 15:35:18 +0000 Subject: [PATCH 041/205] Update Android Components version to 71.0.20210102143140. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 5f37c9407..0ed014af6 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20210101143133" + const val VERSION = "71.0.20210102143140" } From 9402ff78f3971c19f166cf054489aa6d35e0c37f Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Sun, 3 Jan 2021 15:35:47 +0000 Subject: [PATCH 042/205] Update Android Components version to 71.0.20210103143149. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0ed014af6..0e94fc17d 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20210102143140" + const val VERSION = "71.0.20210103143149" } From b34cc24f8803aab34db6fe66c8e2db88e81c020a Mon Sep 17 00:00:00 2001 From: Marcello Galhardo Date: Mon, 4 Jan 2021 14:55:08 +0100 Subject: [PATCH 043/205] For #9778 - Site permission settings item height set to 48dp (#17134) --- app/src/main/res/values/dimens.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0fee3ee07..f08be7409 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -59,7 +59,7 @@ 48dp - 28dp + 48dp 48dp 16dp 18dp From c0f0c401f3ba753e9184489b0e7159327fbc21a9 Mon Sep 17 00:00:00 2001 From: Codrut Topliceanu <60002907+codrut-topliceanu@users.noreply.github.com> Date: Mon, 4 Jan 2021 16:28:01 +0200 Subject: [PATCH 044/205] For #11580 - Tracks text selection context menu usage (#16968) * For #11580 - Tracks text selection context menu usage Tracks Copy, Search, Select All and Share items from the text selection context menu. Uses AC's DefaultSelectionActionDelegate to achieve this. Co-authored-by: Gabriel Luong --- app/metrics.yaml | 67 +++++++++++++++++++ .../mozilla/fenix/components/metrics/Event.kt | 6 ++ .../components/metrics/GleanMetricsService.kt | 16 +++++ .../components/metrics/MetricController.kt | 20 ++++++ docs/metrics.md | 5 ++ 5 files changed, 114 insertions(+) diff --git a/app/metrics.yaml b/app/metrics.yaml index aee2119aa..af0d8b109 100644 --- a/app/metrics.yaml +++ b/app/metrics.yaml @@ -4260,3 +4260,70 @@ tabs: notification_emails: - fenix-core@mozilla.com expires: "2021-08-01" + +contextual_menu: + long_press_tapped: + type: boolean + description: | + Text selection contextual menu option tapped. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/11580 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16968 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-06-01" + copy_tapped: + type: event + description: | + The context menu's 'copy' option was used. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/11580 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16968 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-06-01" + search_tapped: + type: event + description: | + The context menu's 'search' option was used. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/11580 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16968 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-06-01" + select_all_tapped: + type: event + description: | + The context menu's 'select all' option was used. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/11580 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16968 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-06-01" + share_tapped: + type: event + description: | + The context menu's 'share' option was used. + bugs: + - https://github.com/mozilla-mobile/fenix/issues/11580 + data_reviews: + - https://github.com/mozilla-mobile/fenix/pull/16968 + data_sensitivity: + - interaction + notification_emails: + - fenix-core@mozilla.com + expires: "2021-06-01" diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt index cc00144b0..1f094243f 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/Event.kt @@ -195,6 +195,12 @@ sealed class Event { object RecentlyClosedTabsOpened : Event() + object ContextMenuLongPressTapped : Event() + object ContextMenuCopyTapped : Event() + object ContextMenuSearchTapped : Event() + object ContextMenuSelectAllTapped : Event() + object ContextMenuShareTapped : Event() + // Interaction events with extras data class TopSiteSwipeCarousel(val page: Int) : Event() { diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt index 19c5bd0c0..09aaee391 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt @@ -22,6 +22,7 @@ import org.mozilla.fenix.GleanMetrics.BrowserSearch import org.mozilla.fenix.GleanMetrics.Collections import org.mozilla.fenix.GleanMetrics.ContextMenu import org.mozilla.fenix.GleanMetrics.ContextualHintTrackingProtection +import org.mozilla.fenix.GleanMetrics.ContextualMenu import org.mozilla.fenix.GleanMetrics.CrashReporter import org.mozilla.fenix.GleanMetrics.CustomTab import org.mozilla.fenix.GleanMetrics.DownloadNotification @@ -700,6 +701,21 @@ private val Event.wrapper: EventWrapper<*>? Event.TabSettingsOpened -> EventWrapper( { Tabs.settingOpened.record(it) } ) + Event.ContextMenuLongPressTapped -> EventWrapper( + { ContextualMenu.longPressTapped.set(true) } + ) + Event.ContextMenuCopyTapped -> EventWrapper( + { ContextualMenu.copyTapped.record(it) } + ) + Event.ContextMenuSearchTapped -> EventWrapper( + { ContextualMenu.searchTapped.record(it) } + ) + Event.ContextMenuSelectAllTapped -> EventWrapper( + { ContextualMenu.selectAllTapped.record(it) } + ) + Event.ContextMenuShareTapped -> EventWrapper( + { ContextualMenu.shareTapped.record(it) } + ) // Don't record other events in Glean: is Event.AddBookmark -> null diff --git a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt index 6f2234948..3b31385c2 100644 --- a/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt +++ b/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt @@ -153,6 +153,15 @@ internal class ReleaseMetricController( Component.FEATURE_CONTEXTMENU to ContextMenuFacts.Items.ITEM -> { metadata?.get("item")?.let { Event.ContextMenuItemTapped.create(it.toString()) } } + Component.FEATURE_CONTEXTMENU to ContextMenuFacts.Items.TEXT_SELECTION_OPTION -> { + when (metadata?.get("textSelectionOption")?.toString()) { + CONTEXT_MENU_COPY -> Event.ContextMenuCopyTapped + CONTEXT_MENU_SEARCH, CONTEXT_MENU_SEARCH_PRIVATELY -> Event.ContextMenuSearchTapped + CONTEXT_MENU_SELECT_ALL -> Event.ContextMenuSelectAllTapped + CONTEXT_MENU_SHARE -> Event.ContextMenuShareTapped + else -> null + } + } Component.BROWSER_TOOLBAR to ToolbarFacts.Items.MENU -> { metadata?.get("customTab")?.let { Event.CustomTabsMenuOpened } @@ -235,4 +244,15 @@ internal class ReleaseMetricController( } else -> null } + + companion object { + /** + * Text selection long press context items to be tracked. + */ + const val CONTEXT_MENU_COPY = "org.mozilla.geckoview.COPY" + const val CONTEXT_MENU_SEARCH = "CUSTOM_CONTEXT_MENU_SEARCH" + const val CONTEXT_MENU_SEARCH_PRIVATELY = "CUSTOM_CONTEXT_MENU_SEARCH_PRIVATELY" + const val CONTEXT_MENU_SELECT_ALL = "org.mozilla.geckoview.SELECT_ALL" + const val CONTEXT_MENU_SHARE = "CUSTOM_CONTEXT_MENU_SHARE" + } } diff --git a/docs/metrics.md b/docs/metrics.md index e54034a39..a93788dae 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -85,6 +85,10 @@ The following metrics are added to the ping: | contextual_hint.tracking_protection.display |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The enhanced tracking protection contextual hint was displayed. |[1](https://github.com/mozilla-mobile/fenix/pull/11923), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | | contextual_hint.tracking_protection.inside_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user tapped inside of the etp contextual hint (which brings up the etp panel for this site). |[1](https://github.com/mozilla-mobile/fenix/pull/11923), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | | contextual_hint.tracking_protection.outside_tap |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The user tapped outside of the etp contextual hint (which has no effect). |[1](https://github.com/mozilla-mobile/fenix/pull/11923), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | +| contextual_menu.copy_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'copy' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | +| contextual_menu.search_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'search' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | +| contextual_menu.select_all_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'select all' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | +| contextual_menu.share_tapped |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The context menu's 'share' option was used. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | | crash_reporter.closed |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The crash reporter was closed |[1](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)|
  • crash_submitted: A boolean that tells us whether or not the user submitted a crash report
|2021-04-01 |2 | | crash_reporter.opened |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |The crash reporter was displayed |[1](https://github.com/mozilla-mobile/fenix/pull/1214#issue-264756708), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | | custom_tab.action_button |[event](https://mozilla.github.io/glean/book/user/metrics/event.html) |A user pressed the action button provided by the launching app |[1](https://github.com/mozilla-mobile/fenix/pull/1697), [2](https://github.com/mozilla-mobile/fenix/pull/13958#issuecomment-676857877)||2021-04-01 |2 | @@ -270,6 +274,7 @@ The following metrics are added to the ping: | browser.search.ad_clicks |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records clicks of adverts on SERP pages. The key format is ‘’. |[1](https://github.com/mozilla-mobile/fenix/pull/10112), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | browser.search.in_content |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records the type of interaction a user has on SERP pages. |[1](https://github.com/mozilla-mobile/fenix/pull/10167), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | browser.search.with_ads |[labeled_counter](https://mozilla.github.io/glean/book/user/metrics/labeled_counters.html) |Records counts of SERP pages with adverts displayed. The key format is ‘’. |[1](https://github.com/mozilla-mobile/fenix/pull/10112), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | +| contextual_menu.long_press_tapped |[boolean](https://mozilla.github.io/glean/book/user/metrics/boolean.html) |Text selection contextual menu option tapped. |[1](https://github.com/mozilla-mobile/fenix/pull/16968)||2021-06-01 |2 | | events.total_uri_count |[counter](https://mozilla.github.io/glean/book/user/metrics/counter.html) |A counter of URIs visited by the user in the current session, including page reloads. This does not include background page requests and URIs from embedded pages or private browsing but may be incremented without user interaction by website scripts that programmatically redirect to a new location. |[1](https://github.com/mozilla-mobile/fenix/pull/1785), [2](https://github.com/mozilla-mobile/fenix/pull/8314), [3](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | metrics.adjust_ad_group |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust ad group ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/9253), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |2 | | metrics.adjust_campaign |[string](https://mozilla.github.io/glean/book/user/metrics/string.html) |A string containing the Adjust campaign ID from which the user installed Fenix. This will not send on the first session the user runs. If the install is organic, this will be empty. |[1](https://github.com/mozilla-mobile/fenix/pull/5579), [2](https://github.com/mozilla-mobile/fenix/pull/15713#issuecomment-703972068)||2021-08-01 |1 | From 2d1df018ff336035173e7978f6ab477355f2945b Mon Sep 17 00:00:00 2001 From: mcarare Date: Tue, 22 Dec 2020 13:06:04 +0200 Subject: [PATCH 045/205] For #15061: Fix error text color in SyncedTabsFragment. --- .../mozilla/fenix/sync/SyncedTabsFragment.kt | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsFragment.kt b/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsFragment.kt index cd67fe06b..8acfbab99 100644 --- a/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/sync/SyncedTabsFragment.kt @@ -8,7 +8,11 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.component_sync_tabs.view.* import kotlinx.android.synthetic.main.fragment_synced_tabs.* +import kotlinx.android.synthetic.main.sync_tabs_error_row.view.* import mozilla.components.browser.storage.sync.Tab import mozilla.components.feature.syncedtabs.SyncedTabsFeature import mozilla.components.support.base.feature.ViewBoundFeatureWrapper @@ -19,6 +23,7 @@ import org.mozilla.fenix.R import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.showToolbar import org.mozilla.fenix.library.LibraryPageFragment +import org.mozilla.fenix.theme.ThemeManager class SyncedTabsFragment : LibraryPageFragment() { private val syncedTabsFeature = ViewBoundFeatureWrapper() @@ -41,6 +46,12 @@ class SyncedTabsFragment : LibraryPageFragment() { val backgroundServices = requireContext().components.backgroundServices + /* + * Needed because the synced tabs error layout is also used in tabs tray where there is no private theme. + * See https://github.com/mozilla-mobile/fenix/issues/15061 + */ + setProperErrorColor(view.synced_tabs_list as RecyclerView) + syncedTabsFeature.set( feature = SyncedTabsFeature( context = requireContext(), @@ -55,6 +66,30 @@ class SyncedTabsFragment : LibraryPageFragment() { ) } + private fun setProperErrorColor(syncedTabsList: RecyclerView) { + syncedTabsList.addOnChildAttachStateChangeListener( + object : RecyclerView.OnChildAttachStateChangeListener { + override fun onChildViewAttachedToWindow(view: View) { + val errorView = view.sync_tabs_error_description + val primaryText = ContextCompat.getColor( + view.context, + ThemeManager.resolveAttribute(R.attr.primaryText, view.context) + ) + errorView?.let { + it.setTextColor(primaryText) + syncedTabsList.removeOnChildAttachStateChangeListener( + this + ) + } + } + + override fun onChildViewDetachedFromWindow(view: View) { + // do nothing + } + } + ) + } + override fun onResume() { super.onResume() showToolbar(getString(R.string.library_synced_tabs)) From 487ba32441f0221b65c2cedef81144661fe80fb1 Mon Sep 17 00:00:00 2001 From: Gabriel Luong Date: Mon, 4 Jan 2021 10:36:25 -0500 Subject: [PATCH 046/205] For #17292 - Remove unused static_strings (#17293) --- app/src/main/res/values/static_strings.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/res/values/static_strings.xml b/app/src/main/res/values/static_strings.xml index 92b49e26e..92a50e829 100644 --- a/app/src/main/res/values/static_strings.xml +++ b/app/src/main/res/values/static_strings.xml @@ -34,10 +34,6 @@ Secret Settings Secret Debug Info - - Show Top Frequently Visited Sites - - Wait Until First Paint To Show Page Content Show Synced Tabs in the tabs tray From 251d652833c1432c6c7b3f345f5a6cceaaad258e Mon Sep 17 00:00:00 2001 From: mcarare Date: Fri, 18 Dec 2020 17:28:13 +0200 Subject: [PATCH 047/205] For #16027: Allow elements to be selected separately by a11y services. --- app/src/main/res/layout/history_list_item.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/history_list_item.xml b/app/src/main/res/layout/history_list_item.xml index 98d8cace0..66a65e7dc 100644 --- a/app/src/main/res/layout/history_list_item.xml +++ b/app/src/main/res/layout/history_list_item.xml @@ -6,6 +6,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" + android:importantForAccessibility="no" android:orientation="vertical"> Date: Mon, 4 Jan 2021 11:00:34 -0500 Subject: [PATCH 048/205] 16373 Count the # of inflations done on startup (#16778) * For #16373: Added performance Inflater to counter # of inflations This class is quite straight forward. The only thing that I have to point out is the onCreateView method. It usually calls its super if you don't override it. The problem with that is that the super.onCreateView actually uses android.view. as a prefix for the XML element it tries to inflate. So if we have an element that isn't part of that package, it'll crash. As I said in the code, a good example is ImageButton. Calling android.view.ImageButton will make the app crash. The method is implemented the same way that PhoneLayoutInflater does (Another example is the AsyncLayoutInflater) * For #16373: Added test for PerformanceInflater This test got quite awkward / complicated fast. I wanted to test the to make sure we don't break *any* of our layouts and to do so, I decided to just retrieve all our XML in our /res/layout folder. However, this gets quite a bit outside of a unit test scope. The point was to get every layouts and get their LayoutID through the resources using the testContext we have. It gets even weirder, since some of the XML tags have special implementation in android. One of them is the tag. That tag actually is inflated by the OS using the Factory2 that the Activity.java implements. In order to get around the fragment issue, we just return a basic FrameLayout since the system LayoutInflater doesn't deal won't ever get a tag to inflate. Another issue was the tag. In order to inflate those, you need 1) a root view and 2) attach your view to it. In order to be able to test those layouts file, I had to create an empty FrameLayout and use it as the root view for testing. Again, I know this is beyond the spirit of a unit test but if we use this inflater, I think it should make sure that no layouts are broken by it. * For #16373: Overrode getSystemService to return PerformanceInflater This allows PerformanceInflater to be called in every inflation to keep track of the number of inflations we do. * For #16373: Added UI test for # of inflations * For #16373: Lint fix * For #167373: Changed the LayoutInflater cloneInContext to take this instead of inflater The inflater parameter is set on the first call from the OS from the Window object. However, the activity itself sets multiple factories on the inflater during its creation (usually through AppCompatDelegateImpl.java). This means that, once we initially set the inflater with a null check, we pass an inflater that has no factory initially. However, since we keep a reference to it, when cloneInContext was called, it cloned the inflater with the original inflater which didn't have any factories set up. This meant that the app would crash on either browserFragment creation or any thing that required appCompat (such as ImageView and ImageButton). Now, passing itself with a cloneInContext means we keep all the factories initially set by the activity or the fragment. * For #16373: Fixed code issues for PR. No behavior change * For #16373: fixed some code nits --- .../perf/StartupExcessiveResourceUseTest.kt | 9 ++ .../java/org/mozilla/fenix/HomeActivity.kt | 14 ++++ .../mozilla/fenix/perf/PerformanceInflater.kt | 76 +++++++++++++++++ .../fenix/perf/PerformanceInflaterTest.kt | 84 +++++++++++++++++++ 4 files changed, 183 insertions(+) create mode 100644 app/src/main/java/org/mozilla/fenix/perf/PerformanceInflater.kt create mode 100644 app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt diff --git a/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt b/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt index 7df918cb1..3575a7101 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/perf/StartupExcessiveResourceUseTest.kt @@ -25,6 +25,7 @@ private const val EXPECTED_RUNBLOCKING_COUNT = 2 private const val EXPECTED_COMPONENT_INIT_COUNT = 42 private const val EXPECTED_VIEW_HIERARCHY_DEPTH = 12 private const val EXPECTED_RECYCLER_VIEW_CONSTRAINT_LAYOUT_CHILDREN = 4 +private const val EXPECTED_NUMBER_OF_INFLATION = 12 private val failureMsgStrictMode = getErrorMessage( shortName = "StrictMode suppression", @@ -54,6 +55,11 @@ private val failureMsgRecyclerViewConstraintLayoutChildren = getErrorMessage( ) + "Please note that we're not sure if this is a useful metric to assert: with your feedback, " + "we'll find out over time if it is or is not." +private val failureMsgNumberOfInflation = getErrorMessage( + shortName = "Number of inflation on start up doesn't match expected count", + implications = "The number of inflation can negatively impact start up time. Having more inflations" + + "will most likely mean we're adding extra work on the UI thread." +) /** * A performance test to limit the number of StrictMode suppressions and number of runBlocking used * on startup. @@ -90,6 +96,8 @@ class StartupExcessiveResourceUseTest { val actualViewHierarchyDepth = countAndLogViewHierarchyDepth(rootView, 1) val actualRecyclerViewConstraintLayoutChildren = countRecyclerViewConstraintLayoutChildren(rootView, null) + val actualNumberOfInflations = InflationCounter.inflationCount.get() + assertEquals(failureMsgStrictMode, EXPECTED_SUPPRESSION_COUNT, actualSuppresionCount) assertEquals(failureMsgRunBlocking, EXPECTED_RUNBLOCKING_COUNT, actualRunBlocking) assertEquals(failureMsgComponentInit, EXPECTED_COMPONENT_INIT_COUNT, actualComponentInitCount) @@ -99,6 +107,7 @@ class StartupExcessiveResourceUseTest { EXPECTED_RECYCLER_VIEW_CONSTRAINT_LAYOUT_CHILDREN, actualRecyclerViewConstraintLayoutChildren ) + assertEquals(failureMsgNumberOfInflation, EXPECTED_NUMBER_OF_INFLATION, actualNumberOfInflations) } } diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 5ca572000..64cfb7740 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -14,6 +14,7 @@ import android.os.SystemClock import android.text.format.DateUtils import android.util.AttributeSet import android.view.KeyEvent +import android.view.LayoutInflater import android.view.View import android.view.ViewConfiguration import android.view.WindowManager @@ -89,6 +90,7 @@ import org.mozilla.fenix.library.bookmarks.DesktopFolders import org.mozilla.fenix.library.history.HistoryFragmentDirections import org.mozilla.fenix.library.recentlyclosed.RecentlyClosedFragmentDirections import org.mozilla.fenix.perf.Performance +import org.mozilla.fenix.perf.PerformanceInflater import org.mozilla.fenix.perf.StartupTimeline import org.mozilla.fenix.search.SearchDialogFragmentDirections import org.mozilla.fenix.session.PrivateNotificationService @@ -138,6 +140,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { WebExtensionPopupFeature(components.core.store, ::openPopup) } + private var inflater: LayoutInflater? = null + private val navHost by lazy { supportFragmentManager.findFragmentById(R.id.container) as NavHostFragment } @@ -824,6 +828,16 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } } + override fun getSystemService(name: String): Any? { + if (LAYOUT_INFLATER_SERVICE == name) { + if (inflater == null) { + inflater = PerformanceInflater(LayoutInflater.from(baseContext), this) + } + return inflater + } + return super.getSystemService(name) + } + protected open fun createBrowsingModeManager(initialMode: BrowsingMode): BrowsingModeManager { return DefaultBrowsingModeManager(initialMode, components.settings) { newMode -> themeManager.currentTheme = newMode diff --git a/app/src/main/java/org/mozilla/fenix/perf/PerformanceInflater.kt b/app/src/main/java/org/mozilla/fenix/perf/PerformanceInflater.kt new file mode 100644 index 000000000..e34d7a8d0 --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/perf/PerformanceInflater.kt @@ -0,0 +1,76 @@ +/* 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.perf + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.annotation.VisibleForTesting +import org.mozilla.fenix.ext.getAndIncrementNoOverflow +import java.lang.reflect.Modifier.PRIVATE +import java.util.concurrent.atomic.AtomicInteger + +private val classPrefixList = arrayOf( + "android.widget.", + "android.webkit.", + "android.app." +) +/** + * Counts the number of inflations fenix does. This class behaves only as an inflation counter since + * it takes the `inflater` that is given by the base system. This is done in order not to change + * the behavior of the app since all we want to do is count the inflations done. + * + */ +open class PerformanceInflater( + inflater: LayoutInflater, + context: Context +) : LayoutInflater( + inflater, + context +) { + + override fun cloneInContext(newContext: Context?): LayoutInflater { + return PerformanceInflater(this, newContext!!) + } + + override fun inflate(resource: Int, root: ViewGroup?, attachToRoot: Boolean): View { + InflationCounter.inflationCount.getAndIncrementNoOverflow() + return super.inflate(resource, root, attachToRoot) + } + + /** + * This code was taken from the PhoneLayoutInflater.java located in the android source code + * (Similarly, AsyncLayoutInflater implements it the exact same way too which can be found in the + * Android Framework). This piece of code was taken from the other inflaters implemented by Android + * since we do not want to change the inflater behavior except to count the number of inflations + * that our app is doing for performance purposes. Looking at the `super.OnCreateView(name, attrs)`, + * it hardcodes the prefix as "android.view." this means that a xml element such as + * ImageButton will crash the app using android.view.ImageButton. This method only works with + * XML tag that contains no prefix. This means that views such as androidx.recyclerview... will not + * work with this method. + */ + @Suppress("EmptyCatchBlock") + @Throws(ClassNotFoundException::class) + override fun onCreateView(name: String?, attrs: AttributeSet?): View? { + for (prefix in classPrefixList) { + try { + val view = createView(name, prefix, attrs) + if (view != null) { + return view + } + } catch (e: ClassNotFoundException) { + // We want the super class to inflate if ever the view can't be inflated here + } + } + return super.onCreateView(name, attrs) + } +} + +@VisibleForTesting(otherwise = PRIVATE) +object InflationCounter { + val inflationCount = AtomicInteger(0) +} diff --git a/app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt b/app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt new file mode 100644 index 000000000..59698c783 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/perf/PerformanceInflaterTest.kt @@ -0,0 +1,84 @@ +/* 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.perf + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.FrameLayout +import mozilla.components.support.test.robolectric.testContext +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotEquals +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mozilla.fenix.R +import org.mozilla.fenix.helpers.FenixRobolectricTestRunner +import java.io.File + +@RunWith(FenixRobolectricTestRunner::class) +class PerformanceInflaterTest { + + private lateinit var perfInflater: MockInflater + + private val layoutsNotToTest = setOf( + "fragment_browser", + "fragment_add_on_internal_settings" + ) + + @Before + fun setup() { + InflationCounter.inflationCount.set(0) + + perfInflater = MockInflater(LayoutInflater.from(testContext), testContext) + } + + @Test + fun `WHEN we inflate a view,THEN the inflation counter should increase`() { + assertEquals(0, InflationCounter.inflationCount.get()) + perfInflater.inflate(R.layout.fragment_home, null, false) + assertEquals(1, InflationCounter.inflationCount.get()) + } + + @Test + fun `WHEN inflating one of our resource file, the inflater should not crash`() { + val fileList = File("./src/main/res/layout").listFiles() + for (file in fileList!!) { + val layoutName = file.name.split(".")[0] + val layoutId = testContext.resources.getIdentifier( + layoutName, + "layout", + testContext.packageName + ) + + assertNotEquals(-1, layoutId) + if (!layoutsNotToTest.contains(layoutName)) { + perfInflater.inflate(layoutId, FrameLayout(testContext), true) + } + } + } +} + +private class MockInflater( + inflater: LayoutInflater, + context: Context +) : PerformanceInflater( + inflater, + context +) { + + override fun onCreateView(name: String?, attrs: AttributeSet?): View? { + // We skip the fragment layout for the simple reason that it implements + // a whole different inflate which is implemented in the activity.LayoutFactory + // methods. To be able to properly test it here, we would have to copy the whole + // inflater file (or create an activity) and pass our layout through the onCreateView + // method of that activity. + if (name!!.contains("fragment")) { + return FrameLayout(testContext) + } + return super.onCreateView(name, attrs) + } +} From e3a77cb75054d9be250a58bea0d16899b6fa18fd Mon Sep 17 00:00:00 2001 From: Marcello Galhardo Date: Mon, 4 Jan 2021 17:55:47 +0100 Subject: [PATCH 049/205] Closes #14009: Fix onboarding 'Sign in to Firefox' ripple effect (#17169) * Closes #14009: Fix onboarding 'Sign in to Firefox' ripple effect * For #14009: Add 'onboarding_padded_background_color' instead of rely on OS theme/color Both previous solution, '?android:attr/colorControlHighlight' and '@color/ripple_material_light' were using a OS theme attr or color, which caused problems. To fix it, we introduced a 'onboarding_padded_background_color' which manually define the ripple effect color of the onboarding manual sign in button. --- app/src/main/res/drawable/onboarding_padded_background.xml | 2 +- app/src/main/res/values/colors.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/drawable/onboarding_padded_background.xml b/app/src/main/res/drawable/onboarding_padded_background.xml index f0b944c9f..4e5b99bb6 100644 --- a/app/src/main/res/drawable/onboarding_padded_background.xml +++ b/app/src/main/res/drawable/onboarding_padded_background.xml @@ -2,7 +2,7 @@ - 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/. --> + android:color="@color/onboarding_padded_background_color"> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 845bb44c4..691259a1e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -372,6 +372,7 @@ @color/accent_high_contrast_dark_theme + #1F000000 #20123A #FFFFFF #F9F9FB From 3d014c8214712a90e761e1ba3726cff3b106d06d Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Mon, 4 Jan 2021 15:35:25 +0000 Subject: [PATCH 050/205] Update Android Components version to 71.0.20210104143130. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 0e94fc17d..40160e641 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20210103143149" + const val VERSION = "71.0.20210104143130" } From fb33d0bfd35411c30b7f008d1d61f0d3e3bbf33a Mon Sep 17 00:00:00 2001 From: Aaron Train Date: Mon, 4 Jan 2021 13:16:04 -0500 Subject: [PATCH 051/205] No issue: Update Flank to v21.01.0 (#17300) --- taskcluster/docker/ui-tests/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/taskcluster/docker/ui-tests/Dockerfile b/taskcluster/docker/ui-tests/Dockerfile index 4a14d2ebf..023124c3a 100644 --- a/taskcluster/docker/ui-tests/Dockerfile +++ b/taskcluster/docker/ui-tests/Dockerfile @@ -11,7 +11,7 @@ USER worker:worker ENV GOOGLE_SDK_DOWNLOAD ./gcloud.tar.gz ENV GOOGLE_SDK_VERSION 233 -ENV FLANK_VERSION v20.09.3 +ENV FLANK_VERSION v21.01.0 ENV TEST_TOOLS /builds/worker/test-tools ENV PATH ${PATH}:${TEST_TOOLS}:${TEST_TOOLS}/google-cloud-sdk/bin From 7527851cf0ded4baf8fcf3bf9ac20a32043ee035 Mon Sep 17 00:00:00 2001 From: Roger Yang Date: Mon, 4 Jan 2021 15:12:43 -0500 Subject: [PATCH 052/205] Closes #17298: Turn on new MediaSession feature for all builds (#17302) --- app/src/main/java/org/mozilla/fenix/FeatureFlags.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt index 32d1d85d8..bd73a69db 100644 --- a/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt +++ b/app/src/main/java/org/mozilla/fenix/FeatureFlags.kt @@ -42,7 +42,8 @@ object FeatureFlags { /** * Enables the new MediaSession API. */ - val newMediaSessionApi = Config.channel.isNightlyOrDebug + @Suppress("MayBeConst") + val newMediaSessionApi = true /** * Enabled showing site permission indicators in the toolbars. From f95547c27103f778bf578dade8c9a7e8b81d43bb Mon Sep 17 00:00:00 2001 From: Mozilla L10n Automation Bot Date: Tue, 5 Jan 2021 00:05:50 +0000 Subject: [PATCH 053/205] Import l10n. --- app/src/main/res/values-ast/strings.xml | 22 ++- app/src/main/res/values-es-rAR/strings.xml | 2 +- app/src/main/res/values-es-rMX/strings.xml | 148 +++++++++++++++- app/src/main/res/values-fr/strings.xml | 16 +- app/src/main/res/values-gl/strings.xml | 192 +++++++++++++++++++-- app/src/main/res/values-hr/strings.xml | 4 +- app/src/main/res/values-pl/strings.xml | 24 ++- app/src/main/res/values-sat/strings.xml | 20 ++- app/src/main/res/values-sl/strings.xml | 2 + app/src/main/res/values-sq/strings.xml | 24 ++- app/src/main/res/values-su/strings.xml | 22 ++- app/src/main/res/values-te/strings.xml | 17 ++ 12 files changed, 436 insertions(+), 57 deletions(-) diff --git a/app/src/main/res/values-ast/strings.xml b/app/src/main/res/values-ast/strings.xml index 70b11eca9..3c1165cf9 100644 --- a/app/src/main/res/values-ast/strings.xml +++ b/app/src/main/res/values-ast/strings.xml @@ -251,7 +251,7 @@ The first parameter is the name of the app defined in app_name (for example: Fenix) --> Tocante a %1$s - Los tos drechos + Los tos derechos Contraseñes @@ -418,6 +418,9 @@ Deprender más + + Desactivóse globalmente, vete a Axustes p\'activala + Telemetría @@ -685,6 +688,9 @@ Desaniciáronse les descargues Desanicióse %1$s + + Descargues esbillaes: %1$d Desaniciar @@ -1096,10 +1102,18 @@ Comienza a sincronizar los marcadores, les contraseñes y muncho más cola to cuenta de Firefox. Deprender más + + Aniciesti sesión como %s n\'otru Firefox d\'esti preséu. ¿Quedríes aniciar sesión con esta cuenta? + + Sí, aniciar sesión Aniciando sesión… Aniciar sesión en Firefox + + Siguir ensin aniciar sesión La sincronización ta activada @@ -1287,7 +1301,7 @@ back from ETP details (Ex: Tracking content) --> Dir p\'atrás - Los tos drechos + Los tos derechos Les biblioteques de códigu abiertu qu\'usamos @@ -1310,7 +1324,7 @@ Avisu de privacidá - Conoz los tos drechos + Conoz los tos derechos Información del llicenciamientu @@ -1616,6 +1630,8 @@ Coleiciona les coses que t\'importen Agrupa busques, sitios y llingüetes asemeyaos p\'acceder aína a ellos dempués. + + Aniciesti sesión como %s n\'otru Firefox d\'esti teléfonu. ¿Quedríes aniciar sesión con esta cuenta? Pues amestar fácilmente esti sitiu web a la pantalla d\'aniciu del preséu p\'acceder nel intre y restolalu como si fore una aplicación. diff --git a/app/src/main/res/values-es-rAR/strings.xml b/app/src/main/res/values-es-rAR/strings.xml index 7b81e3f56..d3cb16b91 100644 --- a/app/src/main/res/values-es-rAR/strings.xml +++ b/app/src/main/res/values-es-rAR/strings.xml @@ -1710,7 +1710,7 @@ Aprovechá %s al máximo. - Hacerclic aquí para más detalles + Hacer clic aquí para más detalles Recolectá lo que te importa diff --git a/app/src/main/res/values-es-rMX/strings.xml b/app/src/main/res/values-es-rMX/strings.xml index b70184656..8e7d02b7e 100644 --- a/app/src/main/res/values-es-rMX/strings.xml +++ b/app/src/main/res/values-es-rMX/strings.xml @@ -19,6 +19,10 @@ Tus pestañas privadas aparecerán aquí. + + Baidu + + JD 1 pestaña abierta. Tocar para cambiar de pestaña. @@ -90,6 +94,13 @@ Descartar + + Cambia el diseño de las pestañas abiertas. Ve a Ajustes y selecciona cuadrícula bajo vista de pestañas. + + Ir a ajustes + + Ignorar + Nueva pestaña @@ -141,8 +152,6 @@ Encontrar en página Pestaña privada - - Nueva pestaña Guardar en colección @@ -326,6 +335,8 @@ Buscar pestañas sincronizadas Configuración de la cuenta + + Autocompletar URLs Abrir enlaces en aplicaciones @@ -336,6 +347,26 @@ Notificaciones + + + Colección de complementos personalizada + + Aceptar + + Cancelar + + Nombre de la colección + + Dueño de la colección (ID de usuario) + + Colección de complementos modificada. Cerrando la aplicación para aplicar los cambios… + + + + Complemento no compatible + + El complemento ya está instalado + Sincronizar ahora @@ -414,6 +445,10 @@ Datos de marketing Comparte datos acerca de las funcionalidades que usas en %1$s con Leanplum, nuestro proveedor de marketing para móviles. + + Estudios + + Permite a Mozilla instalar y ejecutar estudios Experimentos @@ -462,6 +497,16 @@ Seguir el tema del dispositivo + + + Arrastrar para actualizar + + Desplazar para ocultar la barra + + Deslizar la barra hacia los lados para cambiar de pestaña + + Deslizar la barra hacia arriba para abrir pestañas + Sesiones @@ -507,6 +552,15 @@ No hay pestañas recientemente cerradas + + + Pestañas + + Vista de pestaña + + Lista + + Cuadrícula Cerrar pestañas @@ -518,6 +572,15 @@ Después de un mes + + Cerrar manualmente + + Cerrar después de un día + + Cerrar después de una semana + + Cerrar después de un mes + Pestañas abiertas @@ -535,6 +598,8 @@ Pestañas abiertas Guardar en colección + + Seleccionar Compartir todas las pestañas @@ -549,8 +614,18 @@ Ir a Inicio Alternar modo de pestaña + + Marcador + + Cerrar + + Compartir pestañas seleccionadas + + Menú de pestañas seleccionadas Eliminar la pestaña de la colección + + Seleccionar pestañas Cerrar pestaña @@ -583,7 +658,11 @@ Cambiar nombre a colección Abrir pestañas - + + Nombre de la colección + + Renombrar + Eliminar @@ -621,6 +700,10 @@ Eliminar %1$d elementos + + Hoy + + Ayer Últimas 24 horas @@ -632,13 +715,28 @@ No hay ningún historial + + + Eliminar descargas + + ¿Seguro que quieres eliminar tus descargas? + + Descargas removidas + + %1$s removido - No hay descargas aquí + No hay archivos descargados %1$d seleccionadas + + Abrir + + Remover + + Lo sentimos. %1$s no puede cargar esa página. @@ -758,6 +856,10 @@ Ubicación Notificación + + Almacenamiento persistente + + Contenido controlado por DRM Pedir permiso @@ -898,6 +1000,12 @@ Pestaña cerrada Pestañas cerradas + + ¡Pestañas cerradas! + + ¡Marcadores guardados! + + Ver ¡Añadido a sitios favoritos! @@ -1046,6 +1154,10 @@ Empieza a sincronizar marcadores, contraseñas y más con tu cuenta de Firefox. Saber más + + Te has conectado como %s en otro navegador Firefox en este dispositivo. ¿Quieres conectarte con esta cuenta? Sí, iniciar sesión @@ -1136,6 +1248,8 @@ Inicia sesión con tu cámara Usar correo electrónico en su lugar + + Crea una para sincronizar Firefox entre dispositivos.]]> Firefox dejará de sincronizar tu cuenta, pero no se eliminarán los datos de navegación en este dispositivo. @@ -1247,6 +1361,11 @@ The first parameter is the app name --> %s | Bibliotecas OSS + + Rastreadores de redirección + + Limpia las cookies creadas por redirecciones a sitios web de seguimiento conocidos. + Ayuda @@ -1290,6 +1409,9 @@ Nombre del acceso directo + + Puedes añadir fácilmente este sitio web a la pantalla de inicio de tu dispositivo para tener acceso instantáneo y navegar rápidamente, consiguiendo una experiencia similar a la de una aplicación real. + Inicios de sesión y contraseñas @@ -1359,8 +1481,12 @@ Sitio copiado al portapapeles Copiar contraseña + + Borrar contraseña Copiar nombre de usuario + + Borrar nombre de usuario Copiar sitio @@ -1533,12 +1659,23 @@ Límite de sitios frecuentes alcanzado + + Para agregar un nuevo sitio favorito, elimina uno. Toca y mantén presionado el sitio y selecciona eliminar. Vale, entendido Mostrar los sitios más visitados + + Nombre + + Nombre del sitio principal + + Aceptar + + Cancelar + Eliminar @@ -1546,6 +1683,9 @@ The first parameter is the name of the app (e.g. Firefox Preview) --> Saca el máximo provecho de %s. + + Clic para más detalles + Colecciona las cosas que te importan diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 768611904..9e1e6e641 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -734,18 +734,22 @@ Effacer la liste des téléchargements Voulez-vous vraiment effacer la liste de vos téléchargements ? - - Liste des téléchargements vidée + + Téléchargements supprimés + + %1$s a été supprimé - Aucun téléchargement ici + Aucun fichier téléchargé %1$d sélectionné(s) Ouvrir - - Supprimer + + + + Supprimer @@ -872,6 +876,8 @@ Notifications Stockage persistant + + Contenu protégé par des DRM Demander pour autoriser diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index b251a1d1c..1373fdf04 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -1,5 +1,9 @@ + + %s Privado + + %s (Privado) Máis opcións @@ -13,11 +17,17 @@ As súas lapelas abertas aparecen aquí. As súas lapelas privadas aparecen aquí. + + Baidu + + JD 1 lapela aberta. Toque para cambiar de lapela. %1$s lapelas abertas. Toque para cambiar de lapela. + + Seleccionouse %1$d Engadir nova colección @@ -64,14 +74,6 @@ Non, grazas - - - Accede ao Firefox máis rápido. Engada un widget á pantalla de inicio. - - Engadir widget - - Agora non - Pode configurar Firefox para que abra automaticamente as ligazóns en aplicacións. @@ -94,6 +96,13 @@ Rexeitar + + Cambiar a disposición das lapelas abertas. Vaia á configuración e seleccione a grade na vista de lapelas. + + Ir á configuración + + Rexeitar + Nova lapela @@ -143,8 +152,6 @@ Atopar na páxina Lapela privada - - Nova lapela Gardar na colección @@ -342,6 +349,12 @@ Modificouse a colección de complementos. Vaise saír da aplicación para aplicar os cambios… + + + O complemento non é compatíbel + + O complemento xa está instalado + Sincronizar agora @@ -420,6 +433,10 @@ Datos de mercadotecnia Comparte datos sobre as funcións que usa en %1$s con Leanplum, o noso fornecedor de mercadotecnia móbil. + + Estudos + + Permite que Mozilla instale e execute estudos Experimentos @@ -443,6 +460,9 @@ Retirar conta + + + firefox.com/pair]]> Abrir cámara @@ -464,9 +484,17 @@ Segundo o tema do dispositivo + + + Tire para actualizar Desprazar para agochar a barra de ferramentas + + Desprazar a barra de ferramentas de lado para cambiar de lapela + + Desprazar a barra de ferramentas para abrir lapelas + Sesións @@ -532,6 +560,15 @@ Despois dun mes + + Pechar manualmente + + Pechar despois de un día + + Despois de unha semana + + Pechar despois de un mes + Lapelas abertas @@ -549,6 +586,8 @@ Lapelas abertas Gardar na colección + + Seleccionar Compartir todas as lapelas @@ -559,8 +598,22 @@ Pechar todas as lapelas Nova lapela + + Ir ao inicio + + Trocar o modo de lapela + + Marcador + + Pechar + + Compartir as lapelas seleccionadas + + Menú de lapelas seleccionadas Eliminar lapela da colección + + Seleccionar lapelas Pechar lapela @@ -595,8 +648,10 @@ Abrir lapelas Nome da colección - - Retirar + + Renomear + + Retirar Eliminar do historial @@ -648,12 +703,26 @@ Non hai historial aquí + + Eliminar descargas + + Confirma que quere limpar as descargas? + + Descargas retiradas + + Retirouse %1$s - Non hai descargas aquí + Non hai ficheiros descargados Seleccionouse %1$d + + Abrir + + Retirar + + Sentímolo. %1$s non pode cargar esa páxina. @@ -775,6 +844,8 @@ Notificación Almacenamento persistente + + Contido controlado por DRM Preguntar antes de permitir @@ -912,6 +983,12 @@ Lapela pechada Lapelas pechadas + + Lapelas pechadas! + + Marcadores gardados! + + Ver Engadido aos sitios principais! @@ -960,10 +1037,17 @@ Tamaño automático da letra + + O tamaño da letra coincidirá coa configuración de Android. Desactive aquí para xestionar o tamaño do tipo de letra. + + + Eliminar datos de navegación Lapelas abertas %d lapelas + + Historial de navegación e datos dos sitios %d enderezos @@ -974,6 +1058,12 @@ %d páxinas Cookies + + Pechará a sesión na maioría dos sitios + + Imaxes e ficheiros na caché + + Libera espazo de almacenamento Permisos do sitio @@ -982,6 +1072,8 @@ Elimina os datos de navegación ao saír Elimina automaticamente os datos de navegación ao seleccionar «Saír» no menú principal + + Elimina automaticamente os datos de navegación ao seleccionar «Saír» no menú principal Saír @@ -998,6 +1090,34 @@ A eliminar datos de navegación… + + + Firefox Preview agora é Firefox Nightly + + + Firefox Nightly actualízase cada noite e ten novas funcións experimentais. + Porén, pode ser menos estábel. Descargue o noso navegador beta para unha experiencia máis estábel. + + Obter o Firefox para Android Beta + + + Firefox Nightly mudouse + + + Esta aplicación xa non recibirá actualizacións de seguranza. Deixe de usar esta aplicación e cambie á nova Nightly. + \n\nPara transferir os seus marcadores, inicios de sesión e historial a outra aplicación, cree unha conta de Firefox. + + Cambie á nova Nightly + + + Firefox Nightly mudouse + + + Esta aplicación xa non recibirá actualizacións de seguranza. Cambie á nova Nightly e deixe de usar esta aplicación. + \n\nPara transferir os seus marcadores, inicios de sesión e historial a outra aplicación, cree unha conta de Firefox. + + Obteña a nova Nightly + @@ -1009,12 +1129,27 @@ Coñeza o %s Vexa as novidades + + Tes preguntas sobre o %s redeseñado? Quere saber o que cambiou? Obteña as respostas aquí + + Comeza a sincronizar marcadores, historial e moito máis coa súa conta de Firefox. Máis información + + Iniciou sesión como %s noutro navegador Firefox neste dispositivo. Quere iniciar sesión con esta conta? Si, iniciar sesión + + Iniciando sesión ... + + Acceda a Firefox + + Permanecer sen sesión A sincronización está activada @@ -1022,4 +1157,35 @@ Privacidade automática + + A configuración de privacidade e seguranza bloquea os rastrexadores, o malware e as empresas que seguen a súa persenza. + + Estándar (predeterminado) + + Bloquea menos rastrexadores. As páxinas cárganse normalmente. + + Estrito (recomendado) + + Estrito + + Bloquea máis rastreadores, anuncios e xanelas emerxentes. As páxinas cargan máis rápido, pero é posíbel que algunhas funcións non funcionen. + + Posiciónese + + Probe a navegar cunha soa man coa barra de ferramentas inferior ou súbaa para arriba de todo. + + Navegue en privado + + Abra unha lapela privada unha vez: toque a icona %s. + + Abrir lapelas privadas cada vez: actualice a configuración de navegación privada. + + Abrir configuración + + A súa privacidade + diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 12a4ca67d..a9b55c585 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -383,9 +383,9 @@ Odjavi se - Ime uređaja + Naziv uređaja - Ime uređaja ne može biti prazno. + Naziv uređaja ne može biti prazan. Sinkroniziranje … diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index bfa0a194d..8886d69c2 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -155,8 +155,6 @@ Znajdź na stronie Karta prywatna - - Nowa karta Zachowaj w kolekcji @@ -368,6 +366,12 @@ Zmieniono kolekcję dodatków. Wyłączanie aplikacji, aby zastosować zmiany… + + + Dodatek nie jest obsługiwany + + Dodatek jest już zainstalowany + Synchronizuj @@ -726,18 +730,22 @@ Wyczyść listę Czy na pewno wyczyścić listę pobranych plików? - - Wyczyszczono listę + + Wyczyszczono listę + + Wyczyszczono plik „%1$s” z listy - Nie ma pobranych plików + Nie ma pobranych plików Zaznaczone: %1$d Otwórz - - Usuń + + + + Wyczyść z listy @@ -861,6 +869,8 @@ Powiadomienia Przechowywanie danych na urządzeniu + + Treści chronione przez DRM Pytanie o zezwolenie diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index a7c9836ea..5e8fe5815 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -620,6 +620,8 @@ ᱪᱚᱭᱚᱱ ᱟᱠᱟᱱ ᱴᱮᱵ ᱢᱮᱱᱭᱩ ᱠᱚ ᱴᱮᱵ ᱛᱩᱢᱟᱹᱞ ᱠᱷᱚᱱ ᱚᱪᱚᱜ ᱢᱮ + + ᱴᱮᱵ ᱠᱚ ᱪᱚᱭᱚᱱ ᱢᱮ ᱴᱮᱵ ᱵᱚᱸᱫᱚᱭ ᱢᱮ @@ -705,17 +707,13 @@ ᱢᱟᱨᱮᱭᱟᱜ - ᱱᱚᱲᱮ ᱦᱤᱛᱟᱹᱞ ᱵᱚᱱᱩ-ᱟ + ᱱᱚᱰᱮ ᱦᱤᱛᱟᱹᱞ ᱵᱚᱱᱩᱜ-ᱟ ᱰᱟᱩᱱᱞᱳᱰ ᱠᱚ ᱢᱮᱴᱟᱣ ᱢᱮ ᱟᱢ ᱡᱷᱚᱛᱚ ᱞᱮᱠᱷᱟ ᱛᱮ ᱟᱢᱟᱜ ᱰᱟᱩᱱᱞᱳᱰ ᱠᱚ ᱢᱮᱴᱟᱣ ᱥᱟᱱᱟᱢ ᱠᱟᱱᱟ ᱥᱮ? - - ᱰᱟᱩᱱᱞᱳᱰ ᱠᱚ ᱢᱮᱴᱟᱣ ᱮᱱᱟ - - ᱱᱚᱰᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱱᱩᱜ-ᱟ %1$d ᱵᱟᱪᱷᱟᱣᱮᱱᱟ @@ -723,8 +721,10 @@ ᱠᱷᱩᱞᱟᱹ - - ᱢᱮᱴᱟᱣ ᱢᱮ + + + + ᱚᱪᱚᱜ @@ -807,7 +807,7 @@ ᱵᱟᱝ ᱵᱟᱛᱟᱣ URL - ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱱᱚᱲᱮ ᱵᱮᱱᱩ-ᱟ + ᱵᱩᱠᱢᱟᱨᱠ ᱠᱚ ᱱᱚᱰᱮ ᱵᱚᱱᱩᱜ-ᱟ %1$s ᱢᱮᱴᱟᱣᱮᱱᱟ @@ -849,6 +849,8 @@ ᱤᱛᱞᱟᱭ ᱛᱟᱦᱮᱸᱱᱠᱟᱱ ᱡᱟᱭᱜᱟ + + DRM-ᱠᱚᱵᱽᱡᱟ ᱡᱤᱱᱤᱥ ᱦᱮᱥᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫ ᱠᱩᱠᱞᱤ ᱢᱮ @@ -990,6 +992,8 @@ ᱴᱮᱵ ᱵᱚᱸᱫᱚᱭᱮᱱᱟ ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱚᱭᱮᱱᱟ + + ᱴᱮᱵ ᱠᱚ ᱵᱚᱸᱫᱽ ᱮᱱᱟ! ᱵᱩᱻᱠᱢᱟᱨᱠ ᱠᱚ ᱥᱟᱺᱪᱟᱣ ᱮᱱᱟ! diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index e80e08b19..a03e3a9c5 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -871,6 +871,8 @@ Obvestilo Trajna shramba + + Vsebina, zaščitena z DRM Vprašaj za dovoljenje diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index c23c28a6a..f2410d8eb 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -152,8 +152,6 @@ Gjej në faqe Skedë private - - Skedë e re Ruaje në koleksion @@ -362,6 +360,12 @@ Koleksioni i shtesave u ndryshua. Po dilet nga aplikacioni, për të zbatuar ndryshimet… + + + Shtesa nuk mbulohet + + Shtesa është tashmë e instaluar + Njëkohësoje tani @@ -717,18 +721,22 @@ Fshiji shkarkimet Jeni i sigurt se doni të spastrohet historiku i shfletimeve tuaja? - - Shkarkimet u Fshinë + + Shkarkimet u Hoqën + + U hoq %1$s - S’ka shkarkime këtu + S’ka kartela të shkarkuara %1$d të përzgjedhura Hape - - Fshije + + + + Hiqe @@ -853,6 +861,8 @@ Njoftim Depozitë e Qëndrueshme + + Lëndë nën DRM Kërko të lejohet diff --git a/app/src/main/res/values-su/strings.xml b/app/src/main/res/values-su/strings.xml index 1b26f7923..bffe351ad 100644 --- a/app/src/main/res/values-su/strings.xml +++ b/app/src/main/res/values-su/strings.xml @@ -152,8 +152,6 @@ Panggihan dina kaca Tab nyamuni - - Tab anyar Simpen kana koléksi @@ -365,6 +363,10 @@ Koléksi Émboh geus dirobah. Kaluar ti aplikasi pikeun nerapkeun parobahan… + + + Emboh teu didukung + Singkronkeun ayeuna @@ -724,18 +726,22 @@ Hapus undeuran Yakin rék meresihan undeuran anjeun? - - Undeuran geus dihapus + + Undeuran Disingkahkeun + + Disingkahkeun %1$s - Taya undeuran di dieu + Taya berkas undeuran %1$d dipilih Buka - - Hapus + + + + Singkahkeun @@ -861,6 +867,8 @@ Iber Panyimpen panceg + + Kontén anu diatur ku DRM Nyuhunkeun diidinan diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index f0fd341b7..d94c4250b 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -205,6 +205,9 @@ ఇంకా తెలుసుకోండి + + + ఒక కొత్త Firefox ట్యాబును తెరువండి వెతకండి @@ -340,6 +343,9 @@ సేకరణ యజమాని (వాడుకరి ID) + + పొడగింత ఇప్పటికే స్థాపితమైవుంది + ఇప్పుడు సింక్ చేయి @@ -563,6 +569,8 @@ తెరిచివున్న ట్యాబులు సేకరణకు భద్రపరుచు + + ఎంచుకోండి అన్ని ట్యాబులను పంచుకో @@ -578,8 +586,14 @@ ముంగిలికి వెళ్ళు ట్యాబు రీతిని మార్చు + + ఇష్టాంశం చేయి మూసివేయి + + ఎంచుకున్న ట్యాబులను పంచుకో + + ఎంచుకున్న ట్యాబుల మెనూ ట్యాబును సేకరణ నుండి తీసివేయి @@ -1324,6 +1338,9 @@ The first parameter is the app name --> %s| OSS లైబ్రరీలు + + దారిమళ్ళింపు ట్రాకర్లు + తోడ్పాటు From d5f625c9451f3b430896d4993152459f8e6bb78c Mon Sep 17 00:00:00 2001 From: ekager Date: Mon, 21 Dec 2020 14:52:48 -0800 Subject: [PATCH 054/205] For #17177 - Do not show PBM CFR if entering search on home, make sure fragment attached before showing --- .../org/mozilla/fenix/home/HomeFragment.kt | 21 ++++++++++--------- .../java/org/mozilla/fenix/utils/Settings.kt | 9 ++++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index 9de1ca29a..31beb58ed 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -85,6 +85,7 @@ import mozilla.components.ui.tabcounter.TabCounterMenu import org.mozilla.fenix.BrowserDirection import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R +import org.mozilla.fenix.addons.runIfFragmentIsAttached import org.mozilla.fenix.browser.BrowserAnimator.Companion.getToolbarNavOptions import org.mozilla.fenix.browser.browsingmode.BrowsingMode import org.mozilla.fenix.components.FenixSnackbar @@ -345,10 +346,6 @@ class HomeFragment : Fragment() { sessionControlView!!.view.layoutManager?.onRestoreInstanceState(parcelable) } homeViewModel.layoutManagerState = null - - // We have to delay so that the keyboard collapses and the view is resized before the - // animation from SearchFragment happens - delay(ANIMATION_DELAY) } observeSearchEngineChanges() @@ -602,7 +599,9 @@ class HomeFragment : Fragment() { } if (browsingModeManager.mode.isPrivate && - context.settings().showPrivateModeCfr + // We will be showing the search dialog and don't want to show the CFR while the dialog shows + !bundleArgs.getBoolean(FOCUS_ON_ADDRESS_BAR) && + context.settings().shouldShowPrivateModeCfr ) { recommendPrivateBrowsingShortcut() } @@ -714,10 +713,13 @@ class HomeFragment : Fragment() { // We want to show the popup only after privateBrowsingButton is available. // Otherwise, we will encounter an activity token error. privateBrowsingButton.post { - context.settings().lastCfrShownTimeInMillis = System.currentTimeMillis() - privateBrowsingRecommend.showAsDropDown( - privateBrowsingButton, 0, CFR_Y_OFFSET, Gravity.TOP or Gravity.END - ) + runIfFragmentIsAttached { + context.settings().showedPrivateModeContextualFeatureRecommender = true + context.settings().lastCfrShownTimeInMillis = System.currentTimeMillis() + privateBrowsingRecommend.showAsDropDown( + privateBrowsingButton, 0, CFR_Y_OFFSET, Gravity.TOP or Gravity.END + ) + } } } } @@ -1043,7 +1045,6 @@ class HomeFragment : Fragment() { private const val FOCUS_ON_ADDRESS_BAR = "focusOnAddressBar" private const val FOCUS_ON_COLLECTION = "focusOnCollection" - private const val ANIMATION_DELAY = 100L /** * Represents the number of items in [sessionControlView] that are NOT part of diff --git a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt index 6ba49e750..98b726a8b 100644 --- a/app/src/main/java/org/mozilla/fenix/utils/Settings.kt +++ b/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -837,7 +837,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { fun incrementNumTimesPrivateModeOpened() = numTimesPrivateModeOpened.increment() - private var showedPrivateModeContextualFeatureRecommender by booleanPreference( + var showedPrivateModeContextualFeatureRecommender by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_showed_private_mode_cfr), default = false ) @@ -846,7 +846,7 @@ class Settings(private val appContext: Context) : PreferencesHolder { appContext.getPreferenceKey(R.string.pref_key_private_mode_opened) ) - val showPrivateModeCfr: Boolean + val shouldShowPrivateModeCfr: Boolean get() { if (!canShowCfr) return false val focusInstalled = MozillaProductDetector @@ -854,13 +854,12 @@ class Settings(private val appContext: Context) : PreferencesHolder { .contains(MozillaProductDetector.MozillaProducts.FOCUS.productName) val showCondition = if (focusInstalled) { - numTimesPrivateModeOpened.value == CFR_COUNT_CONDITION_FOCUS_INSTALLED + numTimesPrivateModeOpened.value >= CFR_COUNT_CONDITION_FOCUS_INSTALLED } else { - numTimesPrivateModeOpened.value == CFR_COUNT_CONDITION_FOCUS_NOT_INSTALLED + numTimesPrivateModeOpened.value >= CFR_COUNT_CONDITION_FOCUS_NOT_INSTALLED } if (showCondition && !showedPrivateModeContextualFeatureRecommender) { - showedPrivateModeContextualFeatureRecommender = true return true } From d7a35ed6bd38bdba5f1e89292d07e03a73eb188f Mon Sep 17 00:00:00 2001 From: Oana Horvath Date: Mon, 4 Jan 2021 12:33:59 +0200 Subject: [PATCH 055/205] For #16966: Remove unnecessary step from mainMenuAddToHomeScreenTest --- app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt index 39e8dae1d..e4d676eef 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/SmokeTest.kt @@ -261,9 +261,7 @@ class SmokeTest { verifyShortcutNameField(defaultWebPage.title) clickAddShortcutButton() clickAddAutomaticallyButton() - }.openHomeScreenShortcut(defaultWebPage.title) { - verifyPageContent(defaultWebPage.content) - } + }.openHomeScreenShortcut(defaultWebPage.title) {} } @Test From 1b6cebf4d43ac977cfae9e101c4e4b5d1ec24ef9 Mon Sep 17 00:00:00 2001 From: Sebastian Kaspari Date: Fri, 18 Dec 2020 15:34:33 +0100 Subject: [PATCH 056/205] Switch to new SessionStorage / session restore API. --- app/build.gradle | 1 + .../org/mozilla/fenix/FenixApplication.kt | 38 ++++++++++++- .../java/org/mozilla/fenix/components/Core.kt | 56 +++---------------- .../fenix/components/TabCollectionStorage.kt | 3 +- buildSrc/src/main/java/AndroidComponents.kt | 2 +- buildSrc/src/main/java/Dependencies.kt | 1 + 6 files changed, 49 insertions(+), 52 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index aff69a0e5..49a4556da 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -427,6 +427,7 @@ dependencies { implementation Deps.mozilla_browser_menu2 implementation Deps.mozilla_browser_search implementation Deps.mozilla_browser_session + implementation Deps.mozilla_browser_session_storage implementation Deps.mozilla_browser_state implementation Deps.mozilla_browser_storage_sync implementation Deps.mozilla_browser_tabstray diff --git a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt index 8016e5296..5b9991243 100644 --- a/app/src/main/java/org/mozilla/fenix/FenixApplication.kt +++ b/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -41,14 +41,15 @@ import mozilla.components.support.webextensions.WebExtensionSupport import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.metrics.MetricServiceType import org.mozilla.fenix.ext.settings -import org.mozilla.fenix.perf.StorageStatsMetrics import org.mozilla.fenix.perf.StartupTimeline +import org.mozilla.fenix.perf.StorageStatsMetrics import org.mozilla.fenix.perf.runBlockingIncrement import org.mozilla.fenix.push.PushFxaIntegration import org.mozilla.fenix.push.WebPushEngineIntegration import org.mozilla.fenix.session.PerformanceActivityLifecycleCallbacks import org.mozilla.fenix.session.VisibilityLifecycleCallback import org.mozilla.fenix.utils.BrowsersCache +import java.util.concurrent.TimeUnit /** *The main application class for Fenix. Records data to measure initialization performance. @@ -130,6 +131,8 @@ open class FenixApplication : LocaleAwareApplication(), Provider { components.core.engine.warmUp() } initializeWebExtensionSupport() + restoreBrowserState() + removeTimedOutTabs() restoreDownloads() @@ -159,6 +162,39 @@ open class FenixApplication : LocaleAwareApplication(), Provider { components.appStartupTelemetry.onFenixApplicationOnCreate() } + private fun restoreBrowserState() = GlobalScope.launch(Dispatchers.Main) { + val store = components.core.store + val sessionStorage = components.core.sessionStorage + + components.useCases.tabsUseCases.restore(sessionStorage) + + // Now that we have restored our previous state (if there's one) let's setup auto saving the state while + // the app is used. + sessionStorage.autoSave(store) + .periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS) + .whenGoingToBackground() + .whenSessionsChange() + } + + private fun removeTimedOutTabs() { + val store = components.core.store + val tabsUseCases = components.useCases.tabsUseCases + + // Now that we have restored our previous state (if there's one) let's remove timed out tabs + if (!settings().manuallyCloseTabs) { + val now = System.currentTimeMillis() + val tabTimeout = settings().getTabTimeout() + + val tabsToRemove = store.state.tabs + .filter { tab -> now - tab.lastAccess > tabTimeout } + .map { tab -> tab.id } + + if (tabsToRemove.isNotEmpty()) { + tabsUseCases.removeTabs(tabsToRemove) + } + } + } + private fun restoreDownloads() { components.useCases.downloadUseCases.restoreDownloads() } diff --git a/app/src/main/java/org/mozilla/fenix/components/Core.kt b/app/src/main/java/org/mozilla/fenix/components/Core.kt index 8b04d719b..96b6b504a 100644 --- a/app/src/main/java/org/mozilla/fenix/components/Core.kt +++ b/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -11,10 +11,6 @@ import android.os.Build import android.os.StrictMode import androidx.core.content.ContextCompat import io.sentry.Sentry -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import mozilla.components.browser.engine.gecko.GeckoEngine import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient import mozilla.components.browser.icons.BrowserIcons @@ -23,7 +19,6 @@ import mozilla.components.browser.session.SessionManager import mozilla.components.browser.session.engine.EngineMiddleware import mozilla.components.browser.session.storage.SessionStorage import mozilla.components.browser.session.undo.UndoMiddleware -import mozilla.components.browser.state.action.RestoreCompleteAction import mozilla.components.browser.state.state.BrowserState import mozilla.components.browser.state.store.BrowserStore import mozilla.components.browser.storage.sync.PlacesBookmarksStorage @@ -39,6 +34,8 @@ import mozilla.components.concept.fetch.Client import mozilla.components.feature.customtabs.store.CustomTabsServiceStore import mozilla.components.feature.downloads.DownloadMiddleware import mozilla.components.feature.logins.exceptions.LoginExceptionStorage +import mozilla.components.feature.media.MediaSessionFeature +import mozilla.components.feature.media.middleware.MediaMiddleware import mozilla.components.feature.media.middleware.RecordingDevicesMiddleware import mozilla.components.feature.pwa.ManifestStorage import mozilla.components.feature.pwa.WebAppShortcutManager @@ -64,14 +61,17 @@ import mozilla.components.support.locale.LocaleManager import org.mozilla.fenix.AppRequestInterceptor import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.Config +import org.mozilla.fenix.FeatureFlags.newMediaSessionApi import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R -import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.TelemetryMiddleware import org.mozilla.fenix.components.search.SearchMigration import org.mozilla.fenix.downloads.DownloadService import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.settings +import org.mozilla.fenix.media.MediaService +import org.mozilla.fenix.media.MediaSessionService +import org.mozilla.fenix.perf.StrictModeManager import org.mozilla.fenix.perf.lazyMonitored import org.mozilla.fenix.search.telemetry.ads.AdsTelemetry import org.mozilla.fenix.search.telemetry.incontent.InContentTelemetry @@ -79,12 +79,6 @@ import org.mozilla.fenix.settings.SupportUtils import org.mozilla.fenix.settings.advanced.getSelectedLocale import org.mozilla.fenix.utils.Mockable import org.mozilla.fenix.utils.getUndoDelay -import java.util.concurrent.TimeUnit -import mozilla.components.feature.media.MediaSessionFeature -import mozilla.components.feature.media.middleware.MediaMiddleware -import org.mozilla.fenix.FeatureFlags.newMediaSessionApi -import org.mozilla.fenix.media.MediaService -import org.mozilla.fenix.media.MediaSessionService /** * Component group for all core browser functionality. @@ -166,7 +160,7 @@ class Core( ) } - private val sessionStorage: SessionStorage by lazyMonitored { + val sessionStorage: SessionStorage by lazyMonitored { SessionStorage(context, engine = engine) } @@ -239,7 +233,7 @@ class Core( * case all sessions/tabs are closed. */ val sessionManager by lazyMonitored { - SessionManager(engine, store).also { sessionManager -> + SessionManager(engine, store).also { // Install the "icons" WebExtension to automatically load icons for every visited website. icons.install(engine, store) @@ -249,40 +243,6 @@ class Core( // Install the "cookies" WebExtension and tracks user interaction with SERPs. searchTelemetry.install(engine, store) - // Restore the previous state. - GlobalScope.launch(Dispatchers.Main) { - withContext(Dispatchers.IO) { - sessionStorage.restore() - }?.let { snapshot -> - sessionManager.restore( - snapshot, - updateSelection = (sessionManager.selectedSession == null) - ) - } - - // Now that we have restored our previous state (if there's one) let's setup auto saving the state while - // the app is used. - sessionStorage.autoSave(store) - .periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS) - .whenGoingToBackground() - .whenSessionsChange() - - // Now that we have restored our previous state (if there's one) let's remove timed out tabs - if (!context.settings().manuallyCloseTabs) { - store.state.tabs.filter { - (System.currentTimeMillis() - it.lastAccess) > context.settings() - .getTabTimeout() - }.forEach { - val session = sessionManager.findSessionById(it.id) - if (session != null) { - sessionManager.remove(session) - } - } - } - - store.dispatch(RestoreCompleteAction) - } - WebNotificationFeature( context, engine, icons, R.drawable.ic_status_logo, permissionStorage.permissionsStorage, HomeActivity::class.java diff --git a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt index 2347fe706..cbd15afa4 100644 --- a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt @@ -11,7 +11,6 @@ import androidx.lifecycle.asLiveData import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import mozilla.components.browser.session.storage.BrowserStateSerializer import mozilla.components.browser.state.state.TabSessionState import mozilla.components.feature.tab.collections.Tab import mozilla.components.feature.tab.collections.TabCollection @@ -56,7 +55,7 @@ class TabCollectionStorage( private val collectionStorage by lazy { strictMode.resetAfter(StrictMode.allowThreadDiskReads()) { - TabCollectionStorage(context, BrowserStateSerializer()) + TabCollectionStorage(context) } } diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index 40160e641..bf989053a 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20210104143130" + const val VERSION = "71.0.20210105122039" } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 38b482f51..27d9d713f 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -83,6 +83,7 @@ object Deps { const val mozilla_browser_icons = "org.mozilla.components:browser-icons:${Versions.mozilla_android_components}" const val mozilla_browser_search = "org.mozilla.components:browser-search:${Versions.mozilla_android_components}" const val mozilla_browser_session = "org.mozilla.components:browser-session:${Versions.mozilla_android_components}" + const val mozilla_browser_session_storage = "org.mozilla.components:browser-session-storage:${Versions.mozilla_android_components}" const val mozilla_browser_state = "org.mozilla.components:browser-state:${Versions.mozilla_android_components}" const val mozilla_browser_tabstray = "org.mozilla.components:browser-tabstray:${Versions.mozilla_android_components}" const val mozilla_browser_thumbnails = "org.mozilla.components:browser-thumbnails:${Versions.mozilla_android_components}" From 7617c18100cb6801e1cdb6e4c21947109f494cd1 Mon Sep 17 00:00:00 2001 From: MickeyMoz Date: Tue, 5 Jan 2021 17:51:30 +0000 Subject: [PATCH 057/205] Update Android Components version to 71.0.20210105172012. --- buildSrc/src/main/java/AndroidComponents.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/AndroidComponents.kt b/buildSrc/src/main/java/AndroidComponents.kt index bf989053a..5b55f3fc7 100644 --- a/buildSrc/src/main/java/AndroidComponents.kt +++ b/buildSrc/src/main/java/AndroidComponents.kt @@ -3,5 +3,5 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ object AndroidComponents { - const val VERSION = "71.0.20210105122039" + const val VERSION = "71.0.20210105172012" } From 381f22449b31c19f4a4deef647b8f2ea311106c1 Mon Sep 17 00:00:00 2001 From: Marcello Galhardo Date: Tue, 5 Jan 2021 20:26:14 +0100 Subject: [PATCH 058/205] Closes #17118: Fix font spacing when long pressing a URL (#17164) --- app/src/main/res/layout/browser_toolbar_popup_window.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/browser_toolbar_popup_window.xml b/app/src/main/res/layout/browser_toolbar_popup_window.xml index a92608402..3cd156001 100644 --- a/app/src/main/res/layout/browser_toolbar_popup_window.xml +++ b/app/src/main/res/layout/browser_toolbar_popup_window.xml @@ -15,7 +15,7 @@