A declarative framework for building efficient UIs on Android.

Related tags

UI/UX litho
Overview

Litho CircleCI Bintray Join the chat at https://gitter.im/facebook/litho License

Litho is a declarative framework for building efficient UIs on Android.

  • Declarative: Litho uses a declarative API to define UI components. You simply describe the layout for your UI based on a set of immutable inputs and the framework takes care of the rest.
  • Asynchronous layout: Litho can measure and layout your UI ahead of time without blocking the UI thread.
  • View flattening: Litho uses Yoga for layout and automatically reduces the number of ViewGroups that your UI contains.
  • Fine-grained recycling: Any component such as a text or image can be recycled and reused anywhere in the UI.

To get started, check out these links:

Installation

Litho can be integrated either in Gradle or Buck projects. Read our Getting Started guide for installation instructions.

Quick start

1. Initialize SoLoader in your Application class.

public class SampleApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    SoLoader.init(this, false);
  }
}

2. Create and display a component in your Activity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final ComponentContext c = new ComponentContext(this);

    final Component component = Text.create(c)
        .text("Hello World")
        .textSizeDip(50)
        .build();

    setContentView(LithoView.create(c, component));
}

Run sample

You can find more examples in our sample app.

To build and run (on an attached device/emulator) the sample app, execute

$ buck fetch sample
$ buck install -r sample

or, if you prefer Gradle,

$ ./gradlew :sample:installDebug

Contributing

Before contributing to Litho, please first read the Code of Conduct that we expect project participants to adhere to.

For pull requests, please see our CONTRIBUTING guide.

See our issues page for ideas on how to contribute or to let us know of any problems.

Please also read our Coding Style and Code of Conduct before you contribute.

Getting Help

  • Post on StackOverflow using the #litho tag.
  • Chat with us on Gitter.
  • Join our Facebook Group to stay up-to-date with announcements.
  • Please open GitHub issues only if you suspect a bug in the framework or have a feature request and not for general questions.

License

Litho is licensed under the Apache 2.0 License.

