diff --git a/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt b/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt index d838f2c9f..e8c68eb17 100644 --- a/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt +++ b/app/src/main/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProvider.kt @@ -135,24 +135,28 @@ open class FenixSearchEngineProvider( return installedSearchEngines(context) } - fun installSearchEngine(context: Context, searchEngine: SearchEngine) = runBlocking { - val installedIdentifiers = installedSearchEngineIdentifiers(context).toMutableSet() - installedIdentifiers.add(searchEngine.identifier) - prefs(context).edit().putStringSet(localeAwareInstalledEnginesKey(), installedIdentifiers).apply() + fun installSearchEngine(context: Context, searchEngine: SearchEngine, isCustom: Boolean = false) = runBlocking { + if (isCustom) { + val searchUrl = searchEngine.getSearchTemplate() + CustomSearchEngineStore.addSearchEngine(context, searchEngine.name, searchUrl) + reload() + } else { + val installedIdentifiers = installedSearchEngineIdentifiers(context).toMutableSet() + installedIdentifiers.add(searchEngine.identifier) + prefs(context).edit() + .putStringSet(localeAwareInstalledEnginesKey(), installedIdentifiers).apply() + } } - fun uninstallSearchEngine(context: Context, searchEngine: SearchEngine) = runBlocking { - val isCustom = CustomSearchEngineStore.isCustomSearchEngine(context, searchEngine.identifier) - + fun uninstallSearchEngine(context: Context, searchEngine: SearchEngine, isCustom: Boolean = false) = runBlocking { if (isCustom) { CustomSearchEngineStore.removeSearchEngine(context, searchEngine.identifier) + reload() } else { val installedIdentifiers = installedSearchEngineIdentifiers(context).toMutableSet() installedIdentifiers.remove(searchEngine.identifier) prefs(context).edit().putStringSet(localeAwareInstalledEnginesKey(), installedIdentifiers).apply() } - - reload() } fun reload() { diff --git a/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt b/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt index 93e47bd0d..63a88d1f2 100644 --- a/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt +++ b/app/src/main/java/org/mozilla/fenix/settings/search/SearchEngineListPreference.kt @@ -18,7 +18,10 @@ import androidx.core.view.isVisible import androidx.navigation.Navigation import androidx.preference.Preference import androidx.preference.PreferenceViewHolder -import kotlinx.android.synthetic.main.search_engine_radio_button.view.* +import kotlinx.android.synthetic.main.search_engine_radio_button.view.engine_icon +import kotlinx.android.synthetic.main.search_engine_radio_button.view.engine_text +import kotlinx.android.synthetic.main.search_engine_radio_button.view.overflow_menu +import kotlinx.android.synthetic.main.search_engine_radio_button.view.radio_button import kotlinx.coroutines.MainScope import mozilla.components.browser.search.SearchEngine import mozilla.components.browser.search.provider.SearchEngineList @@ -167,7 +170,7 @@ abstract class SearchEngineListPreference @JvmOverloads constructor( val initialEngineList = searchEngineList.copy() val initialDefaultEngine = searchEngineList.default - context.components.search.provider.uninstallSearchEngine(context, engine) + context.components.search.provider.uninstallSearchEngine(context, engine, isCustomSearchEngine) MainScope().allowUndo( view = context.getRootView()!!, @@ -175,7 +178,7 @@ abstract class SearchEngineListPreference @JvmOverloads constructor( .getString(R.string.search_delete_search_engine_success_message, engine.name), undoActionTitle = context.getString(R.string.snackbar_deleted_undo), onCancel = { - context.components.search.provider.installSearchEngine(context, engine) + context.components.search.provider.installSearchEngine(context, engine, isCustomSearchEngine) searchEngineList = initialEngineList.copy( default = initialDefaultEngine diff --git a/app/src/test/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProviderTest.kt b/app/src/test/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProviderTest.kt index 82726fcce..41d4532b6 100644 --- a/app/src/test/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProviderTest.kt +++ b/app/src/test/java/org/mozilla/fenix/components/searchengine/FenixSearchEngineProviderTest.kt @@ -3,6 +3,14 @@ package org.mozilla.fenix.components.searchengine import android.content.Context import io.mockk.every import io.mockk.mockk +import android.graphics.Bitmap +import io.mockk.Runs +import io.mockk.coEvery +import io.mockk.coVerify +import io.mockk.every +import io.mockk.just +import io.mockk.mockk +import io.mockk.mockkObject import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.Deferred import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -27,6 +35,12 @@ class FenixSearchEngineProviderTest { @Before fun before() { fenixSearchEngineProvider = FakeFenixSearchEngineProvider(testContext) + mockkObject(CustomSearchEngineStore) + fenixSearchEngineProvider.let { + every { CustomSearchEngineStore.loadCustomSearchEngines(testContext) } returns listOf( + (it as FakeFenixSearchEngineProvider).mockSearchEngine("my custom site", "my custom site") + ) + } } /* @@ -37,6 +51,28 @@ class FenixSearchEngineProviderTest { - the above after adding/removing */ + @Suppress("DEPRECATION") + @Test + fun `add custom engine`() = runBlockingTest { + val engineName = "Ecosia" + val engineQuery = "www.ecosia.com/%s" + val searchEngine: SearchEngine = mockk(relaxed = true) + every { searchEngine.getSearchTemplate() } returns engineQuery + every { searchEngine.name } returns engineName + mockkObject(CustomSearchEngineStore) + coEvery { + CustomSearchEngineStore.addSearchEngine( + testContext, + engineName, + engineQuery + ) + } just Runs + + fenixSearchEngineProvider.installSearchEngine(testContext, searchEngine, true) + + coVerify { CustomSearchEngineStore.addSearchEngine(testContext, engineName, engineQuery) } + } + @Test fun `GIVEN sharedprefs does not contain installed engines WHEN installedSearchEngineIdentifiers THEN defaultEngines + customEngines ids are returned`() = runBlockingTest { val expectedDefaults = fenixSearchEngineProvider.baseSearchEngines.toIdSet() @@ -96,21 +132,17 @@ class FakeFenixSearchEngineProvider(context: Context) : FenixSearchEngineProvide ) ) - override var customSearchEngines: Deferred - get() { - return CompletableDeferred( - SearchEngineList( - listOf( - mockSearchEngine("my custom site", "my custom site") - ), default = null - ) - ) - } - set(_) = throw NotImplementedError("Setting not currently supported on this fake") + override var customSearchEngines: Deferred = CompletableDeferred( + SearchEngineList( + listOf( + mockSearchEngine("my custom site", "my custom site") + ), default = null + ) + ) override fun updateBaseSearchEngines() { } - private fun mockSearchEngine( + fun mockSearchEngine( id: String, n: String = id ): SearchEngine {