srctree

Robin Lindén parent 1f96ed8b 261315e8
Implement adding contacts

inlinesplit
app/src/main/java/ltd/evilcorp/atox/Tox.kt added: 88, removed: 20, total 68
@@ -91,6 +91,10 @@ class Tox(options: ToxOptions) {
return String(tox.name)
}
 
fun addContact(toxId: String, message: String) {
tox.addFriend(toxId.hexToByteArray(), message.toByteArray())
}
 
fun save(destination: String, encrypt: Boolean) {
val fileName = this.getName() + ".tox"
 
 
filename was Deleted added: 88, removed: 20, total 68
@@ -0,0 +1,3 @@
package ltd.evilcorp.atox
 
data class MsgAddContact(val toxId: String, val message: String)
 
app/src/main/java/ltd/evilcorp/atox/ToxThread.kt added: 88, removed: 20, total 68
@@ -7,23 +7,12 @@ import im.tox.tox4j.core.options.ProxyOptions
import im.tox.tox4j.core.options.SaveDataOptions
import im.tox.tox4j.core.options.ToxOptions
 
private const val HEX_CHARS = "0123456789ABCDEF"
 
private fun String.hexToByteArray(): ByteArray {
val bytes = ByteArray(length / 2)
 
for (i in 0 until length step 2) {
bytes[i.shr(1)] = HEX_CHARS.indexOf(this[i]).shl(4).or(HEX_CHARS.indexOf(this[i + 1])).toByte()
}
 
return bytes
}
 
class ToxThread(saveDestination: String, saveOption: SaveDataOptions) : HandlerThread("Tox") {
companion object {
private const val msgIterate = 0
const val msgSave = 1
const val msgSetName = 2
const val msgAddContact = 3
}
 
private val tox = Tox(
@@ -58,6 +47,12 @@ class ToxThread(saveDestination: String, saveOption: SaveDataOptions) : HandlerT
tox.setName(it.obj as String)
true
}
msgAddContact -> {
val addContact = it.obj as MsgAddContact
Log.e("ToxThread", "AddContact: ${addContact.toxId} ${addContact.message}")
tox.addContact(addContact.toxId, addContact.message)
true
}
else -> {
Log.e("ToxThread", "Unknown message: ${it.what}")
false
 
filename was Deleted added: 88, removed: 20, total 68
@@ -0,0 +1,13 @@
package ltd.evilcorp.atox
 
private const val HEX_CHARS = "0123456789ABCDEF"
 
fun String.hexToByteArray(): ByteArray {
val bytes = ByteArray(length / 2)
 
for (i in 0 until length step 2) {
bytes[i.shr(1)] = HEX_CHARS.indexOf(this[i]).shl(4).or(HEX_CHARS.indexOf(this[i + 1])).toByte()
}
 
return bytes
}
 
app/src/main/java/ltd/evilcorp/atox/activity/AddContactActivity.kt added: 88, removed: 20, total 68
@@ -1,12 +1,61 @@
package ltd.evilcorp.atox.activity
 
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Message
import android.support.v7.app.AppCompatActivity
import android.text.Editable
import android.text.TextWatcher
import android.widget.Button
import android.widget.EditText
import ltd.evilcorp.atox.App
import ltd.evilcorp.atox.MsgAddContact
import ltd.evilcorp.atox.R
import ltd.evilcorp.atox.ToxThread
 
class AddContactActivity : AppCompatActivity() {
private val toxId: EditText by lazy {
findViewById<EditText>(R.id.toxId)
}
private val message: EditText by lazy {
findViewById<EditText>(R.id.message)
}
private val addBtn: Button by lazy {
findViewById<Button>(R.id.add)
}
 
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_contact)
 
toxId.addTextChangedListener(object: TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
val content = s?.toString()
// TODO(robinlinden): Checksum error check.
toxId.error = if (content?.length == 76) null else getString(R.string.tox_id_error_length)
addBtn.isEnabled = toxId.error == null
}
})
 
message.addTextChangedListener(object: TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
val content = s?.toString()
message.error = if (content?.length != 0) null else getString(R.string.add_contact_message_error_empty)
addBtn.isEnabled = message.error == null
}
})
 
addBtn.setOnClickListener {
val addContactMsg = Message()
addContactMsg.what = ToxThread.msgAddContact
addContactMsg.obj = MsgAddContact(toxId.text.toString(), message.text.toString())
App.toxThread.handler.sendMessage(addContactMsg)
App.toxThread.handler.sendEmptyMessage(ToxThread.msgSave)
finish()
}
addBtn.isEnabled = false
}
}
 
app/src/main/res/layout/activity_add_contact.xml added: 88, removed: 20, total 68
@@ -36,6 +36,7 @@
android:hint="@string/message"
android:inputType="textMultiLine"
android:lines="5"
android:text="@string/add_contact_message_default"
app:layout_constraintTop_toBottomOf="@id/toxId"
app:layout_constraintHorizontal_bias="0.5"/>
<Button
 
app/src/main/res/values/strings.xml added: 88, removed: 20, total 68
@@ -1,6 +1,8 @@
<resources>
<string name="add">Add</string>
<string name="add_contact">Add contact</string>
<string name="add_contact_message_default">Talk to me on aTox like a reasonable human being.</string>
<string name="add_contact_message_error_empty">Message can\'t be empty</string>
<string name="app_name">aTox</string>
<string name="create">Create</string>
<string name="create_a_tox_profile">Create a Tox profile</string>
@@ -11,4 +13,5 @@
<string name="password_optional">Password (optional)</string>
<string name="send">Send</string>
<string name="tox_id">Tox ID</string>
<string name="tox_id_error_length">ToxID must be 76 characters</string>
</resources>