Skip to content

Conversation

nope3472
Copy link
Contributor

@nope3472 nope3472 commented Jul 23, 2025

Fixes #641

Changes

  • Added seamless, classic Pacman animation with mouth and block destruction effect, including proper reset and state handling for smooth looping and transfer to the badge.
  • Unified animation selection and transfer logic for all custom and standard animations, improving maintainability and user experience.
  • Automatically switch to text animation mode when typing text, preserving text-based animations’ original speed mapping.
  • Updated the animation selection UI to display all animations in rows of three, using relevant icons for custom animations without assets.
  • Fixed animation state persistence and ensured all custom animations start fresh when reselected.
  • Improved the Pacman animation transfer so the last frame is always clean, preventing visual glitches at the end of the animation on the badge.

Screenshots / Recordings

20250723_194217
20250723_193751

20250723_195101

N/A

Checklist:

  • No hard coding: I have used resources from constants.dart without hard coding any value.
  • No end of file edits: No modifications done at end of resource files.
  • Code reformatting: I have reformatted code and fixed indentation in every file included in this pull request.
  • Code analyzation: My code passes analyses run in flutter analyze and tests run in flutter test.

Summary by Sourcery

Introduce four new custom badge animations (Pacman, Chevron, Diamond, Broken Hearts) with seamless looping, state reset, and dedicated transfer routines, unify animation selection and transfer logic, update the animation UI to display custom animations with icons in a 3-column grid, and improve text animation handling by auto-switching modes on typing.

New Features:

  • Add Pacman, Chevron, Diamond, and Broken Hearts custom animations with dedicated badge transfer functions
  • Extend AnimationBadgeProvider.handleAnimationTransfer to route transfers to custom animation routines
  • Update the animation tab UI to display custom animations with relevant icons arranged in rows of three

Bug Fixes:

  • Fix Pacman end-of-animation glitch by adding a clean final frame and ensuring proper state reset

Enhancements:

  • Unify animation selection and transfer logic across all custom and standard animations
  • Automatically switch to text animation mode when typing to preserve original speed mapping
  • Reset animation state on reselection for smooth looping

Copy link
Contributor

sourcery-ai bot commented Jul 23, 2025

Reviewer's Guide

Introduces four new badge animations (Pacman, Chevron, Diamond, Broken Hearts) with frame‐by‐frame transfer functions, refactors and unifies animation transfer logic in providers, updates UI to support new animations in a 3-per-row grid with icons, and improves speed mapping, state reset, and mouth-closing final frame for smooth looping.

Sequence diagram for unified animation transfer logic

sequenceDiagram
    actor User
    participant HomeScreen
    participant AnimationBadgeProvider
    participant BadgeMessageProvider
    participant Badge
    User->>HomeScreen: Tap 'Transfer' button
    HomeScreen->>AnimationBadgeProvider: handleAnimationTransfer(...)
    alt Special animation (Pacman, Chevron, Diamond, Broken Hearts)
        AnimationBadgeProvider->>BadgeMessageProvider: transfer[Animation]Animation(...)
        BadgeMessageProvider->>Badge: transferData(...)
    else Standard animation
        AnimationBadgeProvider->>BadgeMessageProvider: checkAndTransfer(...)
        BadgeMessageProvider->>Badge: transferData(...)
    end
Loading

Class diagram for new and updated animation classes

classDiagram
    class BadgeAnimation {
        <<abstract>>
        +processAnimation(badgeHeight, badgeWidth, animationIndex, processGrid, canvas)
    }
    class PacmanClassicAnimation {
        +processAnimation(...)
    }
    class LeftChevronAnimation {
        +processAnimation(...)
    }
    class DiamondAnimation {
        +processAnimation(...)
    }
    class BrokenHeartsAnimation {
        +processAnimation(...)
    }
    BadgeAnimation <|-- PacmanClassicAnimation
    BadgeAnimation <|-- LeftChevronAnimation
    BadgeAnimation <|-- DiamondAnimation
    BadgeAnimation <|-- BrokenHeartsAnimation
Loading

Class diagram for updated AnimationBadgeProvider and transfer logic

classDiagram
    class AnimationBadgeProvider {
        - int? _animationIndex
        - int _animationSpeed
        - Timer? _timer
        + bool isSpecialAnimationSelected()
        + void resetToTextAnimation()
        + void calculateDuration(int speed)
        + Future<void> handleAnimationTransfer(...)
    }
    class BadgeMessageProvider {
        + Future<void> checkAndTransfer(...)
        + Future<void> transferData(...)
        + Future<Data> generateData(...)
    }
    class SpeedDialProvider
    class InlineImageProvider
    AnimationBadgeProvider --> BadgeMessageProvider : uses
    AnimationBadgeProvider --> SpeedDialProvider : uses
    AnimationBadgeProvider --> InlineImageProvider : uses
