show (still empty) items in the conversation list

This commit is contained in:
B. Petersen
2018-09-08 02:01:07 +02:00
parent 57716f48d1
commit 7f831a7d6a
3 changed files with 112 additions and 53 deletions
@@ -25,15 +25,13 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.database.model.ThreadRecord;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.util.Conversions;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcChatlist;
import org.thoughtcrime.securesms.connect.ApplicationDcContext;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.mms.GlideRequests;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Locale;
@@ -44,18 +42,18 @@ import java.util.Set;
*
* @author Moxie Marlinspike
*/
class ConversationListAdapter extends CursorRecyclerViewAdapter<ConversationListAdapter.ViewHolder> {
class ConversationListAdapter extends RecyclerView.Adapter {
private static final int MESSAGE_TYPE_SWITCH_ARCHIVE = 1;
private static final int MESSAGE_TYPE_THREAD = 2;
private static final int MESSAGE_TYPE_INBOX_ZERO = 3;
private final @NonNull ThreadDatabase threadDatabase;
private final @NonNull GlideRequests glideRequests;
private final @NonNull Locale locale;
private final @NonNull LayoutInflater inflater;
private final @Nullable ItemClickListener clickListener;
private final @NonNull MessageDigest digest;
private final @NonNull ApplicationDcContext dcContext;
private @NonNull DcChatlist dcChatlist;
private final @NonNull GlideRequests glideRequests;
private final @NonNull Locale locale;
private final @NonNull LayoutInflater inflater;
private final @Nullable ItemClickListener clickListener;
private final Set<Long> batchSet = Collections.synchronizedSet(new HashSet<Long>());
private boolean batchMode = false;
@@ -72,10 +70,13 @@ class ConversationListAdapter extends CursorRecyclerViewAdapter<ConversationList
}
@Override
public long getItemId(@NonNull Cursor cursor) {
ThreadRecord record = getThreadRecord(cursor);
public int getItemCount() {
return dcChatlist.getCnt();
}
return Conversions.byteArrayToLong(digest.digest(record.getRecipient().getAddress().serialize().getBytes()));
@Override
public long getItemId(int i) {
return dcChatlist.getChatId(i);
}
ConversationListAdapter(@NonNull Context context,
@@ -84,22 +85,18 @@ class ConversationListAdapter extends CursorRecyclerViewAdapter<ConversationList
@Nullable Cursor cursor,
@Nullable ItemClickListener clickListener)
{
super(context, cursor);
try {
this.glideRequests = glideRequests;
this.threadDatabase = DatabaseFactory.getThreadDatabase(context);
this.locale = locale;
this.inflater = LayoutInflater.from(context);
this.clickListener = clickListener;
this.digest = MessageDigest.getInstance("SHA1");
setHasStableIds(true);
} catch (NoSuchAlgorithmException nsae) {
throw new AssertionError("SHA-1 missing");
}
super();
this.glideRequests = glideRequests;
this.dcContext = DcHelper.getContext(context);
this.dcChatlist = new DcChatlist(0);
this.locale = locale;
this.inflater = LayoutInflater.from(context);
this.clickListener = clickListener;
setHasStableIds(true);
}
@Override
public ViewHolder onCreateItemViewHolder(ViewGroup parent, int viewType) {
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == MESSAGE_TYPE_SWITCH_ARCHIVE) {
ConversationListItemAction action = (ConversationListItemAction) inflater.inflate(R.layout.conversation_list_item_action,
parent, false);
@@ -129,32 +126,25 @@ class ConversationListAdapter extends CursorRecyclerViewAdapter<ConversationList
}
@Override
public void onItemViewRecycled(ViewHolder holder) {
holder.getItem().unbind();
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
ViewHolder holder = (ViewHolder)viewHolder;
int chatId = dcChatlist.getChatId(i);
holder.getItem().bind(dcContext.getThreadRecord(chatId), glideRequests, locale, batchSet, batchMode);
}
@Override
public void onBindItemViewHolder(ViewHolder viewHolder, @NonNull Cursor cursor) {
viewHolder.getItem().bind(getThreadRecord(cursor), glideRequests, locale, batchSet, batchMode);
}
public int getItemViewType(int i) {
int chatId = dcChatlist.getChatId(i);
@Override
public int getItemViewType(@NonNull Cursor cursor) {
ThreadRecord threadRecord = getThreadRecord(cursor);
if (threadRecord.getDistributionType() == ThreadDatabase.DistributionTypes.ARCHIVE) {
if (chatId == DcChat.DC_CHAT_ID_ARCHIVED_LINK) {
return MESSAGE_TYPE_SWITCH_ARCHIVE;
} else if (threadRecord.getDistributionType() == ThreadDatabase.DistributionTypes.INBOX_ZERO) {
} else if(false) {
return MESSAGE_TYPE_INBOX_ZERO;
} else {
return MESSAGE_TYPE_THREAD;
}
}
private ThreadRecord getThreadRecord(@NonNull Cursor cursor) {
return threadDatabase.readerFor(cursor).getCurrent();
}
void toggleThreadInBatchSet(long threadId) {
if (batchSet.contains(threadId)) {
batchSet.remove(threadId);
@@ -178,9 +168,11 @@ class ConversationListAdapter extends CursorRecyclerViewAdapter<ConversationList
}
void selectAllThreads() {
for (int i = 0; i < getItemCount(); i++) {
long threadId = getThreadRecord(getCursorAtPositionOrThrow(i)).getThreadId();
if (threadId != -1) batchSet.add(threadId);
for (int i = 0; i < dcChatlist.getCnt(); i++) {
long threadId = dcChatlist.getChatId(i);
if (threadId > DcChat.DC_CHAT_ID_LAST_SPECIAL) {
batchSet.add(threadId);
}
}
this.notifyDataSetChanged();
}
@@ -190,4 +182,9 @@ class ConversationListAdapter extends CursorRecyclerViewAdapter<ConversationList
void onItemLongClick(ConversationListItem item);
void onSwitchToArchive();
}
}
void changeCursor(DcChatlist chatlist) {
dcChatlist = chatlist;
notifyDataSetChanged();
}
}
@@ -53,6 +53,8 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.b44t.messenger.DcChatlist;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@@ -70,6 +72,7 @@ import org.thoughtcrime.securesms.components.reminder.ServiceOutageReminder;
import org.thoughtcrime.securesms.components.reminder.ShareReminder;
import org.thoughtcrime.securesms.components.reminder.SystemSmsImportReminder;
import org.thoughtcrime.securesms.components.reminder.UnauthorizedReminder;
import org.thoughtcrime.securesms.connect.DcHelper;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
import org.thoughtcrime.securesms.database.loaders.ConversationListLoader;
@@ -339,12 +342,15 @@ public class ConversationListFragment extends Fragment
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) {
if ((cursor == null || cursor.getCount() <= 0) && TextUtils.isEmpty(queryFilter) && !archive) {
// TODO: loading should obviously not be done when loading is finished, however, it is fast enough, for now
DcChatlist chatlist = DcHelper.getContext(getContext()).getChatlist(0, null, 0);
if (chatlist.getCnt() <= 0 && TextUtils.isEmpty(queryFilter) && !archive) {
list.setVisibility(View.INVISIBLE);
emptyState.setVisibility(View.VISIBLE);
emptySearch.setVisibility(View.INVISIBLE);
fab.startPulse(3 * 1000);
} else if ((cursor == null || cursor.getCount() <= 0) && !TextUtils.isEmpty(queryFilter)) {
} else if (chatlist.getCnt() <= 0 && !TextUtils.isEmpty(queryFilter)) {
list.setVisibility(View.INVISIBLE);
emptyState.setVisibility(View.GONE);
emptySearch.setVisibility(View.VISIBLE);
@@ -356,7 +362,7 @@ public class ConversationListFragment extends Fragment
fab.stopPulse();
}
getListAdapter().changeCursor(cursor);
getListAdapter().changeCursor(chatlist);
}
@Override
@@ -17,16 +17,28 @@
package org.thoughtcrime.securesms.connect;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.os.PowerManager;
import android.support.annotation.NonNull;
import android.util.Log;
import android.widget.Toast;
import com.b44t.messenger.DcChat;
import com.b44t.messenger.DcContext;
import com.b44t.messenger.DcEventCenter;
import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.database.Address;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.database.model.ThreadRecord;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.libsignal.util.guava.Optional;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
@@ -78,6 +90,50 @@ public class ApplicationDcContext extends DcContext {
return Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
}
/***********************************************************************************************
* create objects compatible to the database model of Signal
**********************************************************************************************/
@NonNull
public ThreadRecord getThreadRecord(int chatId) { // adapted from ThreadDatabase.getCurrent()
DcChat chat = getChat(chatId);
int distributionType = chatId==DcChat.DC_CHAT_ID_ARCHIVED_LINK? ThreadDatabase.DistributionTypes.ARCHIVE : ThreadDatabase.DistributionTypes.CONVERSATION;
Address address = Address.UNKNOWN;//Address.fromSerialized(cursor.getString(cursor.getColumnIndexOrThrow(ThreadDatabase.ADDRESS)));
Optional<RecipientDatabase.RecipientSettings> settings;
Optional<GroupDatabase.GroupRecord> groupRecord;
if (distributionType != ThreadDatabase.DistributionTypes.ARCHIVE && distributionType != ThreadDatabase.DistributionTypes.INBOX_ZERO) {
settings = Optional.absent();//DatabaseFactory.getRecipientDatabase(context).getRecipientSettings(cursor);
groupRecord = Optional.absent();//DatabaseFactory.getGroupDatabase(context).getGroup(cursor);
} else {
settings = Optional.absent();
groupRecord = Optional.absent();
}
Recipient recipient = Recipient.from(context, address, settings, groupRecord, true);
String body = "body";
long date = 0;
long count = 1;
int unreadCount = 1;
long type = 0;//cursor.getLong(cursor.getColumnIndexOrThrow(ThreadDatabase.SNIPPET_TYPE));
boolean archived = chat.getArchived()!=0;
int status = 0;
int deliveryReceiptCount = 0;
int readReceiptCount = 0;
long expiresIn = 0;
long lastSeen = 0;
if (!TextSecurePreferences.isReadReceiptsEnabled(context)) {
readReceiptCount = 0;
}
return new ThreadRecord(context, body, null, recipient, date, count,
unreadCount, chatId, deliveryReceiptCount, status, type,
distributionType, archived, expiresIn, lastSeen, readReceiptCount);
}
/***********************************************************************************************
* Working Threads
**********************************************************************************************/