mirror of
https://github.com/oxen-io/session-android.git
synced 2025-12-03 08:22:39 +00:00
Fix device linking
This commit is contained in:
@@ -9,21 +9,34 @@ import android.support.v7.widget.LinearLayoutManager
|
||||
import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import kotlinx.android.synthetic.main.activity_linked_devices.*
|
||||
import network.loki.messenger.R
|
||||
import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||
import org.thoughtcrime.securesms.devicelist.Device
|
||||
import org.thoughtcrime.securesms.loki.DeviceListBottomSheetFragment
|
||||
import org.thoughtcrime.securesms.loki.redesign.dialogs.EditDeviceNameDialog
|
||||
import org.thoughtcrime.securesms.loki.redesign.dialogs.EditDeviceNameDialogDelegate
|
||||
import org.thoughtcrime.securesms.loki.redesign.dialogs.LinkDeviceMasterModeDialog
|
||||
import org.thoughtcrime.securesms.loki.redesign.dialogs.LinkDeviceMasterModeDialogDelegate
|
||||
import org.thoughtcrime.securesms.loki.signAndSendPairingAuthorisationMessage
|
||||
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, LoaderManager.LoaderCallbacks<List<Device>>, LinkDeviceMasterModeDialogDelegate {
|
||||
private val linkedDevicesAdapter = LinkedDevicesAdapter(this)
|
||||
class LinkedDevicesActivity : PassphraseRequiredActionBarActivity, LoaderManager.LoaderCallbacks<List<Device>>, DeviceClickListener, EditDeviceNameDialogDelegate, LinkDeviceMasterModeDialogDelegate {
|
||||
private var devices = listOf<Device>()
|
||||
set(value) { field = value; linkedDevicesAdapter.devices = value }
|
||||
|
||||
private val linkedDevicesAdapter by lazy {
|
||||
val result = LinkedDevicesAdapter(this)
|
||||
result.deviceClickListener = this
|
||||
result
|
||||
}
|
||||
|
||||
// region Lifecycle
|
||||
constructor() : super()
|
||||
|
||||
@@ -60,12 +73,16 @@ class LinkedDevicesActivity : PassphraseRequiredActionBarActivity, LoaderManager
|
||||
this.devices = devices
|
||||
emptyStateContainer.visibility = if (devices.isEmpty()) View.VISIBLE else View.GONE
|
||||
}
|
||||
|
||||
override fun handleDeviceNameChanged(device: Device) {
|
||||
LoaderManager.getInstance(this).restartLoader(0, null, this)
|
||||
}
|
||||
// endregion
|
||||
|
||||
// region Interaction
|
||||
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||
val id = item.itemId
|
||||
when (id) {
|
||||
when(id) {
|
||||
R.id.linkDeviceButton -> linkDevice()
|
||||
else -> { /* Do nothing */ }
|
||||
}
|
||||
@@ -86,11 +103,38 @@ class LinkedDevicesActivity : PassphraseRequiredActionBarActivity, LoaderManager
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDeviceClick(device: Device) {
|
||||
val bottomSheet = DeviceListBottomSheetFragment()
|
||||
bottomSheet.onEditTapped = {
|
||||
bottomSheet.dismiss()
|
||||
val editDeviceNameDialog = EditDeviceNameDialog()
|
||||
editDeviceNameDialog.device = device
|
||||
editDeviceNameDialog.delegate = this
|
||||
editDeviceNameDialog.show(supportFragmentManager, "Edit Device Name Dialog")
|
||||
}
|
||||
bottomSheet.onUnlinkTapped = {
|
||||
bottomSheet.dismiss()
|
||||
unlinkDevice(device.id)
|
||||
}
|
||||
bottomSheet.show(supportFragmentManager, bottomSheet.tag)
|
||||
}
|
||||
|
||||
private fun unlinkDevice(slaveDeviceHexEncodedPublicKey: String) {
|
||||
val userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(this)
|
||||
val database = DatabaseFactory.getLokiAPIDatabase(this)
|
||||
database.removePairingAuthorisation(userHexEncodedPublicKey, slaveDeviceHexEncodedPublicKey)
|
||||
LokiStorageAPI.shared.updateUserDeviceMappings().success {
|
||||
MessageSender.sendUnpairRequest(this, slaveDeviceHexEncodedPublicKey)
|
||||
}
|
||||
LoaderManager.getInstance(this).restartLoader(0, null, this)
|
||||
Toast.makeText(this, "Your device was unlinked successfully", Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
override fun onDeviceLinkRequestAuthorized(authorization: PairingAuthorisation) {
|
||||
AsyncTask.execute {
|
||||
signAndSendPairingAuthorisationMessage(this, authorization)
|
||||
Util.runOnMain {
|
||||
|
||||
LoaderManager.getInstance(this).restartLoader(0, null, this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.thoughtcrime.securesms.loki.redesign.views.DeviceView
|
||||
class LinkedDevicesAdapter(private val context: Context) : RecyclerView.Adapter<LinkedDevicesAdapter.ViewHolder>() {
|
||||
var devices = listOf<Device>()
|
||||
set(value) { field = value; notifyDataSetChanged() }
|
||||
var deviceClickListener: DeviceClickListener? = null
|
||||
|
||||
class ViewHolder(val view: DeviceView) : RecyclerView.ViewHolder(view)
|
||||
|
||||
@@ -23,6 +24,12 @@ class LinkedDevicesAdapter(private val context: Context) : RecyclerView.Adapter<
|
||||
|
||||
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
|
||||
val device = devices[position]
|
||||
viewHolder.view.setOnClickListener { deviceClickListener?.onDeviceClick(device) }
|
||||
viewHolder.view.bind(device)
|
||||
}
|
||||
}
|
||||
|
||||
interface DeviceClickListener {
|
||||
|
||||
fun onDeviceClick(device: Device)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package org.thoughtcrime.securesms.loki.redesign.dialogs
|
||||
|
||||
import android.app.Dialog
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.os.Bundle
|
||||
import android.support.v4.app.DialogFragment
|
||||
import android.support.v7.app.AlertDialog
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import kotlinx.android.synthetic.main.dialog_edit_device_name.view.*
|
||||
import network.loki.messenger.R
|
||||
import org.thoughtcrime.securesms.database.DatabaseFactory
|
||||
import org.thoughtcrime.securesms.devicelist.Device
|
||||
|
||||
class EditDeviceNameDialog : DialogFragment() {
|
||||
private lateinit var contentView: View
|
||||
var device: Device? = null
|
||||
var delegate: EditDeviceNameDialogDelegate? = null
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
val builder = AlertDialog.Builder(context!!)
|
||||
contentView = LayoutInflater.from(context!!).inflate(R.layout.dialog_edit_device_name, null)
|
||||
contentView.cancelButton.setOnClickListener { dismiss() }
|
||||
contentView.okButton.setOnClickListener { updateDeviceName() }
|
||||
builder.setView(contentView)
|
||||
val result = builder.create()
|
||||
result.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
return result
|
||||
}
|
||||
|
||||
private fun updateDeviceName() {
|
||||
DatabaseFactory.getLokiUserDatabase(context).setDisplayName(device!!.id, contentView.deviceNameEditText.text.toString())
|
||||
delegate?.handleDeviceNameChanged(device!!)
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
|
||||
interface EditDeviceNameDialogDelegate {
|
||||
|
||||
fun handleDeviceNameChanged(device: Device)
|
||||
}
|
||||
Reference in New Issue
Block a user