Loading

File-Level Changes

Change Details Files
Extended BadgeMessageProvider with custom animation transfer routines
  • Expanded modeValueMap and speedMap with new animation entries
  • Modified checkAndTransfer signature and logic to support text mode switch
  • Added transferPacmanAnimation, transferChevronAnimation, transferDiamondAnimation, transferBrokenHeartsAnimation functions
  • Moved common helpers (boolToIntBitmap, _drawDestroyEffect) into provider
lib/providers/badge_message_provider.dart
Enhanced AnimationBadgeProvider for custom animations and unified dispatch
  • Imported and registered new BadgeAnimation subclasses in animationMap
  • Added isSpecialAnimationSelected and resetToTextAnimation helpers
  • Updated calculateDuration to differentiate speed mapping for standard vs custom animations
  • Introduced handleAnimationTransfer to route based on selected index
lib/providers/animation_badge_provider.dart
Updated UI for animation selection and transfer flow
  • Reorganized AnimationTab rows to show all animations in groups of three with icons for custom ones
  • Extended AniContainer to accept icons and conditionally render asset or icon
  • Modified HomeScreen _controllerListener to auto-switch off special animations when typing
  • Changed Transfer button to invoke animationProvider.handleAnimationTransfer
lib/view/widgets/homescreentabs.dart
lib/view/widgets/animation_container.dart
lib/view/homescreen.dart
Added new animation assets and mode/speed constants
  • Declared constants for Pacman, Chevron, Diamond, Broken Hearts in constants.dart
  • Adjusted aniBaseSpeed formula and minimum speed clamp
  • Extended Mode enum with pacman, chevronleft, diamond entries
lib/constants.dart
lib/bademagic_module/models/mode.dart
Introduced new BadgeAnimation subclasses
  • Implemented PacmanClassicAnimation with mouth, block destruction, final clean frame
  • Added LeftChevronAnimation to draw packed chevrons
  • Created DiamondAnimation with seamless spawn and outline logic
  • Built BrokenHeartsAnimation carving and falling clusters
lib/badge_animation/ani_pacman.dart
lib/badge_animation/ani_chevron_left.dart
lib/badge_animation/ani_diamond.dart
lib/badge_animation/ani_broken_hearts.dart

Assessment against linked issues

Issue Objective Addressed Explanation
#641 Implement a set of example animations (PacMan, Broken Heart, Diagonals, Diamonds, Cupid, Feet, Fireworks, Fish, Two Hearts, Emergency, Left Arrow) that can be transferred to the badge.
#641 Integrate these animations into the UI so that users can select and transfer them to the badge.

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @nope3472 - I've reviewed your changes - here's some feedback:

  • BadgeMessageProvider has grown very large with animation-specific transfer code — consider moving each animation's frame generation into its own class or helper (e.g. reuse BadgeAnimation implementations) to keep the provider focused on transfer logic
  • You have duplicated bitmap drawing routines (_drawFilledCircle, _drawPacman, boolToIntBitmap, _drawDestroyEffect) across files — extract these into shared utilities to reduce code duplication and ease maintenance
  • The Broken Hearts animation uses index 12 but there’s no modeValueMap or Mode enum entry for 12 — add a mapping (and enum) or otherwise handle index 12 to avoid null lookups during transfer
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- BadgeMessageProvider has grown very large with animation-specific transfer code — consider moving each animation's frame generation into its own class or helper (e.g. reuse BadgeAnimation implementations) to keep the provider focused on transfer logic
- You have duplicated bitmap drawing routines (_drawFilledCircle, _drawPacman, boolToIntBitmap, _drawDestroyEffect) across files — extract these into shared utilities to reduce code duplication and ease maintenance
- The Broken Hearts animation uses index 12 but there’s no modeValueMap or Mode enum entry for 12 — add a mapping (and enum) or otherwise handle index 12 to avoid null lookups during transfer

## Individual Comments

