Hooked up dialog ui

This commit is contained in:
Mikunj 2019-10-01 15:35:52 +10:00
parent 258ad57c12
commit 80e9b8223a
2 changed files with 63 additions and 32 deletions

View File

@ -1047,8 +1047,6 @@ public class PushDecryptJob extends BaseJob implements InjectableType {
boolean valid = isAuthorisationValid(authorisation);
LokiDeviceLinkingSession linkingSession = LokiDeviceLinkingSession.Companion.getShared();
if (valid && linkingSession.isListeningForLinkingRequest()) {
// Save to the database and trigger the event
DatabaseFactory.getLokiAPIDatabase(context).insertOrUpdatePairingAuthorisation(authorisation);
linkingSession.receivedLinkingRequest(authorisation);
} else {
// Remove pre key bundle from the user

View File

@ -11,7 +11,13 @@ import android.view.View
import android.widget.LinearLayout
import kotlinx.android.synthetic.main.view_device_linking.view.*
import network.loki.messenger.R
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.w3c.dom.Text
import org.whispersystems.signalservice.loki.api.LokiDeviceLinkingSession
import org.whispersystems.signalservice.loki.api.LokiPairingAuthorisation
import org.whispersystems.signalservice.loki.api.LokiStorageAPI
import org.whispersystems.signalservice.loki.crypto.MnemonicCodec
import org.whispersystems.signalservice.loki.utilities.removing05PrefixIfNeeded
import java.io.File
@ -30,6 +36,7 @@ class DeviceLinkingView private constructor(context: Context, attrs: AttributeSe
private var delegate: DeviceLinkingDialogDelegate? = null
private lateinit var languageFileDirectory: File
var dismiss: (() -> Unit)? = null
private var pairingAuthorisation: LokiPairingAuthorisation? = null
// region Types
enum class Mode { Master, Slave }
@ -46,10 +53,7 @@ class DeviceLinkingView private constructor(context: Context, attrs: AttributeSe
}
setUpLanguageFileDirectory()
setUpViewHierarchy()
when (mode) {
Mode.Master -> Log.d("Loki", "TODO: DeviceLinkingSession.startListeningForLinkingRequests(this)")
Mode.Slave -> Log.d("Loki", "TODO: DeviceLinkingSession.startListeningForAuthorization(this)")
}
LokiDeviceLinkingSession.shared.startListeningForLinkingRequests()
}
private fun setUpLanguageFileDirectory() {
@ -92,14 +96,29 @@ class DeviceLinkingView private constructor(context: Context, attrs: AttributeSe
mnemonicTextView.text = MnemonicCodec(languageFileDirectory).encode(hexEncodedPublicKey).split(" ").slice(0 until 3).joinToString(" ")
}
authorizeButton.visibility = View.GONE
authorizeButton.setOnClickListener { authorizeDeviceLink() }
cancelButton.setOnClickListener { cancel() }
}
// endregion
// region Device Linking
private fun requestUserAuthorization() { // TODO: deviceLink parameter
private fun requestUserAuthorization(authorisation: LokiPairingAuthorisation) {
// To be called by DeviceLinkingSession when a linking request has been received
// TODO: this.deviceLink = deviceLink
if (this.pairingAuthorisation != null) {
Log.e("Loki", "Received request for another pairing authorisation when one was active")
return
}
if (!authorisation.verify()) {
Log.w("Loki", "Received authorisation but it was not valid.")
return
}
this.pairingAuthorisation = authorisation
// Stop listening to any more requests
LokiDeviceLinkingSession.shared.stopListeningForLinkingRequests()
spinner.visibility = View.GONE
val titleTextViewLayoutParams = titleTextView.layoutParams as LayoutParams
titleTextViewLayoutParams.topMargin = toPx(16, resources)
@ -107,30 +126,38 @@ class DeviceLinkingView private constructor(context: Context, attrs: AttributeSe
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
val hexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context).removing05PrefixIfNeeded() // TODO: deviceLink.slave.hexEncodedPublicKey.removing05PrefixIfNeeded()
val hexEncodedPublicKey = authorisation.secondaryDevicePubKey.removing05PrefixIfNeeded()
mnemonicTextView.text = MnemonicCodec(languageFileDirectory).encode(hexEncodedPublicKey).split(" ").slice(0 until 3).joinToString(" ")
authorizeButton.visibility = View.VISIBLE
}
private fun authorizeDeviceLink() {
// TODO: val deviceLink = this.deviceLink!!
// TODO: val linkingAuthorizationMessage = DeviceLinkingUtilities.getLinkingAuthorizationMessage(deviceLink)
// TODO: Send the linking authorization message
// TODO: val session = DeviceLinkingSession.current!!
// TODO: session.stopListeningForLinkingRequests()
// TODO: session.markLinkingRequestAsProcessed()
dismiss?.invoke()
// TODO: val master = DeviceLink.Device(deviceLink.master.hexEncodedPublicKey, linkingAuthorizationMessage.masterSignature)
// TODO: val signedDeviceLink = DeviceLink(master, deviceLink.slave)
// TODO: LokiStorageAPI.addDeviceLink(signedDeviceLink).fail { error ->
// TODO: Log.d("Loki", "Failed to add device link due to error: $error.")
// TODO: }
if (pairingAuthorisation == null) { return; }
val authorisation = pairingAuthorisation!!
val userPrivateKey = IdentityKeyUtil.getIdentityKeyPair(context).privateKey.serialize()
val signedAuthorisation = authorisation.sign(LokiPairingAuthorisation.Type.GRANT, userPrivateKey)
if (signedAuthorisation == null) {
Log.e("Loki", "Failed to sign grant authorisation")
return
}
// TODO: Send authorisation message
// Add the auth to the database
DatabaseFactory.getLokiAPIDatabase(context).insertOrUpdatePairingAuthorisation(signedAuthorisation)
// Update the api
LokiStorageAPI.shared?.updateOurDeviceMappings()
dismiss()
}
private fun handleDeviceLinkAuthorized() { // TODO: deviceLink parameter
// To be called by DeviceLinkingSession when a device link has been authorized
// TODO: val session = DeviceLinkingSession.current!!
// TODO: session.stopListeningForLinkingAuthorization()
// Pairings get automatically added to the database when we receive them
LokiDeviceLinkingSession.shared.stopListeningForLinkingRequests()
spinner.visibility = View.GONE
val titleTextViewLayoutParams = titleTextView.layoutParams as LayoutParams
titleTextViewLayoutParams.topMargin = toPx(8, resources)
@ -143,23 +170,29 @@ class DeviceLinkingView private constructor(context: Context, attrs: AttributeSe
titleTextView.text = resources.getString(R.string.view_device_linking_title_4)
mnemonicTextView.visibility = View.GONE
buttonContainer.visibility = View.GONE
// TODO: LokiStorageAPI.addDeviceLink(signedDeviceLink).fail { error ->
// TODO: Log.d("Loki", "Failed to add device link due to error: $error.")
// TODO: }
Handler().postDelayed({
delegate?.handleDeviceLinkAuthorized()
dismiss?.invoke()
dismiss()
}, 4000)
}
// endregion
// region Interaction
private fun cancel() {
// TODO: val session = DeviceLinkingSession.current!!
// TODO: session.stopListeningForLinkingRequests()
// TODO: session.markLinkingRequestAsProcessed() // Only relevant in master mode
delegate?.handleDeviceLinkingDialogDismissed() // Only relevant in slave mode
private fun dismiss() {
LokiDeviceLinkingSession.shared.stopListeningForLinkingRequests()
dismiss?.invoke()
}
private fun cancel() {
if (mode == Mode.Master && pairingAuthorisation != null) {
val authorisation = pairingAuthorisation!!
// Remove pre key bundle from the requesting device
DatabaseFactory.getLokiPreKeyBundleDatabase(context).removePreKeyBundle(authorisation.secondaryDevicePubKey)
}
delegate?.handleDeviceLinkingDialogDismissed() // Only relevant in slave mode
dismiss()
}
// endregion
}