diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt
index 25c6dec9a4..54c80227a2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/CreatePrivateChatActivity.kt
@@ -1,5 +1,7 @@
package org.thoughtcrime.securesms.loki.activities
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
@@ -12,9 +14,14 @@ import android.view.*
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
-import kotlinx.android.synthetic.main.activity_create_private_chat.*
+import kotlinx.android.synthetic.main.activity_create_private_chat.loader
+import kotlinx.android.synthetic.main.activity_create_private_chat.tabLayout
+import kotlinx.android.synthetic.main.activity_create_private_chat.viewPager
import kotlinx.android.synthetic.main.fragment_enter_public_key.*
import network.loki.messenger.R
+import nl.komponents.kovenant.ui.failUi
+import nl.komponents.kovenant.ui.successUi
+import org.session.libsession.snode.SnodeAPI
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
import org.thoughtcrime.securesms.conversation.ConversationActivity
import org.session.libsession.utilities.Address
@@ -48,6 +55,23 @@ class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRC
}
// endregion
+ // region Updating
+ private fun showLoader() {
+ loader.visibility = View.VISIBLE
+ loader.animate().setDuration(150).alpha(1.0f).start()
+ }
+
+ private fun hideLoader() {
+ loader.animate().setDuration(150).alpha(0.0f).setListener(object : AnimatorListenerAdapter() {
+
+ override fun onAnimationEnd(animation: Animator?) {
+ super.onAnimationEnd(animation)
+ loader.visibility = View.GONE
+ }
+ })
+ }
+ // endregion
+
// region Interaction
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId) {
@@ -60,8 +84,27 @@ class CreatePrivateChatActivity : PassphraseRequiredActionBarActivity(), ScanQRC
createPrivateChatIfPossible(hexEncodedPublicKey)
}
- fun createPrivateChatIfPossible(hexEncodedPublicKey: String) {
- if (!PublicKeyValidation.isValid(hexEncodedPublicKey)) { return Toast.makeText(this, R.string.invalid_session_id, Toast.LENGTH_SHORT).show() }
+ fun createPrivateChatIfPossible(onsNameOrPublicKey: String) {
+ if (PublicKeyValidation.isValid(onsNameOrPublicKey)) {
+ createPrivateChat(onsNameOrPublicKey)
+ } else {
+ // This could be an ONS name
+ showLoader()
+ SnodeAPI.getSessionIDFor(onsNameOrPublicKey).successUi { hexEncodedPublicKey ->
+ hideLoader()
+ this.createPrivateChat(hexEncodedPublicKey)
+ }.failUi { exception ->
+ hideLoader()
+ var message = resources.getString(R.string.fragment_enter_public_key_error_message)
+ exception.localizedMessage?.let {
+ message = it
+ }
+ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
+ }
+ }
+ }
+
+ private fun createPrivateChat(hexEncodedPublicKey: String) {
val recipient = Recipient.from(this, Address.fromSerialized(hexEncodedPublicKey), false)
val intent = Intent(this, ConversationActivity::class.java)
intent.putExtra(ConversationActivity.ADDRESS_EXTRA, recipient.address)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt
index 7e4210246b..20f8fcf795 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/LinkDeviceActivity.kt
@@ -13,9 +13,6 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentPagerAdapter
import androidx.lifecycle.lifecycleScope
import com.google.android.material.snackbar.Snackbar
-import kotlinx.android.synthetic.main.activity_create_private_chat.*
-import kotlinx.android.synthetic.main.activity_create_private_chat.tabLayout
-import kotlinx.android.synthetic.main.activity_create_private_chat.viewPager
import kotlinx.android.synthetic.main.activity_link_device.*
import kotlinx.android.synthetic.main.conversation_activity.*
import kotlinx.android.synthetic.main.fragment_recovery_phrase.*
diff --git a/app/src/main/res/layout/activity_create_private_chat.xml b/app/src/main/res/layout/activity_create_private_chat.xml
index 6a1229648e..d437a230fc 100644
--- a/app/src/main/res/layout/activity_create_private_chat.xml
+++ b/app/src/main/res/layout/activity_create_private_chat.xml
@@ -1,14 +1,39 @@
-
+ android:layout_height="match_parent">
-
+ android:layout_height="match_parent" >
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8db4cfaf30..b8d6c578d4 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -719,8 +719,9 @@
Scan QR Code
Scan a user\'s QR code to start a session. QR codes can be found by tapping the QR code icon in account settings.
- Enter Session ID of recipient
+ Enter Session ID or ONS name
Users can share their Session ID by going into their account settings and tapping "Share Session ID", or by sharing their QR code.
+ Please check the Session ID or ONS name and try again.
Session needs camera access to scan QR codes
Grant Camera Access
diff --git a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt
index 4f6aca389d..a188b4a5a8 100644
--- a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt
+++ b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt
@@ -430,7 +430,7 @@ object OnionRequestAPI {
/**
* Sends an onion request to `snode`. Builds new paths as needed.
*/
- internal fun sendOnionRequest(method: Snode.Method, parameters: Map<*, *>, snode: Snode, publicKey: String): Promise