mirror of
https://github.com/oxen-io/session-android.git
synced 2025-05-08 02:26:52 +00:00
further clean up on session restoration
This commit is contained in:
parent
690687064f
commit
2f57090cfa
@ -136,7 +136,6 @@ import org.thoughtcrime.securesms.loki.activities.EditClosedGroupActivity;
|
|||||||
import org.thoughtcrime.securesms.loki.activities.HomeActivity;
|
import org.thoughtcrime.securesms.loki.activities.HomeActivity;
|
||||||
import org.thoughtcrime.securesms.loki.api.PublicChatInfoUpdateWorker;
|
import org.thoughtcrime.securesms.loki.api.PublicChatInfoUpdateWorker;
|
||||||
import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase;
|
import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase;
|
||||||
import org.thoughtcrime.securesms.loki.database.LokiThreadDatabaseDelegate;
|
|
||||||
import org.thoughtcrime.securesms.loki.database.LokiUserDatabase;
|
import org.thoughtcrime.securesms.loki.database.LokiUserDatabase;
|
||||||
import org.thoughtcrime.securesms.loki.protocol.ClosedGroupsProtocolV2;
|
import org.thoughtcrime.securesms.loki.protocol.ClosedGroupsProtocolV2;
|
||||||
import org.thoughtcrime.securesms.loki.utilities.GeneralUtilitiesKt;
|
import org.thoughtcrime.securesms.loki.utilities.GeneralUtilitiesKt;
|
||||||
@ -144,7 +143,6 @@ import org.thoughtcrime.securesms.loki.utilities.MentionManagerUtilities;
|
|||||||
import org.thoughtcrime.securesms.loki.utilities.OpenGroupUtilities;
|
import org.thoughtcrime.securesms.loki.utilities.OpenGroupUtilities;
|
||||||
import org.thoughtcrime.securesms.loki.views.MentionCandidateSelectionView;
|
import org.thoughtcrime.securesms.loki.views.MentionCandidateSelectionView;
|
||||||
import org.thoughtcrime.securesms.loki.views.ProfilePictureView;
|
import org.thoughtcrime.securesms.loki.views.ProfilePictureView;
|
||||||
import org.thoughtcrime.securesms.loki.views.SessionRestoreBannerView;
|
|
||||||
import org.thoughtcrime.securesms.mediasend.Media;
|
import org.thoughtcrime.securesms.mediasend.Media;
|
||||||
import org.thoughtcrime.securesms.mediasend.MediaSendActivity;
|
import org.thoughtcrime.securesms.mediasend.MediaSendActivity;
|
||||||
import org.thoughtcrime.securesms.mms.AttachmentManager;
|
import org.thoughtcrime.securesms.mms.AttachmentManager;
|
||||||
@ -228,8 +226,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
InputPanel.Listener,
|
InputPanel.Listener,
|
||||||
InputPanel.MediaListener,
|
InputPanel.MediaListener,
|
||||||
ComposeText.CursorPositionChangedListener,
|
ComposeText.CursorPositionChangedListener,
|
||||||
ConversationSearchBottomBar.EventListener,
|
ConversationSearchBottomBar.EventListener
|
||||||
LokiThreadDatabaseDelegate
|
|
||||||
{
|
{
|
||||||
private static final String TAG = ConversationActivity.class.getSimpleName();
|
private static final String TAG = ConversationActivity.class.getSimpleName();
|
||||||
|
|
||||||
@ -311,9 +308,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
private ArrayList<Mention> mentions = new ArrayList<>();
|
private ArrayList<Mention> mentions = new ArrayList<>();
|
||||||
private String oldText = "";
|
private String oldText = "";
|
||||||
|
|
||||||
// Restoration
|
|
||||||
protected SessionRestoreBannerView sessionRestoreBannerView;
|
|
||||||
|
|
||||||
private final PushCharacterCalculator characterCalculator = new PushCharacterCalculator();
|
private final PushCharacterCalculator characterCalculator = new PushCharacterCalculator();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -383,17 +377,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
sessionRestoreBannerView.setOnRestore(() -> {
|
|
||||||
updateSessionRestoreBanner();
|
|
||||||
return Unit.INSTANCE;
|
|
||||||
});
|
|
||||||
sessionRestoreBannerView.setOnDismiss(() -> {
|
|
||||||
// TODO: Maybe silence for x minutes?
|
|
||||||
DatabaseFactory.getLokiThreadDatabase(ConversationActivity.this).removeAllSessionRestoreDevices(threadId);
|
|
||||||
updateSessionRestoreBanner();
|
|
||||||
return Unit.INSTANCE;
|
|
||||||
});
|
|
||||||
|
|
||||||
MentionManagerUtilities.INSTANCE.populateUserPublicKeyCacheIfNeeded(threadId, this);
|
MentionManagerUtilities.INSTANCE.populateUserPublicKeyCacheIfNeeded(threadId, this);
|
||||||
|
|
||||||
PublicChat publicChat = DatabaseFactory.getLokiThreadDatabase(this).getPublicChat(threadId);
|
PublicChat publicChat = DatabaseFactory.getLokiThreadDatabase(this).getPublicChat(threadId);
|
||||||
@ -483,12 +466,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
ApplicationContext.getInstance(this).messageNotifier.setVisibleThread(threadId);
|
ApplicationContext.getInstance(this).messageNotifier.setVisibleThread(threadId);
|
||||||
markThreadAsRead();
|
markThreadAsRead();
|
||||||
|
|
||||||
DatabaseFactory.getLokiThreadDatabase(this).setDelegate(this);
|
|
||||||
|
|
||||||
inputPanel.setHint(getResources().getString(R.string.ConversationActivity_message));
|
inputPanel.setHint(getResources().getString(R.string.ConversationActivity_message));
|
||||||
|
|
||||||
updateSessionRestoreBanner();
|
|
||||||
|
|
||||||
Log.i(TAG, "onResume() Finished: " + (System.currentTimeMillis() - getIntent().getLongExtra(TIMING_EXTRA, 0)));
|
Log.i(TAG, "onResume() Finished: " + (System.currentTimeMillis() - getIntent().getLongExtra(TIMING_EXTRA, 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,13 +532,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
case PICK_AUDIO:
|
case PICK_AUDIO:
|
||||||
setMedia(data.getData(), MediaType.AUDIO);
|
setMedia(data.getData(), MediaType.AUDIO);
|
||||||
break;
|
break;
|
||||||
// case PICK_CONTACT:
|
|
||||||
// if (isSecureText && !isSmsForced()) {
|
|
||||||
//// openContactShareEditor(data.getData());
|
|
||||||
// } else {
|
|
||||||
// addAttachmentContactInfo(data.getData());
|
|
||||||
// }
|
|
||||||
// break;
|
|
||||||
case TAKE_PHOTO:
|
case TAKE_PHOTO:
|
||||||
if (attachmentManager.getCaptureUri() != null) {
|
if (attachmentManager.getCaptureUri() != null) {
|
||||||
setMedia(attachmentManager.getCaptureUri(), MediaType.IMAGE);
|
setMedia(attachmentManager.getCaptureUri(), MediaType.IMAGE);
|
||||||
@ -1322,16 +1294,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
return future;
|
return future;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateSessionRestoreBanner() {
|
|
||||||
Set<String> devices = DatabaseFactory.getLokiThreadDatabase(this).getSessionRestoreDevices(threadId);
|
|
||||||
if (devices.size() > 0) {
|
|
||||||
sessionRestoreBannerView.update(recipient);
|
|
||||||
sessionRestoreBannerView.show();
|
|
||||||
} else {
|
|
||||||
sessionRestoreBannerView.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeViews() {
|
private void initializeViews() {
|
||||||
profilePictureView = findViewById(R.id.profilePictureView);
|
profilePictureView = findViewById(R.id.profilePictureView);
|
||||||
titleTextView = findViewById(R.id.titleTextView);
|
titleTextView = findViewById(R.id.titleTextView);
|
||||||
@ -1350,7 +1312,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
searchNav = ViewUtil.findById(this, R.id.conversation_search_nav);
|
searchNav = ViewUtil.findById(this, R.id.conversation_search_nav);
|
||||||
mentionCandidateSelectionViewContainer = ViewUtil.findById(this, R.id.mentionCandidateSelectionViewContainer);
|
mentionCandidateSelectionViewContainer = ViewUtil.findById(this, R.id.mentionCandidateSelectionViewContainer);
|
||||||
mentionCandidateSelectionView = ViewUtil.findById(this, R.id.userSelectionView);
|
mentionCandidateSelectionView = ViewUtil.findById(this, R.id.userSelectionView);
|
||||||
sessionRestoreBannerView = ViewUtil.findById(this, R.id.sessionRestoreBannerView);
|
|
||||||
messageStatusProgressBar = ViewUtil.findById(this, R.id.messageStatusProgressBar);
|
messageStatusProgressBar = ViewUtil.findById(this, R.id.messageStatusProgressBar);
|
||||||
muteIndicatorImageView = ViewUtil.findById(this, R.id.muteIndicatorImageView);
|
muteIndicatorImageView = ViewUtil.findById(this, R.id.muteIndicatorImageView);
|
||||||
subtitleTextView = ViewUtil.findById(this, R.id.subtitleTextView);
|
subtitleTextView = ViewUtil.findById(this, R.id.subtitleTextView);
|
||||||
@ -1825,13 +1786,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
|||||||
updateLinkPreviewState();
|
updateLinkPreviewState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void handleSessionRestoreDevicesChanged(long threadID) {
|
|
||||||
if (threadID == this.threadId) {
|
|
||||||
runOnUiThread(this::updateSessionRestoreBanner);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendMessage() {
|
private void sendMessage() {
|
||||||
if (inputPanel.isRecordingInLockedMode()) {
|
if (inputPanel.isRecordingInLockedMode()) {
|
||||||
inputPanel.releaseRecordingLock();
|
inputPanel.releaseRecordingLock();
|
||||||
|
@ -251,7 +251,8 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
|||||||
"SmsSendJob",
|
"SmsSendJob",
|
||||||
"SmsSentJob",
|
"SmsSentJob",
|
||||||
"SmsReceiveJob",
|
"SmsReceiveJob",
|
||||||
"PushGroupUpdateJob");
|
"PushGroupUpdateJob",
|
||||||
|
"ResetThreadSessionJob");
|
||||||
}
|
}
|
||||||
|
|
||||||
db.setTransactionSuccessful();
|
db.setTransactionSuccessful();
|
||||||
|
@ -15,13 +15,11 @@ import org.thoughtcrime.securesms.jobmanager.impl.NetworkOrCellServiceConstraint
|
|||||||
import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraint;
|
import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraint;
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraintObserver;
|
import org.thoughtcrime.securesms.jobmanager.impl.SqlCipherMigrationConstraintObserver;
|
||||||
import org.thoughtcrime.securesms.loki.api.PrepareAttachmentAudioExtrasJob;
|
import org.thoughtcrime.securesms.loki.api.PrepareAttachmentAudioExtrasJob;
|
||||||
import org.thoughtcrime.securesms.loki.api.ResetThreadSessionJob;
|
|
||||||
import org.thoughtcrime.securesms.loki.protocol.ClosedGroupUpdateMessageSendJobV2;
|
import org.thoughtcrime.securesms.loki.protocol.ClosedGroupUpdateMessageSendJobV2;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -50,7 +48,6 @@ public final class JobManagerFactories {
|
|||||||
put(TypingSendJob.KEY, new TypingSendJob.Factory());
|
put(TypingSendJob.KEY, new TypingSendJob.Factory());
|
||||||
put(UpdateApkJob.KEY, new UpdateApkJob.Factory());
|
put(UpdateApkJob.KEY, new UpdateApkJob.Factory());
|
||||||
put(PrepareAttachmentAudioExtrasJob.KEY, new PrepareAttachmentAudioExtrasJob.Factory());
|
put(PrepareAttachmentAudioExtrasJob.KEY, new PrepareAttachmentAudioExtrasJob.Factory());
|
||||||
put(ResetThreadSessionJob.KEY, new ResetThreadSessionJob.Factory());
|
|
||||||
}};
|
}};
|
||||||
factoryKeys.addAll(factoryHashMap.keySet());
|
factoryKeys.addAll(factoryHashMap.keySet());
|
||||||
return factoryHashMap;
|
return factoryHashMap;
|
||||||
|
@ -28,11 +28,9 @@ import network.loki.messenger.R
|
|||||||
import org.thoughtcrime.securesms.ApplicationContext
|
import org.thoughtcrime.securesms.ApplicationContext
|
||||||
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
||||||
import org.thoughtcrime.securesms.conversation.ConversationActivity
|
import org.thoughtcrime.securesms.conversation.ConversationActivity
|
||||||
import org.session.libsession.messaging.threads.Address
|
|
||||||
import org.session.libsession.utilities.GroupUtil
|
import org.session.libsession.utilities.GroupUtil
|
||||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||||
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
import org.thoughtcrime.securesms.database.model.ThreadRecord
|
||||||
import org.thoughtcrime.securesms.loki.api.ResetThreadSessionJob
|
|
||||||
import org.thoughtcrime.securesms.loki.utilities.*
|
import org.thoughtcrime.securesms.loki.utilities.*
|
||||||
import org.thoughtcrime.securesms.loki.views.ConversationView
|
import org.thoughtcrime.securesms.loki.views.ConversationView
|
||||||
import org.thoughtcrime.securesms.loki.views.NewConversationButtonSetViewDelegate
|
import org.thoughtcrime.securesms.loki.views.NewConversationButtonSetViewDelegate
|
||||||
@ -40,8 +38,6 @@ import org.thoughtcrime.securesms.loki.views.SeedReminderViewDelegate
|
|||||||
import org.thoughtcrime.securesms.mms.GlideApp
|
import org.thoughtcrime.securesms.mms.GlideApp
|
||||||
import org.thoughtcrime.securesms.mms.GlideRequests
|
import org.thoughtcrime.securesms.mms.GlideRequests
|
||||||
import org.session.libsession.utilities.TextSecurePreferences
|
import org.session.libsession.utilities.TextSecurePreferences
|
||||||
import org.session.libsession.utilities.TextSecurePreferences.getBooleanPreference
|
|
||||||
import org.session.libsession.utilities.TextSecurePreferences.setBooleanPreference
|
|
||||||
import org.session.libsession.utilities.Util
|
import org.session.libsession.utilities.Util
|
||||||
import org.session.libsignal.service.loki.utilities.mentions.MentionsManager
|
import org.session.libsignal.service.loki.utilities.mentions.MentionsManager
|
||||||
import org.session.libsignal.utilities.ThreadUtils
|
import org.session.libsignal.utilities.ThreadUtils
|
||||||
|
@ -22,7 +22,7 @@ class ClosedGroupPoller private constructor(private val context: Context) {
|
|||||||
|
|
||||||
override fun run() {
|
override fun run() {
|
||||||
poll()
|
poll()
|
||||||
handler.postDelayed(this, ClosedGroupPoller.pollInterval)
|
handler.postDelayed(this, pollInterval)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,24 +40,24 @@ class ClosedGroupPoller private constructor(private val context: Context) {
|
|||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Error
|
// region Error
|
||||||
public class InsufficientSnodesException() : Exception("No snodes left to poll.")
|
class InsufficientSnodesException() : Exception("No snodes left to poll.")
|
||||||
public class PollingCanceledException() : Exception("Polling canceled.")
|
class PollingCanceledException() : Exception("Polling canceled.")
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
// region Public API
|
// region Public API
|
||||||
public fun startIfNeeded() {
|
fun startIfNeeded() {
|
||||||
if (isPolling) { return }
|
if (isPolling) { return }
|
||||||
isPolling = true
|
isPolling = true
|
||||||
task.run()
|
task.run()
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun pollOnce(): List<Promise<Unit, Exception>> {
|
fun pollOnce(): List<Promise<Unit, Exception>> {
|
||||||
if (isPolling) { return listOf() }
|
if (isPolling) { return listOf() }
|
||||||
isPolling = true
|
isPolling = true
|
||||||
return poll()
|
return poll()
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun stopIfNeeded() {
|
fun stopIfNeeded() {
|
||||||
isPolling = false
|
isPolling = false
|
||||||
handler.removeCallbacks(task)
|
handler.removeCallbacks(task)
|
||||||
}
|
}
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.loki.api
|
|
||||||
|
|
||||||
import org.session.libsession.messaging.jobs.Data
|
|
||||||
import org.session.libsession.messaging.threads.Address
|
|
||||||
import org.thoughtcrime.securesms.jobmanager.Job
|
|
||||||
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint
|
|
||||||
import org.thoughtcrime.securesms.jobs.BaseJob
|
|
||||||
import org.session.libsignal.utilities.logging.Log
|
|
||||||
import org.session.libsession.messaging.threads.recipients.Recipient
|
|
||||||
import org.thoughtcrime.securesms.sms.MessageSender
|
|
||||||
import org.thoughtcrime.securesms.sms.OutgoingEndSessionMessage
|
|
||||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage
|
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
class ResetThreadSessionJob private constructor(
|
|
||||||
parameters: Parameters,
|
|
||||||
private val address: Address,
|
|
||||||
private val threadId: Long)
|
|
||||||
: BaseJob(parameters) {
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val KEY = "ResetThreadSessionJob"
|
|
||||||
const val DATA_KEY_ADDRESS = "address"
|
|
||||||
const val DATA_KEY_THREAD_ID = "thread_id"
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(address: Address, threadId: Long) : this(Parameters.Builder()
|
|
||||||
.addConstraint(NetworkConstraint.KEY)
|
|
||||||
.setQueue(KEY)
|
|
||||||
.setLifespan(TimeUnit.DAYS.toMillis(1))
|
|
||||||
.setMaxAttempts(Parameters.UNLIMITED)
|
|
||||||
.build(),
|
|
||||||
address,
|
|
||||||
threadId)
|
|
||||||
|
|
||||||
override fun serialize(): Data {
|
|
||||||
return Data.Builder()
|
|
||||||
.putParcelable(DATA_KEY_ADDRESS, address)
|
|
||||||
.putLong(DATA_KEY_THREAD_ID, threadId)
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getFactoryKey(): String { return KEY }
|
|
||||||
|
|
||||||
public override fun onRun() {
|
|
||||||
val recipient = Recipient.from(context, address, false)
|
|
||||||
|
|
||||||
// Only reset sessions for private chats.
|
|
||||||
if (recipient.isGroupRecipient) return
|
|
||||||
|
|
||||||
Log.v(KEY, "Resetting session for thread: \"$threadId\", recipient: \"${address.serialize()}\"")
|
|
||||||
|
|
||||||
val message = OutgoingEndSessionMessage(OutgoingTextMessage(recipient, "TERMINATE", 0, -1))
|
|
||||||
MessageSender.send(context, message, threadId, false, null)
|
|
||||||
}
|
|
||||||
|
|
||||||
public override fun onShouldRetry(e: Exception): Boolean {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onCanceled() { }
|
|
||||||
|
|
||||||
class Factory : Job.Factory<ResetThreadSessionJob> {
|
|
||||||
|
|
||||||
override fun create(parameters: Parameters, data: Data): ResetThreadSessionJob {
|
|
||||||
val address = data.getParcelable(DATA_KEY_ADDRESS, Address.CREATOR)!!
|
|
||||||
val threadId = data.getLong(DATA_KEY_THREAD_ID)
|
|
||||||
return ResetThreadSessionJob(parameters, address, threadId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -19,7 +19,6 @@ import org.session.libsignal.service.loki.database.LokiThreadDatabaseProtocol
|
|||||||
import org.session.libsignal.service.loki.utilities.PublicKeyValidation
|
import org.session.libsignal.service.loki.utilities.PublicKeyValidation
|
||||||
|
|
||||||
class LokiThreadDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), LokiThreadDatabaseProtocol {
|
class LokiThreadDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(context, helper), LokiThreadDatabaseProtocol {
|
||||||
var delegate: LokiThreadDatabaseDelegate? = null
|
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val sessionResetTable = "loki_thread_session_reset_database"
|
private val sessionResetTable = "loki_thread_session_reset_database"
|
||||||
@ -83,24 +82,4 @@ class LokiThreadDatabase(context: Context, helper: SQLCipherOpenHelper) : Databa
|
|||||||
override fun removePublicChat(threadID: Long) {
|
override fun removePublicChat(threadID: Long) {
|
||||||
databaseHelper.writableDatabase.delete(publicChatTable, "${Companion.threadID} = ?", arrayOf( threadID.toString() ))
|
databaseHelper.writableDatabase.delete(publicChatTable, "${Companion.threadID} = ?", arrayOf( threadID.toString() ))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addSessionRestoreDevice(threadID: Long, publicKey: String) {
|
|
||||||
val devices = getSessionRestoreDevices(threadID).toMutableSet()
|
|
||||||
if (devices.add(publicKey)) {
|
|
||||||
TextSecurePreferences.setStringPreference(context, "session_restore_devices_$threadID", devices.joinToString(","))
|
|
||||||
delegate?.handleSessionRestoreDevicesChanged(threadID)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getSessionRestoreDevices(threadID: Long): Set<String> {
|
|
||||||
return TextSecurePreferences.getStringPreference(context, "session_restore_devices_$threadID", "")!!
|
|
||||||
.split(",")
|
|
||||||
.filter { PublicKeyValidation.isValid(it) }
|
|
||||||
.toSet()
|
|
||||||
}
|
|
||||||
|
|
||||||
fun removeAllSessionRestoreDevices(threadID: Long) {
|
|
||||||
TextSecurePreferences.setStringPreference(context, "session_restore_devices_$threadID", "")
|
|
||||||
delegate?.handleSessionRestoreDevicesChanged(threadID)
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -1,6 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.loki.database
|
|
||||||
|
|
||||||
interface LokiThreadDatabaseDelegate {
|
|
||||||
|
|
||||||
fun handleSessionRestoreDevicesChanged(threadID: Long)
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.loki.views
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.View
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import kotlinx.android.synthetic.main.session_restore_banner.view.*
|
|
||||||
|
|
||||||
import network.loki.messenger.R
|
|
||||||
import org.session.libsession.messaging.threads.recipients.Recipient
|
|
||||||
|
|
||||||
class SessionRestoreBannerView : LinearLayout {
|
|
||||||
lateinit var recipient: Recipient
|
|
||||||
var onDismiss: (() -> Unit)? = null
|
|
||||||
var onRestore: (() -> Unit)? = null
|
|
||||||
|
|
||||||
constructor(context: Context) : super(context, null)
|
|
||||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs, 0)
|
|
||||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
|
|
||||||
|
|
||||||
init {
|
|
||||||
LayoutInflater.from(context).inflate(R.layout.session_restore_banner, this, true)
|
|
||||||
restoreButton.setOnClickListener { onRestore?.invoke() }
|
|
||||||
dismissButton.setOnClickListener { onDismiss?.invoke() }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun update(recipient: Recipient) {
|
|
||||||
this.recipient = recipient
|
|
||||||
messageTextView.text = context.getString(R.string.session_reset_banner_message, recipient.toShortString())
|
|
||||||
}
|
|
||||||
|
|
||||||
fun show() {
|
|
||||||
sessionRestoreBanner.visibility = View.VISIBLE
|
|
||||||
}
|
|
||||||
|
|
||||||
fun hide() {
|
|
||||||
sessionRestoreBanner.visibility = View.GONE
|
|
||||||
}
|
|
||||||
}
|
|
@ -134,11 +134,6 @@
|
|||||||
android:background="?android:dividerHorizontal"
|
android:background="?android:dividerHorizontal"
|
||||||
android:elevation="1dp" />
|
android:elevation="1dp" />
|
||||||
|
|
||||||
<org.thoughtcrime.securesms.loki.views.SessionRestoreBannerView
|
|
||||||
android:id="@+id/sessionRestoreBannerView"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
|
|
||||||
<ViewStub
|
<ViewStub
|
||||||
android:id="@+id/group_share_profile_view_stub"
|
android:id="@+id/group_share_profile_view_stub"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user