srctree

Robin Lindén parent d67b4c17 0464a554
Clean up Tox code

inlinesplit
app/src/main/java/ltd/evilcorp/atox/di/ToxFactory.kt added: 84, removed: 104, total 0
@@ -1,18 +1,16 @@
package ltd.evilcorp.atox.di
 
import android.content.Context
import ltd.evilcorp.atox.tox.SaveManager
import ltd.evilcorp.atox.tox.SaveOptions
import ltd.evilcorp.atox.tox.Tox
import ltd.evilcorp.atox.tox.ToxEventListener
import ltd.evilcorp.atox.tox.SaveManager
import javax.inject.Inject
import javax.inject.Singleton
 
@Singleton
class ToxFactory @Inject constructor(
private val context: Context,
private val eventListener: ToxEventListener,
private val saveManager: SaveManager
) {
fun create(saveOption: SaveOptions) = Tox(context, eventListener, saveManager, saveOption)
fun create(saveOption: SaveOptions) = Tox(eventListener, saveManager, saveOption)
}
 
app/src/main/java/ltd/evilcorp/atox/di/ToxThreadFactory.kt added: 84, removed: 104, total 0
@@ -15,7 +15,7 @@ class ToxThreadFactory @Inject constructor(
private val userRepository: UserRepository,
private val toxFactory: ToxFactory
) {
var instance: ToxThread? = null
private var instance: ToxThread? = null
 
fun create(saveOption: SaveOptions): ToxThread {
if (instance == null) {
 
app/src/main/java/ltd/evilcorp/atox/tox/Tox.kt added: 84, removed: 104, total 0
@@ -1,12 +1,12 @@
package ltd.evilcorp.atox.tox
 
import android.content.Context
import android.util.Log
import im.tox.tox4j.core.enums.ToxMessageType
import im.tox.tox4j.impl.jni.ToxCoreImpl
 
private const val TAG = "Tox"
 
class Tox(
private val context: Context,
private val eventListener: ToxEventListener,
private val saveManager: SaveManager,
options: SaveOptions
@@ -27,33 +27,29 @@ class Tox(
}
 
fun iterate(): Int = tox.iterate(eventListener, 42)
fun iterationInterval(): Int = tox.iterationInterval()
fun iterationInterval(): Long = tox.iterationInterval().toLong()
 
fun getName(): String = String(tox.name)
fun setName(name: String) {
tox.name = name.toByteArray()
}
 
fun getName(): String {
return String(tox.name)
}
 
fun getStatusMessage(): String = String(tox.statusMessage)
 
fun getToxId(): String = tox.address.byteArrayToHex()
fun getPublicKey(): String = tox.publicKey.byteArrayToHex()
fun getToxId(): String = tox.address.bytesToHex()
fun getPublicKey(): String = tox.publicKey.bytesToHex()
 
fun addContact(toxId: String, message: String) {
tox.addFriend(toxId.hexToByteArray(), message.toByteArray())
tox.addFriend(toxId.hexToBytes(), message.toByteArray())
updateContactMapping()
}
 
fun deleteContact(publicKey: String) {
Log.e("Tox", "Deleting $publicKey")
tox.friendList.find { tox.getFriendPublicKey(it).byteArrayToHex() == publicKey }?.let { friend ->
Log.e(TAG, "Deleting $publicKey")
tox.friendList.find { tox.getFriendPublicKey(it).bytesToHex() == publicKey }?.let { friend ->
tox.deleteFriend(friend)
} ?: Log.e(
"Tox",
"Tried to delete nonexistent contact, this can happen if the database is out of sync with the Tox save"
TAG, "Tried to delete nonexistent contact, this can happen if the database is out of sync with the Tox save"
)
 
updateContactMapping()
@@ -61,26 +57,24 @@ class Tox(
 
fun getContacts(): List<Pair<String, Int>> {
val friendNumbers = tox.friendList
Log.e("Tox", "Loading ${friendNumbers.size} friends")
Log.i(TAG, "Loading ${friendNumbers.size} friends")
return List(friendNumbers.size) {
Log.e("Tox", "${friendNumbers[it]}: ${tox.getFriendPublicKey(friendNumbers[it]).byteArrayToHex()}")
Pair(tox.getFriendPublicKey(friendNumbers[it]).byteArrayToHex(), friendNumbers[it])
Log.i(TAG, "${friendNumbers[it]}: ${tox.getFriendPublicKey(friendNumbers[it]).bytesToHex()}")
Pair(tox.getFriendPublicKey(friendNumbers[it]).bytesToHex(), friendNumbers[it])
}
}
 
fun sendMessage(publicKey: String, message: String): Int {
return tox.friendSendMessage(
tox.friendByPublicKey(publicKey.hexToByteArray()),
ToxMessageType.NORMAL,
0,
message.toByteArray()
)
}
fun sendMessage(publicKey: String, message: String): Int = tox.friendSendMessage(
tox.friendByPublicKey(publicKey.hexToBytes()),
ToxMessageType.NORMAL,
0,
message.toByteArray()
)
 
fun save() = saveManager.save(getPublicKey(), tox.savedata)
 
fun acceptFriendRequest(publicKey: String) {
tox.addFriendNorequest(publicKey.hexToByteArray())
tox.addFriendNorequest(publicKey.hexToBytes())
updateContactMapping()
}
}
 
app/src/main/java/ltd/evilcorp/atox/tox/ToxEventListener.kt added: 84, removed: 104, total 0
@@ -20,6 +20,8 @@ import java.text.DateFormat
import java.util.*
import javax.inject.Inject
 
private const val TAG = "ToxEventListener"
 
class ToxEventListener @Inject constructor(
private val contactRepository: ContactRepository,
private val friendRequestRepository: FriendRequestRepository,
@@ -42,51 +44,48 @@ class ToxEventListener @Inject constructor(
}
 
override fun friendLosslessPacket(friendNumber: Int, data: ByteArray, state: Int?): Int {
return Log.e("ToxCore", "friendLosslessPacket")
return Log.e(TAG, "friendLosslessPacket")
}
 
override fun fileRecvControl(friendNumber: Int, fileNumber: Int, control: ToxFileControl, state: Int?): Int {
return Log.e("ToxCore", "fileRecvControl")
return Log.e(TAG, "fileRecvControl")
}
 
override fun friendStatusMessage(friendNumber: Int, message: ByteArray, state: Int?): Int {
with(contactByFriendNumber(friendNumber)) {
this.statusMessage = String(message)
contactRepository.add(this)
contactByFriendNumber(friendNumber).let {
contactRepository.update(it.apply { statusMessage = String(message) })
}
 
return Log.e("ToxCore", "friendStatusMessage")
return Log.e(TAG, "friendStatusMessage")
}
 
override fun friendReadReceipt(friendNumber: Int, messageId: Int, state: Int?): Int {
return Log.e("ToxCore", "friendReadReceipt")
return Log.e(TAG, "friendReadReceipt")
}
 
override fun friendStatus(friendNumber: Int, status: ToxUserStatus, state: Int?): Int {
with(contactByFriendNumber(friendNumber)) {
this.status = status.toUserStatus()
contactRepository.add(this)
override fun friendStatus(friendNumber: Int, toxStatus: ToxUserStatus, state: Int?): Int {
contactByFriendNumber(friendNumber).let {
contactRepository.update(it.apply { status = toxStatus.toUserStatus() })
}
 
return Log.e("ToxCore", "friendStatus")
return Log.e(TAG, "friendStatus")
}
 
override fun friendConnectionStatus(friendNumber: Int, connectionStatus: ToxConnection, state: Int?): Int {
with(contactByFriendNumber(friendNumber)) {
this.connectionStatus = connectionStatus.toConnectionStatus()
contactRepository.add(this)
override fun friendConnectionStatus(friendNumber: Int, toxConnectionStatus: ToxConnection, state: Int?): Int {
contactByFriendNumber(friendNumber).let {
contactRepository.update(it.apply { connectionStatus = toxConnectionStatus.toConnectionStatus() })
}
 
return Log.e("ToxCore", "friendConnectionStatus")
return Log.e(TAG, "friendConnectionStatus")
}
 
override fun friendRequest(publicKey: ByteArray, timeDelta: Int, message: ByteArray, state: Int?): Int {
FriendRequest(publicKey.byteArrayToHex(), String(message)).also {
FriendRequest(publicKey.bytesToHex(), String(message)).also {
friendRequestRepository.add(it)
notificationHelper.showFriendRequestNotification(it)
}
 
return Log.e("ToxCore", "friendRequest")
return Log.e(TAG, "friendRequest")
}
 
override fun friendMessage(
@@ -96,29 +95,28 @@ class ToxEventListener @Inject constructor(
message: ByteArray,
state: Int?
): Int {
with(contactByFriendNumber(friendNumber)) {
lastMessage = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(Date())
contactRepository.add(this)
contactByFriendNumber(friendNumber).let {
contactRepository.update(it.apply {
lastMessage = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(Date())
})
messageRepository.add(Message(it.publicKey, String(message), Sender.Received))
 
messageRepository.add(Message(this.publicKey, String(message), Sender.Received))
 
notificationHelper.showMessageNotification(this, String(message))
notificationHelper.showMessageNotification(it, String(message))
}
 
return Log.e("ToxCore", "friendMessage")
return Log.e(TAG, "friendMessage")
}
 
override fun friendName(friendNumber: Int, name: ByteArray, state: Int?): Int {
with(contactByFriendNumber(friendNumber)) {
this.name = String(name)
contactRepository.add(this)
override fun friendName(friendNumber: Int, newName: ByteArray, state: Int?): Int {
contactByFriendNumber(friendNumber).let {
contactRepository.update(it.apply { name = String(newName) })
}
 
return Log.e("ToxCore", "friendName")
return Log.e(TAG, "friendName")
}
 
override fun fileRecvChunk(friendNumber: Int, fileNumber: Int, position: Long, data: ByteArray, state: Int?): Int {
return Log.e("ToxCore", "fileRecvChunk")
return Log.e(TAG, "fileRecvChunk")
}
 
override fun fileRecv(
@@ -129,28 +127,27 @@ class ToxEventListener @Inject constructor(
filename: ByteArray,
state: Int?
): Int {
return Log.e("ToxCore", "fileRecv")
return Log.e(TAG, "fileRecv")
}
 
override fun friendLossyPacket(friendNumber: Int, data: ByteArray, state: Int?): Int {
return Log.e("ToxCore", "friendLossyPacket")
return Log.e(TAG, "friendLossyPacket")
}
 
override fun selfConnectionStatus(connectionStatus: ToxConnection, state: Int?): Int {
userRepository.updateConnection(App.toxThread.publicKey, connectionStatus.toConnectionStatus())
return Log.e("ToxCore", "selfConnectionStatus $connectionStatus")
return Log.e(TAG, "selfConnectionStatus $connectionStatus")
}
 
override fun friendTyping(friendNumber: Int, isTyping: Boolean, state: Int?): Int {
with(contactByFriendNumber(friendNumber)) {
typing = isTyping
contactRepository.add(this)
contactByFriendNumber(friendNumber).let {
contactRepository.update(it.apply { typing = isTyping })
}
 
return Log.e("ToxCore", "friendTyping")
return Log.e(TAG, "friendTyping")
}
 
override fun fileChunkRequest(friendNumber: Int, fileNumber: Int, position: Long, length: Int, state: Int?): Int {
return Log.e("ToxCore", "fileChunkRequest")
return Log.e(TAG, "fileChunkRequest")
}
}
 
app/src/main/java/ltd/evilcorp/atox/tox/ToxThread.kt added: 84, removed: 104, total 0
@@ -36,7 +36,7 @@ class ToxThread(
fun iterateForever() = launch {
while (true) {
iterate()
delay(tox.iterationInterval().toLong())
delay(tox.iterationInterval())
}
}
 
@@ -87,17 +87,17 @@ class ToxThread(
tox.bootstrap(
"tox.verdict.gg",
33445,
"1C5293AEF2114717547B39DA8EA6F1E331E5E358B35F9B6B5F19317911C5F976".hexToByteArray()
"1C5293AEF2114717547B39DA8EA6F1E331E5E358B35F9B6B5F19317911C5F976".hexToBytes()
)
tox.bootstrap(
"tox.kurnevsky.net",
33445,
"82EF82BA33445A1F91A7DB27189ECFC0C013E06E3DA71F588ED692BED625EC23".hexToByteArray()
"82EF82BA33445A1F91A7DB27189ECFC0C013E06E3DA71F588ED692BED625EC23".hexToBytes()
)
tox.bootstrap(
"tox.abilinski.com",
33445,
"10C00EB250C3233E343E2AEBA07115A5C28920E9C8D29492F6D00B29049EDC7E".hexToByteArray()
"10C00EB250C3233E343E2AEBA07115A5C28920E9C8D29492F6D00B29049EDC7E".hexToBytes()
)
}
}
 
app/src/main/java/ltd/evilcorp/atox/tox/ToxUtil.kt added: 84, removed: 104, total 0
@@ -8,19 +8,10 @@ import im.tox.tox4j.core.options.ToxOptions
import ltd.evilcorp.core.vo.ConnectionStatus
import ltd.evilcorp.core.vo.UserStatus
 
fun String.hexToByteArray(): ByteArray =
chunked(2).map { it.toUpperCase().toInt(16).toByte() }.toByteArray()
 
fun ByteArray.byteArrayToHex(): String = this.joinToString("") { "%02X".format(it) }
 
fun ToxUserStatus.toUserStatus(): UserStatus {
return UserStatus.values()[this.ordinal]
}
 
fun ToxConnection.toConnectionStatus(): ConnectionStatus {
return ConnectionStatus.values()[this.ordinal]
}
 
fun String.hexToBytes(): ByteArray = this.chunked(2).map { it.toUpperCase().toInt(16).toByte() }.toByteArray()
fun ByteArray.bytesToHex(): String = this.joinToString("") { "%02X".format(it) }
fun ToxUserStatus.toUserStatus(): UserStatus = UserStatus.values()[this.ordinal]
fun ToxConnection.toConnectionStatus(): ConnectionStatus = ConnectionStatus.values()[this.ordinal]
fun SaveOptions.toToxOptions(): ToxOptions = ToxOptions(
true,
true,
 
app/src/test/java/ltd/evilcorp/atox/ToxUtilTest.kt added: 84, removed: 104, total 0
@@ -2,8 +2,8 @@ package ltd.evilcorp.atox
 
import im.tox.tox4j.core.enums.ToxConnection
import im.tox.tox4j.core.enums.ToxUserStatus
import ltd.evilcorp.atox.tox.byteArrayToHex
import ltd.evilcorp.atox.tox.hexToByteArray
import ltd.evilcorp.atox.tox.bytesToHex
import ltd.evilcorp.atox.tox.hexToBytes
import ltd.evilcorp.atox.tox.toConnectionStatus
import ltd.evilcorp.atox.tox.toUserStatus
import ltd.evilcorp.core.vo.ConnectionStatus
@@ -45,25 +45,25 @@ class ToxUtilTest {
@Test
fun public_keys_can_be_converted() {
val keyString = "76518406F6A9F2217E8DC487CC783C25CC16A15EB36FF32E335A235342C48A39"
assert(keyString.hexToByteArray().size == 32)
assertEquals(keyString, keyString.hexToByteArray().byteArrayToHex().toUpperCase())
assert(keyString.hexToBytes().size == 32)
assertEquals(keyString, keyString.hexToBytes().bytesToHex().toUpperCase())
 
val keyBytes = byteArrayOf(
0x76, 0x51, 0x84, 0x06, 0xF6, 0xA9, 0xF2, 0x21, 0x7E, 0x8D, 0xC4, 0x87, 0xCC, 0x78, 0x3C, 0x25,
0xCC, 0x16, 0xA1, 0x5E, 0xB3, 0x6F, 0xF3, 0x2E, 0x33, 0x5A, 0x23, 0x53, 0x42, 0xC4, 0x8A, 0x39
)
 
assertEquals(keyBytes.size, keyString.hexToByteArray().size)
assert(keyBytes.contentEquals(keyString.hexToByteArray()))
assertEquals(keyBytes.size, keyString.hexToBytes().size)
assert(keyBytes.contentEquals(keyString.hexToBytes()))
 
val anotherKeyString = "7B6704162C6532A5A8F0840A3680672D0E9D3E62B6419FFD88D9880669482169"
assertEquals(anotherKeyString, anotherKeyString.hexToByteArray().byteArrayToHex().toUpperCase())
assertNotEquals(anotherKeyString.hexToByteArray(), keyString.hexToByteArray())
assertEquals(anotherKeyString, anotherKeyString.hexToBytes().bytesToHex().toUpperCase())
assertNotEquals(anotherKeyString.hexToBytes(), keyString.hexToBytes())
}
 
@Test
fun casing_of_public_keys_does_not_matter() {
val keyString = "76518406F6A9F2217E8DC487CC783C25CC16A15EB36FF32E335A235342C48A39"
assertArrayEquals(keyString.toUpperCase().hexToByteArray(), keyString.toLowerCase().hexToByteArray())
assertArrayEquals(keyString.toUpperCase().hexToBytes(), keyString.toLowerCase().hexToBytes())
}
}