Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Created track list activity and fragment.
- Loading branch information
1 parent
df061e0
commit c0d1770
Showing
12 changed files
with
489 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
59 changes: 59 additions & 0 deletions
59
app/src/main/java/org/williamwong/spotifystreamer/activities/TrackActivity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
package org.williamwong.spotifystreamer.activities; | ||
|
||
import android.os.Bundle; | ||
import android.support.v4.app.FragmentTransaction; | ||
import android.support.v7.app.AppCompatActivity; | ||
import android.view.Menu; | ||
import android.view.MenuItem; | ||
|
||
import org.williamwong.spotifystreamer.R; | ||
import org.williamwong.spotifystreamer.fragments.TrackFragment; | ||
|
||
public class TrackActivity extends AppCompatActivity { | ||
|
||
private static final String TRACK_FRAGMENT_TAG = "trackFragment"; | ||
private TrackFragment mTrackFragment; | ||
|
||
@Override | ||
protected void onCreate(Bundle savedInstanceState) { | ||
super.onCreate(savedInstanceState); | ||
setContentView(R.layout.activity_track); | ||
|
||
String spotifyId = getIntent().getStringExtra(TrackFragment.SPOTIFY_ID); | ||
String artistName = getIntent().getStringExtra(TrackFragment.ARTIST_NAME); | ||
|
||
if (savedInstanceState != null) { | ||
mTrackFragment = (TrackFragment) getSupportFragmentManager().findFragmentByTag(TRACK_FRAGMENT_TAG); | ||
} else if (mTrackFragment == null) { | ||
mTrackFragment = TrackFragment.newInstance(spotifyId, artistName); | ||
} | ||
|
||
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); | ||
ft.replace(R.id.tracksContainer, mTrackFragment, TRACK_FRAGMENT_TAG); | ||
ft.commit(); | ||
|
||
} | ||
|
||
|
||
@Override | ||
public boolean onCreateOptionsMenu(Menu menu) { | ||
// Inflate the menu; this adds items to the action bar if it is present. | ||
getMenuInflater().inflate(R.menu.menu_track, menu); | ||
return true; | ||
} | ||
|
||
@Override | ||
public boolean onOptionsItemSelected(MenuItem item) { | ||
// Handle action bar item clicks here. The action bar will | ||
// automatically handle clicks on the Home/Up button, so long | ||
// as you specify a parent activity in AndroidManifest.xml. | ||
int id = item.getItemId(); | ||
|
||
//noinspection SimplifiableIfStatement | ||
if (id == R.id.action_settings) { | ||
return true; | ||
} | ||
|
||
return super.onOptionsItemSelected(item); | ||
} | ||
} |
61 changes: 61 additions & 0 deletions
61
app/src/main/java/org/williamwong/spotifystreamer/adapters/TrackAdapter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package org.williamwong.spotifystreamer.adapters; | ||
|
||
import android.content.Context; | ||
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.squareup.picasso.Picasso; | ||
|
||
import org.williamwong.spotifystreamer.R; | ||
import org.williamwong.spotifystreamer.models.TrackModel; | ||
|
||
import java.util.List; | ||
|
||
/** | ||
* Created by w.wong on 6/19/2015. | ||
*/ | ||
public class TrackAdapter extends ArrayAdapter<TrackModel> { | ||
|
||
public TrackAdapter(Context context, List<TrackModel> objects) { | ||
super(context, 0, objects); | ||
} | ||
|
||
private static class ViewHolder { | ||
TextView trackNameTextView; | ||
TextView albumNameTextView; | ||
ImageView trackThumbnailImageView; | ||
|
||
public ViewHolder(View v) { | ||
trackNameTextView = (TextView) v.findViewById(R.id.trackNameTextView); | ||
albumNameTextView = (TextView) v.findViewById(R.id.albumNameTextView); | ||
trackThumbnailImageView = (ImageView) v.findViewById(R.id.trackThumbnailImageView); | ||
} | ||
} | ||
|
||
@Override | ||
public View getView(int position, View convertView, ViewGroup parent) { | ||
TrackModel track = getItem(position); | ||
|
||
ViewHolder viewHolder; | ||
if (convertView == null) { | ||
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item_track, parent, false); | ||
viewHolder = new ViewHolder(convertView); | ||
convertView.setTag(viewHolder); | ||
} else { | ||
viewHolder = (ViewHolder) convertView.getTag(); | ||
} | ||
|
||
viewHolder.trackNameTextView.setText(track.getTrackName()); | ||
viewHolder.albumNameTextView.setText(track.getAlbumName()); | ||
Picasso.with(getContext()) | ||
.load(track.getImageUrl()) | ||
.fit().centerCrop() | ||
.into(viewHolder.trackThumbnailImageView); | ||
|
||
return convertView; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
148 changes: 148 additions & 0 deletions
148
app/src/main/java/org/williamwong/spotifystreamer/fragments/TrackFragment.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,148 @@ | ||
package org.williamwong.spotifystreamer.fragments; | ||
|
||
import android.os.Bundle; | ||
import android.os.Handler; | ||
import android.os.Looper; | ||
import android.support.v4.app.Fragment; | ||
import android.view.LayoutInflater; | ||
import android.view.View; | ||
import android.view.ViewGroup; | ||
import android.widget.ListView; | ||
|
||
import org.williamwong.spotifystreamer.R; | ||
import org.williamwong.spotifystreamer.adapters.TrackAdapter; | ||
import org.williamwong.spotifystreamer.models.TrackModel; | ||
|
||
import java.util.ArrayList; | ||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
import kaaes.spotify.webapi.android.SpotifyApi; | ||
import kaaes.spotify.webapi.android.SpotifyService; | ||
import kaaes.spotify.webapi.android.models.Image; | ||
import kaaes.spotify.webapi.android.models.Track; | ||
import kaaes.spotify.webapi.android.models.Tracks; | ||
import retrofit.Callback; | ||
import retrofit.RetrofitError; | ||
import retrofit.client.Response; | ||
|
||
/** | ||
* A fragment containing a list of top ten tracks from an artist. | ||
* TODO Add artist name to ActionBar subtitle | ||
*/ | ||
public class TrackFragment extends Fragment { | ||
|
||
|
||
public static final String TRACK_MODELS_KEY = "trackModels"; | ||
public static final String SPOTIFY_ID = "spotifyId"; | ||
public static final String ARTIST_NAME = "artistName"; | ||
private static final int MIN_THUMBNAIL_WIDTH = 200; | ||
|
||
private SpotifyService mSpotify = new SpotifyApi().getService(); | ||
private ArrayList<TrackModel> mTrackModels; | ||
private TrackAdapter mTrackAdapter; | ||
private String mSpotifyId; | ||
private String mArtistName; | ||
|
||
public TrackFragment() { | ||
} | ||
|
||
public static TrackFragment newInstance(String spotifyId, String artistName) { | ||
TrackFragment trackFragment = new TrackFragment(); | ||
Bundle args = new Bundle(); | ||
args.putSerializable(SPOTIFY_ID, spotifyId); | ||
args.putSerializable(ARTIST_NAME, artistName); | ||
trackFragment.setArguments(args); | ||
return trackFragment; | ||
} | ||
|
||
@Override | ||
public void onCreate(Bundle savedInstanceState) { | ||
super.onCreate(savedInstanceState); | ||
|
||
if (getArguments().containsKey(SPOTIFY_ID)) { | ||
mSpotifyId = getArguments().getString(SPOTIFY_ID); | ||
} | ||
if (getArguments().containsKey(ARTIST_NAME)) { | ||
mArtistName = getArguments().getString(ARTIST_NAME); | ||
} | ||
} | ||
|
||
@Override | ||
public View onCreateView(LayoutInflater inflater, ViewGroup container, | ||
Bundle savedInstanceState) { | ||
View view = inflater.inflate(R.layout.fragment_track, container, false); | ||
|
||
if (savedInstanceState != null && | ||
savedInstanceState.getParcelableArrayList(TRACK_MODELS_KEY) != null) { | ||
mTrackModels = savedInstanceState.getParcelableArrayList(TRACK_MODELS_KEY); | ||
} else { | ||
mTrackModels = new ArrayList<>(); | ||
searchTracks(mSpotifyId); | ||
} | ||
|
||
ListView trackListView = (ListView) view.findViewById(R.id.tracksListView); | ||
mTrackAdapter = new TrackAdapter(getActivity(), mTrackModels); | ||
trackListView.setAdapter(mTrackAdapter); | ||
|
||
return view; | ||
} | ||
|
||
private void searchTracks(String mSpotifyId) { | ||
Map<String, Object> options = new HashMap<>(); | ||
options.put("country", "US"); | ||
mSpotify.getArtistTopTrack(mSpotifyId, options, new Callback<Tracks>() { | ||
Handler handler = new Handler(Looper.getMainLooper()); | ||
@Override | ||
public void success(final Tracks tracks, Response response) { | ||
handler.post(new Runnable() { | ||
@Override | ||
public void run() { | ||
updateTracks(tracks.tracks); | ||
} | ||
}); | ||
} | ||
|
||
@Override | ||
public void failure(RetrofitError error) { | ||
|
||
} | ||
}); | ||
} | ||
|
||
private void updateTracks(List<Track> tracks) { | ||
mTrackModels.clear(); | ||
for (Track track : tracks) { | ||
TrackModel trackModel = new TrackModel(); | ||
trackModel.setTrackName(track.name); | ||
trackModel.setAlbumName(track.album.name); | ||
|
||
List<Image> images = track.album.images; | ||
if(images != null && !images.isEmpty()) { | ||
int imageIndex = 0; | ||
for (int i = 0; i < images.size(); i++) { | ||
boolean isLast = (i + 1 == images.size()); | ||
if (isLast) { | ||
imageIndex = i; | ||
break; | ||
} else if (images.get(i + 1).width < MIN_THUMBNAIL_WIDTH) { | ||
imageIndex = i; | ||
break; | ||
} | ||
} | ||
trackModel.setImageUrl(images.get(imageIndex).url); | ||
} | ||
// TODO set placeholder image | ||
mTrackModels.add(trackModel); | ||
} | ||
|
||
mTrackAdapter.notifyDataSetChanged(); | ||
} | ||
|
||
@Override | ||
public void onSaveInstanceState(Bundle outState) { | ||
super.onSaveInstanceState(outState); | ||
outState.putParcelableArrayList(TRACK_MODELS_KEY, mTrackModels); | ||
} | ||
} |
Oops, something went wrong.