Skip to content

Commit f2098bd

Browse files
authored
Merge pull request #2 from Mindinventory/develop
Improvise single media selection and added Flip and Rotate image option
2 parents c50d293 + 0c04575 commit f2098bd

File tree

15 files changed

+128
-60
lines changed

15 files changed

+128
-60
lines changed

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Lassi is simplest way to pick media (either image or video)
4141
```groovy
4242
dependencies {
4343
...
44-
implementation 'com.github.Mindinventory:Lassi:0.0.3'
44+
implementation 'com.github.Mindinventory:Lassi:0.0.4'
4545
}
4646
```
4747
@@ -69,6 +69,8 @@ Lassi is simplest way to pick media (either image or video)
6969
.setErrorDrawable(R.drawable.ic_image_placeholder)
7070
.setCropType(CropImageView.CropShape.RECTANGLE) // choose shape for cropping after capturing an image from camera (for MediaType.IMAGE only)
7171
.setCropAspectRatio(1, 1) // define crop aspect ratio for cropping after capturing an image from camera (for MediaType.IMAGE only)
72+
.enableFlip(true) // Enable flip image option while image cropping (for MediaType.IMAGE only)
73+
.enableRotate(true) // Enable rotate image option while image cropping (for MediaType.IMAGE only)
7274
.build()
7375
startActivityForResult(intent, MEDIA_REQUEST_CODE)
7476
```
@@ -107,7 +109,7 @@ Lassi is simplest way to pick media (either image or video)
107109
108110
# LICENSE!
109111
110-
MiMediaPicker is [MIT-licensed](/LICENSE).
112+
Lassi is [MIT-licensed](/LICENSE).
111113
112114
# Let us know!
113115
We’d be really happy if you send us links to your projects where you use our component. Just send an email to sales@mindinventory.com And do let us know if you have any questions or suggestion regarding our work.

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
3434
R.id.btnImagePicker -> {
3535
val intent = Lassi(this)
3636
.with(LassiOption.CAMERA_AND_GALLERY)
37-
.setMaxCount(1)
37+
.setMaxCount(4)
3838
.setGridSize(2)
3939
.setPlaceHolder(R.drawable.ic_image_placeholder)
4040
.setErrorDrawable(R.drawable.ic_image_placeholder)
@@ -45,14 +45,16 @@ class MainActivity : AppCompatActivity(), View.OnClickListener {
4545
.setCropType(CropImageView.CropShape.OVAL)
4646
.setCropAspectRatio(1, 1)
4747
.setSupportedFileTypes("jpg", "jpeg", "png", "webp", "gif")
48+
.enableFlip(true)
49+
.enableRotate(true)
4850
.build()
4951
startActivityForResult(intent, MEDIA_REQUEST_CODE)
5052

5153
}
5254
R.id.btnVideoPicker -> {
5355
val intent = Lassi(this)
5456
.with(LassiOption.CAMERA_AND_GALLERY)
55-
.setMaxCount(1)
57+
.setMaxCount(4)
5658
.setGridSize(3)
5759
.setMinTime(15)
5860
.setMaxTime(30)

lassi/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ android {
1313
minSdkVersion 17
1414
targetSdkVersion 28
1515
versionCode 1
16-
versionName "0.0.3"
16+
versionName "0.0.4"
1717
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1818
vectorDrawables.useSupportLibrary = true
1919
}

lassi/src/main/java/com/lassi/common/utils/CropUtils.kt

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,18 @@ import com.lassi.presentation.cropper.CropImageView
88

99
object CropUtils {
1010
fun beginCrop(activity: FragmentActivity, source: Uri) {
11-
val lassiConfig = LassiConfig.getConfig()
12-
CropImage.activity(source)
13-
.setGuidelines(CropImageView.Guidelines.ON)
14-
.setAllowFlipping(false)
15-
.setAllowRotation(false)
16-
.setOutputCompressQuality(70)
17-
.setCropShape(lassiConfig.cropType)
18-
.setAspectRatio(lassiConfig.cropAspectRatio)
19-
.setOutputUri(source)
20-
.start(activity)
11+
with(LassiConfig.getConfig()) {
12+
CropImage.activity(source)
13+
.setGuidelines(CropImageView.Guidelines.ON)
14+
.setAllowFlipping(false)
15+
.setAllowRotation(false)
16+
.setOutputCompressQuality(70)
17+
.setCropShape(cropType)
18+
.setAspectRatio(cropAspectRatio)
19+
.setOutputUri(source)
20+
.setAllowRotation(enableRotateImage)
21+
.setAllowFlipping(enableFlipImage)
22+
.start(activity)
23+
}
2124
}
2225
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ data class LassiConfig(
2727
var maxTime: Long = KeyUtils.DEFAULT_VIDEO_DURATION,
2828
var cropType: CropImageView.CropShape = CropImageView.CropShape.RECTANGLE,
2929
var supportedFileType: MutableList<String> = mutableListOf(),
30-
var cropAspectRatio: AspectRatio = AspectRatio.of(1, 1)
30+
var cropAspectRatio: AspectRatio = AspectRatio.of(1, 1),
31+
var enableFlipImage: Boolean = false,
32+
var enableRotateImage: Boolean = false
3133
) : Parcelable {
3234
companion object {
3335

@@ -51,6 +53,8 @@ data class LassiConfig(
5153
cropType = lassiConfig.cropType
5254
supportedFileType = lassiConfig.supportedFileType
5355
cropAspectRatio = lassiConfig.cropAspectRatio
56+
enableFlipImage = lassiConfig.enableFlipImage
57+
enableRotateImage = lassiConfig.enableRotateImage
5458
}
5559
}
5660

lassi/src/main/java/com/lassi/presentation/builder/Lassi.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,22 @@ class Lassi(private val context: Context) {
142142
return this
143143
}
144144

145+
/**
146+
* Enable flip image option while image cropping
147+
*/
148+
fun enableFlip(enableFlipImage: Boolean): Lassi {
149+
lassiConfig.enableFlipImage = enableFlipImage
150+
return this
151+
}
152+
153+
/**
154+
* Enable rotate image option while image cropping
155+
*/
156+
fun enableRotate(enableRotateImage: Boolean): Lassi {
157+
lassiConfig.enableRotateImage = enableRotateImage
158+
return this
159+
}
160+
145161
/**
146162
* Start LassiMediaPickerActivity with config
147163
*/

lassi/src/main/java/com/lassi/presentation/cropper/CropImageActivity.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import com.lassi.data.media.MiMedia
2626
import com.lassi.domain.media.LassiConfig
2727
import com.lassi.presentation.mediadirectory.LassiMediaPickerActivity
2828
import kotlinx.android.synthetic.main.crop_image_activity.*
29-
import kotlinx.android.synthetic.main.toolbar.*
3029
import java.io.File
3130
import java.io.IOException
3231

lassi/src/main/java/com/lassi/presentation/media/MediaFragment.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,25 @@
11
package com.lassi.presentation.media
22

33
import android.graphics.PorterDuff
4+
import android.net.Uri
45
import android.os.Bundle
56
import android.view.Menu
67
import androidx.lifecycle.ViewModelProviders
78
import androidx.recyclerview.widget.GridLayoutManager
89
import com.lassi.R
910
import com.lassi.common.utils.ColorUtils
11+
import com.lassi.common.utils.CropUtils
1012
import com.lassi.common.utils.KeyUtils.SELECTED_FOLDER
1113
import com.lassi.data.media.MiMedia
1214
import com.lassi.data.mediadirectory.Folder
1315
import com.lassi.domain.media.LassiConfig
16+
import com.lassi.domain.media.MediaType
1417
import com.lassi.presentation.common.LassiBaseViewModelFragment
1518
import com.lassi.presentation.common.decoration.GridSpacingItemDecoration
1619
import com.lassi.presentation.media.adapter.MediaAdapter
20+
import com.lassi.presentation.videopreview.VideoPreviewActivity
1721
import kotlinx.android.synthetic.main.fragment_media_picker.*
22+
import java.io.File
1823

1924
class MediaFragment : LassiBaseViewModelFragment<SelectedMediaViewModel>() {
2025
private val mediaAdapter by lazy { MediaAdapter(this::onItemClick) }
@@ -65,7 +70,19 @@ class MediaFragment : LassiBaseViewModelFragment<SelectedMediaViewModel>() {
6570
}
6671

6772
private fun onItemClick(selectedMedias: ArrayList<MiMedia>) {
68-
viewModel.addAllSelectedMedia(selectedMedias)
73+
if (LassiConfig.getConfig().maxCount > 1) {
74+
viewModel.addAllSelectedMedia(selectedMedias)
75+
} else {
76+
if (LassiConfig.getConfig().mediaType == MediaType.IMAGE) {
77+
val uri = Uri.fromFile(File(selectedMedias[0].path))
78+
CropUtils.beginCrop(requireActivity(), uri)
79+
} else {
80+
VideoPreviewActivity.startVideoPreview(
81+
activity,
82+
selectedMedias[0].path!!
83+
)
84+
}
85+
}
6986
}
7087

7188
override fun onPrepareOptionsMenu(menu: Menu) {

lassi/src/main/java/com/lassi/presentation/media/adapter/MediaAdapter.kt

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import kotlinx.android.synthetic.main.item_media.*
1717
import java.util.*
1818

1919
class MediaAdapter(
20-
private val onImageClick: (selectedMedias: ArrayList<MiMedia>) -> Unit
20+
private val onItemClick: (selectedMedias: ArrayList<MiMedia>) -> Unit
2121
) : RecyclerView.Adapter<MediaAdapter.MyViewHolder>() {
2222
private val logTag = MediaAdapter::class.java.simpleName
2323
private val images = ArrayList<MiMedia>()
@@ -74,13 +74,23 @@ class MediaAdapter(
7474
}
7575

7676
containerView.setOnClickListener {
77-
isSelect = !isSelect
78-
if (!isSelect) {
79-
removeSelected(miMedia, adapterPosition)
77+
if (LassiConfig.getConfig().maxCount > 1) {
78+
isSelect = !isSelect
79+
if (!isSelect) {
80+
removeSelected(miMedia, adapterPosition)
81+
} else {
82+
addSelected(miMedia, adapterPosition)
83+
}
8084
} else {
81-
addSelected(miMedia, adapterPosition)
85+
with(LassiConfig.getConfig()) {
86+
if (selectedMedias.size != maxCount) {
87+
selectedMedias.add(0, miMedia)
88+
} else {
89+
selectedMedias[0] = miMedia
90+
}
91+
}
8292
}
83-
onImageClick(LassiConfig.getConfig().selectedMedias)
93+
onItemClick(LassiConfig.getConfig().selectedMedias)
8494
}
8595
}
8696
}

lassi/src/main/java/com/lassi/presentation/mediadirectory/LassiMediaPickerActivity.kt

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import com.lassi.presentation.common.LassiBaseViewModelActivity
2525
import com.lassi.presentation.cropper.CropImage
2626
import com.lassi.presentation.media.SelectedMediaViewModel
2727
import com.lassi.presentation.videopreview.VideoPreviewActivity
28-
import kotlinx.android.synthetic.main.toolbar.*
28+
import kotlinx.android.synthetic.main.activity_media_picker.*
2929
import java.io.File
3030

3131
class LassiMediaPickerActivity : LassiBaseViewModelActivity<SelectedMediaViewModel>() {
@@ -51,20 +51,26 @@ class LassiMediaPickerActivity : LassiBaseViewModelActivity<SelectedMediaViewMod
5151

5252
override fun initViews() {
5353
super.initViews()
54-
with(LassiConfig.getConfig()) {
55-
toolbar.title =
56-
String.format(
57-
getString(R.string.selected_items),
58-
selectedMedias.size,
59-
maxCount
60-
)
61-
}
54+
setToolbarTitle(LassiConfig.getConfig().selectedMedias)
6255
setSupportActionBar(toolbar)
6356
supportActionBar?.setDisplayHomeAsUpEnabled(true)
6457
setThemeAttributes()
6558
initiateFragment()
6659
}
6760

61+
private fun setToolbarTitle(selectedMedias: ArrayList<MiMedia>) {
62+
val maxCount = LassiConfig.getConfig().maxCount
63+
if (maxCount > 1) {
64+
toolbar.title = String.format(
65+
getString(R.string.selected_items),
66+
selectedMedias.size,
67+
maxCount
68+
)
69+
} else {
70+
toolbar.title = ""
71+
}
72+
}
73+
6874
private fun initiateFragment() {
6975
if (LassiConfig.getConfig().lassiOption == LassiOption.CAMERA) {
7076
supportFragmentManager.beginTransaction()
@@ -165,11 +171,7 @@ class LassiMediaPickerActivity : LassiBaseViewModelActivity<SelectedMediaViewMod
165171
}
166172

167173
private fun handleSelectedMedia(selectedMedias: ArrayList<MiMedia>) {
168-
toolbar.title = String.format(
169-
getString(R.string.selected_items),
170-
selectedMedias.size,
171-
LassiConfig.getConfig().maxCount
172-
)
174+
setToolbarTitle(selectedMedias)
173175
menuDone?.isVisible = !selectedMedias.isNullOrEmpty()
174176
}
175177

0 commit comments

Comments
 (0)