diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 2b6a417e7b..e4693b99ed 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -178,8 +178,6 @@
android:name="org.thoughtcrime.securesms.loki.redesign.activities.LinkedDevicesActivity"
android:screenOrientation="portrait" />
-
-
-
-
-
+ android:theme="@style/TextSecure.LightNoActionBar" />
@@ -808,12 +786,12 @@
-
+
-
+
diff --git a/build.gradle b/build.gradle
index 3736255d7a..475c1cbe6e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -187,7 +187,6 @@ dependencies {
implementation "org.whispersystems:curve25519-java:0.5.0"
// Remote:
// implementation "com.github.loki-project:loki-messenger-android-service:dev-SNAPSHOT"
-// implementation "org.signal:signal-metadata-android:0.0.3"
implementation "com.google.protobuf:protobuf-java:2.5.0"
implementation "com.googlecode.libphonenumber:libphonenumber:8.10.7"
implementation "com.fasterxml.jackson.core:jackson-databind:2.9.8"
diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java
index 4acc6752a4..659b58cf1b 100644
--- a/src/org/thoughtcrime/securesms/ApplicationContext.java
+++ b/src/org/thoughtcrime/securesms/ApplicationContext.java
@@ -66,8 +66,8 @@ import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.logging.PersistentLogger;
import org.thoughtcrime.securesms.logging.UncaughtExceptionLogger;
-import org.thoughtcrime.securesms.loki.BackgroundPollWorker;
-import org.thoughtcrime.securesms.loki.BackgroundPublicChatPollWorker;
+import org.thoughtcrime.securesms.loki.redesign.messaging.BackgroundPollWorker;
+import org.thoughtcrime.securesms.loki.redesign.messaging.BackgroundPublicChatPollWorker;
import org.thoughtcrime.securesms.loki.LokiAPIDatabase;
import org.thoughtcrime.securesms.loki.LokiPublicChatManager;
import org.thoughtcrime.securesms.loki.LokiRSSFeedPoller;
diff --git a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java
index b15d58ec1f..345481ce0a 100644
--- a/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java
+++ b/src/org/thoughtcrime/securesms/ApplicationPreferencesActivity.java
@@ -41,8 +41,6 @@ import android.util.Log;
import android.widget.Toast;
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
-import org.thoughtcrime.securesms.loki.LinkedDevicesActivity;
-import org.thoughtcrime.securesms.loki.QRCodeDialog;
import org.thoughtcrime.securesms.preferences.AppProtectionPreferenceFragment;
import org.thoughtcrime.securesms.preferences.ChatsPreferenceFragment;
import org.thoughtcrime.securesms.preferences.CorrectedPreferenceFragment;
@@ -338,13 +336,8 @@ public class ApplicationPreferencesActivity extends PassphraseRequiredActionBarA
shareIntent.setType("text/plain");
startActivity(shareIntent);
break;
- case PREFERENCE_CATEGORY_QR_CODE:
- QRCodeDialog.INSTANCE.show(getContext());
- break;
- case PREFERENCE_CATEGORY_LINKED_DEVICES:
- Intent intent = new Intent(getActivity(), LinkedDevicesActivity.class);
- startActivity(intent);
- break;
+ case PREFERENCE_CATEGORY_QR_CODE: break;
+ case PREFERENCE_CATEGORY_LINKED_DEVICES: break;
case PREFERENCE_CATEGORY_SEED:
Analytics.Companion.getShared().track("Seed Modal Shown");
File languageFileDirectory = new File(getContext().getApplicationInfo().dataDir);
diff --git a/src/org/thoughtcrime/securesms/ConversationListActivity.java b/src/org/thoughtcrime/securesms/ConversationListActivity.java
index 96c9e0e84f..5b7dfdb697 100644
--- a/src/org/thoughtcrime/securesms/ConversationListActivity.java
+++ b/src/org/thoughtcrime/securesms/ConversationListActivity.java
@@ -16,7 +16,6 @@
*/
package org.thoughtcrime.securesms;
-import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ActivityNotFoundException;
import android.content.Context;
@@ -35,7 +34,6 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
-import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.Toast;
@@ -46,20 +44,16 @@ import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.thoughtcrime.securesms.components.RatingManager;
import org.thoughtcrime.securesms.components.SearchToolbar;
-import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto;
import org.thoughtcrime.securesms.conversation.ConversationActivity;
-import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
import org.thoughtcrime.securesms.database.Address;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
import org.thoughtcrime.securesms.lock.RegistrationLockDialog;
-import org.thoughtcrime.securesms.loki.AddPublicChatActivity;
-import org.thoughtcrime.securesms.loki.JazzIdenticonDrawable;
import org.thoughtcrime.securesms.loki.RecipientAvatarModifiedEvent;
+import org.thoughtcrime.securesms.loki.redesign.activities.JoinPublicChatActivity;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.notifications.MarkReadReceiver;
import org.thoughtcrime.securesms.notifications.MessageNotifier;
-import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.search.SearchFragment;
import org.thoughtcrime.securesms.service.KeyCachingService;
@@ -68,7 +62,6 @@ import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
-import org.whispersystems.signalservice.loki.api.LokiStorageAPI;
import java.util.List;
@@ -333,7 +326,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
}
private void addNewPublicChat() {
- startActivity(new Intent(this, AddPublicChatActivity.class));
+ startActivity(new Intent(this, JoinPublicChatActivity.class));
}
@Subscribe(threadMode = ThreadMode.MAIN)
diff --git a/src/org/thoughtcrime/securesms/ConversationListFragment.java b/src/org/thoughtcrime/securesms/ConversationListFragment.java
index 03125430c2..404e464f59 100644
--- a/src/org/thoughtcrime/securesms/ConversationListFragment.java
+++ b/src/org/thoughtcrime/securesms/ConversationListFragment.java
@@ -74,7 +74,7 @@ import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
import org.thoughtcrime.securesms.database.loaders.ConversationListLoader;
import org.thoughtcrime.securesms.events.ReminderUpdateEvent;
import org.thoughtcrime.securesms.jobs.ServiceOutageDetectionJob;
-import org.thoughtcrime.securesms.loki.NewConversationActivity;
+import org.thoughtcrime.securesms.loki.redesign.activities.CreatePrivateChatActivity;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.notifications.MarkReadReceiver;
import org.thoughtcrime.securesms.notifications.MessageNotifier;
@@ -155,7 +155,7 @@ public class ConversationListFragment extends Fragment
super.onActivityCreated(bundle);
setHasOptionsMenu(true);
- fab.setOnClickListener(v -> startActivity(new Intent(getActivity(), NewConversationActivity.class)));
+ fab.setOnClickListener(v -> startActivity(new Intent(getActivity(), CreatePrivateChatActivity.class)));
initializeListAdapter();
initializeTypingObserver();
}
diff --git a/src/org/thoughtcrime/securesms/ConversationListItem.java b/src/org/thoughtcrime/securesms/ConversationListItem.java
index 2c5bba6f1b..5cc0a74711 100644
--- a/src/org/thoughtcrime/securesms/ConversationListItem.java
+++ b/src/org/thoughtcrime/securesms/ConversationListItem.java
@@ -37,7 +37,7 @@ import org.thoughtcrime.securesms.components.FromTextView;
import org.thoughtcrime.securesms.components.ThumbnailView;
import org.thoughtcrime.securesms.components.TypingIndicatorView;
import org.thoughtcrime.securesms.database.model.ThreadRecord;
-import org.thoughtcrime.securesms.loki.LokiAPIUtilities;
+import org.thoughtcrime.securesms.loki.redesign.messaging.LokiAPIUtilities;
import org.thoughtcrime.securesms.loki.redesign.utilities.MentionUtilities;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.recipients.Recipient;
diff --git a/src/org/thoughtcrime/securesms/DeviceListFragment.java b/src/org/thoughtcrime/securesms/DeviceListFragment.java
index dbabf62754..ac759c5d50 100644
--- a/src/org/thoughtcrime/securesms/DeviceListFragment.java
+++ b/src/org/thoughtcrime/securesms/DeviceListFragment.java
@@ -26,7 +26,7 @@ import org.thoughtcrime.securesms.database.loaders.DeviceListLoader;
import org.thoughtcrime.securesms.dependencies.InjectableType;
import org.thoughtcrime.securesms.devicelist.Device;
import org.thoughtcrime.securesms.loki.DeviceListBottomSheetFragment;
-import org.thoughtcrime.securesms.loki.MnemonicUtilities;
+import org.thoughtcrime.securesms.loki.redesign.utilities.MnemonicUtilities;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.ViewUtil;
import org.whispersystems.libsignal.util.guava.Function;
diff --git a/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java b/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java
index 51653f85a7..4203041016 100644
--- a/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java
+++ b/src/org/thoughtcrime/securesms/PassphraseRequiredActionBarActivity.java
@@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.redesign.activities.HomeActivity;
import org.thoughtcrime.securesms.loki.redesign.activities.LandingActivity;
-import org.thoughtcrime.securesms.loki.SeedActivity;
+import org.thoughtcrime.securesms.loki.redesign.activities.SeedActivity;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
diff --git a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java
index 024d77f860..70f99a663e 100644
--- a/src/org/thoughtcrime/securesms/SmsSendtoActivity.java
+++ b/src/org/thoughtcrime/securesms/SmsSendtoActivity.java
@@ -13,7 +13,6 @@ import org.thoughtcrime.securesms.conversation.ConversationActivity;
import org.thoughtcrime.securesms.database.Address;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.logging.Log;
-import org.thoughtcrime.securesms.loki.NewConversationActivity;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.Rfc5724Uri;
diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java
index 1ab6cfff39..505f9c67f2 100644
--- a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java
+++ b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java
@@ -157,7 +157,7 @@ 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.LokiAPIUtilities;
+import org.thoughtcrime.securesms.loki.redesign.messaging.LokiAPIUtilities;
import org.thoughtcrime.securesms.loki.LokiMessageDatabase;
import org.thoughtcrime.securesms.loki.LokiThreadDatabase;
import org.thoughtcrime.securesms.loki.LokiThreadDatabaseDelegate;
diff --git a/src/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java b/src/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java
index 6961feb8a1..031eb62a4d 100644
--- a/src/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java
+++ b/src/org/thoughtcrime/securesms/database/loaders/DeviceListLoader.java
@@ -2,47 +2,23 @@ package org.thoughtcrime.securesms.database.loaders;
import android.content.Context;
import android.support.annotation.NonNull;
-import android.text.TextUtils;
import com.annimon.stream.Stream;
-import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
-import org.thoughtcrime.securesms.database.Database;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.devicelist.Device;
-import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.logging.Log;
-import org.thoughtcrime.securesms.loki.MnemonicUtilities;
+import org.thoughtcrime.securesms.loki.redesign.utilities.MnemonicUtilities;
import org.thoughtcrime.securesms.util.AsyncLoader;
-import org.thoughtcrime.securesms.util.Base64;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
-import org.whispersystems.libsignal.InvalidKeyException;
-import org.whispersystems.libsignal.ecc.Curve;
-import org.whispersystems.libsignal.ecc.ECPrivateKey;
-import org.whispersystems.libsignal.ecc.ECPublicKey;
-import org.whispersystems.libsignal.util.ByteUtil;
-import org.whispersystems.signalservice.api.SignalServiceAccountManager;
-import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.loki.api.LokiStorageAPI;
import org.whispersystems.signalservice.loki.crypto.MnemonicCodec;
import java.io.File;
-import java.io.IOException;
-import java.security.GeneralSecurityException;
-import java.security.MessageDigest;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
-import javax.crypto.Cipher;
-import javax.crypto.Mac;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import static org.thoughtcrime.securesms.devicelist.DeviceNameProtos.*;
-import static org.whispersystems.signalservice.loki.utilities.TrimmingKt.removing05PrefixIfNeeded;
-
public class DeviceListLoader extends AsyncLoader> {
private static final String TAG = DeviceListLoader.class.getSimpleName();
diff --git a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java
index d4c9423c7c..ab5712fc40 100644
--- a/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java
+++ b/src/org/thoughtcrime/securesms/jobs/PushDecryptJob.java
@@ -68,7 +68,7 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.FriendRequestHandler;
-import org.thoughtcrime.securesms.loki.LokiAPIUtilities;
+import org.thoughtcrime.securesms.loki.redesign.messaging.LokiAPIUtilities;
import org.thoughtcrime.securesms.loki.LokiMessageDatabase;
import org.thoughtcrime.securesms.loki.LokiPreKeyBundleDatabase;
import org.thoughtcrime.securesms.loki.LokiPreKeyRecordDatabase;
diff --git a/src/org/thoughtcrime/securesms/loki/AddPublicChatActivity.kt b/src/org/thoughtcrime/securesms/loki/AddPublicChatActivity.kt
deleted file mode 100644
index d46fc4beaa..0000000000
--- a/src/org/thoughtcrime/securesms/loki/AddPublicChatActivity.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.os.Bundle
-import android.util.Patterns
-import android.view.MenuItem
-import android.view.inputmethod.InputMethodManager
-import android.widget.Toast
-import kotlinx.android.synthetic.main.activity_add_public_chat.*
-import network.loki.messenger.R
-import nl.komponents.kovenant.ui.failUi
-import nl.komponents.kovenant.ui.successUi
-import org.thoughtcrime.securesms.ApplicationContext
-import org.thoughtcrime.securesms.BaseActionBarActivity
-import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
-import org.thoughtcrime.securesms.crypto.ProfileKeyUtil
-import org.thoughtcrime.securesms.util.DynamicTheme
-import org.thoughtcrime.securesms.util.TextSecurePreferences
-
-class AddPublicChatActivity : PassphraseRequiredActionBarActivity() {
- private val dynamicTheme = DynamicTheme()
-
- override fun onPreCreate() {
- dynamicTheme.onCreate(this)
- }
-
- override fun onCreate(bundle: Bundle?, isReady: Boolean) {
- supportActionBar!!.setTitle(R.string.fragment_add_public_chat_title)
- supportActionBar!!.setDisplayHomeAsUpEnabled(true)
- setContentView(R.layout.activity_add_public_chat)
- updateUI(false)
- addButton.setOnClickListener { addPublicChatIfPossible() }
- }
-
- public override fun onResume() {
- super.onResume()
- dynamicTheme.onResume(this)
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (item.itemId == android.R.id.home) {
- onBackPressed()
- return true
- }
- return super.onOptionsItemSelected(item)
- }
-
- private fun addPublicChatIfPossible() {
- val inputMethodManager = getSystemService(BaseActionBarActivity.INPUT_METHOD_SERVICE) as InputMethodManager
- inputMethodManager.hideSoftInputFromWindow(urlEditText.windowToken, 0)
- val url = urlEditText.text.toString().toLowerCase().replace("http://", "https://")
- if (!Patterns.WEB_URL.matcher(url).matches() || !url.startsWith("https://")) {
- return Toast.makeText(this, R.string.fragment_add_public_chat_invalid_url_message, Toast.LENGTH_SHORT).show()
- }
- updateUI(true)
- val application = ApplicationContext.getInstance(this)
- val channel: Long = 1
- val displayName = TextSecurePreferences.getProfileName(this)
- val lokiPublicChatAPI = application.lokiPublicChatAPI!!
- application.lokiPublicChatManager.addChat(url, channel).successUi {
- lokiPublicChatAPI.getMessages(channel, url)
- lokiPublicChatAPI.setDisplayName(displayName, url)
- val profileKey: ByteArray = ProfileKeyUtil.getProfileKey(this)
- val profileUrl: String? = TextSecurePreferences.getProfileAvatarUrl(this)
- lokiPublicChatAPI.setProfilePicture(url, profileKey, profileUrl)
- finish()
- }.failUi {
- updateUI(false)
- Toast.makeText(this, R.string.fragment_add_public_chat_connection_failed_message, Toast.LENGTH_SHORT).show()
- }
- }
-
- private fun updateUI(isConnecting: Boolean) {
- addButton.isEnabled = !isConnecting
- val text = if (isConnecting) R.string.fragment_add_public_chat_add_button_title_2 else R.string.fragment_add_public_chat_add_button_title_1
- addButton.setText(text)
- urlEditText.isEnabled = !isConnecting
- }
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/DeviceLinkingDelegate.kt b/src/org/thoughtcrime/securesms/loki/DeviceLinkingDelegate.kt
deleted file mode 100644
index 3a86bdf245..0000000000
--- a/src/org/thoughtcrime/securesms/loki/DeviceLinkingDelegate.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import org.whispersystems.signalservice.loki.api.PairingAuthorisation
-
-// Loki - TODO: Remove this yucky delegate pattern for device linking dialog once we have the redesign
-interface DeviceLinkingDelegate {
- companion object {
- fun combine(vararg delegates: DeviceLinkingDelegate?): DeviceLinkingDelegate {
- val validDelegates = delegates.filterNotNull()
- return object : DeviceLinkingDelegate {
- override fun handleDeviceLinkAuthorized(pairingAuthorisation: PairingAuthorisation) {
- for (delegate in validDelegates) { delegate.handleDeviceLinkAuthorized(pairingAuthorisation) }
- }
-
- override fun handleDeviceLinkingDialogDismissed() {
- for (delegate in validDelegates) { delegate.handleDeviceLinkingDialogDismissed() }
- }
-
- override fun sendPairingAuthorizedMessage(pairingAuthorisation: PairingAuthorisation) {
- for (delegate in validDelegates) { delegate.sendPairingAuthorizedMessage(pairingAuthorisation) }
- }
- }
- }
- }
-
- fun handleDeviceLinkAuthorized(pairingAuthorisation: PairingAuthorisation) {}
- fun handleDeviceLinkingDialogDismissed() {}
- fun sendPairingAuthorizedMessage(pairingAuthorisation: PairingAuthorisation) {}
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/DeviceLinkingDialog.kt b/src/org/thoughtcrime/securesms/loki/DeviceLinkingDialog.kt
deleted file mode 100644
index 0b6bede2eb..0000000000
--- a/src/org/thoughtcrime/securesms/loki/DeviceLinkingDialog.kt
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.content.Context
-import android.support.v7.app.AlertDialog
-import org.thoughtcrime.securesms.database.DatabaseFactory
-import org.thoughtcrime.securesms.util.Util
-import org.whispersystems.signalservice.loki.api.DeviceLinkingSession
-import org.whispersystems.signalservice.loki.api.DeviceLinkingSessionListener
-import org.whispersystems.signalservice.loki.api.PairingAuthorisation
-
-class DeviceLinkingDialog private constructor(private val context: Context, private val mode: DeviceLinkingView.Mode, private val delegate: DeviceLinkingDelegate?) : DeviceLinkingDelegate, DeviceLinkingSessionListener {
- private lateinit var view: DeviceLinkingView
- private lateinit var dialog: AlertDialog
-
- companion object {
- fun show(context: Context, mode: DeviceLinkingView.Mode, delegate: DeviceLinkingDelegate?): DeviceLinkingDialog {
- val dialog = DeviceLinkingDialog(context, mode, delegate)
- dialog.show()
- return dialog
- }
- }
-
- private fun show() {
- val delegate = DeviceLinkingDelegate.combine(this, this.delegate)
- view = DeviceLinkingView(context, mode, delegate)
- dialog = AlertDialog.Builder(context).setView(view).show()
- dialog.setCanceledOnTouchOutside(false)
- view.dismiss = { dismiss() }
- DeviceLinkingSession.shared.startListeningForLinkingRequests()
- DeviceLinkingSession.shared.addListener(this)
- }
-
- private fun dismiss() {
- DeviceLinkingSession.shared.stopListeningForLinkingRequests()
- DeviceLinkingSession.shared.removeListener(this)
- dialog.dismiss()
- }
-
- override fun handleDeviceLinkingDialogDismissed() {
- if (mode == DeviceLinkingView.Mode.Master && view.pairingAuthorisation != null) {
- val authorisation = view.pairingAuthorisation!!
- DatabaseFactory.getLokiPreKeyBundleDatabase(context).removePreKeyBundle(authorisation.secondaryDevicePublicKey)
- }
- }
-
- override fun requestUserAuthorization(authorisation: PairingAuthorisation) {
- Util.runOnMain {
- view.requestUserAuthorization(authorisation)
- }
- DeviceLinkingSession.shared.stopListeningForLinkingRequests()
- }
-
- override fun onDeviceLinkRequestAuthorized(authorisation: PairingAuthorisation) {
- Util.runOnMain {
- view.onDeviceLinkAuthorized(authorisation)
- }
- DeviceLinkingSession.shared.stopListeningForLinkingRequests()
- }
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/DeviceLinkingView.kt b/src/org/thoughtcrime/securesms/loki/DeviceLinkingView.kt
deleted file mode 100644
index bf91bf80ec..0000000000
--- a/src/org/thoughtcrime/securesms/loki/DeviceLinkingView.kt
+++ /dev/null
@@ -1,132 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.content.Context
-import android.graphics.Color
-import android.graphics.PorterDuff
-import android.os.Handler
-import android.util.AttributeSet
-import android.util.DisplayMetrics
-import android.view.View
-import android.widget.LinearLayout
-import kotlinx.android.synthetic.main.view_device_linking.view.*
-import kotlinx.android.synthetic.main.view_device_linking.view.cancelButton
-import kotlinx.android.synthetic.main.view_device_linking.view.explanationTextView
-import kotlinx.android.synthetic.main.view_device_linking.view.titleTextView
-import network.loki.messenger.R
-import org.thoughtcrime.securesms.qr.QrCode
-import org.thoughtcrime.securesms.util.ServiceUtil
-import org.thoughtcrime.securesms.util.TextSecurePreferences
-import org.whispersystems.signalservice.loki.api.PairingAuthorisation
-import org.whispersystems.signalservice.loki.crypto.MnemonicCodec
-import java.io.File
-
-class DeviceLinkingView private constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, private val mode: Mode, private var delegate: DeviceLinkingDelegate) : LinearLayout(context, attrs, defStyleAttr) {
- private val languageFileDirectory: File = MnemonicUtilities.getLanguageFileDirectory(context)
- var dismiss: (() -> Unit)? = null
- var pairingAuthorisation: PairingAuthorisation? = null
- private set
-
- // region Types
- enum class Mode { Master, Slave }
- // endregion
-
- // region Lifecycle
- constructor(context: Context, mode: Mode, delegate: DeviceLinkingDelegate) : this(context, null, 0, mode, delegate)
- private constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0, Mode.Master, object : DeviceLinkingDelegate { }) // Just pass in a dummy mode
- private constructor(context: Context) : this(context, null)
-
- init {
- setUpViewHierarchy()
- }
-
- private fun setUpViewHierarchy() {
- inflate(context, R.layout.view_device_linking, this)
- spinner.indeterminateDrawable.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN)
- val titleID = when (mode) {
- Mode.Master -> R.string.view_device_linking_title_1
- Mode.Slave -> R.string.view_device_linking_title_2
- }
- titleTextView.text = resources.getString(titleID)
- val explanationID = when (mode) {
- Mode.Master -> R.string.view_device_linking_explanation_1
- Mode.Slave -> R.string.view_device_linking_explanation_2
- }
- explanationTextView.text = resources.getString(explanationID)
- mnemonicTextView.visibility = if (mode == Mode.Master) View.GONE else View.VISIBLE
- if (mode == Mode.Slave) {
- val hexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context)
- mnemonicTextView.text = MnemonicUtilities.getFirst3Words(MnemonicCodec(languageFileDirectory), hexEncodedPublicKey)
- }
- authorizeButton.visibility = View.GONE
- authorizeButton.setOnClickListener { authorizePairing() }
-
- // QR Code
- spinner.visibility = if (mode == Mode.Master) View.GONE else View.VISIBLE
- qrCodeImageView.visibility = if (mode == Mode.Master) View.VISIBLE else View.GONE
- if (mode == Mode.Master) {
- val hexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context)
- val displayMetrics = DisplayMetrics()
- ServiceUtil.getWindowManager(context).defaultDisplay.getMetrics(displayMetrics)
- val size = displayMetrics.widthPixels - 2 * toPx(96, resources)
- val qrCode = QrCode.create(hexEncodedPublicKey, size)
- qrCodeImageView.setImageBitmap(qrCode)
- }
-
- cancelButton.setOnClickListener { cancel() }
- }
- // endregion
-
- // region Device Linking
- fun requestUserAuthorization(pairingAuthorisation: PairingAuthorisation) {
- if (mode != Mode.Master || pairingAuthorisation.type != PairingAuthorisation.Type.REQUEST || this.pairingAuthorisation != null) { return }
- this.pairingAuthorisation = pairingAuthorisation
- spinner.visibility = View.GONE
- qrCodeImageView.visibility = View.GONE
- val titleTextViewLayoutParams = titleTextView.layoutParams as LayoutParams
- titleTextViewLayoutParams.topMargin = toPx(16, resources)
- titleTextView.layoutParams = titleTextViewLayoutParams
- titleTextView.text = resources.getString(R.string.view_device_linking_title_3)
- explanationTextView.text = resources.getString(R.string.view_device_linking_explanation_2)
- mnemonicTextView.visibility = View.VISIBLE
- mnemonicTextView.text = MnemonicUtilities.getFirst3Words(MnemonicCodec(languageFileDirectory), pairingAuthorisation.secondaryDevicePublicKey)
- authorizeButton.visibility = View.VISIBLE
- }
-
- fun onDeviceLinkAuthorized(pairingAuthorisation: PairingAuthorisation) {
- if (mode != Mode.Slave || pairingAuthorisation.type != PairingAuthorisation.Type.GRANT || this.pairingAuthorisation != null) { return }
- this.pairingAuthorisation = pairingAuthorisation
- spinner.visibility = View.GONE
- val titleTextViewLayoutParams = titleTextView.layoutParams as LayoutParams
- titleTextViewLayoutParams.topMargin = toPx(8, resources)
- titleTextView.layoutParams = titleTextViewLayoutParams
- titleTextView.text = resources.getString(R.string.view_device_linking_title_4)
- val explanationTextViewLayoutParams = explanationTextView.layoutParams as LayoutParams
- explanationTextViewLayoutParams.bottomMargin = toPx(12, resources)
- explanationTextView.layoutParams = explanationTextViewLayoutParams
- explanationTextView.text = resources.getString(R.string.view_device_linking_explanation_3)
- titleTextView.text = resources.getString(R.string.view_device_linking_title_4)
- mnemonicTextView.visibility = View.GONE
- buttonContainer.visibility = View.GONE
- cancelButton.visibility = View.GONE
- Handler().postDelayed({
- delegate.handleDeviceLinkAuthorized(pairingAuthorisation)
- dismiss?.invoke()
- }, 4000)
- }
- // endregion
-
- // region Interaction
- private fun authorizePairing() {
- val pairingAuthorisation = this.pairingAuthorisation
- if (mode != Mode.Master || pairingAuthorisation == null) { return; }
- delegate.sendPairingAuthorizedMessage(pairingAuthorisation)
- delegate.handleDeviceLinkAuthorized(pairingAuthorisation)
- dismiss?.invoke()
- }
-
- private fun cancel() {
- delegate.handleDeviceLinkingDialogDismissed()
- dismiss?.invoke()
- }
- // endregion
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/DeviceListBottomSheetFragment.kt b/src/org/thoughtcrime/securesms/loki/DeviceListBottomSheetFragment.kt
index 013b48a66d..88af5a59dc 100644
--- a/src/org/thoughtcrime/securesms/loki/DeviceListBottomSheetFragment.kt
+++ b/src/org/thoughtcrime/securesms/loki/DeviceListBottomSheetFragment.kt
@@ -9,16 +9,16 @@ import kotlinx.android.synthetic.main.fragment_device_list_bottom_sheet.*
import network.loki.messenger.R
public class DeviceListBottomSheetFragment : BottomSheetDialogFragment() {
- var onEditTapped: (() -> Unit)? = null
- var onUnlinkTapped: (() -> Unit)? = null
+ var onEditTapped: (() -> Unit)? = null
+ var onUnlinkTapped: (() -> Unit)? = null
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- return inflater.inflate(R.layout.fragment_device_list_bottom_sheet, container, false)
- }
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ return inflater.inflate(R.layout.fragment_device_list_bottom_sheet, container, false)
+ }
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- editDisplayNameText.setOnClickListener { onEditTapped?.invoke() }
- unlinkDeviceText.setOnClickListener { onUnlinkTapped?.invoke() }
- }
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ editDisplayNameText.setOnClickListener { onEditTapped?.invoke() }
+ unlinkDeviceText.setOnClickListener { onUnlinkTapped?.invoke() }
+ }
}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/DisplayNameActivity.kt b/src/org/thoughtcrime/securesms/loki/DisplayNameActivity.kt
deleted file mode 100644
index ad29ffa5cf..0000000000
--- a/src/org/thoughtcrime/securesms/loki/DisplayNameActivity.kt
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.content.Intent
-import android.os.Bundle
-import android.view.inputmethod.InputMethodManager
-import kotlinx.android.synthetic.main.activity_display_name.*
-import network.loki.messenger.R
-import org.thoughtcrime.securesms.ApplicationContext
-import org.thoughtcrime.securesms.BaseActionBarActivity
-import org.thoughtcrime.securesms.ConversationListActivity
-import org.thoughtcrime.securesms.database.DatabaseFactory
-import org.thoughtcrime.securesms.loki.redesign.utilities.show
-import org.thoughtcrime.securesms.util.TextSecurePreferences
-import org.whispersystems.signalservice.api.crypto.ProfileCipher
-import org.whispersystems.signalservice.loki.utilities.Analytics
-
-class DisplayNameActivity : BaseActionBarActivity() {
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_display_name)
- nextButton.setOnClickListener { continueIfPossible() }
- Analytics.shared.track("Display Name Screen Viewed")
- }
-
- private fun continueIfPossible() {
- val name = nameEditText.text.toString()
- if (name.isEmpty()) {
- return nameEditText.input.setError("Invalid")
- }
- if (!name.matches(Regex("[a-zA-Z0-9_]+"))) {
- return nameEditText.input.setError("Invalid (a-z, A-Z, 0-9 and _ only)")
- }
- if (name.toByteArray().size > ProfileCipher.NAME_PADDED_LENGTH) {
- return nameEditText.input.setError("Too Long")
- } else {
- Analytics.shared.track("Display Name Updated")
- TextSecurePreferences.setProfileName(this, name)
- }
- val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
- inputMethodManager.hideSoftInputFromWindow(nameEditText.windowToken, 0)
- TextSecurePreferences.setHasSeenWelcomeScreen(this, true)
- TextSecurePreferences.setPromptedPushRegistration(this, true)
- val application = ApplicationContext.getInstance(this)
- application.setUpP2PAPI()
- application.startLongPollingIfNeeded()
- application.setUpStorageAPIIfNeeded()
- show(Intent(this, ConversationListActivity::class.java))
- finish()
- val publicChatAPI = ApplicationContext.getInstance(this).lokiPublicChatAPI
- if (publicChatAPI != null) {
- application.createDefaultPublicChatsIfNeeded()
- application.createRSSFeedsIfNeeded()
- application.lokiPublicChatManager.startPollersIfNeeded()
- application.startRSSFeedPollersIfNeeded()
- val servers = DatabaseFactory.getLokiThreadDatabase(this).getAllPublicChatServers()
- servers.forEach { publicChatAPI.setDisplayName(name, it) }
- application.updatePublicChatProfileAvatarIfNeeded()
- }
- }
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/LinkedDevicesActivity.kt b/src/org/thoughtcrime/securesms/loki/LinkedDevicesActivity.kt
deleted file mode 100644
index 0788095b2e..0000000000
--- a/src/org/thoughtcrime/securesms/loki/LinkedDevicesActivity.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.os.AsyncTask
-import android.os.Bundle
-import android.view.MenuItem
-import android.widget.Toast
-import org.thoughtcrime.securesms.*
-import org.thoughtcrime.securesms.util.DynamicTheme
-import org.thoughtcrime.securesms.util.DynamicLanguage
-import network.loki.messenger.R
-import nl.komponents.kovenant.then
-import org.thoughtcrime.securesms.database.DatabaseFactory
-import org.thoughtcrime.securesms.sms.MessageSender
-import org.thoughtcrime.securesms.util.TextSecurePreferences
-import org.thoughtcrime.securesms.util.Util
-import org.whispersystems.signalservice.loki.api.LokiStorageAPI
-import org.whispersystems.signalservice.loki.api.PairingAuthorisation
-
-class LinkedDevicesActivity : PassphraseRequiredActionBarActivity(), DeviceLinkingDelegate {
-
- companion object {
- private val TAG = DeviceActivity::class.java.simpleName
- }
-
- private val dynamicTheme = DynamicTheme()
- private val dynamicLanguage = DynamicLanguage()
- private lateinit var deviceListFragment: DeviceListFragment
-
- public override fun onPreCreate() {
- dynamicTheme.onCreate(this)
- dynamicLanguage.onCreate(this)
- }
-
- override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) {
- super.onCreate(savedInstanceState, ready)
- supportActionBar?.setDisplayHomeAsUpEnabled(true)
- supportActionBar?.setTitle(R.string.AndroidManifest__linked_devices)
- this.deviceListFragment = DeviceListFragment()
- this.deviceListFragment.setAddDeviceButtonListener {
- DeviceLinkingDialog.show(this, DeviceLinkingView.Mode.Master, this)
- }
- this.deviceListFragment.setHandleDisconnectDevice { devicePublicKey ->
- // Purge the device pairing from our database
- val ourPublicKey = TextSecurePreferences.getLocalNumber(this)
- val database = DatabaseFactory.getLokiAPIDatabase(this)
- database.removePairingAuthorisation(ourPublicKey, devicePublicKey)
- // Update mapping on the file server
- LokiStorageAPI.shared.updateUserDeviceMappings().success {
- // Send an unpair request to let the device know that it has been revoked
- MessageSender.sendUnpairRequest(this, devicePublicKey)
- }
- // Refresh the list
- this.deviceListFragment.refresh()
- Toast.makeText(this, R.string.DeviceListActivity_unlinked_device, Toast.LENGTH_LONG).show()
- return@setHandleDisconnectDevice null
- }
- this.deviceListFragment.setHandleDeviceNameChange { pair ->
- DatabaseFactory.getLokiUserDatabase(this).setDisplayName(pair.first, pair.second)
- this.deviceListFragment.refresh()
- return@setHandleDeviceNameChange null
- }
- initFragment(android.R.id.content, deviceListFragment, dynamicLanguage.currentLocale)
- }
-
- public override fun onResume() {
- super.onResume()
- dynamicTheme.onResume(this)
- dynamicLanguage.onResume(this)
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (item.itemId == android.R.id.home) {
- finish()
- return true
- }
- return false
- }
-
- override fun sendPairingAuthorizedMessage(pairingAuthorisation: PairingAuthorisation) {
- AsyncTask.execute {
- signAndSendPairingAuthorisationMessage(this, pairingAuthorisation)
- Util.runOnMain { this.deviceListFragment.refresh() }
- }
- }
-}
diff --git a/src/org/thoughtcrime/securesms/loki/LokiAPIDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiAPIDatabase.kt
index 6057e1f8f1..14e778ed78 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiAPIDatabase.kt
+++ b/src/org/thoughtcrime/securesms/loki/LokiAPIDatabase.kt
@@ -4,6 +4,7 @@ import android.content.ContentValues
import android.content.Context
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
+import org.thoughtcrime.securesms.loki.redesign.utilities.*
import org.thoughtcrime.securesms.util.Base64
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.whispersystems.signalservice.loki.api.LokiAPIDatabaseProtocol
diff --git a/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt
index f25f39e955..1c98d62612 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt
+++ b/src/org/thoughtcrime/securesms/loki/LokiMessageDatabase.kt
@@ -6,6 +6,9 @@ import org.thoughtcrime.securesms.database.Address
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
+import org.thoughtcrime.securesms.loki.redesign.utilities.get
+import org.thoughtcrime.securesms.loki.redesign.utilities.getInt
+import org.thoughtcrime.securesms.loki.redesign.utilities.insertOrUpdate
import org.whispersystems.signalservice.loki.messaging.LokiMessageDatabaseProtocol
import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus
diff --git a/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt
index 978abd6e91..1b0520f812 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt
+++ b/src/org/thoughtcrime/securesms/loki/LokiPreKeyBundleDatabase.kt
@@ -9,6 +9,10 @@ import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
import org.thoughtcrime.securesms.logging.Log
+import org.thoughtcrime.securesms.loki.redesign.utilities.get
+import org.thoughtcrime.securesms.loki.redesign.utilities.getBase64EncodedData
+import org.thoughtcrime.securesms.loki.redesign.utilities.getInt
+import org.thoughtcrime.securesms.loki.redesign.utilities.insertOrUpdate
import org.thoughtcrime.securesms.util.Base64
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.whispersystems.libsignal.IdentityKey
diff --git a/src/org/thoughtcrime/securesms/loki/LokiPreKeyRecordDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiPreKeyRecordDatabase.kt
index 4d006e7d36..0b9c999fe5 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiPreKeyRecordDatabase.kt
+++ b/src/org/thoughtcrime/securesms/loki/LokiPreKeyRecordDatabase.kt
@@ -5,6 +5,9 @@ import android.content.Context
import org.thoughtcrime.securesms.crypto.PreKeyUtil
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
+import org.thoughtcrime.securesms.loki.redesign.utilities.get
+import org.thoughtcrime.securesms.loki.redesign.utilities.getInt
+import org.thoughtcrime.securesms.loki.redesign.utilities.insertOrUpdate
import org.whispersystems.libsignal.state.PreKeyRecord
import org.whispersystems.signalservice.loki.messaging.LokiPreKeyRecordDatabaseProtocol
diff --git a/src/org/thoughtcrime/securesms/loki/LokiPublicChatManager.kt b/src/org/thoughtcrime/securesms/loki/LokiPublicChatManager.kt
index 01da3532ad..3552efb63f 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiPublicChatManager.kt
+++ b/src/org/thoughtcrime/securesms/loki/LokiPublicChatManager.kt
@@ -10,6 +10,7 @@ import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.database.DatabaseContentProviders
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.groups.GroupManager
+import org.thoughtcrime.securesms.loki.redesign.messaging.LokiPublicChatPoller
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.thoughtcrime.securesms.util.Util
import org.whispersystems.signalservice.loki.api.LokiPublicChat
diff --git a/src/org/thoughtcrime/securesms/loki/LokiThreadDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiThreadDatabase.kt
index 3dca0abaaa..5794255637 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiThreadDatabase.kt
+++ b/src/org/thoughtcrime/securesms/loki/LokiThreadDatabase.kt
@@ -7,6 +7,11 @@ import org.thoughtcrime.securesms.database.Address
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
+import org.thoughtcrime.securesms.loki.redesign.utilities.get
+import org.thoughtcrime.securesms.loki.redesign.utilities.getInt
+import org.thoughtcrime.securesms.loki.redesign.utilities.getLong
+import org.thoughtcrime.securesms.loki.redesign.utilities.getString
+import org.thoughtcrime.securesms.loki.redesign.utilities.insertOrUpdate
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.whispersystems.signalservice.internal.util.JsonUtil
diff --git a/src/org/thoughtcrime/securesms/loki/LokiUserDatabase.kt b/src/org/thoughtcrime/securesms/loki/LokiUserDatabase.kt
index e72d898ce3..ea412b52a1 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiUserDatabase.kt
+++ b/src/org/thoughtcrime/securesms/loki/LokiUserDatabase.kt
@@ -7,6 +7,8 @@ import android.util.Log
import org.thoughtcrime.securesms.database.Address
import org.thoughtcrime.securesms.database.Database
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper
+import org.thoughtcrime.securesms.loki.redesign.utilities.get
+import org.thoughtcrime.securesms.loki.redesign.utilities.insertOrUpdate
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.whispersystems.signalservice.loki.messaging.LokiUserDatabaseProtocol
diff --git a/src/org/thoughtcrime/securesms/loki/NewConversationActivity.kt b/src/org/thoughtcrime/securesms/loki/NewConversationActivity.kt
deleted file mode 100644
index 9ad53944a5..0000000000
--- a/src/org/thoughtcrime/securesms/loki/NewConversationActivity.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.Manifest
-import android.content.Intent
-import android.os.Bundle
-import android.view.MenuItem
-import android.widget.Toast
-import network.loki.messenger.R
-import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
-import org.thoughtcrime.securesms.conversation.ConversationActivity
-import org.thoughtcrime.securesms.database.Address
-import org.thoughtcrime.securesms.database.DatabaseFactory
-import org.thoughtcrime.securesms.database.ThreadDatabase
-import org.thoughtcrime.securesms.permissions.Permissions
-import org.thoughtcrime.securesms.qr.ScanListener
-import org.thoughtcrime.securesms.recipients.Recipient
-import org.thoughtcrime.securesms.util.DynamicTheme
-import org.thoughtcrime.securesms.util.TextSecurePreferences
-import org.whispersystems.signalservice.loki.utilities.Analytics
-import org.whispersystems.signalservice.loki.utilities.PublicKeyValidation
-
-class NewConversationActivity : PassphraseRequiredActionBarActivity(), ScanListener {
- private val dynamicTheme = DynamicTheme()
-
- override fun onPreCreate() {
- dynamicTheme.onCreate(this)
- }
-
- override fun onCreate(bundle: Bundle?, isReady: Boolean) {
- supportActionBar!!.setTitle(R.string.fragment_new_conversation_title)
- supportActionBar!!.setDisplayHomeAsUpEnabled(true)
- val fragment = NewConversationFragment()
- initFragment(android.R.id.content, fragment, null)
- }
-
- public override fun onResume() {
- super.onResume()
- dynamicTheme.onResume(this)
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (item.itemId == android.R.id.home) {
- onBackPressed()
- return true
- }
- return super.onOptionsItemSelected(item)
- }
-
- fun scanQRCode() {
- Permissions.with(this)
- .request(Manifest.permission.CAMERA)
- .ifNecessary()
- .withPermanentDenialDialog(getString(R.string.fragment_scan_qr_code_camera_permission_dialog_message))
- .onAllGranted {
- val fragment = ScanQRCodeFragment()
- fragment.scanListener = this
- supportFragmentManager.beginTransaction().replace(android.R.id.content, fragment).addToBackStack(null).commitAllowingStateLoss()
- }
- .onAnyDenied { Toast.makeText(this, R.string.fragment_scan_qr_code_camera_permission_dialog_message, Toast.LENGTH_SHORT).show() }
- .execute()
- }
-
- override fun onQrDataFound(hexEncodedPublicKey: String) {
- Analytics.shared.track("QR Code Scanned")
- startNewConversationIfPossible(hexEncodedPublicKey)
- }
-
- fun startNewConversationIfPossible(hexEncodedPublicKey: String) {
- if (!PublicKeyValidation.isValid(hexEncodedPublicKey)) { return Toast.makeText(this, R.string.fragment_new_conversation_invalid_public_key_message, Toast.LENGTH_SHORT).show() }
- val userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(this)
- // If we try to contact our master device then redirect to note to self
- val contactPublicKey = if (TextSecurePreferences.getMasterHexEncodedPublicKey(this) == hexEncodedPublicKey) userHexEncodedPublicKey else hexEncodedPublicKey
- val contact = Recipient.from(this, Address.fromSerialized(contactPublicKey), true)
- val intent = Intent(this, ConversationActivity::class.java)
- intent.putExtra(ConversationActivity.ADDRESS_EXTRA, contact.address)
- intent.putExtra(ConversationActivity.TEXT_EXTRA, getIntent().getStringExtra(ConversationActivity.TEXT_EXTRA))
- intent.setDataAndType(getIntent().data, getIntent().type)
- val existingThread = DatabaseFactory.getThreadDatabase(this).getThreadIdIfExistsFor(contact)
- intent.putExtra(ConversationActivity.THREAD_ID_EXTRA, existingThread)
- intent.putExtra(ConversationActivity.DISTRIBUTION_TYPE_EXTRA, ThreadDatabase.DistributionTypes.DEFAULT)
- Analytics.shared.track("New Conversation Started")
- startActivity(intent)
- finish()
- }
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/NewConversationFragment.kt b/src/org/thoughtcrime/securesms/loki/NewConversationFragment.kt
deleted file mode 100644
index 760534e905..0000000000
--- a/src/org/thoughtcrime/securesms/loki/NewConversationFragment.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.os.Bundle
-import android.support.v4.app.Fragment
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import kotlinx.android.synthetic.main.fragment_new_conversation.*
-import network.loki.messenger.R
-
-class NewConversationFragment : Fragment() {
-
- override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
- return inflater.inflate(R.layout.fragment_new_conversation, container, false)
- }
-
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- super.onViewCreated(view, savedInstanceState)
- qrCodeButton.setOnClickListener {
- val activity = activity as NewConversationActivity
- activity.scanQRCode()
- }
- nextButton.setOnClickListener {
- val activity = activity as NewConversationActivity
- val hexEncodedPublicKey = publicKeyEditText.text.toString().trim()
- activity.startNewConversationIfPossible(hexEncodedPublicKey)
- }
- }
-
- override fun onResume() {
- super.onResume()
- val activity = activity as NewConversationActivity
- activity.supportActionBar!!.setTitle(R.string.fragment_new_conversation_title)
- }
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/QRCodeDialog.kt b/src/org/thoughtcrime/securesms/loki/QRCodeDialog.kt
deleted file mode 100644
index 7a6003ba41..0000000000
--- a/src/org/thoughtcrime/securesms/loki/QRCodeDialog.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.content.Context
-import android.support.v7.app.AlertDialog
-import android.util.AttributeSet
-import android.util.DisplayMetrics
-import android.widget.LinearLayout
-import kotlinx.android.synthetic.main.view_qr_code.view.*
-import network.loki.messenger.R
-import org.thoughtcrime.securesms.qr.QrCode
-import org.thoughtcrime.securesms.util.ServiceUtil
-import org.thoughtcrime.securesms.util.TextSecurePreferences
-
-object QRCodeDialog {
-
- fun show(context: Context) {
- val view = QRCodeView(context)
- val dialog = AlertDialog.Builder(context).setView(view).show()
- view.onCancel = { dialog.dismiss() }
- }
-}
-
-class QRCodeView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : LinearLayout(context, attrs, defStyleAttr) {
- var onCancel: (() -> Unit)? = null
-
- constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
- constructor(context: Context) : this(context, null)
-
- init {
- inflate(context, R.layout.view_qr_code, this)
- val hexEncodedPublicKey = TextSecurePreferences.getMasterHexEncodedPublicKey(getContext()) ?: TextSecurePreferences.getLocalNumber(context)
- val displayMetrics = DisplayMetrics()
- ServiceUtil.getWindowManager(context).defaultDisplay.getMetrics(displayMetrics)
- val size = displayMetrics.widthPixels - 2 * toPx(96, resources)
- val qrCode = QrCode.create(hexEncodedPublicKey, size)
- qrCodeImageView.setImageBitmap(qrCode)
- cancelButton.setOnClickListener { onCancel?.invoke() }
- }
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/ScanQRCodeFragment.kt b/src/org/thoughtcrime/securesms/loki/ScanQRCodeFragment.kt
deleted file mode 100644
index 874f143ee7..0000000000
--- a/src/org/thoughtcrime/securesms/loki/ScanQRCodeFragment.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.content.res.Configuration
-import android.os.Bundle
-import android.support.v4.app.Fragment
-import android.support.v7.app.AppCompatActivity
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.LinearLayout
-import kotlinx.android.synthetic.main.fragment_scan_qr_code.*
-import network.loki.messenger.R
-import org.thoughtcrime.securesms.qr.ScanListener
-import org.thoughtcrime.securesms.qr.ScanningThread
-
-class ScanQRCodeFragment : Fragment() {
- private val scanningThread = ScanningThread()
- private var viewCreated = false
- var scanListener: ScanListener? = null
- set(value) { field = value; scanningThread.setScanListener(scanListener) }
- var mode: Mode = Mode.NewConversation
- set(value) { field = value; updateDescription(); }
-
- // region Types
- enum class Mode { NewConversation, LinkDevice }
- // endregion
-
- override fun onCreateView(layoutInflater: LayoutInflater, viewGroup: ViewGroup?, bundle: Bundle?): View? {
- return layoutInflater.inflate(R.layout.fragment_scan_qr_code, viewGroup, false)
- }
-
- override fun onViewCreated(view: View, bundle: Bundle?) {
- super.onViewCreated(view, bundle)
- viewCreated = true
- when (resources.configuration.orientation) {
- Configuration.ORIENTATION_LANDSCAPE -> overlayView.orientation = LinearLayout.HORIZONTAL
- else -> overlayView.orientation = LinearLayout.VERTICAL
- }
- updateDescription()
- }
-
- override fun onResume() {
- super.onResume()
- this.scanningThread.setScanListener(scanListener)
- this.cameraView.onResume()
- this.cameraView.setPreviewCallback(scanningThread)
- this.scanningThread.start()
- if (activity is AppCompatActivity) {
- val activity = activity as AppCompatActivity
- activity.supportActionBar?.setTitle(R.string.fragment_scan_qr_code_title)
- }
- }
-
- override fun onPause() {
- super.onPause()
- this.cameraView.onPause()
- this.scanningThread.stopScanning()
- }
-
- override fun onConfigurationChanged(newConfiguration: Configuration) {
- super.onConfigurationChanged(newConfiguration)
- this.cameraView.onPause()
- when (newConfiguration.orientation) {
- Configuration.ORIENTATION_LANDSCAPE -> overlayView.orientation = LinearLayout.HORIZONTAL
- else -> overlayView.orientation = LinearLayout.VERTICAL
- }
- cameraView.onResume()
- cameraView.setPreviewCallback(scanningThread)
- }
-
- fun updateDescription() {
- if (!viewCreated) { return }
- val text = when (mode) {
- Mode.NewConversation -> R.string.fragment_scan_qr_code_explanation_new_conversation
- Mode.LinkDevice -> R.string.fragment_scan_qr_code_explanation_link_device
- }
- descriptionTextView.setText(text)
- }
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/SeedActivity.kt b/src/org/thoughtcrime/securesms/loki/SeedActivity.kt
deleted file mode 100644
index 7d5f5d7785..0000000000
--- a/src/org/thoughtcrime/securesms/loki/SeedActivity.kt
+++ /dev/null
@@ -1,273 +0,0 @@
-package org.thoughtcrime.securesms.loki
-
-import android.Manifest
-import android.content.ClipData
-import android.content.ClipboardManager
-import android.content.Context
-import android.content.Intent
-import android.os.AsyncTask
-import android.os.Bundle
-import android.support.v4.app.FragmentManager
-import android.view.View
-import android.view.inputmethod.InputMethodManager
-import android.widget.Toast
-import kotlinx.android.synthetic.main.activity_seed.*
-import network.loki.messenger.R
-import org.thoughtcrime.securesms.ApplicationContext
-import org.thoughtcrime.securesms.BaseActionBarActivity
-import org.thoughtcrime.securesms.ConversationListActivity
-import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
-import org.thoughtcrime.securesms.database.Address
-import org.thoughtcrime.securesms.database.DatabaseFactory
-import org.thoughtcrime.securesms.database.IdentityDatabase
-import org.thoughtcrime.securesms.logging.Log
-import org.thoughtcrime.securesms.permissions.Permissions
-import org.thoughtcrime.securesms.qr.ScanListener
-import org.thoughtcrime.securesms.util.Hex
-import org.thoughtcrime.securesms.util.TextSecurePreferences
-import org.whispersystems.curve25519.Curve25519
-import org.whispersystems.libsignal.util.KeyHelper
-import org.whispersystems.signalservice.loki.api.PairingAuthorisation
-import org.whispersystems.signalservice.loki.crypto.MnemonicCodec
-import org.whispersystems.signalservice.loki.utilities.Analytics
-import org.whispersystems.signalservice.loki.utilities.PublicKeyValidation
-import org.whispersystems.signalservice.loki.utilities.hexEncodedPublicKey
-import org.whispersystems.signalservice.loki.utilities.retryIfNeeded
-import java.io.File
-import java.io.FileOutputStream
-
-class SeedActivity : BaseActionBarActivity(), DeviceLinkingDelegate, ScanListener {
- private lateinit var languageFileDirectory: File
- private var mode = Mode.Register
- set(newValue) { field = newValue; updateUI() }
- private var seed: ByteArray? = null
- set(newValue) { field = newValue; updateMnemonic() }
- private var mnemonic: String? = null
- set(newValue) { field = newValue; updateMnemonicTextView() }
-
- // region Types
- enum class Mode { Register, Restore, Link }
- // endregion
-
- // region Lifecycle
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.activity_seed)
- setUpLanguageFileDirectory()
- mnemonicEditText.input.imeOptions = mnemonicEditText.input.imeOptions or 16777216 // Always use incognito keyboard for this
- updateSeed()
- copyButton.setOnClickListener { copy() }
- toggleRegisterModeButton.setOnClickListener { mode = Mode.Register }
- toggleRestoreModeButton.setOnClickListener { mode = Mode.Restore }
- toggleLinkModeButton.setOnClickListener { mode = Mode.Link }
- mainButton.setOnClickListener { handleMainButtonTapped() }
- scanQRButton.setOnClickListener {
- Permissions.with(this)
- .request(Manifest.permission.CAMERA)
- .ifNecessary()
- .withPermanentDenialDialog(getString(R.string.fragment_scan_qr_code_camera_permission_dialog_message))
- .onAllGranted {
- val fragment = ScanQRCodeFragment()
- fragment.mode = ScanQRCodeFragment.Mode.LinkDevice
- fragment.scanListener = this
- supportFragmentManager.beginTransaction().replace(android.R.id.content, fragment).addToBackStack("QR").commitAllowingStateLoss()
- publicKeyEditText.clearFocus()
- val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
- inputMethodManager.hideSoftInputFromWindow(publicKeyEditText.windowToken, 0)
- }
- .onAnyDenied { Toast.makeText(this, R.string.fragment_scan_qr_code_camera_permission_dialog_message, Toast.LENGTH_SHORT).show() }
- .execute()
- }
- Analytics.shared.track("Seed Screen Viewed")
- }
- // endregion
-
- // region General
- private fun setUpLanguageFileDirectory() {
- val languages = listOf( "english", "japanese", "portuguese", "spanish" )
- val directory = File(applicationInfo.dataDir)
- for (language in languages) {
- val fileName = "$language.txt"
- if (directory.list().contains(fileName)) { continue }
- val inputStream = assets.open("mnemonic/$fileName")
- val file = File(directory, fileName)
- val outputStream = FileOutputStream(file)
- val buffer = ByteArray(1024)
- while (true) {
- val count = inputStream.read(buffer)
- if (count < 0) { break }
- outputStream.write(buffer, 0, count)
- }
- inputStream.close()
- outputStream.close()
- }
- languageFileDirectory = directory
- }
- // endregion
-
- // region Updating
- private fun updateSeed() {
- val seed = Curve25519.getInstance(Curve25519.BEST).generateSeed(16)
- try {
- IdentityKeyUtil.generateIdentityKeyPair(this, seed + seed)
- } catch (exception: Exception) {
- return updateSeed()
- }
- this.seed = seed
- }
-
- private fun updateUI() {
- val registerModeVisibility = if (mode == Mode.Register) View.VISIBLE else View.GONE
- val restoreModeVisibility = if (mode == Mode.Restore) View.VISIBLE else View.GONE
- val linkModeVisibility = if (mode == Mode.Link) View.VISIBLE else View.GONE
- seedExplanationTextView1.visibility = registerModeVisibility
- mnemonicTextView.visibility = registerModeVisibility
- copyButton.visibility = registerModeVisibility
- seedExplanationTextView2.visibility = restoreModeVisibility
- mnemonicEditText.visibility = restoreModeVisibility
- linkExplanationTextView.visibility = linkModeVisibility
- publicKeyEditText.visibility = linkModeVisibility
- scanQRButton.visibility = linkModeVisibility
- toggleRegisterModeButton.visibility = if (mode != Mode.Register) View.VISIBLE else View.GONE
- toggleRestoreModeButton.visibility = if (mode != Mode.Restore) View.VISIBLE else View.GONE
- toggleLinkModeButton.visibility = if (mode != Mode.Link) View.VISIBLE else View.GONE
- val mainButtonTitleID = when (mode) {
- Mode.Register -> R.string.activity_key_pair_main_button_title_1
- Mode.Restore -> R.string.activity_key_pair_main_button_title_2
- Mode.Link -> R.string.activity_key_pair_main_button_title_3
- }
- mainButton.setText(mainButtonTitleID)
- if (mode == Mode.Restore) {
- mnemonicEditText.requestFocus()
- } else {
- mnemonicEditText.clearFocus()
- val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
- inputMethodManager.hideSoftInputFromWindow(mnemonicEditText.windowToken, 0)
- }
- if (mode == Mode.Link) {
- publicKeyEditText.requestFocus()
- } else {
- publicKeyEditText.clearFocus()
- val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
- inputMethodManager.hideSoftInputFromWindow(publicKeyEditText.windowToken, 0)
- }
- }
-
- private fun updateMnemonic() {
- val hexEncodedSeed = Hex.toStringCondensed(seed)
- mnemonic = MnemonicCodec(languageFileDirectory).encode(hexEncodedSeed)
- }
-
- private fun updateMnemonicTextView() {
- mnemonicTextView.text = mnemonic!!
- }
- // endregion
-
- // region Interaction
- private fun copy() {
- val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
- val clip = ClipData.newPlainText("Mnemonic", mnemonic)
- clipboard.primaryClip = clip
- Toast.makeText(this, R.string.activity_key_pair_mnemonic_copied_message, Toast.LENGTH_SHORT).show()
- }
-
- private fun handleMainButtonTapped() {
- var seed: ByteArray
- when (mode) {
- Mode.Register -> seed = this.seed!!
- Mode.Restore -> {
- val mnemonic = mnemonicEditText.text.toString()
- try {
- val hexEncodedSeed = MnemonicCodec(languageFileDirectory).decode(mnemonic)
- seed = Hex.fromStringCondensed(hexEncodedSeed)
- } catch (e: Exception) {
- val message = if (e is MnemonicCodec.DecodingError) e.description else MnemonicCodec.DecodingError.Generic.description
- return Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
- }
- }
- Mode.Link -> {
- val hexEncodedPublicKey = publicKeyEditText.text.trim().toString()
- if (!PublicKeyValidation.isValid(hexEncodedPublicKey)) {
- return Toast.makeText(this, "Invalid public key", Toast.LENGTH_SHORT).show()
- }
- seed = this.seed!!
- }
- }
- val hexEncodedSeed = Hex.toStringCondensed(seed)
- IdentityKeyUtil.save(this, IdentityKeyUtil.lokiSeedKey, hexEncodedSeed)
- if (seed.count() == 16) seed += seed
- if (mode == Mode.Restore) {
- IdentityKeyUtil.generateIdentityKeyPair(this, seed)
- }
- val keyPair = IdentityKeyUtil.getIdentityKeyPair(this)
- val userHexEncodedPublicKey = keyPair.hexEncodedPublicKey
- val registrationID = KeyHelper.generateRegistrationId(false)
- TextSecurePreferences.setLocalRegistrationId(this, registrationID)
- DatabaseFactory.getIdentityDatabase(this).saveIdentity(Address.fromSerialized(userHexEncodedPublicKey), keyPair.publicKey,
- IdentityDatabase.VerifiedStatus.VERIFIED, true, System.currentTimeMillis(), true)
- TextSecurePreferences.setLocalNumber(this, userHexEncodedPublicKey)
- if (mode == Mode.Restore) {
- TextSecurePreferences.setRestorationTime(this, System.currentTimeMillis())
- }
- when (mode) {
- Mode.Register -> Analytics.shared.track("Seed Created")
- Mode.Restore -> Analytics.shared.track("Seed Restored")
- Mode.Link -> Analytics.shared.track("Device Linking Attempted")
- }
- if (mode == Mode.Link) {
- TextSecurePreferences.setHasSeenWelcomeScreen(this, true)
- TextSecurePreferences.setPromptedPushRegistration(this, true)
- val masterHexEncodedPublicKey = publicKeyEditText.text.trim().toString()
- val authorisation = PairingAuthorisation(masterHexEncodedPublicKey, userHexEncodedPublicKey).sign(PairingAuthorisation.Type.REQUEST, keyPair.privateKey.serialize())
- if (authorisation == null) {
- Log.d("Loki", "Failed to sign pairing request.")
- resetForRegistration()
- return Toast.makeText(application, "Couldn't start device linking process.", Toast.LENGTH_SHORT).show()
- }
- val application = ApplicationContext.getInstance(this)
- application.startLongPollingIfNeeded()
- application.setUpP2PAPI()
- application.setUpStorageAPIIfNeeded()
- DeviceLinkingDialog.show(this, DeviceLinkingView.Mode.Slave, this)
- AsyncTask.execute {
- retryIfNeeded(8) {
- sendPairingAuthorisationMessage(this@SeedActivity, authorisation.primaryDevicePublicKey, authorisation)
- }
- }
- } else {
- startActivity(Intent(this, DisplayNameActivity::class.java))
- finish()
- }
- }
-
- override fun handleDeviceLinkAuthorized(pairingAuthorisation: PairingAuthorisation) {
- Analytics.shared.track("Device Linked Successfully")
- if (pairingAuthorisation.secondaryDevicePublicKey == TextSecurePreferences.getLocalNumber(this)) {
- TextSecurePreferences.setMasterHexEncodedPublicKey(this, pairingAuthorisation.primaryDevicePublicKey)
- }
- startActivity(Intent(this, ConversationListActivity::class.java))
- finish()
- }
-
- override fun handleDeviceLinkingDialogDismissed() {
- resetForRegistration()
- }
-
- private fun resetForRegistration() {
- IdentityKeyUtil.delete(this, IdentityKeyUtil.lokiSeedKey)
- TextSecurePreferences.removeLocalNumber(this)
- TextSecurePreferences.setHasSeenWelcomeScreen(this, false)
- TextSecurePreferences.setPromptedPushRegistration(this, false)
- }
-
- override fun onQrDataFound(data: String?) {
- runOnUiThread {
- if (data != null && PublicKeyValidation.isValid(data.trim())) {
- publicKeyEditText.setText(data.trim())
- supportFragmentManager.popBackStackImmediate("QR", FragmentManager.POP_BACK_STACK_INCLUSIVE)
- handleMainButtonTapped()
- }
- }
- }
- // endregion
-}
\ No newline at end of file
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesLoader.kt b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesLoader.kt
index 7edca96d3d..324dd6362f 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesLoader.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesLoader.kt
@@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.loki.redesign.activities
import android.content.Context
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.devicelist.Device
-import org.thoughtcrime.securesms.loki.MnemonicUtilities
+import org.thoughtcrime.securesms.loki.redesign.utilities.MnemonicUtilities
import org.thoughtcrime.securesms.util.AsyncLoader
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.whispersystems.signalservice.loki.api.LokiStorageAPI
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceMasterModeDialog.kt b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceMasterModeDialog.kt
index b5f7090490..94f6c6de80 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceMasterModeDialog.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceMasterModeDialog.kt
@@ -12,7 +12,7 @@ import android.widget.LinearLayout
import kotlinx.android.synthetic.main.dialog_link_device_master_mode.view.*
import network.loki.messenger.R
import org.thoughtcrime.securesms.database.DatabaseFactory
-import org.thoughtcrime.securesms.loki.MnemonicUtilities
+import org.thoughtcrime.securesms.loki.redesign.utilities.MnemonicUtilities
import org.thoughtcrime.securesms.loki.redesign.utilities.QRCodeUtilities
import org.thoughtcrime.securesms.loki.toPx
import org.thoughtcrime.securesms.util.TextSecurePreferences
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceSlaveModeDialog.kt b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceSlaveModeDialog.kt
index d899ba6fdc..7f80c704a3 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceSlaveModeDialog.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/LinkDeviceSlaveModeDialog.kt
@@ -12,7 +12,7 @@ import android.view.View
import android.widget.LinearLayout
import kotlinx.android.synthetic.main.dialog_link_device_slave_mode.view.*
import network.loki.messenger.R
-import org.thoughtcrime.securesms.loki.MnemonicUtilities
+import org.thoughtcrime.securesms.loki.redesign.utilities.MnemonicUtilities
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.thoughtcrime.securesms.util.Util
import org.whispersystems.signalservice.loki.api.DeviceLinkingSession
diff --git a/src/org/thoughtcrime/securesms/loki/BackgroundPollWorker.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPollWorker.kt
similarity index 97%
rename from src/org/thoughtcrime/securesms/loki/BackgroundPollWorker.kt
rename to src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPollWorker.kt
index 6bcd4407f5..7d716345e9 100644
--- a/src/org/thoughtcrime/securesms/loki/BackgroundPollWorker.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPollWorker.kt
@@ -1,4 +1,4 @@
-package org.thoughtcrime.securesms.loki
+package org.thoughtcrime.securesms.loki.redesign.messaging
import android.content.Context
import android.content.Intent
diff --git a/src/org/thoughtcrime/securesms/loki/BackgroundPublicChatPollWorker.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPublicChatPollWorker.kt
similarity index 95%
rename from src/org/thoughtcrime/securesms/loki/BackgroundPublicChatPollWorker.kt
rename to src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPublicChatPollWorker.kt
index aa2788f923..130122c492 100644
--- a/src/org/thoughtcrime/securesms/loki/BackgroundPublicChatPollWorker.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPublicChatPollWorker.kt
@@ -1,4 +1,4 @@
-package org.thoughtcrime.securesms.loki
+package org.thoughtcrime.securesms.loki.redesign.messaging
import android.content.Context
import android.content.Intent
diff --git a/src/org/thoughtcrime/securesms/loki/LokiAPIUtilities.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiAPIUtilities.kt
similarity index 95%
rename from src/org/thoughtcrime/securesms/loki/LokiAPIUtilities.kt
rename to src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiAPIUtilities.kt
index aea9fd4573..e1895a5782 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiAPIUtilities.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiAPIUtilities.kt
@@ -1,4 +1,4 @@
-package org.thoughtcrime.securesms.loki
+package org.thoughtcrime.securesms.loki.redesign.messaging
import android.content.Context
import org.thoughtcrime.securesms.database.DatabaseFactory
diff --git a/src/org/thoughtcrime/securesms/loki/LokiPublicChatPoller.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiPublicChatPoller.kt
similarity index 99%
rename from src/org/thoughtcrime/securesms/loki/LokiPublicChatPoller.kt
rename to src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiPublicChatPoller.kt
index 954d8d3e06..7dc363c419 100644
--- a/src/org/thoughtcrime/securesms/loki/LokiPublicChatPoller.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiPublicChatPoller.kt
@@ -1,4 +1,4 @@
-package org.thoughtcrime.securesms.loki
+package org.thoughtcrime.securesms.loki.redesign.messaging
import android.content.Context
import android.os.Handler
diff --git a/src/org/thoughtcrime/securesms/loki/DatabaseUtilities.kt b/src/org/thoughtcrime/securesms/loki/redesign/utilities/DatabaseUtilities.kt
similarity index 96%
rename from src/org/thoughtcrime/securesms/loki/DatabaseUtilities.kt
rename to src/org/thoughtcrime/securesms/loki/redesign/utilities/DatabaseUtilities.kt
index 8f252feaaf..ced74ba467 100644
--- a/src/org/thoughtcrime/securesms/loki/DatabaseUtilities.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/utilities/DatabaseUtilities.kt
@@ -1,4 +1,4 @@
-package org.thoughtcrime.securesms.loki
+package org.thoughtcrime.securesms.loki.redesign.utilities
import android.content.ContentValues
import net.sqlcipher.Cursor
diff --git a/src/org/thoughtcrime/securesms/loki/MnemonicUtilities.kt b/src/org/thoughtcrime/securesms/loki/redesign/utilities/MnemonicUtilities.kt
similarity index 95%
rename from src/org/thoughtcrime/securesms/loki/MnemonicUtilities.kt
rename to src/org/thoughtcrime/securesms/loki/redesign/utilities/MnemonicUtilities.kt
index b5275725f5..b74396ab91 100644
--- a/src/org/thoughtcrime/securesms/loki/MnemonicUtilities.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/utilities/MnemonicUtilities.kt
@@ -1,4 +1,4 @@
-package org.thoughtcrime.securesms.loki
+package org.thoughtcrime.securesms.loki.redesign.utilities
import android.content.Context
import org.whispersystems.signalservice.loki.crypto.MnemonicCodec
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/views/ConversationView.kt b/src/org/thoughtcrime/securesms/loki/redesign/views/ConversationView.kt
index 2fb4760dfa..b60bf70b14 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/views/ConversationView.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/views/ConversationView.kt
@@ -9,7 +9,7 @@ import android.widget.LinearLayout
import kotlinx.android.synthetic.main.view_conversation.view.*
import network.loki.messenger.R
import org.thoughtcrime.securesms.database.model.ThreadRecord
-import org.thoughtcrime.securesms.loki.LokiAPIUtilities.populateUserHexEncodedPublicKeyCacheIfNeeded
+import org.thoughtcrime.securesms.loki.redesign.messaging.LokiAPIUtilities.populateUserHexEncodedPublicKeyCacheIfNeeded
import org.thoughtcrime.securesms.loki.redesign.utilities.MentionUtilities.highlightMentions
import org.thoughtcrime.securesms.mms.GlideRequests
import org.thoughtcrime.securesms.util.DateUtils
diff --git a/src/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java b/src/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java
index d0fc8e96d3..ba180a3f58 100644
--- a/src/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java
+++ b/src/org/thoughtcrime/securesms/preferences/widgets/ProfilePreference.java
@@ -20,10 +20,8 @@ import android.widget.Toast;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
-import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto;
-import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto;
import org.thoughtcrime.securesms.database.Address;
-import org.thoughtcrime.securesms.loki.MnemonicUtilities;
+import org.thoughtcrime.securesms.loki.redesign.utilities.MnemonicUtilities;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.TextSecurePreferences;