Skip to content

Cleanup RTDB Paging demo for consistency #1607

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
<!-- Realtime database paging demo -->
<activity
android:name=".database.realtime.FirebaseDbPagingActivity"
android:label="@string/title_paging_database_activity" />
android:label="@string/title_realtime_database_paging_activity" />

<activity
android:name=".database.realtime.RealtimeDbChatIndexActivity"
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/firebase/uidemo/ChooserActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ private static class ActivityChooserAdapter
R.string.title_firestore_activity,
R.string.title_firestore_paging_activity,
R.string.title_realtime_database_activity,
R.string.title_paging_database_activity,
R.string.title_realtime_database_paging_activity,
R.string.title_storage_activity
};

Expand All @@ -92,7 +92,7 @@ private static class ActivityChooserAdapter
R.string.desc_firestore,
R.string.desc_firestore_paging,
R.string.desc_realtime_database,
R.string.desc_paging_database,
R.string.desc_realtime_database_paging,
R.string.desc_storage
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ protected void onLoadingStateChanged(@NonNull LoadingState state) {

@Override
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
getMenuInflater().inflate(R.menu.menu_firestore_paging, menu);
getMenuInflater().inflate(R.menu.menu_paging, menu);
return true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
Expand All @@ -23,6 +25,8 @@
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;

import java.util.Locale;

import butterknife.BindView;
import butterknife.ButterKnife;

Expand All @@ -36,6 +40,7 @@ public class FirebaseDbPagingActivity extends AppCompatActivity {
@BindView(R.id.swipe_refresh_layout)
SwipeRefreshLayout mSwipeRefreshLayout;

private FirebaseDatabase mDatabase;
private Query mQuery;

@Override
Expand All @@ -44,7 +49,8 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
setContentView(R.layout.activity_database_paging);
ButterKnife.bind(this);

mQuery = FirebaseDatabase.getInstance().getReference().child("posts");
mDatabase = FirebaseDatabase.getInstance();
mQuery = mDatabase.getReference().child("items");

setUpAdapter();
}
Expand All @@ -59,27 +65,27 @@ private void setUpAdapter() {
.build();

//Initialize Firebase Paging Options
DatabasePagingOptions<Post> options = new DatabasePagingOptions.Builder<Post>()
DatabasePagingOptions<Item> options = new DatabasePagingOptions.Builder<Item>()
.setLifecycleOwner(this)
.setQuery(mQuery, config, Post.class)
.setQuery(mQuery, config, Item.class)
.build();

//Initializing Adapter
final FirebaseRecyclerPagingAdapter<Post, PostViewHolder> mAdapter =
new FirebaseRecyclerPagingAdapter<Post, PostViewHolder>(options) {
final FirebaseRecyclerPagingAdapter<Item, ItemViewHolder> mAdapter =
new FirebaseRecyclerPagingAdapter<Item, ItemViewHolder>(options) {
@NonNull
@Override
public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_post, parent, false);
return new PostViewHolder(view);
.inflate(R.layout.item_item, parent, false);
return new ItemViewHolder(view);
}

@Override
protected void onBindViewHolder(@NonNull PostViewHolder holder,
protected void onBindViewHolder(@NonNull ItemViewHolder holder,
int position,
@NonNull Post model) {
@NonNull Item model) {
holder.bind(model);
}

Expand All @@ -90,26 +96,23 @@ protected void onLoadingStateChanged(@NonNull LoadingState state) {
case LOADING_MORE:
mSwipeRefreshLayout.setRefreshing(true);
break;

case LOADED:
mSwipeRefreshLayout.setRefreshing(false);
break;

case FINISHED:
mSwipeRefreshLayout.setRefreshing(false);
Toast.makeText(getApplicationContext(), getString(R.string.paging_finished_message), Toast.LENGTH_SHORT).show();
showToast(getString(R.string.paging_finished_message));
break;

case ERROR:
retry();
showToast(getString(R.string.unknown_error));
break;
}
}

@Override
protected void onError(DatabaseError databaseError) {
mSwipeRefreshLayout.setRefreshing(false);
Log.e(TAG, databaseError.getMessage());
Log.e(TAG, databaseError.getDetails(), databaseError.toException());
}
};

Expand All @@ -126,35 +129,71 @@ public void onRefresh() {
});
}

