Skip to content

Commit efc0095

Browse files
committed
Real adapter and options classes
Change-Id: I5935b36ea30207d0e4b2a8091a258d108bad9d5a
1 parent db39ddf commit efc0095

File tree

6 files changed

+220
-87
lines changed

6 files changed

+220
-87
lines changed

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

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
11
package com.firebase.uidemo.database.firestore;
22

3-
import android.arch.lifecycle.Observer;
43
import android.arch.paging.PagedList;
5-
import android.arch.paging.PagedListAdapter;
64
import android.os.Bundle;
75
import android.support.annotation.NonNull;
8-
import android.support.annotation.Nullable;
96
import android.support.v7.app.AppCompatActivity;
10-
import android.support.v7.util.DiffUtil;
117
import android.support.v7.widget.LinearLayoutManager;
128
import android.support.v7.widget.RecyclerView;
139
import android.util.Log;
@@ -20,12 +16,12 @@
2016
import android.widget.TextView;
2117
import android.widget.Toast;
2218

23-
import com.firebase.ui.firestore.paging.FirestorePagedList;
19+
import com.firebase.ui.firestore.paging.FirestorePagingAdapter;
20+
import com.firebase.ui.firestore.paging.FirestorePagingOptions;
2421
import com.firebase.uidemo.R;
2522
import com.google.android.gms.tasks.OnCompleteListener;
2623
import com.google.android.gms.tasks.Task;
2724
import com.google.firebase.firestore.CollectionReference;
28-
import com.google.firebase.firestore.DocumentSnapshot;
2925
import com.google.firebase.firestore.FirebaseFirestore;
3026
import com.google.firebase.firestore.Query;
3127
import com.google.firebase.firestore.WriteBatch;
@@ -63,34 +59,36 @@ private void setUpAdapter() {
6359
Query baseQuery = mFirestore.collection("items")
6460
.orderBy("value", Query.Direction.ASCENDING);
6561

66-
DiffUtil.ItemCallback<DocumentSnapshot> diffCallback = FirestorePagedList.getDiffCallback();
67-
final PagedListAdapter<DocumentSnapshot, ItemViewHolder> adapter = new PagedListAdapter<DocumentSnapshot, ItemViewHolder>(diffCallback) {
68-
@Override
69-
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
70-
View view = LayoutInflater.from(parent.getContext())
71-
.inflate(R.layout.item_item, parent, false);
62+
PagedList.Config config = new PagedList.Config.Builder()
63+
.setEnablePlaceholders(false)
64+
.setPrefetchDistance(10)
65+
.setPageSize(20)
66+
.build();
7267

73-
return new ItemViewHolder(view);
74-
}
68+
FirestorePagingOptions<Item> options = new FirestorePagingOptions.Builder<Item>()
69+
.setQuery(baseQuery, config, Item.class)
70+
.build();
7571

76-
@Override
77-
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
78-
DocumentSnapshot snapshot = getItem(position);
79-
Item model = snapshot.toObject(Item.class);
80-
81-
holder.bind(model);
82-
}
83-
};
84-
85-
// TODO: Expose loading state in the adapter
72+
FirestorePagingAdapter<Item, ItemViewHolder> adapter =
73+
new FirestorePagingAdapter<Item, ItemViewHolder>(options) {
74+
@NonNull
75+
@Override
76+
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
77+
int viewType) {
78+
View view = LayoutInflater.from(parent.getContext())
79+
.inflate(R.layout.item_item, parent, false);
80+
return new ItemViewHolder(view);
81+
}
8682

87-
FirestorePagedList.getLiveData(baseQuery).observe(this,
88-
new Observer<PagedList<DocumentSnapshot>>() {
8983
@Override
90-
public void onChanged(@Nullable PagedList<DocumentSnapshot> snapshots) {
91-
adapter.submitList(snapshots);
84+
protected void onBindViewHolder(@NonNull ItemViewHolder holder,
85+
int position,
86+
Item model) {
87+
holder.bind(model);
9288
}
93-
});
89+
};
90+
91+
// TODO: Expose loading state in the adapter
9492

