From 80952738f44878245c406450e44bf8bb65762fd2 Mon Sep 17 00:00:00 2001 From: Flavio Campos Date: Wed, 10 Apr 2019 16:11:44 -0300 Subject: [PATCH 1/2] initial commit android-challenge --- .gitignore | 13 + .idea/codeStyles/Project.xml | 147 ++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/gradle.xml | 18 ++ .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/misc.xml | 14 + .idea/runConfigurations.xml | 12 + app/.gitignore | 1 + app/build.gradle | 39 +++ app/proguard-rules.pro | 21 ++ .../ExampleInstrumentedTest.kt | 24 ++ app/src/main/AndroidManifest.xml | 25 ++ .../androiddeveloperchallenge/ItemDetails.kt | 82 ++++++ .../androiddeveloperchallenge/MainActivity.kt | 245 ++++++++++++++++ .../adapters/PosterAdapter.kt | 50 ++++ .../models/SearchObjectResponse.kt | 39 +++ .../services/RetrofitInitializer.kt | 19 ++ .../services/SearchIMDbIdService.kt | 12 + .../services/SearchTitleService.kt | 12 + .../services/SearchTitleTypeService.kt | 12 + .../services/SearchTitleYearService.kt | 12 + .../drawable-v24/ic_launcher_foreground.xml | 34 +++ .../main/res/drawable/card_view_gradient.xml | 13 + .../drawable/card_view_year_background.xml | 9 + .../res/drawable/ic_launcher_background.xml | 74 +++++ app/src/main/res/drawable/image_not_found.png | Bin 0 -> 9367 bytes app/src/main/res/drawable/spinner_bg.xml | 17 ++ .../main/res/layout/activity_item_details.xml | 270 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 251 ++++++++++++++++ app/src/main/res/layout/item_grid_view.xml | 85 ++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2963 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 4905 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2060 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2783 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6895 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6387 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10413 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9128 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15132 bytes app/src/main/res/values/colors.xml | 6 + app/src/main/res/values/strings.xml | 10 + app/src/main/res/values/styles.xml | 11 + .../main/res/xml/network_security_config.xml | 6 + .../ExampleUnitTest.kt | 17 ++ build.gradle | 28 ++ gradle.properties | 15 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++ gradlew.bat | 84 ++++++ settings.gradle | 1 + 54 files changed, 1927 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/runConfigurations.xml create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/br/com/codigozeroum/androiddeveloperchallenge/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/ItemDetails.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/MainActivity.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/adapters/PosterAdapter.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/models/SearchObjectResponse.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/RetrofitInitializer.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchIMDbIdService.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleService.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleTypeService.kt create mode 100644 app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleYearService.kt create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/card_view_gradient.xml create mode 100644 app/src/main/res/drawable/card_view_year_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/image_not_found.png create mode 100644 app/src/main/res/drawable/spinner_bg.xml create mode 100644 app/src/main/res/layout/activity_item_details.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/item_grid_view.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/values/colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/test/java/br/com/codigozeroum/androiddeveloperchallenge/ExampleUnitTest.kt create mode 100644 build.gradle 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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b75303 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +*.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 diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..e96cda9 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..7ac24c7 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..d86ad61 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.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..af0bbdd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..aecf84e --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,39 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "br.com.codigozeroum.androiddeveloperchallenge" + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + //noinspection GradleCompatible + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:animated-vector-drawable:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'com.android.support:cardview-v7:28.0.0' + implementation 'com.squareup.retrofit2:retrofit:2.3.0' + implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.squareup.picasso:picasso:2.71828' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /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 diff --git a/app/src/androidTest/java/br/com/codigozeroum/androiddeveloperchallenge/ExampleInstrumentedTest.kt b/app/src/androidTest/java/br/com/codigozeroum/androiddeveloperchallenge/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..861a94d --- /dev/null +++ b/app/src/androidTest/java/br/com/codigozeroum/androiddeveloperchallenge/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package br.com.codigozeroum.androiddeveloperchallenge + +import android.support.test.InstrumentationRegistry +import android.support.test.runner.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.getTargetContext() + assertEquals("br.com.codigozeroum.androiddeveloperchallenge", appContext.packageName) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..73ba2df --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/ItemDetails.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/ItemDetails.kt new file mode 100644 index 0000000..91c47f4 --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/ItemDetails.kt @@ -0,0 +1,82 @@ +package br.com.codigozeroum.androiddeveloperchallenge + +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import br.com.codigozeroum.androiddeveloperchallenge.models.ResultIMDbId +import br.com.codigozeroum.androiddeveloperchallenge.services.RetrofitInitializer +import com.squareup.picasso.Picasso +import kotlinx.android.synthetic.main.activity_item_details.* +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class ItemDetails : AppCompatActivity() { + + private val apikey = "7a4c5cac" + private val plot = "full" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_item_details) + + val actionBar = supportActionBar + actionBar!!.title = "Detalhes" + actionBar.setDisplayHomeAsUpEnabled(true) + + val imdbID = intent.getStringExtra("imdbID") + + val call = RetrofitInitializer().searchMovieIMDbIdService().searchMovieIMDbId(imdbID, plot, apikey) + + call.enqueue(object : Callback { + + override fun onResponse(call: Call?, response: Response?) { + + if (response?.body()?.Response?.toBoolean()!!) { + + val result:ResultIMDbId = response.body().let{ it!! } + this@ItemDetails.setDetailsValues(result) + + } else { + Toast.makeText(this@ItemDetails, response.body()?.Error, Toast.LENGTH_SHORT).show() + } + } + + override fun onFailure(call: Call?, t: Throwable?) { + Log.e("onFailure error", t?.message) + } + }) + + } + + fun setDetailsValues(result: ResultIMDbId){ + + if(result.Poster == "N/A"){ + Picasso.get().load(R.drawable.image_not_found).resize(800, 1000).centerCrop().into(ivPoster) + } else{ + Picasso.get().load(result.Poster).resize(800, 1000).centerCrop().into(ivPoster) + } + rtbRating.rating = (result.imdbRating.toFloat()) / 2 + tvRating.text = "Rating IMDb: ${result.imdbRating}" + tvTotalVotes.text = "Total de Votos: ${result.imdbVotes}" + tvTitle.text = result.Title + tvRuntime.text = result.Runtime + tvProduction.text = result.Production + tvDirector.text = result.Director + tvGenre.text = result.Genre + + tvAnoReleased.text = "${result.Year} / ${result.Released}" + tvLanguageCountry.text = "${result.Language} / ${result.Country}" + tvWriter.text = result.Writer + tvActors.text = result.Actors + tvPlot.text = result.Plot + tvRated.text = result.Rated + + } + + override fun onSupportNavigateUp(): Boolean { + onBackPressed() + return true + } +} diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/MainActivity.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/MainActivity.kt new file mode 100644 index 0000000..911e5f7 --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/MainActivity.kt @@ -0,0 +1,245 @@ +package br.com.codigozeroum.androiddeveloperchallenge + +import android.content.Context +import android.content.Intent +import android.net.ConnectivityManager +import android.net.NetworkInfo +import android.support.v7.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.view.View +import android.view.inputmethod.InputMethodManager +import android.widget.AdapterView +import android.widget.Button +import android.widget.RadioButton +import android.widget.Toast +import br.com.codigozeroum.androiddeveloperchallenge.adapters.PosterAdapter +import br.com.codigozeroum.androiddeveloperchallenge.models.Result +import br.com.codigozeroum.androiddeveloperchallenge.models.SearchObjectResponse +import br.com.codigozeroum.androiddeveloperchallenge.services.RetrofitInitializer +import kotlinx.android.synthetic.main.activity_main.* +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class MainActivity : AppCompatActivity() { + + private val apikey = "7a4c5cac" + var posterAdapter: PosterAdapter? = null + private var rbSelectedText: String = "Título" + var searchResult: List? = null + var pages = 0 + var pageAtual = 0 + + var tituloPerquisa = "" + var anoPesquisa = "" + var tipoPesquisa = "" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + val actionBar = supportActionBar + actionBar!!.title = "Home - Pesquisa" + + radioGroup.setOnCheckedChangeListener{ _, checkedId -> + + rbSelectedText = findViewById(checkedId).text.toString() + + when(rbSelectedText){ + "Título" -> { + llTitulo.visibility = View.VISIBLE + llTituloTipo.visibility = View.GONE + llTituloAno.visibility = View.GONE + } + "Título+Tipo" -> { + llTitulo.visibility = View.GONE + llTituloTipo.visibility = View.VISIBLE + llTituloAno.visibility = View.GONE + } + "Título+Ano" -> { + llTitulo.visibility = View.GONE + llTituloTipo.visibility = View.GONE + llTituloAno.visibility = View.VISIBLE + } + } + } + + btn_Buscar.setOnClickListener {v: View -> + + if(this.isNetworkAvailable()){ + + this.showOrDismissLoading() + + val imm = this@MainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(v.windowToken, 0) + + when(rbSelectedText){ + "Título" -> this.searchTitulo(etT_titulo.text.toString(), 1) + "Título+Tipo" -> this.searchTituloTipo(etTT_titulo.text.toString(), spnTT_tipo.selectedItem.toString(), 1) + "Título+Ano" -> this.searchTituloAno(etTA_titulo.text.toString(), etTA_ano.text.toString(), 1) + } + }else{ + Toast.makeText(this@MainActivity, "Favor Verificar sua Conexão de INTERNET", Toast.LENGTH_LONG).show() + } + + } + + btn_next.setOnClickListener { v: View -> + + if(this.isNetworkAvailable()){ + when(rbSelectedText){ + "Título" -> this.searchTitulo(tituloPerquisa, (++ pageAtual) ) + "Título+Tipo" -> this.searchTituloTipo(tituloPerquisa, tipoPesquisa, (++ pageAtual)) + "Título+Ano" -> this.searchTituloAno(tituloPerquisa, anoPesquisa, (++ pageAtual)) + } + }else{ + Toast.makeText(this@MainActivity, "Favor Verificar sua Conexão de INTERNET", Toast.LENGTH_LONG).show() + } + + } + + btn_previous.setOnClickListener { v: View -> + + if(this.isNetworkAvailable()){ + when(rbSelectedText){ + "Título" -> this.searchTitulo(tituloPerquisa, (-- pageAtual) ) + "Título+Tipo" -> this.searchTituloTipo(tituloPerquisa, tipoPesquisa, (-- pageAtual)) + "Título+Ano" -> this.searchTituloAno(tituloPerquisa, anoPesquisa, (-- pageAtual)) + } + }else{ + Toast.makeText(this@MainActivity, "Favor Verificar sua Conexão de INTERNET", Toast.LENGTH_LONG).show() + } + } + + btn_inicio.setOnClickListener { v: View -> + + if(this.isNetworkAvailable()){ + when(rbSelectedText){ + "Título" -> this.searchTitulo(tituloPerquisa, 1) + "Título+Tipo" -> this.searchTituloTipo(tituloPerquisa, tipoPesquisa, 1) + "Título+Ano" -> this.searchTituloAno(tituloPerquisa, anoPesquisa, 1) + } + }else{ + Toast.makeText(this@MainActivity, "Favor Verificar sua Conexão de INTERNET", Toast.LENGTH_LONG).show() + } + } + + gridview.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> + + if(this.isNetworkAvailable()){ + val imdbID = posterAdapter!!.getItem(position).imdbID + + val intent = Intent(this, ItemDetails::class.java) + intent.putExtra("imdbID", imdbID) + startActivity(intent) + + }else{ + Toast.makeText(this@MainActivity, "Favor Verificar sua Conexão de INTERNET", Toast.LENGTH_LONG).show() + } + } + + } + + private fun isNetworkAvailable(): Boolean { + val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) + return if (connectivityManager is ConnectivityManager) { + val networkInfo: NetworkInfo? = connectivityManager.activeNetworkInfo + (networkInfo?.isConnected != null) + } else false + } + + fun searchTitulo(titulo: String, page: Int){ + + tituloPerquisa = titulo + pageAtual = page + val call = RetrofitInitializer().searchTitleService().searchMoviesTitle(titulo, page, apikey) + this.showResults(call, page) + } + + fun searchTituloTipo(titulo: String, tipo: String, page: Int){ + + tituloPerquisa = titulo + tipoPesquisa = tipo + pageAtual = page + val call = RetrofitInitializer().searchTitleTypeService().searchMoviesTitleType(titulo, tipo, page, apikey) + this.showResults(call, page) + } + + fun searchTituloAno(titulo: String, ano: String, page: Int){ + + tituloPerquisa = titulo + anoPesquisa = ano + pageAtual = page + val call = RetrofitInitializer().searchTitleYearService().searchMoviesTitleYear(titulo, ano.toInt(), page, apikey) + this.showResults(call, page) + } + + fun showResults(call: Call, page: Int){ + + btn_previous.visibility = if(pageAtual == 1) View.INVISIBLE else View.VISIBLE + btn_inicio.visibility = btn_previous.visibility + + call.enqueue(object : Callback { + + override fun onResponse(call: Call?, response: Response?) { + + if(response?.body()?.Response?.toBoolean()!!){ + + searchResult = response?.body()?.Search + var totalResults = response?.body()?.totalResults?.toInt() + + if(searchResult != null){ + + tvResultsCount.text = "Resultado: $totalResults itens" + + pages = if(totalResults != null && totalResults > 10) totalResults /10 + 1 else 1 + + btn_next.visibility = if(pages > 1 && pageAtual < pages) View.VISIBLE else View.INVISIBLE + + tvPagination.visibility = View.VISIBLE + tvPagination.text = "Página $pageAtual de $pages" + + this@MainActivity.showOrDismissLoading() + + posterAdapter = PosterAdapter(this@MainActivity, searchResult!!) + gridview.adapter = posterAdapter + } + + }else{ + this@MainActivity.showOrDismissLoading() + Toast.makeText(this@MainActivity, response.body()?.Error , Toast.LENGTH_SHORT).show() + } + + } + + override fun onFailure(call: Call?, t: Throwable?) { + tvPagination.visibility = View.GONE + btn_next.visibility = View.GONE + btn_previous.visibility = View.GONE + btn_inicio.visibility = View.GONE + this@MainActivity.showOrDismissLoading() + Log.e("onFailure error", t?.message) + } + }) + } + + fun showOrDismissLoading(){ + val visibility = if (progressBar.visibility == View.GONE) View.VISIBLE else View.GONE + progressBar.visibility = visibility + } +} + + + + + + + + + + + + + + diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/adapters/PosterAdapter.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/adapters/PosterAdapter.kt new file mode 100644 index 0000000..52ef84d --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/adapters/PosterAdapter.kt @@ -0,0 +1,50 @@ +package br.com.codigozeroum.androiddeveloperchallenge.adapters + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import br.com.codigozeroum.androiddeveloperchallenge.R +import br.com.codigozeroum.androiddeveloperchallenge.models.Result +import com.squareup.picasso.Callback +import com.squareup.picasso.Picasso +import kotlinx.android.synthetic.main.item_grid_view.view.* + +class PosterAdapter(context: Context, var posterList: List) : BaseAdapter() { + + var context: Context? = context + + override fun getItem(position: Int): Result { + return posterList[position] + } + + override fun getItemId(position: Int): Long { + return position.toLong() + } + + override fun getCount(): Int { + return posterList.size + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + + val poster = this.posterList[position] + + var inflator = context!!.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + + var posterCardView = inflator.inflate(R.layout.item_grid_view, null) + + if(poster.Poster == "N/A"){ + Picasso.get().load(R.drawable.image_not_found).resize(800, 1000).centerCrop().into(posterCardView.ivImagePoster) + } else{ + Picasso.get().load(poster.Poster).resize(800, 1000).centerCrop().into(posterCardView.ivImagePoster) + } + + posterCardView.tvYear.text = poster.Year + posterCardView.tvTitle.text = poster.Title + + return posterCardView + } + +} \ No newline at end of file diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/models/SearchObjectResponse.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/models/SearchObjectResponse.kt new file mode 100644 index 0000000..7c66471 --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/models/SearchObjectResponse.kt @@ -0,0 +1,39 @@ +package br.com.codigozeroum.androiddeveloperchallenge.models + +class SearchObjectResponse( + var Search: List, + var totalResults: String, + var Response: String, + var Error: String +) + +class Result( + var Title: String, + var Year: String, + var imdbID: String, + var Type: String, + var Poster: String +) + +class ResultIMDbId( + var Title: String, + var Year: String, + var Rated: String, + var Released: String, + var Runtime: String, + var Genre: String, + var Director: String, + var Writer: String, + var Actors: String, + var Plot: String, + var Language: String, + var Country: String, + var Poster: String, + var imdbRating: String, + var imdbVotes: String, + var imdbID: String, + var Type: String, + var Production: String, + var Response: String, + var Error: String +) \ No newline at end of file diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/RetrofitInitializer.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/RetrofitInitializer.kt new file mode 100644 index 0000000..fc5544f --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/RetrofitInitializer.kt @@ -0,0 +1,19 @@ +package br.com.codigozeroum.androiddeveloperchallenge.services + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class RetrofitInitializer { + + private val retrofit = Retrofit.Builder() + .baseUrl("http://www.omdbapi.com") + .addConverterFactory(GsonConverterFactory.create()) + .build() + + fun searchTitleService() = retrofit.create(SearchTitleService::class.java) + fun searchTitleTypeService() = retrofit.create(SearchTitleTypeService::class.java) + fun searchTitleYearService() = retrofit.create(SearchTitleYearService::class.java) + + fun searchMovieIMDbIdService() = retrofit.create(SearchIMDbIdService::class.java) + +} \ No newline at end of file diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchIMDbIdService.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchIMDbIdService.kt new file mode 100644 index 0000000..5694e81 --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchIMDbIdService.kt @@ -0,0 +1,12 @@ +package br.com.codigozeroum.androiddeveloperchallenge.services + +import br.com.codigozeroum.androiddeveloperchallenge.models.ResultIMDbId +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Query + +interface SearchIMDbIdService { + + @GET("/") + fun searchMovieIMDbId(@Query("i") i: String, @Query("plot") plot: String, @Query("apikey") apikey: String): Call +} \ No newline at end of file diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleService.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleService.kt new file mode 100644 index 0000000..021a6de --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleService.kt @@ -0,0 +1,12 @@ +package br.com.codigozeroum.androiddeveloperchallenge.services + +import br.com.codigozeroum.androiddeveloperchallenge.models.SearchObjectResponse +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Query + +interface SearchTitleService { + + @GET("/") + fun searchMoviesTitle(@Query("s") s: String, @Query("page") page: Int, @Query("apikey") apikey: String): Call +} \ No newline at end of file diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleTypeService.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleTypeService.kt new file mode 100644 index 0000000..5f1fed7 --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleTypeService.kt @@ -0,0 +1,12 @@ +package br.com.codigozeroum.androiddeveloperchallenge.services + +import br.com.codigozeroum.androiddeveloperchallenge.models.SearchObjectResponse +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Query + +interface SearchTitleTypeService { + + @GET("/") + fun searchMoviesTitleType(@Query("s") s: String, @Query("type") type: String, @Query("page") page: Int, @Query("apikey") apikey: String): Call +} \ No newline at end of file diff --git a/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleYearService.kt b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleYearService.kt new file mode 100644 index 0000000..31f59b4 --- /dev/null +++ b/app/src/main/java/br/com/codigozeroum/androiddeveloperchallenge/services/SearchTitleYearService.kt @@ -0,0 +1,12 @@ +package br.com.codigozeroum.androiddeveloperchallenge.services + +import br.com.codigozeroum.androiddeveloperchallenge.models.SearchObjectResponse +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Query + +interface SearchTitleYearService { + + @GET("/") + fun searchMoviesTitleYear(@Query("s") s: String, @Query("y") y: Int, @Query("page") page: Int, @Query("apikey") apikey: String): Call +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..6348baa --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/card_view_gradient.xml b/app/src/main/res/drawable/card_view_gradient.xml new file mode 100644 index 0000000..73ffc86 --- /dev/null +++ b/app/src/main/res/drawable/card_view_gradient.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/card_view_year_background.xml b/app/src/main/res/drawable/card_view_year_background.xml new file mode 100644 index 0000000..5a485e7 --- /dev/null +++ b/app/src/main/res/drawable/card_view_year_background.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..a0ad202 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/image_not_found.png b/app/src/main/res/drawable/image_not_found.png new file mode 100644 index 0000000000000000000000000000000000000000..ab16bed452fe0c839868335f639038e5e5140ae7 GIT binary patch literal 9367 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 kE + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_item_details.xml b/app/src/main/res/layout/activity_item_details.xml new file mode 100644 index 0000000..652b022 --- /dev/null +++ b/app/src/main/res/layout/activity_item_details.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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..48bdcc8 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +