From a4437a729a4e29b6a23275430285a3b83c8ce0ce Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 31 Dec 2015 12:16:54 -0200 Subject: [PATCH] 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. --- .../res/layout/activity_conversation.xml | 34 +------- .../android/contact/ConversationActivity.java | 83 ++++++------------- .../android/util/BriarRecyclerView.java | 25 ++++++ 3 files changed, 52 insertions(+), 90 deletions(-) diff --git a/briar-android/res/layout/activity_conversation.xml b/briar-android/res/layout/activity_conversation.xml index 673dd14f9..88066e995 100644 --- a/briar-android/res/layout/activity_conversation.xml +++ b/briar-android/res/layout/activity_conversation.xml @@ -1,45 +1,17 @@ - + android:layout_weight="1"/> - - - - - + bodyCache = new HashMap(); - 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 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 unread = new ArrayList(); diff --git a/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java b/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java index 4e50c1d5d..89c213502 100644 --- a/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java +++ b/briar-android/src/org/briarproject/android/util/BriarRecyclerView.java @@ -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; }