Skip to content

Commit 700cd88

Browse files
authored
Merge pull request #123 from Mindinventory/develop
Library version updated from v1.4.1(29) to v1.4.2(30)
2 parents 98da4ab + 041f332 commit 700cd88

File tree

18 files changed

+671
-155
lines changed

18 files changed

+671
-155
lines changed

app/src/main/java/com/lassi/app/MainActivity.kt

Lines changed: 48 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import android.os.Build
88
import android.os.Bundle
99
import android.os.Environment
1010
import android.provider.Settings
11-
import android.util.Log
1211
import android.view.View
1312
import android.webkit.MimeTypeMap
1413
import androidx.activity.result.contract.ActivityResultContracts
@@ -21,7 +20,6 @@ import com.lassi.common.utils.KeyUtils
2120
import com.lassi.data.media.MiMedia
2221
import com.lassi.domain.media.LassiOption
2322
import com.lassi.domain.media.MediaType
24-
import com.lassi.domain.media.MultiLangConfig
2523
import com.lassi.domain.media.SortingOption
2624
import com.lassi.presentation.builder.Lassi
2725
import com.lassi.presentation.common.decoration.GridSpacingItemDecoration
@@ -31,9 +29,9 @@ import java.util.Locale
3129

3230
class MainActivity : AppCompatActivity(), View.OnClickListener {
3331
private var _binding: ActivityMainBinding? = null
34-
protected val binding get() = _binding!!
32+
private val binding get() = _binding!!
3533
private val selectedMediaAdapter by lazy { SelectedMediaAdapter(this::onItemClicked) }
36-
lateinit var lassi: Lassi
34+
private lateinit var lassi: Lassi
3735

3836
override fun onCreate(savedInstanceState: Bundle?) {
3937
super.onCreate(savedInstanceState)
@@ -47,7 +45,9 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
4745
it.btnImageCapture.setOnClickListener(this)
4846
it.btnVideoCapture.setOnClickListener(this)
4947
it.btnDocumentSystemIntent.setOnClickListener(this)
48+
it.btnPhotoVideoPicker.setOnClickListener(this)
5049
it.btnPhotoPicker.setOnClickListener(this)
50+
it.btnVideoMediaPicker.setOnClickListener(this)
5151
it.rvSelectedMedia.adapter = selectedMediaAdapter
5252
it.rvSelectedMedia.addItemDecoration(GridSpacingItemDecoration(2, 10))
5353
}
@@ -72,13 +72,13 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
7272
setSortByDateLbl = "Trier par date"
7373
)
7474
}
75-
binding.btnPhotoPicker.visibility = View.VISIBLE
75+
binding.btnPhotoVideoPicker.visibility = View.VISIBLE
7676
}
7777

