)]}'
{
  "log": [
    {
      "commit": "05ea92e90381eb8a8ae06855ea2b74f322bebbec",
      "tree": "65bc56242e7016531b886aceb569888913d4ca67",
      "parents": [
        "c8addcb776f6cd940abaf55ae6b471e55b626eb9"
      ],
      "author": {
        "name": "Fengjiang Li",
        "email": "fengjial@google.com",
        "time": "Sun Feb 15 14:03:57 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 15 14:03:57 2026 -0800"
      },
      "message": "Support Lottie to be rendered on per-window UI thread (#2685)\n\nIssue: #2684"
    },
    {
      "commit": "c8addcb776f6cd940abaf55ae6b471e55b626eb9",
      "tree": "75c764aabfb80eab62f8b7734c71b1fa2e525829",
      "parents": [
        "05ee1c167c79090276b2519165649977ef14d76f"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Fri Oct 31 10:50:52 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Fri Oct 31 10:50:52 2025 -0500"
      },
      "message": "v6.7.1\n"
    },
    {
      "commit": "05ee1c167c79090276b2519165649977ef14d76f",
      "tree": "01c555b94808895f732f1a8dda397394a91c8893",
      "parents": [
        "90f9f0361a7fd7b1884fc2ed8455d6ce6ad19a77"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Fri Oct 31 10:42:43 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 31 10:42:43 2025 -0500"
      },
      "message": "Safeguard against very large Bitmap creation (#2662)\n\n* Safeguard against very large Bitmap creation\n\nBecause we rely on the transform `Matrix` returned from the `Canvas` to size a `Bitmap` when using software rendering, an erroneous matrix value can cause a very large Bitmap to be allocated, triggering an OutOfMemory exception.\n\nWe\u0027ve encountered such a situation when using `layoutlib` for screenshot tests, which uses a `NopCanvas` [on initial render](https://cs.android.com/android/_/android/platform/frameworks/layoutlib/+/7b05b277beee599532606e9bb6d7a71f5ca2ab6e:bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java;l\u003d543;bpv\u003d1;bpt\u003d0;drc\u003d085857f145aac790e2a08cf6eb9546f98e26c338) that can return an invalid `Matrix.\n\n* Use a hardcoded upper bound and add additional checks"
    },
    {
      "commit": "90f9f0361a7fd7b1884fc2ed8455d6ce6ad19a77",
      "tree": "8f4d3030c64e4c66a80bc43d6f6dd01d1fc247ac",
      "parents": [
        "9c35bb505a7a237e2ce2495ee11e9c64904aaaba"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@openai.com",
        "time": "Mon Oct 27 15:43:02 2025 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@openai.com",
        "time": "Mon Oct 27 15:43:02 2025 -0700"
      },
      "message": "v6.7.0\n"
    },
    {
      "commit": "9c35bb505a7a237e2ce2495ee11e9c64904aaaba",
      "tree": "71786e9582e7b92ad26b091d2fc579fbf6471ebe",
      "parents": [
        "82f1b172a98c748a2a80582e6d7cefe1388ac322"
      ],
      "author": {
        "name": "hepiao3",
        "email": "39408465+hepiao3@users.noreply.github.com",
        "time": "Mon Oct 27 01:25:25 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 26 13:25:25 2025 -0400"
      },
      "message": "Optimize and improve performance of 3d layers (#2673)\n\nCo-authored-by: hepiao3 \u003chepiao3@jd.com\u003e\n"
    },
    {
      "commit": "82f1b172a98c748a2a80582e6d7cefe1388ac322",
      "tree": "8e8a8dc93917019ec6109d3a500134f55582f303",
      "parents": [
        "c0a7e0773f1d8995adc107f75c136c21c12a8af5"
      ],
      "author": {
        "name": "hepiao3",
        "email": "39408465+hepiao3@users.noreply.github.com",
        "time": "Fri Oct 24 07:26:05 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Oct 23 16:26:05 2025 -0700"
      },
      "message": "Add 3D rotation support for Lottie animations (#2666)\n\n* Add 3D rotation support for Lottie animations\n\n* Add 3D-layers properties test animation\n\n* Move JobCard.json to snapshot-tests\n\n---------\n\nCo-authored-by: hepiao3 \u003chepiao3@jd.com\u003e"
    },
    {
      "commit": "c0a7e0773f1d8995adc107f75c136c21c12a8af5",
      "tree": "7e8191d755cc322e0c8ddf65dcb5aa48fce17f8a",
      "parents": [
        "3ac73ed33f514367a121ad08c62ad05c560d7db0"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Oct 02 17:16:50 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Oct 02 17:16:50 2025 -0500"
      },
      "message": "v6.6.10\n"
    },
    {
      "commit": "3ac73ed33f514367a121ad08c62ad05c560d7db0",
      "tree": "f8c2b3aae39927896d5078525f21dd74c6200b64",
      "parents": [
        "c920e87adbeec1d5d7ea220aa0139fc65dee7b30"
      ],
      "author": {
        "name": "nrchan",
        "email": "31267546+nrchan@users.noreply.github.com",
        "time": "Mon Sep 29 10:40:47 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 28 22:40:47 2025 -0400"
      },
      "message": "Add RTL support to lottie-android (#2663)\n\n"
    },
    {
      "commit": "c920e87adbeec1d5d7ea220aa0139fc65dee7b30",
      "tree": "616a3acc781cfaa24e53a5d73d1855d3c18fafaf",
      "parents": [
        "5af8c292990374c28468b9a14080242f165d4c8c"
      ],
      "author": {
        "name": "Rahul Behera",
        "email": "rbehera@gmail.com",
        "time": "Fri Sep 19 10:33:46 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 19 11:33:46 2025 -0400"
      },
      "message": "Make `lottieComposition` public (#2660)\n\n"
    },
    {
      "commit": "5af8c292990374c28468b9a14080242f165d4c8c",
      "tree": "21279b6bd78c483e644ae698a40ba0c070007a52",
      "parents": [
        "33b683cb38822a95ddd89d1e2e48b8dc32c58c92"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Tue Sep 16 18:13:39 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Tue Sep 16 18:13:39 2025 -0500"
      },
      "message": "v6.6.10-SNAPSHOT\n"
    },
    {
      "commit": "33b683cb38822a95ddd89d1e2e48b8dc32c58c92",
      "tree": "15d53963fd1817c625aa7d322b4a9ca550b54942",
      "parents": [
        "479920b32b81ec80f7cf542628180245d98951e8"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Tue Sep 16 17:02:10 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Tue Sep 16 17:02:10 2025 -0500"
      },
      "message": "v6.6.9\n"
    },
    {
      "commit": "479920b32b81ec80f7cf542628180245d98951e8",
      "tree": "44ef71bfc33c7bbaf177caf1021473d410f09cd5",
      "parents": [
        "387bf1b2e3ad2188502c9a89946a123c945f24c4"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Tue Sep 16 15:59:02 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 16 16:59:02 2025 -0400"
      },
      "message": "Fix transparent background rendering with MULTIPLY Blend mode on Android 34+ (#2661)\n\n"
    },
    {
      "commit": "387bf1b2e3ad2188502c9a89946a123c945f24c4",
      "tree": "9f2ab345fa89a56677e83039b452f72868422810",
      "parents": [
        "b1ec15e5efca57ba9b1120bc2d4b1d8915b7ead4"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Aug 28 19:13:01 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Aug 28 19:13:01 2025 -0500"
      },
      "message": "Bump sample app versionCode\n"
    },
    {
      "commit": "b1ec15e5efca57ba9b1120bc2d4b1d8915b7ead4",
      "tree": "1d88a3a14025e49ec82b49af9fefaf1593e4eb4f",
      "parents": [
        "80f0b59b57e949be6de4e9a895c42acba2611037"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Aug 28 17:29:08 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Aug 28 17:29:08 2025 -0500"
      },
      "message": "v6.6.9-SNAPSHOT\n"
    },
    {
      "commit": "80f0b59b57e949be6de4e9a895c42acba2611037",
      "tree": "5fa2c2744cdb49fb7f73a3ca95133ba646e98417",
      "parents": [
        "1a4f48c913cebfb30184e75ba41058dd6e1e163a"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Aug 28 17:28:02 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Aug 28 17:28:02 2025 -0500"
      },
      "message": "v6.6.8\n"
    },
    {
      "commit": "1a4f48c913cebfb30184e75ba41058dd6e1e163a",
      "tree": "fdd0682a2814cbf62faca55451693c664d48945e",
      "parents": [
        "6c9b427ee1d716c09b7e3abdf8ce2cf0b3bf29f5"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Fri Aug 08 16:24:46 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 08 17:24:46 2025 -0400"
      },
      "message": "Update compileSDK and targetSDK to 36 (#2652)\n\n"
    },
    {
      "commit": "6c9b427ee1d716c09b7e3abdf8ce2cf0b3bf29f5",
      "tree": "5584b84863fd15d2737b35ca2a7fee9c849ddc05",
      "parents": [
        "8c06610a123bc1beb44ac5fd9c04c75cebdf26c5"
      ],
      "author": {
        "name": "Marcin Robaczyński",
        "email": "marcin.robaczynski@whatnot.com",
        "time": "Sun Jun 29 20:59:26 2025 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 29 14:59:26 2025 -0400"
      },
      "message": "Enable path interpolator cache by default (#2646)\n\n"
    },
    {
      "commit": "8c06610a123bc1beb44ac5fd9c04c75cebdf26c5",
      "tree": "cbc84f5b56ab3309a0820c6bb06c02b63a5f8f8c",
      "parents": [
        "d5eb12403136cfe2a1d6f9a9c88e7820632e4921"
      ],
      "author": {
        "name": "Chris Hanson",
        "email": "chrishanson.php@gmail.com",
        "time": "Tue Jun 24 09:55:08 2025 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 24 06:55:08 2025 -0700"
      },
      "message": "In DefaultLottieFetchResult, catch NPE from getErrorFromConnection() (#2643)\n\nFixes #2642"
    },
    {
      "commit": "d5eb12403136cfe2a1d6f9a9c88e7820632e4921",
      "tree": "0a9bb2c440239dee3ae5dbcd0a7bed0a6baba7dc",
      "parents": [
        "e1ce6e97460fd725854c37f1fa278f4102ac7b70"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Tue Jun 17 10:58:50 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 17 10:58:50 2025 -0700"
      },
      "message": "Also enable autoPublish for lottie-compose (#2641)\n\n"
    },
    {
      "commit": "e1ce6e97460fd725854c37f1fa278f4102ac7b70",
      "tree": "850991f5e52e3a27a5029788cd24d611a4b8f3dc",
      "parents": [
        "631d96d1b701a1f2b6eeef28cf3a0e65b5d5fded"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Mon Jun 16 17:21:28 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 16 17:21:28 2025 -0700"
      },
      "message": "Update the gradle wrapper to 8.14.2 (#2640)\n\n* Update the gradle wrapper to 8.14.2\n\nThis version supports Java versions up to 24: https://docs.gradle.org/current/userguide/compatibility.html\n\n* Run ./gradlew wrapper"
    },
    {
      "commit": "631d96d1b701a1f2b6eeef28cf3a0e65b5d5fded",
      "tree": "c56efa8649c8fce4e3824e21ec954f06e184f2b3",
      "parents": [
        "b00bf80fccbb9bf2c2efcae800b3e91adde0a8e2"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Mon Jun 16 14:50:45 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 16 14:50:45 2025 -0700"
      },
      "message": "Publish to central.sonatype.com (#2639)\n\n* Publish to central.sonatype.com\n\nSee [Sonatype documentation](https://central.sonatype.org/faq/what-is-different-between-central-portal-and-legacy-ossrh/) for more details on the differences. The current publishing method (OSSRH) is being sunset on June 30th, 2025. New users can no longer be onboarded to the Nexus Repository Manager, which means they must use the newer Central Portal to publish.\n\nSee [plugin documentation](https://vanniktech.github.io/gradle-maven-publish-plugin/central/#configuring-maven-central) for more details.\n\nThis will require developers to generate new tokens on Sonatype, as the old OSSRH tokens will no longer work.\n\n* Enable automatic releases\n\nThis means the person triggering the publish does not need to manually release the staging repository. See https://vanniktech.github.io/gradle-maven-publish-plugin/central/#automatic-release"
    },
    {
      "commit": "b00bf80fccbb9bf2c2efcae800b3e91adde0a8e2",
      "tree": "3141fb692d701eab70b2fe51c1ebc6fc3416470f",
      "parents": [
        "ab5a5da7ffb66deeacf24af9e86b1522bdba4efb"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Fri Jun 13 18:00:58 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Fri Jun 13 18:00:58 2025 -0500"
      },
      "message": "Update VERSION_NAME to 6.6.7\n"
    },
    {
      "commit": "ab5a5da7ffb66deeacf24af9e86b1522bdba4efb",
      "tree": "2eaf55f149e85dd4ffa067cd4d3f4a31e345dfda",
      "parents": [
        "1cbe8c129bae5ea83cddf78f27d87c4b188edd31"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Jun 12 20:21:53 2025 -0500"
      },
      "committer": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Thu Jun 12 20:21:53 2025 -0500"
      },
      "message": "v6.6.7\n"
    },
    {
      "commit": "1cbe8c129bae5ea83cddf78f27d87c4b188edd31",
      "tree": "2bbfa969ffdbc010be516112572a9ed19585219c",
      "parents": [
        "2a86be78870cef4a8644bd317ef0ed26f60d4912"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Tue May 27 10:36:27 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 27 10:36:27 2025 -0700"
      },
      "message": "Fix crash when drawing shadow on image using RenderNode (#2635)\n\n"
    },
    {
      "commit": "2a86be78870cef4a8644bd317ef0ed26f60d4912",
      "tree": "1633c008f50b14ddf8b73f7a639fcbc67767beb8",
      "parents": [
        "d13df1cdc8705a67254ce4ff832732554f5f9844"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Apr 09 19:56:50 2025 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Apr 09 19:56:50 2025 -0700"
      },
      "message": "v6.6.7-SNAPSHOT\n"
    },
    {
      "commit": "d13df1cdc8705a67254ce4ff832732554f5f9844",
      "tree": "556edc054be53b373d1f95c70bfba3dfd8598aeb",
      "parents": [
        "ec1e960c9b49718f1038d2b41281a71c955e0fdd"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Apr 09 19:52:47 2025 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Apr 09 19:52:47 2025 -0700"
      },
      "message": "v6.6.6\n"
    },
    {
      "commit": "ec1e960c9b49718f1038d2b41281a71c955e0fdd",
      "tree": "648289fdff2c4ba087ca7b60da74092fbb583c7a",
      "parents": [
        "ccff9af9c869e168fbccda7d0e0eb96894bd708d"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Wed Apr 02 16:38:56 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 02 16:38:56 2025 -0700"
      },
      "message": "Guard against Bitmap allocations of size 0 (#2626)\n\nFixes https://github.com/airbnb/lottie-android/issues/2620, which only occurs on Android 12 devices."
    },
    {
      "commit": "ccff9af9c869e168fbccda7d0e0eb96894bd708d",
      "tree": "f0a789ed9169ec60a9661fa8861445f476049105",
      "parents": [
        "a6cc79b022a7258f7c2fdd2367bf98b8adb38f05"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Mar 19 17:46:52 2025 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Mar 19 17:46:52 2025 -0700"
      },
      "message": "v6.6.5-SNAPSHOT\n"
    },
    {
      "commit": "a6cc79b022a7258f7c2fdd2367bf98b8adb38f05",
      "tree": "70a864759580d79acaf516f86472a1da2090071e",
      "parents": [
        "4bcc7361359a33448fde7c05aee3ed5361c5a30d"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Mar 19 17:43:55 2025 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Mar 19 17:43:55 2025 -0700"
      },
      "message": "v6.6.4\n"
    },
    {
      "commit": "4bcc7361359a33448fde7c05aee3ed5361c5a30d",
      "tree": "e27524ff793998ce237cd3e275afc065e112df34",
      "parents": [
        "b51e346960a539aab33ea9d18e1af5fe5df1ec08"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Wed Mar 19 17:25:42 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 19 17:25:42 2025 -0700"
      },
      "message": "Partially revert previous change to ImageLayer.getBounds() (#2623)\n\nThe changes in https://github.com/airbnb/lottie-android/pull/2578 set the bounds returned by `ImageLayer.getBounds()` to have 0 width and 0 height if there is no Bitmap available. This change instead calls the previous version of the logic which reads the width and height of the `LottieImageAsset`."
    },
    {
      "commit": "b51e346960a539aab33ea9d18e1af5fe5df1ec08",
      "tree": "25f6e76c86ca3428d05692f92695b496e0ba6009",
      "parents": [
        "e1257ee4f73e0c7779644497d1be5aa1228c711c"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Mon Mar 03 17:41:08 2025 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Mon Mar 03 17:41:08 2025 -0800"
      },
      "message": "v6.6.4-SNAPSHOT\n"
    },
    {
      "commit": "e1257ee4f73e0c7779644497d1be5aa1228c711c",
      "tree": "0497f54f83b13ac8a09d65a5a184092e8a35090f",
      "parents": [
        "3c18f4c3166a29f6827f9401fac1a33fea4c7990"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Mon Mar 03 17:39:31 2025 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Mon Mar 03 17:39:31 2025 -0800"
      },
      "message": "v6.6.3\n"
    },
    {
      "commit": "3c18f4c3166a29f6827f9401fac1a33fea4c7990",
      "tree": "2db28c3411677de75a57ef2d33e0b09117285bc2",
      "parents": [
        "ac2599cce07d6386b08c749c8e4799a9d1da1d74"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Mon Mar 03 17:34:57 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 03 17:34:57 2025 -0800"
      },
      "message": "Prevent NPE in ImageLayer.getBounds() (#2578)\n\nCo-authored-by: Allen Chen \u003callen.chen@airbnb.com\u003e"
    },
    {
      "commit": "ac2599cce07d6386b08c749c8e4799a9d1da1d74",
      "tree": "a15af16dfa7ddeea536acbe23d5eb673bed248cd",
      "parents": [
        "7fff42b18a9c5efe9ed871d7cc5e3a77f003c8aa"
      ],
      "author": {
        "name": "dazza5000",
        "email": "darran.kelinske@gmail.com",
        "time": "Mon Mar 03 10:41:38 2025 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 03 08:41:38 2025 -0800"
      },
      "message": "Fix radial gradient crash (#2611)\n\nFixes #2610"
    },
    {
      "commit": "7fff42b18a9c5efe9ed871d7cc5e3a77f003c8aa",
      "tree": "21e611c31d27157332c52e259b6bb12408c53430",
      "parents": [
        "d0a3be071039697c34b743ceef2a4c45bf5a9af7"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Mar 02 16:45:10 2025 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 02 16:45:10 2025 -0800"
      },
      "message": "Add lot test file (#2617)\n\nFixes #2614"
    },
    {
      "commit": "d0a3be071039697c34b743ceef2a4c45bf5a9af7",
      "tree": "eb0fb30b33bc33f5c0b0699d056ed7d17b36db38",
      "parents": [
        "26ad8bab274eac3f93dccccfa0cafc39f7408d13"
      ],
      "author": {
        "name": "Jake Wharton",
        "email": "github@jakewharton.com",
        "time": "Fri Feb 14 12:37:48 2025 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 14 09:37:48 2025 -0800"
      },
      "message": "Support system property to set a testing executor (#2613)\n\nCloses #2612"
    },
    {
      "commit": "26ad8bab274eac3f93dccccfa0cafc39f7408d13",
      "tree": "5e5bfb7d03a91b59f14576f73a5e0e9485960f6d",
      "parents": [
        "ef53f7a42fa225570c1b36993b2c8173e400eed5"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Dec 15 17:47:26 2024 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Dec 15 17:47:26 2024 -0800"
      },
      "message": "v6.6.3-SNAPSHOT\n"
    },
    {
      "commit": "ef53f7a42fa225570c1b36993b2c8173e400eed5",
      "tree": "26cb03d296e259b8b6bf4ed493ebd7403f0706a6",
      "parents": [
        "89ec70c4e7950551944c1cf5a1df1ce744f03f2a"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Dec 15 17:47:03 2024 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Dec 15 17:47:03 2024 -0800"
      },
      "message": "v6.6.2\n"
    },
    {
      "commit": "89ec70c4e7950551944c1cf5a1df1ce744f03f2a",
      "tree": "1ae1109c0aae5d868a02f26afaf4b3d52561fa7f",
      "parents": [
        "43deff5f59aac540ee302638421dd8fc49e7af74"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Dec 15 12:49:23 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Dec 15 12:49:23 2024 -0800"
      },
      "message": "Better handle clip specs when minProgress \u003d\u003d maxProgress (#2600)\n\nFixes #2586"
    },
    {
      "commit": "43deff5f59aac540ee302638421dd8fc49e7af74",
      "tree": "9f753c70f4e6dc7bc529336bb7eba9d4d2bcab69",
      "parents": [
        "bb561e1e7abc48818e669c3de518165dde0c97bd"
      ],
      "author": {
        "name": "inorichi",
        "email": "len@kanade.eu",
        "time": "Sun Dec 15 20:57:58 2024 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Dec 15 11:57:58 2024 -0800"
      },
      "message": "Binary compatibility with 6.5 and lower on LottieAnimation (#2591)\n\n"
    },
    {
      "commit": "bb561e1e7abc48818e669c3de518165dde0c97bd",
      "tree": "a9805bf14518f86de9d51f8b9fd848e7cc9cc803",
      "parents": [
        "c21037fb2ac75ed48c50bfd1c59668f4142bfa6b"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sat Dec 14 21:14:22 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Dec 14 21:14:22 2024 -0800"
      },
      "message": "Only apply parent layer alpha to mattes (#2598)\n\nFixes #2570"
    },
    {
      "commit": "c21037fb2ac75ed48c50bfd1c59668f4142bfa6b",
      "tree": "3c4ff89bf99432233e924eb80d0796d34ea43475",
      "parents": [
        "0dd3818a2c4274fb16840c9f45b44acf44fc5472"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sat Dec 14 19:07:07 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Dec 14 19:07:07 2024 -0800"
      },
      "message": "Re-measure line height when justifying dynamic text (#2597)\n\nFixes #2592"
    },
    {
      "commit": "0dd3818a2c4274fb16840c9f45b44acf44fc5472",
      "tree": "50580ac558f1f655ad285e2e2a48b88e2dcf8e35",
      "parents": [
        "7b89be69ff01a5665d8d722de56e1554f65177fd"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sat Dec 14 17:32:56 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Dec 14 17:32:56 2024 -0800"
      },
      "message": "Parse as width/height as double (#2596)\n\nFixes #2552"
    },
    {
      "commit": "7b89be69ff01a5665d8d722de56e1554f65177fd",
      "tree": "51b651c0a229e00e4458a790d3525c294ac90d5b",
      "parents": [
        "db4ae1d6ee36540600edf72f7a3c08b1385d9385"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Dec 04 10:32:40 2024 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Dec 04 10:32:40 2024 -0800"
      },
      "message": "v6.6.2-SNAPSHOT\n"
    },
    {
      "commit": "db4ae1d6ee36540600edf72f7a3c08b1385d9385",
      "tree": "36585ddde0954646b8c56e400fa958cd290b96f3",
      "parents": [
        "5273ec689780c37e813a3f93398ad51d3322c191"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Dec 04 10:31:45 2024 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Dec 04 10:31:45 2024 -0800"
      },
      "message": "v6.6.1\n"
    },
    {
      "commit": "5273ec689780c37e813a3f93398ad51d3322c191",
      "tree": "5372dad28ad325c5dcce0a0ea70de1531fc4d4af",
      "parents": [
        "255352b020cde236d036302720319e83caaff127"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Tue Dec 03 22:45:12 2024 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 03 22:45:12 2024 -0500"
      },
      "message": "Fix floating point errors calculating keyframe end progress (#2588)\n\nThis fixed a really tricky bug that led to the wrong keyframe being used due to a floating point rounding error.\r\nGiven specific composition start frames and the existing floating point rounding, you could wind up with the following situation:\r\n\r\nKeyframe 1 has an endFrame of 48 and an endProgress of 0.095051385\r\nKeyframe 2 has a startFrame of 48 and a startProgress of 0.09505139\r\nThe Keyframe.containsProgress check intentionally leaves the upper end of the range open to make it unambiguous that the progress on the boundary of two keyframes should use the latter one.\r\n\r\nHowever, due to this floating point error, there was a gap and if the progress \u003d\u003d the endProgress of the first keyframe, it wouldn\u0027t match either.\r\n\r\nI was able to reconstruct this specific scenario with a unit test and confirmed that this fixed it. However, it is not impossible that there are other scenarios in which this could happen. However, I would rather avoid allocating doubles for everything which is more expensive unless we find a specific repro again"
    },
    {
      "commit": "255352b020cde236d036302720319e83caaff127",
      "tree": "440d4efcfefe37dc148b9b6ea07a021fccdcfaa1",
      "parents": [
        "39655756985240545e197ff08fa5abe747a05d68"
      ],
      "author": {
        "name": "yunyh",
        "email": "dbsdudguq@gmail.com",
        "time": "Tue Nov 12 07:33:58 2024 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Nov 11 14:33:58 2024 -0800"
      },
      "message": "Fix NPE a Bitmap reference at the Utils.resizeBitmapIfNeeded (#2573)\n\n"
    },
    {
      "commit": "39655756985240545e197ff08fa5abe747a05d68",
      "tree": "e19486a767806e50a95ca5be31a38f80420b0c26",
      "parents": [
        "d3d5cea171ebb69cad8d7ae66129a63f16a35b6d"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Oct 27 15:29:42 2024 -0600"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Oct 27 15:29:42 2024 -0600"
      },
      "message": "v6.6.1-SNAPSHOT\n"
    },
    {
      "commit": "d3d5cea171ebb69cad8d7ae66129a63f16a35b6d",
      "tree": "3b42c023f4a2a7303812d2f90ea42e99bcc1d944",
      "parents": [
        "211982e4d00f220bcc0f34b06cc687e8094e40a0"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Oct 27 15:21:26 2024 -0600"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Oct 27 15:21:26 2024 -0600"
      },
      "message": "v6.6.0\n"
    },
    {
      "commit": "211982e4d00f220bcc0f34b06cc687e8094e40a0",
      "tree": "571b662deee061779bf5d92670f25e98e010be00",
      "parents": [
        "e3a8fce86a35902b07a0375be6400b2dcb3b0aec"
      ],
      "author": {
        "name": "叶运林",
        "email": "yeyunlin@cvte.com",
        "time": "Mon Oct 28 05:11:49 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 27 15:11:49 2024 -0600"
      },
      "message": "Fix blinking issue when loop the animation in minFrame and maxFrame (#2497)\n\n"
    },
    {
      "commit": "e3a8fce86a35902b07a0375be6400b2dcb3b0aec",
      "tree": "6a2cbff71273e7324c5074db79a6b0fd1aef1e42",
      "parents": [
        "39796b30b76fcfbd402b98684ca83594a26dcc38"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Oct 27 15:07:24 2024 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 27 15:07:24 2024 -0600"
      },
      "message": "Fix rounded corner animations when the underlying shape doesn\u0027t animate (#2567)\n\nPreviously, if there was a rounded corners animation but no animation on the shape, the shape would never be marked as dirty and would keep returning the cached value.\r\n\r\n#2561"
    },
    {
      "commit": "39796b30b76fcfbd402b98684ca83594a26dcc38",
      "tree": "41d15b87dfb23eac722f0639aa8afc159951bd4a",
      "parents": [
        "3f4e535d99523ba0ae634af804f56b8db71b0187"
      ],
      "author": {
        "name": "Róbert Papp",
        "email": "papp.robert.s@gmail.com",
        "time": "Sun Oct 27 19:24:56 2024 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 27 13:24:56 2024 -0600"
      },
      "message": "Fix Maven badge links (#2566)\n\n"
    },
    {
      "commit": "3f4e535d99523ba0ae634af804f56b8db71b0187",
      "tree": "fa6f7a571e7dd28b8cef19a169c6d7090016eafd",
      "parents": [
        "d1bf9ed8e215dc0146c7bfc1add61be3d869007e"
      ],
      "author": {
        "name": "walle",
        "email": "914653872@qq.com",
        "time": "Mon Oct 28 03:24:47 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Oct 27 13:24:47 2024 -0600"
      },
      "message": "Apply left/top bounds before scaling (#2565)\n\n"
    },
    {
      "commit": "d1bf9ed8e215dc0146c7bfc1add61be3d869007e",
      "tree": "6c2a4e1a10169fd55b5b6d6678bbced790ba466f",
      "parents": [
        "5deb2deeb3507a39fca4ee17d29e45113302b93e"
      ],
      "author": {
        "name": "Bob Conan",
        "email": "sufssl03@gmail.com",
        "time": "Mon Oct 21 15:24:26 2024 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 21 13:24:26 2024 -0700"
      },
      "message": "Update RELEASE.md, fix a typo (#2564)\n\n"
    },
    {
      "commit": "5deb2deeb3507a39fca4ee17d29e45113302b93e",
      "tree": "3ea8eea0f2455e0388579af6903dee424ba564c7",
      "parents": [
        "e320c993c4ee501b488dadb0a6bfe64f91ce7404"
      ],
      "author": {
        "name": "David Davidović",
        "email": "david@davidovic.io",
        "time": "Sun Oct 20 00:51:46 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 19 15:51:46 2024 -0700"
      },
      "message": "Drop shadow overhaul: improve correctness and performance (#2548)\n\n## High-level summary\r\n\r\nThis PR introduces a large change to how drop shadows are rendered, introducing an `applyShadowsToLayers` flag which, by analogy to `applyOpacitiesToLayers`, allows layers to be treated as a whole for the purposes of drop shadows, improving the accuracy and bringing lottie-android in line with other renderers (lottie-web and lottie-ios).\r\n\r\nSeveral different codepaths for different hardware/software combinations are introduced to ensure the fastest rendering available, even on legacy devices.\r\n\r\nThe calculation of shadow direction with respect to transforms is improved so that the output matches lottie-web and lottie-ios.\r\n\r\nImage layers now cast shadows correctly thanks to a workaround to device-specific issues when combining `Paint.setShadowLayer()` and bitmap rendering.\r\n\r\nEven in non-`applyShadowsToLayers` mode, correctness is improved by allowing the shadow-to-be-applied to propagate in a similar way as alpha. This allows some amount of visual fidelity to be recovered for animations or environments where enabling `applyShadowsToLayers` is not possible.\r\n\r\nA number of issues that caused incorrect rendering in some other cases have been fixed.\r\n\r\n## Background\r\n\r\n### Drop shadows in Lottie\r\n\r\nLottie specifies drop shadows as a tuple of (angle, distance, radius, color, alpha), with each element being animatable.\r\n\r\nThe consensus behavior for the rendering of a layer with a drop shadow, which seems to be mostly respected in lottie-web and lottie-ios, seems to be:\r\n\r\n1. Evaluate the values at the current frame for angle (`theta`), distance (`d`), radius (`r`), color with alpha (`C`).\r\n2. Apply the layer transform and render the layer normally to a surface `So` (original layer).\r\n3. Copy `So` to new surface `Ss` (shadow).\r\n4. Apply a gaussian blur of radius `r\u0027 \u003d c * r` to `Ss`, where `c` is some platform-specific constant intended to normalize blur implementations between platforms. (Ours is 0.33, lottie-web\u0027s is 0.25; see https://github.com/airbnb/lottie-android/pull/2541).\r\n5. Tint `Ss` with the color and combine the alpha by applying the following for each pixel `P`: `P.rgb \u003d C.rgb * P.a; P.a \u003d C.a * P.a`.\r\n6. Now the shadow is ready on `Ss`, and needs to be drawn into its final position.\r\n7. Convert from polar coordinates `theta` and `d` into `dx` and `dy`, with the 0 position at 12 o\u0027clock: `dx \u003d d * cos(theta - pi/2); dy \u003d d*sin(theta - pi/2)`.\r\n8. Draw `Ss` onto `Si` (intermediate surface) with a translation of `(dx, dy)`.\r\n9. Draw `So` (original layer) onto `Si` with identity transform.\r\n10. Compose `Si` into the framebuffer using the layer\u0027s alpha and blend mode.\r\n\r\nSome non-obvious consequences of the definition above:\r\n- The angle, distance, and radius are relative to the layer post-transform, not pre-transform. That is, rotating the layer (via its transform) still keeps the same screen-space direction of the shadow, and scaling the layer (via its transform) still keeps the same screen-space shadow blur radius.\r\n- The drop shadow is not based on any derived outline, so a layer\u0027s drop shadow can be seen through its non-fully-opaque pixels. At the same time, reducing the alpha of a pixel in a layer reduces its alpha in the drop shadow.\r\n- A layer\u0027s shadow and the layer do not blend on top of each other on the final canvas in case the layer has a blend mode or alpha. Instead, the shadow and the layer are alpha-blended with each other, and the result is then composited onto the canvas.\r\n  - In case the layer has a normal blend mode, this is equivalent to alpha-blending the layer\u0027s shadow and then the shadow onto the canvas separately.\r\n\r\n### Drop shadows in lottie-android currently\r\n\r\nlottie-android\u0027s current implementation of drop shadows differs in important ways:\r\n1. **Shadows are applied per-shape.** This means that a case like a shape with both fill and stroke has incorrect shadows, since both the fill and the stroke render a separate shadow on top of each other.\r\n2. **Precomp layer shadows are ignored.** This means that a precomp cannot cause any of its child shapes to cast a shadow. This is a consequence of the current implementation of (1).\r\n3. **Image layers do not render correct shadows,** due to the minefield that is the support matrix (or in Android\u0027s case, a more apt name would be a support tensor) of Android\u0027s graphics stack - `setShadowLayer()` simply doesn\u0027t work for images consistently. (See the last image in https://github.com/airbnb/lottie-android/pull/2523#issue-2428578510.)\r\n\r\n## Contributions of this PR\r\n\r\nThis PR introduces the following improvements and additions.\r\n\r\n1. **Move the drop shadow model from individual content elements to layers,** and add some missing keypath callbacks. This is a prerequisite for handling drop shadows on a layer level.\r\n2. **An `OffscreenLayer` implementation,** which serves as an abstraction that can replace `canvas.saveLayer()` for off-screen rendering and composition onto the final bitmap, but with the important distinction that it can also handle drop shadows, and possibly use hardware-accelerated `RenderNode`s and `RenderEffects` where available.\r\n    - To use an `OffscreenLayer`, call its `.start()` method with a parent canvas and a `ComposeOp`, and draw on the *returned canvas.* Once finished, call `OffscreenLayer.finish()` to compose everything from the returned canvas to the parent canvas, applying alpha, blend mode, drop shadows, and color filters.\r\n    - `OffscreenLayer` makes a dynamic decision on what to use for rendering - a no-op, forward to `.saveLayer()`, a HW-accelerated `RenderNode`, or a software bitmap, depending on the requested `ComposeOp` and hardware/SDK support.\r\n    - The hope is that `OffscreenLayer` becomes a useful abstraction that can be extended to e.g. support hardware blurs, multiple drop shadows, or to support mattes in a hardware-accelerated fashion where possible. \r\n3. **The `applyShadowsToLayers` flag** which, by analogy to `applyOpacityToLayers`, turns on a more accurate mode that implements the drop shadow algorithm described above.\r\n    - `OffscreenLayer` is used to apply alpha if `applyOpacityToLayers` is enabled, and to apply shadows if `applyShadowsToLayers` is enabled. The cost is paid only once if both alpha and drop shadows are present on a layer.\r\n    - Not all `saveLayer()` calls in the code have been rewritten to use `OffscreenLayer` - the blast radius is minimized. `OffscreenLayer` is presently used only to apply alpha and drop shadows, and blend mode and color filters are still applied in `BaseLayer` using `saveLayer()` directly.\r\n4. **More accurate shadow transformations.** Previously, the angle and distance were pre-transform, and only the radius was post-transform (contrary to step (2) of the algorithm). We correct this to match other renderers.\r\n5. **More complete shadow handling even when `applyShadowsToLayers` is `false`:** we plumb the shadow through `.draw()` and `drawLayer()` calls similarly to alpha, and this allows us to render per-shape shadows on children of composition layers too.\r\n6. ***Workaround for drop shadows on image layers.**\r\n    - The workaround relies on `OffscreenLayer` as well, and image layers now render shadows properly in all cases.\r\n7. **Fixes to a few subtle issues** causing incorrect rendering in other cases. (will be marked using PR comments, I might have forgotten some)\r\n\r\n## Open questions\r\n\r\n* **Should `applyShadowsToLayers` be `true` by default?** Some codepaths, such as when rendering purely via software, can be slow if shadow-casting layers are exceedingly large. But, the performance is still acceptable, and in the vast majority of cases everything is quite snappy.\r\n* **Have I introduced any regressions?** The snapshot tests should answer this.\r\n* **How does this perform on older devices?** `applyShadowsToLayers` plus an old device should trigger the purely-software shadow rendering mode. Simulating this in condition manually yields accurate results, and the performance seems surprisingly good, but it\u0027s unclear what will happen on a lower-end phone. There\u0027s also always the possibility of some device subtlety being missed. I don\u0027t have access to an older Android device.\r\n\r\n## Testcases\r\n\r\nThese files now match between lottie-web and lottie-android:\r\n\r\n[drop_shadow_comparator.json](https://github.com/user-attachments/files/16997070/drop_shadow_comparator.json)\r\n\r\n[simple_shadow_casters_ll2.json](https://github.com/user-attachments/files/16997084/simple_shadow_casters_ll2.json)\r\n\r\nThe files from this earlier PR still all render the same: https://github.com/airbnb/lottie-android/pull/2523, with the exception of the fix for image layer bug, which fixes the rendering of the Map icon as mentioned in the comment of that PR.\r\n\r\nThis file has been used as a perf stress test with many \u003c255 opacity precomps, some stacked inside each other, that must all be blended separately: [precomp_opacity_killer.json](https://github.com/user-attachments/files/16997261/precomp_opacity_killer.json)"
    },
    {
      "commit": "e320c993c4ee501b488dadb0a6bfe64f91ce7404",
      "tree": "0502d2ce3a188cd6b61f8585f53879d8ed0ee0f1",
      "parents": [
        "b15f9bf26e68b794f8abc4286ab5c51d312bb3d5"
      ],
      "author": {
        "name": "alex-dorokhov",
        "email": "alex.dorokhov@gmail.com",
        "time": "Fri Oct 04 21:54:43 2024 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 04 14:54:43 2024 -0400"
      },
      "message": "Fix resolving key path for matte layers (#2544)\n\nThis PR adds the check for matte layer name before going deeper during key path resolution.\r\n\r\nWithout the fix the key path matches children inside the matte layer even though it should not, for example:\r\n\r\n\u0027layer_1.group_1.child_1\u0027 could match \u0027layer_1.**matte_1**.group_1.child_1\u0027\r\n\r\nWith the fix it is not possible anymore.\r\n\r\nCo-authored-by: Alexander Dorokhov \u003cdorokhov17@yandex-team.ru\u003e"
    },
    {
      "commit": "b15f9bf26e68b794f8abc4286ab5c51d312bb3d5",
      "tree": "d0966f3e28b3836bb5663e239adb2950ad6f6edf",
      "parents": [
        "626f08127c0a65a099cd9952fddfb2501813e627"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Sep 29 10:15:15 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 29 10:15:15 2024 -0700"
      },
      "message": "Add an option to not clear the network cache (#2559)\n\nFixes #2498"
    },
    {
      "commit": "626f08127c0a65a099cd9952fddfb2501813e627",
      "tree": "03dfc1dd0073ab86ffbdfc6947471493fb79d63f",
      "parents": [
        "5eb81c00292f470e92842e53cc1085dffdaff1b3"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Sep 29 09:35:28 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 29 09:35:28 2024 -0700"
      },
      "message": "Unify the parsing of generic input streams (#2558)\n\nFixes #2490"
    },
    {
      "commit": "5eb81c00292f470e92842e53cc1085dffdaff1b3",
      "tree": "7df45c2a17a6f3c6d15c4f60fe7e3055b75fe94f",
      "parents": [
        "b851583359b9892aa875171726bd2c8d0bbbce23"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Sep 29 00:06:12 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Sep 29 00:06:12 2024 -0700"
      },
      "message": "[Compose] Fix safe mode for Compose (#2557)\n\n"
    },
    {
      "commit": "b851583359b9892aa875171726bd2c8d0bbbce23",
      "tree": "69e034c52581bae067964113574df02290941a63",
      "parents": [
        "d00c63817b60369a38519944ddacd42b23d135f3"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sat Sep 28 22:53:47 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 28 22:53:47 2024 -0700"
      },
      "message": "Treat dotLottie files loaded as content provider URIs a zip files (#2556)\n\nFixes #2553"
    },
    {
      "commit": "d00c63817b60369a38519944ddacd42b23d135f3",
      "tree": "24952d660690169a44b51bf29f96261a89eeabd3",
      "parents": [
        "f3d84db5de0ee7aaeb937743add544058ff16e4f"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sat Sep 28 22:04:51 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Sep 28 22:04:51 2024 -0700"
      },
      "message": "[CI] Update actions/upload-artifact (#2555)\n\n"
    },
    {
      "commit": "f3d84db5de0ee7aaeb937743add544058ff16e4f",
      "tree": "0449dd0d8b634a4527f855cfe089d8ee23dbe0f8",
      "parents": [
        "18ed2107792631385c4d8ea3f9a0c2668c29339e"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Tue Sep 03 17:13:21 2024 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Tue Sep 03 17:13:21 2024 -0700"
      },
      "message": "v6.5.3-SNAPSHOT\n"
    },
    {
      "commit": "18ed2107792631385c4d8ea3f9a0c2668c29339e",
      "tree": "992ea81742a9004f49e9fed3431dbc8da491d096",
      "parents": [
        "453b43cbf0003ce182e37a72d9fc43b882d39187"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Tue Sep 03 17:11:19 2024 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Tue Sep 03 17:11:19 2024 -0700"
      },
      "message": "v6.5.2\n"
    },
    {
      "commit": "453b43cbf0003ce182e37a72d9fc43b882d39187",
      "tree": "c2ed6d86aeae2652641c404924bfdf60cc08d21f",
      "parents": [
        "0cf178cd53f7cc7cf03f2a65c13708ed15fe950a"
      ],
      "author": {
        "name": "Pranay Airan",
        "email": "pranay.airan@iiitb.net",
        "time": "Tue Sep 03 17:08:37 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 03 17:08:37 2024 -0700"
      },
      "message": "Adding null check for context before calling `Utils.getAnimationScale` (#2546)\n\nWhen calling reduce motion check we need to pass context, we read context in LottieDrawable using `getContext` method. getContext method can return a nullable context, since the code is in java we don\u0027t get any compile time error when passing the null context around. \r\n\r\nThis resulted in issue where we end up calling `getContentResolver` on a null object in case where context is null. https://github.com/airbnb/lottie-android/pull/2536\r\n\r\nThis PR fixes it by adding a null check before calling `Utils.getAnimationScale(context)`\r\n\r\nCo-authored-by: Pranay Airan \u003cpranay.airan@airbnb.com\u003e"
    },
    {
      "commit": "0cf178cd53f7cc7cf03f2a65c13708ed15fe950a",
      "tree": "ecfd945c855823a58421543d436486446239ee8f",
      "parents": [
        "66bc2fb515dfc0036da7e83d5b136a01b803b7c9"
      ],
      "author": {
        "name": "alex-dorokhov",
        "email": "alex.dorokhov@gmail.com",
        "time": "Sat Aug 31 01:25:50 2024 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 30 15:25:50 2024 -0700"
      },
      "message": "Fix SplitDimensionPathKeyframeAnimation value callbacks arguments (#2543)\n\nCo-authored-by: Alexander Dorokhov \u003cdorokhov17@yandex-team.ru\u003e"
    },
    {
      "commit": "66bc2fb515dfc0036da7e83d5b136a01b803b7c9",
      "tree": "f30f1baad1114527c2f32ce9fd11656dc67c643c",
      "parents": [
        "a1fb304f928be465ffcb344c3952cd47325ba48d"
      ],
      "author": {
        "name": "Pranay Airan",
        "email": "pranay.airan@iiitb.net",
        "time": "Fri Aug 30 11:58:42 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 30 11:58:42 2024 -0700"
      },
      "message": "[a11y] Adding reduce motion logic to LottieAnimation for compose usage (#2542)\n\nOur changes in https://github.com/airbnb/lottie-android/pull/2536 didn\u0027t work for `LottieAnimation` in compose. While LottieAnimation does use LottieDrawable, it has it\u0027s own animator and draws on canvas directly. \r\n\r\nThis PR addresses that issue by making some logic of reduce motion readable outside LottieDrawable and consuming that logic in `LottieAnimation` \r\n\r\nI tested this by adding a sample lottie file with reduce motion marker locally, see the attached video. \r\n\r\nhttps://github.com/user-attachments/assets/eb33333f-86b8-46fa-9bbb-82bff8a8c7fe\r\n\r\nCo-authored-by: Pranay Airan \u003cpranay.airan@airbnb.com\u003e"
    },
    {
      "commit": "a1fb304f928be465ffcb344c3952cd47325ba48d",
      "tree": "49dc3917856ac700a1ddb2199c38d48795a06e8b",
      "parents": [
        "8e902e028d7b77d0c47beff1dfa668126e028268"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Aug 28 10:38:50 2024 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Aug 28 10:38:50 2024 -0700"
      },
      "message": "v6.5.2-SNAPSHOT\n"
    },
    {
      "commit": "8e902e028d7b77d0c47beff1dfa668126e028268",
      "tree": "6ed1b4ed84d22e53a9095c3ae0a67c93f0b113d1",
      "parents": [
        "154c8f204f218c61b76240770b973af6257315ad"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Aug 28 10:37:48 2024 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Wed Aug 28 10:37:48 2024 -0700"
      },
      "message": "v6.5.1\n"
    },
    {
      "commit": "154c8f204f218c61b76240770b973af6257315ad",
      "tree": "ee0e10ec439248318f9aa032b7c9b301ac5361ff",
      "parents": [
        "6ffe9bb17a0509c4a578938aa2eb998c4851ecbc"
      ],
      "author": {
        "name": "alex-dorokhov",
        "email": "alex.dorokhov@gmail.com",
        "time": "Wed Aug 28 18:41:42 2024 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 28 08:41:42 2024 -0700"
      },
      "message": "Fix value callback is not called for PathKeyframeAnimation (#2540)\n\nCo-authored-by: Alexander Dorokhov \u003cdorokhov17@yandex-team.ru\u003e\r\n"
    },
    {
      "commit": "6ffe9bb17a0509c4a578938aa2eb998c4851ecbc",
      "tree": "3c515bbcdf234d17574f6e25bd7515964a1c5e71",
      "parents": [
        "78bf85a79dd91fec0152f8e29d299482fe688eed"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Wed Aug 28 07:39:58 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 28 07:39:58 2024 -0700"
      },
      "message": "Apply scaling factor to drop shadow softness (#2541)\n\nDirectly using the \"Softness\" value from the Lottie file (after accounting for dp and layer scaling) as the `radius` argument to `Paint.setShadowLayer()` results in shadows that are too soft. Since the underlying implementation calls into JNI code and is undocumented, we can only take a best guess as to how the After Effects softness value should be mapped to this argument. The [Lottie web implementation](https://github.com/airbnb/lottie-web/blob/master/player/js/elements/svgElements/effects/SVGDropShadowEffect.js#L63) multiplies the value by a constant factor of 0.25, so we take a similar approach here, using a value of 0.33 to achieve a close match to a reference image.\r\n\r\n\u003cimg width\u003d500 src\u003d\"https://github.com/user-attachments/assets/2d160061-77a0-43a2-945c-1d94d7422a2a\"\u003e"
    },
    {
      "commit": "78bf85a79dd91fec0152f8e29d299482fe688eed",
      "tree": "7edea889fabf622639f433a7b917441b0271c313",
      "parents": [
        "733999b4241a6cb084d0da970a8ba0fe99943099"
      ],
      "author": {
        "name": "DemoYeti",
        "email": "164791169+DemoYeti@users.noreply.github.com",
        "time": "Thu Aug 22 11:08:57 2024 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 22 16:08:57 2024 +0100"
      },
      "message": "Fix build status badge (#2538)\n\n"
    },
    {
      "commit": "733999b4241a6cb084d0da970a8ba0fe99943099",
      "tree": "8a607cb92cf5738072ef8e91ca9bf5010d2aca75",
      "parents": [
        "f32822269f2ba92e134c1949b8883527f1056f6c"
      ],
      "author": {
        "name": "Pranay Airan",
        "email": "pranay.airan@iiitb.net",
        "time": "Wed Aug 21 08:02:18 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 21 16:02:18 2024 +0100"
      },
      "message": "[a11y] Changing logic of how reduce motion options are set to match it with lottie iOS (#2536)\n\nThis PR introduces a new way to determine if reduce motion is enabled or not. It matches iOS Lottie API airbnb/lottie-ios#2110.\r\n\r\nThis change provides the ability for apps integrating Lottie to have custom reduce motion behavior which doesn\u0027t need to rely solely on system settings.\r\n\r\nThis change also allows reduce motion to work regardless of usage of LottieAnimationView, LottieAnimation in compose or straight LottieDrawable.\r\n\r\nTesting\r\n\r\nVerified that the default ReducedMotionOptionProvider is correctly used when none is provided.\r\nEnsured that custom implementations of ReducedMotionOption can be set and used.\r\nUpdated existing test for LottieDrawable reduce motion.\r\n\r\nCo-authored-by: Pranay Airan \u003cpranay.airan@airbnb.com\u003e\r\n"
    },
    {
      "commit": "f32822269f2ba92e134c1949b8883527f1056f6c",
      "tree": "7da57d6253912525e5c9ad40241d8d23ac5cc2f6",
      "parents": [
        "5a715162dfb2d86d7a233ceaca75998a418cdb2d"
      ],
      "author": {
        "name": "Corey Wu",
        "email": "coreywu0@gmail.com",
        "time": "Tue Aug 06 14:07:39 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 06 14:07:39 2024 -0700"
      },
      "message": "Fix NPE in ImageAssetManager#hasSameContext (#2503) (#2532)\n\nCo-authored-by: Corey Wu \u003ccoreywu@meta.com\u003e"
    },
    {
      "commit": "5a715162dfb2d86d7a233ceaca75998a418cdb2d",
      "tree": "67cb599b98c1a1f06534c6ad7beee79391d509f0",
      "parents": [
        "1ffaac83dbfca57d197ce849742a72c2c6e09fdc"
      ],
      "author": {
        "name": "Mirko",
        "email": "mirko.volkers@wearetriple.com",
        "time": "Tue Aug 06 03:03:29 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 05 18:03:29 2024 -0700"
      },
      "message": "Apply transformation for the stroke on the canvas so the skew is also… (#2531)\n\nI noticed that the Android implementation had trouble with applying a skew on a stroke, so this attempts to fix that issue.\r\n\r\nThe issue was that since the transformation was applied to the path, it didn’t take any properties from the paint into consideration. As a result, the skew was not applied to the width of the line. By applying the transformation on the canvas, this issue is resolved.\r\n\r\nExample Lottie which wasn’t rendered correctly (should have skewed lines):\r\n[Skewed-Stroke.json](https://github.com/user-attachments/files/16495718/Skewed-Stroke.json)\r\n\r\nCo-authored-by: Mirko \u003cm.volkers@wearetriple.com\u003e"
    },
    {
      "commit": "1ffaac83dbfca57d197ce849742a72c2c6e09fdc",
      "tree": "639cc4aba8a0146eb7198680c2c033cf1cb496dc",
      "parents": [
        "a52e6d0adee68f9f90fcb512c86afc29dab3a9ff"
      ],
      "author": {
        "name": "Niklas Baudy",
        "email": "niklas.baudy@vanniktech.de",
        "time": "Mon Aug 05 22:48:12 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 05 13:48:12 2024 -0700"
      },
      "message": "LottieCompositionFactory: Avoid NPE when animation contains a Font Family and Context is null. (#2530)\n\n"
    },
    {
      "commit": "a52e6d0adee68f9f90fcb512c86afc29dab3a9ff",
      "tree": "78c4dacd43dfed840db36fa849a6bc5a0aacfdc2",
      "parents": [
        "6b70fcd3ed0d5639e34ba68330954d3a9d5d47a5"
      ],
      "author": {
        "name": "Niklas Baudy",
        "email": "niklas.baudy@vanniktech.de",
        "time": "Mon Aug 05 20:44:17 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 05 11:44:17 2024 -0700"
      },
      "message": "LottieCompositionFactory: Add factory methods that take an okio Source. (#2527)\n\n"
    },
    {
      "commit": "6b70fcd3ed0d5639e34ba68330954d3a9d5d47a5",
      "tree": "223370ba2e29409f992fb77d6c02a11f35f5cc49",
      "parents": [
        "3badc2aba531f0dbb956ec918341fed3ca69414f"
      ],
      "author": {
        "name": "Niklas Baudy",
        "email": "niklas.baudy@vanniktech.de",
        "time": "Mon Aug 05 20:43:50 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 05 11:43:50 2024 -0700"
      },
      "message": "LottieCompositionFactory: Reduce Source -\u003e InputStream -\u003e Source conversion. (#2529)\n\nfromJsonInputStreamSync() would just convert the InputStream back into a Source."
    },
    {
      "commit": "3badc2aba531f0dbb956ec918341fed3ca69414f",
      "tree": "3e3041d6e062a9df169d6e038e9fbfff8127763e",
      "parents": [
        "1f77b78075bbbb7972af4c86cd4155a265d073d4"
      ],
      "author": {
        "name": "Niklas Baudy",
        "email": "niklas.baudy@vanniktech.de",
        "time": "Mon Aug 05 20:43:27 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 05 11:43:27 2024 -0700"
      },
      "message": "LottieCompositionFactory#fromZipStreamSyncInternal close FileOutputStream. (#2528)\n\n"
    },
    {
      "commit": "1f77b78075bbbb7972af4c86cd4155a265d073d4",
      "tree": "410d65440b5880158a9068eb2920114efbce37ec",
      "parents": [
        "f48fcdb53b483cfa8bde341367dd925e7eebd556"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Aug 04 01:01:33 2024 -0400"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Aug 04 01:01:33 2024 -0400"
      },
      "message": "Update versionCode\n"
    },
    {
      "commit": "f48fcdb53b483cfa8bde341367dd925e7eebd556",
      "tree": "d97f43c2e0c5c19f47dbbb1cbc78f8badf92fe37",
      "parents": [
        "892fd9e8b9129d0ce708b09734e2b346bf759123"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Aug 04 00:14:38 2024 -0400"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Aug 04 00:14:38 2024 -0400"
      },
      "message": "v6.5.1-SNAPSHOT\n"
    },
    {
      "commit": "892fd9e8b9129d0ce708b09734e2b346bf759123",
      "tree": "59a3f20c36a93fc5fd8c1c8a30f4b8c7a85b6c93",
      "parents": [
        "33d7e1ca59f8c17d7b3cd17af14a6f68c181c2ab"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sat Aug 03 23:57:01 2024 -0400"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sat Aug 03 23:57:01 2024 -0400"
      },
      "message": "v6.5.0\n"
    },
    {
      "commit": "33d7e1ca59f8c17d7b3cd17af14a6f68c181c2ab",
      "tree": "16fa862f235359d91fb78752f88956faa561ccb8",
      "parents": [
        "3f39884cb0d0dddd86673b3826aad6fa508416ab"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Sat Aug 03 20:23:19 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 03 23:23:19 2024 -0400"
      },
      "message": "Improve drop shadow effect accuracy (#2523)\n\nThese changes make several improvements to how drop shadow effects are displayed:\r\n- Drop shadows now take parent alpha into account. This means that if a layer or fill has an animated opacity, the drop shadow will multiply that opacity with its own.\r\n- Adds drop shadow support to Image layers. There are some visual bugs with how the shadows are rendered, however.\r\n- Applies a constant scale factor to the distance and softness values from the Lottie file before passing them to `Paint.setShadowLayer()` to more closely match how they are displayed in After Effects. See https://github.com/airbnb/lottie-ios/pull/2175 for similar changes on iOS.\r\n- Adds three snapshot test files for distance, softness, and alpha validation.\r\n\r\nDistance test file:\r\n\u003cimg src\u003d\"https://github.com/user-attachments/assets/aa559e60-0d8f-403b-acd0-fa571d6dcff5\" width\u003d400\u003e\r\n\r\nSoftness test file:\r\n\u003cimg src\u003d\"https://github.com/user-attachments/assets/faa9819f-6584-49f5-91b7-7462213044f5\" width\u003d400\u003e\r\n\r\nExample of Image layer shadow bug, right side is how it should look (capture from After Effects):\r\n\u003cimg width\u003d\"1824\" alt\u003d\"image\" src\u003d\"https://github.com/user-attachments/assets/a3fb85c3-a5d1-4a6b-bbda-ff4e5ebd2fb5\"\u003e\r\n\r\nCo-authored-by: Gabriel Peal \u003cgabriel@gpeal.com\u003e"
    },
    {
      "commit": "3f39884cb0d0dddd86673b3826aad6fa508416ab",
      "tree": "d715a6848b063185531a9de657eeb4b4c1429e09",
      "parents": [
        "71c1622ae3c145e5afaf6bbdd0a2edd274f49864"
      ],
      "author": {
        "name": "Niklas Baudy",
        "email": "niklas.baudy@vanniktech.de",
        "time": "Thu Aug 01 20:50:21 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 01 14:50:21 2024 -0400"
      },
      "message": "LottieComposition: Add getUnscaledHeight \u0026 getUnscaledWidth functions. (#2514)\n\nUse case: I just want to know the unscaled original height / width of the LottieAnimation. I want to do my own scaling by calculating for instance given an aspect ratio or weighted settings, how big/small I can stretch the animation."
    },
    {
      "commit": "71c1622ae3c145e5afaf6bbdd0a2edd274f49864",
      "tree": "d547a77e6b30659da0e376f0804cc63fa773db83",
      "parents": [
        "328fc724a64ead26f13ccb97d1ce6075b6fee173"
      ],
      "author": {
        "name": "Allen Chen",
        "email": "allenchen1154@gmail.com",
        "time": "Wed Jul 24 15:30:02 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 24 15:30:02 2024 -0700"
      },
      "message": "Add support for text range selectors (#2518)\n\nThis adds support for the [text range selector](https://lottiefiles.github.io/lottie-docs/text/#text-range-selector) type, which allows a [text style](https://lottiefiles.github.io/lottie-docs/text/#text-style) to be applied to a certain range of the text, defined by a start, end, and offset.\r\n\r\nThe text range selector implementation currently has the following limitations:\r\n- Only text layers drawn using a Font are supported. Adding support for the glyph draw path may be possible, but I don\u0027t have a sample Lottie file.\r\n- Only one text range is currently supported per text layer, as the parser [drops all other entries in the array](https://github.com/airbnb/lottie-android/blob/c4cb2254eca3c70199f1de5e39e3872c8c42e473/lottie/src/main/java/com/airbnb/lottie/parser/LayerParser.java#L194-L196).\r\n- Only index-based ranges are supported - percentage-based ranges are also allowed in the spec.\r\n- Only ranges based on characters are supported. The [spec](https://lottiefiles.github.io/lottie-docs/constants/#text-based) allows characters, characters excluding spaces, words, and lines.\r\n- Other options like easing (allows styling characters that are partially inside the range), randomize, and [shape](https://lottiefiles.github.io/lottie-docs/constants/#text-shape) of the range are not currently supported.\r\n\r\nThis also adds support for the opacity as an animatable text property which is applied multiplicatively with the transform opacity and the parent\u0027s alpha.\r\n\r\nPartially addresses https://github.com/airbnb/lottie-android/issues/485.\r\n\r\n\r\nhttps://github.com/user-attachments/assets/bcfad060-482d-48d9-a578-297c4f143ba9\r\n\r\n\r\nhttps://github.com/user-attachments/assets/211dc574-5ea1-4fa3-9f78-f87ee104ce85\r\n\r\nCo-authored-by: Allen Chen \u003callen.chen@airbnb.com\u003e"
    },
    {
      "commit": "328fc724a64ead26f13ccb97d1ce6075b6fee173",
      "tree": "ca2525f675add7b5bd1367156a513a8c126c44ec",
      "parents": [
        "c4cb2254eca3c70199f1de5e39e3872c8c42e473"
      ],
      "author": {
        "name": "David Davidović",
        "email": "david@davidovic.io",
        "time": "Thu Jul 25 00:26:41 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 24 15:26:41 2024 -0700"
      },
      "message": "Apply blend modes on layer level and add Multiply blend mode (#2519)\n\nThis commit improves blend mode support in lottie-android in two ways:\r\n* Applying blend modes on layer-level, instead of fill level\r\n* Adding support for the Multiply blend mode\r\n\r\n## Applying blend modes on layer level\r\n\r\nThe Lottie format defines blend modes as attributes on a layer. However, lottie-android is presently applying the layer blend modes on a solid color fill only. Notably, this causes any stroked or gradient-filled shapes or image layers to blend incorrectly, such as in this file:\r\n\r\n[stroke-blending-test.json](https://github.com/user-attachments/files/16346206/stroke-blending-test.json)\r\n\r\n(The file contains a filled + stroked shape that renders as a pink square on other platforms, but renders with a visible stroke on lottie-android since its blend mode is applied only on the fill.)\r\n\r\nInstead, we move this decision to `BaseLayer` by analogy to transparent layer handling, which is closer to how the format specifies the property and fixes these cases.\r\n\r\n## Multiply support\r\n\r\n`BlendModeCompat` is designed to resolve to either a `BlendMode` (added in Android Q, supporting most modern blend modes) or `PorterDuff.Mode` (always available, but a smaller choice of modes as it is mostly focused on alpha compositing).\r\n\r\nWe use `BlendModeCompat` to support Lottie layer blend modes (`bm` key) to ensure compatibility on all platforms. For consistency, we don\u0027t  support values which don\u0027t have a `PorterDuff.Mode` equivalent.\r\n\r\nOur support for Lottie blend modes did not include Multiply due to a slightly different behavior between the `PorterDuff.MULTIPLY` (exposed as `BlendModeCompat.MODULATE`) and `BlendModeCompat.MULTIPLY` variants. Namely, the formula used for `PorterDuff.MODULATE`, combined with alpha-premultiplication done by Skia, means that a layer with an alpha \u003c 1.0 and multiply blend mode will also darken the destination:\r\n\r\n![Incorrect-Blend](https://github.com/user-attachments/assets/6a2113ef-4bac-4bbc-830b-1353adf4ee2b)\r\n\r\n(Multiply-blended layers with \u003c 1.0 alpha on the left, Screen-blended layers with \u003c 1.0 alpha on the right)\r\n\r\nHowever, what we can do instead is clear the canvas with a solid white color instead of transparent before drawing the layer\u0027s contents as normal. When blending the resulting bitmap over an opaque background using `PorterDuff.MULTIPLY` (i.e. `BlendModeCompat.MODULATE`), the end result will be as if we had used `BlendModeCompat.MULTIPLY`, since all-1.0 (white) is a multiplication identity:\r\n\r\n![Correct-Blend](https://github.com/user-attachments/assets/126022ef-6e47-48ee-b803-1d9800ca2c75)\r\n\r\nThis PR implements the latter solution and adds a consistent support for the Multiply blend mode for all Android versions.\r\n\r\n*Test file used:*  [blendmode-tests-multiply+screen+bg.zip](https://github.com/user-attachments/files/16365843/blendmode-tests-multiply%2Bscreen%2Bbg.zip)"
    },
    {
      "commit": "c4cb2254eca3c70199f1de5e39e3872c8c42e473",
      "tree": "3ec1f461b553e24afbd475868756bab137dc878d",
      "parents": [
        "99b06837c8710c5f99fdf4a2868e33856b66c91d"
      ],
      "author": {
        "name": "Jorge Betancourt",
        "email": "jmbetancourt@google.com",
        "time": "Wed Jul 03 16:36:48 2024 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 03 13:36:48 2024 -0700"
      },
      "message": "Add generalized Lottie Feature Flags API (#2512)\n\nCurrently there are individual methods for enabling and disabling Merge Paths in Lottie. This PR aims to generalize these functions as we consider adding more features guarded behind opt-in flags."
    },
    {
      "commit": "99b06837c8710c5f99fdf4a2868e33856b66c91d",
      "tree": "0187750bccc3b656aa9ee3f7699f432ae543ceed",
      "parents": [
        "fb64a7fa4a4b5943d0d4ac2624bd1c427203d93e"
      ],
      "author": {
        "name": "DevUni",
        "email": "57653092+Dev-SoUni@users.noreply.github.com",
        "time": "Wed Jun 05 01:27:07 2024 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 04 09:27:07 2024 -0700"
      },
      "message": "fix: correct typo in RELEASE.md (#2509)\n\n"
    },
    {
      "commit": "fb64a7fa4a4b5943d0d4ac2624bd1c427203d93e",
      "tree": "d1445022d30c236be1fbcc0399a868d043caf457",
      "parents": [
        "d863d9271aec94bcea928b255b2de52b5b08075e"
      ],
      "author": {
        "name": "John Rodriguez",
        "email": "john.rodriguez@gmail.com",
        "time": "Wed May 29 20:41:42 2024 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 29 11:41:42 2024 -0700"
      },
      "message": "Treat appcompat as an api dependency (#2507)\n\nLottieAnimationView extends AppCompatImageView, therefore the latter is part of the former\u0027s ABI."
    },
    {
      "commit": "d863d9271aec94bcea928b255b2de52b5b08075e",
      "tree": "d91dd2c939c1db34f5da040688697dd54f7a9a1f",
      "parents": [
        "373bf3e7f4920c1e8dc69e15ea0518b94ddcd619"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun May 26 19:38:33 2024 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun May 26 19:38:33 2024 -0700"
      },
      "message": "v6.4.2-SNAPSHOT\n"
    },
    {
      "commit": "373bf3e7f4920c1e8dc69e15ea0518b94ddcd619",
      "tree": "0e7dcd90e7ea9e1676b183aeae0be45d70bd278a",
      "parents": [
        "13bed129980592cfaeda65527ece613ac3f0e2ef"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun May 26 19:37:57 2024 -0700"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun May 26 19:37:57 2024 -0700"
      },
      "message": "v6.4.1\n"
    },
    {
      "commit": "13bed129980592cfaeda65527ece613ac3f0e2ef",
      "tree": "48b1522e804f3b08d41b9e3900d084bc124e03e2",
      "parents": [
        "aebf9bc07bc54979633f3355ada3d3e6e12986a3"
      ],
      "author": {
        "name": "Nguyen Huy Nghia",
        "email": "nghianh@hblab.vn",
        "time": "Tue May 14 21:53:09 2024 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 14 10:53:09 2024 -0400"
      },
      "message": "Fix base64 image asset not fit container\u0027s size (#2501)\n\nCurrently, I am encountering a similar issue to [#1200](https://github.com/airbnb/lottie-android/issues/1200), but in the case where the asset is a base64 image, it has not been fixed yet."
    },
    {
      "commit": "aebf9bc07bc54979633f3355ada3d3e6e12986a3",
      "tree": "d84b92ed78c34db443b58dbf7775a0e8f8840439",
      "parents": [
        "4e1c3dce12039934c006b8f423ecf6dd68f2d178"
      ],
      "author": {
        "name": "Suzan MacGyver",
        "email": "super_luo@163.com",
        "time": "Sun Apr 14 06:53:25 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 13 15:53:25 2024 -0700"
      },
      "message": "Prevent trace strings from getting created when tracing is disabled\n\nFixes #2493 \r\n\r\nCo-authored-by: chaoluo10 \u003cchaoluo10@iflytek.com\u003e"
    },
    {
      "commit": "4e1c3dce12039934c006b8f423ecf6dd68f2d178",
      "tree": "12955734bd86d1cdf3ce2c6b7c0bb911cbcd4f76",
      "parents": [
        "6c6e5ff71ffdc46c920348a573dc3ce6bbe25f59"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Mon Apr 01 16:56:53 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 01 16:56:53 2024 -0700"
      },
      "message": "Allow missing end values for integer animations (#2487)\n\nFixes #2480"
    },
    {
      "commit": "6c6e5ff71ffdc46c920348a573dc3ce6bbe25f59",
      "tree": "d6d26b3f48209c495e3dff59d67c848701d07647",
      "parents": [
        "b7b536100c3cb4860b39963703089c5692cd27bc"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Mon Apr 01 16:56:40 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 01 16:56:40 2024 -0700"
      },
      "message": "Add an additional null check in BaseKeyframeAnimation (#2486)\n\nFixes #2483"
    },
    {
      "commit": "b7b536100c3cb4860b39963703089c5692cd27bc",
      "tree": "76dc7acc06dafe0bd7bf50f99eddbd8def4113a6",
      "parents": [
        "c4a0bc1416cc57c30fe88be13c6131ddeb62f34a"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Mon Apr 01 16:56:24 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 01 16:56:24 2024 -0700"
      },
      "message": "Add support for tgs files in Compose (#2488)\n\nFixes https://github.com/airbnb/lottie-android/issues/2477"
    },
    {
      "commit": "c4a0bc1416cc57c30fe88be13c6131ddeb62f34a",
      "tree": "95d2581f4cba850e1e3108f071a19c1a90cc8e1a",
      "parents": [
        "ae041af0f010523b5df68a5e6a8e3e5043f2054f"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Mon Apr 01 16:18:18 2024 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 01 16:18:18 2024 -0700"
      },
      "message": "Fix Let\u0027s Encrypt TLS on old API versions (#2489)\n\n"
    },
    {
      "commit": "ae041af0f010523b5df68a5e6a8e3e5043f2054f",
      "tree": "a30b0f9d94d992e87ca8e168666519f164c4e6c8",
      "parents": [
        "5cdf12f4e8817a4e4932d0ca3985f72fc68bf89f"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Mar 03 19:38:42 2024 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Mar 03 19:38:42 2024 -0800"
      },
      "message": "v6.4.1-SNAPSHOT\n"
    },
    {
      "commit": "5cdf12f4e8817a4e4932d0ca3985f72fc68bf89f",
      "tree": "4867894a494f5f574942e93d0456927ba042fab1",
      "parents": [
        "e6425bc6c0bf4d4791a59e8b42de9cbae2c0d8ce"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Mar 03 19:33:55 2024 -0800"
      },
      "committer": {
        "name": "Gabriel Peal",
        "email": "gabriel@gpeal.com",
        "time": "Sun Mar 03 19:33:55 2024 -0800"
      },
      "message": "v6.4.0\n"
    },
    {
      "commit": "e6425bc6c0bf4d4791a59e8b42de9cbae2c0d8ce",
      "tree": "72feaccd61ddd715c2334058cdb307ddd2ffbaaf",
      "parents": [
        "7340d68dd808bc1c940be18af30668df8826a283"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Mar 03 18:06:30 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 03 18:06:30 2024 -0800"
      },
      "message": "[Sample] Replace direct Lottiefiles integration with a link to their app instead (#2476)\n\nSince the launch of the sample app, it would hit the Lottiefiles API and show example animations. However, over time, this sample app would periodically break when they changed their API and they also now have their own app. Instead of maintaining the direct integration, the sample app will now provide a link to theirs instead"
    },
    {
      "commit": "7340d68dd808bc1c940be18af30668df8826a283",
      "tree": "9dd26d321cf72cf8c776fd98462b37e9fcae3054",
      "parents": [
        "4530351f8bd394c6c2f66d04baefceb4f4a12400"
      ],
      "author": {
        "name": "Gabriel Peal",
        "email": "gpeal@users.noreply.github.com",
        "time": "Sun Mar 03 16:17:06 2024 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 03 16:17:06 2024 -0800"
      },
      "message": "Fix image scaling when the display scale changes (#2475)\n\n"
    }
  ],
  "next": "4530351f8bd394c6c2f66d04baefceb4f4a12400"
}
