je crois que ça envoie des images
This commit is contained in:
parent
cd4e674759
commit
3adeb82b41
|
@ -1,6 +1,5 @@
|
|||
package xyz.johnny.norntalk
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.os.AsyncTask
|
||||
|
@ -10,10 +9,7 @@ import android.view.View
|
|||
import android.widget.Toast
|
||||
import com.google.zxing.integration.android.IntentIntegrator
|
||||
import kotlinx.android.synthetic.main.activity_compose.*
|
||||
import xyz.johnny.norntalk.messages.NornContact
|
||||
import xyz.johnny.norntalk.messages.NornConversation
|
||||
import xyz.johnny.norntalk.messages.NornMessage
|
||||
import xyz.johnny.norntalk.messages.NornMessageDispatcher
|
||||
import xyz.johnny.norntalk.messages.*
|
||||
import xyz.johnny.norntalk.security.QRCode
|
||||
import xyz.johnny.norntalk.ui_components.ComposeView
|
||||
import xyz.johnny.norntalk.ui_components.NornCaptureActivity
|
||||
|
@ -30,7 +26,7 @@ class ComposeActivity : ComposeView.SendActivity() {
|
|||
|
||||
companion object {
|
||||
|
||||
class SendTask(context: Context, val number: String, val text: String) : AsyncTask<Void, Void, NornMessage?>() {
|
||||
class SendTask(context: Context, val number: String, val text: String, val medias: ArrayList<NornMedia>) : AsyncTask<Void, Void, NornMessage?>() {
|
||||
|
||||
val context = WeakReference<Context>(context)
|
||||
|
||||
|
@ -43,6 +39,9 @@ class ComposeActivity : ComposeView.SendActivity() {
|
|||
val conversation = NornConversation.Companion.getConversation(contacts, context)
|
||||
// créer le message
|
||||
val msg = NornMessage(this.text, conversation, Date(), context)
|
||||
for (media in medias)
|
||||
msg.medias.add(media)
|
||||
|
||||
// envoyer le message
|
||||
msg.send(context)
|
||||
return msg
|
||||
|
@ -78,7 +77,7 @@ class ComposeActivity : ComposeView.SendActivity() {
|
|||
|
||||
override val layout = R.layout.activity_compose
|
||||
|
||||
override fun sendMessage(text: String) {
|
||||
override fun sendMessage(text: String, medias: ArrayList<NornMedia>) {
|
||||
// trouver le destinataire saisi par l'utilisateur
|
||||
val dest = number.text.toString()
|
||||
|
||||
|
@ -89,7 +88,7 @@ class ComposeActivity : ComposeView.SendActivity() {
|
|||
}
|
||||
|
||||
// envoyer le message en parallèle
|
||||
SendTask(this, dest, text).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
|
||||
SendTask(this, dest, text, medias).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
|
||||
}
|
||||
|
||||
override fun startActivity(intent: Intent) {
|
||||
|
|
|
@ -13,10 +13,7 @@ import kotlinx.android.synthetic.main.view_compose.*
|
|||
import xyz.johnny.norntalk.R.id.action_mute
|
||||
import xyz.johnny.norntalk.R.id.action_secure
|
||||
import xyz.johnny.norntalk.database.NornDatabase
|
||||
import xyz.johnny.norntalk.messages.NornContact
|
||||
import xyz.johnny.norntalk.messages.NornConversation
|
||||
import xyz.johnny.norntalk.messages.NornMessage
|
||||
import xyz.johnny.norntalk.messages.NornMessageDispatcher
|
||||
import xyz.johnny.norntalk.messages.*
|
||||
import xyz.johnny.norntalk.ui_components.ComposeView
|
||||
import xyz.johnny.norntalk.ui_components.DismissableActivity
|
||||
import xyz.johnny.norntalk.ui_components.NornMessageAdapter
|
||||
|
@ -70,15 +67,17 @@ class ConversationActivity: ComposeView.SendActivity() {
|
|||
|
||||
}
|
||||
|
||||
class SendTask(activity: ConversationActivity, val text: String) : AsyncTask<Void, Void, NornMessage>() {
|
||||
class SendTask(activity: ConversationActivity, val text: String, val medias: ArrayList<NornMedia>) : AsyncTask<Void, Void, NornMessage>() {
|
||||
|
||||
val activity = WeakReference<ConversationActivity>(activity)
|
||||
|
||||
override fun doInBackground(vararg params: Void): NornMessage {
|
||||
val activity = this.activity.get()!!
|
||||
val msg = NornMessage(text, activity.conversation, Date(), activity)
|
||||
msg.send(activity)
|
||||
for (media in medias)
|
||||
msg.medias.add(media)
|
||||
|
||||
msg.send(activity)
|
||||
return msg
|
||||
}
|
||||
|
||||
|
@ -136,9 +135,9 @@ class ConversationActivity: ComposeView.SendActivity() {
|
|||
this.title = this.conversation.name
|
||||
}
|
||||
|
||||
override fun sendMessage(text: String) {
|
||||
override fun sendMessage(text: String, medias: ArrayList<NornMedia>) {
|
||||
// envoyer le message en arrière plan
|
||||
SendTask(this, text).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
|
||||
SendTask(this, text, medias).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
|
||||
}
|
||||
|
||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||
|
@ -240,8 +239,8 @@ class ConversationActivity: ComposeView.SendActivity() {
|
|||
}
|
||||
|
||||
override fun onResume() {
|
||||
DismissableActivity.dismiss()
|
||||
super.onResume()
|
||||
DismissableActivity.dismiss()
|
||||
// ne plus montrer les notifications concernant la conversation actuelle lorsque l'activité
|
||||
// est au premier plan
|
||||
foreground_activities.add(this.conversation.id)
|
||||
|
|
|
@ -1,28 +1,58 @@
|
|||
package xyz.johnny.norntalk.messages
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import xyz.johnny.norntalk.database.NornDatabase
|
||||
import xyz.johnny.norntalk.database.entities.Media
|
||||
import xyz.johnny.norntalk.security.Curve
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.FileInputStream
|
||||
|
||||
|
||||
/**
|
||||
* Classe permettant de gérer un document contenu dans un MMS
|
||||
*/
|
||||
class NornMedia(data: ByteArray?, val mimeType: String, name: String?) {
|
||||
class NornMedia private constructor(context: Context, val mimeType: String) {
|
||||
|
||||
private var _data: ByteArray? = null
|
||||
private var uri: Uri? = null
|
||||
private var _name: String = "media_" + System.currentTimeMillis()
|
||||
val name get() = _name
|
||||
|
||||
constructor(context: Context, mimeType: String, uri: Uri) : this(context, mimeType) {
|
||||
this.uri = uri
|
||||
}
|
||||
|
||||
constructor(context: Context, data: ByteArray, mimeType: String, name: String): this(context, mimeType) {
|
||||
this._data = data
|
||||
this._name = name
|
||||
}
|
||||
|
||||
private val data: ByteArray by lazy {
|
||||
this._data ?: readFileFromUri(context, this.uri!!)
|
||||
}
|
||||
|
||||
private fun readFileFromUri(context: Context, uri: Uri): ByteArray {
|
||||
val data = ByteArrayOutputStream()
|
||||
val tempByteArray = ByteArray(1024*1024)
|
||||
context.contentResolver.openFileDescriptor(uri, "r").use { desc ->
|
||||
FileInputStream(desc.fileDescriptor).use { inputStream ->
|
||||
inputStream.read(tempByteArray)
|
||||
data.write(tempByteArray)
|
||||
}
|
||||
}
|
||||
return data.toByteArray()
|
||||
}
|
||||
|
||||
var _data = data
|
||||
val data get() = _data!!
|
||||
|
||||
companion object {
|
||||
|
||||
fun from(media: Media): NornMedia {
|
||||
return NornMedia(media.data, media.type, media.name)
|
||||
fun from(context: Context, media: Media): NornMedia {
|
||||
return NornMedia(context, media.data, media.type, media.name)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
val name = name ?: "media_%d".format(System.currentTimeMillis())
|
||||
|
||||
/**
|
||||
* Insérer le document dans la base de données
|
||||
*
|
||||
|
|
|
@ -158,7 +158,7 @@ class NornMessage constructor(text: String?, var ciphertext: String?, sender: St
|
|||
NornDatabase.Helper(context).run { db ->
|
||||
synchronized(mediaLock) {
|
||||
val medias = db.mediaDao().getMediasFromMessage(this.id)
|
||||
this._medias = ArrayList(medias.map { NornMedia.from(it) })
|
||||
this._medias = ArrayList(medias.map { NornMedia.from(context, it) })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -244,7 +244,7 @@ class NornTransaction constructor(private val context: Context) {
|
|||
// create the medias to send
|
||||
val data = ArrayList<MMSPart>()
|
||||
|
||||
// add any extra media according to their mimeType set in the message
|
||||
// add any extra medias according to their mimeType set in the message
|
||||
// eg. videos, audio, contact cards, location maybe?
|
||||
for (m in message.medias) {
|
||||
val part = MMSPart()
|
||||
|
@ -593,7 +593,7 @@ class NornTransaction constructor(private val context: Context) {
|
|||
private fun addTextPart(pb: PduBody, p: MMSPart, id: Int): Int {
|
||||
val filename = p.Name
|
||||
val part = PduPart()
|
||||
// Set Charset if it's a text media.
|
||||
// Set Charset if it's a text medias.
|
||||
if (p.MimeType.startsWith("text")) {
|
||||
part.charset = CharacterSets.UTF_8
|
||||
}
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
package xyz.johnny.norntalk.ui_components
|
||||
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.util.AttributeSet
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.Toast
|
||||
import kotlinx.android.synthetic.main.view_compose.*
|
||||
import xyz.johnny.norntalk.messages.NornMedia
|
||||
|
||||
|
||||
/**
|
||||
|
@ -22,6 +27,18 @@ class ComposeView: View {
|
|||
*/
|
||||
abstract class SendActivity : DismissableActivity() {
|
||||
|
||||
companion object {
|
||||
|
||||
const val PICK_PICTURE_REQUEST = 10
|
||||
|
||||
}
|
||||
|
||||
protected val medias = ArrayList<NornMedia>()
|
||||
|
||||
override fun initialize() {
|
||||
super.initialize()
|
||||
this.buttonPicture.setOnClickListener { this.pickPicture() }
|
||||
}
|
||||
/**
|
||||
* Envoyer le message et vider le champs de texte
|
||||
*
|
||||
|
@ -30,15 +47,35 @@ class ComposeView: View {
|
|||
fun sendMessage(view: View) {
|
||||
val text = composeInput.text.toString()
|
||||
this.composeInput.text.clear()
|
||||
this.sendMessage(text)
|
||||
this.sendMessage(text, this.medias)
|
||||
}
|
||||
|
||||
fun pickPicture() {
|
||||
Log.d(this::class.java.simpleName, "start picker")
|
||||
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
||||
intent.addCategory(Intent.CATEGORY_OPENABLE)
|
||||
intent.type = "image/*"
|
||||
this.startActivityForResult(intent, PICK_PICTURE_REQUEST)
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
if (requestCode == PICK_PICTURE_REQUEST && resultCode == Activity.RESULT_OK && data != null) {
|
||||
val uri = data.data
|
||||
val mimeType = this.contentResolver.getType(uri)
|
||||
this.medias.add(NornMedia(this, mimeType, uri))
|
||||
Toast.makeText(this, uri.toString(), Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
}
|
||||
|
||||
/**
|
||||
* Envoyer le message [text] au destinataire souhaité
|
||||
* Envoyer le message [text] avec les documents [medias] au destinataire souhaité
|
||||
*
|
||||
* @param text Le contenu du message
|
||||
* @param text Contenu du message
|
||||
* @param medias Documents à envoyer
|
||||
*/
|
||||
abstract fun sendMessage(text: String)
|
||||
abstract fun sendMessage(text: String, medias: ArrayList<NornMedia>)
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,6 @@ abstract class DismissableActivity : BaseActivity() {
|
|||
override fun onStop() {
|
||||
super.onStop()
|
||||
dismissables.add(this)
|
||||
this.finish()
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
|
|
9
app/src/main/res/drawable/ic_photo.xml
Normal file
9
app/src/main/res/drawable/ic_photo.xml
Normal file
|
@ -0,0 +1,9 @@
|
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z"/>
|
||||
</vector>
|
|
@ -19,7 +19,7 @@
|
|||
android:minLines="1"
|
||||
android:scrollbars="vertical"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/buttonSend"
|
||||
app:layout_constraintEnd_toStartOf="@+id/buttonPicture"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
|
@ -37,4 +37,17 @@
|
|||
app:layout_constraintTop_toTopOf="parent"
|
||||
tools:ignore="OnClick" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/buttonPicture"
|
||||
style="@style/Widget.AppCompat.Button.Borderless"
|
||||
android:layout_width="42dp"
|
||||
android:layout_height="42dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
android:layout_marginEnd="8dp"
|
||||
android:layout_marginTop="8dp"
|
||||
android:background="@drawable/ic_photo"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toStartOf="@+id/buttonSend"
|
||||
app:layout_constraintTop_toTopOf="parent" />
|
||||
|
||||
</android.support.constraint.ConstraintLayout>
|
||||
|
|
Loading…
Reference in a new issue