Use new BriarRecyclerView in ConversationView

This now handles progress bar and empty view itself.
With this commit, it also scrolls down on layout changes like when
keyboard is opened.
This commit is contained in:
Torsten Grote
2015-12-31 12:16:54 -02:00
parent b1f2f7d120
commit a4437a729a
3 changed files with 52 additions and 90 deletions

View File

@@ -1,45 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
<org.briarproject.android.util.BriarRecyclerView
android:id="@+id/conversationView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scrollbars="vertical"/>
android:layout_weight="1"/>
<ProgressBar
android:id="@+id/listLoadingProgressBar"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center"
android:gravity="center"
android:layout_weight="1"
android:indeterminate="true"
android:visibility="gone"/>
<TextView
android:id="@+id/emptyView"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_gravity="center"
android:gravity="center"
android:padding="@dimen/margin_large"
android:textSize="@dimen/text_size_large"
android:text="@string/no_private_messages"
android:visibility="gone"/>
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/horizontal_border"/>
<View style="@style/Divider.Horizontal"/>
<LinearLayout
android:orientation="horizontal"

View File

@@ -3,26 +3,22 @@ package org.briarproject.android.contact;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import org.briarproject.R;
import org.briarproject.android.BriarActivity;
import org.briarproject.android.util.BriarRecyclerView;
import org.briarproject.api.android.AndroidNotificationManager;
import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId;
@@ -68,8 +64,6 @@ import java.util.logging.Logger;
import javax.inject.Inject;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static android.widget.Toast.LENGTH_SHORT;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
@@ -88,10 +82,8 @@ public class ConversationActivity extends BriarActivity
@Inject private ConnectionRegistry connectionRegistry;
@Inject @CryptoExecutor private Executor cryptoExecutor;
private Map<MessageId, byte[]> bodyCache = new HashMap<MessageId, byte[]>();
private TextView empty = null;
private ProgressBar loading = null;
private ConversationAdapter adapter = null;
private RecyclerView list = null;
private BriarRecyclerView list = null;
private EditText content = null;
private ImageButton sendButton = null;
@@ -121,37 +113,12 @@ public class ConversationActivity extends BriarActivity
setResult(RESULT_OK, data);
setContentView(R.layout.activity_conversation);
ViewGroup layout = (ViewGroup) findViewById(R.id.layout);
empty = (TextView) findViewById(R.id.emptyView);
empty.setVisibility(GONE);
// Show a progress bar while the list is loading
loading = (ProgressBar) findViewById(R.id.listLoadingProgressBar);
loading.setVisibility(VISIBLE);
adapter = new ConversationAdapter(this);
list = (RecyclerView) findViewById(R.id.conversationView);
list = (BriarRecyclerView) findViewById(R.id.conversationView);
list.setLayoutManager(new LinearLayoutManager(this));
list.setAdapter(adapter);
list.setVisibility(GONE);
// scroll down when opening keyboard
if (Build.VERSION.SDK_INT >= 11) {
list.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v,
int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (bottom < oldBottom) {
list.postDelayed(new Runnable() {
@Override
public void run() {
list.scrollToPosition(
adapter.getItemCount() - 1);
}
}, 100);
}
}
});
}
list.setEmptyText(getString(R.string.no_private_messages));
content = (EditText) findViewById(R.id.contentView);
sendButton = (ImageButton) findViewById(R.id.sendButton);
@@ -167,6 +134,23 @@ public class ConversationActivity extends BriarActivity
loadHeaders();
}
@Override
public void onPause() {
super.onPause();
eventBus.removeListener(this);
if (isFinishing()) markMessagesRead();
}
@Override
protected void onActivityResult(int request, int result, Intent data) {
super.onActivityResult(request, result, data);
if (request == REQUEST_READ && result == RESULT_PREV_NEXT) {
int position = data.getIntExtra("briar.POSITION", -1);
if (position >= 0 && position < adapter.getItemCount())
displayMessage(position);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
@@ -264,11 +248,8 @@ public class ConversationActivity extends BriarActivity
final Collection<PrivateMessageHeader> headers) {
runOnUiThread(new Runnable() {
public void run() {
loading.setVisibility(GONE);
sendButton.setEnabled(true);
if (!headers.isEmpty()) {
list.setVisibility(VISIBLE);
empty.setVisibility(GONE);
for (PrivateMessageHeader h : headers) {
ConversationItem item = new ConversationItem(h);
byte[] body = bodyCache.get(h.getId());
@@ -279,8 +260,9 @@ public class ConversationActivity extends BriarActivity
// Scroll to the bottom
list.scrollToPosition(adapter.getItemCount() - 1);
} else {
empty.setVisibility(VISIBLE);
list.setVisibility(GONE);
// we have no messages,
// so let the list know to hide progress bar
list.showData();
}
}
});
@@ -329,23 +311,6 @@ public class ConversationActivity extends BriarActivity
});
}
@Override
protected void onActivityResult(int request, int result, Intent data) {
super.onActivityResult(request, result, data);
if (request == REQUEST_READ && result == RESULT_PREV_NEXT) {
int position = data.getIntExtra("briar.POSITION", -1);
if (position >= 0 && position < adapter.getItemCount())
displayMessage(position);
}
}
@Override
public void onPause() {
super.onPause();
eventBus.removeListener(this);
if (isFinishing()) markMessagesRead();
}
private void markMessagesRead() {
notificationManager.clearPrivateMessageNotification(contactId);
List<MessageId> unread = new ArrayList<MessageId>();

View File

@@ -1,6 +1,7 @@
package org.briarproject.android.util;
import android.content.Context;
import android.os.Build;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.LayoutInflater;
@@ -51,6 +52,26 @@ public class BriarRecyclerView extends FrameLayout {
showProgressBar();
// scroll down when opening keyboard
if (Build.VERSION.SDK_INT >= 11) {
recyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v,
int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (bottom < oldBottom) {
recyclerView.postDelayed(new Runnable() {
@Override
public void run() {
scrollToPosition(
recyclerView.getAdapter().getItemCount() - 1);
}
}, 100);
}
}
});
}
emptyObserver = new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
@@ -112,6 +133,10 @@ public class BriarRecyclerView extends FrameLayout {
}
}
public void scrollToPosition(int position) {
recyclerView.scrollToPosition(position);
}
public RecyclerView getRecyclerView() {
return recyclerView;
}