Loading data/src/main/java/com/moez/QKSMS/repository/ImageRepostoryImpl.kt +0 −26 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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) } } } data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +34 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading domain/src/main/java/com/moez/QKSMS/interactor/SaveImage.kt +1 −5 Original line number Original line Diff line number Diff line Loading @@ -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 domain/src/main/java/com/moez/QKSMS/repository/ImageRepository.kt +1 −3 Original line number Original line Diff line number Diff line Loading @@ -25,6 +25,4 @@ interface ImageRepository { fun loadImage(uri: Uri): Bitmap? fun loadImage(uri: Uri): Bitmap? fun saveImage(uri: Uri) } } domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt +4 −1 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading @@ -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 Loading
data/src/main/java/com/moez/QKSMS/repository/ImageRepostoryImpl.kt +0 −26 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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) } } }
data/src/main/java/com/moez/QKSMS/repository/MessageRepositoryImpl.kt +34 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 Loading
domain/src/main/java/com/moez/QKSMS/interactor/SaveImage.kt +1 −5 Original line number Original line Diff line number Diff line Loading @@ -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
domain/src/main/java/com/moez/QKSMS/repository/ImageRepository.kt +1 −3 Original line number Original line Diff line number Diff line Loading @@ -25,6 +25,4 @@ interface ImageRepository { fun loadImage(uri: Uri): Bitmap? fun loadImage(uri: Uri): Bitmap? fun saveImage(uri: Uri) } }
domain/src/main/java/com/moez/QKSMS/repository/MessageRepository.kt +4 −1 Original line number Original line Diff line number Diff line Loading @@ -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 { Loading @@ -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