Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .gradle/7.4/checksums/checksums.lock
Binary file not shown.
Binary file modified .gradle/7.4/checksums/md5-checksums.bin
Binary file not shown.
Binary file modified .gradle/7.4/checksums/sha1-checksums.bin
Binary file not shown.
Binary file modified .gradle/7.4/executionHistory/executionHistory.lock
Binary file not shown.
Binary file modified .gradle/7.4/fileHashes/fileHashes.bin
Binary file not shown.
Binary file modified .gradle/7.4/fileHashes/fileHashes.lock
Binary file not shown.
Binary file modified .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
Binary file modified .gradle/buildOutputCleanup/outputFiles.bin
Binary file not shown.
43 changes: 18 additions & 25 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ android {
versionCode 1
versionName "1.0"


testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

Expand Down Expand Up @@ -51,6 +52,9 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.navigation:navigation-fragment:2.5.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
package com.example.mealmate.ui
package com.example.mealmate
import androidx.annotation.Keep
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Keep
@Serializable
data class FavoriteRecipeModel(
data class Favorite (
@SerialName("id")
val recipeId: String?,
@SerialName("title")
val title: String?,
@SerialName("image")
val recipeImageUrl: String?,
@SerialName("maxReadyTime")
val prepTime: Int
) : java.io.Serializable
//
//@Keep
//@Serializable
//data class FavoriteResponse(
// @SerialName("results")
// val result: List<SearchResult>?
//)
127 changes: 127 additions & 0 deletions app/src/main/java/com/example/mealmate/FavoriteActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package com.example.mealmate

import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.Spinner
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.codepath.asynchttpclient.AsyncHttpClient
import com.codepath.asynchttpclient.RequestParams
import com.codepath.asynchttpclient.callback.JsonHttpResponseHandler
import com.example.mealmate.*
import com.example.mealmate.databinding.FragmentFavoriteBinding
import com.example.mealmate.databinding.FragmentHomeBinding
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import okhttp3.Headers
import org.json.JSONException
import org.json.JSONObject
import java.net.URL

private const val TAG = "FavoriteActivity/"
class FavoriteFragment : Fragment() {

private var _binding: FragmentFavoriteBinding? = null

// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!
private lateinit var searchResultsAdapter: SearchResultsAdapter
private var searchResultList = mutableListOf<String>()

override fun onCreateView (
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val favoriteModel =
ViewModelProvider(this).get(FavoriteViewModel::class.java)

_binding = FragmentFavoriteBinding.inflate(inflater, container, false)
//val recyclerView: RecyclerView =binding.recyclerView

val root: View = binding.root
updateView()

return root
}

private fun updateView() {
val recyclerView: RecyclerView = binding.favoriteRecipesRecyclerView

convertIDS(MainActivity.recipeIds) { searchResults ->
searchResultsAdapter = SearchResultsAdapter(requireActivity(), searchResults)
recyclerView.adapter = searchResultsAdapter
recyclerView.layoutManager = LinearLayoutManager(requireActivity()).also {
val dividerItemDecoration = DividerItemDecoration(requireActivity(), it.orientation)
recyclerView.addItemDecoration(dividerItemDecoration)
}
}

//searchResultsAdapter.notifyDataSetChanged()
}

private fun convertIDS(ids: MutableList<String>?, callback: (List<SearchResult>) -> Unit) {
val client = AsyncHttpClient()
val searchResults = mutableListOf<SearchResult>()

if (ids != null) {
for (id in ids) {
System.out.println(id)
val url = "https://api.spoonacular.com/recipes/$id/information?apiKey=$API_KEY"
val requestParams = RequestParams()
requestParams.put("apiKey", API_KEY)

client.get(url, requestParams, object : JsonHttpResponseHandler() {
override fun onSuccess(statusCode: Int, headers: Headers, json: JSON) {
Log.i(TAG, "Successfully fetched recipes: $json")
try {
val parsedJson = createJson().decodeFromString(
SearchNewsResponse.serializer(),
json.jsonObject.toString()
)

parsedJson.result?.let { list ->
for (resultJson in list) {
val searchResult = SearchResult(
id = resultJson.id.toString(),
title = resultJson.title.toString(),
poster = resultJson.poster.toString()
)
searchResults.add(searchResult)
}
}
callback(searchResults)

} catch (e: JSONException) {
Log.e(TAG, "Exception: $e")
}
}

override fun onFailure(
statusCode: Int,
headers: Headers?,
response: String?,
throwable: Throwable?
) {
Log.e(TAG, "Failed to fetch recipe information for id $id")
}
})
}
}
}

override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/example/mealmate/FavoriteViewModel.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.mealmate

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class FavoriteViewModel : ViewModel() {

private val _text = MutableLiveData<String>().apply {
value = "This is favorite Fragment"
}
val text: LiveData<String> = _text
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/example/mealmate/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ import com.google.firebase.auth.FirebaseAuth
class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding
// Define companion object to hold recipe IDs
companion object {
var recipeIds = mutableListOf<String>()
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand All @@ -37,6 +41,7 @@ class MainActivity : AppCompatActivity() {
navView.setupWithNavController(navController)

val user = FirebaseAuth.getInstance().currentUser

if (user == null) {
// Launch the LoginActivity
val intent = Intent(this, LoginActivity::class.java)
Expand All @@ -55,5 +60,6 @@ class MainActivity : AppCompatActivity() {
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ fun createJson() = Json {
useAlternativeNames = false
}

const val API_KEY = "3315e5304bb34417bd8b8f00d0b92dd8"
const val API_KEY = "258b2661d05f47a08e048ce42c190429"
private const val TAG = "SearchResultActivity/"
class SearchResultActivity : AppCompatActivity() {

Expand Down
10 changes: 9 additions & 1 deletion app/src/main/java/com/example/mealmate/SearchResultsAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.core.app.ActivityOptionsCompat
Expand Down Expand Up @@ -37,12 +38,19 @@ class SearchResultsAdapter(private val context: Context, private val searchResul
private var id: TextView
private var name: TextView
private var poster: ImageView

private var addButton: Button
init {
itemView.setOnClickListener(this)
id = itemView.findViewById(R.id.recipe_id)
name = itemView.findViewById(R.id.recipe_name)
poster=itemView.findViewById(R.id.recipe_image)

addButton = itemView.findViewById(R.id.button)
addButton.setOnClickListener {
val recipeId = id.text.toString()
MainActivity.recipeIds.add(recipeId)
Log.i("Recipe ID added", "Recipe ID $recipeId added to recipeIds: ${MainActivity.recipeIds}")
}
}

fun bind(searchResult: SearchResult) {
Expand Down
58 changes: 0 additions & 58 deletions app/src/main/java/com/example/mealmate/ui/FavoriteRecipeAdapter.kt

This file was deleted.

Loading