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 @@
\ 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