diff --git a/Jay-RecipesX/.gitignore b/Jay-RecipesX/.gitignore new file mode 100644 index 00000000..951e883e --- /dev/null +++ b/Jay-RecipesX/.gitignore @@ -0,0 +1,16 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties + diff --git a/Jay-RecipesX/.idea/.gitignore b/Jay-RecipesX/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/Jay-RecipesX/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/Jay-RecipesX/.idea/compiler.xml b/Jay-RecipesX/.idea/compiler.xml new file mode 100644 index 00000000..b589d56e --- /dev/null +++ b/Jay-RecipesX/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/.idea/deploymentTargetSelector.xml b/Jay-RecipesX/.idea/deploymentTargetSelector.xml new file mode 100644 index 00000000..b268ef36 --- /dev/null +++ b/Jay-RecipesX/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/.idea/gradle.xml b/Jay-RecipesX/.idea/gradle.xml new file mode 100644 index 00000000..0897082f --- /dev/null +++ b/Jay-RecipesX/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/.idea/inspectionProfiles/Project_Default.xml b/Jay-RecipesX/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..6806f5a8 --- /dev/null +++ b/Jay-RecipesX/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,53 @@ + + + + \ No newline at end of file diff --git a/Jay-RecipesX/.idea/kotlinc.xml b/Jay-RecipesX/.idea/kotlinc.xml new file mode 100644 index 00000000..fdf8d994 --- /dev/null +++ b/Jay-RecipesX/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/.idea/migrations.xml b/Jay-RecipesX/.idea/migrations.xml new file mode 100644 index 00000000..f8051a6f --- /dev/null +++ b/Jay-RecipesX/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/.idea/misc.xml b/Jay-RecipesX/.idea/misc.xml new file mode 100644 index 00000000..0ad17cbd --- /dev/null +++ b/Jay-RecipesX/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/.idea/vcs.xml b/Jay-RecipesX/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/Jay-RecipesX/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/app/.gitignore b/Jay-RecipesX/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/Jay-RecipesX/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/Jay-RecipesX/app/build.gradle.kts b/Jay-RecipesX/app/build.gradle.kts new file mode 100644 index 00000000..78864e62 --- /dev/null +++ b/Jay-RecipesX/app/build.gradle.kts @@ -0,0 +1,91 @@ +import java.util.Properties + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + id("kotlin-kapt") + id("dagger.hilt.android.plugin") +} + +android { + namespace = "com.example.jay_recipesx" + compileSdk = 34 + + defaultConfig { + applicationId = "com.example.jay_recipesx" + minSdk = 24 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables { + useSupportLibrary = true + } + + val properties = Properties() + properties.load(project.rootProject.file("local.properties").inputStream()) + + buildConfigField("String" , "API_KEY" , properties.getProperty("API_KEY")) + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + compose = true + buildConfig = true + } + composeOptions { + kotlinCompilerExtensionVersion = "1.5.1" + } + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + debugImplementation(libs.androidx.ui.tooling) + debugImplementation(libs.androidx.ui.test.manifest) + implementation(libs.coil.compose) + + //Dagger - Hilt + implementation(libs.hilt.android) + kapt(libs.hilt.android.compiler) + implementation("com.google.dagger:hilt-android:2.51.1") + implementation("androidx.hilt:hilt-navigation-compose:1.0.0") + + // Retrofit + implementation(libs.retrofit) + implementation(libs.okhttp) + implementation(libs.converter.gson) +} \ No newline at end of file diff --git a/Jay-RecipesX/app/proguard-rules.pro b/Jay-RecipesX/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/Jay-RecipesX/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/Jay-RecipesX/app/src/androidTest/java/com/example/jay_recipesx/ExampleInstrumentedTest.kt b/Jay-RecipesX/app/src/androidTest/java/com/example/jay_recipesx/ExampleInstrumentedTest.kt new file mode 100644 index 00000000..c38def76 --- /dev/null +++ b/Jay-RecipesX/app/src/androidTest/java/com/example/jay_recipesx/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.jay_recipesx + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.jay_recipesx", appContext.packageName) + } +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/AndroidManifest.xml b/Jay-RecipesX/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..17aec219 --- /dev/null +++ b/Jay-RecipesX/app/src/main/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/AppFunctions/AppFunctions.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/AppFunctions/AppFunctions.kt new file mode 100644 index 00000000..0af499ac --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/AppFunctions/AppFunctions.kt @@ -0,0 +1,20 @@ +package com.example.jay_recipesx.Core.AppFunctions + +class AppFunctions { + companion object { + fun removeHtmlTags(input: String): String { + // Regex to match HTML-like tags + val regex = "<[^>]*>".toRegex() + // Replace the matched tags with an empty string + return input.replace(regex, "") + } + + fun addBulletsToInstructions(instructions: String): String { + // Split the instructions by line breaks + val lines = instructions.split("\n") + + // Add a bullet to each line and include an extra line break + return lines.joinToString(separator = "\n\n") { "• $it" } // Two newlines for extra space + } + } +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/ContentComponent.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/ContentComponent.kt new file mode 100644 index 00000000..22ac43bc --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/ContentComponent.kt @@ -0,0 +1,35 @@ +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.jay_recipesx.Core.AppFunctions.AppFunctions.Companion.removeHtmlTags + +@Composable +fun ContentComponent( + modifier: Modifier = Modifier, + heading: String, + content: String, + maxLine: Int = Int.MAX_VALUE +) { + + Column { + Text(text = heading, + fontWeight = FontWeight.Bold, + fontSize = 20.sp + ) + Spacer(modifier = Modifier.height(16.dp)) + Text( + removeHtmlTags(content), + textAlign = TextAlign.Justify, + maxLines = maxLine, + overflow = TextOverflow.Ellipsis + ) + } +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/ErrorComponent.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/ErrorComponent.kt new file mode 100644 index 00000000..6543e77e --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/ErrorComponent.kt @@ -0,0 +1,18 @@ +package com.example.jay_recipesx.Core.Components + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier + +@Composable +fun ErrorComponent(modifier: Modifier = Modifier, errorMessage : String) { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text(text = errorMessage) + } +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/LoadingComponent.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/LoadingComponent.kt new file mode 100644 index 00000000..3efc5be6 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/Core/Components/LoadingComponent.kt @@ -0,0 +1,18 @@ +package com.example.jay_recipesx.Core.Components + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier + +@Composable +fun LoadingComponent(modifier: Modifier = Modifier) { + Box( + modifier = Modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + CircularProgressIndicator() + } +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/MainActivity.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/MainActivity.kt new file mode 100644 index 00000000..99a1e820 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/MainActivity.kt @@ -0,0 +1,36 @@ +package com.example.jay_recipesx + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Modifier +import androidx.hilt.navigation.compose.hiltViewModel +import com.example.jay_recipesx.features.RecipeHome.Presentation.Screens.RecipeHomeScreen +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeViewModel +import com.example.jay_recipesx.ui.theme.JayRecipesXTheme +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + JayRecipesXTheme { + val viewModel = hiltViewModel() + val state = viewModel.recipes.collectAsState() + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + RecipeHomeScreen( + modifier = Modifier.padding(innerPadding), + viewModel = viewModel + ) + } + } + } + } +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/RecipeApp.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/RecipeApp.kt new file mode 100644 index 00000000..e0d6c48d --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/RecipeApp.kt @@ -0,0 +1,7 @@ +package com.example.jay_recipesx + +import android.app.Application +import dagger.hilt.android.HiltAndroidApp + +@HiltAndroidApp +class RecipeApp : Application() \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/di/AppModule.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/di/AppModule.kt new file mode 100644 index 00000000..3c1e98b5 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/di/AppModule.kt @@ -0,0 +1,36 @@ +package com.example.jay_recipesx.di + +import com.example.jay_recipesx.features.RecipeHome.Data.Remote.RecipeApi +import com.example.jay_recipesx.features.RecipeHome.Data.Repositories.RecipeRepoImpl +import com.example.jay_recipesx.features.RecipeHome.Domain.Repositories.IRecipeRepo +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeViewModel +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.scopes.ViewModelScoped +import dagger.hilt.components.SingletonComponent +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.create +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object AppModule { + + @Provides + @Singleton + fun provideRecipeApi(): RecipeApi { + return Retrofit.Builder() + .baseUrl("https://api.spoonacular.com") + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(RecipeApi::class.java) + } + + @Provides + @Singleton + fun provideRecipeRepo(recipeApi: RecipeApi): IRecipeRepo { + return RecipeRepoImpl(recipeApi) + } +} diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/AnalyzedInstruction.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/AnalyzedInstruction.kt new file mode 100644 index 00000000..0c514079 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/AnalyzedInstruction.kt @@ -0,0 +1,6 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class AnalyzedInstruction( + val name: String, + val steps: List +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Equipment.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Equipment.kt new file mode 100644 index 00000000..a2d64b39 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Equipment.kt @@ -0,0 +1,9 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Equipment( + val id: Int, + val image: String, + val localizedName: String, + val name: String, + val temperature: Temperature +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/ExtendedIngredient.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/ExtendedIngredient.kt new file mode 100644 index 00000000..ae629d53 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/ExtendedIngredient.kt @@ -0,0 +1,16 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class ExtendedIngredient( + val aisle: String, + val amount: Double, + val consistency: String, + val id: Int, + val image: String, + val measures: Measures, + val meta: List, + val name: String, + val nameClean: String, + val original: String, + val originalName: String, + val unit: String +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Ingredient.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Ingredient.kt new file mode 100644 index 00000000..62139d18 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Ingredient.kt @@ -0,0 +1,8 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Ingredient( + val id: Int, + val image: String, + val localizedName: String, + val name: String +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Length.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Length.kt new file mode 100644 index 00000000..a682eec3 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Length.kt @@ -0,0 +1,6 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Length( + val number: Int, + val unit: String +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Measures.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Measures.kt new file mode 100644 index 00000000..959406b5 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Measures.kt @@ -0,0 +1,6 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Measures( + val metric: Metric, + val us: Us +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Metric.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Metric.kt new file mode 100644 index 00000000..58f383e5 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Metric.kt @@ -0,0 +1,7 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Metric( + val amount: Double, + val unitLong: String, + val unitShort: String +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Recipe.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Recipe.kt new file mode 100644 index 00000000..e427ebb7 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Recipe.kt @@ -0,0 +1,40 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Recipe( + val aggregateLikes: Int, + val analyzedInstructions: List, + val cheap: Boolean, + val cookingMinutes: Any, + val creditsText: String, + val cuisines: List, + val dairyFree: Boolean, + val diets: List, + val dishTypes: List, + val extendedIngredients: List, + val gaps: String, + val glutenFree: Boolean, + val healthScore: Int, + val id: Int, + val image: String, + val imageType: String, + val instructions: String, + val lowFodmap: Boolean, + val occasions: List, + val originalId: Any, + val preparationMinutes: Any, + val pricePerServing: Double, + val readyInMinutes: Int, + val servings: Int, + val sourceName: String, + val sourceUrl: String, + val spoonacularScore: Double, + val spoonacularSourceUrl: String, + val summary: String, + val sustainable: Boolean, + val title: String, + val vegan: Boolean, + val vegetarian: Boolean, + val veryHealthy: Boolean, + val veryPopular: Boolean, + val weightWatcherSmartPoints: Int +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/RecipeModelX.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/RecipeModelX.kt new file mode 100644 index 00000000..c4af8abd --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/RecipeModelX.kt @@ -0,0 +1,5 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class RecipeModel( + val recipes: List +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Step.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Step.kt new file mode 100644 index 00000000..197853db --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Step.kt @@ -0,0 +1,9 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Step( + val equipment: List, + val ingredients: List, + val length: Length, + val number: Int, + val step: String +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Temperature.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Temperature.kt new file mode 100644 index 00000000..130c217b --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Temperature.kt @@ -0,0 +1,6 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Temperature( + val number: Double, + val unit: String +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Us.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Us.kt new file mode 100644 index 00000000..eebab66a --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Models/Us.kt @@ -0,0 +1,7 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Models + +data class Us( + val amount: Double, + val unitLong: String, + val unitShort: String +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Remote/RecipeApi.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Remote/RecipeApi.kt new file mode 100644 index 00000000..1215ac6f --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Remote/RecipeApi.kt @@ -0,0 +1,16 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Remote + +import com.example.jay_recipesx.BuildConfig +import com.example.jay_recipesx.features.RecipeHome.Data.Models.RecipeModel +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Headers + +interface RecipeApi { + @Headers( + "Content-Type: application/json", + "x-api-key: ${BuildConfig.API_KEY}" + ) + @GET("/recipes/random") + suspend fun getRandomRecipe() : RecipeModel +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Repositories/RecipeRepoImpl.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Repositories/RecipeRepoImpl.kt new file mode 100644 index 00000000..aeef4848 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Data/Repositories/RecipeRepoImpl.kt @@ -0,0 +1,21 @@ +package com.example.jay_recipesx.features.RecipeHome.Data.Repositories + +import com.example.jay_recipesx.features.RecipeHome.Data.Models.RecipeModel +import com.example.jay_recipesx.features.RecipeHome.Data.Remote.RecipeApi +import com.example.jay_recipesx.features.RecipeHome.Domain.Repositories.IRecipeRepo +import retrofit2.Call +import javax.inject.Inject +import kotlin.random.Random + +class RecipeRepoImpl @Inject constructor( + private val recipeApi: RecipeApi +) : IRecipeRepo { + + override suspend fun getRandomRecipe(): RecipeModel { + return recipeApi.getRandomRecipe() + } + + override suspend fun getSimilarRecipes(id: String) : List { + return listOf(); + } +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Repositories/IRecipeRepo.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Repositories/IRecipeRepo.kt new file mode 100644 index 00000000..f5685d5c --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Repositories/IRecipeRepo.kt @@ -0,0 +1,8 @@ +package com.example.jay_recipesx.features.RecipeHome.Domain.Repositories + +import com.example.jay_recipesx.features.RecipeHome.Data.Models.RecipeModel + +interface IRecipeRepo { + suspend fun getRandomRecipe(): RecipeModel + suspend fun getSimilarRecipes(id: String) : List +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Usecases/GetRandomRecipe.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Usecases/GetRandomRecipe.kt new file mode 100644 index 00000000..cfe5afaf --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Usecases/GetRandomRecipe.kt @@ -0,0 +1,8 @@ +package com.example.jay_recipesx.features.RecipeHome.Domain.Usecases + +import com.example.jay_recipesx.features.RecipeHome.Data.Models.RecipeModel +import com.example.jay_recipesx.features.RecipeHome.Domain.Repositories.IRecipeRepo + +class GetRandomRecipe(private val iRecipeRepo: IRecipeRepo) { + suspend fun call(): RecipeModel = iRecipeRepo.getRandomRecipe() +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Usecases/GetSimilarRecipe.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Usecases/GetSimilarRecipe.kt new file mode 100644 index 00000000..7800952a --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Domain/Usecases/GetSimilarRecipe.kt @@ -0,0 +1,7 @@ +package com.example.jay_recipesx.features.RecipeHome.Domain.Usecases + +import com.example.jay_recipesx.features.RecipeHome.Domain.Repositories.IRecipeRepo + +class GetSimilarRecipe(private val iRecipeRepo: IRecipeRepo) { + suspend fun call(id: String) = iRecipeRepo.getSimilarRecipes(id) +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/Screens/RecipeHomeScreen.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/Screens/RecipeHomeScreen.kt new file mode 100644 index 00000000..6e32f88e --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/Screens/RecipeHomeScreen.kt @@ -0,0 +1,174 @@ +package com.example.jay_recipesx.features.RecipeHome.Presentation.Screens + +import ContentComponent +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.background +import androidx.compose.material3.Text +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.runtime.Composable +import androidx.compose.runtime.State +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import coil.compose.SubcomposeAsyncImage +import com.example.jay_recipesx.Core.AppFunctions.AppFunctions.Companion.addBulletsToInstructions +import com.example.jay_recipesx.Core.AppFunctions.AppFunctions.Companion.removeHtmlTags +import com.example.jay_recipesx.Core.Components.ErrorComponent +import com.example.jay_recipesx.Core.Components.LoadingComponent +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeHomeErrorState +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeHomeEvent +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeHomeLoadingState +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeHomeState +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeHomeSuccessState +import com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel.RecipeViewModel + +@Composable +fun RecipeHomeScreen(modifier: Modifier = Modifier, viewModel: RecipeViewModel) { + + + val state = viewModel.recipes.collectAsState() + + if(state.value is RecipeHomeLoadingState){ + LoadingComponent() + } + else if(state.value is RecipeHomeErrorState) { + ErrorComponent(errorMessage = (state.value as RecipeHomeErrorState).errorMessage) + } + else if(state.value is RecipeHomeSuccessState){ + val recipe = (state.value as RecipeHomeSuccessState).recipes + val screenHeight = LocalConfiguration.current.screenHeightDp.dp + val twentyPercentHeight = screenHeight * 0.1f + + LazyColumn( + modifier = Modifier + .fillMaxSize() + .padding( + top = twentyPercentHeight, + start = 28.dp, + end = 28.dp + ), + ) { + + item { + Box( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) + .padding(16.dp), + contentAlignment = Alignment.Center + ) { + SubcomposeAsyncImage( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(16.dp)) // Ensure the image itself has rounded corners + .fillMaxSize(), // Ensure the image fills the entire Box + model = recipe.image, + contentDescription = null, + contentScale = ContentScale.FillBounds, // Fill all available space in the Box + loading = { + Box { + CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) + } + }, + ) + } + + // Add Spacer to push the text down + Spacer(modifier = Modifier.height(16.dp)) + Text( + text = recipe.title, + textAlign = TextAlign.Center, + fontWeight = FontWeight.Bold, + fontSize = 28.sp, + lineHeight = 32.sp, + ) + Spacer(modifier = Modifier.height(28.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly + ) { + Button( + onClick = { + viewModel.add(RecipeHomeEvent.GetRandomRecipeEvent()) + } + ) { + Text(text = "See Next") + } + } + Spacer(modifier = Modifier.height(28.dp)) + ContentComponent( + heading = "Summary", + content = recipe.summary, + ) + + Spacer(modifier = Modifier.height(28.dp)) + ContentComponent( + heading = "Instructions", + content = addBulletsToInstructions(instructions = recipe.instructions) + ) + Spacer(modifier = Modifier.height(28.dp)) + + + // Don't show if steps are not available ot analyzedInstructions is empty + if(recipe.analyzedInstructions.isNotEmpty()) + Column { + + Text(text = "Steps", + fontWeight = FontWeight.Bold, + fontSize = 20.sp + ) + + recipe.analyzedInstructions.get(0).steps.forEach() { step -> + + val stepNumber = step.number.toString() + val stepDescription = step.step + Row( + modifier = Modifier.padding(vertical = 6.dp) + ) { + Text(text = "$stepNumber. ", + fontWeight = FontWeight.Bold, + fontSize = 20.sp + ) + Text( + text = stepDescription, + textAlign = TextAlign.Justify, + overflow = TextOverflow.Ellipsis + + ) + } + } + } + + Spacer(modifier = Modifier.height(56.dp)) + } + } + } + else { + ErrorComponent(errorMessage = "Something went wrong") + } + +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeHomeEvent.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeHomeEvent.kt new file mode 100644 index 00000000..41067f1b --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeHomeEvent.kt @@ -0,0 +1,7 @@ +package com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel + +sealed class RecipeHomeEvent { + + class GetRandomRecipeEvent() : RecipeHomeEvent() + class GetSimilarRecipeEvent(id: String) : RecipeHomeEvent() +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeHomeState.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeHomeState.kt new file mode 100644 index 00000000..d8e3f3a5 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeHomeState.kt @@ -0,0 +1,23 @@ +package com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel + +import com.example.jay_recipesx.features.RecipeHome.Data.Models.Recipe +import com.example.jay_recipesx.features.RecipeHome.Data.Models.RecipeModel + + +sealed class RecipeHomeState + +class InitialRecipeHomeState : RecipeHomeState() + +data class RecipeHomeSuccessState( + val recipes: Recipe +) : RecipeHomeState() + +data class RecipeHomeErrorState( + val errorMessage: String +) : RecipeHomeState() + +class RecipeHomeLoadingState : RecipeHomeState() + +data class RecipeHomeSimilarListSuccessState( + val recipes: List +) : RecipeHomeState() diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeViewModel.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeViewModel.kt new file mode 100644 index 00000000..0daafbf9 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/features/RecipeHome/Presentation/ViewModel/RecipeViewModel.kt @@ -0,0 +1,59 @@ +package com.example.jay_recipesx.features.RecipeHome.Presentation.ViewModel + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.example.jay_recipesx.features.RecipeHome.Data.Repositories.RecipeRepoImpl +import com.example.jay_recipesx.features.RecipeHome.Domain.Repositories.IRecipeRepo +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class RecipeViewModel @Inject constructor( + private val iRecipeRepo : IRecipeRepo +) : ViewModel() { + + + private val _recipes = MutableStateFlow(InitialRecipeHomeState()) + val recipes: StateFlow = _recipes + + init { + onEvent(RecipeHomeEvent.GetRandomRecipeEvent()) + } + + fun add(event: RecipeHomeEvent) { + onEvent(event) + } + + private fun onEvent(event: RecipeHomeEvent) { + when (event) { + is RecipeHomeEvent.GetRandomRecipeEvent -> { + // Launch coroutine to handle API call in a non-blocking way + viewModelScope.launch { + _recipes.value = RecipeHomeLoadingState() + try { + // API will return list of recipes + // we need to extract the first recipe + val recipe = iRecipeRepo.getRandomRecipe().recipes.firstOrNull() + + if (recipe != null) { + _recipes.value = RecipeHomeSuccessState(recipes = recipe) + } else { + _recipes.value = RecipeHomeErrorState(errorMessage = "No recipe found") + } + } catch (e: Exception) { + _recipes.value = RecipeHomeErrorState(errorMessage = "Something went wrong: ${e.message}") + } + } + } + is RecipeHomeEvent.GetSimilarRecipeEvent -> { + } + else -> { + + } + } + } +} diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Color.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Color.kt new file mode 100644 index 00000000..8ff15c06 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package com.example.jay_recipesx.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Theme.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Theme.kt new file mode 100644 index 00000000..5e5f44f0 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Theme.kt @@ -0,0 +1,58 @@ +package com.example.jay_recipesx.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun JayRecipesXTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Type.kt b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Type.kt new file mode 100644 index 00000000..02464bb7 --- /dev/null +++ b/Jay-RecipesX/app/src/main/java/com/example/jay_recipesx/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package com.example.jay_recipesx.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/res/drawable/ic_launcher_background.xml b/Jay-RecipesX/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/Jay-RecipesX/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Jay-RecipesX/app/src/main/res/drawable/ic_launcher_foreground.xml b/Jay-RecipesX/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..2b068d11 --- /dev/null +++ b/Jay-RecipesX/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/Jay-RecipesX/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/Jay-RecipesX/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/Jay-RecipesX/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 00000000..6f3b755b --- /dev/null +++ b/Jay-RecipesX/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/Jay-RecipesX/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 00000000..c209e78e Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/Jay-RecipesX/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 00000000..b2dfe3d1 Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/Jay-RecipesX/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 00000000..4f0f1d64 Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/Jay-RecipesX/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 00000000..62b611da Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/Jay-RecipesX/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 00000000..948a3070 Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/Jay-RecipesX/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..1b9a6956 Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/Jay-RecipesX/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 00000000..28d4b77f Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/Jay-RecipesX/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9287f508 Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/Jay-RecipesX/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 00000000..aa7d6427 Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/Jay-RecipesX/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/Jay-RecipesX/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 00000000..9126ae37 Binary files /dev/null and b/Jay-RecipesX/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/Jay-RecipesX/app/src/main/res/values/colors.xml b/Jay-RecipesX/app/src/main/res/values/colors.xml new file mode 100644 index 00000000..f8c6127d --- /dev/null +++ b/Jay-RecipesX/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/res/values/strings.xml b/Jay-RecipesX/app/src/main/res/values/strings.xml new file mode 100644 index 00000000..365460da --- /dev/null +++ b/Jay-RecipesX/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Jay-RecipesX + \ No newline at end of file diff --git a/Jay-RecipesX/app/src/main/res/values/themes.xml b/Jay-RecipesX/app/src/main/res/values/themes.xml new file mode 100644 index 00000000..00eab0ca --- /dev/null +++ b/Jay-RecipesX/app/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ + + + +