Skip to content

Commit

Permalink
update readme
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex009 committed Apr 11, 2023
1 parent 802cb7c commit e899ae1
Showing 1 changed file with 116 additions and 12 deletions.
128 changes: 116 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
[![GitHub license](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](http://www.apache.org/licenses/LICENSE-2.0) [![Download](https://img.shields.io/maven-central/v/dev.icerock.moko/media) ](https://repo1.maven.org/maven2/dev/icerock/moko/media) ![kotlin-version](https://kotlin-version.aws.icerock.dev/kotlin-version?group=dev.icerock.moko&name=media)

# Mobile Kotlin media access
This is a Kotlin MultiPlatform library that provides media picking in common code (photo/video) and video player controls.

This is a Kotlin MultiPlatform library that provides media picking in common code (photo/video) and
video player controls.

## Table of Contents

- [Features](#features)
- [Requirements](#requirements)
- [Installation](#installation)
Expand All @@ -15,15 +18,22 @@ This is a Kotlin MultiPlatform library that provides media picking in common cod
- [License](#license)

## Features
TODO

- Capture camera photo
- Pick image from gallery
- Control video player
- **Compose Multiplatform** support

## Requirements

- Gradle version 6.8+
- Android API 16+
- iOS version 11.0+

## Installation
root build.gradle

root build.gradle

```groovy
allprojects {
repositories {
Expand All @@ -34,64 +44,158 @@ allprojects {
```

project build.gradle

```groovy
dependencies {
commonMainApi("dev.icerock.moko:media:0.10.0")
commonMainApi("dev.icerock.moko:media:0.11.0")
// Compose Multiplatform
commonMainApi("dev.icerock.moko:media-compose:0.11.0")
commonTestImplementation("dev.icerock.moko:media-test:0.11.0")
}
```

## Usage
TODO

```kotlin
class ViewModel(val mediaController: MediaPickerController): ViewModel() {
class ViewModel(val mediaController: MediaPickerController) : ViewModel() {
fun onSelectPhotoPressed() {
launch {
try {
val bitmap = mediaController.pickImage(MediaControllerSource.CAMERA)
// captured photo in bitmap
} catch(_: CanceledException) {
} catch (_: CanceledException) {
// cancel capture
} catch(error: Throwable) {
} catch (error: Throwable) {
// denied permission or file read error
}
}
}
}
```

android:

```kotlin
val viewModel = getViewModel {
val permissionsController = PermissionsController()
val mediaController = MediaPickerController(permissionsController)
ViewModel(mediaController)
}

viewModel.mediaController.bind(lifecycle, supportFragmentManager) // permissioncController bind automatically
viewModel.mediaController.bind(
lifecycle,
supportFragmentManager
) // permissioncController bind automatically
```

iOS:

```swift
let permissionsController = PermissionsController()
let mediaController = MediaPickerController(permissionsController: permissionsController, viewController: self)
let viewModel = ViewModel(mediaController: mediaController)
```

### Compose Multiplatform

```kotlin
@Composable
fun Sample() {
val factory = rememberMediaPickerControllerFactory()
val picker = remember(factory) { factory.createMediaPickerController() }
val coroutineScope = rememberCoroutineScope()

BindMediaPickerEffect(picker)

var image: ImageBitmap? by remember { mutableStateOf(null) }

image?.let {
Image(bitmap = it, contentDescription = null)
}

Button(
onClick = {
coroutineScope.launch {
val result = picker.pickImage(MediaSource.GALLERY)
image = result.toImageBitmap()
}
}
) {
Text(text = "Click on me")
}
}
```

or with moko-mvvm (with correct configuration change on android):

```kotlin
@Composable
fun Sample() {
val factory = rememberMediaPickerControllerFactory()
val viewModel: SampleViewModel = getViewModel(
key = "sample",
factory = viewModelFactory {
val picker = factory.createMediaPickerController()
SampleViewModel(picker)
}
)

BindMediaPickerEffect(viewModel.mediaPickerController)

val image: Bitmap? by viewModel.image.collectAsState()
val imageBitmap: ImageBitmap? = remember(image) { image?.toImageBitmap() }

imageBitmap?.let {
Image(bitmap = it, contentDescription = null)
}

Button(onClick = viewModel::onButtonClick) {
Text(text = "Click on me")
}
}

class SampleViewModel(
val mediaPickerController: MediaPickerController
) : ViewModel() {
private val _image: MutableStateFlow<Bitmap?> = MutableStateFlow(null)
val image: StateFlow<Bitmap?> get() = _image

fun onButtonClick() {
viewModelScope.launch {
try {
_image.value = mediaPickerController.pickImage(MediaSource.GALLERY)
} catch (exc: Exception) {
println("error $exc")
}
}
}
}
```

## Samples

More examples can be found in the [sample directory](sample).

## Set Up Locally
## Set Up Locally

- In [media directory](media) contains `media` library;
- In [sample directory](sample) contains samples on android, ios & mpp-library connected to apps.

## Contributing
All development (both new features and bug fixes) is performed in `develop` branch. This way `master` sources always contain sources of the most recently released version. Please send PRs with bug fixes to `develop` branch. Fixes to documentation in markdown files are an exception to this rule. They are updated directly in `master`.

All development (both new features and bug fixes) is performed in `develop` branch. This
way `master` sources always contain sources of the most recently released version. Please send PRs
with bug fixes to `develop` branch. Fixes to documentation in markdown files are an exception to
this rule. They are updated directly in `master`.

The `develop` branch is pushed to `master` during release.

More detailed guide for contributers see in [contributing guide](CONTRIBUTING.md).

## License

Copyright 2019 IceRock MAG Inc

Licensed under the Apache License, Version 2.0 (the "License");
Expand Down

0 comments on commit e899ae1

Please sign in to comment.