public static class Post {

@Nullable public String title;
@Nullable public String body;
@Override
public boolean onCreateOptionsMenu(@NonNull Menu menu) {
getMenuInflater().inflate(R.menu.menu_paging, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.item_add_data) {
showToast("Adding data...");
createItems();
return true;
}
return super.onOptionsItemSelected(item);
}

@NonNull
private void createItems() {
for (int i = 0; i < 250; i++) {
String title = "Item " + i;

public Post(){}
String id = String.format(Locale.getDefault(), "item_%03d", i);
Item item = new Item(title, i);

public Post(@Nullable String title, @Nullable String body) {
this.title = title;
this.body = body;
mDatabase.getReference("items").child(id).setValue(item);
}
}

public static class PostViewHolder extends RecyclerView.ViewHolder {
private void showToast(@NonNull String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}


public static class Item {

@Nullable
public String text;
public int value;

public Item(){}

public Item(@Nullable String text, int value) {
this.text = text;
this.value = value;
}
}

public static class ItemViewHolder extends RecyclerView.ViewHolder {


@BindView(R.id.textViewTitle)
TextView mTitleView;
@BindView(R.id.item_text)
TextView mTextView;

@BindView(R.id.textViewBody)
TextView mBodyView;
@BindView(R.id.item_value)
TextView mValueView;

PostViewHolder(@NonNull View itemView) {
ItemViewHolder(@NonNull View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}

void bind(@NonNull Post post) {
mTitleView.setText(post.title);
mBodyView.setText(post.body);
void bind(@NonNull Item item) {
mTextView.setText(item.text);
mValueView.setText(String.valueOf(item.value));
}
}

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/layout/activity_database_paging.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@
android:paddingLeft="16dp"
android:paddingTop="8dp"
android:paddingRight="16dp"
tools:listitem="@layout/item_post" />
tools:listitem="@layout/item_item" />

</android.support.v4.widget.SwipeRefreshLayout>
47 changes: 0 additions & 47 deletions app/src/main/res/layout/item_post.xml

This file was deleted.

10 changes: 4 additions & 6 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,19 @@
<string name="app_name">Firebase UI</string>

<!-- Chooser -->
<string name="title_auth_activity">Auth UI demo</string>
<string name="title_auth_activity">Auth UI Demo</string>
<string name="title_firestore_activity">Cloud Firestore Demo</string>
<string name="title_firestore_paging_activity">Cloud Firestore Paging Demo</string>
<string name="title_realtime_database_activity">Real-time database demo</string>
<string name="title_paging_database_activity">Paging database demo</string>
<string name="title_realtime_database_activity">Realtime Database Demo</string>
<string name="title_realtime_database_paging_activity">Realtime Database Paging Demo</string>
<string name="title_storage_activity">Storage Image Demo</string>

<string name="desc_auth">Demonstrates the Firebase Auth UI flow, with customization options.</string>
<string name="desc_anonymous_upgrade">Demonstrates upgrading an anonymous account using FirebaseUI.</string>
<string name="desc_firestore">Demonstrates using a FirestoreRecyclerAdapter to load data from Cloud Firestore into a RecyclerView for a basic chat app.</string>
<string name="desc_firestore_paging">Demonstrates using a FirestorePagingAdapter to load/infinite scroll paged data from Cloud Firestore.</string>
<string name="desc_realtime_database">Demonstrates using a FirebaseRecyclerAdapter to load data from Firebase Database into a RecyclerView for a basic chat app.</string>
<string name="desc_paging_database">Demonstrates using a FirebaseRecyclerPagingAdapter to load/infinite scroll paged data from Firebase Database.</string>
<string name="desc_realtime_database_paging">Demonstrates using a FirebaseRecyclerPagingAdapter to load/infinite scroll paged data from Firebase Realtime Database.</string>
<string name="desc_storage">Demonstrates displaying an image from Cloud Storage using Glide.</string>

<!-- Auth UI -->
Expand Down Expand Up @@ -120,8 +120,6 @@
<string name="start_chatting">No messages. Start chatting at the bottom!</string>
<string name="signing_in">Signing in…</string>
<string name="signed_in">Signed In</string>
<string name="post_text_title">Title</string>
<string name="post_text_body">Body</string>
<string name="anonymous_auth_failed_msg">
Anonymous authentication failed, various components of the demo will not work.
Make sure your device is online and that Anonymous Auth is configured in your Firebase project
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ public class FirebaseDataSource extends PageKeyedDataSource<String, DataSnapshot
private final MutableLiveData<LoadingState> mLoadingState = new MutableLiveData<>();
private final MutableLiveData<DatabaseError> mError = new MutableLiveData<>();

private static final String STATUS_DATABASE_NOT_FOUND = "DATABASE NOT FOUND";
private static final String MESSAGE_DATABASE_NOT_FOUND = "Database not found at given child path !";
private static final String DETAILS_DATABASE_NOT_FOUND = "Database Children Not Found in the specified child path. Please specify correct child path/reference";
private static final String STATUS_DATABASE_NOT_FOUND = "DATA_NOT_FOUND";
private static final String MESSAGE_DATABASE_NOT_FOUND = "Data not found at given child path!";
private static final String DETAILS_DATABASE_NOT_FOUND = "No data was returned for the given query: ";

private Runnable mRetryRunnable;

Expand Down Expand Up @@ -214,10 +214,11 @@ private String getLastPageKey(@NonNull List<DataSnapshot> data) {
}

private void setDatabaseNotFoundError(){
String details = DETAILS_DATABASE_NOT_FOUND + mQuery.toString();
mError.postValue(DatabaseError.fromStatus(
STATUS_DATABASE_NOT_FOUND,
DETAILS_DATABASE_NOT_FOUND,
MESSAGE_DATABASE_NOT_FOUND));
MESSAGE_DATABASE_NOT_FOUND,
details));

mLoadingState.postValue(LoadingState.ERROR);
}
Expand Down