diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..aa724b77 --- /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 00000000..26d33521 --- /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 00000000..61a9130c --- /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 00000000..23a89bbb --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,22 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..a5f05cd8 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..d5d35ec4 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index c0193b60..1881ddbb 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ 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: +A lista de itens deve exibir as seguintes informações: ✅ + Nome [name] + Altura [height] + Genero [gender] @@ -24,7 +24,7 @@ Os dados devem ser salvos em banco de dados local para acesso offline e atualiza ### Detalhes do Personagem -Ao clicar em um item da lista o seu app deve mostrar as informações abaixo: +Ao clicar em um item da lista o seu app deve mostrar as informações abaixo: ✅ + name + height @@ -41,7 +41,7 @@ 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 @@ -56,7 +56,7 @@ A aplicação deve: 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. ✅ --- #### LICENSE diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 00000000..8c75fd74 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdkVersion 29 + + defaultConfig { + applicationId "com.example.desafiopopcode" + minSdkVersion 16 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + implementation 'com.squareup.retrofit:retrofit:1.8.0' + implementation 'com.squareup.okhttp:okhttp:2.1.0' + implementation 'com.squareup.okhttp:okhttp-urlconnection:2.1.0' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /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/example/desafiopopcode/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/desafiopopcode/ExampleInstrumentedTest.java new file mode 100644 index 00000000..0a031878 --- /dev/null +++ b/app/src/androidTest/java/com/example/desafiopopcode/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.desafiopopcode; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.desafiopopcode", appContext.getPackageName()); + } +} \ 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 00000000..968121aa --- /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/com/example/desafiopopcode/Controllers/FavApi.java b/app/src/main/java/com/example/desafiopopcode/Controllers/FavApi.java new file mode 100644 index 00000000..aa094039 --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Controllers/FavApi.java @@ -0,0 +1,30 @@ +package com.example.desafiopopcode.Controllers; + +import retrofit.RestAdapter; + +public class FavApi { + + private FavController fav; + private static FavApi Instance; + + private FavApi() { + final RestAdapter restAdapter = new RestAdapter.Builder() + .setClient(new SWClient()) + .setEndpoint("https://private-782d3-starwarsfavorites.apiary-mock.com/") + .setLogLevel(RestAdapter.LogLevel.FULL) + .build(); + fav = restAdapter.create(FavController.class); + } + + public static void init() { + Instance = new FavApi(); + } + + public static FavController getApi() { + return Instance.fav; + } + + public void setApi(FavController favApi) { + Instance.fav = favApi; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/Controllers/FavClient.java b/app/src/main/java/com/example/desafiopopcode/Controllers/FavClient.java new file mode 100644 index 00000000..cea604fc --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Controllers/FavClient.java @@ -0,0 +1,22 @@ +package com.example.desafiopopcode.Controllers; + +import android.os.Build; +import retrofit.client.OkClient; +import retrofit.client.Request; + +import java.io.IOException; +import java.net.HttpURLConnection; + +public class FavClient extends OkClient { + + public FavClient() { + super(); + } + + @Override + protected HttpURLConnection openConnection(Request request) throws IOException { + HttpURLConnection connection = super.openConnection(request); + connection.setRequestProperty("User-Agent", "starwarsfavorites-android-" + Build.VERSION.RELEASE); + return connection; + } +} diff --git a/app/src/main/java/com/example/desafiopopcode/Controllers/FavController.java b/app/src/main/java/com/example/desafiopopcode/Controllers/FavController.java new file mode 100644 index 00000000..e9279d39 --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Controllers/FavController.java @@ -0,0 +1,14 @@ +package com.example.desafiopopcode.Controllers; + +import com.example.desafiopopcode.Models.Personagem; + +import retrofit.Callback; +import retrofit.http.POST; +import retrofit.http.Path; + +public interface FavController { + + @POST("/favorite/{id}") + public void favPerson(@Path("id") int id, Callback callback); + +} diff --git a/app/src/main/java/com/example/desafiopopcode/Controllers/SWApi.java b/app/src/main/java/com/example/desafiopopcode/Controllers/SWApi.java new file mode 100644 index 00000000..683796ea --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Controllers/SWApi.java @@ -0,0 +1,30 @@ +package com.example.desafiopopcode.Controllers; + +import retrofit.RestAdapter; + +public class SWApi { + + private SWWiki sw; + private static SWApi Instance; + + private SWApi() { + final RestAdapter restAdapter = new RestAdapter.Builder() + .setClient(new SWClient()) + .setEndpoint("https://swapi.dev/api/") + .setLogLevel(RestAdapter.LogLevel.FULL) + .build(); + sw = restAdapter.create(SWWiki.class); + } + + public static void init() { + Instance = new SWApi(); + } + + public static SWWiki getApi() { + return Instance.sw; + } + + public void setApi(SWWiki swApi) { + Instance.sw = swApi; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/Controllers/SWClient.java b/app/src/main/java/com/example/desafiopopcode/Controllers/SWClient.java new file mode 100644 index 00000000..fe459c51 --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Controllers/SWClient.java @@ -0,0 +1,22 @@ +package com.example.desafiopopcode.Controllers; + +import android.os.Build; +import retrofit.client.OkClient; +import retrofit.client.Request; + +import java.io.IOException; +import java.net.HttpURLConnection; + +public class SWClient extends OkClient { + + public SWClient() { + super(); + } + + @Override + protected HttpURLConnection openConnection(Request request) throws IOException { + HttpURLConnection connection = super.openConnection(request); + connection.setRequestProperty("User-Agent", "swapi-android-" + Build.VERSION.RELEASE); + return connection; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/Controllers/SWWiki.java b/app/src/main/java/com/example/desafiopopcode/Controllers/SWWiki.java new file mode 100644 index 00000000..f0eb0709 --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Controllers/SWWiki.java @@ -0,0 +1,21 @@ +package com.example.desafiopopcode.Controllers; + +import com.example.desafiopopcode.Models.*; + +import java.util.List; + +import retrofit.Callback; +import retrofit.http.GET; +import retrofit.http.POST; +import retrofit.http.Path; +import retrofit.http.Query; + +public interface SWWiki { + + @GET("/people/") + public void getAllPeople(@Query("page") int page, Callback> callback); + + @GET("/people/{id}/") + public void getPeople(@Path("id") int peopleId, Callback callback); + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/Detalhes.java b/app/src/main/java/com/example/desafiopopcode/Detalhes.java new file mode 100644 index 00000000..269bcf4e --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Detalhes.java @@ -0,0 +1,78 @@ +package com.example.desafiopopcode; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import com.example.desafiopopcode.Controllers.FavApi; +import com.example.desafiopopcode.Controllers.SWApi; +import com.example.desafiopopcode.Models.ListaPerson; +import com.example.desafiopopcode.Models.Personagem; + +import retrofit.Callback; +import retrofit.RetrofitError; +import retrofit.client.Response; + +public class Detalhes extends AppCompatActivity { + + String listaFav = ""; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detalhes); + + FavApi.init(); + + final TextView text = findViewById(R.id.text); + + Intent intent = getIntent(); + int peopleId = intent.getIntExtra("peopleId", 0); + + SWApi.getApi().getPeople(peopleId, new Callback() { + @Override + public void success(Personagem personagem, Response response) { + text.setText(personagem.detalhar()); + } + + @Override + public void failure(RetrofitError error) { + text.setText("error kkkkkk"); + } + }); + + Button voltar = findViewById(R.id.button); + voltar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onBackPressed(); + } + }); + + Button favoritar = findViewById(R.id.button3); + favoritar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + FavApi.getApi().favPerson(peopleId, new Callback() { + @Override + public void success(Personagem personagem, Response response) { + listaFav.concat(personagem.toString() + "\n"); + Intent it = new Intent(Detalhes.this, Favs.class); + it.putExtra("lista", listaFav); + startActivity(it); + } + + @Override + public void failure(RetrofitError error) { + error.getBody(); + } + }); + } + }); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/Favs.java b/app/src/main/java/com/example/desafiopopcode/Favs.java new file mode 100644 index 00000000..fb316dfb --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Favs.java @@ -0,0 +1,33 @@ +package com.example.desafiopopcode; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +public class Favs extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_favs); + + final TextView text = findViewById(R.id.textView); + + Intent intent = getIntent(); + String favs = intent.getStringExtra("lista"); + + text.setText(favs); + + Button voltar = findViewById(R.id.button4); + voltar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onBackPressed(); + } + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/MainActivity.java b/app/src/main/java/com/example/desafiopopcode/MainActivity.java new file mode 100644 index 00000000..269c8b24 --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/MainActivity.java @@ -0,0 +1,182 @@ +package com.example.desafiopopcode; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.TextView; + +import com.example.desafiopopcode.Controllers.SWApi; +import com.example.desafiopopcode.Models.ListaPerson; +import com.example.desafiopopcode.Models.Personagem; + +import java.util.ArrayList; +import java.util.List; + +import retrofit.Callback; +import retrofit.RetrofitError; +import retrofit.client.Response; + +public class MainActivity extends AppCompatActivity { + + List people; + ArrayAdapter adpt; + ListView list; + int id = 1; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + list = (ListView) findViewById(R.id.lista); + + SWApi.init(); + + SWApi.getApi().getAllPeople(id, new Callback>() { + @Override + public void success(ListaPerson lista, Response response) { + people = new ArrayList(); + for (Personagem p : lista.results) { + people.add(p.toString()); + } + + adpt = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, people); + list.setAdapter(adpt); + list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + adpt.notifyDataSetChanged(); + int peopleId = (int) id + 1; + if (peopleId == 17) { + peopleId++; + } + adpt.notifyDataSetChanged(); + Intent it = new Intent(MainActivity.this, Detalhes.class); + it.putExtra("peopleId", peopleId); + startActivity(it); + } + }); + adpt.notifyDataSetChanged(); + list.setOnScrollListener(new EndlessScrollListener()); + adpt.notifyDataSetChanged(); + } + + @Override + public void failure(RetrofitError error) { + error.getBody(); + } + }); + + final EditText busca = findViewById(R.id.busca); + final TextView resposta = findViewById(R.id.resposta); + Button botaovoltar = findViewById(R.id.button2); + Button botaobuscar = findViewById(R.id.botaobuscar); + botaobuscar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String newid = busca.getText().toString(); + int newId = Integer.parseInt(newid); + SWApi.getApi().getPeople(newId, new Callback() { + @Override + public void success(Personagem personagem, Response response) { + resposta.setVisibility(View.VISIBLE); + list.setVisibility(View.INVISIBLE); + busca.setVisibility(View.INVISIBLE); + botaobuscar.setVisibility(View.INVISIBLE); + resposta.setText(personagem.toString()); + botaovoltar.setVisibility(View.VISIBLE); + } + + @Override + public void failure(RetrofitError error) { + error.getBody(); + } + }); + } + }); + + botaovoltar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + resposta.setVisibility(View.INVISIBLE); + botaovoltar.setVisibility(View.INVISIBLE); + list.setVisibility(View.VISIBLE); + busca.setVisibility(View.VISIBLE); + botaobuscar.setVisibility(View.VISIBLE); + } + }); + } + + + public class EndlessScrollListener implements AbsListView.OnScrollListener { + + private int visibleThreshold = 82; + private int previousTotal = 0; + private boolean loading = true; + + public EndlessScrollListener() { + } + + public EndlessScrollListener(int visibleThreshold) { + this.visibleThreshold = visibleThreshold; + } + + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (loading) { + if (totalItemCount > previousTotal) { + loading = false; + previousTotal = totalItemCount; + if (id < 9) { + id++; + SWApi.getApi().getAllPeople(id, new Callback>() { + @Override + public void success(ListaPerson lista, Response response) { + for (Personagem p : lista.results) { + people.add(p.toString()); + } + list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + adpt.notifyDataSetChanged(); + int peopleId = (int) id + 1; + if (peopleId >= 17) { + peopleId++; + } + adpt.notifyDataSetChanged(); + Intent it = new Intent(MainActivity.this, Detalhes.class); + it.putExtra("peopleId", peopleId); + startActivity(it); + } + }); + adpt.notifyDataSetChanged(); + } + + @Override + public void failure(RetrofitError error) { + error.getBody(); + } + }); + adpt.notifyDataSetChanged(); + } + } + } + if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { + loading = true; + adpt.notifyDataSetChanged(); + } + } + + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/Models/ListaPerson.java b/app/src/main/java/com/example/desafiopopcode/Models/ListaPerson.java new file mode 100644 index 00000000..26ddd743 --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Models/ListaPerson.java @@ -0,0 +1,23 @@ +package com.example.desafiopopcode.Models; + +import android.text.TextUtils; + +import java.io.Serializable; +import java.util.ArrayList; + +public class ListaPerson

