Capturable - 🚀Jetpack Compose utility library for capturing Composable content and transforming it into Bitmap Image🖼️

Overview

Capturable

Capturable

🚀 A Jetpack Compose utility library for converting Composable content into Bitmap image 🖼️ .
Made with ❤️ for Android Developers and Composers

Build Maven Central

Github Followers GitHub stars GitHub forks GitHub watchers Twitter Follow

💡 Introduction

In the previous View system, drawing Bitmap Image from View was very straightforward. But that's not the case with Jetpack Compose since it's different in many aspects from previous system. This library helps easy way to achieve the same results. It's built upon the ComposeView and uses View's APIs to draw the Bitmap image.

🚀 Implementation

You can check /app directory which includes example application for demonstration.

Gradle setup

In build.gradle of app module, include this dependency

dependencies {
    implementation "dev.shreyaspatil:capturable:1.0.1"
}

You can find latest version and changelogs in the releases.

Usage

1. Setup the controller

To be able to capture Composable content, you need instance of CaptureController by which you can decide when to capture the content. You can get the instance as follow.

@Composable
fun TicketScreen() {
    val captureController = rememberCaptureController()
}

rememberCaptureController() is a Composable function.

2. Add the content

The component which needs to be captured should be placed inside Capturable composable as follows.

@Composable
fun TicketScreen() {
    val captureController = rememberCaptureController()
    
    Capturable(
        controller = captureController,
        onCaptured = { bitmap, error ->
           // This is captured bitmap of a content inside Capturable Composable.
           if (bitmap != null) {
               // Bitmap is captured successfully. Do something with it!
           }
            
            if (error != null) {
                // Error occurred. Handle it!
            }
        }
    ) {
        // Composable content to be captured.
        // Here, `MovieTicketContent()` will be get captured
        MovieTicketContent(...)
    }
}

3. Capture the content

To capture the content, use CaptureController#capture() as follows.

Button(onClick = { captureController.capture() }) { ... }

On calling this method, request for capturing the content will be sent and event will be received in callback onCaptured with ImageBitmap as a parameter in the Capturable function.

By default, it captures the Bitmap using Bitmap.Config ARGB_8888. If you want to modify, you can provide config from Bitmap.Config enum.

Example:

captureController.capture(Bitmap.Config.ALPHA_8)

Make sure to call this method as a part of callback function and not as a part of the Composable function itself. Otherwise, it'll lead to capture bitmaps unnecessarily in recompositions which can degrade the performance of the application.

That's all needed!

📄 API Documentation

Visit the API documentation of this library to get more information in detail.


🙋‍♂️ Contribute

Read contribution guidelines for more information regarding contribution.

💬 Discuss?

Have any questions, doubts or want to present your opinions, views? You're always welcome. You can start discussions.

📝 License

MIT License

Copyright (c) 2022 Shreyas Patil

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Comments
  • Can't get the Bitmap when Capturable includes Network image

    Can't get the Bitmap when Capturable includes Network image

    Hello!! When I press the button where I have the controller.capture function, I get the same error all the time, at first I thought I had something wrong configured, I cloned the repository to see the example, and I had it similar, but the example does not give me the same error as me

    Error obtained

    java.lang.IllegalArgumentException: Software rendering doesn't support hardware bitmaps

    Capturable

                            Capturable(
                                modifier = Modifier.constrainAs(ivLetterImage) {
                                    linkTo(parent.start, parent.end)
                                    linkTo(parent.top, tvAddressee.top)
                                    width = Dimension.fillToConstraints
                                },
                                controller = controller,
                                onCaptured = { bitmap, error ->
                                    //ticketBitmap = bitmap
                                    error
                                    context.share(
                                        nameOfImage = letters,
                                        message = "",
                                        bitmap = bitmap?.asAndroidBitmap().orEmpty()
                                    )
                                }
                            ) {
                                LetterImage(
                                    addressee = addressee.value.text,
                                    message = message.value.text,
                                    sender = sender.value.text,
                                    letterImage = letterImage
                                )
                            }
    

    LetterImage Composable

    @ExperimentalFoundationApi
    @Composable
    fun LetterImage(
        modifier: Modifier = Modifier,
        addressee: String,
        message: String,
        sender: String,
        letterImage: String
    ) {
    
        ConstraintLayout(
            modifier = modifier
        ) {
    
            val (
                ivLetter,
                tvAddressee,
                tvMessage,
                tvSender
            ) = createRefs()
    
            NetworkImage(
                modifier = Modifier
                    .wrapContentHeight()
                    .fillMaxWidth()
                    .constrainAs(ivLetter) {
                        linkTo(parent.start, parent.end)
                        linkTo(parent.top, parent.bottom)
                    },
                contentScale = ContentScale.Crop,
                url = letterImage,
                builder = {
                    crossfade(true)
                }
            )
    
            Text(
                text = addressee,
                maxLines = 1,
                color = lightGreyPastel,
                fontWeight = FontWeight.Bold,
                style = TypographyNook.h6,
                modifier = Modifier
                    .padding(top = 30.dp, start = 40.dp)
                    .constrainAs(tvAddressee) {
                        start.linkTo(parent.start)
                        top.linkTo(ivLetter.top)
                    }
            )
    
            Text(
                text = message,
                maxLines = 7,
                color = lightGreyPastel,
                fontWeight = FontWeight.Bold,
                style = TypographyNook.h6,
                modifier = Modifier
                    .padding(top = 20.dp, start = 60.dp, end = 60.dp)
                    .constrainAs(tvMessage) {
                        linkTo(parent.start, parent.end)
                        top.linkTo(tvAddressee.bottom)
                        bottom.linkTo(tvSender.top)
                    }
            )
    
            Text(
                text = sender, //16,
                maxLines = 1,
                color = lightGreyPastel,
                fontWeight = FontWeight.Bold,
                style = TypographyNook.h6,
                modifier = Modifier
                    .padding(top = 20.dp, bottom = 30.dp, end = 40.dp)
                    .constrainAs(tvSender) {
                        end.linkTo(parent.end)
                        linkTo(tvMessage.bottom, parent.bottom)
                    }
            )
    
        }
    
    }
    
    bug 
    opened by jeluchu 17
  • Mismatch in catches of comparables

    Mismatch in catches of comparables

    Hello again!

    I've been doing some tests, and I've seen a couple of things that I don't know if this is really the case or if they are errors. I'll tell you about them so that you can clarify them for me.

    First case: Composable capture in LazyColumn

    I have a LazyColumn that has several items both above and below Capturable. I have in one of them a button with which I perform the controller.capture() action and at that moment I generate the bitmap to share/save it. The problem is that it does not really capture the composable that you have indicated, it obtains the size of the real composable, but if you have made scroll and that composable is between the TopAppBar for example the generated image is not really the one previously indicated.

    Capture of the image generated after the scroll has taken place Capture generated when the compostable is fully displayed on the screen

    
    LazyColumn {
    
     { ... }
    
                item {
                    Capturable(
                        controller = controller,
                        onCaptured = { bitmap, _ ->
                            if (bitmap != null)
                                with(context) {
                                    saveBitmap(bitmap.asAndroidBitmap())?.let { bitmapUri ->
                                        share(
                                            message = "",
                                            uri = bitmapUri
                                        )
                                    }
                                }
                        }
                    ) {
                        LetterImage(
                            addressee = addressee.value.text,
                            message = message.value.text,
                            sender = sender.value.text,
                            textColor = textColor.value,
                            bgColor = bgColor.value,
                            letterImage = letterImage
                        )
                    }
                }
    
      { ... }
    
    }
    
    

    Second case: Background colour of the capture

    Even if no background colour has been specified in the composable to be captured, the background colour that is inside the view is obtained, i.e. there is no option to capture the composable with a transparent background if I want it to capture it. As you can see in the images above, the background colour I have on the screen is red, but when I capture the image of the card, it adds a red background colour even though I want it to be transparent.

    Thank you in advance! And thank you for your work! 😄

    bug enhancement 
    opened by jeluchu 11
  • Captures only the visible part in screen

    Captures only the visible part in screen

    I am using LazyColumn, where I have several items.

    Each Item have a button to capture that specific item.

    If I click the button on a item, which is partially visible on the screen, it's only capturing the visible part.

    Is there a way, where I can capture the complete item, even if it's partially visible.

    opened by ShankarKakumani 6
  • Possibility to capture a compostable without displaying it

    Possibility to capture a compostable without displaying it

    Hello again!

    Based on the issue that I have opened that when taking a screenshot in a LazyColumn the captured image is cut, I have come up with an idea.

    I don't know if it could be done but I think it is a good suggestion, and it would be the ability to generate captures of the composables without the need to show them on the screen, that way as now, when pressing a button you would simply put as now the controller.capture() and previously have configured the Capturable with the Composable that you want to capture but without the need to be displayed in the view.

    Again, many thanks in advance!

    duplicate 
    opened by jeluchu 4
  • Problems with rounded corners when generating bitmaps

    Problems with rounded corners when generating bitmaps

    Inside the example in the repository, I have tried to see the things that can be done and I have seen that once inside the card (in this case the example), everything you put with a RoundedCornerShape, does not reproduce it, but it is shown as a rectangle with square corners

    To reproduce the problem, follow these steps In the example Code

    1. Go to BookingConfirmedContent Composable function
    2. Add inside the Modifier of the Text containing "Booking Confirmed" the following: .clip(RoundedCornerShape(16.dp)).background(Color.Red)
    3. Compile and see that the text "Booking Confirmed" has a red background with rounded corners
    4. Click on the "Preview Ticket Image" button and you will see that the red background with rounded corners has changed to a red background with square corners.
    opened by jeluchu 2
  • [Update]: Bump kotlinVersion from 1.5.31 to 1.6.10

    [Update]: Bump kotlinVersion from 1.5.31 to 1.6.10

    Bumps kotlinVersion from 1.5.31 to 1.6.10. Updates kotlin-gradle-plugin from 1.5.31 to 1.6.10

    Release notes

    Sourced from kotlin-gradle-plugin's releases.

    Kotlin 1.6.10

    Changelog

    Android

    • KT-49798 [MPP] [Android] AGP 7.1.0+ android target publications leak 'AgpVersionAttr' attribute

    Compiler

    Performance Improvements

    • KT-49821 Optimize LazyClassMemberScope#getContributedDescriptors: use nameFilter

    Fixes

    • KT-49833 java.lang.NullPointerException caused by accidental newline in package directive
    • KT-49838 Type inference fails on 1.6.0: Cannot use 'CapturedType(*)' as reified type parameter
    • KT-49752 Regression in method return type inference: "IllegalStateException: Expected some types"
    • KT-49876 Kotlin/Native: cross-compilation of Linux static library is broken in Windows in 1.6.0
    • KT-49792 Atomicfu: "standalone invocation of kotlinx.atomicfu.AtomicInt::compareAndSet that was not traced to previous field load" with suspend function
    • KT-49834 Coroutine method transformer generates invalid locals table.
    • KT-49441 Support friend modules in Kotlin Native
    • KT-49248 K/N: Symbol with IrSimpleFunctionSymbolImpl is unbound after 1.5.30
    • KT-49651 Inconsistent compiler APIs for repeatable annotations
    • KT-49168 JVM IR: IndexOutOfBoundsException with fun interface + suspend function as SAM method
    • KT-49573 No annotated types, compiler emits "Annotated types are not supported in typeOf"
    • KT-47192 Build Fake Overrides for internal members of classes from friend module
    • KT-48673 IR: IllegalStateException for usage of internal member declared in a superclass in another module

    JavaScript

    • KT-47811 KJS / IR: "ClassCastException" when using suspend function in console.log

    Language Design

    • KT-49868 Support language version 1.3 in Kotlin 1.6.10

    Libraries

    • KT-50173 Different behavior of Regex escapeReplacement function in JVM and JS

    Tools. Android Extensions

    • KT-49799 NullPointerException when using kotlin-android-extensions synthetic after update to Kotlin 1.6.0

    Tools. Compiler Plugins

    • KT-50005 jvm-abi-gen plugin: do not change the declaration order in generated jars
    • KT-49726 JVM/IR: "IllegalArgumentException: Null argument in ExpressionCodegen for parameter VALUE_PARAMETER": Serialization with sealed class as type parameter

    ... (truncated)

    Changelog

    Sourced from kotlin-gradle-plugin's changelog.

    1.6.10

    Android

    • KT-49798 [MPP] [Android] AGP 7.1.0+ android target publications leak 'AgpVersionAttr' attribute

    Compiler

    Performance Improvements

    • KT-49821 Optimize LazyClassMemberScope#getContributedDescriptors: use nameFilter

    Fixes

    • KT-49833 java.lang.NullPointerException caused by accidental newline in package directive
    • KT-49838 Type inference fails on 1.6.0: Cannot use 'CapturedType(*)' as reified type parameter
    • KT-49752 Regression in method return type inference: "IllegalStateException: Expected some types"
    • KT-49876 Kotlin/Native: cross-compilation of Linux static library is broken in Windows in 1.6.0
    • KT-49792 Atomicfu: "standalone invocation of kotlinx.atomicfu.AtomicInt::compareAndSet that was not traced to previous field load" with suspend function
    • KT-49834 Coroutine method transformer generates invalid locals table.
    • KT-49441 Support friend modules in Kotlin Native
    • KT-49248 K/N: Symbol with IrSimpleFunctionSymbolImpl is unbound after 1.5.30
    • KT-49651 Inconsistent compiler APIs for repeatable annotations
    • KT-49168 JVM IR: IndexOutOfBoundsException with fun interface + suspend function as SAM method
    • KT-49573 No annotated types, compiler emits "Annotated types are not supported in typeOf"
    • KT-47192 Build Fake Overrides for internal members of classes from friend module
    • KT-48673 IR: IllegalStateException for usage of internal member declared in a superclass in another module

    JavaScript

    • KT-47811 KJS / IR: "ClassCastException" when using suspend function in console.log

    Language Design

    • KT-49868 Support language version 1.3 in Kotlin 1.6.10

    Libraries

    • KT-50173 Different behavior of Regex escapeReplacement function in JVM and JS

    Tools. Android Extensions

    • KT-49799 NullPointerException when using kotlin-android-extensions synthetic after update to Kotlin 1.6.0

    Tools. Compiler Plugins

    • KT-50005 jvm-abi-gen plugin: do not change the declaration order in generated jars
    • KT-49726 JVM/IR: "IllegalArgumentException: Null argument in ExpressionCodegen for parameter VALUE_PARAMETER": Serialization with sealed class as type parameter

    Tools. Gradle

    ... (truncated)

    Commits
    • 1b49105 Add changelog for 1.6.10
    • 72551e4 KT-50173 Fix Regex.escapeReplacement function in JS
    • c71e090 KGP - Fix flaky tests invoking javac through JDK APIs
    • 73120b9 [Gradle, JS] Add tests for windows ignore-scripts
    • 9bffcfa [Gradle, JS] Fix path setting in Windows
    • 06a205f Fix 'debug.keystore' location also for 'com.android.test' plugin.
    • a043f77 Disable publishing 'android-test-fixes' plugin to Gradle portal.
    • 1dcbd28 Kotlin Gradle plugin - Remove assertions from integration tests
    • 43df58a Pin AGP 'debug.keystore' in the repo.
    • e705a36 Apply default pluginManagement in settings for old test setup.
    • Additional commits viewable in compare view

    Updates dokka-gradle-plugin from 1.5.31 to 1.6.10

    Release notes

    Sourced from dokka-gradle-plugin's releases.

    1.6.10 Beta

    Changes

    • Support Kotlin 1.6.10
    • Add a sample project for versioning multi-module (Kotlin/dokka#2170)

    Bugfixes

    Maintenance

    1.6.0 Beta

    Changes:

    • New UI
    • Support of version plugin for single module projects
    • Allow package-level suppression (#2209), thanks @​owengray-google
    • GFM: Use Markdown syntax to render lists (#2098), thanks @​sgilson
    • Fix names of nested inheritors
    • Fix adding new custom stylesheets in submodules
    • Add keywords expect and actual in signatures
    Commits
    • 01a17fc Fix css bugs wih link and table row (#2284)
    • f7db503 Update kotlin and dokka versions to 1.6.10 (#2274)
    • 17cd417 Fix setup js deps (#2258)
    • 702c102 Use sourceRoots as samples dirs by default (#2216)
    • a485ca9 Bump coroutines to 1.6.0 in integration test (#2276)
    • ed5d582 Merge pull request #2259 from Kotlin/2213-description-list-support
    • bf9d62a Bump de.undercouch.download to 4.1.2 (#2268)
    • d219894 Make breakable text into See also block (#2267)
    • 4dc0654 Fix for repositories not defined issue in versioning multimodule example (#2263)
    • 19b2a2d Remove duplicated rendering of top level description tags
    • Additional commits viewable in compare view

    Updates kotlin-as-java-plugin from 1.5.31 to 1.6.10

    Release notes

    Sourced from kotlin-as-java-plugin's releases.

    1.6.10 Beta

    Changes

    • Support Kotlin 1.6.10
    • Add a sample project for versioning multi-module (Kotlin/dokka#2170)

    Bugfixes

    Maintenance

    1.6.0 Beta

    Changes:

    • New UI
    • Support of version plugin for single module projects
    • Allow package-level suppression (#2209), thanks @​owengray-google
    • GFM: Use Markdown syntax to render lists (#2098), thanks @​sgilson
    • Fix names of nested inheritors
    • Fix adding new custom stylesheets in submodules
    • Add keywords expect and actual in signatures
    Commits
    • 01a17fc Fix css bugs wih link and table row (#2284)
    • f7db503 Update kotlin and dokka versions to 1.6.10 (#2274)
    • 17cd417 Fix setup js deps (#2258)
    • 702c102 Use sourceRoots as samples dirs by default (#2216)
    • a485ca9 Bump coroutines to 1.6.0 in integration test (#2276)
    • ed5d582 Merge pull request #2259 from Kotlin/2213-description-list-support
    • bf9d62a Bump de.undercouch.download to 4.1.2 (#2268)
    • d219894 Make breakable text into See also block (#2267)
    • 4dc0654 Fix for repositories not defined issue in versioning multimodule example (#2263)
    • 19b2a2d Remove duplicated rendering of top level description tags
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • [Update]: Bump coroutinesVersion from 1.5.2 to 1.6.0

    [Update]: Bump coroutinesVersion from 1.5.2 to 1.6.0

    Bumps coroutinesVersion from 1.5.2 to 1.6.0. Updates kotlinx-coroutines-core from 1.5.2 to 1.6.0

    Release notes

    Sourced from kotlinx-coroutines-core's releases.

    1.6.0

    Note that this is a full changelog relative to the 1.5.2 version. Changelog relative to 1.6.0-RC3 can be found at the end.

    kotlinx-coroutines-test rework

    Dispatchers

    • Introduced CoroutineDispatcher.limitedParallelism that allows obtaining a view of the original dispatcher with limited parallelism (#2919).
    • Dispatchers.IO.limitedParallelism usages ignore the bound on the parallelism level of Dispatchers.IO itself to avoid starvation (#2943).
    • Introduced new Dispatchers.shutdown method for containerized environments (#2558).
    • newSingleThreadContext and newFixedThreadPoolContext are promoted to delicate API (#2919).

    Breaking changes

    • When racing with cancellation, the future builder no longer reports unhandled exceptions into the global CoroutineExceptionHandler. Thanks @​vadimsemenov! (#2774, #2791).
    • Mutex.onLock is deprecated for removal (#2794).
    • Dispatchers.Main is now used as the default source of time for delay and withTimeout when present(#2972).
      • To opt-out from this behaviour, kotlinx.coroutines.main.delay system property can be set to false.
    • Java target of coroutines build is now 8 instead of 6 (#1589).
    • Source-breaking change: extension collect no longer resolves when used with a non-in-place argument of a functional type. This is a candidate for a fix, uncovered after 1.6.0, see #3107 for the additional details.

    Bug fixes and improvements

    • Kotlin is updated to 1.6.0.
    • Kotlin/Native new memory model is now supported in regular builds of coroutines conditionally depending on whether kotlin.native.binary.memoryModel is enabled (#2914).
    • Introduced CopyableThreadContextElement for mutable context elements shared among multiple coroutines. Thanks @​yorickhenning! (#2893).
    • transformWhile, awaitClose, ProducerScope, merge, runningFold, runingReduce, and scan are promoted to stable API (#2971).
    • SharedFlow.subscriptionCount no longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#2488, #2863, #2871).
    • Flow exception transparency mechanism is improved to be more exception-friendly (#3017, #2860).
    • Cancellation from flat* operators that leverage multiple coroutines is no longer propagated upstream (#2964).
    • SharedFlow.collect now returns Nothing (#2789, #2502).
    • DisposableHandle is now fun interface, and corresponding inline extension is removed (#2790).
    • FlowCollector is now fun interface, and corresponding inline extension is removed (#3047).
    • Deprecation level of all previously deprecated signatures is raised (#3024).
    • The version file is shipped with each JAR as a resource (#2941).
    • Unhandled exceptions on K/N are passed to the standard library function processUnhandledException (#2981).
    • A direct executor is used for Task callbacks in kotlinx-coroutines-play-services (#2990).
    • Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#2865).
    • Default CoroutineExceptionHandler is loaded eagerly and does not invoke ServiceLoader on its exception-handling path (#2552).
    • Fixed the R8 rules for ServiceLoader optimization (#2880).
    • Fixed BlockHound integration false-positives (#2894, #2866, #2937).
    • Fixed the exception handler being invoked several times on Android, thanks to @​1zaman (#3056).
    • SendChannel.trySendBlocking is now available on Kotlin/Native (#3064).
    • The exception recovery mechanism now uses ClassValue when available (#2997).
    • JNA is updated to 5.9.0 to support Apple M1 (#3001).

    ... (truncated)

    Changelog

    Sourced from kotlinx-coroutines-core's changelog.

    Version 1.6.0

    Note that this is a full changelog relative to the 1.5.2 version. Changelog relative to 1.6.0-RC3 can be found at the end.

    kotlinx-coroutines-test rework

    Dispatchers

    • Introduced CoroutineDispatcher.limitedParallelism that allows obtaining a view of the original dispatcher with limited parallelism (#2919).
    • Dispatchers.IO.limitedParallelism usages ignore the bound on the parallelism level of Dispatchers.IO itself to avoid starvation (#2943).
    • Introduced new Dispatchers.shutdown method for containerized environments (#2558).
    • newSingleThreadContext and newFixedThreadPoolContext are promoted to delicate API (#2919).

    Breaking changes

    • When racing with cancellation, the future builder no longer reports unhandled exceptions into the global CoroutineExceptionHandler. Thanks @​vadimsemenov! (#2774, #2791).
    • Mutex.onLock is deprecated for removal (#2794).
    • Dispatchers.Main is now used as the default source of time for delay and withTimeout when present(#2972).
      • To opt-out from this behaviour, kotlinx.coroutines.main.delay system property can be set to false.
    • Java target of coroutines build is now 8 instead of 6 (#1589).
    • Source-breaking change: extension collect no longer resolves when used with a non-in-place argument of a functional type. This is a candidate for a fix, uncovered after 1.6.0, see #3107 for the additional details.

    Bug fixes and improvements

    • Kotlin is updated to 1.6.0.
    • Kotlin/Native new memory model is now supported in regular builds of coroutines conditionally depending on whether kotlin.native.binary.memoryModel is enabled (#2914).
    • Introduced CopyableThreadContextElement for mutable context elements shared among multiple coroutines. Thanks @​yorickhenning! (#2893).
    • transformWhile, awaitClose, ProducerScope, merge, runningFold, runingReduce, and scan are promoted to stable API (#2971).
    • SharedFlow.subscriptionCount no longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#2488, #2863, #2871).
    • Flow exception transparency mechanism is improved to be more exception-friendly (#3017, #2860).
    • Cancellation from flat* operators that leverage multiple coroutines is no longer propagated upstream (#2964).
    • SharedFlow.collect now returns Nothing (#2789, #2502).
    • DisposableHandle is now fun interface, and corresponding inline extension is removed (#2790).
    • FlowCollector is now fun interface, and corresponding inline extension is removed (#3047).
    • Deprecation level of all previously deprecated signatures is raised (#3024).
    • The version file is shipped with each JAR as a resource (#2941).
    • Unhandled exceptions on K/N are passed to the standard library function processUnhandledException (#2981).
    • A direct executor is used for Task callbacks in kotlinx-coroutines-play-services (#2990).
    • Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#2865).
    • Default CoroutineExceptionHandler is loaded eagerly and does not invoke ServiceLoader on its exception-handling path (#2552).
    • Fixed the R8 rules for ServiceLoader optimization (#2880).
    • Fixed BlockHound integration false-positives (#2894, #2866, #2937).
    • Fixed the exception handler being invoked several times on Android, thanks to @​1zaman (#3056).
    • SendChannel.trySendBlocking is now available on Kotlin/Native (#3064).
    • The exception recovery mechanism now uses ClassValue when available (#2997).

    ... (truncated)

    Commits

    Updates kotlinx-coroutines-test from 1.5.2 to 1.6.0

    Release notes

    Sourced from kotlinx-coroutines-test's releases.

    1.6.0

    Note that this is a full changelog relative to the 1.5.2 version. Changelog relative to 1.6.0-RC3 can be found at the end.

    kotlinx-coroutines-test rework

    Dispatchers

    • Introduced CoroutineDispatcher.limitedParallelism that allows obtaining a view of the original dispatcher with limited parallelism (#2919).
    • Dispatchers.IO.limitedParallelism usages ignore the bound on the parallelism level of Dispatchers.IO itself to avoid starvation (#2943).
    • Introduced new Dispatchers.shutdown method for containerized environments (#2558).
    • newSingleThreadContext and newFixedThreadPoolContext are promoted to delicate API (#2919).

    Breaking changes

    • When racing with cancellation, the future builder no longer reports unhandled exceptions into the global CoroutineExceptionHandler. Thanks @​vadimsemenov! (#2774, #2791).
    • Mutex.onLock is deprecated for removal (#2794).
    • Dispatchers.Main is now used as the default source of time for delay and withTimeout when present(#2972).
      • To opt-out from this behaviour, kotlinx.coroutines.main.delay system property can be set to false.
    • Java target of coroutines build is now 8 instead of 6 (#1589).
    • Source-breaking change: extension collect no longer resolves when used with a non-in-place argument of a functional type. This is a candidate for a fix, uncovered after 1.6.0, see #3107 for the additional details.

    Bug fixes and improvements

    • Kotlin is updated to 1.6.0.
    • Kotlin/Native new memory model is now supported in regular builds of coroutines conditionally depending on whether kotlin.native.binary.memoryModel is enabled (#2914).
    • Introduced CopyableThreadContextElement for mutable context elements shared among multiple coroutines. Thanks @​yorickhenning! (#2893).
    • transformWhile, awaitClose, ProducerScope, merge, runningFold, runingReduce, and scan are promoted to stable API (#2971).
    • SharedFlow.subscriptionCount no longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#2488, #2863, #2871).
    • Flow exception transparency mechanism is improved to be more exception-friendly (#3017, #2860).
    • Cancellation from flat* operators that leverage multiple coroutines is no longer propagated upstream (#2964).
    • SharedFlow.collect now returns Nothing (#2789, #2502).
    • DisposableHandle is now fun interface, and corresponding inline extension is removed (#2790).
    • FlowCollector is now fun interface, and corresponding inline extension is removed (#3047).
    • Deprecation level of all previously deprecated signatures is raised (#3024).
    • The version file is shipped with each JAR as a resource (#2941).
    • Unhandled exceptions on K/N are passed to the standard library function processUnhandledException (#2981).
    • A direct executor is used for Task callbacks in kotlinx-coroutines-play-services (#2990).
    • Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#2865).
    • Default CoroutineExceptionHandler is loaded eagerly and does not invoke ServiceLoader on its exception-handling path (#2552).
    • Fixed the R8 rules for ServiceLoader optimization (#2880).
    • Fixed BlockHound integration false-positives (#2894, #2866, #2937).
    • Fixed the exception handler being invoked several times on Android, thanks to @​1zaman (#3056).
    • SendChannel.trySendBlocking is now available on Kotlin/Native (#3064).
    • The exception recovery mechanism now uses ClassValue when available (#2997).
    • JNA is updated to 5.9.0 to support Apple M1 (#3001).

    ... (truncated)

    Changelog

    Sourced from kotlinx-coroutines-test's changelog.

    Version 1.6.0

    Note that this is a full changelog relative to the 1.5.2 version. Changelog relative to 1.6.0-RC3 can be found at the end.

    kotlinx-coroutines-test rework

    Dispatchers

    • Introduced CoroutineDispatcher.limitedParallelism that allows obtaining a view of the original dispatcher with limited parallelism (#2919).
    • Dispatchers.IO.limitedParallelism usages ignore the bound on the parallelism level of Dispatchers.IO itself to avoid starvation (#2943).
    • Introduced new Dispatchers.shutdown method for containerized environments (#2558).
    • newSingleThreadContext and newFixedThreadPoolContext are promoted to delicate API (#2919).

    Breaking changes

    • When racing with cancellation, the future builder no longer reports unhandled exceptions into the global CoroutineExceptionHandler. Thanks @​vadimsemenov! (#2774, #2791).
    • Mutex.onLock is deprecated for removal (#2794).
    • Dispatchers.Main is now used as the default source of time for delay and withTimeout when present(#2972).
      • To opt-out from this behaviour, kotlinx.coroutines.main.delay system property can be set to false.
    • Java target of coroutines build is now 8 instead of 6 (#1589).
    • Source-breaking change: extension collect no longer resolves when used with a non-in-place argument of a functional type. This is a candidate for a fix, uncovered after 1.6.0, see #3107 for the additional details.

    Bug fixes and improvements

    • Kotlin is updated to 1.6.0.
    • Kotlin/Native new memory model is now supported in regular builds of coroutines conditionally depending on whether kotlin.native.binary.memoryModel is enabled (#2914).
    • Introduced CopyableThreadContextElement for mutable context elements shared among multiple coroutines. Thanks @​yorickhenning! (#2893).
    • transformWhile, awaitClose, ProducerScope, merge, runningFold, runingReduce, and scan are promoted to stable API (#2971).
    • SharedFlow.subscriptionCount no longer conflates incoming updates and gives all subscribers a chance to observe a short-lived subscription (#2488, #2863, #2871).
    • Flow exception transparency mechanism is improved to be more exception-friendly (#3017, #2860).
    • Cancellation from flat* operators that leverage multiple coroutines is no longer propagated upstream (#2964).
    • SharedFlow.collect now returns Nothing (#2789, #2502).
    • DisposableHandle is now fun interface, and corresponding inline extension is removed (#2790).
    • FlowCollector is now fun interface, and corresponding inline extension is removed (#3047).
    • Deprecation level of all previously deprecated signatures is raised (#3024).
    • The version file is shipped with each JAR as a resource (#2941).
    • Unhandled exceptions on K/N are passed to the standard library function processUnhandledException (#2981).
    • A direct executor is used for Task callbacks in kotlinx-coroutines-play-services (#2990).
    • Metadata of coroutines artifacts leverages Gradle platform to have all versions of dependencies aligned (#2865).
    • Default CoroutineExceptionHandler is loaded eagerly and does not invoke ServiceLoader on its exception-handling path (#2552).
    • Fixed the R8 rules for ServiceLoader optimization (#2880).
    • Fixed BlockHound integration false-positives (#2894, #2866, #2937).
    • Fixed the exception handler being invoked several times on Android, thanks to @​1zaman (#3056).
    • SendChannel.trySendBlocking is now available on Kotlin/Native (#3064).
    • The exception recovery mechanism now uses ClassValue when available (#2997).

    ... (truncated)

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 2
  • [Update]: Bump gradle-maven-publish-plugin from 0.20.0 to 0.23.0

    [Update]: Bump gradle-maven-publish-plugin from 0.20.0 to 0.23.0

    Bumps gradle-maven-publish-plugin from 0.20.0 to 0.23.0.

    Release notes

    Sourced from gradle-maven-publish-plugin's releases.

    0.23.0

    Changelog

    0.22.0

    CHANGELOG

    0.21.0

    Changelog

    Changelog

    Sourced from gradle-maven-publish-plugin's changelog.

    Version 0.23.0 (2022-12-29)

    Updated docs can be found on the new website.

    • NEW: It is now possible to set group id, artifact id directly through the DSL
      mavenPublishing {
        coordinates("com.example", "library", "1.0.3")
      }
      
    • project.group and project.version will still be used as default values for group and version if the GROUP/VERSION_NAME Gradle properties do not exist and coordinates was not called, however there are 2 behavior changes:
      • The GROUP and VERSION_NAME Gradle properties take precedence over project.group and project.version instead of being overwritten by them. If you need to define the properties but replace them for some projects, please use the new coordinates method instead.
      • The GROUP and VERSION_NAME Gradle properties will not be explicitly set as project.group and project.version anymore.
    • NEW: Added dropRepository task that will drop a Sonatype staging repository. It is possible to specify which repository to drop by adding a --repository parameter with the id of the staging repository that was printed during publish. If no repository is specified and there is only one staging repository, that one will be dropped.
    • Added workaround to also publish sources for the java-test-fixtures plugin
    • Fixed publishing Kotlin/JS projects with the base plugin.
    • Fixed that a POM configured through the DSL is incomplete when publishing Gradle plugins.
    • The minimum supported Gradle version has been increased to 7.3.

    Version 0.22.0 (2022-09-09)

    • NEW: When publishing to maven central by setting SONATYPE_HOST or calling publishToMavenCentral(...) the plugin will now explicitly create a staging repository on Sonatype. This avoids issues where a single build would create multiple repositories
    • The above change means that the plugin supports parallel builds and it is not neccessary anymore to use --no-parallel and --no-daemon together with publish
    • NEW: When publishing with the publish or publishAllPublicationsToMavenCentralRepository tasks the plugin will automatically close the staging repository at the end of the build if it was successful.
    • NEW: Option to also automatically release the staging repository after closing was susccessful
    SONATYPE_HOST=DEFAULT # or S01
    SONATYPE_AUTOMATIC_RELEASE=true
    

    or

    mavenPublishing {
      publishToMavenCentral("DEFAULT", true)
      // or publishToMavenCentral("S01", true)
    }
    
    • in case the option above is enabled, the closeAndReleaseRepository task is not needed anymore
    • when closing the repository fails the plugin will fail the build immediately instead of timing out
    • when closing the repository fails the plugin will try to print the error messages from Nexus
    • increased timeouts for calls to the Sonatype Nexus APIs

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • [Update]: Bump com.diffplug.spotless from 6.11.0 to 6.12.0

    [Update]: Bump com.diffplug.spotless from 6.11.0 to 6.12.0

    Bumps com.diffplug.spotless from 6.11.0 to 6.12.0.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • [Update]: Bump gradle from 7.2.2 to 7.3.0

    [Update]: Bump gradle from 7.2.2 to 7.3.0

    Bumps gradle from 7.2.2 to 7.3.0.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • [Update]: Bump gradle-maven-publish-plugin from 0.20.0 to 0.22.0

    [Update]: Bump gradle-maven-publish-plugin from 0.20.0 to 0.22.0

    Bumps gradle-maven-publish-plugin from 0.20.0 to 0.22.0.

    Release notes

    Sourced from gradle-maven-publish-plugin's releases.

    0.21.0

    Changelog

    Changelog

    Sourced from gradle-maven-publish-plugin's changelog.

    Version 0.22.0 (2022-09-09)

    • NEW: When publishing to maven central by setting SONATYPE_HOST or calling publishToMavenCentral(...) the plugin will now explicitly create a staging repository on Sonatype. This avoids issues where a single build would create multiple repositories
    • The above change means that the plugin supports parallel builds and it is not neccessary anymore to use --no-parallel and --no-daemon together with publish
    • NEW: When publishing with the publish or publishAllPublicationsToMavenCentralRepository tasks the plugin will automatically close the staging repository at the end of the build if it was successful.
    • NEW: Option to also automatically release the staging repository after closing was susccessful
    SONATYPE_HOST=DEFAULT # or S01
    SONATYPE_AUTOMATIC_RELEASE=true
    

    or

    mavenPublishing {
      publishToMavenCentral("DEFAULT", true)
      // or publishToMavenCentral("S01", true)
    }
    
    • in case the option above is enabled, the closeAndReleaseRepository task is not needed anymore
    • when closing the repository fails the plugin will fail the build immediately instead of timing out
    • when closing the repository fails the plugin will try to print the error messages from Nexus
    • increased timeouts for calls to the Sonatype Nexus APIs
    • fixed incompatibility with the com.gradle.plugin-publish plugin
    • added wokaround for Kotlin multiplatform builds reporting disabled build optimizations

    Version 0.21.0 (2022-07-11)

    Minimum supported Gradle version is now 7.2.0

    Minimum supported Android Gradle Plugin versions are now 7.1.2, 7.2.0-beta02 and 7.3.0-alpha01

    Behavior changes

    The com.vanniktech.maven.publish stops adding Maven Central (Sonatype OSS) as a publishing target and will not enable GPG signing by default. To continue publishing to maven central and signing artifacts either add the following to your gradle.properties:

    SONATYPE_HOST=DEFAULT
    # SONATYPE_HOST=S01 for publishing through s01.oss.sonatype.org
    RELEASE_SIGNING_ENABLED=true
    

    or add this to your Groovy build files:

    mavenPublishing {
      publishToMavenCentral()
      // publishToMavenCentral("S01") for publishing through s01.oss.sonatype.org
      signAllPublications()
    }
    

    ... (truncated)

    Commits
    • 7df14f3 Prepare for release 0.22.0
    • 3dd754a Use version catalog to manage dependencies to make renovate work again (#412)
    • 0dc4587 prepare changelog for next release (#411)
    • 0db5be2 drop repository when build fails (#410)
    • 19a8631 retrieve activity messages when closing repository fails (#409)
    • d28e119 Use composite builds instead of buildSrc (#408)
    • 5e48420 Create nexus lazily to avoid an error when properties aren't set (#405)
    • 86b2c8f workaround issues with the signing setup (#404)
    • c143338 automatically close the created repository and optionally also release it (#403)
    • 482502d detect when closing the repository failed (#402)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 1
  • [Update]: Bump com.diffplug.spotless from 6.11.0 to 6.12.1

    [Update]: Bump com.diffplug.spotless from 6.11.0 to 6.12.1

    Bumps com.diffplug.spotless from 6.11.0 to 6.12.1.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • [Update]: Bump gradle-maven-publish-plugin from 0.20.0 to 0.23.1

    [Update]: Bump gradle-maven-publish-plugin from 0.20.0 to 0.23.1

    Bumps gradle-maven-publish-plugin from 0.20.0 to 0.23.1.

    Release notes

    Sourced from gradle-maven-publish-plugin's releases.

    0.23.1

    Changelog

    0.23.0

    Changelog

    0.22.0

    CHANGELOG

    0.21.0

    Changelog

    Changelog

    Sourced from gradle-maven-publish-plugin's changelog.

    Version 0.23.1 (2022-12-30)

    • also support publishing sources for the java-test-fixtures plugin in Kotlin/JVM projects
    • suppress Gradle warnings when publishing a project that uses java-test-fixtures

    Version 0.23.0 (2022-12-29)

    Updated docs can be found on the new website.

    • NEW: It is now possible to set group id, artifact id directly through the DSL
      mavenPublishing {
        coordinates("com.example", "library", "1.0.3")
      }
      
    • project.group and project.version will still be used as default values for group and version if the GROUP/VERSION_NAME Gradle properties do not exist and coordinates was not called, however there are 2 behavior changes:
      • The GROUP and VERSION_NAME Gradle properties take precedence over project.group and project.version instead of being overwritten by them. If you need to define the properties but replace them for some projects, please use the new coordinates method instead.
      • The GROUP and VERSION_NAME Gradle properties will not be explicitly set as project.group and project.version anymore.
    • NEW: Added dropRepository task that will drop a Sonatype staging repository. It is possible to specify which repository to drop by adding a --repository parameter with the id of the staging repository that was printed during publish. If no repository is specified and there is only one staging repository, that one will be dropped.
    • Added workaround to also publish sources for the java-test-fixtures plugin
    • Fixed publishing Kotlin/JS projects with the base plugin.
    • Fixed that a POM configured through the DSL is incomplete when publishing Gradle plugins.
    • The minimum supported Gradle version has been increased to 7.3.

    Version 0.22.0 (2022-09-09)

    • NEW: When publishing to maven central by setting SONATYPE_HOST or calling publishToMavenCentral(...) the plugin will now explicitly create a staging repository on Sonatype. This avoids issues where a single build would create multiple repositories
    • The above change means that the plugin supports parallel builds and it is not neccessary anymore to use --no-parallel and --no-daemon together with publish
    • NEW: When publishing with the publish or publishAllPublicationsToMavenCentralRepository tasks the plugin will automatically close the staging repository at the end of the build if it was successful.
    • NEW: Option to also automatically release the staging repository after closing was susccessful
    SONATYPE_HOST=DEFAULT # or S01
    SONATYPE_AUTOMATIC_RELEASE=true
    

    or

    mavenPublishing {
      publishToMavenCentral("DEFAULT", true)
      // or publishToMavenCentral("S01", true)
    </tr></table> 
    

    ... (truncated)

    Commits
    • 55b2fbf Prepare for release 0.23.1.
    • 925f5d2 also setup test fixtures sources jar for Kotlin/JVM, suppress warnings (#486)
    • a05892d update branch name in actions
    • 08f2406 test against Gradle 8.0-rc-1 (#485)
    • 6f60a18 remove unused test dependencies (#484)
    • aae16f7 Update dependency com.vanniktech:gradle-maven-publish-plugin to v0.23.0 (#483)
    • 8d84276 Prepare for next development version
    • 1f8a8c1 Prepare for release 0.23.0.
    • c6d8640 typo2
    • bc3a43e typo
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • [Update]: Bump gradle from 7.2.2 to 7.3.1

    [Update]: Bump gradle from 7.2.2 to 7.3.1

    Bumps gradle from 7.2.2 to 7.3.1.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • [Update]: Bump kotlinVersion from 1.6.10 to 1.7.20

    [Update]: Bump kotlinVersion from 1.6.10 to 1.7.20

    Bumps kotlinVersion from 1.6.10 to 1.7.20. Updates kotlin-gradle-plugin from 1.6.10 to 1.7.20

    Release notes

    Sourced from kotlin-gradle-plugin's releases.

    Kotlin 1.7.20

    1.7.20

    Analysis API

    • KT-52667 FIR IDE: fun interfaces (SAM interfaces) are not properly resolved
    • KT-52136 FIR: Implicit type declaration from the other module cannot be used for overloading

    Analysis API. FE1.0

    • KT-51962 Analysis API: Finish Analysis API for FE1.0

    Analysis API. FIR

    • KT-52779 FIR IDE: Import Optimizer cannot handle generic type qualifiers
    • KT-50236 Fix OOB modification trackers for non-Kotlin code
    • KT-51240 Analysis API: KtAnalysisSession for a specific module cannot create a symbol for PSI that cannot be seen from that module.
    • KT-50868 Analysis API: decompiled type aliases are not resolved

    Compiler

    • KT-53739 Builder inference, extension hides members
    • KT-53733 Kotlin/Native: update source documentation for the new default memory manager
    • KT-53667 Compiler crashes on attempt to alloc a string on the stack in new MM
    • KT-53480 Internal error in file lowering: java.lang.ClassNotFoundException: com.android.systemui.R$string
    • KT-52843 Compose: NPE at Parameters.getParameterByDeclarationSlot if inline function with default arguments takes a lambda which captures value class represented by Long
    • KT-53475 Kotlin/Native for iOS: "IllegalArgumentException: Sequence has more than one element"

    New Features

    • KT-52495 Support until operator in back-ends
    • KT-52420 Implement resolve of until operator
    • KT-52419 Implement until operator in the parser
    • KT-33755 Kotlin/Native: Provide a way to customize a bundle Identifier of a generated framework
    • KT-51665 FIR: implement label resolve for "typed this" case
    • KT-52361 Report warning on potentially empty intersection types

    Performance Improvements

    • KT-47816 Disable script discovery for non-script environments
    • KT-48635 JVM IR: Double/Float values are boxed when comparing for equality in equals method of data/value classes
    • KT-23397 Optimize out field for property delegate when it's safe (JVM)

    Fixes

    • KT-53272 Backend Internal error: Exception during IR lowering / No such value argument slot: 2
    • KT-53124 Receiver type mismatch when combining extension properties, type projections, Java sources, and F-bounded type-variables
    • KT-51868 JVM / IR: Inconsistent behaviour between lambda expression and SAM interface conversion for the same interface
    • KT-36770 Prohibit unsafe calls with expected @NotNull T and given Kotlin generic parameter with nullable bound
    • KT-52974 "IllegalStateException: Symbol with IrSimpleFunctionSymbolImpl is unbound" compiling native targets of MPP project
    • KT-53007 JVM: "Bad invokespecial instruction: current class isn't assignable to reference class" when call superclass of outer class method from inner class

    ... (truncated)

    Changelog

    Sourced from kotlin-gradle-plugin's changelog.

    1.7.20

    Analysis API

    • KT-52667 FIR IDE: fun interfaces (SAM interfaces) are not properly resolved
    • KT-52136 FIR: Implicit type declaration from the other module cannot be used for overloading

    Analysis API. FE1.0

    • KT-51962 Analysis API: Finish Analysis API for FE1.0

    Analysis API. FIR

    • KT-52779 FIR IDE: Import Optimizer cannot handle generic type qualifiers
    • KT-50236 Fix OOB modification trackers for non-Kotlin code
    • KT-51240 Analysis API: KtAnalysisSession for a specific module cannot create a symbol for PSI that cannot be seen from that module.
    • KT-50868 Analysis API: decompiled type aliases are not resolved

    Compiler

    • KT-53739 Builder inference, extension hides members
    • KT-53733 Kotlin/Native: update source documentation for the new default memory manager
    • KT-53667 Compiler crashes on attempt to alloc a string on the stack in new MM
    • KT-53480 Internal error in file lowering: java.lang.ClassNotFoundException: com.android.systemui.R$string
    • KT-52843 Compose: NPE at Parameters.getParameterByDeclarationSlot if inline function with default arguments takes a lambda which captures value class represented by Long
    • KT-53475 Kotlin/Native for iOS: "IllegalArgumentException: Sequence has more than one element"

    New Features

    • KT-52495 Support until operator in back-ends
    • KT-52420 Implement resolve of until operator
    • KT-52419 Implement until operator in the parser
    • KT-33755 Kotlin/Native: Provide a way to customize a bundle Identifier of a generated framework
    • KT-51665 FIR: implement label resolve for "typed this" case
    • KT-52361 Report warning on potentially empty intersection types

    Performance Improvements

    • KT-47816 Disable script discovery for non-script environments
    • KT-48635 JVM IR: Double/Float values are boxed when comparing for equality in equals method of data/value classes
    • KT-23397 Optimize out field for property delegate when it's safe (JVM)

    Fixes

    • KT-53272 Backend Internal error: Exception during IR lowering / No such value argument slot: 2
    • KT-53124 Receiver type mismatch when combining extension properties, type projections, Java sources, and F-bounded type-variables
    • KT-51868 JVM / IR: Inconsistent behaviour between lambda expression and SAM interface conversion for the same interface
    • KT-36770 Prohibit unsafe calls with expected @NotNull T and given Kotlin generic parameter with nullable bound
    • KT-52974 "IllegalStateException: Symbol with IrSimpleFunctionSymbolImpl is unbound" compiling native targets of MPP project
    • KT-53007 JVM: "Bad invokespecial instruction: current class isn't assignable to reference class" when call superclass of outer class method from inner class
    • KT-53019 K2: cannot cast callable reference to Function1 in runtime

    ... (truncated)

    Commits
    • 7159702 Add changelog for 1.7.20
    • 9ca25ce Native: add more tests for Swift Set and Dictionary used in Kotlin
    • 1244679 Native: improve thread state switches for NSSet/NSDictionary adapters
    • 1abfeb9 [Gradle][MPP] MPP/AGP compatibility: Bump maxSupportedVersion to 7.3
    • b489e93 Fix lowering of receiver access in IR scripting
    • 8a8853c K1. Fix error message for BUILDER_INFERENCE_MULTI_LAMBDA_RESTRICTION
    • 608d45c Add changelog for 1.7.20-RC
    • 3a340d2 Fix kind of NoBuilderInferenceWithoutAnnotationRestriction
    • a17fc51 Fix receiver inconsistency when builder inference restriction disabled
    • f0fd2cf Put back the line with language feature to 1.7 block
    • Additional commits viewable in compare view

    Updates dokka-gradle-plugin from 1.6.10 to 1.7.20

    Release notes

    Sourced from dokka-gradle-plugin's releases.

    1.7.10 Beta

    Bugfix release that addresses several blockers and regressions.

    General

    • Support Kotlin 1.7.10

    Gradle plugin

    • Do not expose Kotlin stdlib in plugin dependencies, this should fix errors like Module was compiled with an incompatible version of Kotlin when using Dokka. Thanks to @​martinbonnin (#2543)

    Java sources

    • Fixed build failure caused by having configured source links for Java code (#2544)
    • Fixed several exotic problems that led to build failures, all related to using annotation in Java sources (#2509, #2551, #2350)
    • Fixed IntelliJ platform WARN: Attempt to load key messages that appeared when analyzing Java sources (#2559)

    1.7.0 Beta

    Improvements

    General

    HTML format

    Javadoc format

    GFM format

    Kotlin-as-Java plugin

    Gradle runner

    ... (truncated)

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Capture scrollable content

    Capture scrollable content

    For those who are looking for a solution to capture scrollable content, I've created a small solution that I believe with some modifications and improvements, could be a functionality of the library.

    The solution is based on AndroidView with a ScrollView with Composable content. The difference is that the captured content is that of the ScrollView, with scrollView.getChildAt(0).height. Since ScrollableCapturable is scrollable by default, it is important not to use other scrollable layouts such as LazyColumn or scrollable Column.

    Unfortunately, in my tests, drawToBitmapPostLaidOut() did not work as expected to resolve the problems with network image loading. Despite solving problems with "Software rendering doesn't support hardware bitmaps", the Bitmap image is distorted and the Composable content is not completely captured. The solution I found for this, which is not really a solution, is to use a different library and test if the problem disappears. In my case, I used the landscapist library (with the glide version) instead of the coil and it worked fine.

    ScrollableCapturable:
    /**
     * @param controller A [CaptureController] which gives control to capture the [content].
     * @param modifier The [Modifier] to be applied to the layout.
     * @param onCaptured The callback which gives back [Bitmap] after composable is captured.
     * If any error is occurred while capturing bitmap, [Exception] is provided.
     * @param content [Composable] content to be captured.
     *
     * Note: Don't use scrollable layouts such as LazyColumn or scrollable Column. This will cause
     * an error. The content will be scrollable by default, because it's wrapped in a ScrollView.
     */
    @Composable
    fun ScrollableCapturable(
        modifier: Modifier = Modifier,
        controller: CaptureController,
        onCaptured: (Bitmap?, Throwable?) -> Unit,
        content: @Composable () -> Unit
    ) {
        AndroidView(
            factory = { context ->
                val scrollView = ScrollView(context)
                val composeView = ComposeView(context).apply {
                    setContent {
                        content()
                    }
                }
                scrollView.addView(composeView)
                scrollView
            },
            update = { scrollView ->
                if (controller.readyForCapture) {
                    // Hide scrollbars for capture
                    scrollView.isVerticalScrollBarEnabled = false
                    scrollView.isHorizontalScrollBarEnabled = false
                    try {
                        val bitmap = loadBitmapFromScrollView(scrollView)
                        onCaptured(bitmap, null)
                    } catch (throwable: Throwable) {
                        onCaptured(null, throwable)
                    }
                    scrollView.isVerticalScrollBarEnabled = true
                    scrollView.isHorizontalScrollBarEnabled = true
                    controller.captured()
                }
            },
            modifier = modifier
        )
    }
    
    /**
     * Need to use view.getChildAt(0).height instead of just view.height,
     * so you can get all ScrollView content.
     */
    private fun loadBitmapFromScrollView(scrollView: ScrollView): Bitmap {
        val bitmap = Bitmap.createBitmap(
            scrollView.width,
            scrollView.getChildAt(0).height,
            Bitmap.Config.ARGB_8888
        )
        val canvas = Canvas(bitmap)
        scrollView.draw(canvas)
        return bitmap
    }
    
    class CaptureController {
        var readyForCapture by mutableStateOf(false)
            private set
    
        fun capture() {
            readyForCapture = true
        }
    
        internal fun captured() {
            readyForCapture = false
        }
    }
    
    @Composable
    fun rememberCaptureController(): CaptureController {
        return remember { CaptureController() }
    }
    
    Example of use:
    @Composable
    fun CapturableScreen() {
        val captureController = rememberCaptureController()
    
        Column(modifier = Modifier.fillMaxSize()) {
            ScrollableCapturable(
                controller = captureController,
                onCaptured = { bitmap, error ->
                    bitmap?.let {
                        Log.d("Capturable", "Success in capturing.")
                    }
                    error?.let {
                        Log.d("Capturable", "Error: ${it.message}\n${it.stackTrace.joinToString()}")
                    }
                },
                modifier = Modifier.weight(1f)
            ) {
                ScreenContent()
            }
    
            Button(
                onClick = { captureController.capture() },
                modifier = Modifier.align(Alignment.CenterHorizontally)
            ) {
                Text(text = "Take screenshot")
            }
        }
    }
    
    @Composable
    private fun ScreenContent() {
        val text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor " +
                "incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis" +
                " nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." +
                " Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore" +
                " eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt" +
                " in culpa qui officia deserunt mollit anim id est laborum."
        Column(
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally,
            modifier = Modifier
                .fillMaxSize()
                .background(Color.White)
                .padding(12.dp)
        ) {
            /**
             * When using the "io.coil-kt:coil-compose" library it can cause:
             * java.lang.IllegalArgumentException: Software rendering doesn't support hardware bitmaps
             * You can use "com.github.skydoves:landcapist-glide" to try to solve this.
             */
            GlideImage(
                imageModel = "https://raw.githubusercontent.com/PatilShreyas/Capturable/master/art/header.png",
                modifier = Modifier
                    .size(200.dp)
                    .clip(RoundedCornerShape(12.dp))
            )
    
            Spacer(Modifier.height(10.dp))
    
            for (i in 0..3) {
                Box(
                    modifier = Modifier
                        .size(100.dp)
                        .background(Color.Black)
                )
                Spacer(Modifier.height(4.dp))
                Text(
                    text = text,
                    color = Color.Black,
                    fontSize = 18.sp,
                )
            }
        }
    }
    
    Screenshots:

    opened by jsericksk 1
Releases(v1.0.3)
  • v1.0.3(Mar 20, 2022)

    Changes

    Fixed the following issues

    • [#13] Fixed capturing composable clipped inside Window / Screen.
    • [#22] Fixed crash while capturing composable inside Fragment.

    Dependent Targets

    • Jetpack Compose: 1.1.0
    • Kotlin: 1.6.10

    Full Changelog: https://github.com/PatilShreyas/Capturable/compare/v1.0.2...v1.0.3

    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(Jan 23, 2022)

    Changes

    [#7] Fix issue: Can't get the Bitmap when Capturable includes Network image

    Fixed the issue IllegalArgumentException: Software rendering doesn't support hardware bitmaps on capturing Composable which includes network image (i.e. Picasso, Glide, coil, etc). This issue was occurring on devices above Android Oreo (API 26+) in which drawing Bitmap from Canvas causes such issues while drawing hardware-generated Bitmap (i.e. image loaded from the network).

    Dependent Targets

    • Jetpack Compose: 1.0.5
    • Kotlin: 1.5.31

    Full Changelog: https://github.com/PatilShreyas/Capturable/compare/v1.0.1...v1.0.2

    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Jan 3, 2022)

    Changes

    Provide Throwable in callback onCaptured of Capturable composable function so that if any issue occurs, it can be handled.

    Dependent Targets

    • Jetpack Compose: 1.0.5
    • Kotlin: 1.5.31
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Jan 3, 2022)

Owner
Shreyas Patil
👨‍💻Google Developer Expert for Android ❤️Android, Kotlin 🌎Web Developer ⚙️Open Source Enthusiast 👨‍🚀Organizer @KotlinMumbai
Shreyas Patil
Sample app that shows how to create a bitmap from a Jetpack composable

Creating Bitmaps From Jetpack Composables This app demonstrates how to create a bitmap from a Jetpack composable without the need to display the compo

Johann Blake 14 Nov 29, 2022
Flippable - A Jetpack Compose utility library to create flipping Composable views with 2 sides

?? Flippable A Jetpack Compose utility library to create flipping Composable views with 2 sides. Built with ❤︎ by Wajahat Karim and contributors Demo

Wajahat Karim 298 Dec 23, 2022
It's a simple app written in Kotlin that shows a simple solution for how to save an image into Firebase Storage, save the URL in Firestore, and read it back using Jetpack Compose.

It's a simple app written in Kotlin that shows a simple solution for how to save an image into Firebase Storage, save the URL in Firestore, and read it back using Jetpack Compose.

Alex 10 Dec 29, 2022
A library that enables Safe Navigation for you Composable destinations when using Jetpack Compose Navigation

A library that enables Safe Navigation for you Composable destinations when using Jetpack Compose Navigation

Roman Levinzon 59 Oct 19, 2022
This is a simple video games discovery app showcasing UI using Jetpack Compose with Clean Architecture and also tests for composable UI.

Jetpack-Compose-Video-Games-Example ?? This is a simple video games discovery app showcasing UI using Jetpack Compose and also tests for composable UI

Ruben Quadros 60 Dec 27, 2022
Mocking with Jetpack Compose - stubbing and verification of Composable functions

Mockposable A companion to mocking libraries that enables stubbing and verification of functions annotated with @androidx.compose.runtime.Composable.

Jesper Åman 21 Nov 15, 2022
a set of Settings like composable items to help android Jetpack Compose developers build complex settings screens

This library provides a set of Settings like composable items to help android Jetpack Compose developers build complex settings screens without all the boilerplate

Bernat Borrás Paronella 178 Jan 4, 2023
Jetpack Compose Text composable to show html text from resources

HtmlText Current Compose Version: 1.0.3 Compose HtmlText Text composable to show html text from resources Add to your project Add actual HtmlText libr

Alexander Karkossa 57 Dec 23, 2022
ComposeImageBlurhash is a Jetpack Compose component with the necessary implementation to display a blurred image while the real image is loaded from the internet. Use blurhash and coil to ensure good performance.

compose-image-blurhash ComposeImageBlurhash is a Jetpack Compose component with the necessary implementation to display a blurred image while the real

Orlando Novas Rodriguez 24 Nov 18, 2022
Holi is a lightweight Jetpack Compose library of colors, gradients and cool utility functions for all your palette needs!

Holi A library of colors, gradients and utils built using Jetpack Compose for Android Features A wide collection of colors from different palettes for

Siddhesh Patil 167 Dec 5, 2022
Holi is a lightweight Jetpack Compose library of colors, gradients and cool utility functions for all your palette needs!

Holi is a lightweight Jetpack Compose library of colors, gradients and cool utility functions for all your palette needs!

Sid Patil 167 Dec 5, 2022
🚀🏞💪 Collection of Images, Modifiers, utility functions for Jetpack Compose to expand and enrich displaying, manipulating, scaling, resizing, zooming, and getting cropped ImageBitmap based on selection area

Collection of Images, Modifiers, utility functions for Jetpack Compose to expand and enrich displaying, manipulating, scaling, resizing, zooming, and getting cropped ImageBitmap based on selection area, before/after image to with handle to show partial of both images and more is cooking up

Smart Tool Factory 207 Dec 26, 2022
Row Coloumn Box Compose Constraint Layout Modifier.xyz Animator Tween animation MutableState Creating custom composable Corners Canvas LaunchedEffect

Row Coloumn Box Compose Constraint Layout Modifier.xyz Animator Tween animation MutableState Creating custom composable Corners Canvas LaunchedEffect

Shivaraj M Patil 1 Apr 13, 2022
A CLI utility to convert Jetpack Compose compiler metrics and reports to beautified 😍 HTML page

Compose Compiler Reports to HTML Generator A CLI utility to convert Jetpack Compose compiler metrics and reports to beautified ?? HTML page. Made with

Shreyas Patil 145 Jan 3, 2023
Utility for monitoring Genshin Impact in-game status, built with Jetpack Compose, Accompanist, and more

yumetsuki An utility app for monitoring in-game status on Genshin Impact like resin status, realm currency, expedition, daily commission status, etc.

Nauval Rizky 2 Nov 1, 2022
Drawing text around other content in Jetpack Compose

TextAroundContent Drawing text around other content in Jetpack Compose Installat

Dmitry Mysenko 8 Feb 9, 2022
Icontent - Jetpack Compose component to show all random content sended by Inmersoft guide backend

icontent IContent is a library that allows loading audio visual content generica

Orlando Novas Rodriguez 3 Nov 3, 2022
A Jetpack Compose Collapsing Top Bar, that expands or collapses based on the scrolling of a content

CollapsingTopBarCompose A Jetpack Compose Collapsing Top Bar, that expands or collapses based on the scrolling of a content Centered expanded title an

Germain Kevin 139 Dec 26, 2022
Gmail clone project, that uses Jetpack Compose to draw UI content for gmail home screen

Gmail clone project, that uses Jetpack Compose to draw UI content for gmail home screen following Udemy course: Android 12 Jetpack Compose Developer Course - From 0 To Hero

SaraAlshamy 3 Sep 2, 2022