Skip to content

Commit 39204cf

Browse files
committed
Use MVP
1 parent 26f95bf commit 39204cf

File tree

5 files changed

+283
-165
lines changed

5 files changed

+283
-165
lines changed
Lines changed: 38 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,29 @@
11
package com.spotify.sdk.android;
22

3-
import android.content.ComponentName;
43
import android.content.Context;
54
import android.content.Intent;
6-
import android.content.ServiceConnection;
75
import android.os.Bundle;
8-
import android.os.IBinder;
9-
import android.support.annotation.NonNull;
106
import android.support.v7.app.AppCompatActivity;
117
import android.support.v7.widget.LinearLayoutManager;
128
import android.support.v7.widget.RecyclerView;
13-
import android.util.Log;
149
import android.view.View;
1510
import android.widget.SearchView;
16-
import android.widget.Toast;
1711

18-
import kaaes.spotify.webapi.android.SpotifyApi;
19-
import kaaes.spotify.webapi.android.SpotifyService;
20-
import kaaes.spotify.webapi.android.models.Track;
12+
import java.util.List;
2113

22-
public class MainActivity extends AppCompatActivity {
14+
import kaaes.spotify.webapi.android.models.Track;
2315

24-
private static final String TAG = MainActivity.class.getSimpleName();
16+
public class MainActivity extends AppCompatActivity implements Search.View {
2517

2618
static final String EXTRA_TOKEN = "EXTRA_TOKEN";
2719
private static final String KEY_CURRENT_QUERY = "CURRENT_QUERY";
2820

29-
private RecyclerView mResultsList;
30-
private SearchView mSearchView;
31-
private SearchResultsAdapter mAdapter;
32-
private SpotifyService mSpotifyService;
33-
private String mCurrentQuery;
34-
private Player mPlayer;
35-
36-
private ServiceConnection mServiceConnection = new ServiceConnection() {
37-
@Override
38-
public void onServiceConnected(ComponentName name, IBinder service) {
39-
mPlayer = ((PlayerService.PlayerBinder) service).getService();
40-
}
41-
42-
@Override
43-
public void onServiceDisconnected(ComponentName name) {
44-
mPlayer = null;
45-
}
46-
};
21+
private Search.ActionListener mActionListener;
4722

4823
private LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
4924
private ScrollListener mScrollListener = new ScrollListener(mLayoutManager);
50-
;
25+
private SearchResultsAdapter mAdapter;
26+
5127

5228
private class ScrollListener extends ResultListScrollListener {
5329

@@ -57,8 +33,7 @@ public ScrollListener(LinearLayoutManager layoutManager) {
5733

5834
@Override
5935
public void onLoadMore() {
60-
Log.d(TAG, "Load more...");
61-
mAdapter.getNextPage();
36+
mActionListener.loadMoreResults();
6237
}
6338
}
6439

@@ -71,45 +46,18 @@ protected void onCreate(Bundle savedInstanceState) {
7146
super.onCreate(savedInstanceState);
7247
setContentView(R.layout.activity_main);
7348

74-
if (savedInstanceState != null) {
75-
mCurrentQuery = savedInstanceState.getString(KEY_CURRENT_QUERY);
76-
}
77-
78-
mSearchView = (SearchView) findViewById(R.id.search_view);
79-
mResultsList = (RecyclerView) findViewById(R.id.search_results);
80-
mResultsList.setHasFixedSize(true);
81-
8249
Intent intent = getIntent();
8350
String token = intent.getStringExtra(EXTRA_TOKEN);
8451

85-
initApiClient(token);
86-
setupSearch();
87-
setupPlayer();
88-
89-
if (mCurrentQuery != null) {
90-
search(mCurrentQuery);
91-
}
92-
}
93-
94-
private void initApiClient(String token) {
95-
SpotifyApi spotifyApi = new SpotifyApi();
52+
mActionListener = new SearchPresenter(this, this);
53+
mActionListener.init(token);
9654

97-
if (token != null) {
98-
spotifyApi.setAccessToken(token);
99-
} else {
100-
logError("No valid access token");
101-
}
102-
103-
logMessage("Api Client created");
104-
mSpotifyService = spotifyApi.getService();
105-
}
106-
107-
private void setupSearch() {
108-
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
55+
// Setup search field
56+
SearchView searchView = (SearchView) findViewById(R.id.search_view);
57+
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
10958
@Override
11059
public boolean onQueryTextSubmit(String query) {
111-
logMessage("query text submit " + query);
112-
search(query);
60+
mActionListener.search(query);
11361
return true;
11462
}
11563

@@ -119,87 +67,65 @@ public boolean onQueryTextChange(String newText) {
11967
}
12068
});
12169

122-
mAdapter = new SearchResultsAdapter(this, mSpotifyService, new SearchResultsAdapter.ItemSelectedListener() {
70+
71+
// Setup search results list
72+
mAdapter = new SearchResultsAdapter(this, new SearchResultsAdapter.ItemSelectedListener() {
12373
@Override
12474
public void onItemSelected(View itemView, Track item) {
125-
handleTrackSelection(item);
75+
mActionListener.selectTrack(item);
12676
itemView.setSelected(true);
12777
itemView.setActivated(true);
12878
}
12979
});
13080

131-
mResultsList.setLayoutManager(mLayoutManager);
132-
mResultsList.setAdapter(mAdapter);
133-
mResultsList.addOnScrollListener(mScrollListener);
134-
}
81+
RecyclerView resultsList = (RecyclerView) findViewById(R.id.search_results);
82+
resultsList.setHasFixedSize(true);
83+
resultsList.setLayoutManager(mLayoutManager);
84+
resultsList.setAdapter(mAdapter);
85+
resultsList.addOnScrollListener(mScrollListener);
13586

136-
private void search(@NonNull String query) {
137-
if (!query.isEmpty() && !query.equals(mCurrentQuery)) {
138-
mCurrentQuery = query;
139-
mScrollListener.reset();
140-
mAdapter.searchTracks(query, 20);
87+
// If Activity was recreated wit active search restore it
88+
if (savedInstanceState != null) {
89+
String currentQuery = savedInstanceState.getString(KEY_CURRENT_QUERY);
90+
mActionListener.search(currentQuery);
14191
}
14292
}
14393

144-
private void handleTrackSelection(Track track) {
145-
String previewUrl = track.preview_url;
146-
147-
if (previewUrl == null) {
148-
logMessage("Track doesn't have a preview");
149-
return;
150-
}
151-
152-
if (mPlayer == null) return;
153-
154-
String currentTrackUrl = mPlayer.getCurrentTrack();
155-
156-
if (currentTrackUrl == null || !currentTrackUrl.equals(previewUrl)) {
157-
mPlayer.play(previewUrl);
158-
} else if (mPlayer.isPlaying()) {
159-
mPlayer.pause();
160-
} else {
161-
mPlayer.resume();
162-
}
94+
@Override
95+
public void reset() {
96+
mScrollListener.reset();
97+
mAdapter.clearData();
16398
}
16499

165-
private void setupPlayer() {
166-
bindService(PlayerService.getIntent(this), mServiceConnection, BIND_AUTO_CREATE);
100+
@Override
101+
public void addData(List<Track> items) {
102+
mAdapter.addData(items);
167103
}
168104

169105
@Override
170106
protected void onPause() {
171107
super.onPause();
172-
startService(PlayerService.getIntent(this));
108+
mActionListener.pause();
173109
}
174110

175111
@Override
176112
protected void onResume() {
177113
super.onResume();
178-
stopService(PlayerService.getIntent(this));
114+
mActionListener.resume();
179115
}
180116

181117
@Override
182118
protected void onSaveInstanceState(Bundle outState) {
183119
super.onSaveInstanceState(outState);
184-
if (mCurrentQuery != null) {
185-
outState.putString(KEY_CURRENT_QUERY, mCurrentQuery);
120+
if (mActionListener.getCurrentQuery() != null) {
121+
outState.putString(KEY_CURRENT_QUERY, mActionListener.getCurrentQuery());
186122
}
187123
}
188124

189125
@Override
190126
protected void onDestroy() {
191-
unbindService(mServiceConnection);
127+
mActionListener.destroy();
192128
super.onDestroy();
193129
}
194130

195-
private void logError(String msg) {
196-
Toast.makeText(this, "Error: " + msg, Toast.LENGTH_SHORT).show();
197-
Log.e(TAG, msg);
198-
}
199-
200-
private void logMessage(String msg) {
201-
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
202-
Log.d(TAG, msg);
203-
}
204-
205131
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.spotify.sdk.android;
2+
3+
import java.util.List;
4+
5+
import kaaes.spotify.webapi.android.models.Track;
6+
7+
public class Search {
8+
9+
public interface View {
10+
void reset();
11+
12+
void addData(List<Track> items);
13+
}
14+
15+
public interface ActionListener {
16+
17+
void init(String token);
18+
19+
String getCurrentQuery();
20+
21+
void search(String searchQuery);
22+
23+
void loadMoreResults();
24+
25+
void selectTrack(Track item);
26+
27+
void resume();
28+
29+
void pause();
30+
31+
void destroy();
32+
33+
}
34+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.spotify.sdk.android;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.Map;
6+
7+
import kaaes.spotify.webapi.android.SpotifyCallback;
8+
import kaaes.spotify.webapi.android.SpotifyError;
9+
import kaaes.spotify.webapi.android.SpotifyService;
10+
import kaaes.spotify.webapi.android.models.Track;
11+
import kaaes.spotify.webapi.android.models.TracksPager;
12+
import retrofit.client.Response;
13+
14+
public class SearchPager {
15+
16+
private final SpotifyService mSpotifyApi;
17+
private int mCurrentOffset;
18+
private int mPageSize;
19+
private String mCurrentQuery;
20+
21+
public interface CompleteListener {
22+
void onComplete(List<Track> items);
23+
void onError(Throwable error);
24+
}
25+
26+
public SearchPager(SpotifyService spotifyApi) {
27+
mSpotifyApi = spotifyApi;
28+
}
29+
30+
public void getFirstPage(String query, int pageSize, CompleteListener listener) {
31+
mCurrentOffset = 0;
32+
mPageSize = pageSize;
33+
mCurrentQuery = query;
34+
getData(query, 0, pageSize, listener);
35+
}
36+
37+
public void getNextPage(CompleteListener listener) {
38+
mCurrentOffset += mPageSize;
39+
getData(mCurrentQuery, mCurrentOffset, mPageSize, listener);
40+
}
41+
42+
private void getData(String query, int offset, final int limit, final CompleteListener listener) {
43+
44+
Map<String, Object> options = new HashMap<>();
45+
options.put(SpotifyService.OFFSET, offset);
46+
options.put(SpotifyService.LIMIT, limit);
47+
48+
mSpotifyApi.searchTracks(query, options, new SpotifyCallback<TracksPager>() {
49+
@Override
50+
public void success(TracksPager tracksPager, Response response) {
51+
// mHasMoreItems = tracksPager.tracks.total > tracksPager.tracks.offset + tracksPager.tracks.limit;
52+
listener.onComplete(tracksPager.tracks.items);
53+
}
54+
55+
@Override
56+
public void failure(SpotifyError error) {
57+
listener.onError(error);
58+
}
59+
});
60+
}
61+
}

0 commit comments

Comments
 (0)