diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index db9ef8d..58a90e3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,12 +19,21 @@ tools:ignore="UnusedAttribute"> + + + + + + diff --git a/app/src/main/java/gq/kirmanak/mealient/extensions/FragmentExtensions.kt b/app/src/main/java/gq/kirmanak/mealient/extensions/FragmentExtensions.kt index 4502b15..f6ffa7c 100644 --- a/app/src/main/java/gq/kirmanak/mealient/extensions/FragmentExtensions.kt +++ b/app/src/main/java/gq/kirmanak/mealient/extensions/FragmentExtensions.kt @@ -1,6 +1,5 @@ package gq.kirmanak.mealient.extensions -import android.widget.Toast import androidx.annotation.StringRes import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle @@ -18,10 +17,7 @@ fun Fragment.collectWhenViewResumed(flow: Flow, collector: FlowCollector< } } -fun Fragment.showLongToast(@StringRes text: Int) = showLongToast(getString(text)) +fun Fragment.showLongToast(@StringRes text: Int) = context?.showLongToast(text) != null -fun Fragment.showLongToast(text: String) = showToast(text, Toast.LENGTH_LONG) +fun Fragment.showLongToast(text: String) = context?.showLongToast(text) != null -private fun Fragment.showToast(text: String, length: Int): Boolean { - return context?.let { Toast.makeText(it, text, length).show() } != null -} diff --git a/app/src/main/java/gq/kirmanak/mealient/extensions/ViewExtensions.kt b/app/src/main/java/gq/kirmanak/mealient/extensions/ViewExtensions.kt index 2c717fc..25c5fba 100644 --- a/app/src/main/java/gq/kirmanak/mealient/extensions/ViewExtensions.kt +++ b/app/src/main/java/gq/kirmanak/mealient/extensions/ViewExtensions.kt @@ -1,8 +1,10 @@ package gq.kirmanak.mealient.extensions +import android.content.Context import android.content.SharedPreferences import android.widget.EditText import android.widget.TextView +import android.widget.Toast import androidx.annotation.StringRes import androidx.core.widget.doAfterTextChanged import androidx.lifecycle.LifecycleOwner @@ -95,4 +97,13 @@ fun LiveData.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observ observer.onChanged(value) } }) -} \ No newline at end of file +} + + +fun Context.showLongToast(text: String) = showToast(text, Toast.LENGTH_LONG) + +fun Context.showLongToast(@StringRes text: Int) = showLongToast(getString(text)) + +private fun Context.showToast(text: String, length: Int) { + Toast.makeText(this, text, length).show() +} diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt index ef263b4..94fe14a 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivity.kt @@ -1,10 +1,14 @@ package gq.kirmanak.mealient.ui.activity +import android.app.SearchManager +import android.content.Intent import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SearchView +import androidx.core.content.getSystemService import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.view.isVisible import androidx.navigation.NavController @@ -46,6 +50,15 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) { binding.navigationView.setNavigationItemSelectedListener(::onNavigationItemSelected) } + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + if (Intent.ACTION_SEARCH == intent?.action) { + intent.getStringExtra(SearchManager.QUERY)?.also { query -> + viewModel.onSearchQuery(query) + } + } + } + private fun configureNavGraph() { viewModel.startDestination.observeOnce(this) { logger.d { "configureNavGraph: received destination" } @@ -104,6 +117,15 @@ class MainActivity : AppCompatActivity(R.layout.main_activity) { menuInflater.inflate(R.menu.main_toolbar, menu) menu.findItem(R.id.logout).isVisible = uiState.canShowLogout menu.findItem(R.id.login).isVisible = uiState.canShowLogin + val searchItem = menu.findItem(R.id.search_recipe_action) + searchItem.isVisible = uiState.searchVisible + val searchManager: SearchManager? = getSystemService() + val searchView = searchItem.actionView as? SearchView + if (searchManager != null && searchView != null) { + searchView.setSearchableInfo(searchManager.getSearchableInfo(componentName)) + } else { + logger.e { "onCreateOptionsMenu: either search manager or search view is null" } + } return true } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt index edf0d09..3317d18 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityUiState.kt @@ -5,6 +5,7 @@ data class MainActivityUiState( val titleVisible: Boolean = true, val isAuthorized: Boolean = false, val navigationVisible: Boolean = false, + val searchVisible: Boolean = false, ) { val canShowLogin: Boolean get() = !isAuthorized && loginButtonVisible diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt index 7375832..731358b 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/activity/MainActivityViewModel.kt @@ -52,4 +52,8 @@ class MainActivityViewModel @Inject constructor( logger.v { "logout() called" } viewModelScope.launch { authRepo.logout() } } + + fun onSearchQuery(query: String) { + logger.v { "onSearchQuery() called with: query = $query" } + } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt index a746d50..2da5a36 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/add/AddRecipeFragment.kt @@ -38,7 +38,12 @@ class AddRecipeFragment : Fragment(R.layout.fragment_add_recipe) { super.onViewCreated(view, savedInstanceState) logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } activityViewModel.updateUiState { - it.copy(loginButtonVisible = true, titleVisible = false, navigationVisible = true) + it.copy( + loginButtonVisible = true, + titleVisible = false, + navigationVisible = true, + searchVisible = false, + ) } viewModel.loadPreservedRequest() setupViews() diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt index 7a1dd16..bd108f7 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/auth/AuthenticationFragment.kt @@ -32,7 +32,12 @@ class AuthenticationFragment : Fragment(R.layout.fragment_authentication) { logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } binding.button.setOnClickListener { onLoginClicked() } activityViewModel.updateUiState { - it.copy(loginButtonVisible = false, titleVisible = true, navigationVisible = false) + it.copy( + loginButtonVisible = false, + titleVisible = true, + navigationVisible = false, + searchVisible = false + ) } viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange) } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt index fb505dd..846e04d 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLFragment.kt @@ -33,7 +33,12 @@ class BaseURLFragment : Fragment(R.layout.fragment_base_url) { binding.button.setOnClickListener(::onProceedClick) viewModel.uiState.observe(viewLifecycleOwner, ::onUiStateChange) activityViewModel.updateUiState { - it.copy(loginButtonVisible = false, titleVisible = true, navigationVisible = false) + it.copy( + loginButtonVisible = false, + titleVisible = true, + navigationVisible = false, + searchVisible = false + ) } } diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt index d459020..b1bea90 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/disclaimer/DisclaimerFragment.kt @@ -57,7 +57,12 @@ class DisclaimerFragment : Fragment(R.layout.fragment_disclaimer) { } viewModel.startCountDown() activityViewModel.updateUiState { - it.copy(loginButtonVisible = false, titleVisible = true, navigationVisible = false) + it.copy( + loginButtonVisible = false, + titleVisible = true, + navigationVisible = false, + searchVisible = false + ) } } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt index 1ec8d6d..b715a5d 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/recipes/RecipesFragment.kt @@ -50,7 +50,12 @@ class RecipesFragment : Fragment(R.layout.fragment_recipes) { super.onViewCreated(view, savedInstanceState) logger.v { "onViewCreated() called with: view = $view, savedInstanceState = $savedInstanceState" } activityViewModel.updateUiState { - it.copy(loginButtonVisible = true, titleVisible = false, navigationVisible = true) + it.copy( + loginButtonVisible = true, + titleVisible = false, + navigationVisible = true, + searchVisible = true, + ) } setupRecipeAdapter() } diff --git a/app/src/main/res/menu/main_toolbar.xml b/app/src/main/res/menu/main_toolbar.xml index 6d9ba04..32967bb 100644 --- a/app/src/main/res/menu/main_toolbar.xml +++ b/app/src/main/res/menu/main_toolbar.xml @@ -1,17 +1,24 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> - + - + + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 06e2ecc..199fa22 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -48,4 +48,5 @@ нет соединения Ошибка загрузки. Сменить URL + Найти рецепты \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 13d5934..cb7ec45 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -52,4 +52,5 @@ unexpected response no connection Change URL + Search recipes \ No newline at end of file diff --git a/app/src/main/res/xml/searchable_recipe_main.xml b/app/src/main/res/xml/searchable_recipe_main.xml new file mode 100644 index 0000000..df95cdd --- /dev/null +++ b/app/src/main/res/xml/searchable_recipe_main.xml @@ -0,0 +1,4 @@ + + \ No newline at end of file