diff --git a/app/src/main/java/com/hakodev/androiditunesapi/activities/ArtistListActivity.java b/app/src/main/java/com/hakodev/androiditunesapi/activities/ArtistListActivity.java index eb8d592..0d8b2ba 100644 --- a/app/src/main/java/com/hakodev/androiditunesapi/activities/ArtistListActivity.java +++ b/app/src/main/java/com/hakodev/androiditunesapi/activities/ArtistListActivity.java @@ -3,20 +3,31 @@ package com.hakodev.androiditunesapi.activities; import android.Manifest; import android.os.Bundle; import android.support.annotation.NonNull; -import android.support.annotation.Nullable; import android.support.constraint.ConstraintLayout; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextWatcher; import android.util.Log; +import android.widget.EditText; +import android.widget.ListView; import android.widget.Toast; import com.anthonycr.grant.PermissionsManager; import com.anthonycr.grant.PermissionsResultAction; +import com.google.gson.Gson; import com.hakodev.androiditunesapi.AndroidItunesAPI; import com.hakodev.androiditunesapi.R; +import com.hakodev.androiditunesapi.adapters.ArtistsListAdapter; +import com.hakodev.androiditunesapi.models.ItunesResponse; +import com.hakodev.androiditunesapi.models.Result; import com.hakodev.androiditunesapi.util.Utils; import java.io.IOException; +import java.util.ArrayList; +import java.util.Random; +import java.util.Timer; +import java.util.TimerTask; import okhttp3.Call; import okhttp3.Callback; @@ -28,9 +39,17 @@ public class ArtistListActivity extends AppCompatActivity { private final static String TAG = "ArtistListActivity"; private final static String SEARCH_URL = "https://itunes.apple.com/search?term=%1$s&country=US&entity=musicArtist&limit=10"; + private final static String[] DEMO_ARTISTS = {"Valentine", "Children", "Red"}; private OkHttpClient networkClient; + private ArtistsListAdapter artistsListAdapter; + private ArrayList artistsList = new ArrayList<>(); + private ConstraintLayout lytBase; + private ListView listArtists; + private EditText txtArtistSearch; + + private Timer keypressTimer = new Timer(); @Override protected void onCreate(Bundle savedInstanceState) { @@ -40,6 +59,9 @@ public class ArtistListActivity extends AppCompatActivity { setupViews(); init(); askForPermissions(); + + int randomArtistIndex = new Random().nextInt(DEMO_ARTISTS.length); + requestArtist(DEMO_ARTISTS[randomArtistIndex]); } @Override @@ -53,10 +75,40 @@ public class ArtistListActivity extends AppCompatActivity { private void setupViews() { lytBase = findViewById(R.id.lytBase); + listArtists = findViewById(R.id.listArtists); + txtArtistSearch = findViewById(R.id.txtArtistSearch); + txtArtistSearch.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable txt) { + keypressTimer.cancel(); + keypressTimer = new Timer(); + keypressTimer.schedule( + new TimerTask() { + @Override + public void run() { + if (txt.toString().length() > 3){ + requestArtist(txt.toString()); + } + } + }, 200); + } + }); } private void init() { networkClient = AndroidItunesAPI.getInstance().getNetworkClient(); + artistsListAdapter = new ArtistsListAdapter(this, artistsList); + listArtists.setAdapter(artistsListAdapter); } private void askForPermissions() { @@ -90,10 +142,26 @@ public class ArtistListActivity extends AppCompatActivity { @Override public void onResponse(@NonNull Call call, @NonNull final Response response) throws IOException { - String res = response.body().string(); - Log.w(TAG, res); + String body = response.body().string(); + Log.w(TAG, body); + buildArtistsList(parseArtistsResponse(body)); } }); }).start(); } + + private ArrayList parseArtistsResponse(String body) { + ItunesResponse itunesResponse = new Gson().fromJson(body, ItunesResponse.class); + ArrayList artistsNames = new ArrayList<>(); + for (Result artist : itunesResponse.getResults()) { + artistsNames.add(artist.getArtistName()); + } + return artistsNames; + } + + private void buildArtistsList(ArrayList artists) { + artistsList.clear(); + artistsList.addAll(artists); + runOnUiThread(() -> artistsListAdapter.notifyDataSetChanged()); + } } diff --git a/app/src/main/java/com/hakodev/androiditunesapi/adapters/ArtistsListAdapter.java b/app/src/main/java/com/hakodev/androiditunesapi/adapters/ArtistsListAdapter.java new file mode 100644 index 0000000..53c4839 --- /dev/null +++ b/app/src/main/java/com/hakodev/androiditunesapi/adapters/ArtistsListAdapter.java @@ -0,0 +1,41 @@ +package com.hakodev.androiditunesapi.adapters; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.TextView; + +import com.hakodev.androiditunesapi.R; + +import java.util.ArrayList; + +public class ArtistsListAdapter extends ArrayAdapter { + private final Context context; + private final ArrayList values; + + public ArtistsListAdapter(Context context, ArrayList values) { + super(context, R.layout.artists_list_adapter, values); + this.context = context; + this.values = values; + } + + @NonNull + @Override + public View getView(int position, View convertView, @NonNull ViewGroup parent) { + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + if (convertView == null) { + if (inflater != null) { + convertView = inflater.inflate(R.layout.artists_list_adapter, parent, false); + } + } + TextView textView = convertView.findViewById(R.id.lblArtistName); + ImageView imageView = convertView.findViewById(R.id.imgArtist); + textView.setText(values.get(position)); + imageView.setImageResource(R.drawable.default_artist); + return convertView; + } +} diff --git a/app/src/main/java/com/hakodev/androiditunesapi/models/Response.java b/app/src/main/java/com/hakodev/androiditunesapi/models/ItunesResponse.java similarity index 79% rename from app/src/main/java/com/hakodev/androiditunesapi/models/Response.java rename to app/src/main/java/com/hakodev/androiditunesapi/models/ItunesResponse.java index 6c79748..47ef75d 100644 --- a/app/src/main/java/com/hakodev/androiditunesapi/models/Response.java +++ b/app/src/main/java/com/hakodev/androiditunesapi/models/ItunesResponse.java @@ -5,20 +5,20 @@ import com.google.gson.annotations.SerializedName; import java.util.List; -public class Response { +public class ItunesResponse { @SerializedName("resultCount") @Expose - private Long resultCount; + private int resultCount; @SerializedName("results") @Expose private List results = null; - public Long getResultCount() { + public int getResultCount() { return resultCount; } - public void setResultCount(Long resultCount) { + public void setResultCount(int resultCount) { this.resultCount = resultCount; } diff --git a/app/src/main/res/drawable/default_artist.png b/app/src/main/res/drawable/default_artist.png index 75de4d8..76d6b5c 100644 Binary files a/app/src/main/res/drawable/default_artist.png and b/app/src/main/res/drawable/default_artist.png differ diff --git a/app/src/main/res/layout/activity_artists_list.xml b/app/src/main/res/layout/activity_artists_list.xml index e5b5f35..70ce42e 100644 --- a/app/src/main/res/layout/activity_artists_list.xml +++ b/app/src/main/res/layout/activity_artists_list.xml @@ -5,7 +5,9 @@ android:id="@+id/lytBase" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.hakodev.androiditunesapi.activities.ArtistListActivity"> + tools:context="com.hakodev.androiditunesapi.activities.ArtistListActivity" + android:focusable="true" + android:focusableInTouchMode="true"> \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index e8ff1bf..2494ff7 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -10,6 +10,9 @@ @color/colorText @color/colorTextSecondary @color/colorHintText + + @color/colorPrimary + @color/colorText