From 677564eeb1a9f8b1da7b1c1819756e4cbaa4d0e0 Mon Sep 17 00:00:00 2001 From: Abinash6000 Date: Mon, 25 Dec 2023 22:30:01 +0530 Subject: [PATCH] first commit --- .gitignore | 15 ++ .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/gradle.xml | 20 ++ .idea/kotlinc.xml | 6 + .idea/misc.xml | 9 + app/.gitignore | 1 + app/build.gradle.kts | 67 +++++++ app/proguard-rules.pro | 21 ++ .../movievault/ExampleInstrumentedTest.kt | 24 +++ app/src/main/AndroidManifest.xml | 28 +++ .../com/project/movievault/MainActivity.kt | 11 ++ .../movievault/adapters/BindingAdapters.kt | 41 ++++ .../movievault/adapters/ShowsAdapter.kt | 38 ++++ .../movievault/fragments/DetailsFragment.kt | 40 ++++ .../movievault/fragments/MovieListFragment.kt | 53 +++++ .../com/project/movievault/model/Movie.kt | 34 ++++ .../movievault/network/MovieApiService.kt | 29 +++ .../movievault/utils/DataBindingUtils.kt | 32 +++ .../movievault/viewmodel/MovieViewModel.kt | 41 ++++ app/src/main/res/drawable/ic_broken_image.xml | 5 + .../main/res/drawable/ic_connection_error.xml | 10 + .../res/drawable/ic_launcher_background.png | Bin 0 -> 4236 bytes .../res/drawable/ic_launcher_foreground.png | Bin 0 -> 15404 bytes .../res/drawable/ic_launcher_monochrome.png | Bin 0 -> 15404 bytes .../drawable/ic_launcher_round_background.png | Bin 0 -> 4236 bytes .../drawable/ic_launcher_round_foreground.png | Bin 0 -> 15404 bytes .../drawable/ic_launcher_round_monochrome.png | Bin 0 -> 15404 bytes .../main/res/drawable/loading_animation.xml | 6 + app/src/main/res/drawable/loading_img.xml | 41 ++++ app/src/main/res/layout/activity_main.xml | 13 ++ app/src/main/res/layout/fragment_details.xml | 145 ++++++++++++++ .../main/res/layout/fragment_movie_list.xml | 65 ++++++ app/src/main/res/layout/movie_item.xml | 53 +++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 6 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 5407 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5549 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3452 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3497 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 7955 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 8161 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 12607 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 12917 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 18583 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 19174 bytes app/src/main/res/navigation/nav_graph.xml | 26 +++ app/src/main/res/values-night/themes.xml | 7 + app/src/main/res/values/colors.xml | 9 + app/src/main/res/values/strings.xml | 7 + app/src/main/res/values/themes.xml | 11 ++ app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../com/project/movievault/ExampleUnitTest.kt | 17 ++ build.gradle.kts | 13 ++ gradle.properties | 23 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle.kts | 17 ++ 61 files changed, 1311 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/misc.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/project/movievault/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/com/project/movievault/MainActivity.kt create mode 100644 app/src/main/java/com/project/movievault/adapters/BindingAdapters.kt create mode 100644 app/src/main/java/com/project/movievault/adapters/ShowsAdapter.kt create mode 100644 app/src/main/java/com/project/movievault/fragments/DetailsFragment.kt create mode 100644 app/src/main/java/com/project/movievault/fragments/MovieListFragment.kt create mode 100644 app/src/main/java/com/project/movievault/model/Movie.kt create mode 100644 app/src/main/java/com/project/movievault/network/MovieApiService.kt create mode 100644 app/src/main/java/com/project/movievault/utils/DataBindingUtils.kt create mode 100644 app/src/main/java/com/project/movievault/viewmodel/MovieViewModel.kt create mode 100644 app/src/main/res/drawable/ic_broken_image.xml create mode 100644 app/src/main/res/drawable/ic_connection_error.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.png create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.png create mode 100644 app/src/main/res/drawable/ic_launcher_monochrome.png create mode 100644 app/src/main/res/drawable/ic_launcher_round_background.png create mode 100644 app/src/main/res/drawable/ic_launcher_round_foreground.png create mode 100644 app/src/main/res/drawable/ic_launcher_round_monochrome.png create mode 100644 app/src/main/res/drawable/loading_animation.xml create mode 100644 app/src/main/res/drawable/loading_img.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/fragment_details.xml create mode 100644 app/src/main/res/layout/fragment_movie_list.xml create mode 100644 app/src/main/res/layout/movie_item.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/navigation/nav_graph.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/test/java/com/project/movievault/ExampleUnitTest.kt create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.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/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ae388c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..fdf8d99 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8978d23 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..5ac1239 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,67 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("kotlin-kapt") + id ("kotlin-parcelize") // @parcelize annotation + id("androidx.navigation.safeargs.kotlin") // for safeArgs +} + +android { + namespace = "com.project.movievault" + compileSdk = 34 + + defaultConfig { + applicationId = "com.project.movievault" + minSdk = 24 + targetSdk = 33 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + 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 { + dataBinding = true + } +} + +dependencies { + + implementation("androidx.core:core-ktx:1.9.0") + implementation("androidx.appcompat:appcompat:1.6.1") + implementation("com.google.android.material:material:1.11.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.5") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") + + implementation("androidx.navigation:navigation-fragment-ktx:2.6.0") + implementation("androidx.navigation:navigation-ui-ktx:2.6.0") + + // Moshi + implementation("com.squareup.moshi:moshi-kotlin:1.13.0") + + // Retrofit with Moshi Converter + implementation("com.squareup.retrofit2:converter-moshi:2.9.0") + + implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.0") + + // Coil + implementation("io.coil-kt:coil:2.2.2") +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/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/app/src/androidTest/java/com/project/movievault/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/project/movievault/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..e9c6964 --- /dev/null +++ b/app/src/androidTest/java/com/project/movievault/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.project.movievault + +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.project.movievault", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..471b76e --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/MainActivity.kt b/app/src/main/java/com/project/movievault/MainActivity.kt new file mode 100644 index 0000000..1f20d2d --- /dev/null +++ b/app/src/main/java/com/project/movievault/MainActivity.kt @@ -0,0 +1,11 @@ +package com.project.movievault + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/adapters/BindingAdapters.kt b/app/src/main/java/com/project/movievault/adapters/BindingAdapters.kt new file mode 100644 index 0000000..7b11f76 --- /dev/null +++ b/app/src/main/java/com/project/movievault/adapters/BindingAdapters.kt @@ -0,0 +1,41 @@ +package com.project.movievault.adapters + +import android.view.View +import android.widget.ImageView +import androidx.core.net.toUri +import androidx.databinding.BindingAdapter +import coil.load +import com.project.movievault.R +import com.project.movievault.viewmodel.MovieApiStatus + +@BindingAdapter("imageUrl") +fun bindImage(imgView: ImageView, imgUrl: String?) { + imgUrl?.let { + val imgUri = imgUrl.toUri().buildUpon().scheme("https").build() + imgView.load(imgUri) { + placeholder(R.drawable.loading_animation) + error(R.drawable.ic_broken_image) + } + } +} + +@BindingAdapter("moviesApiStatus") +fun bindStatus(statusImageView: ImageView, status: MovieApiStatus?) { + when(status) { + MovieApiStatus.LOADING -> { + statusImageView.visibility = View.VISIBLE + statusImageView.setImageResource(R.drawable.loading_animation) + } + MovieApiStatus.ERROR -> { + statusImageView.visibility = View.VISIBLE + statusImageView.setImageResource(R.drawable.ic_connection_error) + } + MovieApiStatus.DONE -> { + statusImageView.visibility = View.GONE + } + + else -> { + statusImageView.visibility = View.GONE + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/adapters/ShowsAdapter.kt b/app/src/main/java/com/project/movievault/adapters/ShowsAdapter.kt new file mode 100644 index 0000000..2ea550d --- /dev/null +++ b/app/src/main/java/com/project/movievault/adapters/ShowsAdapter.kt @@ -0,0 +1,38 @@ +package com.project.movievault.adapters + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.project.movievault.databinding.MovieItemBinding +import com.project.movievault.model.ShowDetails +import com.project.movievault.model.ShowResponse + +class ShowsAdapter(private val myDataset: List, private val listener: MyShowsItemClickListener) : RecyclerView.Adapter() { + class ShowsViewHolder(private val binding: MovieItemBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(showResponse: ShowResponse, listener: MyShowsItemClickListener) { + binding.titleTV.text = showResponse.show.name + binding.image = showResponse.show.image + binding.root.setOnClickListener { + listener.onShowItemClicked(showResponse.show) + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ShowsViewHolder { + return ShowsViewHolder(MovieItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) + } + + override fun getItemCount() = myDataset.size + + override fun onBindViewHolder(holder: ShowsViewHolder, position: Int) { +// val data = myDataset[position] +// val urlToImage = data.urlToImage +// if(urlToImage!=null) + holder.bind(myDataset[position], listener) +// else Log.d("adfasl", "Url of image was null here") + } +} + +interface MyShowsItemClickListener { + fun onShowItemClicked(showDetails: ShowDetails) +} \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/fragments/DetailsFragment.kt b/app/src/main/java/com/project/movievault/fragments/DetailsFragment.kt new file mode 100644 index 0000000..e4d5967 --- /dev/null +++ b/app/src/main/java/com/project/movievault/fragments/DetailsFragment.kt @@ -0,0 +1,40 @@ +package com.project.movievault.fragments + +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.fragment.navArgs +import com.project.movievault.databinding.FragmentDetailsBinding + +class DetailsFragment : Fragment() { + private var _binding: FragmentDetailsBinding? = null + private val binding get() = _binding!! + private val args: DetailsFragmentArgs by navArgs() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + // Inflate the layout for this fragment + _binding = FragmentDetailsBinding.inflate(inflater, container, false) + + val show = args.show + binding.showDetails = show + binding.visitSiteBtn.setOnClickListener { + val uri: Uri = Uri.parse(show.officialSite) + val intent = Intent(Intent.ACTION_VIEW, uri) + startActivity(intent) + } + + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/fragments/MovieListFragment.kt b/app/src/main/java/com/project/movievault/fragments/MovieListFragment.kt new file mode 100644 index 0000000..6574b23 --- /dev/null +++ b/app/src/main/java/com/project/movievault/fragments/MovieListFragment.kt @@ -0,0 +1,53 @@ +package com.project.movievault.fragments + +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.viewModels +import androidx.navigation.fragment.findNavController +import com.project.movievault.adapters.MyShowsItemClickListener +import com.project.movievault.adapters.ShowsAdapter +import com.project.movievault.databinding.FragmentMovieListBinding +import com.project.movievault.model.ShowDetails +import com.project.movievault.viewmodel.MovieViewModel + +class MovieListFragment : Fragment(), MyShowsItemClickListener { + + private val viewModel: MovieViewModel by viewModels() + private var _binding: FragmentMovieListBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + _binding = FragmentMovieListBinding.inflate(inflater, container, false) + binding.lifecycleOwner = this + binding.viewModel = viewModel + + viewModel.shows.observe(viewLifecycleOwner) { data -> + Log.d("adfasl", "Data Changed $data") + + val showsAdp = ShowsAdapter(data, this) + binding.showsRV.adapter = showsAdp + } + + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onShowItemClicked(showDetails: ShowDetails) { + val action = MovieListFragmentDirections.actionMovieListFragmentToDetailsFragment(showDetails) + findNavController().navigate(action) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/model/Movie.kt b/app/src/main/java/com/project/movievault/model/Movie.kt new file mode 100644 index 0000000..b751222 --- /dev/null +++ b/app/src/main/java/com/project/movievault/model/Movie.kt @@ -0,0 +1,34 @@ +package com.project.movievault.model + +import android.os.Parcelable +import com.fasterxml.jackson.annotation.JsonIgnoreProperties +import com.squareup.moshi.Json +import kotlinx.parcelize.Parcelize + +@JsonIgnoreProperties(ignoreUnknown = true) +data class ShowResponse( + val show: ShowDetails +) + +@JsonIgnoreProperties(ignoreUnknown = true) +@Parcelize +data class ShowDetails( + val name: String?, + val genres: List?, + val premiered: String?, + val officialSite: String?, + val rating: Rating, + val image: Image?, + val summary: String?, +) : Parcelable + +@Parcelize +data class Rating( + val average: Double? +) : Parcelable + +@JsonIgnoreProperties(ignoreUnknown = true) +@Parcelize +data class Image( + val medium: String +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/network/MovieApiService.kt b/app/src/main/java/com/project/movievault/network/MovieApiService.kt new file mode 100644 index 0000000..a23743c --- /dev/null +++ b/app/src/main/java/com/project/movievault/network/MovieApiService.kt @@ -0,0 +1,29 @@ +package com.project.movievault.network + +import com.project.movievault.model.ShowResponse +import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory +import retrofit2.Retrofit +import retrofit2.converter.moshi.MoshiConverterFactory +import retrofit2.http.GET +import retrofit2.http.Query + +private const val BASE_URL = "https://api.tvmaze.com/" + +private val moshi = Moshi.Builder() + .add(KotlinJsonAdapterFactory()) + .build() + +private val retrofit = Retrofit.Builder() + .addConverterFactory(MoshiConverterFactory.create(moshi)) + .baseUrl(BASE_URL) + .build() + +interface MovieApiService { + @GET("search/shows?q=all") + suspend fun getShowResponses(): List +} + +object MoviesApi { + val retrofitService: MovieApiService by lazy { retrofit.create(MovieApiService::class.java) } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/utils/DataBindingUtils.kt b/app/src/main/java/com/project/movievault/utils/DataBindingUtils.kt new file mode 100644 index 0000000..1e8bbd5 --- /dev/null +++ b/app/src/main/java/com/project/movievault/utils/DataBindingUtils.kt @@ -0,0 +1,32 @@ +package com.project.movievault.utils + +import android.util.Log + +object DataBindingUtils { + + @JvmStatic + fun removeTags(summary: String?): String { + val list = summary?.split("