Comments
  • [EventGenerator] Fix generation from Kotlin class files

    [EventGenerator] Fix generation from Kotlin class files

    Summary

    This PR resolves the issue that occurs when trying to generate an EventDeclaration from an @Event annotated Kotlin class. It was brought up on https://github.com/facebook/litho/issues/614 and it makes sure that it can work with @JvmField annotated fields & without.

    Changelog

    Properly generate Event classes from Kotlin source files. (#614 )

    Test Plan

    It was tested manually by adding relevant files on sample-barebones-kotlin in order to also ensure future compatibility. If a test could be written here, let me know and I will add one!

    CLA Signed 
    opened by pavlospt 36
  • Add support for more text_alignment values

    Add support for more text_alignment values

    Fixes #516

    Design notes:

    • Did not use Layout.Alignment because it doesn't differentiate between VIEW_START/END and TEXT_START/END
    • Did not use View.TEXT_ALIGNMENT_*/android:textAlignment because
      • Default value of INHERIT cannot be supported by Litho without adding this property to all Components which doesn't seem ideal
      • GRAVITY cannot be supported unless Litho adds a gravity prop to Text, which doesn't seem necessary
      • LEFT and RIGHT are not supported directly as values
    • Proposed solution is to use our own Enum for TextAlignment.
    • This deprecates the textAlignment prop for the new alignment prop that handles the new cases. Unfortunately the old prop's dependences on an Enum requires a migration.
    CLA Signed Merged Needs Author Response 
    opened by vinc3m1 33
  • Migrate documentation to Docusaurus v2

    Migrate documentation to Docusaurus v2

    Summary

    Hi there! As discussed in #669, we would like to migrate Litho's documentation website to Docusaurus 2.

    Docusaurus 2 brings about many improvements:

    • Client-side rendering with prerendering (site renders without JavaScript!)
    • Embeddable interactive React components within markdown via MDX
    • Docusaurus sites are React apps built with modern Javascript ecosystem tooling

    In this PR, we've migrated the documentation over to Docusaurus 2 (in /website directory) while leaving the /docs directory intact. We've matched the design of the original site as much as possible, so that the transition will be smooth for users of Litho.

    Changelog

    Migrate documentation website from Jekyll to Docusaurus v2

    Test Plan

    The test site is up! https://litho-deploy.vercel.app

    @Drewbi and I are looking to improve the documentation site further based on your feedback. Please let us know what you think! :)

    cc @yangshun

    CLA Signed Merged 
    opened by teikjun 24
  • Cache and share LayoutState computation between threads

    Cache and share LayoutState computation between threads

    This mitigates any duplicate layout that happens between the main and background threads while also caching the value as a result on a Future.

    The existing behavior can be simplified to the following:

    • main thread -> measure() -> calculateLayoutState() -> mMainThreadLayoutState
    • bg thread -> calculateLayout() -> calculateLayoutState() -> mBackgroundLayoutState
    • calculateLayoutState() will then call the static function LayoutState.calculate() which eventually leads to calling the Components' @OnCreateLayout functions down the tree.
    • Eventually the mBackgroundLayoutState is copied over to mMainThreadLayoutState through backgroundLayoutStateUpdated() -> setBestMainThreadLayoutAndReturnOldLayout()

    Obviously a lot of details I'm leaving out, but that's the general gist. The important note here is that there are many subtleties in the code between the main and bg functions, intentional or not, that we don't want to inadvertently affect.

    The issue we're seeing is that on initial layout calculateLayoutState() is often called twice for the same layout because the background threads don't finish calculating layouts and report them back to the main thread in time before the measure() function is called. Ironically, this seems exacerbated by expensive @OnCreateLayout calls, which are exactly the calls we don't want to duplicate during initial layout.

    This change will share a FutureTask between main and bg threads that calculate the same layout (determined by LayoutStateFuture.equals()). That LayoutState will be also be cached on the Future until the next run with different params.

    CLA Signed 
    opened by vinc3m1 24
  • Remove mocks in some Litho tests.

    Remove mocks in some Litho tests.

    I have extended the Android classes which were being mocked and removed the mocks.

    Tried creating shadows of the Android classes but its not the right solution : As per the Robolectric documentation : http://robolectric.org/extending/

    "It is important that shadow methods are implemented on the corresponding shadow of the class in which they were originally defined. Otherwise Robolectric’s lookup mechanism will not find them (even if they have been declared on a shadow subclass.) For example, the method setEnabled() is defined on View. If a setEnabled() method is defined on ShadowViewGroup instead of ShadowView then it will not be found at run time even when setEnabled() is called on an instance of ViewGroup."

    In many of the tests here Litho is trying to verify the method of super class is being called on a subsclass object. Shadows doesn't support this.

    CLA Signed Merged 
    opened by anushreeag 22
  • Cannot use Kotlin for MountSpec

    Cannot use Kotlin for MountSpec

    Version

    0.19.0

    Issues and Steps to Reproduce

    Use Kotlin to write the MountSpec object and generate the class successfully. However, using those components will contribute to the compile error. Finally, I use java for MountSpec class and it can be compiled successfully.

    opened by wooyukit 22
  • Support ResType on PropDefault annotation

    Support ResType on PropDefault annotation

    Initial work on adding support for ResType on @PropDefault ( #81 )

    I went with the solution of having the Builder initializing the Props that have a default value marked as ResType, instead of passing down the ComponentContext which I tried to implement but it was introducing a quite huge change.

    In order to reduce the review scope I have only added generation for resolveDimenSizeRes() and will add the rest before closing the PR, in order to have a naming and feature compliance agreement after the initial review. Also, I believe that after resolving the resource on a marked @PropDefault we should generate resource helper methods like we do for @Prop.

    Let me know what you think!

    /cc: @emilsjolander

    P.S.: There is a big diff on the ComponentImplGenerator due to different Code Style, so If you could share the one you are using so that we could be aligned and reduce the diffs, would be great.

    CLA Signed 
    opened by pavlospt 22
  • Is there anything like gridViewPager  or snapHelper in origin android sdk?

    Is there anything like gridViewPager or snapHelper in origin android sdk?

    Link to Code

    https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html https://developer.android.com/reference/android/support/wearable/view/GridViewPager.html https://developer.android.com/reference/android/support/v7/widget/SnapHelper.html

    opened by barontxu 21
  • Error building Litho with React Native: Bad service configuration file, or exception thrown while constructing Processor object:...

    Error building Litho with React Native: Bad service configuration file, or exception thrown while constructing Processor object:...

    Version

    compile fileTree(dir: "libs", include: ["*.jar"])
    compile "com.facebook.react:react-native:+"  // From node_modules
    
    // Litho
    compile 'com.facebook.litho:litho-core:0.14.0'
    compile 'com.facebook.litho:litho-widget:0.14.0'
    provided 'com.facebook.litho:litho-annotations:0.14.0'
    
    annotationProcessor 'com.facebook.litho:litho-processor:0.14.0'
    
    // SoLoader
    compile 'com.facebook.soloader:soloader:0.2.0'
    
    // For integration with Fresco
    compile 'com.facebook.litho:litho-fresco:0.14.0'
    
    // For testing
    testCompile 'com.facebook.litho:litho-testing:0.14.0'
    
    // Sections
    compile 'com.facebook.litho:litho-sections-core:0.14.0'
    compile 'com.facebook.litho:litho-sections-widget:0.14.0'
    provided 'com.facebook.litho:litho-sections-annotations:0.14.0'
    
    annotationProcessor 'com.facebook.litho:litho-sections-processor:0.14.0'
    

    Issues and Steps to Reproduce

    Attempting to integrate Litho with React Native. I have followed "Getting Started" and FAQs Using Litho with React Native. Gradle is syncing successfully, but when I build the project it comes back with this error:

    error: Bad service configuration file, or exception thrown while constructing Processor object: javax.annotation.processing.Processor: Provider com.facebook.litho.specmodels.processor.ComponentsProcessor could not be instantiated: java.lang.NoClassDefFoundError: com/facebook/litho/annotations/FromPrepare

    FAILED

    FAILURE: Build failed with an exception.

    • What went wrong: Execution failed for task ':app:compileDebugJavaWithJavac'.

    Compilation failed; see the compiler error output for details.

    Expected Behavior

    Project can build without errors. Project is extremely bare bones, haven't added any additional code to my MainActivity or MainApplication file, everything fresh from react-native init with a react-native run-android

    Link to Code

    My App build.gradle file

     apply plugin: "com.android.application"
     import com.android.build.OutputFile
     project.ext.react = [
         entryFile: "index.js"
     ]
     apply from: "../../node_modules/react-native/react.gradle"
     def enableSeparateBuildPerCPUArchitecture = false
     def enableProguardInReleaseBuilds = false
     android {
       compileSdkVersion 27
       buildToolsVersion "27.0.1"
    
      defaultConfig {
          applicationId "com.lithodiscovery"
          minSdkVersion 18
          targetSdkVersion 27
          versionCode 1
          versionName "1.0"
          ndk {
              abiFilters "armeabi-v7a", "x86"
          }
      }
      splits {
          abi {
              reset()
              enable enableSeparateBuildPerCPUArchitecture
              universalApk false  // If true, also generate a universal APK
              include "armeabi-v7a", "x86"
          }
      }
      buildTypes {
          release {
              minifyEnabled enableProguardInReleaseBuilds
              proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
          }
      }
      // applicationVariants are e.g. debug, release
      applicationVariants.all { variant ->
          variant.outputs.each { output ->
              // For each separate APK per architecture, set a unique version code as described here:
              // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
              def versionCodes = ["armeabi-v7a":1, "x86":2]
              def abi = output.getFilter(OutputFile.ABI)
              if (abi != null) {  // null for the universal-debug, universal-release variants
                  output.versionCodeOverride =
                          versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
              }
          }
       }
    }
    
    configurations.all {
        exclude group: 'com.facebook.yoga', module: 'yoga'
        exclude group: 'com.facebook.litho', module: 'litho-annotations'
        resolutionStrategy {
            force 'com.google.code.findbugs:jsr305:1.3.9'
            force 'com.android.support:appcompat-v7:26.+'
            force 'com.android.support:support-compat:26.+'
            force 'com.android.support:support-core-ui:26.+'
            force 'com.android.support:support-annotations:26.+'
            force 'com.android.support:recyclerview-v7:26.+'
       }
    }
    
      dependencies {
      compile fileTree(dir: "libs", include: ["*.jar"])
      compile "com.facebook.react:react-native:+"  // From node_modules
    
      // Litho
      compile 'com.facebook.litho:litho-core:0.14.0'
      compile 'com.facebook.litho:litho-widget:0.14.0'
      provided 'com.facebook.litho:litho-annotations:0.14.0'
    
      annotationProcessor 'com.facebook.litho:litho-processor:0.14.0'
    
      // SoLoader
      compile 'com.facebook.soloader:soloader:0.2.0'
    
      // For integration with Fresco
      compile 'com.facebook.litho:litho-fresco:0.14.0'
    
      // For testing
      testCompile 'com.facebook.litho:litho-testing:0.14.0'
    
      // Sections
      compile 'com.facebook.litho:litho-sections-core:0.14.0'
      compile 'com.facebook.litho:litho-sections-widget:0.14.0'
      provided 'com.facebook.litho:litho-sections-annotations:0.14.0'
    
      annotationProcessor 'com.facebook.litho:litho-sections-processor:0.14.0'
    }
    
    // Run this once to be able to run the application with BUCK
    // puts all compile dependencies into folder libs for BUCK to use
    task copyDownloadableDepsToLibs(type: Copy) {
        from configurations.compile
        into 'libs'
    }
    

    My Project build.gradle file

     buildscript {
         repositories {
             jcenter()
         }
         dependencies {
              classpath 'com.android.tools.build:gradle:2.3.1'
    
             // NOTE: Do not place your application dependencies here; they belong
             // in the individual module build.gradle files
         }
      }
    
    allprojects {
        repositories {
           mavenLocal()
           jcenter()
           maven {
                // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
                url "$rootDir/../node_modules/react-native/android"
           }
           maven { url 'https://maven.google.com' }
        }
    }
    
    opened by DropKode21 20
  • Add a replaceAll(List<RenderInfo>) method to RecyclerBinder.

    Add a replaceAll(List) method to RecyclerBinder.

    For compatibility reasons, there's currently no way to hook up RecyclerView.notifyDatasetChanged() calls to RecyclerBinder without potentially triggering transition animations. This opens up an API to support the equivalent of replacing all the items in a RecyclerBinder and calling notifyDatasetChanged().

    CLA Signed Merged 
    opened by vinc3m1 18
  • Adds shadow offset support to CardShadowDrawable

    Adds shadow offset support to CardShadowDrawable

    Summary

    This change adds x and y shadow offset support to CardShadowDrawable and CardShadowSpec. Clients can use these offsets to cast different types of shadows to their cards. At the moment the offsets are hardcoded in CardShadowDrawable: the x offset is zero and the y offset is half the shadow size. This change removes this hard-coding from CardShadowDrawable and exposes two new properties in CardShadowSpec (shadowDx and shadowDy) to enable clients to set these offsets.

    Changelog

    Added support for x and y shadow offsets to CardShadow.

    Test Plan

    I have manually tested this change on a simple UI that comprises a list of cards with each card containing an image on the left and a text on the right. I was able to change the x and y offsets for the card shadow and see the effects on the UI. Using this new functionality I was able to create shadows that come from different light sources above, below, at left and at right of the card.

    Please see testing details below and let me know if any further testing is required to accept this PR.

    shadowSize = 8 / shadowDx = 0 / shadowDy = 0

    800

    shadowSize = 8 / shadowDx = 2 / shadowDy = 0

    820

    shadowSize = 8 / shadowDx = 0 / shadowDy = 2

    802

    shadowSize = 8 / shadowDx = 2 / shadowDy = 2

    822

    shadowSize = 8 / shadowDx = -2 / shadowDy = 0

    8-20

    shadowSize = 8 / shadowDx = 0 / shadowDy = -2

    80-2

    shadowSize = 8 / shadowDx = -2 / shadowDy = -2

    8-2-2

    shadowSize = 8 / shadowDx = 2 / shadowDy = -2

    82-2

    CLA Signed Merged 
    opened by chggr 17
  • Lazy list not working in project getting error

    Lazy list not working in project getting error

    Version


     implementation 'com.facebook.litho:litho-core:0.45.0'
     implementation 'com.facebook.litho:litho-core-kotlin:0.45.0'
     implementation 'com.facebook.litho:litho-widget:0.45.0'
     implementation 'com.facebook.litho:litho-widget-kotlin:0.45.0'
     kapt 'com.facebook.litho:litho-processor:0.45.0'
     // SoLoader
     implementation 'com.facebook.soloader:soloader:0.10.4'
     // Testing Litho
     testImplementation 'com.facebook.litho:litho-testing:0.45.0'***
    

    Issues and Steps to Reproduce

    *** LazyList not working in my existing project***

    Expected Behavior

    LazyList should work.

    Link to Code


    class TimelineComponent(private val arrayList: List<String>) : KComponent() {
        override fun ComponentScope.render(): Component {
            return LazyList {
                arrayList.forEach { post ->
                    child(id = post, component =
                        PostComponent(
                            Post("post1", User("SHIV", R.mipmap.ic_launcher),
                                R.drawable.nebula4,"Hello how are you?")
                        )
                    )
                }
            }
        }
    }
    

    We are getting below error on project build time.

    Invalid stack map table at 343: aload 33, error: No local at index 33.
    
    
    "sources":[{"file":"/Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug/com/buddynation/dronenation/bn/litho/timeline/TimelineComponent.class"}],"tool":"D8"}
    org.gradle.workers.WorkerExecutionException: There was a failure while executing work items
    	at org.gradle.workers.internal.DefaultWorkerExecutor.workerExecutionException(DefaultWorkerExecutor.java:270)
    	at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:252)
    	at com.android.build.gradle.internal.tasks.DexArchiveBuilderTaskDelegate.doProcess(DexArchiveBuilderTaskDelegate.kt:227)
    	at com.android.build.gradle.internal.tasks.DexArchiveBuilderTask.doTaskAction(DexArchiveBuilderTask.kt:256)
    	at com.android.build.gradle.internal.tasks.NewIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:66)
    	at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
    	at com.android.build.gradle.internal.tasks.NewIncrementalTask.taskAction(NewIncrementalTask.kt:45)
    	at jdk.internal.reflect.GeneratedMethodAccessor2329.invoke(Unknown Source)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
    	at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
    	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
    	at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
    	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:498)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
    	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:483)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:466)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:105)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:270)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:248)
    	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:83)
    	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:37)
    	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
    	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:47)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:47)
    	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:37)
    	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
    	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
    	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:50)
    	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
    	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
    	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
    	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
    	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
    	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
    	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:54)
    	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:35)
    	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
    	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
    	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:174)
    	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:74)
    	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:45)
    	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:40)
    	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:29)
    	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
    	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:99)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:92)
    	at java.base/java.util.Optional.map(Optional.java:265)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
    	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:84)
    	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:41)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
    	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:91)
    	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
    	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:78)
    	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:49)
    	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:105)
    	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:50)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:86)
    	at java.base/java.util.Optional.orElseGet(Optional.java:369)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:32)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
    	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:43)
    	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:31)
    	at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$2.withWorkspace(ExecuteActionsTaskExecuter.java:283)
    	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
    	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
    	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
    	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
    	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:49)
    	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)
    	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:184)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:173)
    	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
    	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
    	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
    	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
    	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
    	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
    	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:408)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:395)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:388)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:374)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
    	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    	at java.base/java.lang.Thread.run(Thread.java:829)
    Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.dexing.DexWorkAction
    	at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:342)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:142)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:90)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:80)
    	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:68)
    	at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:250)
    	at com.android.build.gradle.internal.tasks.DexArchiveBuilderTaskDelegate.doProcess(DexArchiveBuilderTaskDelegate.kt:227)
    	at com.android.build.gradle.internal.tasks.DexArchiveBuilderTask.doTaskAction(DexArchiveBuilderTask.kt:256)
    	at com.android.build.gradle.internal.tasks.NewIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:66)
    	at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)
    	at com.android.build.gradle.internal.tasks.NewIncrementalTask.taskAction(NewIncrementalTask.kt:45)
    	at jdk.internal.reflect.GeneratedMethodAccessor2329.invoke(Unknown Source)
    	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
    	at org.gradle.api.internal.project.taskfactory.IncrementalInputsTaskAction.doExecute(IncrementalInputsTaskAction.java:32)
    	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
    	at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
    	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:498)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:71)
    	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:71)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:483)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:466)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:105)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:270)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:248)
    	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:83)
    	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:37)
    	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
    	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:47)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:47)
    	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:37)
    	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
    	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
    	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:50)
    	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
    	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
    Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.dexing.DexWorkAction
    
    	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
    	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
    	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
    	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
    	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:54)
    	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:35)
    	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
    	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
    	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:174)
    	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:74)
    	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:45)
    	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:40)
    	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:29)
    	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
    	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:99)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:92)
    	at java.base/java.util.Optional.map(Optional.java:265)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
    	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
    	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:84)
    	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:41)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
    	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:91)
    	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
    	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:78)
    	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:49)
    	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:105)
    	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:50)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:86)
    	at java.base/java.util.Optional.orElseGet(Optional.java:369)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86)
    	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:32)
    	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
    	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:43)
    	at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:31)
    	at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$2.withWorkspace(ExecuteActionsTaskExecuter.java:283)
    	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
    	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
    	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
    	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
    	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:49)
    	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)
    	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:184)
    	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:173)
    	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
    	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
    	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
    	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
    	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
    	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
    	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:408)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:395)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:388)
    	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:374)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
    	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
    	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
    	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
    	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    	at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
    	at java.base/java.lang.Thread.run(Thread.java:829)
    Caused by: org.gradle.tooling.BuildException: Failed to process: /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/intermediates/javac/developmentDebug/classes, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kapt3/classes/developmentDebug
    	at com.android.build.gradle.internal.dexing.DexWorkAction.run(DexWorkAction.kt:53)
    	at com.android.build.gradle.internal.profile.ProfileAwareWorkAction.execute(ProfileAwareWorkAction.kt:74)
    	at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62)
    	at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:97)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62)
    Caused by: org.gradle.tooling.BuildException: Failed to process: /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/intermediates/javac/developmentDebug/classes, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kapt3/classes/developmentDebug
    
    	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
    	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
    	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
    	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:76)
    	at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
    	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59)
    	at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$2(DefaultWorkerExecutor.java:206)
    	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:214)
    	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
    	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:131)
    	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    	... 6 more
    Caused by: com.android.builder.dexing.DexArchiveBuilderException: Failed to process: /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/intermediates/javac/developmentDebug/classes, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kapt3/classes/developmentDebug
    	at com.android.build.gradle.internal.dexing.DexWorkActionKt.process(DexWorkAction.kt:179)
    	at com.android.build.gradle.internal.dexing.DexWorkActionKt.processNonIncrementally(DexWorkAction.kt:145)
    	at com.android.build.gradle.internal.dexing.DexWorkActionKt.launchProcessing(DexWorkAction.kt:73)
    	at com.android.build.gradle.internal.dexing.DexWorkAction.run(DexWorkAction.kt:45)
    	... 33 more
    Caused by: com.android.builder.dexing.DexArchiveBuilderException: Error while dexing.
    	at com.android.builder.dexing.D8DexArchiveBuilder.getExceptionToRethrow(D8DexArchiveBuilder.java:140)
    	at com.android.builder.dexing.D8DexArchiveBuilder.convert(D8DexArchiveBuilder.java:117)
    	at com.android.build.gradle.internal.dexing.DexWorkActionKt.process(DexWorkAction.kt:175)
    	... 36 more
    Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: Lcom/buddynation/dronenation/bn/litho/timeline/TimelineComponent;render(Lcom/facebook/litho/ComponentScope;)Lcom/facebook/litho/Component;, origin: /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug/com/buddynation/dronenation/bn/litho/timeline/TimelineComponent.class
    	at Version.fakeStackEntry(Version_3.0.62.java:0)
    	at com.android.tools.r8.utils.w.a(SourceFile:68)
    	at com.android.tools.r8.utils.w.a(SourceFile:28)
    	at com.android.tools.r8.utils.w.a(SourceFile:27)
    	at com.android.tools.r8.utils.w.b(SourceFile:3)
    	at com.android.tools.r8.D8.run(D8.java:11)
    	at com.android.builder.dexing.D8DexArchiveBuilder.convert(D8DexArchiveBuilder.java:115)
    	... 37 more
    Caused by: java.lang.NullPointerException
    
    
    Caused by: com.android.builder.dexing.DexArchiveBuilderException: Failed to process: /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/intermediates/javac/developmentDebug/classes, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kapt3/classes/developmentDebug
    
    Caused by: com.android.builder.dexing.DexArchiveBuilderException: Error while dexing.
    
    Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, position: Lcom/buddynation/dronenation/bn/litho/timeline/TimelineComponent;render(Lcom/facebook/litho/ComponentScope;)Lcom/facebook/litho/Component;, origin: /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug/com/buddynation/dronenation/bn/litho/timeline/TimelineComponent.class
    
    Caused by: java.lang.NullPointerException
    
    Execution failed for task ':app:dexBuilderDevelopmentDebug'.
    > There was a failure while executing work items
       > A failure occurred while executing com.android.build.gradle.internal.dexing.DexWorkAction
          > Failed to process: /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/intermediates/javac/developmentDebug/classes, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kotlin-classes/developmentDebug, /Users/sysquare/Desktop/Project/android_project/drone_project/dn-android/app/build/tmp/kapt3/classes/developmentDebug
    
    * Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
    
    
    opened by shiv71 0
  • Bump qs from 6.5.2 to 6.5.3 in /website

    Bump qs from 6.5.2 to 6.5.3 in /website

    Bumps qs from 6.5.2 to 6.5.3.

    Changelog

    Sourced from qs's changelog.

    6.5.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] utils.merge: avoid a crash with a null target and a truthy non-array source
    • [Fix] correctly parse nested arrays
    • [Fix] stringify: fix a crash with strictNullHandling and a custom filter/serializeDate (#279)
    • [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided
    • [Fix] when parseArrays is false, properly handle keys ending in []
    • [Fix] fix for an impossible situation: when the formatter is called with a non-string value
    • [Fix] utils.merge: avoid a crash with a null target and an array source
    • [Refactor] utils: reduce observable [[Get]]s
    • [Refactor] use cached Array.isArray
    • [Refactor] stringify: Avoid arr = arr.concat(...), push to the existing instance (#269)
    • [Refactor] parse: only need to reassign the var once
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] Clean up license text so it’s properly detected as BSD-3-Clause
    • [Docs] Clarify the need for "arrayLimit" option
    • [meta] fix README.md (#399)
    • [meta] add FUNDING.yml
    • [actions] backport actions from main
    • [Tests] always use String(x) over x.toString()
    • [Tests] remove nonexistent tape option
    • [Dev Deps] backport from main
    Commits
    • 298bfa5 v6.5.3
    • ed0f5dc [Fix] parse: ignore __proto__ keys (#428)
    • 691e739 [Robustness] stringify: avoid relying on a global undefined (#427)
    • 1072d57 [readme] remove travis badge; add github actions/codecov badges; update URLs
    • 12ac1c4 [meta] fix README.md (#399)
    • 0338716 [actions] backport actions from main
    • 5639c20 Clean up license text so it’s properly detected as BSD-3-Clause
    • 51b8a0b add FUNDING.yml
    • 45f6759 [Fix] fix for an impossible situation: when the formatter is called with a no...
    • f814a7f [Dev Deps] backport from main
    • 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)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    CLA Signed dependencies javascript 
    opened by dependabot[bot] 0
  • Bump loader-utils from 2.0.0 to 2.0.4 in /website

    Bump loader-utils from 2.0.0 to 2.0.4 in /website

    Bumps loader-utils from 2.0.0 to 2.0.4.

    Release notes

    Sourced from loader-utils's releases.

    v2.0.4

    2.0.4 (2022-11-11)

    Bug Fixes

    v2.0.3

    2.0.3 (2022-10-20)

    Bug Fixes

    • security: prototype pollution exploit (#217) (a93cf6f)

    v2.0.2

    2.0.2 (2021-11-04)

    Bug Fixes

    • base64 generation and unicode characters (#197) (8c2d24e)

    v2.0.1

    2.0.1 (2021-10-29)

    Bug Fixes

    Changelog

    Sourced from loader-utils's changelog.

    2.0.4 (2022-11-11)

    Bug Fixes

    2.0.3 (2022-10-20)

    Bug Fixes

    • security: prototype pollution exploit (#217) (a93cf6f)

    2.0.2 (2021-11-04)

    Bug Fixes

    • base64 generation and unicode characters (#197) (8c2d24e)

    2.0.1 (2021-10-29)

    Bug Fixes

    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)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    CLA Signed dependencies javascript 
    opened by dependabot[bot] 0
  • Fix two race conditions in RecyclerBinder.

    Fix two race conditions in RecyclerBinder.

    Summary

    If the collection has not completed initial layout by the time onNewWorkingRange() is called, it will short circuit and not be called again.

    If a collection item has not completed initial layout by the time we attempt to check if it belongs to a working range, the call noop-s and is not attempted again.

    In each case, save the working range and apply it when the layout completes.

    Changelog

    Fix two race conditions in RecyclerBinder.

    Test Plan

    Want to get feedback on my approach first.

    CLA Signed 
    opened by jaceksur 3
  • How to update prop value of MountSpec from LayoutSpec

    How to update prop value of MountSpec from LayoutSpec

    Currently i am working on on android project using litho . I converted android view to litho view using onMountSpec but now i want to update prop value from LayoutSpec to OnMountSpec file. Do you know how to do that .

    Thank you.

    opened by adi1505sharma 0
  • Bump terser from 5.9.0 to 5.15.0 in /website

    Bump terser from 5.9.0 to 5.15.0 in /website

    Bumps terser from 5.9.0 to 5.15.0.

    Changelog

    Sourced from terser's changelog.

    v5.15.0

    • Basic support for ES2022 class static initializer blocks.
    • Add AudioWorkletNode constructor options to domprops list (#1230)
    • Make identity function inliner not inline id(...expandedArgs)

    v5.14.2

    • Security fix for RegExps that should not be evaluated (regexp DDOS)
    • Source maps improvements (#1211)
    • Performance improvements in long property access evaluation (#1213)

    v5.14.1

    • keep_numbers option added to TypeScript defs (#1208)
    • Fixed parsing of nested template strings (#1204)

    v5.14.0

    • Switched to @​jridgewell/source-map for sourcemap generation (#1190, #1181)
    • Fixed source maps with non-terminated segments (#1106)
    • Enabled typescript types to be imported from the package (#1194)
    • Extra DOM props have been added (#1191)
    • Delete the AST while generating code, as a means to save RAM

    v5.13.1

    • Removed self-assignments (varname=varname) (closes #1081)
    • Separated inlining code (for inlining things into references, or removing IIFEs)
    • Allow multiple identifiers with the same name in var destructuring (eg var { a, a } = x) (#1176)

    v5.13.0

    • All calls to eval() were removed (#1171, #1184)
    • source-map was updated to 0.8.0-beta.0 (#1164)
    • NavigatorUAData was added to domprops to avoid property mangling (#1166)

    v5.12.1

    • Fixed an issue with function definitions inside blocks (#1155)
    • Fixed parens of new in some situations (closes #1159)

    v5.12.0

    • TERSER_DEBUG_DIR environment variable
    • @​copyright comments are now preserved with the comments="some" option (#1153)

    v5.11.0

    • Unicode code point escapes (\u{abcde}) are not emitted inside RegExp literals anymore (#1147)
    • acorn is now a regular dependency

    v5.10.0

    ... (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)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    CLA Signed dependencies javascript 
    opened by dependabot[bot] 0
Releases(v0.45.0)
  • v0.45.0(Dec 2, 2022)

    Version 0.45.0

    2022-12-02

    • Many internals changes which should not affect end-users: StateContainers are now immutable and added support for testing split of resolve and layout processes
    • Fix for bug where some EventHandlers would be stale after updates when using sections
    • SimpleMountable API is stabilized and ready to replace @MountSpec usages in Kotlin. See here for the docs!

    For more details, see the full diff.

    Source code(tar.gz)
    Source code(zip)
  • v0.43.0(Oct 24, 2022)

    • Breaking:: If you use ComponentsSystrace.provide to provide a custom Systrace implementation, there have been some changes to the types and methods involved:
    • Instead of implementing ComponentsSystrace.Systrace, implementations should implement com.facebook.rendercore.Systracer, located in litho-rendercore. The ArgsBuilder interface has also moved from ComponentsSystrace to the Systracer interface.

    See CHANGELOG.md for the complete list of updates

    Source code(tar.gz)
    Source code(zip)
  • v0.41.2(May 3, 2022)

    • Target SDK is now v31, min SDK is now 16.
    • Uses Gradle 7, and build tools is v30.
    • Breaking: Requires JDK 11 to compile.
    • Breaking: Fix: More fully support @PropDefault annotations in Kotlin Specs (see change logs for more details).
    • Breaking: InternalNode renamed to LithoNode, and elevated to a concrete class. Deletes DefaultInternalNode.
    • Breaking: NodeInfo is now a concrete class; deletes DefaultNodeInfo.

    See CHANGELOG.md for the complete list of updates

    Source code(tar.gz)
    Source code(zip)
  • v0.41.1(Nov 23, 2021)

  • v0.41.0(Nov 19, 2021)

  • v0.40.0(Feb 27, 2021)

  • v0.39.0(Jan 20, 2021)

  • v0.38.0(Jan 20, 2021)

  • v0.37.1(Jul 24, 2020)

  • v0.14.0(Jul 24, 2020)

    Breaking changes:

    • Relicensing under Apache 2.0!
    • Moving off of Yoga legacy stretch behaviour
    • Remove storing the event handler name in the EventHandler class

    What's new:

    • TestSpec matchers for @InjectProps
    • Working Ranges API

    Improvements/Fixes:

    • Mark @InjectProp with isLazy flag
    • Allow @InjectProp in onCreateMountContent
    • Handle setting a manual null key on a component
    • Allow parameterized types to be returned from delegate methods
    • Disable Pull To Refresh by default for horizontally scrolling RecyclerCollectionComponents
    Source code(tar.gz)
    Source code(zip)
  • v0.37.0(Jul 7, 2020)

  • v0.36.0(Jun 1, 2020)

  • v0.35.0(May 4, 2020)

  • v0.34.0(Feb 9, 2020)

  • v0.31.0(Sep 12, 2019)

  • v0.30.0(Sep 12, 2019)

  • v0.29.0(Jul 11, 2019)

  • v0.28.0(Jul 5, 2019)

  • v0.27.0(Jun 24, 2019)

    BREAKING CHANGES

    • PerfEvents:
      • Remove FrameworkLogEvents. EVENT_CREATE_LAYOUT, FrameworkLogEvents. EVENT_CSS_LAYOUT, and FrameworkLogEvents. EVENT_COLLECT_RESULTS: these are replaced by the sub-spans "start_create_layout"/"end_create_layout", "start_measure"/"end_measure", and "start_collect_results"/"end_collect_results" under the existing top-level EVENT_CALCULATE_LAYOUT_STATE event. The PerfEvent#markerPoint API can be used to log these sub-spans (b859605258da6431b706d17c07df7bc8864396df)
      • Remove FrameworkLogEvents.PREPARE_MOUNT without replacement: this didn't provide much value (4917370d6a7405cddce01c13740f22e9ee736529)
      • Remove FrameworkLogEvents.DRAW without replacement: this was not free to maintain and didn't provide much value (9e548cbda5ad78d6f8d3a82ec42639439c118751)
    • Default Range Ratio: The default range ratio for Sections/RecyclerBinder is changed from 4 screens worth of content in either direction to 2. This should improve resource usage with minimal effects on scroll performance. (9b4fe95b8cd48a15046b0d39c4f4756e50f35772)
    • ComponentsSystrace.provide: ComponentsSystrace now assumes an implementation will be provided before any other litho operations occur (457a20f660f14e7132e16668c21b4cf1ce766b70)

    Improvements

    • ComponentsLogger implementations can now return null for event types they don't care about (4075eb75c9a6f967111b451df6699d1b9b97671b)
    • Add RecyclerCollectionEventsController#requestScrollBy (0146857653e29cb24491cbb8bee9307e55187365)
    • Preliminary Robolectric v4 support (4c2f657f9e6edc45f78b9a8d82085025fa0fc86d, etc.)
    • More efficient code generation for state updates in Components and Sections (8c5c7e312fb7d1855caabc2fccbf5adc57e6e945, etc.)

    Bugfixes

    • Remove usage of API 19+ Objects class in cached value API (aabb24a5e67d30e5b93eb43f6c37aae91f455369)
    • Unset Components scope when creating a new ComponentContext in ComponentTree (05f11a74a4a06b4abcb1e302f56201609acccad2)
    • Fix perf logging for dirty mounts (3ad8bfba12a43e108602bcd8c63fd2404e6203cb)
    • Fix crash when @OnCalculateCachedValue takes no args (2a0f5240bc8c711d8e45db0e5426517f8bfbf49a)
    • Reduce number of systrace markers in collectResults: these were skewing they perceived size of collectResults in production and weren't actionable (3107467a4e3fd649821757699a5adba683f47edd)

    See all changes here: https://github.com/facebook/litho/compare/v0.26.0...v0.27.0

    Source code(tar.gz)
    Source code(zip)
  • v0.26.1(May 28, 2019)

  • v0.26.0(May 13, 2019)

    BREAKING CHANGES

    • Fix the lazy State update semantics (https://github.com/facebook/litho/commit/de3d938c7db32739468617d3b22e5a4568cfc6a5)
    • Rename LayoutHandler to LithoHandler (https://github.com/facebook/litho/commit/69cba5029c186a4fa81f91c15b44846bc9d79e5c) and add DefaultLithoHandler (https://github.com/facebook/litho/commit/0d0bb0b196e4035976cb31c307aee95fd9433a27)
    • Update Yoga version to 1.14.0 (https://github.com/facebook/litho/commit/c16baf676f59df99de53cea50e5efa0cb9ddeb0e). Fixes #536
    • Release sections' ComponentTrees when RecyclerCollectionComponent is detached (https://github.com/facebook/litho/commit/88930499b19c01953dead8d37e4fed7c1d161ca1)
    • Only enable incremental mount if parent incremental mount is enabled (https://github.com/facebook/litho/commit/c88a6605d8e77378e0ac89b267dcb260daddc6f4)

    Improvements

    • EXPERIMENTAL: Make state updates faster by only recreating the subtrees which are being updated and reuse (read clone) the untouched subtrees while calculating a new layout. You can try in out by setting ComponentsConfiguration.isReconciliationEnabled flag globally or using ComponentTree.Builder#isReconciliationEnabled for specific trees
    • Add a replaceAll(List<RenderInfo>) method to RecyclerBinder (#451)
    • Eliminate Gradle deprecated methods (#526)
    • Remove object pooling everywhere
    • Cleanup tests and unused code
    • Update documentation

    Bugfixes

    • Fix Robolectric tests (https://github.com/facebook/litho/commit/a92018a32d5241ace4d27f4120908595fb26b51a)

    See all changes here: https://github.com/facebook/litho/compare/v0.25.0...v0.26.0

    Source code(tar.gz)
    Source code(zip)
  • v0.25.0(Mar 14, 2019)

    BREAKING CHANGES

    • Migrated support lib dependencies to AndroidX (https://github.com/facebook/litho/commit/de3097b5c7e2bc9ede24ea8c5e8e863e67387039)
    • Remove DisplayListDrawable (https://github.com/facebook/litho/commit/29f42fa04dfdff31fc82dd8f199ffc8c62ef5dbf) and other displaylist related features
    • Remove References API (https://github.com/facebook/litho/commit/b1aa39a460da25fbf29a80f727007a7e1f267440)

    Improvements

    • Remove object pooling for most internal objects
    • Replace powermock-reflect with internal Whitebox implementation (https://github.com/facebook/litho/commit/ad899e4ae2c4217d751a75e82c0646d70b5837a3)
    • Enable Gradle incremental AnnotationProcessing (https://github.com/facebook/litho/commit/a864b5a642214d1d81c7422d3d4b2d0ada510625)
    • Allow TextInput to accept null inputBackground (https://github.com/facebook/litho/commit/d1fd03b4071794f55fc1617cf365f8a5f2a32558)
    • Update documentation

    Bugfixes

    • Suppress focus temporarily while mounting (https://github.com/facebook/litho/commit/d93e2e073a88b86b2674119bd1813a6c982622bf)
    • When clearing press state, also cancel pending input events (https://github.com/facebook/litho/commit/451e8b4a9c5b7744a6cf5b7702754fc0afe025a0)
    • Fix visibilityChanged event MountState calculations (https://github.com/facebook/litho/commit/66d65feb39ed86450ea74891f9211fd6fda6ffc8)
    • Fix thread safety issue of ViewportChanged listeners of ViewportManager (https://github.com/facebook/litho/commit/9da9d903c22d0b10d823d509da18c08eb2b2f875)

    See all changes here: https://github.com/facebook/litho/compare/v0.24.0...v0.25.0

    Source code(tar.gz)
    Source code(zip)
  • v0.24.0(Feb 18, 2019)

    BREAKING CHANGES

    • The default for state updates has changed from sync to async. At Facebook this meant we ran a codemod script on the codebase and changed all state update methods to the explicit Sync variant (Sync is just appended to the end of the state update call), then changed the default. The reason for this is to not change existing behavior in case it breaks something, since there are many callsites. The script is committed and available at https://github.com/facebook/litho/blob/master/scripts/codemod-state-update-methods.sh . We recommend using it if you have any concerns about state update calls automatically becoming async. As a reminder, when you add a @OnUpdateState method, it generates three methods: updateState, updateStateSync, and updateStateAsync. Previously updateState == updateStateSync. Now, updateState == updateStateAsync
    Source code(tar.gz)
    Source code(zip)
  • v0.23.0(Jan 16, 2019)

    BREAKING CHANGES

    • KeyHandlers now get registered in EndToEnd tests (https://github.com/facebook/litho/commit/9836497c15986ebafbfc2b87b1b4a9730fc73080). This is a an edge-case but potentially behavior-changing.

    Improvements

    • New support for Cached Values.
    • isEquivalentTo now uses reflection for size reasons unless the target is a MountSpec or SectionSpec (https://github.com/facebook/litho/commit/2e27d99b0ae75e8356b5654fa412cb66ec965411).

    Bugfixes

    See all changes here: https://github.com/facebook/litho/compare/v0.22.0...v0.23.0

    Source code(tar.gz)
    Source code(zip)
  • v0.22.0(Dec 11, 2018)

    BREAKING CHANGES

    • transitionKey has changed default scope from GLOBAL to LOCAL: This means a transition key is local to the spec where it was declared and can only be reference from that spec. To restore previous behavior, 1) set .transitionKeyType to GLOBAL on your Component when you set a .transitionKey, and 2) update the corresponding Transition.create calls to specify a GLOBAL key type.
    • EditTextSpec is now deprecated in favor of TextInputSpec. TextInputSpec fixes bugs that could cause loss of text while typing and allows text to be preserved when scrolled off screen. Interface has changed slightly, text can no longer be provided as a prop but now must be set on the main thread using the setText trigger.
    • shouldClipChildren property on ComponentTree has been removed: use clipChildren common prop on Component instead.
    • We now verify all fields on a *Spec are static and final: this is to prevent correctness issues we've seen with using mutable, non-thread-safe data in specs. Use @State instead if necessary.

    Improvements

    • Re-enable systrace blocks for async state update names: faa9a0a0266f03153ea615fa8d5dc8a78f6a635e

    Bugfixes

    • Fix crash in TextDrawable: eb3fbc9b1df057b5edbda6e34ca05c8559fec426
    • Fix ComponentContext leak in TextInputSpec: 8bb9d76d54729f0c70cb4cf3fa2d780d8d5c6602
    • Fix incorrect handling of aspect ratio when combined with flex-stretch in Yoga: 6a9328d81b796a8d11fa0a184935f445824b07c6

    See all changes here: https://github.com/facebook/litho/compare/v0.21.0...v0.22.0

    Source code(tar.gz)
    Source code(zip)
  • v0.21.0(Nov 22, 2018)

    New Features

    • Add getAndroidContext method in ComponentContext
    • Introducing the Equivalence interface
    • Add fading edge support to VerticalScrollSpec
    • Support Hiding Top or Bottom Rounded Corners for CardSpec
    • Make TextInputSpec dynamically re-measure itself
    • Add multiline to the TextInputSpec
    • Add TextWatcher support to TextInputSpec
    • Add Comparable Drawable
    • Add DefaultComparableDrawable

    Improvements

    • Raise background thread to high priority when it's running a layout
    • Add accessibility role for Header in bucket headers
    • Replaced default constructors with member assignments in YGConfig
    • Synchronize outside of for loops in RecyclerBinder to improve performance
    • Cache isAccessibilityEnabled Value
    • Use the generated Comparable types for the reflective isEquivalentTo method
    • Measure TextInputSpec height based on underlying EditText height
    • Report FATAL error when encounter transition key duplication instead of throwing an exception
    • Change ComponentContext to not extend Context
    • Schedule async layouts in parallel with initRange layout
    • Boost thread that is running LayoutStateFuture
    • Add dispatchOnFocusedVisibleEvent to ComponentTestHelper
    • Lazy init border color drawable

    Bugfixes

    • Fix temporary enabling/disabling child clipping for animations
    • Fix releasing drawable order
    • Fix setting bounds to DLDrawable with underlying MatrixDrawable
    • Fix selecting a position before mounting a circular recycler and it either resets to middle or does not allow user to scroll to the left
    • Don't recursively calculate layout for released LayoutStateFutures
    • Never wrap RippleDrawables into DisplayListDrawables
    • Check if tree is valid before recomputing async layout
    Source code(tar.gz)
    Source code(zip)
  • v0.20.0(Oct 18, 2018)

    New Features

    • Add API to request scroll to position that includes snapping in RecyclerCollectionComponent
    • Track crashes in stacktraces across threads.
    • Add ability to turn LithoView debug overlay mode to see whether layout was calculated on UI thread (green) or BG thread (red)

    Improvements

    • Change traverse direction to backward if list is laid out from end in RecyclerBinder
    • Include accessibility services like SelectToSpeak in isAccessibilityEnabled check
    • Allow chaining of RecyclerBinderConfiguration setters
    • Add Litho architecture overview in the docs
    • Only find visible area for mounting if attached
    • Add clipChildren prop to the Component.Builder
    • Simplify displaylist handling and remove prefetching
    • Added Builder methods to RecyclerBinderConfiguration
    • Add disable clipping props to CardSpec

    Bugfixes

    • ComponentHost should not delay press state of children
    • Fix LayoutStateFuture thread safety
    • Fix zero division crash in RecyclerBinder
    • Re-create DisplayList in LayoutState when device rotates
    • Unmount sticky header when hiding it
    • Fix the order in which the drawable is unmounted and released in DrawableComponent
    Source code(tar.gz)
    Source code(zip)
  • v0.19.0(Aug 23, 2018)

    New Features

    • Make CommonProps accessible from a Component
    • Add incremental mount prop to VerticalScroll
    • Add smooth scroll to center in RecyclerBinder
    • Make CardShadowSpec and CardShadowDrawable public

    Improvements

    • Provide timestamp in @OnDataRendered callback
    • Make possible to animate Rotation on RT
    • Avoid delaying ComponentHost children pressed state
    • Add the ability to provide onScrollChangeListener to VerticalScroll

    Bugfixes

    • Fix synchronization of event triggers
    • Add missing minHeight and minWidth attributes to theme parsing
    • Fix height/width calculation when the actual size is less than minHeight/minWidth
    Source code(tar.gz)
    Source code(zip)
  • v0.18.0(Jul 20, 2018)

    New Features

    • Support for @OnDataRendered callback in RecyclerBinder (8da4867).
    • Transition.delay() API (35228cdf5e5c1ab4bd26be792bf62c8b79aac9d1).

    Improvements

    • Perf improvements for VertialScroll (039c6a6a66fff3f71f044f3f6d29d56e9a566a60, eee0197, 3cc6574).
    • Ignore uninitialized LayoutParams from the RecyclerBinder (#395).
    • Prewarm ImageSpec layout (f7957828efabf31650deefec7ab6055dca06ce4a).
    • Add a getter for ComponentContext on Component.Builder (#398).
    • Updated to SoLoader 0.5.1 and Yoga 0.19.0.

    Bugfixes

    • Fix out-of-bounds for text truncation (a226ccb25d52f629e471ed05ba3034d15a541d87).
    • Correct TextDrawable span click detection for bidirectional text. (3201eff).
    • Fix TreeProp persistence from Section to Component to Component (31318d0a8342897ef02361d1beb9cdc0ea37b27e).

    For a full list of changes, check out the comparison view.

    Source code(tar.gz)
    Source code(zip)
  • v0.17.0(Jul 6, 2018)

    New Features

    • Add fillViewport to VerticalScroll (34dad312670bf613766bc13cf62267e23906ae2d)
    • Smooth scrolling alignment options. (fd60d1e43611f85d1bc6b2e997682328b42bd406)
    • Support smooth scrolling to child by key. (6438850765217614aba174f89bc1a1915e32b3c6)
    • Support smooth scrolling with offset. (62fa98eda0f014911620b370d8b535f0033715e8)
    • TextInput: a single-line text field (7a445f780062d96c6a92950bf84b6e26ef3495f2)
    • Add ability to clear focus on an EditText. (af3c86212f6043aa69f2fc537dc5bbdb2e8cf92c, ca9a073009f99bc7a2c8d4de669a1aefd7efdb42, f3e244e2f721eca76c762ec5c4171ac8fc0e6033, etc.)
    • Implements text truncation with custom ellipsis in litho TextSpec. (9bb5b83702dfe3da8c4784fdef0252aea29c6967)

    Bug Fixes

    • Fix layout diffing when layout state is calculated twice before mount. (5508612c125559ea92dfcd2ccf04c264132184c3)
    • Fix race condition during tracing in sections setRoot. (b6b4006c733dcdf980c9cbfa57c9647e68a521bb)
    • Fix Android crash in VerticalScroll on pre-Lollipop versions. (19e3582b7dad764d7bf282bdfcc73fde79fab45c)
    • Clean-up parent / owner reference of children during clonning. (a444dc030f9de04544b29d1142a1307092671767)
    • Remove recycling from TreeProps. (e0c635da6a3162bf64146ee0491f135f21f4e69d)
    • Clear components in LayoutState.releaseRef() (481e4863b173d857386d52d087466a5616a0ac41)
    • Do not start already started renderthread animation. (dc123d0ddd61100ae24c0a4afdc207774737f15e)
    • Fix docs around shouldUpdate. (bda08a17e62317f28e16365a2d116abd205ad1c3)

    Docs

    • Tooltip api doc (7c2b1cd5e4cde98c7569280b9bd042cc732999b9)

    More

    For a full list of changes, see https://github.com/facebook/litho/compare/v0.16.0...v0.17.0

    Source code(tar.gz)
    Source code(zip)
Owner
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
Facebook
Beagle is an open-source framework for cross-platform development using the concept of Server-Driven UI.

Beagle Getting Started · Learn the Basics · Contribute Beagle is an open-source framework for cross-platform development using the concept of Server-D

ZUP IT INNOVATION 657 Dec 28, 2022
Component Box - a multiplatform server-driven UI framework

Component Box · Component Box is a multiplatform server-driven UI framework. Learn how to use Component Box in your project. Installation implementati

Dropbox 216 Dec 31, 2022
A Lightweight Framework for Code Generating

Codegen A lightweight framework for code generating. Why Codegen? In Java/Kotlin world, engineers usually use JavaPoet or KotlinPoet for code generati

Johnson Lee 38 Dec 20, 2022
Android library used to create an awesome Android UI based on a draggable element similar to the last YouTube graphic component.

Draggable Panel DEPRECATED. This project is not maintained anymore. Draggable Panel is an Android library created to build a draggable user interface

Pedro Vicente Gómez Sánchez 3k Dec 6, 2022
TourGuide is an Android library that aims to provide an easy way to add pointers with animations over a desired Android View

TourGuide TourGuide is an Android library. It lets you add pointer, overlay and tooltip easily, guiding users on how to use your app. Refer to the exa

Tan Jun Rong 2.6k Jan 5, 2023
Bubbles for Android is an Android library to provide chat heads capabilities on your apps. With a fast way to integrate with your development.

Bubbles for Android Bubbles for Android is an Android library to provide chat heads capabilities on your apps. With a fast way to integrate with your

Txus Ballesteros 1.5k Jan 2, 2023
View that imitates Ripple Effect on click which was introduced in Android L (for Android 2.3+)

RippleView View that imitates Ripple Effect on click which was introduced in Android L. Usage For a working implementation, Have a look at the Sample

Muthuramakrishnan Viswanathan 1.2k Dec 30, 2022
A new canvas drawing library for Android. Aims to be the Fabric.js for Android. Supports text, images, and hand/stylus drawing input. The library has a website and API docs, check it out

FabricView - A new canvas drawing library for Android. The library was born as part of a project in SD Hacks (www.sdhacks.io) on October 3rd. It is cu

Antwan Gaggi 1k Dec 13, 2022
MarkdownView is an Android webview with the capablity of loading Markdown text or file and display it as HTML, it uses MarkdownJ and extends Android webview.

About MarkdownView (Markdown For Android) is an Android library that helps you display Markdown text or files (local/remote) as formatted HTML, and st

Feras Alnatsheh 1k Dec 20, 2022
SwipeBack for Android Activities to do pretty the same as the android "back-button" will do, but in a really intuitive way by using a swipe gesture

SwipeBack SwipeBack is for Android Activities to do pretty the same as the android "back-button" will do, but in a really intuitive way by using a swi

Hannes Dorfmann 697 Dec 14, 2022
A backport of the SwitchPreference component that was introduced on Android 4 (ICS / level 14). This port works on Android 2.1+ (Eclair MR1 / level 7).

Android Switch Preference Backport A backport of the SwitchPreference component that was introduced on Android 4 (ICS / level 14). This port works on

Benoit Lubek 498 Dec 29, 2022
Wizard Pager is a library that provides an example implementation of a Wizard UI on Android, it's based of Roman Nurik's wizard pager (https://github.com/romannurik/android-wizardpager)

Wizard Pager Wizard Pager is a library that provides an example implementation of a Wizard UI on Android, it's based of Roman Nurik's wizard pager (ht

Julián Suárez 520 Nov 11, 2022
Make your native android Toasts Fancy. A library that takes the standard Android toast to the next level with a variety of styling options. Style your toast from code.

FancyToast-Android Prerequisites Add this in your root build.gradle file (not your module build.gradle file): allprojects { repositories { ... ma

Shashank Singhal 1.2k Dec 26, 2022
Make your native android Dialog Fancy. A library that takes the standard Android Dialog to the next level with a variety of styling options. Style your dialog from code.

FancyAlertDialog-Android Prerequisites Add this in your root build.gradle file (not your module build.gradle file): allprojects { repositories { ..

Shashank Singhal 350 Dec 9, 2022
Xamarin.Android provides open-source bindings of the Android SDK for use with .NET managed languages such as C#

Xamarin.Android Xamarin.Android provides open-source bindings of the Android SDK for use with .NET managed languages such as C#. Build Status Platform

Xamarin 1.8k Jan 5, 2023
A Tinder-like Android library to create the swipe cards effect. You can swipe left or right to like or dislike the content.

Swipecards Travis master: A Tinder-like cards effect as of August 2014. You can swipe left or right to like or dislike the content. The library create

Dionysis Lorentzos 2.3k Dec 9, 2022
Bootstrap style widgets for Android, with Glyph Icons

Android-Bootstrap Android Bootstrap is an Android library which provides custom views styled according to the Twitter Bootstrap Specification. This al

Bearded Hen 7.3k Jan 3, 2023
[] A fast PDF reader component for Android development

This project is no longer maintained. You can find a good replacement here, which is a fork relying on Pdfium instead of Vudroid/MuPDF for decoding PD

Joan Zapata 2.8k Dec 16, 2022