commit 088ffb835af5cd274700dfc01aaa222c6c60ab83 parent dd7ee3c737aa3c6f6fed7d3b52a695bc7e73e6b4 Author: Matthew Finkel <sysrqb@torproject.org> Date: Fri, 24 Jul 2020 03:42:19 +0000 [android] Disable features and functionality Bug 33594: Disable data collection by default (Glean) Bug 40019: Adjust is disabled on Release when data collection is disabled Bug 34338: Disable the crash reporter Bug 40014: Neuter Google Advertising ID Bug 40018: Disable Push service Bug 40034: Disable PWA onboading Bug 40072: Disable Tracking Protection Bug 40061: Do not show "Send to device" in sharing menu Bug 40109: Reduce requested permissions Exclude LOCATION and NETWORK_STATE Diffstat:
39 files changed, 423 insertions(+), 628 deletions(-)
diff --git a/mobile/android/android-components/components/concept/engine/src/test/java/mozilla/components/concept/engine/SettingsTest.kt b/mobile/android/android-components/components/concept/engine/src/test/java/mozilla/components/concept/engine/SettingsTest.kt @@ -180,7 +180,7 @@ class SettingsTest { cookieBannerHandlingDetectOnlyMode = true, cookieBannerHandlingGlobalRules = true, cookieBannerHandlingGlobalRulesSubFrames = true, - emailTrackerBlockingPrivateBrowsing = true, + emailTrackerBlockingPrivateBrowsing = false, ) assertFalse(defaultSettings.domStorageEnabled) diff --git a/mobile/android/android-components/components/feature/accounts/build.gradle b/mobile/android/android-components/components/feature/accounts/build.gradle @@ -8,6 +8,10 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' android { + androidResources { + ignoreAssetsPattern '!<dir>extensions' + } + namespace = 'mozilla.components.feature.accounts' } diff --git a/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt b/mobile/android/android-components/components/feature/addons/src/main/java/mozilla/components/feature/addons/AddonManager.kt @@ -83,7 +83,7 @@ class AddonManager( * the [addonsProvider] or querying web extension state from the engine / store. */ @Throws(AddonManagerException::class) - @Suppress("TooGenericExceptionCaught") + @Suppress("TooGenericExceptionCaught", "UNUSED_PARAMETER") suspend fun getAddons( waitForPendingActions: Boolean = true, allowCache: Boolean = true, @@ -113,6 +113,8 @@ class AddonManager( // Get all the featured add-ons not installed from provider. // NB: We're keeping translations only for the default locale. var featuredAddons = emptyList<Addon>() + // tor-browser#40502: Do not recommend addons on Tor Browser + /* try { val userLanguage = Locale.getDefault().language val locales = listOf(userLanguage) @@ -124,6 +126,7 @@ class AddonManager( // Do not throw when we fail to fetch the featured add-ons since there can be installed add-ons. logger.warn("Failed to get the featured add-ons", throwable) } + */ // Build a list of installed extensions that are not built-in extensions. val installedAddons = installedExtensions diff --git a/mobile/android/android-components/components/feature/search/build.gradle b/mobile/android/android-components/components/feature/search/build.gradle @@ -9,7 +9,7 @@ apply plugin: 'kotlin-android' android { androidResources { - ignoreAssetsPattern '!amazon*:!azerdict*:!baidu*:!bing*:!ceneje*:!coccoc*:!daum*:!ebay*:!ecosia*:!faclair*:!google*:!gulesider*:!leo*:!mapy*:!mercadolibre*:!odpiralni*:!pazaruvaj*:!prisjakt*:!qwant*:!rakuten*:!salidzinilv*:!seznam*:!vatera*:!wikipedia-*:!wiktionary*:!yahoo*:!yandex*' + ignoreAssetsPattern '!<dir>extensions:!search_telemetry_v2.json:!amazon*:!azerdict*:!baidu*:!bing*:!ceneje*:!coccoc*:!daum*:!ebay*:!ecosia*:!faclair*:!google*:!gulesider*:!leo*:!mapy*:!mercadolibre*:!odpiralni*:!pazaruvaj*:!prisjakt*:!qwant*:!rakuten*:!salidzinilv*:!seznam*:!vatera*:!wikipedia-*:!wiktionary*:!yahoo*:!yandex*' } sourceSets { diff --git a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/middleware/SearchMiddleware.kt b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/middleware/SearchMiddleware.kt @@ -79,10 +79,7 @@ class SearchMiddleware( ) private val client: RemoteSettingsClient? = searchEngineSelectorConfig?.service?.remoteSettingsService?.makeClient(SEARCH_CONFIG_ICONS_COLLECTION_NAME) - private val searchEngineSelectorRepository: SearchEngineRepository? = - searchEngineSelectorConfig?.let { - SearchEngineSelectorRepository(context, it, defaultSearchEngineIcon, client) - } + private val searchEngineSelectorRepository: SearchEngineRepository? = null // needs to always be null so that the regionBundle isn't populated with empty RemoteSettings and instead defaults to what we need override fun invoke( store: Store<BrowserState, BrowserAction>, diff --git a/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepository.kt b/mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepository.kt @@ -9,7 +9,7 @@ import mozilla.appservices.remotesettings.RemoteSettingsResponse import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.ktx.android.org.json.asSequence import mozilla.components.support.ktx.android.org.json.toList -import mozilla.components.support.remotesettings.RemoteSettingsClient +//import mozilla.components.support.remotesettings.RemoteSettingsClient import mozilla.components.support.remotesettings.RemoteSettingsResult import org.json.JSONArray import org.json.JSONException @@ -23,22 +23,22 @@ internal const val REMOTE_ENDPOINT_BUCKET_NAME = "main" * Parse SERP Telemetry json from remote config. */ class SerpTelemetryRepository( - rootStorageDirectory: File, +// rootStorageDirectory: File, private val readJson: () -> JSONObject, - collectionName: String, - serverUrl: String = REMOTE_PROD_ENDPOINT_URL, - bucketName: String = REMOTE_ENDPOINT_BUCKET_NAME, +// collectionName: String, +// serverUrl: String = REMOTE_PROD_ENDPOINT_URL, +// bucketName: String = REMOTE_ENDPOINT_BUCKET_NAME, ) { val logger = Logger("SerpTelemetryRepository") private var providerList: List<SearchProviderModel> = emptyList() - @VisibleForTesting - internal var remoteSettingsClient = RemoteSettingsClient( - serverUrl = serverUrl, - bucketName = bucketName, - collectionName = collectionName, - storageRootDirectory = rootStorageDirectory, - ) +// @VisibleForTesting +// internal var remoteSettingsClient = RemoteSettingsClient( +// serverUrl = serverUrl, +// bucketName = bucketName, +// collectionName = collectionName, +// storageRootDirectory = rootStorageDirectory, +// ) /** * Provides list of search providers from cache or dump and fetches from remotes server . @@ -65,7 +65,7 @@ class SerpTelemetryRepository( val remoteResponse = fetchRemoteResponse() if (remoteResponse.lastModified > cacheLastModified) { providerList = parseRemoteResponse(remoteResponse) - writeToCache(remoteResponse) + //writeToCache(remoteResponse) } } @@ -73,8 +73,9 @@ class SerpTelemetryRepository( * Writes data to local cache. */ @VisibleForTesting - internal suspend fun writeToCache(records: RemoteSettingsResponse): RemoteSettingsResult { - return remoteSettingsClient.write(records) + internal suspend fun writeToCache(/*records: RemoteSettingsResponse*/): RemoteSettingsResult { + return RemoteSettingsResult.NetworkFailure(Exception("Bug-43113: no remote fetching")) +// return remoteSettingsClient.write(records) } /** @@ -104,12 +105,12 @@ class SerpTelemetryRepository( */ @VisibleForTesting internal suspend fun fetchRemoteResponse(): RemoteSettingsResponse { - val result = remoteSettingsClient.fetch() - return if (result is RemoteSettingsResult.Success) { - result.response - } else { - RemoteSettingsResponse(emptyList(), 0u) - } +// val result = remoteSettingsClient.fetch() +// return if (result is RemoteSettingsResult.Success) { +// result.response +// } else { + return RemoteSettingsResponse(emptyList(), 0u) +// } } /** @@ -117,16 +118,16 @@ class SerpTelemetryRepository( */ @VisibleForTesting internal suspend fun loadProvidersFromCache(): Pair<ULong, List<SearchProviderModel>> { - val result = remoteSettingsClient.read() - return if (result is RemoteSettingsResult.Success) { - val response = result.response.records.mapNotNull { - it.fields.toSearchProviderModel() - } - val lastModified = result.response.lastModified - Pair(lastModified, response) - } else { - Pair(0u, emptyList()) - } +// val result = remoteSettingsClient.read() +// return if (result is RemoteSettingsResult.Success) { +// val response = result.response.records.mapNotNull { +// it.fields.toSearchProviderModel() +// } +// val lastModified = result.response.lastModified +// Pair(lastModified, response) +// } else { + return Pair(0u, emptyList()) +// } } } diff --git a/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/BaseSearchTelemetryTest.kt b/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/BaseSearchTelemetryTest.kt @@ -27,161 +27,161 @@ import java.io.File @RunWith(AndroidJUnit4::class) class BaseSearchTelemetryTest { - private lateinit var baseTelemetry: BaseSearchTelemetry - private lateinit var handler: BaseSearchTelemetry.SearchTelemetryMessageHandler - - @Mock - private lateinit var mockRepo: SerpTelemetryRepository - - private val mockReadJson: () -> JSONObject = mock() - private val mockRootStorageDirectory: File = mock() - - private fun createMockProviderList(): List<SearchProviderModel> = listOf( - SearchProviderModel( - schema = 1698656464939, - taggedCodes = listOf("monline_7_dg"), - telemetryId = "baidu", - organicCodes = emptyList(), - codeParamName = "tn", - queryParamNames = listOf("wd"), - searchPageRegexp = "^https://(?:m|www)\\\\.baidu\\\\.com/(?:s|baidu)", - followOnParamNames = listOf("oq"), - extraAdServersRegexps = listOf("^https?://www\\\\.baidu\\\\.com/baidu\\\\.php?"), - expectedOrganicCodes = emptyList(), - ), - ) - - private val rawJson = """ - { - "data": [ - { - "schema": 1698656464939, - "taggedCodes": [ - "monline_7_dg" - ], - "telemetryId": "baidu", - "organicCodes": [], - "codeParamName": "tn", - "queryParamNames": [ - "wd" - ], - "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)", - "followOnParamNames": [ - "oq" - ], - "extraAdServersRegexps": [ - "^https?://www\\.baidu\\.com/baidu\\.php?" - ], - "id": "19c434a3-d173-4871-9743-290ac92a3f6a", - "last_modified": 1698666532326 - }], - "timestamp": 16 -} - """.trimIndent() - - @Before - fun setup() { - baseTelemetry = spy( - object : BaseSearchTelemetry() { - override suspend fun install( - engine: Engine, - store: BrowserStore, - providerList: List<SearchProviderModel>, - ) { - // mock, do nothing - } - - override fun processMessage(message: JSONObject) { - // mock, do nothing - } - }, - ) - handler = baseTelemetry.SearchTelemetryMessageHandler() - mockRepo = spy(SerpTelemetryRepository(mockRootStorageDirectory, mockReadJson, "test")) - } - - @Test - fun `GIVEN an engine WHEN installWebExtension is called THEN the provided extension is installed in engine`() { - val engine: Engine = mock() - val store: BrowserStore = mock() - val id = "id" - val resourceUrl = "resourceUrl" - val messageId = "messageId" - val extensionInfo = ExtensionInfo(id, resourceUrl, messageId) - - baseTelemetry.installWebExtension(engine, store, extensionInfo) - - verify(engine).installBuiltInWebExtension( - id = eq(id), - url = eq(resourceUrl), - onSuccess = any(), - onError = any(), - ) - } - - @Test - fun `GIVEN a search provider does not exist for the url WHEN getProviderForUrl is called THEN return null`() { - val url = "https://www.mozilla.com/search?q=firefox" - baseTelemetry.providerList = createMockProviderList() - - assertEquals(null, baseTelemetry.getProviderForUrl(url)) - } - - @Test(expected = IllegalStateException::class) - fun `GIVEN an extension message WHEN that cannot be processed THEN throw IllegalStateException`() { - val message = "message" - - handler.onMessage(message, mock()) - } - - @Test - fun `GIVEN an extension message WHEN received THEN pass it to processMessage`() { - val message = JSONObject() - - handler.onMessage(message, mock()) - - verify(baseTelemetry).processMessage(message) - } - - @Test - fun `GIVEN empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit = - runBlocking { - val localResponse = JSONObject(rawJson) - val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(0u, emptyList()) - - `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse) - doAnswer { - localResponse - }.`when`(mockReadJson)() - - `when`(mockRepo.parseLocalPreinstalledData(localResponse)).thenReturn(createMockProviderList()) - doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any()) - - baseTelemetry.setProviderList(mockRepo.updateProviderList()) - - assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString()) - } - - @Test - fun `GIVEN non-empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit = - runBlocking { - val localResponse = JSONObject(rawJson) - val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(123u, createMockProviderList()) - - `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse) - doAnswer { - localResponse - }.`when`(mockReadJson)() - doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any()) - - baseTelemetry.setProviderList(mockRepo.updateProviderList()) - - assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString()) - } - - fun getProviderForUrl(url: String): SearchProviderModel? { - return createMockProviderList().find { provider -> - provider.searchPageRegexp.pattern.toRegex().containsMatchIn(url) - } - } +// private lateinit var baseTelemetry: BaseSearchTelemetry +// private lateinit var handler: BaseSearchTelemetry.SearchTelemetryMessageHandler +// +// @Mock +// private lateinit var mockRepo: SerpTelemetryRepository +// +// private val mockReadJson: () -> JSONObject = mock() +// private val mockRootStorageDirectory: File = mock() +// +// private fun createMockProviderList(): List<SearchProviderModel> = listOf( +// SearchProviderModel( +// schema = 1698656464939, +// taggedCodes = listOf("monline_7_dg"), +// telemetryId = "baidu", +// organicCodes = emptyList(), +// codeParamName = "tn", +// queryParamNames = listOf("wd"), +// searchPageRegexp = "^https://(?:m|www)\\\\.baidu\\\\.com/(?:s|baidu)", +// followOnParamNames = listOf("oq"), +// extraAdServersRegexps = listOf("^https?://www\\\\.baidu\\\\.com/baidu\\\\.php?"), +// expectedOrganicCodes = emptyList(), +// ), +// ) +// +// private val rawJson = """ +// { +// "data": [ +// { +// "schema": 1698656464939, +// "taggedCodes": [ +// "monline_7_dg" +// ], +// "telemetryId": "baidu", +// "organicCodes": [], +// "codeParamName": "tn", +// "queryParamNames": [ +// "wd" +// ], +// "searchPageRegexp": "^https://(?:m|www)\\.baidu\\.com/(?:s|baidu)", +// "followOnParamNames": [ +// "oq" +// ], +// "extraAdServersRegexps": [ +// "^https?://www\\.baidu\\.com/baidu\\.php?" +// ], +// "id": "19c434a3-d173-4871-9743-290ac92a3f6a", +// "last_modified": 1698666532326 +// }], +// "timestamp": 16 +//} +// """.trimIndent() +// +// @Before +// fun setup() { +// baseTelemetry = spy( +// object : BaseSearchTelemetry() { +// override suspend fun install( +// engine: Engine, +// store: BrowserStore, +// providerList: List<SearchProviderModel>, +// ) { +// // mock, do nothing +// } +// +// override fun processMessage(message: JSONObject) { +// // mock, do nothing +// } +// }, +// ) +// handler = baseTelemetry.SearchTelemetryMessageHandler() +// mockRepo = spy(SerpTelemetryRepository(mockRootStorageDirectory, mockReadJson, "test")) +// } +// +// @Test +// fun `GIVEN an engine WHEN installWebExtension is called THEN the provided extension is installed in engine`() { +// val engine: Engine = mock() +// val store: BrowserStore = mock() +// val id = "id" +// val resourceUrl = "resourceUrl" +// val messageId = "messageId" +// val extensionInfo = ExtensionInfo(id, resourceUrl, messageId) +// +// baseTelemetry.installWebExtension(engine, store, extensionInfo) +// +// verify(engine).installBuiltInWebExtension( +// id = eq(id), +// url = eq(resourceUrl), +// onSuccess = any(), +// onError = any(), +// ) +// } +// +// @Test +// fun `GIVEN a search provider does not exist for the url WHEN getProviderForUrl is called THEN return null`() { +// val url = "https://www.mozilla.com/search?q=firefox" +// baseTelemetry.providerList = createMockProviderList() +// +// assertEquals(null, baseTelemetry.getProviderForUrl(url)) +// } +// +// @Test(expected = IllegalStateException::class) +// fun `GIVEN an extension message WHEN that cannot be processed THEN throw IllegalStateException`() { +// val message = "message" +// +// handler.onMessage(message, mock()) +// } +// +// @Test +// fun `GIVEN an extension message WHEN received THEN pass it to processMessage`() { +// val message = JSONObject() +// +// handler.onMessage(message, mock()) +// +// verify(baseTelemetry).processMessage(message) +// } +// +// @Test +// fun `GIVEN empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit = +// runBlocking { +// val localResponse = JSONObject(rawJson) +// val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(0u, emptyList()) +// +// `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse) +// doAnswer { +// localResponse +// }.`when`(mockReadJson)() +// +// `when`(mockRepo.parseLocalPreinstalledData(localResponse)).thenReturn(createMockProviderList()) +// doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any()) +// +// baseTelemetry.setProviderList(mockRepo.updateProviderList()) +// +// assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString()) +// } +// +// @Test +// fun `GIVEN non-empty cacheResponse WHEN initializeProviderList is called THEN update providerList`(): Unit = +// runBlocking { +// val localResponse = JSONObject(rawJson) +// val cacheResponse: Pair<ULong, List<SearchProviderModel>> = Pair(123u, createMockProviderList()) +// +// `when`(mockRepo.loadProvidersFromCache()).thenReturn(cacheResponse) +// doAnswer { +// localResponse +// }.`when`(mockReadJson)() +// doReturn(Unit).`when`(mockRepo).fetchRemoteResponse(any()) +// +// baseTelemetry.setProviderList(mockRepo.updateProviderList()) +// +// assertEquals(baseTelemetry.providerList.toString(), createMockProviderList().toString()) +// } +// +// fun getProviderForUrl(url: String): SearchProviderModel? { +// return createMockProviderList().find { provider -> +// provider.searchPageRegexp.pattern.toRegex().containsMatchIn(url) +// } +// } } diff --git a/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepositoryTest.kt b/mobile/android/android-components/components/feature/search/src/test/java/mozilla/components/feature/search/telemetry/SerpTelemetryRepositoryTest.kt @@ -23,70 +23,70 @@ import org.robolectric.RobolectricTestRunner @RunWith(RobolectricTestRunner::class) class SerpTelemetryRepositoryTest { - @Mock - private lateinit var mockRemoteSettingsClient: RemoteSettingsClient - - private lateinit var serpTelemetryRepository: SerpTelemetryRepository - - @Before - fun setup() { - MockitoAnnotations.openMocks(this) - serpTelemetryRepository = SerpTelemetryRepository( - rootStorageDirectory = mock(), - readJson = mock(), - collectionName = "", - serverUrl = "https://test.server", - bucketName = "", - ) - - serpTelemetryRepository.remoteSettingsClient = mockRemoteSettingsClient - } - - @Test - fun `GIVEN non-empty response WHEN writeToCache is called THEN the result is a success`() = runBlocking { - val records = listOf( - RemoteSettingsRecord("1", 123u, false, null, JSONObject()), - RemoteSettingsRecord("2", 456u, true, null, JSONObject()), - ) - val response = RemoteSettingsResponse(records, 125614567U) - - `when`(mockRemoteSettingsClient.write(response)) - .thenReturn(RemoteSettingsResult.Success(response)) - - val result = serpTelemetryRepository.writeToCache(response) - - assertTrue(result is RemoteSettingsResult.Success) - assertEquals(response, (result as RemoteSettingsResult.Success).response) - } - - @Test - fun `GIVEN non-empty response WHEN fetchRemoteResponse is called THEN the result is equal to the response`() = runBlocking { - val records = listOf( - RemoteSettingsRecord("1", 123u, false, null, JSONObject()), - RemoteSettingsRecord("2", 456u, true, null, JSONObject()), - ) - val response = RemoteSettingsResponse(records, 125614567U) - `when`(mockRemoteSettingsClient.fetch()) - .thenReturn(RemoteSettingsResult.Success(response)) - - val result = serpTelemetryRepository.fetchRemoteResponse() - - assertEquals(response, result) - } - - @Test - fun `GIVEN non-empty response WHEN loadProvidersFromCache is called THEN the result is equal to the response`() = runBlocking { - val records = listOf( - RemoteSettingsRecord("1", 123u, false, null, JSONObject()), - RemoteSettingsRecord("2", 456u, true, null, JSONObject()), - ) - val response = RemoteSettingsResponse(records, 125614567U) - `when`(mockRemoteSettingsClient.read()) - .thenReturn(RemoteSettingsResult.Success(response)) - - val result = serpTelemetryRepository.loadProvidersFromCache() - - assertEquals(response.lastModified, result.first) - assertEquals(response.records.mapNotNull { it.fields.toSearchProviderModel() }, result.second) - } +// @Mock +// private lateinit var mockRemoteSettingsClient: RemoteSettingsClient +// +// private lateinit var serpTelemetryRepository: SerpTelemetryRepository +// +// @Before +// fun setup() { +// MockitoAnnotations.openMocks(this) +// serpTelemetryRepository = SerpTelemetryRepository( +// rootStorageDirectory = mock(), +// readJson = mock(), +// collectionName = "", +// serverUrl = "https://test.server", +// bucketName = "", +// ) +// +// serpTelemetryRepository.remoteSettingsClient = mockRemoteSettingsClient +// } +// +// @Test +// fun `GIVEN non-empty response WHEN writeToCache is called THEN the result is a success`() = runBlocking { +// val records = listOf( +// RemoteSettingsRecord("1", 123u, false, null, JSONObject()), +// RemoteSettingsRecord("2", 456u, true, null, JSONObject()), +// ) +// val response = RemoteSettingsResponse(records, 125614567U) +// +// `when`(mockRemoteSettingsClient.write(response)) +// .thenReturn(RemoteSettingsResult.Success(response)) +// +// val result = serpTelemetryRepository.writeToCache(response) +// +// assertTrue(result is RemoteSettingsResult.Success) +// assertEquals(response, (result as RemoteSettingsResult.Success).response) +// } +// +// @Test +// fun `GIVEN non-empty response WHEN fetchRemoteResponse is called THEN the result is equal to the response`() = runBlocking { +// val records = listOf( +// RemoteSettingsRecord("1", 123u, false, null, JSONObject()), +// RemoteSettingsRecord("2", 456u, true, null, JSONObject()), +// ) +// val response = RemoteSettingsResponse(records, 125614567U) +// `when`(mockRemoteSettingsClient.fetch()) +// .thenReturn(RemoteSettingsResult.Success(response)) +// +// val result = serpTelemetryRepository.fetchRemoteResponse() +// +// assertEquals(response, result) +// } +// +// @Test +// fun `GIVEN non-empty response WHEN loadProvidersFromCache is called THEN the result is equal to the response`() = runBlocking { +// val records = listOf( +// RemoteSettingsRecord("1", 123u, false, null, JSONObject()), +// RemoteSettingsRecord("2", 456u, true, null, JSONObject()), +// ) +// val response = RemoteSettingsResponse(records, 125614567U) +// `when`(mockRemoteSettingsClient.read()) +// .thenReturn(RemoteSettingsResult.Success(response)) +// +// val result = serpTelemetryRepository.loadProvidersFromCache() +// +// assertEquals(response.lastModified, result.first) +// assertEquals(response.records.mapNotNull { it.fields.toSearchProviderModel() }, result.second) +// } } diff --git a/mobile/android/android-components/components/support/remotesettings/src/main/java/mozilla/components/support/remotesettings/RemoteSettingsClient.kt b/mobile/android/android-components/components/support/remotesettings/src/main/java/mozilla/components/support/remotesettings/RemoteSettingsClient.kt @@ -66,22 +66,8 @@ class RemoteSettingsClient( */ @Suppress("TooGenericExceptionCaught") suspend fun fetch(): RemoteSettingsResult = withContext(Dispatchers.IO) { - try { - val serverRecords = RemoteSettings(config).use { - it.getRecords() - } - RemoteSettingsResult.Success(serverRecords) - } catch (e: RemoteSettingsException) { - Logger.error(e.message.toString()) - RemoteSettingsResult.NetworkFailure(e) - } catch (e: NullPointerException) { - Logger.error(e.message.toString()) - RemoteSettingsResult.NetworkFailure(e) - } catch (e: UniffiInternalException) { - Logger.error(e.toString()) - reportRustError("remote-settings-internal-error", e.toString()) - RemoteSettingsResult.NetworkFailure(e) - } + RemoteSettingsResult.NetworkFailure(Exception("tb-43113: no remote fetching")) + } /** @@ -129,7 +115,8 @@ class RemoteSettingsClient( suspend fun RemoteSettingsClient.readOrFetch(): RemoteSettingsResult { val readResult = read() return if (readResult is RemoteSettingsResult.DiskFailure) { - fetch() + //fetch() + RemoteSettingsResult.NetworkFailure(Exception("tb-43113: no remote fetching")) } else { readResult } diff --git a/mobile/android/android-components/components/support/remotesettings/src/main/java/mozilla/components/support/remotesettings/RemoteSettingsService.kt b/mobile/android/android-components/components/support/remotesettings/src/main/java/mozilla/components/support/remotesettings/RemoteSettingsService.kt @@ -27,9 +27,7 @@ class RemoteSettingsService( isLargeScreenSize: Boolean = false, ) { val remoteSettingsService: RemoteSettingsService by lazy { - val appContext = generateAppContext(context, channel, isLargeScreenSize) - val databasePath = context.getDir("remote-settings", Context.MODE_PRIVATE).absolutePath - RemoteSettingsService(databasePath, RemoteSettingsConfig2(server = server, appContext = appContext)) + RemoteSettingsService() /* no-op */ } } diff --git a/mobile/android/fenix/app/build.gradle b/mobile/android/fenix/app/build.gradle @@ -101,6 +101,8 @@ android { buildConfigField "String[]", "SUPPORTED_LOCALE_ARRAY", getSupportedLocales() buildConfigField "boolean", "IS_BENCHMARK_BUILD", "false" + + buildConfigField "boolean", "DATA_COLLECTION_DISABLED", "true" } def releaseTemplate = { @@ -308,6 +310,8 @@ android.applicationVariants.configureEach { variant -> // ------------------------------------------------------------------------------------------------- def isDebug = variant.buildType.resValues['bool/IS_DEBUG']?.value ?: false + def isDataCollectionDisabled = variant.buildType.buildConfigFields['DATA_COLLECTION_DISABLED']?.value ?: true + def isDebugOrDCD = isDebug || isDataCollectionDisabled def useReleaseVersioning = variant.buildType.buildConfigFields['USE_RELEASE_VERSIONING']?.value ?: false project.logger.debug("----------------------------------------------") @@ -315,7 +319,7 @@ android.applicationVariants.configureEach { variant -> project.logger.debug("Application ID: " + [variant.applicationId, variant.buildType.applicationIdSuffix].findAll().join()) project.logger.debug("Build type: " + variant.buildType.name) project.logger.debug("Flavor: " + variant.flavorName) - project.logger.debug("Telemetry enabled: " + !isDebug) + project.logger.debug("Telemetry enabled: " + !isDebugOrDCD) if (useReleaseVersioning) { // The Google Play Store does not allow multiple APKs for the same app that all have the @@ -353,7 +357,7 @@ android.applicationVariants.configureEach { variant -> // ------------------------------------------------------------------------------------------------- buildConfigField 'String', 'SENTRY_TOKEN', 'null' - if (!isDebug) { + if (!isDebugOrDCD) { buildConfigField 'boolean', 'CRASH_REPORTING', 'true' // Reading sentry token from local file (if it exists). In a release task on taskcluster it will be available. try { @@ -364,7 +368,7 @@ android.applicationVariants.configureEach { variant -> buildConfigField 'boolean', 'CRASH_REPORTING', 'false' } - if (!isDebug) { + if (!isDebugOrDCD) { buildConfigField 'boolean', 'TELEMETRY', 'true' } else { buildConfigField 'boolean', 'TELEMETRY', 'false' @@ -630,7 +634,6 @@ dependencies { implementation ComponentsDependencies.mozilla_appservices_syncmanager implementation libs.accompanist.drawablepainter - implementation libs.adjust implementation libs.androidx.activity implementation libs.androidx.activity.ktx implementation libs.androidx.annotation @@ -684,7 +687,6 @@ dependencies { implementation libs.mozilla.glean implementation libs.play.review implementation libs.play.review.ktx - implementation libs.play.services.ads.id implementation libs.protobuf.javalite implementation libs.sentry diff --git a/mobile/android/fenix/app/src/beta/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/beta/res/xml/shortcuts.xml @@ -4,6 +4,7 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- <shortcut android:shortcutId="password_manager" android:enabled="true" @@ -34,4 +35,5 @@ android:targetPackage="org.mozilla.firefox_beta" android:targetClass="org.mozilla.fenix.IntentReceiverActivity" /> </shortcut> + --> </shortcuts> diff --git a/mobile/android/fenix/app/src/debug/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/debug/res/xml/shortcuts.xml @@ -4,6 +4,7 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- <shortcut android:shortcutId="password_manager" android:enabled="true" @@ -34,4 +35,5 @@ android:targetPackage="org.mozilla.fenix.debug" android:targetClass="org.mozilla.fenix.IntentReceiverActivity" /> </shortcut> + --> </shortcuts> diff --git a/mobile/android/fenix/app/src/main/AndroidManifest.xml b/mobile/android/fenix/app/src/main/AndroidManifest.xml @@ -7,7 +7,6 @@ xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Allows for storing and retrieving screenshots --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" @@ -15,8 +14,6 @@ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" /> - <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> - <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CAMERA" /> <!-- This is needed because the android.permission.CAMERA above automatically @@ -33,6 +30,9 @@ <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.USE_BIOMETRIC" /> + <!-- tor-browser#43729: Disable access to the advertising ID --> + <uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove" /> + <!-- Needed to prompt the user to give permission to install a downloaded apk --> <uses-permission-sdk-23 android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> @@ -507,6 +507,7 @@ android:exported="true" android:configChanges="keyboard|keyboardHidden|mcc|mnc|orientation|screenSize|layoutDirection|smallestScreenSize|screenLayout" android:launchMode="singleTask" + android:taskAffinity="" android:resizeableActivity="true" android:supportsPictureInPicture="true" android:windowSoftInputMode="adjustResize"> @@ -599,11 +600,13 @@ <data android:mimeType="application/xhtml+xml" /> </intent-filter> +<!-- <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> +--> <intent-filter> <action android:name="android.intent.action.SEARCH" /> @@ -759,6 +762,7 @@ <service android:name=".push.FirebasePushService" + android:enabled="false" android:exported="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> @@ -783,13 +787,19 @@ <meta-data android:name="firebase_messaging_auto_init_enabled" - android:value="true" /> + android:value="false" /> <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" /> <meta-data android:name="firebase_analytics_collection_deactivated" android:value="true" /> + <meta-data + android:name="google_analytics_adid_collection_enabled" + android:value="false" /> + <meta-data + android:name="google_analytics_default_allow_ad_personalization_signals" + android:value="false" /> <!-- Removes the default Workmanager initialization so that we can use on-demand initializer. --> <provider android:name="androidx.startup.InitializationProvider" diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt @@ -217,6 +217,11 @@ open class FenixApplication : LocaleAwareApplication(), Provider { // when this method returns. @OptIn(DelicateCoroutinesApi::class) // GlobalScope usage private fun maybeInitializeGlean() { + if (!settings().isTelemetryEnabled) { + logger.debug("Preventing Glean from initializing, since telemetry is disabled") + return + } + // We delay the Glean initialization until we have user consent from onboarding. // If onboarding is disabled (when in local builds), continue to initialize Glean. if (components.fenixOnboarding.userHasBeenOnboarded() || !FeatureFlags.onboardingFeatureEnabled) { @@ -1118,8 +1123,6 @@ open class FenixApplication : LocaleAwareApplication(), Provider { @OptIn(DelicateCoroutinesApi::class) open fun downloadWallpapers() { - GlobalScope.launch { - components.useCases.wallpaperUseCases.initialize() - } + // IN TOR BROWSER: we don't download wallpapers. } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -310,7 +310,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { OpenSpecificTabIntentProcessor(this), OpenPasswordManagerIntentProcessor(), OpenRecentlyClosedIntentProcessor(), - ReEngagementIntentProcessor(this, settings()), + //ReEngagementIntentProcessor(this, settings()), ) } @@ -419,34 +419,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity { } } - SplashScreenManager( - splashScreenOperation = if (FxNimbus.features.splashScreen.value().offTrainOnboarding) { - ApplyExperimentsOperation( - storage = DefaultExperimentsOperationStorage(components.settings), - nimbus = components.nimbus.sdk, - ) - } else { - FetchExperimentsOperation( - storage = DefaultExperimentsOperationStorage(components.settings), - nimbus = components.nimbus.sdk, - ) - }, - scope = lifecycleScope, - splashScreenTimeout = FxNimbus.features.splashScreen.value().maximumDurationMs.toLong(), - storage = DefaultSplashScreenStorage(components.settings), - showSplashScreen = { installSplashScreen().setKeepOnScreenCondition(it) }, - onSplashScreenFinished = { result -> - if (result.sendTelemetry) { - SplashScreen.firstLaunchExtended.record( - SplashScreen.FirstLaunchExtendedExtra(dataFetched = result.wasDataFetched), - ) - } - - if (savedInstanceState == null && shouldShowOnboarding) { - navHost.navController.navigate(NavGraphDirections.actionGlobalOnboarding()) - } - }, - ).showSplashScreen() + // tor-browser#43730: Do not delay splash screen + // to fetch or apply Nimbus experiments. lifecycleScope.launch { val debugSettingsRepository = DefaultDebugSettingsRepository( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -172,7 +172,7 @@ import org.mozilla.fenix.components.Components import org.mozilla.fenix.components.FenixAutocompletePrompt import org.mozilla.fenix.components.FenixSuggestStrongPasswordPrompt import org.mozilla.fenix.components.FindInPageIntegration -import org.mozilla.fenix.components.accounts.FxaWebChannelIntegration +// import org.mozilla.fenix.components.accounts.FxaWebChannelIntegration import org.mozilla.fenix.components.appstate.AppAction import org.mozilla.fenix.components.appstate.AppAction.MessagingAction import org.mozilla.fenix.components.appstate.AppAction.MessagingAction.MicrosurveyAction @@ -335,7 +335,7 @@ abstract class BaseBrowserFragment : protected val hideToolbarFeature = ViewBoundFeatureWrapper<WebAppHideToolbarFeature>() private val swipeRefreshFeature = ViewBoundFeatureWrapper<SwipeRefreshFeature>() - private val webchannelIntegration = ViewBoundFeatureWrapper<FxaWebChannelIntegration>() + // private val webchannelIntegration = ViewBoundFeatureWrapper<FxaWebChannelIntegration>() private val sitePermissionWifiIntegration = ViewBoundFeatureWrapper<SitePermissionsWifiIntegration>() private val secureWindowFeature = ViewBoundFeatureWrapper<SecureWindowFeature>() @@ -1394,6 +1394,7 @@ abstract class BaseBrowserFragment : ) } +/* webchannelIntegration.set( feature = FxaWebChannelIntegration( customTabSessionId = customTabSessionId, @@ -1406,6 +1407,7 @@ abstract class BaseBrowserFragment : owner = this, view = view, ) +*/ initializeEngineView( topToolbarHeight = getTopToolbarHeight( diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Analytics.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Analytics.kt @@ -134,7 +134,7 @@ class Analytics( appName = context.getString(R.string.app_name), organizationName = "Mozilla", ), - enabled = true, + enabled = !isDataColectionDisabled(), nonFatalCrashIntent = pendingIntent, useLegacyReporting = context.settings().crashReportOption() != CrashReportOption.Auto && @@ -186,6 +186,7 @@ class Analytics( } } +fun isDataColectionDisabled() = BuildConfig.DATA_COLLECTION_DISABLED private fun isSentryEnabled() = !BuildConfig.SENTRY_TOKEN.isNullOrEmpty() private fun getSentryProjectUrl(): String? { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt @@ -298,10 +298,6 @@ class Components(private val context: Context) { controller = nimbus.messaging, settings = settings, ), - MetricsMiddleware( - metrics = analytics.metrics, - nimbusEventStore = nimbus.events, - ), CrashReportingAppMiddleware( CrashMiddleware( cache = SettingsCrashReportCache(settings), diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Core.kt @@ -62,14 +62,14 @@ import mozilla.components.feature.recentlyclosed.RecentlyClosedTabsStorage import mozilla.components.feature.search.SearchApplicationName import mozilla.components.feature.search.SearchDeviceType import mozilla.components.feature.search.SearchUpdateChannel -import mozilla.components.feature.search.middleware.AdsTelemetryMiddleware +// import mozilla.components.feature.search.middleware.AdsTelemetryMiddleware import mozilla.components.feature.search.middleware.SearchExtraParams import mozilla.components.feature.search.middleware.SearchMiddleware import mozilla.components.feature.search.region.RegionMiddleware import mozilla.components.feature.search.storage.SearchEngineSelectorConfig -import mozilla.components.feature.search.telemetry.SerpTelemetryRepository -import mozilla.components.feature.search.telemetry.ads.AdsTelemetry -import mozilla.components.feature.search.telemetry.incontent.InContentTelemetry +// import mozilla.components.feature.search.telemetry.SerpTelemetryRepository +// import mozilla.components.feature.search.telemetry.ads.AdsTelemetry +// import mozilla.components.feature.search.telemetry.incontent.InContentTelemetry import mozilla.components.feature.session.HistoryDelegate import mozilla.components.feature.session.middleware.LastAccessMiddleware import mozilla.components.feature.session.middleware.undo.UndoMiddleware @@ -181,7 +181,7 @@ class Core( cookieBannerHandlingDetectOnlyMode = context.settings().shouldEnableCookieBannerDetectOnly, cookieBannerHandlingGlobalRules = context.settings().shouldEnableCookieBannerGlobalRules, cookieBannerHandlingGlobalRulesSubFrames = context.settings().shouldEnableCookieBannerGlobalRulesSubFrame, - emailTrackerBlockingPrivateBrowsing = true, + emailTrackerBlockingPrivateBrowsing = false, userCharacteristicPingCurrentVersion = FxNimbus.features.userCharacteristics.value().currentVersion, getDesktopMode = { store.state.desktopMode @@ -330,7 +330,7 @@ class Core( }, ), ReaderViewMiddleware(), - TelemetryMiddleware(context, context.settings(), metrics, crashReporter), + // TelemetryMiddleware(context, context.settings(), metrics, crashReporter), ThumbnailsMiddleware(thumbnailStorage), UndoMiddleware(context.getUndoDelay()), RegionMiddleware(context, locationService), @@ -343,7 +343,7 @@ class Core( ), RecordingDevicesMiddleware(context, context.components.notificationsDelegate), PromptMiddleware(), - AdsTelemetryMiddleware(adsTelemetry), + // AdsTelemetryMiddleware(adsTelemetry), LastMediaAccessMiddleware(), HistoryMetadataMiddleware(historyMetadataService), SessionPrioritizationMiddleware(), @@ -386,6 +386,7 @@ class Core( // Install the "icons" WebExtension to automatically load icons for every visited website. icons.install(engine, this) +/* CoroutineScope(Dispatchers.Main).launch { val readJson = { context.assets.readJSONObject("search/search_telemetry_v2.json") } val providerList = withContext(Dispatchers.IO) { @@ -405,6 +406,7 @@ class Core( // Install the "cookies" WebExtension and tracks user interaction with SERPs. searchTelemetry.install(engine, this@apply, providerList) } +*/ WebNotificationFeature( context, @@ -465,13 +467,13 @@ class Core( context.components.analytics.metrics } - val adsTelemetry by lazyMonitored { - AdsTelemetry() - } + // val adsTelemetry by lazyMonitored { + // AdsTelemetry() + // } - val searchTelemetry by lazyMonitored { - InContentTelemetry() - } + // val searchTelemetry by lazyMonitored { + // InContentTelemetry() + // } /** * Shortcut component for managing shortcuts on the device home screen. diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/ActivationPing.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/ActivationPing.kt @@ -9,7 +9,6 @@ import android.content.SharedPreferences import android.util.Base64 import androidx.annotation.VisibleForTesting import androidx.core.content.edit -import com.google.android.gms.ads.identifier.AdvertisingIdClient import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -59,16 +58,14 @@ class ActivationPing( * Fills the metrics and triggers the 'activation' ping. * This is a separate function to simplify unit-testing. */ + @Suppress("SENSELESS_COMPARISON") @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal fun triggerPing() { // Generate the activation_id. Activation.activationId.generateAndSet() CoroutineScope(backgroundDispatcher).launch { - val hashedId = getHashedIdentifier( - retrieveAdvertisingIdInfo = { AdvertisingIdClient.getAdvertisingIdInfo(context).id }, - encodeToString = Base64::encodeToString, - ) + val hashedId = null if (hashedId != null) { Logger.info("ActivationPing - generating ping with the hashed id") // We have a valid, hashed Google Advertising ID. diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt @@ -6,11 +6,6 @@ package org.mozilla.fenix.components.metrics import android.app.Application import androidx.annotation.VisibleForTesting -import com.adjust.sdk.Adjust -import com.adjust.sdk.AdjustConfig -import com.adjust.sdk.AdjustEvent -import com.adjust.sdk.Constants.ADJUST_PREINSTALL_SYSTEM_PROPERTY_PATH -import com.adjust.sdk.LogLevel import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -35,93 +30,16 @@ class AdjustMetricsService( @Suppress("CognitiveComplexMethod") override fun start() { - val settings = application.components.settings - - if ((BuildConfig.ADJUST_TOKEN.isNullOrBlank())) { - logger.info("No adjust token defined") - - if (Config.channel.isReleased) { - throw IllegalStateException("No adjust token defined for release build") - } - - return - } - - if (alreadyKnown(settings)) { - logger.info("Attribution already retrieved") - return - } - - System.setProperty(ADJUST_PREINSTALL_SYSTEM_PROPERTY_PATH, "/preload/etc/adjust.preinstall") - - val config = AdjustConfig( - application, - BuildConfig.ADJUST_TOKEN, - AdjustConfig.ENVIRONMENT_PRODUCTION, - true, - ) - config.enablePreinstallTracking() - - val distributionIdManager = application.components.distributionIdManager - - // If we skipped the marketing consent screen, enable COPPA compliance to prevent - // personal identifiers from being shared with Adjust. - if (distributionIdManager.shouldSkipMarketingConsentScreen()) { - config.enableCoppaCompliance() - } - - val timerId = AdjustAttribution.adjustAttributionTime.start() - config.setOnAttributionChangedListener { - AdjustAttribution.adjustAttributionTime.stopAndAccumulate(timerId) - - if (!it.network.isNullOrEmpty()) { - settings.adjustNetwork = it.network - AdjustAttribution.network.set(it.network) - } - if (!it.adgroup.isNullOrEmpty()) { - settings.adjustAdGroup = it.adgroup - AdjustAttribution.adgroup.set(it.adgroup) - } - if (!it.creative.isNullOrEmpty()) { - settings.adjustCreative = it.creative - AdjustAttribution.creative.set(it.creative) - } - if (!it.campaign.isNullOrEmpty()) { - settings.adjustCampaignId = it.campaign - AdjustAttribution.campaign.set(it.campaign) - } - - triggerPing() - } - - config.setLogLevel(LogLevel.SUPPRESS) - - Adjust.initSdk(config) - Adjust.enable() - logger.info("Adjust SDK enabled") + /* noop */ } override fun stop() { - Adjust.disable() - Adjust.gdprForgetMe(application.applicationContext) + /* noop */ } @Suppress("TooGenericExceptionCaught") override fun track(event: Event) { - CoroutineScope(dispatcher).launch { - try { - if (event is Event.GrowthData) { - if (storage.shouldTrack(event)) { - Adjust.trackEvent(AdjustEvent(event.tokenName)) - storage.updateSentState(event) - } else { - storage.updatePersistentState(event) - } - } - } catch (e: Exception) { - crashReporter.submitCaughtException(e) - } - } + /* noop */ } override fun shouldTrack(event: Event): Boolean = @@ -130,14 +48,12 @@ class AdjustMetricsService( companion object { @VisibleForTesting internal fun alreadyKnown(settings: Settings): Boolean { - return settings.adjustCampaignId.isNotEmpty() || settings.adjustNetwork.isNotEmpty() || - settings.adjustCreative.isNotEmpty() || settings.adjustAdGroup.isNotEmpty() + /* noop */ + return false } private fun triggerPing() { - CoroutineScope(Dispatchers.IO).launch { - Pings.adjustAttribution.submit() - } + /* noop */ } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/GleanMetricsService.kt @@ -8,6 +8,7 @@ import android.content.Context import mozilla.components.support.base.log.logger.Logger import mozilla.components.support.utils.RunWhenReadyQueue import mozilla.telemetry.glean.Glean +import org.mozilla.fenix.BuildConfig import org.mozilla.fenix.GleanMetrics.Pings import org.mozilla.fenix.ext.components @@ -36,6 +37,9 @@ private class EventWrapper<T : Enum<T>>( } fun track(event: Event) { + if (BuildConfig.DATA_COLLECTION_DISABLED) { + return + } val extras = if (keyMapper != null) { event.extras?.mapKeys { (key) -> keyMapper.invoke(key.toString().asCamelCase()) @@ -70,6 +74,12 @@ class GleanMetricsService( private val activationPing = ActivationPing(context) override fun start() { + if (BuildConfig.DATA_COLLECTION_DISABLED) { + Logger.debug("Data collection is disabled, not initializing Glean.") + initialized = true + return + } + logger.debug("Enabling Glean.") // Initialization of Glean already happened in FenixApplication. Glean.setCollectionEnabled(true) @@ -96,10 +106,12 @@ class GleanMetricsService( } override fun track(event: Event) { - event.wrapper?.track(event) + if (!BuildConfig.DATA_COLLECTION_DISABLED) { + event.wrapper?.track(event) + } } override fun shouldTrack(event: Event): Boolean { - return event.wrapper != null + return !BuildConfig.DATA_COLLECTION_DISABLED && event.wrapper != null } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/MetricController.kt @@ -602,11 +602,12 @@ internal class ReleaseMetricController( private fun isInitialized(type: MetricServiceType): Boolean = initialized.contains(type) - private fun isTelemetryEnabled(type: MetricServiceType): Boolean = when (type) { - MetricServiceType.Data -> isDataTelemetryEnabled() - MetricServiceType.Marketing -> isMarketingDataTelemetryEnabled() - MetricServiceType.UsageReporting -> isUsageTelemetryEnabled() - } + private fun isTelemetryEnabled(type: MetricServiceType): Boolean = + !BuildConfig.DATA_COLLECTION_DISABLED && when (type) { + MetricServiceType.Data -> isDataTelemetryEnabled() + MetricServiceType.Marketing -> isMarketingDataTelemetryEnabled() + MetricServiceType.UsageReporting -> isUsageTelemetryEnabled() + } companion object { /** diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/MetricsUtils.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/metrics/MetricsUtils.kt @@ -6,8 +6,6 @@ package org.mozilla.fenix.components.metrics import android.util.Base64 import androidx.annotation.VisibleForTesting -import com.google.android.gms.common.GooglePlayServicesNotAvailableException -import com.google.android.gms.common.GooglePlayServicesRepairableException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import mozilla.components.browser.state.search.SearchEngine @@ -170,14 +168,8 @@ object MetricsUtils { */ @Suppress("TooGenericExceptionCaught") @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - internal fun getAdvertisingID(retrieveAdvertisingIdInfo: () -> String?): String? { + internal fun getAdvertisingID(@Suppress("UNUSED_PARAMETER") retrieveAdvertisingIdInfo: () -> String?): String? { return try { - retrieveAdvertisingIdInfo() - } catch (e: GooglePlayServicesNotAvailableException) { - Logger.debug("getAdvertisingID() - Google Play not installed on the device") - null - } catch (e: GooglePlayServicesRepairableException) { - Logger.debug("getAdvertisingID() - recoverable error connecting to Google Play Services") null } catch (e: IllegalStateException) { // This is unlikely to happen, as this should be running off the main thread. diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt @@ -203,11 +203,9 @@ open class DefaultToolbarMenu( */ @VisibleForTesting(otherwise = PRIVATE) fun shouldShowTranslations(): Boolean { - val isEngineSupported = store.state.translationEngine.isEngineSupported - return selectedSession?.let { - isEngineSupported == true && - FxNimbus.features.translations.value().mainFlowBrowserMenuEnabled - } ?: false + // We need this because in FxNimbus.kt, mainFlowToolbarEnabled defaults to true + // ```mainFlowToolbarEnabled: Boolean = true``` + return false // bug_44304 Hide broken translat page action. } /** @@ -284,12 +282,12 @@ open class DefaultToolbarMenu( onItemTapped.invoke(ToolbarMenu.Item.RequestDesktop(checked)) } - private val openInRegularTabItem = BrowserMenuImageText( - label = context.getString(R.string.browser_menu_open_in_regular_tab), - imageResource = R.drawable.ic_open_in_regular_tab, - ) { - onItemTapped.invoke(ToolbarMenu.Item.OpenInRegularTab) - } + // private val openInRegularTabItem = BrowserMenuImageText( + // label = context.getString(R.string.browser_menu_open_in_regular_tab), + // imageResource = R.drawable.ic_open_in_regular_tab, + // ) { + // onItemTapped.invoke(ToolbarMenu.Item.OpenInRegularTab) + // } private val customizeReaderView = BrowserMenuImageText( label = context.getString(R.string.browser_menu_customize_reader_view), @@ -446,7 +444,7 @@ open class DefaultToolbarMenu( findInPageItem, translationsItem.apply { visible = ::shouldShowTranslations }, desktopSiteItem.apply { visible = { store.state.selectedTab?.content?.isPdf == false } }, - openInRegularTabItem.apply { visible = ::shouldShowOpenInRegularTab }, + // openInRegularTabItem.apply { visible = ::shouldShowOpenInRegularTab }, customizeReaderView.apply { visible = ::shouldShowReaderViewCustomization }, openInApp.apply { visible = ::shouldShowOpenInApp }, reportBrokenSite.apply { visible = ::shouldShowWebCompatReporter }, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/intent/HomeDeepLinkIntentProcessor.kt @@ -118,6 +118,15 @@ class HomeDeepLinkIntentProcessor( logger.info("Not opening deep link: $url") return } + if (BuildConfig.DEEP_LINK_SCHEME.startsWith("torbrowser")) { + // tor-browser#42578 + // TODO: + // Maybe just warn users about linkability but + // give them the choice to open anyway, once + // the other deep link related issues are fixed. + logger.info("Tor Browser rejects open intent deep link: $deepLink") + return + } activity.openToBrowserAndLoad( url, diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/PhoneFeature.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/PhoneFeature.kt @@ -55,7 +55,7 @@ enum class PhoneFeature(val androidPermissionsList: Array<String>) : Parcelable AUTOPLAY_AUDIBLE -> when (settings?.getAutoplayUserSetting() ?: AUTOPLAY_BLOCK_ALL) { AUTOPLAY_ALLOW_ALL -> R.string.preference_option_autoplay_allowed2 - AUTOPLAY_ALLOW_ON_WIFI -> R.string.preference_option_autoplay_allowed_wifi_only2 + // AUTOPLAY_ALLOW_ON_WIFI -> R.string.preference_option_autoplay_allowed_wifi_only2 AUTOPLAY_BLOCK_AUDIBLE -> R.string.preference_option_autoplay_block_audio2 AUTOPLAY_BLOCK_ALL -> R.string.preference_option_autoplay_blocked3 else -> R.string.preference_option_autoplay_blocked3 @@ -169,6 +169,7 @@ enum class PhoneFeature(val androidPermissionsList: Array<String>) : Parcelable return when (this) { AUTOPLAY_AUDIBLE -> SitePermissionsRules.Action.BLOCKED AUTOPLAY_INAUDIBLE -> SitePermissionsRules.Action.ALLOWED + LOCATION -> SitePermissionsRules.Action.BLOCKED else -> SitePermissionsRules.Action.ASK_TO_ALLOW } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt @@ -172,8 +172,7 @@ class SettingsFragment : PreferenceFragmentCompat() { findPreference<Preference>( getPreferenceKey(R.string.pref_key_translation), - )?.isVisible = FxNimbus.features.translations.value().globalSettingsEnabled && - components.core.store.state.translationEngine.isEngineSupported == true + )?.isVisible = false } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -294,12 +293,12 @@ class SettingsFragment : PreferenceFragmentCompat() { requirePreference<Preference>(R.string.pref_key_tabs) tabSettingsPreference.summary = settings.getTabTimeoutString() - val autofillPreference = requirePreference<Preference>(R.string.pref_key_credit_cards) - autofillPreference.title = if (settings.addressFeature) { - getString(R.string.preferences_autofill) - } else { - getString(R.string.preferences_credit_cards_2) - } +// val autofillPreference = requirePreference<Preference>(R.string.pref_key_credit_cards) +// autofillPreference.title = if (settings.addressFeature) { +// getString(R.string.preferences_autofill) +// } else { +// getString(R.string.preferences_credit_cards_2) +// } val openLinksInAppsSettingsPreference = requirePreference<Preference>(R.string.pref_key_open_links_in_apps) @@ -364,10 +363,10 @@ class SettingsFragment : PreferenceFragmentCompat() { SettingsFragmentDirections.actionSettingsFragmentToSavedLoginsAuthFragment() } - resources.getString(R.string.pref_key_credit_cards) -> { - SettingsMetrics.autofill.record() - SettingsFragmentDirections.actionSettingsFragmentToAutofillSettingFragment() - } +// resources.getString(R.string.pref_key_credit_cards) -> { +// SettingsMetrics.autofill.record() +// SettingsFragmentDirections.actionSettingsFragmentToAutofillSettingFragment() +// } resources.getString(R.string.pref_key_accessibility) -> { SettingsFragmentDirections.actionSettingsFragmentToAccessibilityFragment() @@ -784,8 +783,10 @@ class SettingsFragment : PreferenceFragmentCompat() { @VisibleForTesting internal fun setLinkSharingPreference() { - with(requirePreference<Preference>(R.string.pref_key_link_sharing)) { - isVisible = FxNimbus.features.sentFromFirefox.value().enabled + if (requireContext().settings().isTelemetryEnabled) { + with(requirePreference<Preference>(R.string.pref_key_link_sharing)) { + isVisible = FxNimbus.features.sentFromFirefox.value().enabled + } } } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineFragment.kt @@ -38,16 +38,6 @@ class SearchEngineFragment : PreferenceFragmentCompat() { rootKey, ) - requirePreference<SwitchPreference>(R.string.pref_key_show_sponsored_suggestions).apply { - isVisible = context.settings().enableFxSuggest - } - requirePreference<SwitchPreference>(R.string.pref_key_show_nonsponsored_suggestions).apply { - isVisible = context.settings().enableFxSuggest - } - requirePreference<Preference>(R.string.pref_key_learn_about_fx_suggest).apply { - isVisible = context.settings().enableFxSuggest - } - view?.hideKeyboard() } @@ -70,86 +60,25 @@ class SearchEngineFragment : PreferenceFragmentCompat() { isChecked = context.settings().shouldShowSearchSuggestions } - val trendingSearchSuggestionsPreference = - requirePreference<CheckBoxPreference>(R.string.pref_key_show_trending_search_suggestions).apply { - isChecked = context.settings().trendingSearchSuggestionsEnabled - isEnabled = getSelectedSearchEngine(requireContext())?.trendingUrl != null && - context.settings().shouldShowSearchSuggestions - } - - val recentSearchSuggestionsPreference = - requirePreference<SwitchPreference>(R.string.pref_key_show_recent_search_suggestions).apply { - isChecked = context.settings().shouldShowRecentSearchSuggestions - } - val autocompleteURLsPreference = requirePreference<SwitchPreference>(R.string.pref_key_enable_autocomplete_urls).apply { isChecked = context.settings().shouldAutocompleteInAwesomebar } - val searchSuggestionsInPrivatePreference = - requirePreference<CheckBoxPreference>(R.string.pref_key_show_search_suggestions_in_private).apply { - isChecked = context.settings().shouldShowSearchSuggestionsInPrivate - isEnabled = context.settings().shouldShowSearchSuggestions - } - - val showHistorySuggestions = - requirePreference<SwitchPreference>(R.string.pref_key_search_browsing_history).apply { - isChecked = context.settings().shouldShowHistorySuggestions - } - val showBookmarkSuggestions = requirePreference<SwitchPreference>(R.string.pref_key_search_bookmarks).apply { isChecked = context.settings().shouldShowBookmarkSuggestions } - val showSyncedTabsSuggestions = - requirePreference<SwitchPreference>(R.string.pref_key_search_synced_tabs).apply { - isChecked = context.settings().shouldShowSyncedTabsSuggestions - } - val showClipboardSuggestions = requirePreference<SwitchPreference>(R.string.pref_key_show_clipboard_suggestions).apply { isChecked = context.settings().shouldShowClipboardSuggestions } - val showSponsoredSuggestionsPreference = - requirePreference<SwitchPreference>(R.string.pref_key_show_sponsored_suggestions).apply { - isChecked = context.settings().showSponsoredSuggestions - summary = getString( - R.string.preferences_show_sponsored_suggestions_summary, - getString(R.string.app_name), - ) - } - - val showNonSponsoredSuggestionsPreference = - requirePreference<SwitchPreference>(R.string.pref_key_show_nonsponsored_suggestions).apply { - isChecked = context.settings().showNonSponsoredSuggestions - title = getString( - R.string.preferences_show_nonsponsored_suggestions, - getString(R.string.app_name), - ) - } - searchSuggestionsPreference.onPreferenceChangeListener = SharedPreferenceUpdater() - showHistorySuggestions.onPreferenceChangeListener = SharedPreferenceUpdater() showBookmarkSuggestions.onPreferenceChangeListener = SharedPreferenceUpdater() - showSyncedTabsSuggestions.onPreferenceChangeListener = SharedPreferenceUpdater() showClipboardSuggestions.onPreferenceChangeListener = SharedPreferenceUpdater() - searchSuggestionsInPrivatePreference.onPreferenceChangeListener = SharedPreferenceUpdater() - trendingSearchSuggestionsPreference.onPreferenceChangeListener = SharedPreferenceUpdater() - recentSearchSuggestionsPreference.onPreferenceChangeListener = SharedPreferenceUpdater() autocompleteURLsPreference.onPreferenceChangeListener = SharedPreferenceUpdater() - - searchSuggestionsPreference.setOnPreferenceClickListener { - searchSuggestionsInPrivatePreference.isEnabled = searchSuggestionsPreference.isChecked - trendingSearchSuggestionsPreference.isEnabled = - getSelectedSearchEngine(requireContext())?.trendingUrl != null && searchSuggestionsPreference.isChecked - true - } - - showSponsoredSuggestionsPreference.onPreferenceChangeListener = SharedPreferenceUpdater() - showNonSponsoredSuggestionsPreference.onPreferenceChangeListener = SharedPreferenceUpdater() } /** diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManagePhoneFeatureFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SitePermissionsManagePhoneFeatureFragment.kt @@ -120,6 +120,7 @@ class SitePermissionsManagePhoneFeatureFragment : Fragment() { saveActionInSettings(AUTOPLAY_ALLOW_ON_WIFI) } restoreState(AUTOPLAY_ALLOW_ON_WIFI) + visibility = View.GONE } else { text = getString(R.string.preference_option_phone_feature_blocked) setOnClickListener { diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SiteSettingsFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/sitepermissions/SiteSettingsFragment.kt @@ -97,6 +97,7 @@ class SiteSettingsFragment : PreferenceFragmentCompat() { PhoneFeature.LOCAL_NETWORK_ACCESS, ), ) + .filter { it != PhoneFeature.LOCATION } .forEach(::initPhoneFeature) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/ShareFragment.kt @@ -40,7 +40,6 @@ class ShareFragment : AppCompatDialogFragment() { } private lateinit var shareInteractor: ShareInteractor private lateinit var shareCloseView: ShareCloseView - private lateinit var shareToAccountDevicesView: ShareToAccountDevicesView private lateinit var shareToAppsView: ShareToAppsView override fun onAttach(context: Context) { @@ -106,9 +105,6 @@ class ShareFragment : AppCompatDialogFragment() { ) binding.shareWrapper.setOnClickListener { shareInteractor.onShareClosed() } - shareToAccountDevicesView = - ShareToAccountDevicesView(binding.devicesShareLayout, shareInteractor) - if (args.showPage) { // Show the previous fragment underneath the share background scrim // by making it translucent. @@ -147,9 +143,6 @@ class ShareFragment : AppCompatDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel.devicesList.observe(viewLifecycleOwner) { devicesShareOptions -> - shareToAccountDevicesView.setShareTargets(devicesShareOptions) - } viewModel.appsList.observe(viewLifecycleOwner) { appsToShareTo -> shareToAppsView.setShareTargets(appsToShareTo) } diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/shortcut/PwaOnboardingObserver.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/shortcut/PwaOnboardingObserver.kt @@ -44,12 +44,13 @@ class PwaOnboardingObserver( it.content.webAppManifest } .collect { + @SuppressWarnings("CollapsibleIfStatements") if ( webAppUseCases.isInstallable() && !settings.userKnowsAboutPwas && settings.lastKnownMode == BrowsingMode.Normal ) { - settings.incrementVisitedInstallableCount() + // settings.incrementVisitedInstallableCount() if (settings.shouldShowPwaCfr) { navigateToPwaOnboarding() settings.lastCfrShownTimeInMillis = System.currentTimeMillis() diff --git a/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt b/mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt @@ -564,7 +564,7 @@ class Settings( var isTelemetryEnabled by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_telemetry), - default = true, + default = BuildConfig.DATA_COLLECTION_DISABLED == false ) var isMarketingTelemetryEnabled by booleanPreference( @@ -760,7 +760,7 @@ class Settings( val shouldShowSyncedTabsSuggestions by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_search_synced_tabs), - default = true, + default = false, ) val shouldShowClipboardSuggestions by booleanPreference( @@ -931,7 +931,7 @@ class Settings( */ var showFirstTimeTranslation: Boolean by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_show_first_time_translation), - default = true, + default = false, ) /** @@ -939,7 +939,7 @@ class Settings( */ var offerTranslation: Boolean by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_translations_offer), - default = true, + default = false, ) /** @@ -1058,7 +1058,7 @@ class Settings( var shouldUseTrackingProtection by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_tracking_protection), - default = true, + default = false ) var shouldEnableGlobalPrivacyControl by booleanPreference( @@ -1068,17 +1068,17 @@ class Settings( var shouldUseCookieBannerPrivateMode by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_cookie_banner_private_mode), - default = { shouldUseCookieBannerPrivateModeDefaultValue }, + default = { false /* shouldUseCookieBannerPrivateModeDefaultValue */ }, ) val shouldUseCookieBannerPrivateModeDefaultValue: Boolean - get() = cookieBannersSection[CookieBannersSection.FEATURE_SETTING_VALUE_PBM] == 1 + get() = false // cookieBannersSection[CookieBannersSection.FEATURE_SETTING_VALUE_PBM] == 1 val shouldUseCookieBanner: Boolean - get() = cookieBannersSection[CookieBannersSection.FEATURE_SETTING_VALUE] == 1 + get() = false // cookieBannersSection[CookieBannersSection.FEATURE_SETTING_VALUE] == 1 val shouldShowCookieBannerUI: Boolean - get() = cookieBannersSection[CookieBannersSection.FEATURE_UI] == 1 + get() = false // cookieBannersSection[CookieBannersSection.FEATURE_UI] == 1 val shouldEnableCookieBannerDetectOnly: Boolean get() = cookieBannersSection[CookieBannersSection.FEATURE_SETTING_DETECT_ONLY] == 1 @@ -1513,7 +1513,7 @@ class Settings( */ internal var trendingSearchSuggestionsEnabled by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_show_trending_search_suggestions), - default = true, + default = false, ) /** @@ -1521,7 +1521,7 @@ class Settings( */ internal var shouldShowRecentSearchSuggestions by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_show_recent_search_suggestions), - default = true, + default = false, ) var showSearchSuggestionsInPrivateOnboardingFinished by booleanPreference( @@ -2037,7 +2037,7 @@ class Settings( */ var shouldAutofillCreditCardDetails by booleanPreference( appContext.getPreferenceKey(R.string.pref_key_credit_cards_save_and_autofill_cards), - default = true, + default = BuildConfig.DATA_COLLECTION_DISABLED == false, ) /** @@ -2206,7 +2206,10 @@ class Settings( var shouldUseMinimalBottomToolbarWhenEnteringText by booleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_use_minimal_bottom_toolbar_while_entering_text), - default = { FxNimbus.features.minimalAddressbar.value().atBottomWhileEnteringText }, + // tb-43918 + // Setting to off for esr140 since we've done no work for it, but it appears moz has enabled + // by default in 144 so we'll likely be switching this to true and porting to it for esr-next + default = { false }, ) /** @@ -2387,7 +2390,7 @@ class Settings( */ var enableUnifiedTrustPanel by booleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_enable_unified_trust_panel), - default = { FxNimbus.features.unifiedTrustPanel.value().enabled }, + default = { false }, ) /** @@ -2452,7 +2455,7 @@ class Settings( */ var enableFxSuggest by lazyFeatureFlagBooleanPreference( key = appContext.getPreferenceKey(R.string.pref_key_enable_fxsuggest), - defaultValue = { FxNimbus.features.fxSuggest.value().enabled }, + defaultValue = { false }, // { FxNimbus.features.fxSuggest.value().enabled }, featureFlag = FeatureFlags.FX_SUGGEST, ) diff --git a/mobile/android/fenix/app/src/main/res/xml/search_settings_preferences.xml b/mobile/android/fenix/app/src/main/res/xml/search_settings_preferences.xml @@ -30,37 +30,18 @@ android:defaultValue="true" android:key="@string/pref_key_show_search_suggestions" android:title="@string/preferences_show_search_suggestions" /> - <CheckBoxPreference - android:defaultValue="false" - android:dependency="@string/pref_key_show_search_suggestions" - android:key="@string/pref_key_show_search_suggestions_in_private" - android:layout="@layout/checkbox_left_preference" - android:title="@string/preferences_show_search_suggestions_in_private" - app:iconSpaceReserved="false" /> - <CheckBoxPreference - android:defaultValue="true" - android:dependency="@string/pref_key_show_search_suggestions" - android:key="@string/pref_key_show_trending_search_suggestions" - android:layout="@layout/checkbox_left_preference" - android:title="@string/preferences_show_trending_search_suggestions" - app:iconSpaceReserved="false" /> - <SwitchPreference - app:iconSpaceReserved="false" - android:defaultValue="true" - android:key="@string/pref_key_show_recent_search_suggestions" - android:title="@string/preferences_show_recent_search_suggestions" /> </PreferenceCategory> <PreferenceCategory - android:title="@string/preference_search_address_bar_fx_suggest" + android:title="@string/preferences_settings_address_bar" android:selectable="false" app:iconSpaceReserved="false" android:layout="@layout/preference_category_no_icon_style"> - <SwitchPreference + <SwitchPreference app:iconSpaceReserved="false" android:defaultValue="true" - android:key="@string/pref_key_search_browsing_history" - android:title='@string/preferences_search_browsing_history' /> + android:key="@string/pref_key_show_clipboard_suggestions" + android:title="@string/preferences_show_clipboard_suggestions" /> <SwitchPreference app:iconSpaceReserved="false" android:defaultValue="true" @@ -69,37 +50,6 @@ <SwitchPreference app:iconSpaceReserved="false" android:defaultValue="true" - android:key="@string/pref_key_search_synced_tabs" - android:title='@string/preferences_search_synced_tabs' /> - <SwitchPreference - app:iconSpaceReserved="false" - android:key="@string/pref_key_show_nonsponsored_suggestions" - android:title="@string/preferences_show_nonsponsored_suggestions" - android:summary="@string/preferences_show_nonsponsored_suggestions_summary" /> - <SwitchPreference - app:iconSpaceReserved="false" - android:key="@string/pref_key_show_sponsored_suggestions" - android:title="@string/preferences_show_sponsored_suggestions" - android:summary="@string/preferences_show_sponsored_suggestions_summary" /> - <Preference - app:iconSpaceReserved="false" - android:key="@string/pref_key_learn_about_fx_suggest" - android:title="@string/preference_search_learn_about_fx_suggest" /> - </PreferenceCategory> - - <PreferenceCategory - android:title="@string/preferences_settings_address_bar" - android:selectable="false" - app:iconSpaceReserved="false" - android:layout="@layout/preference_category_no_icon_style"> - <SwitchPreference - app:iconSpaceReserved="false" - android:defaultValue="true" - android:key="@string/pref_key_show_clipboard_suggestions" - android:title="@string/preferences_show_clipboard_suggestions" /> - <SwitchPreference - app:iconSpaceReserved="false" - android:defaultValue="true" android:key="@string/pref_key_show_voice_search" android:title="@string/preferences_show_voice_search" /> <SwitchPreference diff --git a/mobile/android/fenix/app/src/main/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/main/res/xml/shortcuts.xml @@ -4,6 +4,7 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- <shortcut android:shortcutId="password_manager" android:enabled="true" @@ -34,4 +35,5 @@ android:targetPackage="org.mozilla.fenix" android:targetClass="org.mozilla.fenix.IntentReceiverActivity" /> </shortcut> + --> </shortcuts> diff --git a/mobile/android/fenix/app/src/nightly/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/nightly/res/xml/shortcuts.xml @@ -4,6 +4,7 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- <shortcut android:shortcutId="password_manager" android:enabled="true" @@ -34,4 +35,5 @@ android:targetPackage="org.mozilla.fenix" android:targetClass="org.mozilla.fenix.IntentReceiverActivity" /> </shortcut> + --> </shortcuts> diff --git a/mobile/android/fenix/app/src/release/res/xml/shortcuts.xml b/mobile/android/fenix/app/src/release/res/xml/shortcuts.xml @@ -4,6 +4,7 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- <shortcut android:shortcutId="password_manager" android:enabled="true" @@ -34,4 +35,5 @@ android:targetPackage="org.mozilla.firefox" android:targetClass="org.mozilla.fenix.IntentReceiverActivity" /> </shortcut> + --> </shortcuts>