Skip to content

Commit a55b543

Browse files
committed
[Android] fixed pageSize, pagedListAdapter onClickListener
1 parent e4c05eb commit a55b543

File tree

7 files changed

+288
-168
lines changed

7 files changed

+288
-168
lines changed

AAD-Preparation/.idea/workspace.xml

Lines changed: 148 additions & 135 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/adapters/AlbumAdapter.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,18 @@
3535

3636
public class AlbumAdapter extends PagedListAdapter<Album, AlbumAdapter.MainRvHolder> {
3737
private final String TAG = AlbumAdapter.class.getSimpleName();
38+
private ItemClickEvent itemClickEvent;
39+
3840

3941
public AlbumAdapter() {
4042
super(DIFF_CALLBACK);
4143
}
4244

45+
public AlbumAdapter(ItemClickEvent itemClickEvent) {
46+
this();
47+
this.itemClickEvent = itemClickEvent;
48+
}
49+
4350
@NonNull
4451
@Override
4552
public MainRvHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
@@ -48,7 +55,6 @@ public MainRvHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewTyp
4855

4956
@Override
5057
public void onBindViewHolder(@NonNull final MainRvHolder mainRvHolder, final int position) {
51-
5258
Album album = getItem(position);
5359
if (album != null)
5460
mainRvHolder.bindTo(album);
@@ -57,7 +63,7 @@ public void onBindViewHolder(@NonNull final MainRvHolder mainRvHolder, final int
5763

5864
}
5965

60-
class MainRvHolder extends RecyclerView.ViewHolder {
66+
public class MainRvHolder extends RecyclerView.ViewHolder {
6167
private TextView tv_title;
6268
private TextView tv_subtitle;
6369
private SimpleDraweeView sdv_photo;
@@ -78,6 +84,9 @@ public Album getAlbum() {
7884

7985
void bindTo(Album album) {
8086
this.album = album;
87+
if (itemClickEvent != null)
88+
itemView.setOnClickListener(v -> itemClickEvent.onClick(v, album));
89+
8190
if (!TextUtils.isEmpty(album.getImage())) {
8291
sdv_photo.setVisibility(View.VISIBLE);
8392
// show raw images
@@ -157,6 +166,10 @@ void clear() {
157166

158167
}
159168

169+
public interface ItemClickEvent {
170+
void onClick(View view, Album album);
171+
}
172+
160173
private static final DiffUtil.ItemCallback<Album> DIFF_CALLBACK =
161174
new DiffUtil.ItemCallback<Album>() {
162175
@Override

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/fragments/AlbumsFragment.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,34 @@
11
package com.catherine.materialdesignapp.fragments;
22

3+
import android.content.Intent;
4+
import android.os.Build;
35
import android.os.Bundle;
46
import android.view.LayoutInflater;
57
import android.view.View;
68
import android.view.ViewGroup;
9+
import android.widget.TextView;
710

811
import androidx.annotation.NonNull;
912
import androidx.annotation.Nullable;
13+
import androidx.core.app.ActivityCompat;
14+
import androidx.core.app.ActivityOptionsCompat;
15+
import androidx.core.util.Pair;
1016
import androidx.lifecycle.ViewModelProviders;
1117
import androidx.recyclerview.widget.LinearLayoutManager;
1218
import androidx.recyclerview.widget.RecyclerView;
1319
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
1420

1521
import com.catherine.materialdesignapp.R;
22+
import com.catherine.materialdesignapp.activities.AlbumDetailsActivity;
1623
import com.catherine.materialdesignapp.adapters.AlbumAdapter;
24+
import com.catherine.materialdesignapp.jetpack.entities.Album;
1725
import com.catherine.materialdesignapp.jetpack.view_models.AlbumViewModel;
1826
import com.catherine.materialdesignapp.jetpack.view_models.AlbumViewModelFactory;
1927
import com.catherine.materialdesignapp.listeners.OnSearchViewListener;
2028
import com.catherine.materialdesignapp.listeners.UIComponentsListener;
29+
import com.facebook.drawee.view.SimpleDraweeView;
30+
31+
import java.util.List;
2132

2233
public class AlbumsFragment extends ChildOfMusicFragment implements OnSearchViewListener {
2334
public final static String TAG = AlbumsFragment.class.getSimpleName();
@@ -42,7 +53,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
4253
RecyclerView recyclerView = view.findViewById(R.id.rv_artist);
4354
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
4455

45-
AlbumAdapter adapter = new AlbumAdapter();
56+
AlbumAdapter adapter = new AlbumAdapter(this::goToAlbumDetails);
4657
recyclerView.setAdapter(adapter);
4758

4859
if (getActivity() == null)
@@ -80,4 +91,35 @@ public void onFragmentHide() {
8091
if (listener != null)
8192
listener.addOnSearchListener(null);
8293
}
94+
95+
private void goToAlbumDetails(View view, Album album) {
96+
SimpleDraweeView sdv_photo = view.findViewById(R.id.sdv_photo);
97+
TextView tv_name = view.findViewById(R.id.tv_title);
98+
TextView tv_artist = view.findViewById(R.id.tv_subtitle);
99+
100+
Intent intent = new Intent(getActivity(), AlbumDetailsActivity.class);
101+
intent.putExtra("cover", album.getImage());
102+
intent.putExtra("album", album.getTitle());
103+
intent.putExtra("artist", album.getArtist());
104+
105+
List<String> songList = album.getSongs();
106+
String[] songs = new String[songList.size()];
107+
intent.putExtra("songs", songList.toArray(songs));
108+
109+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
110+
//Shared Elements Transitions
111+
String imageTransitionName = sdv_photo.getTransitionName();
112+
String nameTransitionName = tv_name.getTransitionName();
113+
String artistTransitionName = tv_artist.getTransitionName();
114+
115+
Pair<View, String> p1 = Pair.create(sdv_photo, imageTransitionName);
116+
Pair<View, String> p2 = Pair.create(tv_name, nameTransitionName);
117+
Pair<View, String> p3 = Pair.create(tv_artist, artistTransitionName);
118+
119+
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), p1, p2, p3);
120+
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
121+
} else {
122+
startActivity(intent);
123+
}
124+
}
83125
}

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/jetpack/repositories/AlbumRepository.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ public LiveData<PagedList<Album>> getAlbumLiveData(String keyword, int size) {
9999
}
100100
}
101101

102+
public int getCount() {
103+
try {
104+
return mIoExecutor.submit(mAlbumDao::count).get();
105+
} catch (ExecutionException e) {
106+
e.printStackTrace();
107+
return 0;
108+
} catch (InterruptedException e) {
109+
e.printStackTrace();
110+
return 0;
111+
}
112+
}
113+
102114
public void insert(Album album) {
103115
mIoExecutor.submit(() -> mAlbumDao.insert(album));
104116
}

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/jetpack/view_models/AlbumViewModel.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@ public class AlbumViewModel extends ViewModel {
1313
private AlbumRepository mAlbumRepository;
1414
private LiveData<PagedList<Album>> albumLiveData;
1515
private final MediatorLiveData<PagedList<Album>> mAlbumMediator = new MediatorLiveData<>();
16-
private final static int PAGE_SIZE = 30;
16+
private int pageSize;
1717

1818

1919
public AlbumViewModel(AlbumRepository mAlbumRepository) {
2020
this.mAlbumRepository = mAlbumRepository;
21-
albumLiveData = mAlbumRepository.getAlbumLiveData(PAGE_SIZE);
22-
mAlbumMediator.addSource(mAlbumRepository.getAlbumLiveData(PAGE_SIZE), mAlbumMediator::setValue);
21+
pageSize = mAlbumRepository.getCount();
22+
albumLiveData = mAlbumRepository.getAlbumLiveData(pageSize);
23+
mAlbumMediator.addSource(mAlbumRepository.getAlbumLiveData(pageSize), mAlbumMediator::setValue);
2324
}
2425

2526
public MediatorLiveData<PagedList<Album>> getAlbumLiveData() {
@@ -28,7 +29,8 @@ public MediatorLiveData<PagedList<Album>> getAlbumLiveData() {
2829

2930
public void search(String keyword) {
3031
mAlbumMediator.removeSource(albumLiveData);
31-
mAlbumMediator.addSource(mAlbumRepository.getAlbumLiveData(keyword, PAGE_SIZE), mAlbumMediator::setValue);
32+
albumLiveData = mAlbumRepository.getAlbumLiveData(keyword, pageSize);
33+
mAlbumMediator.addSource(albumLiveData, mAlbumMediator::setValue);
3234
}
3335

3436
public void insert(Album album) {

AAD-Preparation/app/src/main/java/com/catherine/materialdesignapp/providers/AlbumsProvider.java

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@
88
import android.net.Uri;
99
import android.text.TextUtils;
1010
import android.util.Log;
11+
1112
import androidx.annotation.NonNull;
1213
import androidx.annotation.Nullable;
1314
import androidx.room.Room;
1415
import androidx.sqlite.db.SimpleSQLiteQuery;
1516
import androidx.sqlite.db.SupportSQLiteQuery;
1617
import androidx.sqlite.db.SupportSQLiteQueryBuilder;
18+
1719
import com.catherine.materialdesignapp.jetpack.StringListConverter;
1820
import com.catherine.materialdesignapp.jetpack.daos.AlbumDao;
1921
import com.catherine.materialdesignapp.jetpack.databases.AlbumRoomDatabase;
@@ -28,11 +30,11 @@ public class AlbumsProvider extends ContentProvider {
2830

2931

3032
private static final int ALBUMS = 1;
31-
private static final int ALBUMS_ID = 2;
33+
private static final int ALBUMS_TITLE = 2;
3234

3335
static {
3436
sURIMatcher.addURI(AUTHORITY, "albums", ALBUMS);
35-
sURIMatcher.addURI(AUTHORITY, "albums/#", ALBUMS_ID);
37+
sURIMatcher.addURI(AUTHORITY, "albums/#", ALBUMS_TITLE);
3638
}
3739

3840
private AlbumDao albumDao;
@@ -63,9 +65,9 @@ public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable S
6365
.orderBy(sortOrder)
6466
.create();
6567
return albumDao.select(mQuery);
66-
case ALBUMS_ID:
67-
if (!TextUtils.isEmpty(selection) && !selection.trim().contains("_id=")) {
68-
String mSelection = selection + " AND _id = ?";
68+
case ALBUMS_TITLE:
69+
if (!TextUtils.isEmpty(selection) && !selection.trim().contains("title=")) {
70+
String mSelection = selection + " AND title = ?";
6971
String[] mSelectionArgs = new String[selectionArgs.length + 1];
7072
System.arraycopy(selectionArgs, 0, mSelectionArgs, 0, selectionArgs.length);
7173
mSelectionArgs[mSelectionArgs.length - 1] = ContentUris.parseId(uri) + "";
@@ -95,7 +97,7 @@ public String getType(@NonNull Uri uri) {
9597
switch (sURIMatcher.match(uri)) {
9698
case ALBUMS:
9799
return "vnd.android.cursor.dir/" + AUTHORITY + "." + "albums";
98-
case ALBUMS_ID:
100+
case ALBUMS_TITLE:
99101
return "vnd.android.cursor.item/" + AUTHORITY + "." + "albums/#";
100102
default:
101103
throw new IllegalArgumentException("Unknown URI: " + uri);
@@ -131,8 +133,8 @@ public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
131133
long id = albumDao.insert(album);
132134
getContext().getContentResolver().notifyChange(uri, null);
133135
return ContentUris.withAppendedId(uri, id);
134-
case ALBUMS_ID:
135-
throw new IllegalArgumentException("Invalid URI, cannot insert with _id: " + uri);
136+
case ALBUMS_TITLE:
137+
throw new IllegalArgumentException("Invalid URI, cannot insert with title: " + uri);
136138
default:
137139
throw new IllegalArgumentException("Unknown URI: " + uri);
138140
}
@@ -144,29 +146,29 @@ public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String
144146
SimpleSQLiteQuery query;
145147
switch (sURIMatcher.match(uri)) {
146148
case ALBUMS:
147-
if (TextUtils.isEmpty(selection) || selection.trim().contains("_id="))
148-
throw new IllegalArgumentException("Invalid URI, cannot delete without _id: " + uri);
149+
if (TextUtils.isEmpty(selection) || selection.trim().contains("title="))
150+
throw new IllegalArgumentException("Invalid URI, cannot delete without title: " + uri);
149151

150152
query = new SimpleSQLiteQuery("DELETE FROM album_table WHERE " + selection, selectionArgs);
151153
count = albumDao.deleteByRawQuery(query);
152154
getContext().getContentResolver().notifyChange(uri, null);
153155
return count;
154-
case ALBUMS_ID:
156+
case ALBUMS_TITLE:
155157
if (getContext() == null)
156158
return -1;
157159

158160
String mSelection;
159161
String[] mSelectionArgs;
160162
if (TextUtils.isEmpty(selection)) {
161-
mSelection = "DELETE FROM album_table WHERE _id = ?";
163+
mSelection = "DELETE FROM album_table WHERE title = ?";
162164
mSelectionArgs = new String[]{ContentUris.parseId(uri) + ""};
163-
} else if (!selection.trim().contains("_id=")) {
164-
mSelection = "DELETE FROM album_table WHERE " + selection + " AND _id = ?";
165+
} else if (!selection.trim().contains("title=")) {
166+
mSelection = "DELETE FROM album_table WHERE " + selection + " AND title = ?";
165167
mSelectionArgs = new String[selectionArgs.length + 1];
166168
System.arraycopy(selectionArgs, 0, mSelectionArgs, 0, selectionArgs.length);
167169
mSelectionArgs[mSelectionArgs.length - 1] = ContentUris.parseId(uri) + "";
168170
} else {
169-
throw new IllegalArgumentException("Invalid URI, cannot delete with duplicated _id: " + uri);
171+
throw new IllegalArgumentException("Invalid URI, cannot delete with duplicated title: " + uri);
170172
}
171173

172174
query = new SimpleSQLiteQuery(mSelection, mSelectionArgs);
@@ -184,7 +186,7 @@ public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable St
184186
if (getContext() == null)
185187
return -1;
186188

187-
if (sURIMatcher.match(uri) != ALBUMS && sURIMatcher.match(uri) != ALBUMS_ID)
189+
if (sURIMatcher.match(uri) != ALBUMS && sURIMatcher.match(uri) != ALBUMS_TITLE)
188190
throw new IllegalArgumentException("Invalid URI: " + uri);
189191

190192
if (values == null)
@@ -222,18 +224,18 @@ public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable St
222224
mQuery.append(selection);
223225
}
224226
} else {
225-
// sURIMatcher.match(uri) == ALBUMS_ID
227+
// sURIMatcher.match(uri) == ALBUMS_TITLE
226228
if (TextUtils.isEmpty(selection)) {
227-
mQuery.append(" WHERE _id = ?");
229+
mQuery.append(" WHERE title = ?");
228230
mSelectionArgs = new String[]{ContentUris.parseId(uri) + ""};
229-
} else if (!selection.trim().contains("_id=")) {
231+
} else if (!selection.trim().contains("title=")) {
230232
mQuery.append(" WHERE ");
231233
mQuery.append(selection);
232234
mSelectionArgs = new String[selectionArgs.length + 1];
233235
System.arraycopy(selectionArgs, 0, mSelectionArgs, 0, selectionArgs.length);
234236
mSelectionArgs[mSelectionArgs.length - 1] = ContentUris.parseId(uri) + "";
235237
} else {
236-
throw new IllegalArgumentException("Invalid URI, cannot update with duplicated _id: " + uri);
238+
throw new IllegalArgumentException("Invalid URI, cannot update with duplicated title: " + uri);
237239
}
238240
}
239241

0 commit comments

Comments
 (0)