diff --git a/res/layout/dialog_edit_device_name.xml b/res/layout/dialog_edit_device_name.xml
new file mode 100644
index 0000000000..1805bca21a
--- /dev/null
+++ b/res/layout/dialog_edit_device_name.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout/fragment_device_list_bottom_sheet.xml b/res/layout/fragment_device_list_bottom_sheet.xml
index 5c1092fa65..77717bf242 100644
--- a/res/layout/fragment_device_list_bottom_sheet.xml
+++ b/res/layout/fragment_device_list_bottom_sheet.xml
@@ -1,22 +1,28 @@
-
+ app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
+ android:background="@color/dialog_background">
+ android:textSize="@dimen/medium_font_size"
+ android:textColor="@color/text"
+ android:text="Change name"/>
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt
index abc2aca483..a728c007c4 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesActivity.kt
@@ -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>, LinkDeviceMasterModeDialogDelegate {
- private val linkedDevicesAdapter = LinkedDevicesAdapter(this)
+class LinkedDevicesActivity : PassphraseRequiredActionBarActivity, LoaderManager.LoaderCallbacks>, DeviceClickListener, EditDeviceNameDialogDelegate, LinkDeviceMasterModeDialogDelegate {
private var devices = listOf()
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)
}
}
}
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesAdapter.kt b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesAdapter.kt
index 646c7cd41d..cb406ff8d1 100644
--- a/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesAdapter.kt
+++ b/src/org/thoughtcrime/securesms/loki/redesign/activities/LinkedDevicesAdapter.kt
@@ -9,6 +9,7 @@ import org.thoughtcrime.securesms.loki.redesign.views.DeviceView
class LinkedDevicesAdapter(private val context: Context) : RecyclerView.Adapter() {
var devices = listOf()
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)
+}
diff --git a/src/org/thoughtcrime/securesms/loki/redesign/dialogs/EditDeviceNameDialog.kt b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/EditDeviceNameDialog.kt
new file mode 100644
index 0000000000..a863cf10d7
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/loki/redesign/dialogs/EditDeviceNameDialog.kt
@@ -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)
+}
\ No newline at end of file