Compare commits

...

2 Commits

5 changed files with 46 additions and 28 deletions

View File

@ -28,9 +28,7 @@
</intent-filter> </intent-filter>
</receiver> </receiver>
<activity <activity android:name=".ChatActivity"/>
android:name=".ChatActivity"
android:windowSoftInputMode="adjustResize"/>
<activity android:name=".MainActivity"> <activity android:name=".MainActivity">
<intent-filter android:label="@string/share_label"> <intent-filter android:label="@string/share_label">
<action android:name="android.intent.action.SEND"/> <action android:name="android.intent.action.SEND"/>

View File

@ -23,6 +23,7 @@ import sushi.hardcore.aira.databinding.DialogFingerprintsBinding
import sushi.hardcore.aira.databinding.DialogInfoBinding import sushi.hardcore.aira.databinding.DialogInfoBinding
import sushi.hardcore.aira.utils.FileUtils import sushi.hardcore.aira.utils.FileUtils
import sushi.hardcore.aira.utils.StringUtils import sushi.hardcore.aira.utils.StringUtils
import java.io.FileNotFoundException
import java.util.* import java.util.*
class ChatActivity : AppCompatActivity() { class ChatActivity : AppCompatActivity() {
@ -39,15 +40,19 @@ class ChatActivity : AppCompatActivity() {
if (::airaService.isInitialized && uri != null) { if (::airaService.isInitialized && uri != null) {
contentResolver.query(uri, null, null, null, null)?.let { cursor -> contentResolver.query(uri, null, null, null, null)?.let { cursor ->
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
contentResolver.openInputStream(uri)?.let { inputStream -> try {
val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) contentResolver.openInputStream(uri)?.let { inputStream ->
val fileSize = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE)) val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME))
airaService.sendFileTo(sessionId, fileName, fileSize, inputStream)?.let { msg -> val fileSize = cursor.getLong(cursor.getColumnIndex(OpenableColumns.SIZE))
chatAdapter.newMessage(ChatItem(true, msg)) airaService.sendFileTo(sessionId, fileName, fileSize, inputStream)?.let { msg ->
} chatAdapter.newMessage(ChatItem(true, msg))
if (airaService.contacts.contains(sessionId)) { }
lastLoadedMessageOffset += 1 if (airaService.contacts.contains(sessionId)) {
lastLoadedMessageOffset += 1
}
} }
} catch (e: FileNotFoundException) {
Toast.makeText(this, e.localizedMessage, Toast.LENGTH_SHORT).show()
} }
} }
cursor.close() cursor.close()
@ -70,7 +75,9 @@ class ChatActivity : AppCompatActivity() {
chatAdapter = ChatAdapter(this@ChatActivity, ::onClickSaveFile) chatAdapter = ChatAdapter(this@ChatActivity, ::onClickSaveFile)
binding.recyclerChat.apply { binding.recyclerChat.apply {
adapter = chatAdapter adapter = chatAdapter
layoutManager = LinearLayoutManager(this@ChatActivity, LinearLayoutManager.VERTICAL, false) layoutManager = LinearLayoutManager(this@ChatActivity, LinearLayoutManager.VERTICAL, false).apply {
stackFromEnd = true
}
addOnScrollListener(object : RecyclerView.OnScrollListener() { addOnScrollListener(object : RecyclerView.OnScrollListener() {
fun loadMsgsIfNeeded(recyclerView: RecyclerView) { fun loadMsgsIfNeeded(recyclerView: RecyclerView) {
if (!recyclerView.canScrollVertically(-1) && ::airaService.isInitialized) { if (!recyclerView.canScrollVertically(-1) && ::airaService.isInitialized) {

View File

@ -10,6 +10,7 @@ import android.os.IBinder
import android.provider.OpenableColumns import android.provider.OpenableColumns
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View
import android.widget.AbsListView import android.widget.AbsListView
import android.widget.AdapterView import android.widget.AdapterView
import android.widget.Toast import android.widget.Toast
@ -30,7 +31,7 @@ class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding private lateinit var binding: ActivityMainBinding
private lateinit var airaService: AIRAService private lateinit var airaService: AIRAService
private lateinit var onlineSessionAdapter: SessionAdapter private lateinit var onlineSessionAdapter: SessionAdapter
private lateinit var offlineSessionAdapter: SessionAdapter private var offlineSessionAdapter: SessionAdapter? = null
private val onSessionsItemClick = AdapterView.OnItemClickListener { adapter, _, position, _ -> private val onSessionsItemClick = AdapterView.OnItemClickListener { adapter, _, position, _ ->
launchChatActivity(adapter.getItemAtPosition(position) as Session) launchChatActivity(adapter.getItemAtPosition(position) as Session)
} }
@ -55,7 +56,7 @@ class MainActivity : AppCompatActivity() {
runOnUiThread { runOnUiThread {
onlineSessionAdapter.remove(sessionId)?.let { session -> onlineSessionAdapter.remove(sessionId)?.let { session ->
if (session.isContact) { if (session.isContact) {
offlineSessionAdapter.add(session) offlineSessionAdapter?.add(session)
} }
} }
} }
@ -100,15 +101,20 @@ class MainActivity : AppCompatActivity() {
} }
setOnScrollListener(onSessionsScrollListener) setOnScrollListener(onSessionsScrollListener)
} }
offlineSessionAdapter = SessionAdapter(this) if (openedToShareFile) {
binding.offlineSessions.apply { binding.offlineSessions.visibility = View.GONE
adapter = offlineSessionAdapter binding.textOfflineSessions.visibility = View.GONE
onItemClickListener = if (openedToShareFile) { } else {
offlineSessionAdapter = SessionAdapter(this)
binding.offlineSessions.apply {
adapter = offlineSessionAdapter
onItemClickListener = if (openedToShareFile) {
onSessionsItemClickSendFile onSessionsItemClickSendFile
} else { } else {
onSessionsItemClick onSessionsItemClick
} }
setOnScrollListener(onSessionsScrollListener) setOnScrollListener(onSessionsScrollListener)
}
} }
Intent(this, AIRAService::class.java).also { serviceIntent -> Intent(this, AIRAService::class.java).also { serviceIntent ->
bindService(serviceIntent, object : ServiceConnection { bindService(serviceIntent, object : ServiceConnection {
@ -206,7 +212,7 @@ class MainActivity : AppCompatActivity() {
airaService.isAppInBackground = false airaService.isAppInBackground = false
airaService.uiCallbacks = uiCallbacks //restoring callbacks airaService.uiCallbacks = uiCallbacks //restoring callbacks
onlineSessionAdapter.reset() onlineSessionAdapter.reset()
offlineSessionAdapter.reset() offlineSessionAdapter?.reset()
loadContacts() loadContacts()
loadSessions() loadSessions()
title = airaService.identityName title = airaService.identityName
@ -217,8 +223,10 @@ class MainActivity : AppCompatActivity() {
} }
private fun loadContacts() { private fun loadContacts() {
for ((sessionId, contact) in airaService.contacts) { if (offlineSessionAdapter != null) {
offlineSessionAdapter.add(Session(sessionId, true, contact.verified, contact.seen, null, contact.name)) for ((sessionId, contact) in airaService.contacts) {
offlineSessionAdapter!!.add(Session(sessionId, true, contact.verified, contact.seen, null, contact.name))
}
} }
} }
@ -235,7 +243,7 @@ class MainActivity : AppCompatActivity() {
onlineSessionAdapter.add(Session(sessionId, false, false, seen, ip, airaService.savedNames[sessionId])) onlineSessionAdapter.add(Session(sessionId, false, false, seen, ip, airaService.savedNames[sessionId]))
} else { } else {
onlineSessionAdapter.add(Session(sessionId, true, contact.verified, seen, ip, contact.name)) onlineSessionAdapter.add(Session(sessionId, true, contact.verified, seen, ip, contact.name))
offlineSessionAdapter.remove(sessionId) offlineSessionAdapter?.remove(sessionId)
} }
} }

View File

@ -8,6 +8,7 @@ import android.net.nsd.NsdServiceInfo
import android.os.* import android.os.*
import android.os.Process.THREAD_PRIORITY_BACKGROUND import android.os.Process.THREAD_PRIORITY_BACKGROUND
import android.util.Log import android.util.Log
import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat import androidx.core.app.NotificationManagerCompat
@ -16,7 +17,6 @@ import sushi.hardcore.aira.*
import java.io.IOException import java.io.IOException
import java.io.InputStream import java.io.InputStream
import java.net.* import java.net.*
import java.nio.ByteBuffer
import java.nio.channels.* import java.nio.channels.*
class AIRAService : Service() { class AIRAService : Service() {
@ -143,10 +143,14 @@ class AIRAService : Service() {
return msg return msg
} }
} else { } else {
val fileTransfer = SendFileTransfer(fileName, fileSize, inputStream) if (sendFileTransfers[sessionId] == null && receiveFileTransfers[sessionId] == null) {
sendFileTransfers[sessionId] = fileTransfer val fileTransfer = SendFileTransfer(fileName, fileSize, inputStream)
createFileTransferNotification(sessionId, fileTransfer) sendFileTransfers[sessionId] = fileTransfer
sendTo(sessionId, Protocol.askLargeFile(fileSize, fileName)) createFileTransferNotification(sessionId, fileTransfer)
sendTo(sessionId, Protocol.askLargeFile(fileSize, fileName))
} else {
Toast.makeText(this, R.string.file_transfer_already_in_progress, Toast.LENGTH_SHORT).show()
}
} }
return null return null
} }

View File

@ -71,4 +71,5 @@
<string name="remove_contact">Remove contact</string> <string name="remove_contact">Remove contact</string>
<string name="details">Details</string> <string name="details">Details</string>
<string name="your_addresses">Your IP addresses:</string> <string name="your_addresses">Your IP addresses:</string>
<string name="file_transfer_already_in_progress">Another file transfer is already in progress</string>
</resources> </resources>