implements Serializable { + + public int count; + public String next; + public String previous; + public ArrayList

results; + + public boolean hasMore() { + return !TextUtils.isEmpty(next); + } + + @Override + public String toString() { + return "Lista de Personagens:\n" + results; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/desafiopopcode/Models/Personagem.java b/app/src/main/java/com/example/desafiopopcode/Models/Personagem.java new file mode 100644 index 00000000..970e3fd6 --- /dev/null +++ b/app/src/main/java/com/example/desafiopopcode/Models/Personagem.java @@ -0,0 +1,90 @@ +package com.example.desafiopopcode.Models; + +import com.google.gson.annotations.SerializedName; + +import java.io.Serializable; +import java.util.ArrayList; + +public class Personagem implements Serializable { + + public int id; + + public String name; + + @SerializedName("birth_year") + public String birthYear; + + public String gender; + + @SerializedName("hair_color") + public String hairColor; + + public String height; + + @SerializedName("homeworld") + public String homeWorldUrl; + + public String mass; + + @SerializedName("eye_color") + public String eyeColor; + + @SerializedName("skin_color") + public String skinColor; + + public String created; + public String edited; + public String url; + + @SerializedName("films") + public ArrayList filmsUrls; + + @SerializedName("species") + public ArrayList speciesUrls; + + @SerializedName("starships") + public ArrayList starshipsUrls; + + @SerializedName("vehicles") + public ArrayList vehiclesUrls; + + public int getId() { + if (url.length() == 30) { + char aux = url.charAt(url.length() - 2); + id = Character.getNumericValue(aux); + } + else { + String str; + char aux1 = url.charAt(url.length() - 3); + char aux2 = url.charAt(url.length() - 2); + StringBuilder sb = new StringBuilder(); + sb.append(aux1); + sb.append(aux2); + str = sb.toString(); + id = Integer.parseInt(str); + } + return id; + } + + @Override + public String toString() { + return "\nName: " + name + + "\nHeight: " + height + + "\nGender: " + gender + + "\nMass: " + mass + "\n"; + } + + public String detalhar() { + return "\nName: " + name + + "\nHeight: " + height + + "\nMass: " + mass + + "\nHair color: " + hairColor + + "\nSkin color: " + skinColor + + "\nEye color: " + eyeColor + + "\nBirth year: " + birthYear + + "\nGender: " + gender + + "\nHomeworld: " + homeWorldUrl + + "\nSpecies: " + speciesUrls + "\n"; + } + +} \ 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 00000000..2b068d11 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ 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 00000000..07d5da9c --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_detalhes.xml b/app/src/main/res/layout/activity_detalhes.xml new file mode 100644 index 00000000..3d2bfd52 --- /dev/null +++ b/app/src/main/res/layout/activity_detalhes.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + +