Move session restore prompt from message level to conversation level.

This commit is contained in:
Mikunj
2019-12-06 13:00:08 +11:00
parent 0caeb3a109
commit 97ffea040f
20 changed files with 232 additions and 124 deletions

View File

@@ -139,6 +139,7 @@ import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
import org.thoughtcrime.securesms.database.MmsSmsColumns.Types;
import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.thoughtcrime.securesms.database.RecipientDatabase.RegisteredState;
import org.thoughtcrime.securesms.database.SmsDatabase;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.database.identity.IdentityRecordList;
import org.thoughtcrime.securesms.database.model.MessageRecord;
@@ -154,7 +155,6 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.ConversationUpdateItemViewDelegate;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.loki.LokiAPIUtilities;
import org.thoughtcrime.securesms.loki.LokiThreadDatabase;
@@ -163,6 +163,7 @@ import org.thoughtcrime.securesms.loki.LokiThreadDatabaseDelegate;
import org.thoughtcrime.securesms.loki.LokiUserDatabase;
import org.thoughtcrime.securesms.loki.MentionCandidateSelectionView;
import org.thoughtcrime.securesms.loki.MultiDeviceUtilities;
import org.thoughtcrime.securesms.loki.SessionRestoreBannerView;
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.mediasend.MediaSendActivity;
import org.thoughtcrime.securesms.mms.AttachmentManager;
@@ -242,6 +243,7 @@ import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@@ -249,7 +251,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import kotlin.Unit;
import network.loki.messenger.R;
import static nl.komponents.kovenant.KovenantApi.task;
import static org.thoughtcrime.securesms.TransportOption.Type;
import static org.thoughtcrime.securesms.database.GroupDatabase.GroupRecord;
import static org.whispersystems.libsignal.SessionCipher.SESSION_LOCK;
@@ -273,8 +274,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
ConversationSearchBottomBar.EventListener,
StickerKeyboardProvider.StickerEventListener,
LokiThreadDatabaseDelegate,
FriendRequestViewDelegate,
ConversationUpdateItemViewDelegate
FriendRequestViewDelegate
{
private static final String TAG = ConversationActivity.class.getSimpleName();
@@ -358,6 +358,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
// Multi Device
private boolean isFriendsWithAnyDevice = false;
// Restoration
protected Stub<SessionRestoreBannerView> sessionRestoreBannerView;
@Override
protected void onPreCreate() {
dynamicTheme.onCreate(this);
@@ -378,7 +381,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
fragment = initFragment(R.id.fragment_content, new ConversationFragment(), dynamicLanguage.getCurrentLocale());
fragment.friendRequestViewDelegate = this;
fragment.conversationUpdateItemViewDelegate = this;
initializeReceivers();
initializeActionBar();
@@ -1492,6 +1494,16 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
}
protected void updateSessionRestoreBanner() {
Set<String> devices = DatabaseFactory.getLokiThreadDatabase(this).getSessionRestoreDevices(threadId);
SessionRestoreBannerView view = sessionRestoreBannerView.get();
if (devices.size() > 0) {
view.show();
} else {
view.hide();
}
}
private void updateDefaultSubscriptionId(Optional<Integer> defaultSubscriptionId) {
Log.i(TAG, "updateDefaultSubscriptionId(" + defaultSubscriptionId.orNull() + ")");
sendButton.setDefaultSubscriptionId(defaultSubscriptionId);
@@ -1588,6 +1600,18 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
inputPanel = ViewUtil.findById(this, R.id.bottom_panel);
searchNav = ViewUtil.findById(this, R.id.conversation_search_nav);
mentionCandidateSelectionView = ViewUtil.findById(this, R.id.userSelectionView);
sessionRestoreBannerView = ViewUtil.findStubById(this, R.id.session_restore_banner_stub);
sessionRestoreBannerView.get().setRecipient(recipient);
sessionRestoreBannerView.get().setOnRestore(() -> {
this.restoreSession();
return Unit.INSTANCE;
});
sessionRestoreBannerView.get().setOnDismiss(() -> {
// TODO: Maybe silence for x minutes?
// TODO: Remove devices?
sessionRestoreBannerView.get().hide();
return Unit.INSTANCE;
});
ImageButton quickCameraToggle = ViewUtil.findById(this, R.id.quick_camera_toggle);
ImageButton inlineAttachmentButton = ViewUtil.findById(this, R.id.inline_attachment_button);
@@ -2206,6 +2230,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
this.updateInputPanel();
}
@Override
public void handleSessionRestoreDevicesChanged(long threadId) {
if (threadId == this.threadId) {
updateSessionRestoreBanner();
}
}
private void updateInputPanel() {
/*
isFriendsWithAnyDevice caches whether we are friends with any of the other users device.
@@ -3083,14 +3114,19 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
// endregion
@Override
public void updateItemButtonPressed(@NonNull MessageRecord messageRecord) {
public void restoreSession() {
// Loki - User clicked restore session
Recipient recipient = messageRecord.getRecipient();
if (!recipient.isGroupRecipient() && messageRecord.isNoRemoteSession() && !messageRecord.isLokiSessionRestoreSent()) {
MessageSender.sendRestoreSessionMessage(this, recipient.getAddress().serialize());
DatabaseFactory.getSmsDatabase(this).markAsLokiSessionRestoreSent(messageRecord.id);
TextSecurePreferences.setShowingSessionRestorePrompt(this, messageRecord.getIndividualRecipient().getAddress().serialize(), false);
if (!recipient.isGroupRecipient()) {
LokiThreadDatabase lokiThreadDatabase = DatabaseFactory.getLokiThreadDatabase(this);
SmsDatabase database = DatabaseFactory.getSmsDatabase(this);
Set<String> devices = lokiThreadDatabase.getSessionRestoreDevices(threadId);
for (String device : devices) { MessageSender.sendRestoreSessionMessage(this, device); }
long messageId = database.insertMessageOutbox(threadId, new OutgoingTextMessage(recipient,"", 0, 0), false, System.currentTimeMillis(), null);
if (messageId > -1) {
database.markAsLokiSessionRestoreSent(messageId);
}
lokiThreadDatabase.removeAllSessionRestoreDevices(threadId);
updateSessionRestoreBanner();
}
}
}

View File

@@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.database.MmsSmsDatabase;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.ConversationUpdateItemViewDelegate;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.mms.SlideDeck;
@@ -109,7 +108,6 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
private String searchQuery;
public FriendRequestViewDelegate friendRequestViewDelegate; // Loki
public ConversationUpdateItemViewDelegate conversationUpdateItemViewDelegate;
protected static class ViewHolder extends RecyclerView.ViewHolder {
public <V extends View & BindableConversationItem> ViewHolder(final @NonNull V itemView) {
@@ -206,9 +204,8 @@ public class ConversationAdapter <V extends View & BindableConversationItem>
BindableConversationItem conversationItem = viewHolder.getView();
if (conversationItem instanceof ConversationItem) {
((ConversationItem)conversationItem).friendRequestViewDelegate = this.friendRequestViewDelegate;
} else if (conversationItem instanceof ConversationUpdateItem) {
((ConversationUpdateItem)conversationItem).delegate = this.conversationUpdateItemViewDelegate;
}
conversationItem.bind(messageRecord,
Optional.fromNullable(previousRecord),
Optional.fromNullable(nextRecord),

View File

@@ -79,7 +79,6 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.ConversationUpdateItemViewDelegate;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.longmessage.LongMessageActivity;
import org.thoughtcrime.securesms.mediasend.Media;
@@ -153,7 +152,6 @@ public class ConversationFragment extends Fragment
private View scrollToBottomButton;
private TextView scrollDateHeader;
public FriendRequestViewDelegate friendRequestViewDelegate; // Loki
public ConversationUpdateItemViewDelegate conversationUpdateItemViewDelegate;
@Override
public void onCreate(Bundle icicle) {
@@ -362,8 +360,7 @@ public class ConversationFragment extends Fragment
if (messageRecord.isGroupAction() || messageRecord.isCallLog() ||
messageRecord.isJoined() || messageRecord.isExpirationTimerUpdate() ||
messageRecord.isEndSession() || messageRecord.isIdentityUpdate() ||
messageRecord.isIdentityVerified() || messageRecord.isIdentityDefault() ||
messageRecord.isNoRemoteSession() || messageRecord.isLokiSessionRestoreSent())
messageRecord.isIdentityVerified() || messageRecord.isIdentityDefault() || messageRecord.isLokiSessionRestoreSent())
{
actionMessage = true;
}
@@ -708,7 +705,6 @@ public class ConversationFragment extends Fragment
return;
}
adapter.friendRequestViewDelegate = this.friendRequestViewDelegate;
adapter.conversationUpdateItemViewDelegate = this.conversationUpdateItemViewDelegate;
if (cursor.getCount() >= PARTIAL_CONVERSATION_LIMIT && loader.hasLimit()) {
adapter.setFooterView(topLoadMoreView);

View File

@@ -87,7 +87,6 @@ import org.thoughtcrime.securesms.jobs.SmsSendJob;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.ConversationUpdateItemViewDelegate;
import org.thoughtcrime.securesms.loki.FriendRequestView;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.loki.LokiMessageDatabase;

View File

@@ -9,7 +9,6 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -22,7 +21,6 @@ import org.thoughtcrime.securesms.database.IdentityDatabase;
import org.thoughtcrime.securesms.database.IdentityDatabase.IdentityRecord;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.ConversationUpdateItemViewDelegate;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientModifiedListener;
@@ -49,13 +47,10 @@ public class ConversationUpdateItem extends LinearLayout
private TextView title;
private TextView body;
private TextView date;
private Button button;
private Recipient sender;
private MessageRecord messageRecord;
private Locale locale;
public ConversationUpdateItemViewDelegate delegate;
public ConversationUpdateItem(Context context) {
super(context);
}
@@ -72,12 +67,6 @@ public class ConversationUpdateItem extends LinearLayout
this.title = findViewById(R.id.conversation_update_title);
this.body = findViewById(R.id.conversation_update_body);
this.date = findViewById(R.id.conversation_update_date);
this.button = findViewById(R.id.conversation_update_button);
this.button.setOnClickListener(view -> {
if (delegate != null && messageRecord != null) {
delegate.updateItemButtonPressed(messageRecord);
}
});
this.setOnClickListener(new InternalClickListener(null));
}
@@ -123,8 +112,7 @@ public class ConversationUpdateItem extends LinearLayout
else if (messageRecord.isIdentityUpdate()) setIdentityRecord(messageRecord);
else if (messageRecord.isIdentityVerified() ||
messageRecord.isIdentityDefault()) setIdentityVerifyUpdate(messageRecord);
else if (messageRecord.isNoRemoteSession() ||
messageRecord.isLokiSessionRestoreSent()) setTextMessageRecord(messageRecord);
else if (messageRecord.isLokiSessionRestoreSent()) setTextMessageRecord(messageRecord);
else throw new AssertionError("Neither group nor log nor joined.");
if (batchSelected.contains(messageRecord)) setSelected(true);
@@ -217,12 +205,6 @@ public class ConversationUpdateItem extends LinearLayout
private void setTextMessageRecord(MessageRecord messageRecord) {
body.setText(messageRecord.getDisplayBody(getContext()));
if (messageRecord.isNoRemoteSession() && !messageRecord.isLokiSessionRestoreSent()) {
button.setVisibility(VISIBLE);
button.setText(R.string.MessageRecord_session_restore_button_title);
} else {
button.setVisibility(GONE);
}
icon.setVisibility(GONE);
title.setVisibility(GONE);