je crois que ça envoie des images

This commit is contained in:
odrling 2018-03-31 16:32:52 +02:00
parent cd4e674759
commit 3adeb82b41
9 changed files with 119 additions and 33 deletions

View file

@ -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) {

View file

@ -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)

View file

@ -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
*

View file

@ -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) })
}
}
}

View file

@ -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
}

View file

@ -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>)
}

View file

@ -19,7 +19,6 @@ abstract class DismissableActivity : BaseActivity() {
override fun onStop() {
super.onStop()
dismissables.add(this)
this.finish()
}
override fun onResume() {

View 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>

View file

@ -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>