diff --git a/.idea/misc.xml b/.idea/misc.xml index 5ce80eb..7115e4c 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -15,6 +15,7 @@ + diff --git a/app/src/main/java/com/example/foodies/SearchFragment.kt b/app/src/main/java/com/example/foodies/SearchFragment.kt new file mode 100644 index 0000000..7449f60 --- /dev/null +++ b/app/src/main/java/com/example/foodies/SearchFragment.kt @@ -0,0 +1,72 @@ +package com.example.foodies + +import android.content.Intent +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels +import androidx.lifecycle.Observer +import coil.load +import com.example.foodies.activities.MealActivity +import com.example.foodies.databinding.FragmentSearchBinding +import com.example.foodies.fragments.home.HomeFragment +import com.example.foodies.viewmodel.SearchViewModel + + +class SearchFragment : Fragment() { + private lateinit var binding: FragmentSearchBinding + private val viewModel: SearchViewModel by viewModels() + private var mealId = "" + private var mealStr = "" + private var mealThumb = "" + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + binding = FragmentSearchBinding.inflate(inflater, container, false) + + + observeSearched() + setOnMealCardClick() + return binding.root + } + + private fun setOnMealCardClick() { + binding.searchedMealCard.setOnClickListener { + val intent = Intent(activity, MealActivity::class.java) + intent.putExtra(HomeFragment.MEAL_ID, mealId) + intent.putExtra(HomeFragment.MEAL_NAME, mealStr) + intent.putExtra(HomeFragment.MEAL_THUMB, mealThumb) + + startActivity(intent) + } + } + + private fun observeSearched() { + binding.icSearch.setOnClickListener { + onSearchClick() + viewModel.searchedMeal.observe(viewLifecycleOwner, Observer { + binding.apply { + imgSearchedMeal.load(it.strMealThumb) + tvSearchedMeal.text = it.strMeal + searchedMealCard.visibility = View.VISIBLE + } + mealId = it.idMeal + mealStr = it.strMeal!! + mealThumb = it.strMealThumb!! + }) + } + } + + private fun onSearchClick() { + viewModel.getSearchedMeal(binding.edSearch.text.toString(), requireContext()) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/foodies/fragments/home/HomeFragment.kt b/app/src/main/java/com/example/foodies/fragments/home/HomeFragment.kt index 6652125..59dfaa0 100644 --- a/app/src/main/java/com/example/foodies/fragments/home/HomeFragment.kt +++ b/app/src/main/java/com/example/foodies/fragments/home/HomeFragment.kt @@ -11,9 +11,11 @@ import androidx.core.content.ContextCompat.startActivity import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Observer +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import coil.load +import com.example.foodies.R import com.example.foodies.activities.CategoriesActivity import com.example.foodies.activities.MealActivity import com.example.foodies.adapters.CategoriesAdapter @@ -74,6 +76,14 @@ class HomeFragment : Fragment() { onPopularItemLongClick() + onSearchIconClicked() + + } + + private fun onSearchIconClicked() { + binding.iconSearch.setOnClickListener { + findNavController().navigate(R.id.action_homeFragment_to_searchFragment) + } } private fun onPopularItemLongClick() { diff --git a/app/src/main/java/com/example/foodies/network/MealApiService.kt b/app/src/main/java/com/example/foodies/network/MealApiService.kt index b17f896..6a01820 100644 --- a/app/src/main/java/com/example/foodies/network/MealApiService.kt +++ b/app/src/main/java/com/example/foodies/network/MealApiService.kt @@ -30,8 +30,8 @@ interface MealsApi { @GET("categories.php") fun getCategories(): Call - @GET("filter.php") - fun getMealsByCategory(@Query("c") category: String): Call + @GET("search.php?") + fun getMealBySearch(@Query("s") s:String):Call } diff --git a/app/src/main/java/com/example/foodies/viewmodel/CategoriesViewModel.kt b/app/src/main/java/com/example/foodies/viewmodel/CategoriesViewModel.kt index cb14169..f667d00 100644 --- a/app/src/main/java/com/example/foodies/viewmodel/CategoriesViewModel.kt +++ b/app/src/main/java/com/example/foodies/viewmodel/CategoriesViewModel.kt @@ -18,7 +18,7 @@ class CategoriesViewModel: ViewModel() { val meals: LiveData> = _meals fun getMealsByCategory(category: String) { - MealApiService.retrofitInstance.getMealsByCategory(category).enqueue(object : Callback { + MealApiService.retrofitInstance.getPopularItems(category).enqueue(object : Callback { override fun onResponse( call: Call, response: Response diff --git a/app/src/main/java/com/example/foodies/viewmodel/SearchViewModel.kt b/app/src/main/java/com/example/foodies/viewmodel/SearchViewModel.kt new file mode 100644 index 0000000..39f8077 --- /dev/null +++ b/app/src/main/java/com/example/foodies/viewmodel/SearchViewModel.kt @@ -0,0 +1,38 @@ +package com.example.foodies.viewmodel + +import android.content.Context +import android.util.Log +import android.widget.Toast +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.example.foodies.module.randommeal.Meal +import com.example.foodies.module.randommeal.RandomMeal +import com.example.foodies.network.MealApiService +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class SearchViewModel: ViewModel() { + + private var _searchedMeal = MutableLiveData() + val searchedMeal: LiveData = _searchedMeal + + + fun getSearchedMeal(search: String, context: Context) { + MealApiService.retrofitInstance.getMealBySearch(search).enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.body()?.meals == null) { + Toast.makeText(context, "No Such Such Dish Found", Toast.LENGTH_SHORT) + } else { + _searchedMeal.value = response.body()!!.meals.first() + } + } + + override fun onFailure(call: Call, t: Throwable) { + Log.e("TAG", t.message.toString()) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/search_box_background.xml b/app/src/main/res/drawable/search_box_background.xml new file mode 100644 index 0000000..6944719 --- /dev/null +++ b/app/src/main/res/drawable/search_box_background.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml new file mode 100644 index 0000000..8cc402e --- /dev/null +++ b/app/src/main/res/layout/fragment_search.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index abb902f..7cc3496 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -9,7 +9,11 @@ android:id="@+id/homeFragment" android:name="com.example.foodies.fragments.home.HomeFragment" android:label="Home" - tools:layout="@layout/fragment_home" /> + tools:layout="@layout/fragment_home" > + + + \ No newline at end of file