Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desafio Finalizado #40

Open
wants to merge 53 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
5b87802
Initial Commit
arthurgonzaga Sep 24, 2021
216d2f8
Change package location
arthurgonzaga Sep 24, 2021
c6c7909
Change themes and colors. Add new fonts
arthurgonzaga Sep 24, 2021
84dc0a1
Small changes to the style files
arthurgonzaga Sep 24, 2021
7d19137
Implement the Item layout for the RecyclerView
arthurgonzaga Sep 24, 2021
5c9d940
Implement the Header UI
arthurgonzaga Sep 24, 2021
70eab1c
Change the gray color to onBackgroundColor
arthurgonzaga Sep 24, 2021
d931fbc
Add TitleTextAppearance
arthurgonzaga Sep 24, 2021
615523d
Turn ViewBinding on
arthurgonzaga Sep 24, 2021
e108bb8
Implement CharacterInfo custom ViewGroup
arthurgonzaga Sep 24, 2021
33b8e5e
Add initial dependencies
arthurgonzaga Sep 24, 2021
7cbf705
Add background color
arthurgonzaga Sep 24, 2021
cc3d7e1
Add HomeFragment
arthurgonzaga Sep 24, 2021
427c396
Add the DetailFragment and update the CharacterInfo
arthurgonzaga Sep 24, 2021
d39fb21
Update titles of CharacterInfos
arthurgonzaga Sep 24, 2021
95d2202
Improve GridLayout columns
arthurgonzaga Sep 24, 2021
01ab564
Add the DFavoriteListFragment
arthurgonzaga Sep 24, 2021
2f6b8f4
Update border background
arthurgonzaga Sep 24, 2021
d59d6a3
Add search bar and favorite button
arthurgonzaga Sep 24, 2021
6d56630
Update FavoriteListFragment
arthurgonzaga Sep 24, 2021
9e17340
Implement navigation to FavoriteListFragment and add tests
arthurgonzaga Sep 24, 2021
1fcc203
Add the responses models for the API
arthurgonzaga Sep 25, 2021
6bcc7d3
Improve CharacterResponse class
arthurgonzaga Sep 25, 2021
7552450
Update class and add more tests
arthurgonzaga Sep 25, 2021
556ccef
Add all api services
arthurgonzaga Sep 25, 2021
877c3e0
Add the forgotten FavoriteService
arthurgonzaga Sep 25, 2021
010469a
Implement Hilt
arthurgonzaga Sep 25, 2021
49d7952
Update CharacterResponse and add tests
arthurgonzaga Sep 25, 2021
2c2f0c8
Implement Room Database
arthurgonzaga Sep 25, 2021
697d764
Change package
arthurgonzaga Sep 25, 2021
51caef9
Add static factory method pattern
arthurgonzaga Sep 25, 2021
8392608
Add Paging RemoteMediator
arthurgonzaga Sep 25, 2021
f38c687
Implement RemoteMediator, improve UI and update models
arthurgonzaga Sep 26, 2021
56f4c94
Fix bug of updating the favorite column
arthurgonzaga Sep 26, 2021
e5cfc1b
Implement favorite feature through the RecyclerView
arthurgonzaga Sep 26, 2021
47e7211
Improve UI touch effects
arthurgonzaga Sep 26, 2021
dfcfafc
Improve RecyclerView t(to support landscape)
arthurgonzaga Sep 26, 2021
9f65ee3
Implement DetailFragment (need to improve)
arthurgonzaga Sep 27, 2021
1ebf236
Implement animations
arthurgonzaga Sep 27, 2021
e0d8959
Small changes to the DetailFragment layout
arthurgonzaga Sep 27, 2021
7fe98c5
Change animation to the FavoriteListFragment
arthurgonzaga Sep 27, 2021
73c0314
Implement searching
arthurgonzaga Sep 28, 2021
7e48cb2
Implement FavoriteList and refactored some code
arthurgonzaga Sep 28, 2021
dde9ddb
Improve home list delay
arthurgonzaga Sep 28, 2021
4f58953
Implement RxJava to make parallel api requests
arthurgonzaga Sep 28, 2021
fbdff9d
Showing full detail on DetailFragment
arthurgonzaga Sep 28, 2021
76ce8c2
Implement FavoriteApi
arthurgonzaga Sep 29, 2021
a48e654
Improve DetailFragment UI
arthurgonzaga Sep 29, 2021
d684223
Implement theme Changer
arthurgonzaga Sep 29, 2021
dd3dadc
Improve home header UI/UX
arthurgonzaga Sep 29, 2021
53575a1
Implement recyclerview animators
arthurgonzaga Sep 29, 2021
b1c6ff5
Update README
arthurgonzaga Sep 29, 2021
d95f5de
Implement Syncronization with backend
arthurgonzaga Sep 29, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
/.idea/*
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
65 changes: 41 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,51 +12,68 @@ http://docs.starwarsfavorites.apiary.io/#

### Lista de Personagens

Para obter os personagens, sua aplicação deverá utilizar o recurso `people` da Swapi (documentação disponível no topo do documento). A aplicação deve exibir todos os 87 personagens e permitir pesquisar o personagem pelo nome. Sugerimos exibir as primeiras páginas enquanto carrega as outras, em um formato de scroll infinito.
Para obter os personagens, sua aplicação deverá utilizar o recurso `people` da Swapi (documentação disponível no topo do documento). A aplicação deve exibir todos os 87 personagens e permitir pesquisar o personagem pelo nome. Sugerimos exibir as primeiras páginas enquanto carrega as outras, em um formato de scroll infinito.

A lista de itens deve exibir as seguintes informações:
+ Nome [name]
+ Altura [height]
+ Genero [gender]
+ Peso [mass]
+ Nome [name]
+ Altura [height]
+ Genero [gender]
+ Peso [mass]

Os dados devem ser salvos em banco de dados local para acesso offline e atualizados sempre que a tela for aberta.
Os dados devem ser salvos em banco de dados local para acesso offline e atualizados sempre que a tela for aberta.

### Detalhes do Personagem

Ao clicar em um item da lista o seu app deve mostrar as informações abaixo:

+ name
+ height
+ mass
+ hair_color
+ skin_color
+ eye_color
+ birth_year
+ gender
+ Nome do Planeta Natal
+ Nome da Espécie
+ name
+ height
+ mass
+ hair_color
+ skin_color
+ eye_color
+ birth_year
+ gender
+ Nome do Planeta Natal
+ Nome da Espécie

A busca pelo nome do planeta e da espécie deve ser feita em paralelo.
A busca pelo nome do planeta e da espécie deve ser feita em paralelo.

### Favoritos

Na lista e nos detalhes deve ser possível adicionar e remover um personagem a sua lista de favoritos. Tambem deve ser possível filtrar quais personagens foram favoritados na lista principal.
Na lista e nos detalhes deve ser possível adicionar e remover um personagem a sua lista de favoritos. Tambem deve ser possível filtrar quais personagens foram favoritados na lista principal.

##### Adição e Remoção de Favoritos

URL BASE: http://private-782d3-starwarsfavorites.apiary-mock.com/

Ao adicionar um favorito a aplicação deve fazer um request para a api starwarsfavorites (documentação disponível no topo do documento).
A aplicação deve:
+ Exibir a mensagem de retorno da API em caso de sucesso ou erro.
+ Reenviar a requisição da próxima vez que o app for aberto em caso de erro.
+ Salvar no banco de dados local quais personagens foram favoritados.
+ Tratar a remoção de favoritos apenas no banco de dados local.
+ Exibir a mensagem de retorno da API em caso de sucesso ou erro.
+ Reenviar a requisição da próxima vez que o app for aberto em caso de erro.
+ Salvar no banco de dados local quais personagens foram favoritados.
+ Tratar a remoção de favoritos apenas no banco de dados local.

Em metade das requisições enviadas para a api starwarsfavorites a aplicação deve adicionar o header `Prefer` com o valor `status=400`.
Em metade das requisições enviadas para a api starwarsfavorites a aplicação deve adicionar o header `Prefer` com o valor `status=400`.

P.S.: O candidato deve escolher o ID.
P.S.: O candidato deve escolher o ID. ✔

# Implementações diferenciadas 🚀

+ O aplicativo também fica bonito quando está na horizontal. ✅
+ O aplicativo pode mudar de tema, podendo implementar mais temas de cores diferentes facilmente. ✅
+ O aplicativo tem animações de views compartilhadas. ✅
+ O aplicativo tem animações na recyclerview. ✅
+ O aplicativo tem animações na tela de detalhes. ✅

##### Bugs na implementação 👀

+ Mostra os itens favoritados quando é feito uma pesquisa, mesmo se o item não tiver nada haver com a pesquisa.

###### Possiveis soluções

+ Ao invés de usar o RemoteMediator para pesquisar e ver todos os itens, pode-se separar e usar um PageSource e verificar se há algum favorito na lista
+ Usar tabelas diferentes

---
#### LICENSE
Expand Down
1 change: 1 addition & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
132 changes: 132 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
id 'androidx.navigation.safeargs'
}

android {
compileSdk 31

defaultConfig {
applicationId "com.arthurgonzaga.wikistarwars"
minSdk 23
targetSdk 31
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

// Exporting room schema

javaCompileOptions {
annotationProcessorOptions {
arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
}
}
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}

buildFeatures {
viewBinding true
dataBinding true
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}

dependencies {

implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'


def retrofit_verion = "2.9.0"
def gson_version = "2.9.0"
def paging_version = "3.0.1"
def room_version = "2.3.0"
def lifecycle_version = "2.2.0"
def rxjava_version = "3.0.0"
def rv_animators_version = "4.0.2"

// Retrofit

implementation "com.squareup.retrofit2:retrofit:$retrofit_verion"
implementation "com.squareup.retrofit2:converter-gson:$gson_version"
implementation "com.github.akarnokd:rxjava3-retrofit-adapter:$rxjava_version"

// Navigation Component

implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"


// Paging 3

implementation "androidx.paging:paging-runtime-ktx:$paging_version"
implementation "androidx.paging:paging-rxjava3:$paging_version"

// Room

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"

// Hilt

implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"


// Lifecycle

implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"


//RxJava
implementation "io.reactivex.rxjava3:rxjava:$rxjava_version"
implementation "io.reactivex.rxjava3:rxandroid:$rxjava_version"

// RecyclerView Animators

implementation "jp.wasabeef:recyclerview-animators:$rv_animators_version"

// Testing

def mockito_version = "2.21.0"
def arch_version = "2.1.0"
def fragment_version = "1.4.0-alpha09"
def truth_version = "1.1.3"


testImplementation 'junit:junit:4.13.2'
testImplementation "androidx.paging:paging-common-ktx:$paging_version"
testImplementation "androidx.room:room-testing:$room_version"
testImplementation "org.mockito:mockito-core:$mockito_version"
testImplementation "androidx.arch.core:core-testing:$arch_version"
testImplementation "com.google.truth:truth:$truth_version"
debugImplementation "androidx.fragment:fragment-testing:$fragment_version"

androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"
androidTestImplementation "com.google.truth:truth:$truth_version"
androidTestImplementation "org.mockito:mockito-android:$mockito_version"
}
21 changes: 21 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -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
Loading