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 Original line Diff line number Diff line
@@ -22,14 +22,8 @@ import android.content.Context
import android.graphics.Bitmap
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.BitmapFactory
import android.graphics.Matrix
import android.graphics.Matrix
import android.media.MediaScannerConnection
import android.net.Uri
import android.net.Uri
import android.os.Environment
import androidx.exifinterface.media.ExifInterface
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
import javax.inject.Inject


class ImageRepostoryImpl @Inject constructor(private val context: Context) : ImageRepository {
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)
        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 Original line Diff line number Diff line
@@ -25,9 +25,12 @@ import android.content.ContentValues
import android.content.Context
import android.content.Context
import android.content.Intent
import android.content.Intent
import android.content.IntentFilter
import android.content.IntentFilter
import android.media.MediaScannerConnection
import android.os.Build
import android.os.Build
import android.os.Environment
import android.provider.Telephony
import android.provider.Telephony
import android.telephony.SmsManager
import android.telephony.SmsManager
import android.webkit.MimeTypeMap
import androidx.core.content.contentValuesOf
import androidx.core.content.contentValuesOf
import com.google.android.mms.ContentType
import com.google.android.mms.ContentType
import com.google.android.mms.MMSPart
import com.google.android.mms.MMSPart
@@ -54,6 +57,10 @@ import io.realm.Realm
import io.realm.RealmResults
import io.realm.RealmResults
import io.realm.Sort
import io.realm.Sort
import timber.log.Timber
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.Inject
import javax.inject.Singleton
import javax.inject.Singleton


@@ -132,6 +139,33 @@ class MessageRepositoryImpl @Inject constructor(
                .findAllAsync()
                .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
     * Retrieves the list of messages which should be shown in the notification
     * for a given conversation
     * for a given conversation
+1 −5
Original line number Original line Diff line number Diff line
@@ -18,21 +18,17 @@
 */
 */
package com.moez.QKSMS.interactor
package com.moez.QKSMS.interactor


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


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


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


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


    fun loadImage(uri: Uri): Bitmap?
    fun loadImage(uri: Uri): Bitmap?


    fun saveImage(uri: Uri)

}
}
+4 −1
Original line number Original line 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.Message
import com.moez.QKSMS.model.MmsPart
import com.moez.QKSMS.model.MmsPart
import io.realm.RealmResults
import io.realm.RealmResults
import java.io.File


interface MessageRepository {
interface MessageRepository {


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


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


    fun savePart(id: Long): File?

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