Skip to content

Commit 11668e2

Browse files
committed
Experimenting with the support Paging Library, comitting just for safety
Change-Id: I7b7a7da48530817dfad36afd428af7f553e12cd0
1 parent a7153be commit 11668e2

File tree

5 files changed

+256
-1
lines changed

5 files changed

+256
-1
lines changed

app/src/main/java/com/firebase/uidemo/database/firestore/FirestorePagingActivity.java

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package com.firebase.uidemo.database.firestore;
22

3+
import android.arch.lifecycle.Observer;
4+
import android.arch.paging.PagedList;
5+
import android.arch.paging.PagedListAdapter;
36
import android.os.Bundle;
47
import android.support.annotation.NonNull;
8+
import android.support.annotation.Nullable;
59
import android.support.v7.app.AppCompatActivity;
10+
import android.support.v7.recyclerview.extensions.DiffCallback;
611
import android.support.v7.widget.LinearLayoutManager;
712
import android.support.v7.widget.RecyclerView;
813
import android.util.Log;
@@ -18,10 +23,12 @@
1823
import com.firebase.ui.firestore.FirestoreInfiniteScrollListener;
1924
import com.firebase.ui.firestore.FirestorePagingAdapter;
2025
import com.firebase.ui.firestore.FirestorePagingOptions;
26+
import com.firebase.ui.firestore.paging.FirestorePagedList;
2127
import com.firebase.uidemo.R;
2228
import com.google.android.gms.tasks.OnCompleteListener;
2329
import com.google.android.gms.tasks.Task;
2430
import com.google.firebase.firestore.CollectionReference;
31+
import com.google.firebase.firestore.DocumentSnapshot;
2532
import com.google.firebase.firestore.FirebaseFirestore;
2633
import com.google.firebase.firestore.Query;
2734
import com.google.firebase.firestore.WriteBatch;
@@ -52,7 +59,9 @@ protected void onCreate(Bundle savedInstanceState) {
5259
mFirestore = FirebaseFirestore.getInstance();
5360
mProgressBar.setIndeterminate(true);
5461

55-
setUpAdapter();
62+
// TODO
63+
// setUpAdapter();
64+
setUpAdapter_Alternate();
5665
}
5766