","

","","") + var returnString = "" + if (list != null) { + for(s: String in list) { + + returnString += s + } + } + + return returnString + } + + @JvmStatic + fun listToStr(genres: List?): String { + var returnString = "" + if (genres != null) { + for(s: String in genres) { + returnString += ("$s ") + } + } + + return "Genres: $returnString" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/project/movievault/viewmodel/MovieViewModel.kt b/app/src/main/java/com/project/movievault/viewmodel/MovieViewModel.kt new file mode 100644 index 0000000..a4488cd --- /dev/null +++ b/app/src/main/java/com/project/movievault/viewmodel/MovieViewModel.kt @@ -0,0 +1,41 @@ +package com.project.movievault.viewmodel + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.project.movievault.model.ShowResponse +import com.project.movievault.network.MoviesApi +import kotlinx.coroutines.launch + +enum class MovieApiStatus { + LOADING, ERROR, DONE +} + +class MovieViewModel : ViewModel() { + + private val _status = MutableLiveData() + val status: LiveData get() = _status + + private val _shows = MutableLiveData>() + val shows: LiveData> get() = _shows + + init { + getShowResponses() + } + + private fun getShowResponses() { + viewModelScope.launch { + _status.value = MovieApiStatus.LOADING + try { + _shows.value = MoviesApi.retrofitService.getShowResponses() + _status.value = MovieApiStatus.DONE + } catch (e: Exception) { + Log.d("abcd",e.toString()) + _status.value = MovieApiStatus.ERROR + _shows.value = listOf() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_broken_image.xml b/app/src/main/res/drawable/ic_broken_image.xml new file mode 100644 index 0000000..c8d6dd3 --- /dev/null +++ b/app/src/main/res/drawable/ic_broken_image.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_connection_error.xml b/app/src/main/res/drawable/ic_connection_error.xml new file mode 100644 index 0000000..ec52aa8 --- /dev/null +++ b/app/src/main/res/drawable/ic_connection_error.xml @@ -0,0 +1,10 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.png b/app/src/main/res/drawable/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfb94c286027bf280710cbe3cfb989d65f0309b GIT binary patch literal 4236 zcmeAS@N?(olHy`uVBq!ia0y~yVB7%09Be?56MhC-K#H+A$lZxy-8q?;3=9Hpo-U3d z6>)E`9^_NQ6U$l_z48*+NdB!3P?Cf<#6gHX351X>2rCjuscA1?*^*G+I}V zwk}57W1|hl(WdoiXJoXO1nNbO_A9B|6aT<4XVug>n;VPX0EZVCJYD@<);T3K0RU%C BI~)K2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_foreground.png b/app/src/main/res/drawable/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb6fa63180babab26c305957bae56433f444b32 GIT binary patch literal 15404 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 KU;WDJ{r>@PwzyUR literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_monochrome.png b/app/src/main/res/drawable/ic_launcher_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb6fa63180babab26c305957bae56433f444b32 GIT binary patch literal 15404 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 KU;WDJ{r>@PwzyUR literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_round_background.png b/app/src/main/res/drawable/ic_launcher_round_background.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfb94c286027bf280710cbe3cfb989d65f0309b GIT binary patch literal 4236 zcmeAS@N?(olHy`uVBq!ia0y~yVB7%09Be?56MhC-K#H+A$lZxy-8q?;3=9Hpo-U3d z6>)E`9^_NQ6U$l_z48*+NdB!3P?Cf<#6gHX351X>2rCjuscA1?*^*G+I}V zwk}57W1|hl(WdoiXJoXO1nNbO_A9B|6aT<4XVug>n;VPX0EZVCJYD@<);T3K0RU%C BI~)K2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_round_foreground.png b/app/src/main/res/drawable/ic_launcher_round_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb6fa63180babab26c305957bae56433f444b32 GIT binary patch literal 15404 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 KU;WDJ{r>@PwzyUR literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_round_monochrome.png b/app/src/main/res/drawable/ic_launcher_round_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb6fa63180babab26c305957bae56433f444b32 GIT binary patch literal 15404 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 KU;WDJ{r>@PwzyUR literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/loading_animation.xml b/app/src/main/res/drawable/loading_animation.xml new file mode 100644 index 0000000..75ba385 --- /dev/null +++ b/app/src/main/res/drawable/loading_animation.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/drawable/loading_img.xml b/app/src/main/res/drawable/loading_img.xml new file mode 100644 index 0000000..6b3e5b7 --- /dev/null +++ b/app/src/main/res/drawable/loading_img.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..c247417 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_details.xml b/app/src/main/res/layout/fragment_details.xml new file mode 100644 index 0000000..ef8b562 --- /dev/null +++ b/app/src/main/res/layout/fragment_details.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +