Skip to content

Commit

Permalink
Merge pull request #36 from mehdiyari/development
Browse files Browse the repository at this point in the history
Version 1.0.4 (Dev to Master)
  • Loading branch information
mehdiyari authored Jun 25, 2023
2 parents e63d0cc + 29076ce commit 3b5ff7e
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 38 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ Fallery is A fully customizable media picker for Android apps with many features
15. Support custom action for video toggle in the video preview screen.
16. Support requests external storage permissions for all Android versions automatically.
17. Support changing the row count of images based on user zoom-in or zoom-out.
18. Support starting Fallery from composable functions.

## Usage

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package ir.mehdiyari.falleryExample.ui

import android.app.Activity
import android.content.Intent
import android.content.pm.ActivityInfo
import android.graphics.Color
import android.os.Bundle
Expand All @@ -19,9 +17,7 @@ import ir.mehdiyari.fallery.main.fallery.CaptionEnabledOptions
import ir.mehdiyari.fallery.main.fallery.FalleryBucketsSpanCountMode
import ir.mehdiyari.fallery.main.fallery.FalleryBuilder
import ir.mehdiyari.fallery.main.fallery.FalleryOptions
import ir.mehdiyari.fallery.main.fallery.getFalleryCaptionFromIntent
import ir.mehdiyari.fallery.main.fallery.getFalleryResultMediasFromIntent
import ir.mehdiyari.fallery.main.fallery.startFalleryWithOptions
import ir.mehdiyari.fallery.main.fallery.registerFalleryResultCallback
import ir.mehdiyari.fallery.models.BucketType
import ir.mehdiyari.falleryExample.R
import ir.mehdiyari.falleryExample.databinding.ActivityMainBinding
Expand All @@ -37,10 +33,13 @@ class MainActivity : AppCompatActivity() {

private val fileProviderAuthority by lazy { "${application.packageName}.provider" }
private var itemIdSelected: Int = R.id.menuDefaultOptions
private val falleryRequestCode = 830
private val mediaAdapter by lazy { MediaAdapter() }
private var listCurrentMedias = listOf<Pair<String, String>>()
private val glideImageLoader by lazy { GlideImageLoader() }
private val falleryActivityResult =
registerFalleryResultCallback(onResult = { result ->
handleFalleryResult(result.mediaPathList, result.caption)
})

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down Expand Up @@ -117,6 +116,7 @@ class MainActivity : AppCompatActivity() {
.setImageLoader(glideImageLoader).setMediaObserverEnabled(true)
.build()
}

R.id.menuCameraEnabled -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
Expand All @@ -127,48 +127,56 @@ class MainActivity : AppCompatActivity() {
)
).build()
}

R.id.menuFilterTypePhoto -> {
FalleryBuilder()
.mediaTypeFiltering(BucketType.ONLY_PHOTO_BUCKETS)
.setImageLoader(glideImageLoader)
.build()
}

R.id.menuFilterTypeVideo -> {
FalleryBuilder()
.mediaTypeFiltering(BucketType.ONLY_VIDEO_BUCKETS)
.setImageLoader(glideImageLoader)
.build()
}

R.id.menuWithCaption -> {
FalleryBuilder()
.setCaptionEnabledOptions(CaptionEnabledOptions(enabled = true))
.setImageLoader(glideImageLoader)
.build()
}

R.id.menuDraculaTheme -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setTheme(ir.mehdiyari.fallery.R.style.Fallery_Dracula)
.build()
}

R.id.menuLandscapeOrientation -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
.build()
}

R.id.menuPreviewScrollOrientation -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setMediaPreviewViewPagerOrientation(ViewPager2.ORIENTATION_VERTICAL)
.build()
}

R.id.menuMaxSelectable -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setMaxSelectableMedia(5)
.build()
}

R.id.menuWithCustomVideoToggleOnClick -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
Expand All @@ -177,33 +185,41 @@ class MainActivity : AppCompatActivity() {
}
.build()
}

R.id.menuBucketListModeGrid -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setBucketItemModeToggleEnabled(false)
.setBucketItemMode(BucketRecyclerViewItemMode.GridStyle)
.build()
}

R.id.menuBucketListModeVertical -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setBucketItemModeToggleEnabled(false)
.setBucketItemMode(BucketRecyclerViewItemMode.LinearStyle)
.build()
}

R.id.menuWithCustomSelectToggleBackColor -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setSelectedMediaToggleBackgroundColor(Color.RED)
.build()
}

R.id.menuCustomOnlineGallery -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setContentProviders(CustomOnlineBucketContentProvider(), CustomOnlineBucketProvider())
.setContentProviders(
CustomOnlineBucketContentProvider(),
CustomOnlineBucketProvider()
)
.setMediaObserverEnabled(false)
.build()
}