### Comment 1
<location> `lib/providers/badge_message_provider.dart:123` </location>
<code_context>
+      Data data;
+      if (jsonData != null) {
+        data = fileHelper.jsonToData(jsonData);
+        if (isSavedBadge && data.messages.isNotEmpty) {
+          final old = data.messages[0];
+          final newMessage = Message(
+            text: old.text, // use the already-padded hex string
+            flash: old.flash,
+            marquee: old.marquee,
+            speed: old.speed,
+            mode: Mode.animation, // Force seamless marquee
+          );
+          data = Data(messages: [newMessage, ...data.messages.skip(1)]);
</code_context>

<issue_to_address>
Forcing Mode.animation for saved badges may not always be appropriate.

Currently, loading a saved badge always sets the first message's mode to Mode.animation, which may not reflect the user's original choice. Please consider making this behavior conditional based on the saved mode or user intent.
</issue_to_address>

### Comment 2
<location> `lib/providers/badge_message_provider.dart:415` </location>
<code_context>
+  const int badgeHeight = 11;
+  const int badgeWidth = 44;
+  const int spawnInterval = 4; // frames between new diamonds
+  final Speed selectedSpeed = Speed.eight; // Use max speed
+  final logger = Logger();
+  logger.i(
</code_context>

<issue_to_address>
Hardcoding Speed.eight for diamond and broken hearts animations.

Diamond and broken hearts animations override the user-selected speed by always using Speed.eight. Please confirm if this is intentional or if user-configurable speed should be supported here as with other animations.
</issue_to_address>

### Comment 3
<location> `lib/providers/badge_message_provider.dart:593` </location>
<code_context>
+        mouthDirection, badgeWidth, badgeHeight);
+  }
+
+  void _drawFilledCircle(
+      List<List<bool>> canvas, int cx, int cy, int radius, int w, int h) {
+    for (int y = -radius; y <= radius; y++) {
</code_context>

<issue_to_address>
Helper drawing functions are duplicated in animation and provider files.

Consider moving these helper functions to a shared utility to reduce duplication and maintain consistency.

Suggested implementation:

```
import 'package:your_project/utils/drawing_utils.dart';

// (Remove the local _drawFilledCircle implementation.)
// Now use drawFilledCircle from the shared utility wherever _drawFilledCircle was used.

```

1. Create a new file at `lib/utils/drawing_utils.dart` with the following content:

```dart
void drawFilledCircle(
    List<List<int>> canvas, int cx, int cy, int radius, int w, int h) {
  for (int y = -radius; y <= radius; y++) {
    for (int x = -radius; x <= radius; x++) {
      if (x * x + y * y <= radius * radius) {
        int px = cx + x;
        int py = cy + y;
        if (py >= 0 && py < h && px >= 0 && px < w) {
          canvas[py][px] = 1;
        }
      }
    }
  }
}
```

2. Update all usages of `_drawFilledCircle` in this file to use `drawFilledCircle` instead.

3. Replace `'package:your_project/utils/drawing_utils.dart'` with the actual import path for your project.

4. Repeat similar changes in the animation file where the helper is duplicated: remove the local implementation and import/use the shared utility.
</issue_to_address>

### Comment 4
<location> `lib/providers/animation_badge_provider.dart:69` </location>
<code_context>
   List<List<bool>> getPaintGrid() => _paintGrid;

+  // Helper: returns true if a special animation (custom) is selected
+  bool isSpecialAnimationSelected() {
+    int idx = getAnimationIndex() ?? 0;
+    return idx == 9 || idx == 10 || idx == 11 || idx == 12;
</code_context>

<issue_to_address>
Special animation detection is hardcoded.

Checking for specific indices (9–12) is not scalable. Consider using tags or an enum to identify special animations for easier future updates.

Suggested implementation:

```
  // Helper: returns true if a special animation (custom) is selected
  bool isSpecialAnimationSelected() {
    final idx = getAnimationIndex() ?? 0;
    final animation = animationMap[idx];
    return animation?.type == BadgeAnimationType.special;
  }

```

```
  10: LeftChevronAnimation(type: BadgeAnimationType.special), // Chevron left
  11: DiamondAnimation(type: BadgeAnimationType.special), // Diamond
  12: BrokenHeartsAnimation(type: BadgeAnimationType.special), // Broken Hearts
};

```

1. Define the `BadgeAnimationType` enum at the top of the file or in a shared location:
   ```dart
   enum BadgeAnimationType { normal, special }
   ```
2. Update all animation classes (e.g., `LeftChevronAnimation`, `DiamondAnimation`, etc.) to accept a `type` parameter in their constructors and expose a `type` property.
   For example:
   ```dart
   class LeftChevronAnimation extends Animation {
     final BadgeAnimationType type;
     LeftChevronAnimation({this.type = BadgeAnimationType.normal});
     // ...
   }
   ```
   Do this for all animation classes used in `animationMap`.
3. Update all other entries in `animationMap` to specify their type (default to `BadgeAnimationType.normal` if not special).
</issue_to_address>

### Comment 5
<location> `lib/providers/animation_badge_provider.dart:231` </location>
<code_context>
+  }) async {
+    final int aniIndex = getAnimationIndex() ?? 0;
+    final int selectedSpeed = speedDialProvider.getOuterValue();
+    if (aniIndex == 9) {
+      // Pacman
+      await transferPacmanAnimation(badgeData, selectedSpeed);
+    } else if (aniIndex == 10) {
+      await transferChevronAnimation(badgeData, selectedSpeed);
+    } else if (aniIndex == 11) {
+      await transferDiamondAnimation(badgeData, selectedSpeed);
+    } else if (aniIndex == 12) {
+      await transferBrokenHeartsAnimation(badgeData, selectedSpeed);
+    } else {
</code_context>

<issue_to_address>
handleAnimationTransfer uses index-based dispatch for special animations.

Hardcoding indices for special animations may lead to maintenance issues as new animations are added. Recommend switching to a more flexible dispatch method.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +123 to +151
if (isSavedBadge && data.messages.isNotEmpty) {
final old = data.messages[0];
final newMessage = Message(
text: old.text, // use the already-padded hex string
flash: old.flash,
marquee: old.marquee,
speed: old.speed,
mode: Mode.animation, // Force seamless marquee
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: Forcing Mode.animation for saved badges may not always be appropriate.

Currently, loading a saved badge always sets the first message's mode to Mode.animation, which may not reflect the user's original choice. Please consider making this behavior conditional based on the saved mode or user intent.

const int badgeHeight = 11;
const int badgeWidth = 44;
const int spawnInterval = 4; // frames between new diamonds
final Speed selectedSpeed = Speed.eight; // Use max speed
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

question: Hardcoding Speed.eight for diamond and broken hearts animations.

Diamond and broken hearts animations override the user-selected speed by always using Speed.eight. Please confirm if this is intentional or if user-configurable speed should be supported here as with other animations.

return bitmap.map((row) => row.map((b) => b ? 1 : 0).toList()).toList();
}

void _drawFilledCircle(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Helper drawing functions are duplicated in animation and provider files.

Consider moving these helper functions to a shared utility to reduce duplication and maintain consistency.

Suggested implementation:

import 'package:your_project/utils/drawing_utils.dart';

// (Remove the local _drawFilledCircle implementation.)
// Now use drawFilledCircle from the shared utility wherever _drawFilledCircle was used.

  1. Create a new file at lib/utils/drawing_utils.dart with the following content:
void drawFilledCircle(
    List<List<int>> canvas, int cx, int cy, int radius, int w, int h) {
  for (int y = -radius; y <= radius; y++) {
    for (int x = -radius; x <= radius; x++) {
      if (x * x + y * y <= radius * radius) {
        int px = cx + x;
        int py = cy + y;
        if (py >= 0 && py < h && px >= 0 && px < w) {
          canvas[py][px] = 1;
        }
      }
    }
  }
}
  1. Update all usages of _drawFilledCircle in this file to use drawFilledCircle instead.

  2. Replace 'package:your_project/utils/drawing_utils.dart' with the actual import path for your project.

  3. Repeat similar changes in the animation file where the helper is duplicated: remove the local implementation and import/use the shared utility.

@@ -54,9 +65,32 @@ class AnimationBadgeProvider extends ChangeNotifier {
//function to get the state of the cell
List<List<bool>> getPaintGrid() => _paintGrid;

// Helper: returns true if a special animation (custom) is selected
bool isSpecialAnimationSelected() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Special animation detection is hardcoded.

Checking for specific indices (9–12) is not scalable. Consider using tags or an enum to identify special animations for easier future updates.

Suggested implementation:

  // Helper: returns true if a special animation (custom) is selected
  bool isSpecialAnimationSelected() {
    final idx = getAnimationIndex() ?? 0;
    final animation = animationMap[idx];
    return animation?.type == BadgeAnimationType.special;
  }

  10: LeftChevronAnimation(type: BadgeAnimationType.special), // Chevron left
  11: DiamondAnimation(type: BadgeAnimationType.special), // Diamond
  12: BrokenHeartsAnimation(type: BadgeAnimationType.special), // Broken Hearts
};

  1. Define the BadgeAnimationType enum at the top of the file or in a shared location:
    enum BadgeAnimationType { normal, special }
  2. Update all animation classes (e.g., LeftChevronAnimation, DiamondAnimation, etc.) to accept a type parameter in their constructors and expose a type property.
    For example:
    class LeftChevronAnimation extends Animation {
      final BadgeAnimationType type;
      LeftChevronAnimation({this.type = BadgeAnimationType.normal});
      // ...
    }
    Do this for all animation classes used in animationMap.
  3. Update all other entries in animationMap to specify their type (default to BadgeAnimationType.normal if not special).

Comment on lines +231 to +275
if (aniIndex == 9) {
// Pacman
await transferPacmanAnimation(badgeData, selectedSpeed);
} else if (aniIndex == 10) {
await transferChevronAnimation(badgeData, selectedSpeed);
} else if (aniIndex == 11) {
await transferDiamondAnimation(badgeData, selectedSpeed);
} else if (aniIndex == 12) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: handleAnimationTransfer uses index-based dispatch for special animations.

Hardcoding indices for special animations may lead to maintenance issues as new animations are added. Recommend switching to a more flexible dispatch method.

@nope3472 nope3472 changed the title feat : created animations that can be transferred to the badge feat: created animations that can be transferred to the badge Jul 23, 2025
Copy link
Contributor

github-actions bot commented Jul 23, 2025

Build Status

Build successful. APKs to test: https://github.com/fossasia/badgemagic-app/actions/runs/16860897315/artifacts/3728747677.

Screenshots (Android)

Screenshots (iPhone)

Screenshots (iPad)

@samruddhi-Rahegaonkar
Copy link
Member

samruddhi-Rahegaonkar commented Jul 23, 2025

@nope3472 According to https://github.com/fossasia/badgemagic-firmware/blob/master/BadgeBLE.md, the device only supports 8 types of animations that are already included in BadgeMagic app.
How we are overcoming this issue ?
It will ruin how 8 badge transfer works.

@hpdang
Copy link
Member

hpdang commented Jul 24, 2025

Please implement the following:

  • Rename Animation to Transition
  • Put all the animation you created here to a new tab called "Animation"
  • Error message when users input text/icon + "animation"
  • Pacman going back and forth

Copy link
Member

@samruddhi-Rahegaonkar samruddhi-Rahegaonkar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nope3472 Please Address all the issue given by sourcery they are completely valid and also changes what we have discussed in yesterdays meeting.
if you need any help you can ping me.

@samruddhi-Rahegaonkar
Copy link
Member

@nope3472 You could make this as a draft PR so i could give you some early inputs.

@hpdang
Copy link
Member

hpdang commented Jul 30, 2025

@nope3472 it seems there is no progress on this PR since our last discussion

@nope3472
Copy link
Contributor Author

nope3472 commented Jul 30, 2025

@hpdang will raise a pr today

@samruddhi-Rahegaonkar samruddhi-Rahegaonkar self-requested a review July 31, 2025 17:02
Copy link
Member

@samruddhi-Rahegaonkar samruddhi-Rahegaonkar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nope3472 Please change the tabs name from animation to tansition and vice-versa and any possible changes you see.
please open a new issue for back and forth animation of pac man

Copy link
Member

@samruddhi-Rahegaonkar samruddhi-Rahegaonkar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copied text is not showing on textfield after changing Animation to transition.
All transitions are good 👍

Copy link
Member

@samruddhi-Rahegaonkar samruddhi-Rahegaonkar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@nope3472 Animations should be Saved as Transitions Please change it!

@nope3472
Copy link
Contributor Author

nope3472 commented Aug 4, 2025

@samruddhi-Rahegaonkar these new animations should be under animation and the previous ones should be under transition i think that was discussed

@samruddhi-Rahegaonkar
Copy link
Member

@nope3472 I am saying that The new Animations such as pacman, cupid should saved in savedBadges similar to new Transition

@hpdang
Copy link
Member

hpdang commented Aug 4, 2025

@nope3472 please

  1. hide the Save button on the Animation Screen.

  2. when we are changing from normal mode to animation it gives popup to copy if copied it should pasted on the textfield when the mode changes to the Transition.

@nope3472
Copy link
Contributor Author

nope3472 commented Aug 5, 2025

@samruddhi-Rahegaonkar @hpdang @mariobehling i am first creating all the animations and then i will update the save button issue and the tests

@samruddhi-Rahegaonkar
Copy link
Member

@nope3472 If you are done with all the changes needed discussed in meeting if yes then we are good to go with this?

@hpdang
Copy link
Member

hpdang commented Aug 7, 2025

@nope3472 status please

@nope3472
Copy link
Contributor Author

nope3472 commented Aug 9, 2025

@hpdang @mariobehling @samruddhi-Rahegaonkar the tests are resolved please review the pr

@samruddhi-Rahegaonkar
Copy link
Member

@nope3472 Please resolve conflicts.

@hpdang hpdang merged commit 18a099e into fossasia:development Aug 11, 2025
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

creating animations which can be transferred to badge
4 participants