9593
mRecycler.setLayoutManager(new LinearLayoutManager(this));
9694
mRecycler.setAdapter(adapter);

firestore/src/main/java/com/firebase/ui/firestore/paging/FirestoreDataSource.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.firebase.ui.firestore.paging;
22

3+
import android.arch.paging.DataSource;
34
import android.arch.paging.PageKeyedDataSource;
45
import android.support.annotation.NonNull;
56
import android.util.Log;
@@ -26,6 +27,16 @@ public FirestoreDataSource(Query baseQuery) {
2627
mBaseQuery = baseQuery;
2728
}
2829

30+
@NonNull
31+
public static DataSource.Factory<PageKey, DocumentSnapshot> newFactory(final Query query) {
32+
return new DataSource.Factory<PageKey, DocumentSnapshot>() {
33+
@Override
34+
public DataSource<PageKey, DocumentSnapshot> create() {
35+
return new FirestoreDataSource(query);
36+
}
37+
};
38+
}
39+
2940
@Override
3041
public void loadInitial(@NonNull LoadInitialParams<PageKey> params,
3142
@NonNull final LoadInitialCallback<PageKey, DocumentSnapshot> callback) {

firestore/src/main/java/com/firebase/ui/firestore/paging/FirestorePagedList.java

Lines changed: 0 additions & 56 deletions
This file was deleted.
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.firebase.ui.firestore.paging;
2+
3+
import android.arch.lifecycle.LiveData;
4+
import android.arch.lifecycle.Observer;
5+
import android.arch.paging.PagedList;
6+
import android.arch.paging.PagedListAdapter;
7+
import android.support.annotation.NonNull;
8+
import android.support.annotation.Nullable;
9+
import android.support.v7.util.DiffUtil;
10+
import android.support.v7.widget.RecyclerView;
11+
import android.view.ViewGroup;
12+
13+
import com.firebase.ui.firestore.SnapshotParser;
14+
import com.google.firebase.firestore.DocumentSnapshot;
15+
16+
/**
17+
* TODO(samstern): Document
18+
*/
19+
public abstract class FirestorePagingAdapter<T, VH extends RecyclerView.ViewHolder>
20+
extends PagedListAdapter<DocumentSnapshot, VH> {
21+
22+
private final SnapshotParser<T> mParser;
23+
private final LiveData<PagedList<DocumentSnapshot>> mData;
24+
25+
private final Observer<PagedList<DocumentSnapshot>> mObserver =
26+
new Observer<PagedList<DocumentSnapshot>>() {
27+
@Override
28+
public void onChanged(@Nullable PagedList<DocumentSnapshot> snapshots) {
29+
if (snapshots == null) {
30+
return;
31+
}
32+
33+
onListChanged(snapshots);
34+
}
35+
};
36+
37+
public static class DiffCallback<T> extends DiffUtil.ItemCallback<DocumentSnapshot> {
38+
39+
private final SnapshotParser<T> mParser;
40+
41+
public DiffCallback(SnapshotParser<T> parser) {
42+
mParser = parser;
43+
}
44+
45+
@Override
46+
public boolean areItemsTheSame(DocumentSnapshot oldItem, DocumentSnapshot newItem) {
47+
return oldItem.getId().equals(newItem.getId());
48+
}
49+
50+
@Override
51+
public boolean areContentsTheSame(DocumentSnapshot oldItem, DocumentSnapshot newItem) {
52+
T oldModel = mParser.parseSnapshot(oldItem);
53+
T newModel = mParser.parseSnapshot(newItem);
54+
55+
return oldModel.equals(newModel);
56+
}
57+
}
58+
59+
public FirestorePagingAdapter(@NonNull FirestorePagingOptions<T> options) {
60+
super(new DiffCallback<>(options.getParser()));
61+
62+
mParser = options.getParser();
63+
mData = options.getData();
64+
65+
// TODO: Lifecycle owner
66+
}
67+
68+
// TODO: Unify method names with other adapters
69+
public void startListening() {
70+
mData.observeForever(mObserver);
71+
}
72+
73+
public void stopListening() {
74+
mData.removeObserver(mObserver);
75+
}
76+
77+
@NonNull
78+
@Override
79+
public abstract VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType);
80+
81+
@Override
82+
public void onBindViewHolder(@NonNull VH holder, int position) {
83+
DocumentSnapshot snapshot = getItem(position);
84+
onBindViewHolder(holder, position, mParser.parseSnapshot(snapshot));
85+
}
86+
87+
// TODO: Check that this is the right visibility
88+
protected abstract void onBindViewHolder(@NonNull VH holder, int position, T model);
89+
90+
private void onListChanged(@NonNull PagedList<DocumentSnapshot> snapshots) {
91+
submitList(snapshots);
92+
}
93+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package com.firebase.ui.firestore.paging;
2+
3+
import android.arch.lifecycle.LifecycleOwner;
4+
import android.arch.lifecycle.LiveData;
5+
import android.arch.paging.LivePagedListBuilder;
6+
import android.arch.paging.PagedList;
7+
import android.support.annotation.NonNull;
8+
import android.support.annotation.Nullable;
9+
10+
import com.firebase.ui.firestore.ClassSnapshotParser;
11+
import com.firebase.ui.firestore.SnapshotParser;
12+
import com.google.firebase.firestore.DocumentSnapshot;
13+
import com.google.firebase.firestore.Query;
14+
15+
/**
16+
* TODO: Document
17+
*/
18+
public class FirestorePagingOptions<T> {
19+
20+
// TODO: Default config
21+
22+
private final LiveData<PagedList<DocumentSnapshot>> mData;
23+
private final SnapshotParser<T> mParser;
24+
private final LifecycleOwner mOwner;
25+
26+
private FirestorePagingOptions(@NonNull LiveData<PagedList<DocumentSnapshot>> data,
27+
@NonNull SnapshotParser<T> parser,
28+
@Nullable LifecycleOwner owner) {
29+
mData = data;
30+
mParser = parser;
31+
mOwner = owner;
32+
}
33+
34+
@NonNull
35+
public LiveData<PagedList<DocumentSnapshot>> getData() {
36+
return mData;
37+
}
38+
39+
@NonNull
40+
public SnapshotParser<T> getParser() {
41+
return mParser;
42+
}
43+
44+
@Nullable
45+
public LifecycleOwner getOwner() {
46+
return mOwner;
47+
}
48+
49+
public static class Builder<T> {
50+
51+
private LiveData<PagedList<DocumentSnapshot>> mData;
52+
private SnapshotParser<T> mParser;
53+
private LifecycleOwner mOwner;
54+
55+
@NonNull
56+
public Builder<T> setQuery(@NonNull Query query,
57+
@NonNull PagedList.Config config,
58+
@NonNull Class<T> modelClass) {
59+
return setQuery(query, config, new ClassSnapshotParser<T>(modelClass));
60+
}
61+
62+
@NonNull
63+
public Builder<T> setQuery(@NonNull Query query,
64+
@NonNull PagedList.Config config,
65+
@NonNull SnapshotParser<T> parser) {
66+
67+
// Build paged list
68+
mData = new LivePagedListBuilder<>(
69+
FirestoreDataSource.newFactory(query),
70+
config).build();
71+
72+
mParser = parser;
73+
return this;
74+
}
75+
76+
@NonNull
77+
public Builder<T> setOwner(@NonNull LifecycleOwner owner) {
78+
mOwner = owner;
79+
return this;
80+
}
81+
82+
public FirestorePagingOptions<T> build() {
83+
return new FirestorePagingOptions<>(mData, mParser, mOwner);
84+
}
85+
86+
}
87+
88+
}

firestore/src/main/java/com/firebase/ui/firestore/paging/PageKey.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@
66
import com.google.firebase.firestore.Query;
77

88
/**
9-
* Created by samstern on 3/15/18.
9+
* TODO: Document.
1010
*/
11-
1211
public class PageKey {
1312

1413
private final DocumentSnapshot mStartAfter;

0 commit comments

Comments
 (0)