Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3215436f authored by moezbhatti's avatar moezbhatti
Browse files

Save part to disk and share using content provider

Fixes #1508 and fixes #1468
parent 0b2de845
Loading
Loading
Loading
Loading
+0 −26
Original line number Diff line number Diff line
@@ -22,14 +22,8 @@ import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.media.MediaScannerConnection
import android.net.Uri
import android.os.Environment
import androidx.exifinterface.media.ExifInterface
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import javax.inject.Inject

class ImageRepostoryImpl @Inject constructor(private val context: Context) : ImageRepository {
@@ -58,24 +52,4 @@ class ImageRepostoryImpl @Inject constructor(private val context: Context) : Ima
        return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true)
    }

    override fun saveImage(uri: Uri) {
        val type = context.contentResolver.getType(uri)?.split("/") ?: return
        val dir = File(Environment.getExternalStorageDirectory(), "QKSMS/Media").apply { mkdirs() }
        val file = File(dir, "${type.first()}${System.currentTimeMillis()}.${type.last()}")

        try {
            FileOutputStream(file).use { outputStream ->
                context.contentResolver.openInputStream(uri)?.use { inputStream ->
                    inputStream.copyTo(outputStream, 1024)
                }
            }
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }

        MediaScannerConnection.scanFile(context, arrayOf(file.path), null, null)
    }

}
+34 −0
Original line number Diff line number Diff line
@@ -25,9 +25,12 @@ import android.content.ContentValues
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.media.MediaScannerConnection
import android.os.Build
import android.os.Environment
import android.provider.Telephony
import android.telephony.SmsManager
import android.webkit.MimeTypeMap
import androidx.core.content.contentValuesOf
import com.google.android.mms.ContentType
import com.google.android.mms.MMSPart
@@ -54,6 +57,10 @@ import io.realm.Realm
import io.realm.RealmResults
import io.realm.Sort
import timber.log.Timber
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import javax.inject.Inject
import javax.inject.Singleton

@@ -132,6 +139,33 @@ class MessageRepositoryImpl @Inject constructor(
                .findAllAsync()
    }

    override fun savePart(id: Long): File? {
        val part = getPart(id) ?: return null

        val extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(part.type) ?: return null
        val date = part.messages?.first()?.date
        val dir = File(Environment.getExternalStorageDirectory(), "QKSMS/Media").apply { mkdirs() }
        val fileName = part.name?.takeIf { name -> name.endsWith(extension) }
                ?: "${part.type.split("/").last()}_$date.$extension"
        val file = File(dir, fileName)

        try {
            FileOutputStream(file).use { outputStream ->
                context.contentResolver.openInputStream(part.getUri())?.use { inputStream ->
                    inputStream.copyTo(outputStream, 1024)
                }
            }
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }

        MediaScannerConnection.scanFile(context, arrayOf(file.path), null, null)

        return file.takeIf { it.exists() }
    }

    /**
     * Retrieves the list of messages which should be shown in the notification
     * for a given conversation
+1 −5
Original line number Diff line number Diff line
@@ -18,21 +18,17 @@
 */
package com.moez.QKSMS.interactor

import com.moez.QKSMS.repository.ImageRepository
import com.moez.QKSMS.repository.MessageRepository
import io.reactivex.Flowable
import javax.inject.Inject

class SaveImage @Inject constructor(
    private val imageRepository: ImageRepository,
    private val messageRepo: MessageRepository
) : Interactor<Long>() {

    override fun buildObservable(params: Long): Flowable<*> {
        return Flowable.just(params)
                .map { partId -> messageRepo.getPart(partId) }
                .map { part -> part.getUri() }
                .doOnNext { uri -> imageRepository.saveImage(uri) }
                .doOnNext { partId -> messageRepo.savePart(partId) }
    }

}
 No newline at end of file
+1 −3
Original line number Diff line number Diff line
@@ -25,6 +25,4 @@ interface ImageRepository {

    fun loadImage(uri: Uri): Bitmap?

    fun saveImage(uri: Uri)

}
+4 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import com.moez.QKSMS.model.Attachment
import com.moez.QKSMS.model.Message
import com.moez.QKSMS.model.MmsPart
import io.realm.RealmResults
import java.io.File

interface MessageRepository {

@@ -37,6 +38,8 @@ interface MessageRepository {

    fun getPartsForConversation(threadId: Long): RealmResults<MmsPart>

    fun savePart(id: Long): File?

    /**
     * Retrieves the list of messages which should be shown in the notification
     * for a given conversation
Loading