R.id.menuWitCustomCaptionEditText -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
Expand All @@ -213,29 +229,44 @@ class MainActivity : AppCompatActivity() {
)
).build()
}

R.id.menuCustomTheme -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setTheme(R.style.Fallery_Blue_Theme)
.build()
}

R.id.menuSpanCount -> {
FalleryBuilder()
.setImageLoader(glideImageLoader)
.setFallerySpanCountMode(FalleryBucketsSpanCountMode.UserZoomInOrZoomOut)
.build()
}

else -> FalleryOptions(glideImageLoader)
})?.also {
startFalleryWithOptions(falleryRequestCode, it)
}).also {
falleryActivityResult.launch(it)
}
}

private fun handleFalleryResult(result: List<String>?, caption: String?) {
listCurrentMedias = mutableListOf<Pair<String, String>>().apply {
addAll(listCurrentMedias)
result?.onEach { add(it to (caption ?: "")) }
}

visibleRecyclerViewIfCurrentListIsNotEmpty()
mediaAdapter.submitList(listCurrentMedias)
}

private fun animateLayouts() {
Handler(Looper.getMainLooper()).postDelayed({
Handler(Looper.getMainLooper()).postDelayed({
binding.bottomAppBarExample.fabCradleMargin = resources.getDimension(R.dimen.min_fabCradleMargin)
binding.bottomAppBarExample.fabCradleRoundedCornerRadius = resources.getDimension(R.dimen.min_fabCradleRoundedCornerRadius)
binding.bottomAppBarExample.fabCradleMargin =
resources.getDimension(R.dimen.min_fabCradleMargin)
binding.bottomAppBarExample.fabCradleRoundedCornerRadius =
resources.getDimension(R.dimen.min_fabCradleRoundedCornerRadius)
}, 60)
binding.fabOpenFallery.startAnimation(
TranslateAnimation(
Expand All @@ -249,8 +280,10 @@ class MainActivity : AppCompatActivity() {

Handler(Looper.getMainLooper()).postDelayed({
Handler(Looper.getMainLooper()).postDelayed({
binding.bottomAppBarExample.fabCradleMargin = resources.getDimension(R.dimen.fabCradleMargin)
binding.bottomAppBarExample.fabCradleRoundedCornerRadius = resources.getDimension(R.dimen.fabCradleRoundedCornerRadius)
binding.bottomAppBarExample.fabCradleMargin =
resources.getDimension(R.dimen.fabCradleMargin)
binding.bottomAppBarExample.fabCradleRoundedCornerRadius =
resources.getDimension(R.dimen.fabCradleRoundedCornerRadius)
}, 60)
binding.fabOpenFallery.startAnimation(
TranslateAnimation(
Expand All @@ -263,24 +296,6 @@ class MainActivity : AppCompatActivity() {
}, 450)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == falleryRequestCode) {
if (resultCode == Activity.RESULT_OK && data != null) {
listCurrentMedias = mutableListOf<Pair<String, String>>().apply {
addAll(listCurrentMedias)
val caption = data.getFalleryCaptionFromIntent()
data.getFalleryResultMediasFromIntent()?.onEach {
add(it to (caption ?: ""))
}
}

visibleRecyclerViewIfCurrentListIsNotEmpty()
mediaAdapter.submitList(listCurrentMedias)
}
}
super.onActivityResult(requestCode, resultCode, data)
}

override fun onDestroy() {
if (isFinishing) FalleryExample.customGalleryApiService = null
binding.bottomAppBarExample.setNavigationOnClickListener(null)
Expand All @@ -289,7 +304,10 @@ class MainActivity : AppCompatActivity() {

override fun onSaveInstanceState(outState: Bundle) {
outState.putInt("itemIdSelected", itemIdSelected)
outState.putStringArray("results", listCurrentMedias.map { "${it.first}~|~${it.second}" }.toTypedArray())
outState.putStringArray(
"results",
listCurrentMedias.map { "${it.first}~|~${it.second}" }.toTypedArray()
)
super.onSaveInstanceState(outState)
}
}
10 changes: 7 additions & 3 deletions fallery/CHANGELOG.MD
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
## Fallery version 1.0.4

1. Support starting fallery from composable functions
2. Minor bug fixes

## Fallery version 1.0.3

1. Update Dependencies
2. Remove MANAGE_EXTERNAL_STORAGE permission
3. Support Android +13 by
3. Support Android +13 by
4. Add a new publish task
5. Migrate to view binding
6. Minor bug fixes
Expand Down Expand Up @@ -38,7 +43,7 @@
10. Fix memory leak of bottomNavigationDrawerFragment in MainActivity
11. Fix failed tests in BucketListViewModelTest.kt
12. Remove unused classes

#### Update third-party libraries
1. Update gradle to 6.8.3
2. Update kotlin version to 1.4.32
Expand All @@ -48,7 +53,6 @@
6. Update fallery libraries version
7. Update compile and target sdk to 30
8. Update kotlinx-coroutines-test dependency to 1.4.1


## Fallery version 0.9.2

Expand Down
4 changes: 2 additions & 2 deletions fallery/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'maven-publish'

version = "1.0.3"
version = "1.0.4"
group = 'com.github.mehdiyari'

android {
Expand All @@ -21,7 +21,7 @@ android {
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles 'consumer-rules.pro'
versionCode 5
versionCode 6
}

buildTypes {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,51 @@
package ir.mehdiyari.fallery.main.fallery

import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import ir.mehdiyari.fallery.main.di.FalleryCoreComponentHolder
import ir.mehdiyari.fallery.main.ui.FalleryActivity
import ir.mehdiyari.fallery.utils.FALLERY_CAPTION_KEY
import ir.mehdiyari.fallery.utils.FALLERY_MEDIAS_LIST_KEY

@JvmName("startFalleryFromActivityWithOptions")
@Deprecated(
"Deprecated, Please use [registerFalleryResultCallback] instead.",
level = DeprecationLevel.WARNING,
)
fun Activity.startFalleryWithOptions(requestCode: Int, falleryOptions: FalleryOptions) {
FalleryCoreComponentHolder.createComponent(falleryOptions)
startActivityForResult(Intent(this, FalleryActivity::class.java), requestCode)
}

@JvmName("registerFalleryResultCallback")
fun AppCompatActivity.registerFalleryResultCallback(
onResult: (FalleryResult) -> Unit,
): ActivityResultLauncher<FalleryOptions> = registerForActivityResult(
getFalleryActivityResultContract(), onResult
)

@JvmName("startFalleryFromFragmentWithOptions")
@Deprecated(
"Deprecated, Please use [registerFalleryResultCallback] instead.",
level = DeprecationLevel.WARNING,
)
fun Fragment.startFalleryWithOptions(requestCode: Int, falleryOptions: FalleryOptions) {
FalleryCoreComponentHolder.createComponent(falleryOptions)
startActivityForResult(Intent(this.requireContext(), FalleryActivity::class.java), requestCode)
}

@JvmName("registerFalleryResultCallback")
fun Fragment.registerFalleryResultCallback(
onResult: (FalleryResult) -> Unit,
): ActivityResultLauncher<FalleryOptions> = registerForActivityResult(
getFalleryActivityResultContract(), onResult
)

@JvmName("getResultMediasFromIntent")
fun Intent.getFalleryResultMediasFromIntent(): Array<String>? {
if (this.hasExtra(FALLERY_MEDIAS_LIST_KEY)) {
Expand All @@ -32,4 +58,43 @@ fun Intent.getFalleryResultMediasFromIntent(): Array<String>? {
}

@JvmName("getCaptionFromIntent")
fun Intent.getFalleryCaptionFromIntent(): String? = this.getStringExtra(FALLERY_CAPTION_KEY)
fun Intent.getFalleryCaptionFromIntent(): String? = this.getStringExtra(FALLERY_CAPTION_KEY)


/**
* API for getting [ActivityResultContract] for register activityResult.
* This API can be used inside composable functions for starting fallery and get the result.
*
* <p>
* <pre>
*
* val falleryLauncher = rememberLauncherForActivityResult(
* getFalleryActivityResultContract()
* ) { result ->
* doSomethingWithPhotosAndCaption(result.mediaPathList, result.caption)
* }
*
* Button(onClick = { falleryLauncher.launch(falleryOptions) }) {
* Text(text = "Open Fallery")
* }
*
* </pre>
* </p>
*
*/
@JvmName("getFalleryActivityResultContract")
fun getFalleryActivityResultContract(): ActivityResultContract<FalleryOptions, FalleryResult> {
return object : ActivityResultContract<FalleryOptions, FalleryResult>() {
override fun createIntent(context: Context, input: FalleryOptions): Intent {
FalleryCoreComponentHolder.createComponent(input)
return Intent(context, FalleryActivity::class.java)
}

override fun parseResult(resultCode: Int, intent: Intent?): FalleryResult {
return FalleryResult(
intent?.getFalleryResultMediasFromIntent()?.toList(),
intent?.getFalleryCaptionFromIntent()
)
}
}
}
Loading

0 comments on commit 3b5ff7e

Please sign in to comment.