From e052994b62c41d3e351f0a639c453cc82aea9a3a Mon Sep 17 00:00:00 2001 From: Joshua Kuestersteffen Date: Wed, 12 Feb 2025 08:23:52 -0600 Subject: [PATCH] Migrate SearchBarPositionDialog --- .../dialog/SearchBarPositionDialog.kt | 33 ++++++++ .../dialogs/ChooseSearchBarPositionDialog.kt | 38 ---------- .../options/CustomizeSearchFieldFragment.kt | 5 +- .../dialog/SearchBarPositionDialogTest.kt | 76 +++++++++++++++++++ 4 files changed, 111 insertions(+), 41 deletions(-) create mode 100644 app/src/main/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialog.kt delete mode 100644 app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/ChooseSearchBarPositionDialog.kt create mode 100644 app/src/test/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialogTest.kt diff --git a/app/src/main/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialog.kt b/app/src/main/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialog.kt new file mode 100644 index 00000000..c4207f00 --- /dev/null +++ b/app/src/main/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialog.kt @@ -0,0 +1,33 @@ +package com.jkuester.unlauncher.dialog + +import android.app.AlertDialog +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import com.jkuester.unlauncher.datasource.CorePreferencesRepository +import com.jkuester.unlauncher.datasource.setSearchBarPosition +import com.jkuester.unlauncher.datastore.proto.SearchBarPosition +import com.sduduzog.slimlauncher.R +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class SearchBarPositionDialog : DialogFragment() { + @Inject + lateinit var corePreferencesRepo: CorePreferencesRepository + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = AlertDialog + .Builder(context) + .setTitle(R.string.choose_search_bar_position_dialog_title) + .setSingleChoiceItems( + R.array.search_bar_position_array, + corePreferencesRepo.get().searchBarPosition.number, + this::onSelection + ) + .create() + + private fun onSelection(dialogInterface: DialogInterface, i: Int) = dialogInterface + .dismiss() + .also { corePreferencesRepo.updateAsync(setSearchBarPosition(SearchBarPosition.forNumber(i))) } +} diff --git a/app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/ChooseSearchBarPositionDialog.kt b/app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/ChooseSearchBarPositionDialog.kt deleted file mode 100644 index 185be1a7..00000000 --- a/app/src/main/java/com/sduduzog/slimlauncher/ui/dialogs/ChooseSearchBarPositionDialog.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.sduduzog.slimlauncher.ui.dialogs - -import android.app.AlertDialog -import android.app.Dialog -import android.os.Bundle -import androidx.fragment.app.DialogFragment -import com.jkuester.unlauncher.datasource.CorePreferencesRepository -import com.jkuester.unlauncher.datasource.setSearchBarPosition -import com.jkuester.unlauncher.datastore.proto.SearchBarPosition -import com.sduduzog.slimlauncher.R -import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject - -@AndroidEntryPoint -class ChooseSearchBarPositionDialog : DialogFragment() { - - @Inject - lateinit var corePreferencesRepo: CorePreferencesRepository - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val builder = AlertDialog.Builder(requireContext()) - - val active = corePreferencesRepo.get().searchBarPosition.number - builder.setTitle(R.string.choose_search_bar_position_dialog_title) - builder.setSingleChoiceItems( - R.array.search_bar_position_array, - active - ) { dialogInterface, i -> - dialogInterface.dismiss() - corePreferencesRepo.updateAsync(setSearchBarPosition(SearchBarPosition.forNumber(i))) - } - return builder.create() - } - - companion object { - fun getSearchBarPositionChooser(): ChooseSearchBarPositionDialog = ChooseSearchBarPositionDialog() - } -} diff --git a/app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeSearchFieldFragment.kt b/app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeSearchFieldFragment.kt index 4665e351..080fe867 100644 --- a/app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeSearchFieldFragment.kt +++ b/app/src/main/java/com/sduduzog/slimlauncher/ui/options/CustomizeSearchFieldFragment.kt @@ -8,9 +8,9 @@ import com.jkuester.unlauncher.datasource.CorePreferencesRepository import com.jkuester.unlauncher.datasource.setActivateKeyboardInDrawer import com.jkuester.unlauncher.datasource.setSearchAllAppsInDrawer import com.jkuester.unlauncher.datasource.setShowSearchBar +import com.jkuester.unlauncher.dialog.SearchBarPositionDialog import com.sduduzog.slimlauncher.R import com.sduduzog.slimlauncher.databinding.CustomizeAppDrawerFragmentSearchFieldOptionsBinding -import com.sduduzog.slimlauncher.ui.dialogs.ChooseSearchBarPositionDialog import com.sduduzog.slimlauncher.utils.BaseFragment import com.sduduzog.slimlauncher.utils.createTitleAndSubtitleText import dagger.hilt.android.AndroidEntryPoint @@ -70,8 +70,7 @@ class CustomizeSearchFieldFragment : BaseFragment() { private fun setupSearchBarPositionOption(options: CustomizeAppDrawerFragmentSearchFieldOptionsBinding) { options.customizeAppDrawerFragmentSearchFieldPosition.setOnClickListener { - val positionDialog = ChooseSearchBarPositionDialog.getSearchBarPositionChooser() - positionDialog.showNow(childFragmentManager, "POSITION_CHOOSER") + SearchBarPositionDialog().showNow(childFragmentManager, "POSITION_CHOOSER") } corePreferencesRepo.observe(viewLifecycleOwner) { val position = it.searchBarPosition.number diff --git a/app/src/test/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialogTest.kt b/app/src/test/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialogTest.kt new file mode 100644 index 00000000..25373260 --- /dev/null +++ b/app/src/test/java/com/jkuester/unlauncher/dialog/SearchBarPositionDialogTest.kt @@ -0,0 +1,76 @@ +package com.jkuester.unlauncher.dialog + +import android.app.AlertDialog +import android.content.DialogInterface +import com.jkuester.unlauncher.datasource.CorePreferencesRepository +import com.jkuester.unlauncher.datasource.setSearchBarPosition +import com.jkuester.unlauncher.datastore.proto.SearchBarPosition +import com.sduduzog.slimlauncher.R +import io.kotest.matchers.shouldBe +import io.mockk.every +import io.mockk.impl.annotations.MockK +import io.mockk.junit5.MockKExtension +import io.mockk.justRun +import io.mockk.mockk +import io.mockk.mockkConstructor +import io.mockk.mockkStatic +import io.mockk.slot +import io.mockk.verify +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith + +@MockKExtension.CheckUnnecessaryStub +// @MockKExtension.ConfirmVerification Weird bug between mockk/kotlin/Java is causing this to fail +@ExtendWith(MockKExtension::class) +class SearchBarPositionDialogTest { + @MockK + lateinit var corePrefsRepo: CorePreferencesRepository + @MockK + lateinit var alertDialog: AlertDialog + + @Test + fun onCreateDialog() { + mockkConstructor(AlertDialog.Builder::class) + val onSelectionSlot = slot() + every { anyConstructed().setTitle(any(Int::class)) } answers + { self as AlertDialog.Builder } + every { + anyConstructed().setSingleChoiceItems( + any(Int::class), + any(Int::class), + capture(onSelectionSlot) + ) + } answers { self as AlertDialog.Builder } + every { anyConstructed().create() } returns alertDialog + every { corePrefsRepo.get().searchBarPosition.number } returns 0 + justRun { alertDialog.dismiss() } + every { corePrefsRepo.updateAsync(any()) } returns mockk() + mockkStatic(::setSearchBarPosition) + every { setSearchBarPosition(any()) } returns mockk() + + val dialogFragment = SearchBarPositionDialog() + .apply { corePreferencesRepo = corePrefsRepo } + val result = dialogFragment.onCreateDialog(null) + + result shouldBe alertDialog + verify(exactly = 1) { + anyConstructed().setTitle(R.string.choose_search_bar_position_dialog_title) + } + verify(exactly = 1) { + anyConstructed().setSingleChoiceItems( + R.array.search_bar_position_array, + 0, + onSelectionSlot.captured + ) + } + verify(exactly = 1) { anyConstructed().create() } + verify(exactly = 1) { corePrefsRepo.get().searchBarPosition.number } + + // Trigger the listener + onSelectionSlot.captured.onClick(alertDialog, 0) + + verify(exactly = 1) { alertDialog.dismiss() } + verify(exactly = 1) { corePrefsRepo.updateAsync(any()) } + verify(exactly = 1) { setSearchBarPosition(SearchBarPosition.forNumber(0)) } + } +}