srctree

Robin Lindén parent 54295eeb 84ae5bbd
Refactor ToxThread to use Android's looper worker

inlinesplit
app/src/main/java/ltd/evilcorp/atox/Tox.kt added: 76, removed: 73, total 3
@@ -80,10 +80,8 @@ class Tox(options: ToxOptions) {
tox.addTcpRelay(address, port, publicKey)
}
 
fun iterate(): Int {
tox.iterate(NoToxEventListener(), null)
return tox.iterationInterval()
}
fun iterate(): Int = tox.iterate(NoToxEventListener(), 42)
fun iterationInterval(): Int = tox.iterationInterval()
 
fun setName(name: String) {
tox.name = name.toByteArray()
 
app/src/main/java/ltd/evilcorp/atox/ToxThread.kt added: 76, removed: 73, total 3
@@ -1,11 +1,11 @@
package ltd.evilcorp.atox
 
import android.os.Handler
import android.os.HandlerThread
import android.util.Log
import im.tox.tox4j.core.options.ProxyOptions
import im.tox.tox4j.core.options.SaveDataOptions
import im.tox.tox4j.core.options.ToxOptions
import kotlin.concurrent.thread
import java.util.concurrent.atomic.AtomicBoolean
 
private const val HEX_CHARS = "0123456789ABCDEF"
 
@@ -19,66 +19,74 @@ private fun String.hexToByteArray(): ByteArray {
return bytes
}
 
class ToxThread(dest: String) {
class ToxThread(saveDestination: String, saveOption: SaveDataOptions) : HandlerThread("Tox") {
companion object {
private const val msgIterate = 0
const val msgSave = 1
const val msgSetName = 2
}
 
private var thread: Thread? = null
private val saveDest: String = dest
private var needSave: AtomicBoolean = AtomicBoolean(false)
private val tox = Tox(
ToxOptions(
true,
true,
true,
ProxyOptions.`None$`(),
0,
0,
0,
saveOption,
true
)
)
 
fun start(saveOption: SaveDataOptions) {
Log.e("ToxThread", "Starting tox thread")
thread = thread(start = true, name = "Tox") {
val tox = Tox(
ToxOptions(
true,
true,
true,
ProxyOptions.`None$`(),
0,
0,
0,
saveOption,
val handler: Handler by lazy {
Handler(looper) {
when (it.what) {
msgIterate -> {
tox.iterate()
handler.sendEmptyMessageDelayed(msgIterate, tox.iterationInterval().toLong())
true
)
)
 
tox.bootstrap(
"tox.verdict.gg",
33445,
"1C5293AEF2114717547B39DA8EA6F1E331E5E358B35F9B6B5F19317911C5F976".hexToByteArray()
)
tox.bootstrap(
"tox.kurnevsky.net",
33445,
"82EF82BA33445A1F91A7DB27189ECFC0C013E06E3DA71F588ED692BED625EC23".hexToByteArray()
)
tox.bootstrap(
"tox.abilinski.com",
33445,
"10C00EB250C3233E343E2AEBA07115A5C28920E9C8D29492F6D00B29049EDC7E".hexToByteArray()
)
 
tox.setName(App.profile)
 
Log.e("Profile", tox.getName())
 
while (true) {
if (needSave.get()) {
tox.save(saveDest, false)
needSave.set(false)
}
 
Thread.sleep(tox.iterate().toLong())
msgSave -> {
Log.e("ToxThread", "Save")
tox.save(saveDestination, false)
true
}
msgSetName -> {
Log.e("ToxThread", "SetName: ${it.obj as String}")
tox.setName(it.obj as String)
true
}
else -> {
Log.e("ToxThread", "Unknown message: ${it.what}")
false
}
}
}
}
 
fun triggerSave() {
needSave.set(true)
init {
start()
}
 
fun stop() {
Log.e("ToxThread", "Killing tox thread")
thread!!.stop()
override fun onLooperPrepared() {
tox.bootstrap(
"tox.verdict.gg",
33445,
"1C5293AEF2114717547B39DA8EA6F1E331E5E358B35F9B6B5F19317911C5F976".hexToByteArray()
)
tox.bootstrap(
"tox.kurnevsky.net",
33445,
"82EF82BA33445A1F91A7DB27189ECFC0C013E06E3DA71F588ED692BED625EC23".hexToByteArray()
)
tox.bootstrap(
"tox.abilinski.com",
33445,
"10C00EB250C3233E343E2AEBA07115A5C28920E9C8D29492F6D00B29049EDC7E".hexToByteArray()
)
 
handler.sendEmptyMessage(msgIterate)
}
}
 
app/src/main/java/ltd/evilcorp/atox/activity/ProfileActivity.kt added: 76, removed: 73, total 3
@@ -1,9 +1,9 @@
package ltd.evilcorp.atox.activity
 
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.os.Message
import android.support.v7.app.AppCompatActivity
import im.tox.tox4j.core.options.SaveDataOptions
import kotlinx.android.synthetic.main.activity_profile.*
import ltd.evilcorp.atox.App
@@ -20,28 +20,21 @@ private fun loadToxSave(saveFile: File): ByteArray? {
}
 
class ProfileActivity : AppCompatActivity() {
 
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
 
App.toxThread = ToxThread(filesDir.toString())
 
var profile: File? = null
filesDir.walk().forEach {
if (it.extension.equals("tox") && it.isFile) {
if (it.extension == "tox" && it.isFile) {
profile = it
App.profile = it.nameWithoutExtension
Log.e("Profile", "Found profile: ${profile.toString()}")
}
}
 
if (profile != null) {
var saveOption: SaveDataOptions = SaveDataOptions.`None$`()
val data = loadToxSave(profile!!)
if (data != null) {
saveOption = SaveDataOptions.`ToxSave`(data)
App.toxThread.start(saveOption)
Log.e("Profile", "Skipping create profile")
App.toxThread = ToxThread(filesDir.toString(), SaveDataOptions.ToxSave(data))
startActivity(Intent(this, ContactListActivity::class.java))
finish()
}
@@ -53,9 +46,13 @@ class ProfileActivity : AppCompatActivity() {
App.profile = if (username.text.isNotEmpty()) username.text.toString() else "aTox user"
App.password = if (password.text.isNotEmpty()) password.text.toString() else ""
startActivity(Intent(this@ProfileActivity, ContactListActivity::class.java))
App.toxThread = ToxThread(filesDir.toString(), SaveDataOptions.`None$`())
 
App.toxThread.start(SaveDataOptions.`None$`())
App.toxThread.triggerSave()
val nameChangeMsg = Message()
nameChangeMsg.what = ToxThread.msgSetName
nameChangeMsg.obj = App.profile
App.toxThread.handler.sendMessage(nameChangeMsg)
App.toxThread.handler.sendEmptyMessage(ToxThread.msgSave)
 
finish()
}