5867
private void setUpAdapter() {
@@ -108,6 +117,39 @@ protected void onLoadingStateChanged(boolean isLoading) {
108117
mRecycler.addOnScrollListener(listener);
109118
}
110119

120+
private void setUpAdapter_Alternate() {
121+
DiffCallback<DocumentSnapshot> diffCallback = FirestorePagedList.getDiffer();
122+
123+
final PagedListAdapter<DocumentSnapshot, ItemViewHolder> adapter = new PagedListAdapter<DocumentSnapshot, ItemViewHolder>(diffCallback) {
124+
@Override
125+
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
126+
View view = LayoutInflater.from(parent.getContext())
127+
.inflate(R.layout.item_item, parent, false);
128+
129+
return new ItemViewHolder(view);
130+
}
131+
132+
@Override
133+
public void onBindViewHolder(ItemViewHolder holder, int position) {
134+
DocumentSnapshot snapshot = getItem(position);
135+
Item model = snapshot.toObject(Item.class);
136+
137+
holder.bind(model);
138+
}
139+
};
140+
141+
FirestorePagedList.getLiveData().observe(this,
142+
new Observer<PagedList<DocumentSnapshot>>() {
143+
@Override
144+
public void onChanged(@Nullable PagedList<DocumentSnapshot> snapshots) {
145+
adapter.setList(snapshots);
146+
}
147+
});
148+
149+
mRecycler.setLayoutManager(new LinearLayoutManager(this));
150+
mRecycler.setAdapter(adapter);
151+
}
152+
111153
@Override
112154
public boolean onCreateOptionsMenu(Menu menu) {
113155
getMenuInflater().inflate(R.menu.menu_firestore_paging, menu);

firestore/build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ dependencies {
2222
api "com.android.support:recyclerview-v7:$supportLibraryVersion"
2323
annotationProcessor "android.arch.lifecycle:compiler:$architectureVersion"
2424

25+
26+
api "android.arch.paging:common:1.0.0-alpha5"
27+
api "android.arch.paging:runtime:1.0.0-alpha5"
28+
2529
androidTestImplementation 'junit:junit:4.12'
2630
androidTestImplementation 'com.android.support.test:runner:1.0.1'
2731
androidTestImplementation 'com.android.support.test:rules:1.0.1'
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.firebase.ui.firestore.paging;
2+
3+
import android.arch.paging.PageKeyedDataSource;
4+
import android.support.annotation.NonNull;
5+
import android.util.Log;
6+
7+
import com.google.android.gms.tasks.OnFailureListener;
8+
import com.google.android.gms.tasks.OnSuccessListener;
9+
import com.google.firebase.firestore.DocumentSnapshot;
10+
import com.google.firebase.firestore.Query;
11+
import com.google.firebase.firestore.QuerySnapshot;
12+
13+
import java.util.List;
14+
15+
/**
16+
* Created by samstern on 3/15/18.
17+
*/
18+
19+
public class FirestoreDataSource extends PageKeyedDataSource<PageKey, DocumentSnapshot> {
20+
21+
private static final String TAG = "FirestoreDataSource";
22+
23+
private final Query mBaseQuery;
24+
25+
public FirestoreDataSource(Query baseQuery) {
26+
mBaseQuery = baseQuery;
27+
}
28+
29+
@Override
30+
public void loadInitial(@NonNull LoadInitialParams<PageKey> params,
31+
@NonNull final LoadInitialCallback<PageKey, DocumentSnapshot> callback) {
32+
33+
Log.d(TAG, "loadInitial: " + params.requestedLoadSize);
34+
mBaseQuery.limit(params.requestedLoadSize)
35+
.get()
36+
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
37+
@Override
38+
public void onSuccess(QuerySnapshot snapshots) {
39+
List<DocumentSnapshot> data = snapshots.getDocuments();
40+
DocumentSnapshot last = getLast(data);
41+
42+
PageKey nextPage = new PageKey(last, null);
43+
callback.onResult(data, null, nextPage);
44+
}
45+
})
46+
.addOnFailureListener(new OnFailureListener() {
47+
@Override
48+
public void onFailure(@NonNull Exception e) {
49+
// TODO: errors?
50+
}
51+
});
52+
53+
}
54+
55+
@Override
56+
public void loadBefore(@NonNull LoadParams<PageKey> params,
57+
@NonNull LoadCallback<PageKey, DocumentSnapshot> callback) {
58+
PageKey key = params.key;
59+
Log.d(TAG, "loadBefore: " + key + ", " + params.requestedLoadSize);
60+
// TODO: Do I need the reverse query here?
61+
}
62+
63+
@Override
64+
public void loadAfter(@NonNull LoadParams<PageKey> params,
65+
@NonNull final LoadCallback<PageKey, DocumentSnapshot> callback) {
66+
PageKey key = params.key;
67+
Log.d(TAG, "loadAfter: " + key + ", " + params.requestedLoadSize);
68+
69+
key.getPageQuery(mBaseQuery, params.requestedLoadSize)
70+
.get()
71+
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
72+
@Override
73+
public void onSuccess(QuerySnapshot snapshots) {
74+
List<DocumentSnapshot> data = snapshots.getDocuments();
75+
DocumentSnapshot last = getLast(data);
76+
77+
PageKey nextPage = new PageKey(last, null);
78+
callback.onResult(data, nextPage);
79+
}
80+
})
81+
.addOnFailureListener(new OnFailureListener() {
82+
@Override
83+
public void onFailure(@NonNull Exception e) {
84+
85+
}
86+
});
87+
88+
}
89+
90+
private DocumentSnapshot getLast(List<DocumentSnapshot> data) {
91+
DocumentSnapshot last = (data == null || data.isEmpty())
92+
? null
93+
: data.get(data.size() - 1);
94+
95+
return last;
96+
}
97+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.firebase.ui.firestore.paging;
2+
3+
import android.arch.lifecycle.LiveData;
4+
import android.arch.paging.DataSource;
5+
import android.arch.paging.LivePagedListBuilder;
6+
import android.arch.paging.PagedList;
7+
import android.support.annotation.NonNull;
8+
import android.support.v7.recyclerview.extensions.DiffCallback;
9+
10+
import com.google.firebase.firestore.DocumentSnapshot;
11+
import com.google.firebase.firestore.FirebaseFirestore;
12+
import com.google.firebase.firestore.Query;
13+
14+
/**
15+
* Created by samstern on 3/15/18.
16+
*/
17+
18+
public abstract class FirestorePagedList {
19+
20+
public static LiveData<PagedList<DocumentSnapshot>> getLiveData() {
21+
DataSource.Factory<PageKey, DocumentSnapshot> factory = new DataSource.Factory<PageKey, DocumentSnapshot>() {
22+
23+
@Override
24+
public DataSource<PageKey, DocumentSnapshot> create() {
25+
// TODO
26+
Query query = FirebaseFirestore.getInstance().collection("items")
27+
.orderBy("value", Query.Direction.ASCENDING);
28+
return new FirestoreDataSource(query);
29+
}
30+
31+
};
32+
33+
PagedList.Config config = new PagedList.Config.Builder()
34+
.setEnablePlaceholders(false)
35+
.setPrefetchDistance(10)
36+
.setPageSize(20)
37+
.build();
38+
39+
LiveData<PagedList<DocumentSnapshot>> liveData =
40+
new LivePagedListBuilder<>(factory, config)
41+
.build();
42+
43+
return liveData;
44+
}
45+
46+
public static DiffCallback<DocumentSnapshot> getDiffer() {
47+
return new DiffCallback<DocumentSnapshot>() {
48+
@Override
49+
public boolean areItemsTheSame(@NonNull DocumentSnapshot oldItem,
50+
@NonNull DocumentSnapshot newItem) {
51+
52+
return oldItem.getId().equals(newItem.getId());
53+
}
54+
55+
@Override
56+
public boolean areContentsTheSame(@NonNull DocumentSnapshot oldItem,
57+
@NonNull DocumentSnapshot newItem) {
58+
59+
// TODO: Does this even work?
60+
return oldItem.getData().equals(newItem.getData());
61+
}
62+
};
63+
}
64+
65+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.firebase.ui.firestore.paging;
2+
3+
import android.support.annotation.Nullable;
4+
5+
import com.google.firebase.firestore.DocumentSnapshot;
6+
import com.google.firebase.firestore.Query;
7+
8+
/**
9+
* Created by samstern on 3/15/18.
10+
*/
11+
12+
public class PageKey {
13+
14+
private final DocumentSnapshot mStartAfter;
15+
private final DocumentSnapshot mEndBefore;
16+
17+
public PageKey(@Nullable DocumentSnapshot startAfter, @Nullable DocumentSnapshot endBefore) {
18+
mStartAfter = startAfter;
19+
mEndBefore = endBefore;
20+
}
21+
22+
public Query getPageQuery(Query baseQuery, int size) {
23+
Query pageQuery = baseQuery;
24+
25+
if (mStartAfter != null) {
26+
pageQuery = pageQuery.startAfter(mStartAfter);
27+
}
28+
29+
if (mEndBefore != null) {
30+
pageQuery = pageQuery.endBefore(mEndBefore);
31+
} else {
32+
pageQuery = pageQuery.limit(size);
33+
}
34+
35+
return pageQuery;
36+
}
37+
38+
@Override
39+
public String toString() {
40+
String startAfter = mStartAfter == null ? "null" : mStartAfter.getId();
41+
String endBefore = mEndBefore == null ? "null" : mEndBefore.getId();
42+
return "PageKey{" +
43+
"StartAfter=" + startAfter +
44+
", EndBefore=" + endBefore +
45+
'}';
46+
}
47+
}

0 commit comments

Comments
 (0)