1
1
package com .spotify .sdk .android ;
2
2
3
- import android .content .ComponentName ;
4
3
import android .content .Context ;
5
4
import android .content .Intent ;
6
- import android .content .ServiceConnection ;
7
5
import android .os .Bundle ;
8
- import android .os .IBinder ;
9
- import android .support .annotation .NonNull ;
10
6
import android .support .v7 .app .AppCompatActivity ;
11
7
import android .support .v7 .widget .LinearLayoutManager ;
12
8
import android .support .v7 .widget .RecyclerView ;
13
- import android .util .Log ;
14
9
import android .view .View ;
15
10
import android .widget .SearchView ;
16
- import android .widget .Toast ;
17
11
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 ;
21
13
22
- public class MainActivity extends AppCompatActivity {
14
+ import kaaes . spotify . webapi . android . models . Track ;
23
15
24
- private static final String TAG = MainActivity . class . getSimpleName ();
16
+ public class MainActivity extends AppCompatActivity implements Search . View {
25
17
26
18
static final String EXTRA_TOKEN = "EXTRA_TOKEN" ;
27
19
private static final String KEY_CURRENT_QUERY = "CURRENT_QUERY" ;
28
20
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 ;
47
22
48
23
private LinearLayoutManager mLayoutManager = new LinearLayoutManager (this );
49
24
private ScrollListener mScrollListener = new ScrollListener (mLayoutManager );
50
- ;
25
+ private SearchResultsAdapter mAdapter ;
26
+
51
27
52
28
private class ScrollListener extends ResultListScrollListener {
53
29
@@ -57,8 +33,7 @@ public ScrollListener(LinearLayoutManager layoutManager) {
57
33
58
34
@ Override
59
35
public void onLoadMore () {
60
- Log .d (TAG , "Load more..." );
61
- mAdapter .getNextPage ();
36
+ mActionListener .loadMoreResults ();
62
37
}
63
38
}
64
39
@@ -71,45 +46,18 @@ protected void onCreate(Bundle savedInstanceState) {
71
46
super .onCreate (savedInstanceState );
72
47
setContentView (R .layout .activity_main );
73
48
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
-
82
49
Intent intent = getIntent ();
83
50
String token = intent .getStringExtra (EXTRA_TOKEN );
84
51
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 );
96
54
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 () {
109
58
@ Override
110
59
public boolean onQueryTextSubmit (String query ) {
111
- logMessage ("query text submit " + query );
112
- search (query );
60
+ mActionListener .search (query );
113
61
return true ;
114
62
}
115
63
@@ -119,87 +67,65 @@ public boolean onQueryTextChange(String newText) {
119
67
}
120
68
});
121
69
122
- mAdapter = new SearchResultsAdapter (this , mSpotifyService , new SearchResultsAdapter .ItemSelectedListener () {
70
+
71
+ // Setup search results list
72
+ mAdapter = new SearchResultsAdapter (this , new SearchResultsAdapter .ItemSelectedListener () {
123
73
@ Override
124
74
public void onItemSelected (View itemView , Track item ) {
125
- handleTrackSelection (item );
75
+ mActionListener . selectTrack (item );
126
76
itemView .setSelected (true );
127
77
itemView .setActivated (true );
128
78
}
129
79
});
130
80
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 );
135
86
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 );
141
91
}
142
92
}
143
93
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 ();
163
98
}
164
99
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 );
167
103
}
168
104
169
105
@ Override
170
106
protected void onPause () {
171
107
super .onPause ();
172
- startService ( PlayerService . getIntent ( this ) );
108
+ mActionListener . pause ( );
173
109
}
174
110
175
111
@ Override
176
112
protected void onResume () {
177
113
super .onResume ();
178
- stopService ( PlayerService . getIntent ( this ) );
114
+ mActionListener . resume ( );
179
115
}
180
116
181
117
@ Override
182
118
protected void onSaveInstanceState (Bundle outState ) {
183
119
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 () );
186
122
}
187
123
}
188
124
189
125
@ Override
190
126
protected void onDestroy () {
191
- unbindService ( mServiceConnection );
127
+ mActionListener . destroy ( );
192
128
super .onDestroy ();
193
129
}
194
130
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
-
205
131
}
0 commit comments