7878
override fun onClick(v: View?) {
7979
when (v?.id) {
8080
R.id.btnImagePicker -> {
81-
val intent = lassi.with(LassiOption.CAMERA_AND_GALLERY).setMaxCount(1)
81+
val intent = lassi.with(LassiOption.CAMERA_AND_GALLERY).setMaxCount(4)
8282
.setAscSort(SortingOption.ASCENDING).setGridSize(2)
8383
.setMediaType(MediaType.IMAGE)
8484
.setPlaceHolder(R.drawable.ic_image_placeholder)
@@ -94,6 +94,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
9494
.setCropType(CropImageView.CropShape.OVAL).setCropAspectRatio(1, 1)
9595
.setCompressionRatio(10).setMinFileSize(0).setMaxFileSize(Int.MAX_VALUE.toLong())
9696
.enableActualCircleCrop()
97+
.disableCrop()
9798
.setSupportedFileTypes("jpg", "jpeg", "png", "webp", "gif").enableFlip()
9899
.enableRotate().build()
99100
receiveData.launch(intent)
@@ -214,9 +215,42 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
214215
receiveData.launch(intent)
215216
}
216217

218+
R.id.btnPhotoVideoPicker -> {
219+
val intent = lassi.with(LassiOption.CAMERA_AND_GALLERY).setMaxCount(4)
220+
.setMediaType(MediaType.PHOTO_VIDEO_PICKER)
221+
.setStatusBarColor(R.color.colorPrimaryDark)
222+
.setToolbarColor(R.color.colorPrimary)
223+
.setToolbarResourceColor(android.R.color.white)
224+
.setProgressBarColor(R.color.colorAccent)
225+
.setGalleryBackgroundColor(R.color.colorGrey)
226+
.setCustomLimitExceedingErrorMessage("Selected item exceeded the limit!")
227+
.build()
228+
receiveData.launch(intent)
229+
}
230+
217231
R.id.btnPhotoPicker -> {
218232
val intent = lassi.with(LassiOption.CAMERA_AND_GALLERY).setMaxCount(4)
233+
.setAscSort(SortingOption.ASCENDING).setGridSize(2)
219234
.setMediaType(MediaType.PHOTO_PICKER)
235+
.setPlaceHolder(R.drawable.ic_image_placeholder)
236+
.setErrorDrawable(R.drawable.ic_image_placeholder)
237+
.setSelectionDrawable(R.drawable.ic_checked_media)
238+
.setStatusBarColor(R.color.colorPrimaryDark)
239+
.setToolbarColor(R.color.colorPrimary)
240+
.setToolbarResourceColor(android.R.color.white)
241+
.setAlertDialogNegativeButtonColor(R.color.cherry_red)
242+
.setAlertDialogPositiveButtonColor(R.color.emerald_green)
243+
.setProgressBarColor(R.color.colorAccent)
244+
.setGalleryBackgroundColor(R.color.colorGrey)
245+
.enableMultiSelection()
246+
.setCustomLimitExceedingErrorMessage("Selected item exceeded the limit!")
247+
.build()
248+
receiveData.launch(intent)
249+
}
250+
251+
R.id.btnVideoMediaPicker -> {
252+
val intent = lassi.with(LassiOption.CAMERA_AND_GALLERY).setMaxCount(4)
253+
.setMediaType(MediaType.VIDEO_PICKER)
220254
.setStatusBarColor(R.color.colorPrimaryDark)
221255
.setToolbarColor(R.color.colorPrimary)
222256
.setToolbarResourceColor(android.R.color.white)
@@ -247,9 +281,14 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
247281
private val receiveData =
248282
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
249283
if (it.resultCode == Activity.RESULT_OK) {
250-
val selectedMedia =
251-
it.data?.getSerializableExtra(KeyUtils.SELECTED_MEDIA) as ArrayList<MiMedia>
252-
if (selectedMedia.isNotEmpty()) {
284+
val selectedMedia = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
285+
it.data?.getParcelableArrayListExtra(KeyUtils.SELECTED_MEDIA, MiMedia::class.java)
286+
} else {
287+
@Suppress("DEPRECATION")
288+
it.data?.getParcelableArrayListExtra(KeyUtils.SELECTED_MEDIA)
289+
}
290+
291+
if (!selectedMedia.isNullOrEmpty()) {
253292
binding.ivEmpty.isVisible = selectedMedia.isEmpty()
254293
selectedMediaAdapter.setList(selectedMedia)
255294
}

app/src/main/res/layout/activity_main.xml

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,14 +152,14 @@
152152
app:layout_constraintTop_toBottomOf="@+id/btnDocumentSystemIntent" />
153153

154154
<Button
155-
android:id="@+id/btnPhotoPicker"
155+
android:id="@+id/btnPhotoVideoPicker"
156156
android:layout_width="wrap_content"
157157
android:layout_height="wrap_content"
158158
android:layout_marginTop="16dp"
159159
android:background="@drawable/bg_rounded_button"
160160
android:drawableStart="@drawable/ic_document"
161161
android:padding="10dp"
162-
android:text="@string/photo_picker"
162+
android:text="@string/photo_video_picker"
163163
android:textAllCaps="false"
164164
android:textColor="@android:color/white"
165165
android:textSize="16sp"
@@ -169,6 +169,47 @@
169169
app:layout_constraintHorizontal_bias="0.5"
170170
app:layout_constraintStart_toStartOf="parent"
171171
app:layout_constraintTop_toBottomOf="@+id/btnVideoCapture" />
172+
173+
<Button
174+
android:id="@+id/btnPhotoPicker"
175+
android:layout_width="0dp"
176+
android:layout_height="wrap_content"
177+
android:layout_marginStart="32dp"
178+
android:layout_marginTop="16dp"
179+
android:layout_marginEnd="16dp"
180+
android:background="@drawable/bg_rounded_button"
181+
android:drawableStart="@drawable/ic_camera_white"
182+
android:padding="10dp"
183+
android:text="@string/photo_picker"
184+
android:textAllCaps="false"
185+
android:textColor="@android:color/white"
186+
android:textSize="16sp"
187+
android:textStyle="bold"
188+
app:layout_constraintEnd_toStartOf="@+id/btnVideoMediaPicker"
189+
app:layout_constraintHorizontal_bias="0.5"
190+
app:layout_constraintStart_toStartOf="parent"
191+
app:layout_constraintTop_toBottomOf="@+id/btnPhotoVideoPicker" />
192+
193+
<Button
194+
android:id="@+id/btnVideoMediaPicker"
195+
android:layout_width="0dp"
196+
android:layout_height="wrap_content"
197+
android:layout_marginStart="16dp"
198+
android:layout_marginTop="16dp"
199+
android:layout_marginEnd="32dp"
200+
android:background="@drawable/bg_rounded_button"
201+
android:drawableStart="@drawable/ic_video_cam_white"
202+
android:padding="10dp"
203+
android:text="Video Picker"
204+
android:textAllCaps="false"
205+
android:textColor="@android:color/white"
206+
android:textSize="16sp"
207+
android:textStyle="bold"
208+
app:layout_constraintEnd_toEndOf="parent"
209+
app:layout_constraintHorizontal_bias="0.5"
210+
app:layout_constraintStart_toEndOf="@+id/btnPhotoPicker"
211+
app:layout_constraintTop_toBottomOf="@+id/btnPhotoVideoPicker" />
212+
172213
</androidx.constraintlayout.widget.ConstraintLayout>
173214

174215
<androidx.recyclerview.widget.RecyclerView

app/src/main/res/values-es/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@
1616
<string name="sort_descending">Descendente</string>
1717
<string name="camera_permission_rational">No se concede el permiso de la cámara. Por favor, permita que se configure.</string>
1818
<string name="crop_image_menu_crop">Cultivo</string>
19+
<string name="photo_video_picker">Fotos y videos</string>
1920
</resources>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@
1515
<string name="sort_descending">Descending</string>
1616
<string name="camera_permission_rational">Camera permission is not granted. Please allow it from setting.</string>
1717
<string name="crop_image_menu_crop">Crop</string>
18+
<string name="photo_video_picker">Photo &amp; Video Picker</string>
1819
</resources>

lassi/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android {
1414
defaultConfig {
1515
minSdk 21
1616
targetSdk 34
17-
versionCode 27
18-
versionName "1.4.0"
17+
versionCode 30
18+
versionName "1.4.2"
1919
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
2020
vectorDrawables.useSupportLibrary = true
2121
multiDexEnabled true
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.lassi.common.utils
2+
3+
import android.content.ContentResolver
4+
import android.content.Context
5+
import android.graphics.Bitmap.CompressFormat
6+
import android.net.Uri
7+
import android.os.Build
8+
import android.provider.MediaStore
9+
import android.webkit.MimeTypeMap
10+
11+
object UriHelper {
12+
private fun getMediaType(uri: Uri, contentResolver: ContentResolver): String? {
13+
// Columns to retrieve from the media store
14+
val projection = arrayOf(MediaStore.MediaColumns.MIME_TYPE)
15+
16+
// Query the content resolver for the media information
17+
contentResolver.query(uri, projection, null, null, null)?.use { cursor ->
18+
if (cursor.moveToFirst()) {
19+
val mimeTypeColumnIndex = cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE)
20+
if (mimeTypeColumnIndex >= 0) {
21+
return cursor.getString(mimeTypeColumnIndex)
22+
}
23+
}
24+
}
25+
return null
26+
}
27+
28+
fun isVideo(uri: Uri, contentResolver: ContentResolver): Boolean {
29+
val mimeType = getMediaType(uri, contentResolver)
30+
return mimeType?.startsWith("video/") == true
31+
}
32+
33+
fun isPhoto(uri: Uri, contentResolver: ContentResolver): Boolean {
34+
val mimeType: String? = if (uri.scheme == ContentResolver.SCHEME_CONTENT) {
35+
contentResolver.getType(uri)
36+
} else {
37+
// For file:// URIs, manually get the MIME type based on the file extension
38+
val extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString())
39+
MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
40+
}
41+
val t = mimeType?.startsWith("image/") == true
42+
return t
43+
}
44+
45+
fun getCompressFormatForUri(uri: Uri, context: Context): CompressFormat {
46+
val mimeType = context.contentResolver?.getType(uri)
47+
return when (mimeType) {
48+
"image/png" -> CompressFormat.PNG
49+
"image/jpeg" -> CompressFormat.JPEG
50+
"image/webp" -> if (Build.VERSION.SDK_INT >= 30) CompressFormat.WEBP_LOSSLESS else CompressFormat.WEBP
51+
else -> CompressFormat.JPEG
52+
}
53+
}
54+
}

lassi/src/main/java/com/lassi/data/media/entity/MediaFileDao.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,13 @@ interface MediaFileDao {
7272
" ON $MEDIA_FILE_ENTITY.$MEDIA_ID = $DURATION_ENTITY.duration_media_id" +
7373
" INNER JOIN $ALBUM_COVER_ENTITY" +
7474
" ON $MEDIA_FILE_ENTITY.$MEDIA_ID = $ALBUM_COVER_ENTITY.$ALBUM_COVER_MEDIA_ID" +
75-
" WHERE $MEDIA_BUCKET = :bucket AND $MEDIA_TYPE = :mediaType ORDER BY CASE WHEN :isAsc = 1 THEN $MEDIA_DATE_ADDED END ASC, CASE WHEN :isAsc = 0 THEN $MEDIA_DATE_ADDED END DESC")
76-
fun getSelectedSortedMediaFile(bucket: String, isAsc: Int, mediaType: Int): List<SelectedMediaModel>
75+
" WHERE $MEDIA_BUCKET = :bucket AND $MEDIA_TYPE = :mediaType ORDER BY CASE WHEN :isAsc = 1 THEN $MEDIA_DATE_ADDED END ASC, CASE WHEN :isAsc = 0 THEN $MEDIA_DATE_ADDED END DESC"
76+
)
77+
fun getSelectedSortedMediaFile(
78+
bucket: String,
79+
isAsc: Int,
80+
mediaType: Int,
81+
): List<SelectedMediaModel>
7782

7883
@Query("SELECT * FROM $MEDIA_FILE_ENTITY WHERE $MEDIA_BUCKET = :bucket AND $MEDIA_TYPE = :mediaType")
7984
fun getSelectedImageMediaFile(bucket: String, mediaType: Int): List<MediaFileEntity>
@@ -82,12 +87,15 @@ interface MediaFileDao {
8287
fun getSelectedSortedImageMediaFile(
8388
bucket: String,
8489
isAsc: Int,
85-
mediaType: Int
90+
mediaType: Int,
8691
): List<MediaFileEntity>
8792

8893
@Query("SELECT * FROM $MEDIA_FILE_ENTITY WHERE $MEDIA_TYPE = 1 OR $MEDIA_TYPE = 2 OR $MEDIA_TYPE = 3")
8994
fun getAllImgVidMediaFile(): List<MediaFileEntity>
9095

9196
@Query("DELETE FROM $MEDIA_FILE_ENTITY WHERE $MEDIA_PATH = :mediaPath")
9297
fun deleteByMediaPath(mediaPath: String)
98+
99+
@Query("DELETE FROM $MEDIA_FILE_ENTITY")
100+
fun deleteMediaFiles()
93101
}

lassi/src/main/java/com/lassi/data/media/repository/MediaRepositoryImpl.kt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import kotlinx.coroutines.launch
3232
import java.io.File
3333

3434
class MediaRepositoryImpl(private val context: Context) : MediaRepository {
35-
private var mediaPathToRemove: ArrayList<MediaFileEntity>? = null
3635
val TAG = MediaRepositoryImpl::class.java.simpleName
3736
private val minTimeInMillis = LassiConfig.getConfig().minTime * 1000L
3837
private val maxTimeInMillis = LassiConfig.getConfig().maxTime * 1000L
@@ -84,6 +83,12 @@ class MediaRepositoryImpl(private val context: Context) : MediaRepository {
8483
return resultDeferred.await()
8584
}
8685

86+
override suspend fun deleteMediaFiles() {
87+
CoroutineScope(IO).launch {
88+
mediaDatabase.mediaFileDao().deleteMediaFiles()
89+
}
90+
}
91+
8792
override suspend fun removeMediaData(allDataList: List<MediaFileEntity>?) {
8893
CoroutineScope(IO).launch {
8994
if (allDataList != null) {
@@ -164,7 +169,7 @@ class MediaRepositoryImpl(private val context: Context) : MediaRepository {
164169
}.catch().flowOn(IO)
165170
}
166171

167-
private suspend fun checkDurationAndAddFileToDatabase(
172+
private fun checkDurationAndAddFileToDatabase(
168173
bucket: String?,
169174
id: Long,
170175
name: String,
@@ -173,7 +178,7 @@ class MediaRepositoryImpl(private val context: Context) : MediaRepository {
173178
albumCoverPath: String,
174179
size: Long,
175180
dateAdded: Long,
176-
mediaType: MediaType
181+
mediaType: MediaType,
177182
) {
178183
if (isValidDuration(duration) && isValidFileSize(size)) {
179184
addFileToDatabase(
@@ -218,7 +223,7 @@ class MediaRepositoryImpl(private val context: Context) : MediaRepository {
218223
/**
219224
* Add file to database
220225
*/
221-
private suspend fun addFileToDatabase(
226+
private fun addFileToDatabase(
222227
bucket: String?,
223228
miMedia: MiMedia,
224229
dateAdded: Long,

lassi/src/main/java/com/lassi/domain/media/LassiConfig.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,14 @@ data class LassiConfig(
4040
var enableFlipImage: Boolean = false,
4141
var enableRotateImage: Boolean = false,
4242
var enableActualCircleCrop: Boolean = false,
43-
var compressionRation: Int = 0,
43+
var compressionRatio: Int = 0,
4444
var minFileSize: Long = KeyUtils.DEFAULT_FILE_SIZE,
4545
var maxFileSize: Long = KeyUtils.DEFAULT_FILE_SIZE,
4646
var isCrop: Boolean = true,
4747
var alertDialogNegativeButtonColor: Int = Color.BLACK,
4848
var alertDialogPositiveButtonColor: Int = Color.BLACK,
49-
var customLimitExceedingErrorMessage: String = ERROR_EXCEEDING_MSG
49+
var customLimitExceedingErrorMessage: String = ERROR_EXCEEDING_MSG,
50+
var isMultiPicker : Boolean = false
5051
) : Parcelable {
5152
companion object {
5253

@@ -80,13 +81,14 @@ data class LassiConfig(
8081
enableFlipImage = lassiConfig.enableFlipImage
8182
enableRotateImage = lassiConfig.enableRotateImage
8283
enableActualCircleCrop = lassiConfig.enableActualCircleCrop
83-
compressionRation = lassiConfig.compressionRation
84+
compressionRatio = lassiConfig.compressionRatio
8485
minFileSize = lassiConfig.minFileSize
8586
maxFileSize = lassiConfig.maxFileSize
8687
isCrop = lassiConfig.isCrop
8788
alertDialogNegativeButtonColor = lassiConfig.alertDialogNegativeButtonColor
8889
alertDialogPositiveButtonColor = lassiConfig.alertDialogPositiveButtonColor
8990
customLimitExceedingErrorMessage = lassiConfig.customLimitExceedingErrorMessage
91+
isMultiPicker = lassiConfig.isMultiPicker
9092
}
9193
}
9294

lassi/src/main/java/com/lassi/domain/media/MediaRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ interface MediaRepository {
1414
suspend fun insertMediaData(): Result<Boolean>
1515
suspend fun insertAllMediaData(): Result<Boolean>
1616
suspend fun removeMediaData(allDataList: List<MediaFileEntity>?)
17+
suspend fun deleteMediaFiles()
1718
}

0 commit comments

Comments
 (0)