wordpress-mobile / WordPress-Android

WordPress for Android
http://android.wordpress.org
GNU General Public License v2.0
2.96k stars 1.31k forks source link

Nullability Annotations to Java Classes - DialogFragment - Replace `findViewById` with `ViewBinding` #19180

Open ParaskP7 opened 1 year ago

ParaskP7 commented 1 year ago

Parent #18911

This issue is about adding replacing findViewById(...) with ViewBinding to as many Java-related DialogFragment classes as possible.

Instead of adding missing nullability annotations (@Nullable & @NonNull) to layout View related fields on such Java-related DialogFragment classes, it is better to migrate those fields, from the old way of assigning those (using findViewById(...)), and into the new way of referencing such view (direct via ViewBinding.

FYI: You could reference #14845 to get an idea on how to go about that.


### Tasks (`libs/editor`)
- [x] [ImageSettingsDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/libs/editor/src/main/java/org/wordpress/android/editor/ImageSettingsDialogFragment.java#L69)
- [ ] [LinkDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/libs/editor/src/main/java/org/wordpress/android/editor/LinkDialogFragment.java#L17)
### Tasks (`WordPress` + `ui.people`)
- [ ] [RoleChangeDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/WordPress/src/main/java/org/wordpress/android/ui/people/RoleChangeDialogFragment.java#L30)
- [x] [RoleSelectDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/ui/people/RoleSelectDialogFragment.java#L4)
### Tasks (`WordPress` + `ui.posts`)
- [x] [AddCategoryFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/ui/posts/AddCategoryFragment.java#L4)
- [ ] [InsertMediaDialog.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/ui/posts/InsertMediaDialog.java#L4)
- [x] [PostSettingsInputDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/WordPress/src/main/java/org/wordpress/android/ui/posts/PostSettingsInputDialogFragment.java#L25)
- [x] [PostSettingsListDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/ui/posts/PostSettingsListDialogFragment.java#L4)
### Tasks (`WordPress` + `ui.publicize`)
- [ ] [PublicizeAccountChooserDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/WordPress/src/main/java/org/wordpress/android/ui/publicize/PublicizeAccountChooserDialogFragment.java#L33)
### Tasks (`WordPress` + `ui`)
- [x] [CollapseFullScreenDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/WordPress/src/main/java/org/wordpress/android/ui/CollapseFullScreenDialogFragment.java#L45)
- [ ] [FullScreenDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/WordPress/src/main/java/org/wordpress/android/ui/FullScreenDialogFragment.java#L46)
- [ ] [TextInputDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/5b0d3f39c8cfe9c08b4e1547e46bc947f9be6b8f/WordPress/src/main/java/org/wordpress/android/ui/TextInputDialogFragment.java#L22)
- [x] [WPBottomSheetDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/ui/WPBottomSheetDialogFragment.java#L4)
### Tasks (`WordPress` + `widgets`)
- [x] [AuthErrorDialogFragment.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/widgets/AuthErrorDialogFragment.java#L4)
### Tasks (`WordPress` + `inner static`)
- [x] [PluginDetailActivity.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginDetailActivity.java#L4) -> [DomainRegistrationPromptDialog](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/ui/plugins/PluginDetailActivity.java#L352-L374)
- [ ] [WPPrefView.java](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/widgets/WPPrefView.java#L4) -> [WPPrefDialogFragment](https://github.com/wordpress-mobile/WordPress-Android/blob/1b38e8c84f8e8b30626406fd0568beeffd8f7676/WordPress/src/main/java/org/wordpress/android/widgets/WPPrefView.java#L464-L512)
peril-wordpress-mobile[bot] commented 1 year ago
Fails
:no_entry_sign: Please add a type label to this issue. e.g. '[Type] Enhancement'

Generated by :no_entry_sign: dangerJS

peril-wordpress-mobile[bot] commented 1 year ago
Fails
:no_entry_sign: Please add a type label to this issue. e.g. '[Type] Enhancement'

Generated by :no_entry_sign: dangerJS

peril-wordpress-mobile[bot] commented 1 year ago
Fails
:no_entry_sign: Please add a type label to this issue. e.g. '[Type] Enhancement'

Generated by :no_entry_sign: dangerJS

Areeb786123 commented 12 months ago

can you please assign me this issue?

ParaskP7 commented 11 months ago

πŸ‘‹ @Areeb786123 and thank you so much for offering to contribute! πŸ₯‡

Please feel free to start working on this. As such, I'll go ahead and assign this task to you (and me). PS: I am assigning myself as well, as I'll be guiding you all the way, up until we collaboratively merge your solution to trunk.

Before you begin, make sure to at least read the following documentation:

FYI: Note that depending on your solution, number of PRs, PR description, commit strategy, etc, I might ask you to improve on the quality and sometimes, even redo a PR. But, don't be afraid of it, I will only do that to help you out. Since this will be one of your first contribution to this repo, it is all part of the learning process, that is, until you become comfortable and aware about the ins-and-outs of how we work.

Do let me know if you need anything else! 🌟

PS: You can also check #18906 to get some inspiration on how to go about when working on your commits and then finally creating your PRs. I hope that helps. πŸ™

Areeb786123 commented 11 months ago

@ParaskP7 thanks for assigning me i will complete it as soon as possible

ParaskP7 commented 11 months ago

πŸ‘‹ @Areeb786123 and thank you! πŸ’―

...i will complete it as soon as possible

There is no rush, please take you time. Actually, it is better if you do it right, rather than fast.

FYI: Please create a new PR per task above (aka per class), this way it will be more manageable for us to review, test and finally merge any of your PRs.

Areeb786123 commented 11 months ago

@ParaskP7 OK sir thanks for the guidance.

neeldoshii commented 3 months ago

@ParaskP7 Can I work on this issue?

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii and thank you so much for offering to contribute! πŸ₯‡

Please feel free to start working on this. As such, I'll go ahead and re-assign this task to you now.

FYI: As per the above message, please make sure to read the documentation first. Also, I would suggest for you to create a new PR per task above (aka per class), this way it will be more manageable for us to review, test and finally merge any of your PRs.

neeldoshii commented 3 months ago

Thank you Petros Did a quite digging, we no longer have ImageSettingDialogFragment,PostSettingsListDialogFragment.java doesn't have findViewById so we can remove it from TODO.

Can you provide steps to reproduce the following fragment in the app? I did migration to ViewBinding locally but I am unsure about the impact wanna test it first before pushing. ~1. PostSettingsInputDialogFragment.java~ [Edit Reproduced, thanks to @twstokes for providing git bisect.]

  1. InsertMediaDialog.java

Also as a commit strategy as usual, would it be okay for one class migration as a commit for ease in reverting if needed?

My current plan is to migrate Tasks (WordPress + ui.posts) first. Just a followup improvement once the migration to viewbinding is complete can we migrate it to kotlin as it will be very useful for later migrating to compose. As most of the Automaticc apps are slowly migrating to compose.

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii and thanks for starting work on that! 🌟

Did a quite digging, we no longer have ImageSettingDialogFragment,PostSettingsListDialogFragment.java doesn't have findViewById so we can remove it from TODO.

You are correct, I just marked them as done, just to get them out of the way. βœ…

Can you provide steps to reproduce the following fragment in the app? I did migration to ViewBinding locally but I am unsure about the impact wanna test it first before pushing.

We just want to make sure that the change is not breaking anything and thus impacting the app negatively. Thus, we should make sure that we can test it first, before the change, and then again, after the change, and this way to assert correctness of behavior.

  1. PostSettingsInputDialogFragment.java [Edit Reproduced, thanks to @twstokes for providing git bisect.]

πŸ‘

  1. InsertMediaDialog.java

Actually, I would need to invest some time into reproducing this dialog myself. But, this is actually part of the task itself, to first try and figure out how to reproduce a screen/view/dialog. Sometimes, this might even be a dead-code that we could just need to "safely" remove instead.

Also as a commit strategy as usual, would it be okay for one class migration as a commit for ease in reverting if needed?

First, I would suggest one class per PR, that is, unless a group of classes are related to a single specific screen and/or functionality.

Then, as far as the commit strategy is concerned, I suggest multiple commits if possible, but self-sufficient, commits that do everything that they describe, but also don't do too many things at once. For example, if you need to refactor something, that is, before replacing a findViewById, a group of findViewById or all of them in one go, I would first suggest committing this unrelated refactor work first.

Doest that help? 😊

My current plan is to migrate Tasks (WordPress + ui.posts) first. Just a followup improvement once the migration to viewbinding is complete can we migrate it to kotlin as it will be very useful for later migrating to compose. As most of the Automaticc apps are slowly migrating to compose.

As long as we take this PR by PR, one step at a time, your plan sounds good to me! πŸ’―

Once more thanks for all your current and future contributions Neel! πŸ₯‡

neeldoshii commented 3 months ago

Hi @ParaskP7,

You are correct, I just marked them as done, just to get them out of the way. βœ…

πŸ‘

First, I would suggest one class per PR, that is, unless a group of classes are related to a single specific screen and/or functionality.

Then, as far as the commit strategy is concerned, I suggest multiple commits if possible, but self-sufficient, commits that do everything that they describe, but also don't do too many things at once. For example, if you need to refactor something, that is, before replacing a findViewById, a group of findViewById or all of them in one go, I would first suggest committing this unrelated refactor work first.

Gotcha, Rebasing #20933 and splitting it into two PR as this has 2 classes covered AddCategoryFragment & PostSettingsInputDialogFragment.

One more thing to ask.

AddCategoryFragment image

Would it be okay if I migrate this class to kotlin due to two reason 1. We still have 8 null annotation lint warning even after migrating to viewbinding 2. Sooner or later we eventually will need to migrate it.

PostSettingsInputDialogFragment image

Same with PostSettingsInputDialogFragment.

Current plan : As a first step I am migrating currently to viewbinding in two PR then once this get merged without breaking then convert to kotlin (if approved).

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii !

Gotcha, Rebasing https://github.com/wordpress-mobile/WordPress-Android/pull/20933 and splitting it into two PR as this has 2 classes covered AddCategoryFragment & PostSettingsInputDialogFragment.

πŸ‘

Would it be okay if I migrate this class (AddCategoryFragment) to kotlin due to two reason 1. We still have 8 null annotation lint warning even after migrating to viewbinding 2. Sooner or later we eventually will need to migrate it.

Same with PostSettingsInputDialogFragment.

Just to keep it simple, let's avoid the Kotlin migration and do it on separate PR(s) for now. Later on, when we gain more confidence over this process, and in us working together, we might consider doing both in a single PR. The truth is, I just don't want to overwhelmed you with (potential) extra PR comments, just because of the extra Kotlinization work (commits), risking your contributions/PR to stay still and maybe even not merge into trunk.

PS: Don't worry too much about the warnings you see there. Most of them are nullability related warnings, which are anyway a prerequisite for a class Kotlinization process.

Current plan : As a first step I am migrating currently to viewbinding in two PR...

πŸ‘

...then once this get merged without breaking then convert to kotlin (if approved).

Let's avoid this for a later (subsequent) set of PRs.

neeldoshii commented 3 months ago

Hi @ParaskP7 !

I have rebased and splitted it into Two PR (#20933 & #20941) and ready for review.

Did more digging for Tasks (WordPress + widgets) AuthErrorDialogFragment doesn't contains any findViewById it just an dialog without customview. We can let this done.

Edit : I believe Tasks (WordPress + ui.people) is no longer used in our app and is dead code. I was unable to find any PR related to removal. I found the steps to reproduce in the app (but it seems it no longer can be seen on the app).

PR #19568 says the steps to reproduce

  1. Have at least one site.
  2. Navigate to "My Site" tab.
  3. Click on "More".
  4. Click on "People".
  5. On top-left corner, click on the "+" button.
  6. You should have a form in-front of you that is used to invite people.
  7. Click on the "Role" field.
  8. A dialog should pop us as expected.

Issue https://github.com/wordpress-mobile/WordPress-Android/issues/8376#issue-364214047 & https://github.com/wordpress-mobile/WordPress-Android/issues/8376#issuecomment-427073690 also says the steps to reproduce this but this dialog is no longer used latest version of wordpress. I am not able to reproduce this in iOS and Android version. also doesn't have any findviewbyid

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii !

I have rebased and splitted it into Two PR (https://github.com/wordpress-mobile/WordPress-Android/pull/20933 & https://github.com/wordpress-mobile/WordPress-Android/pull/20941) and ready for review.

Awesome, thanks, I'll get into reviewing those next week! 🌟

Did more digging for Tasks (WordPress + widgets) AuthErrorDialogFragment doesn't contains any findViewById it just an dialog without customview. We can let this done.

Great, you're right, I just marked this as done as well! βœ…

I believe Tasks (WordPress + ui.people) is no longer used in our app and is dead code. I was unable to find any PR related to removal. I found the steps to reproduce in the app (but it seems it no longer can be seen on the app).

PR https://github.com/wordpress-mobile/WordPress-Android/pull/19568 says the steps to reproduce ...

Interesting, let me take a look at it and will get back to you on that. πŸ€”

Issue https://github.com/wordpress-mobile/WordPress-Android/issues/8376#issue-364214047 & https://github.com/wordpress-mobile/WordPress-Android/issues/8376#issuecomment-427073690 also says the steps to reproduce this but this dialog is no longer used latest version of wordpress. I am not able to reproduce this in iOS and Android version.

The dialogs you mentioned with the linked comments are Site Dialog related, not Role Change/Select Dialog, right? Am I missing something? πŸ€”

also doesn't have any findviewbyid

Do you mean the RoleChangeDialogFragment, which actually does have few findViewById? πŸ€”

But, yes, looking at RoleSelectDialogFragment it doesn't and I went ahead and marked at least that as done. βœ…

neeldoshii commented 3 months ago

The dialogs you mentioned with the linked comments are Site Dialog related, not Role Change/Select Dialog, right? Am I missing something? πŸ€”

Apologies. I pasted two comments from the PR which created confusion. https://github.com/wordpress-mobile/WordPress-Android/issues/8376#issuecomment-427073690 in subpart two Jorge Casariego explained steps which I believe is RoleChangeDialogFragment as per the steps we no longer have this flow in our current version. Not sure about which dialog it is RoleChangeDialogFragment or RoleSelectDialogFragment but the reproduction step match with the OP in #19568


If this is no longer used its safe to say both (RoleChangeDialogFragment or RoleSelectDialogFragment) the next step would be safely removing the dialog without breaking the app.


also doesn't have any findviewbyid

Do you mean the RoleChangeDialogFragment, which actually does have few findViewById? πŸ€”

But, yes, looking at RoleSelectDialogFragment it doesn't and I went ahead and marked at least that as done. βœ…

Yes RoleSelectDialogFragment

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii and a happy new week to you! β˜€οΈ

If this is no longer used its safe to say both (RoleChangeDialogFragment or RoleSelectDialogFragment) the next step would be safely removing the dialog without breaking the app.

Yes, let me first investigate that real quick, just to verify that both RoleChangeDialogFragment or RoleSelectDialogFragment are not used and then I'll maybe ping you for a removal PR, wdyt? 😊

ParaskP7 commented 3 months ago

Yes, let me first investigate that real quick, just to verify that both RoleChangeDialogFragment or RoleSelectDialogFragment are not used and then I'll maybe ping you for a removal PR, wdyt? 😊

After investigating those real quick, I found out that both the RoleChangeDialogFragment and RoleSelectDialogFragment are indeed being used in the app(s). Thus we cannot (safely) remove them. Again, as per my comment here I won't make it easy on you (πŸ˜…) as I would like you to verify that for yourself as well. Do let me know when you'll figure out how to test these flows.

neeldoshii commented 3 months ago

Hi @ParaskP7 Follow up in the above tasks:-

  1. This classWPBottomSheetDialogFragment doesn't have findViewById.

  2. With the help of debugger I reproduced this class CollapseFullScreenDialogFragment.java. I think CommentFullScreenDialogFragment.kt should also be added in the task list for migrating to viewbinding.

neeldoshii commented 3 months ago

After investigating those real quick, I found out that both the RoleChangeDialogFragment and RoleSelectDialogFragment are indeed being used in the app(s). Thus we cannot (safely) remove them. Again, as per my comment https://github.com/wordpress-mobile/WordPress-Android/pull/20933#pullrequestreview-2107423022 I won't make it easy on you (πŸ˜…) as I would like you to verify that for yourself as well. Do let me know when you'll figure out how to test these flows.

Apologies over here, I was testing the app only for wordpress build variant and didn't knew anything about jetpack variant features of the app. Which caused me most of the dialog not able to access like plugins and all.

I was so confused where is Reader Notifications in the app for a while then I read the blog about jetpack, will take a look now with debugger and find the flow of it and figure out.

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii and thanks!

This class WPBottomSheetDialogFragment doesn't have findViewById.

I guess you're right, this FrameLayout bottomSheetLayout = dialog.findViewById(com.google.android.material.R.id.design_bottom_sheet); usage can be ignored. I've now marked that as done, thanks! βœ…

With the help of debugger I reproduced this class CollapseFullScreenDialogFragment.java. I think CommentFullScreenDialogFragment.kt should also be added in the task list for migrating to viewbinding.

Actually, I think we should only consider Java classes for now, since, as per what the title suggests, this all is about making Java classes null-safe. Thus, you'll notice that in general I haven't included any Kotlin classes on the issue description and its lists. 😊

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii and please, don't apologize to me, I am just here to guide you and help you become the most effective contributor you can be. So, first, let me THANK YOU again for all the work you've been doing! πŸ™‡

Apologies over here, I was testing the app only for wordpress build variant and didn't knew anything about jetpack variant features of the app. Which caused me most of the dialog not able to access like plugins and all.

Yea, this project is quite complicated to be honest, 2 apps, 3 product flavors, etc. However, I am not sure why you were not able to use the WordPress variant to test both, RoleChangeDialogFragment and RoleSelectDialogFragment. I actually used the WordPress variant for that matter, the People menu item and screen should be available for this app as well.

Let me know if you can't find this screen. πŸ€”

I was so confused where is Reader Notifications in the app for a while then I read the blog about jetpack, will take a look now with debugger and find the flow of it and figure out.

πŸ‘

neeldoshii commented 3 months ago
WordpresJalapenoDebug JetpackJalapenoDebug WordpresWasabiDebug
screenshot screenshot screenshot

Yea, this project is quite complicated to be honest, 2 apps, 3 product flavors, etc. However, I am not sure why you were not able to use the WordPress variant to test both, RoleChangeDialogFragment and RoleSelectDialogFragment. I actually used the WordPress variant for that matter, the People menu item and screen should be available for this app as well.

Initially I was using WordpresJalapenoDebug as its default, through which I was not able to view any people, then I switched to JetpackJalapenoDebug which again doesn't have people in menu. But in WordpresWasabiDebug its reproducible.

Edit : The above WordpresWasabiDebugis of playstore jetpack. It's say try jetpack --> Redirects to playstore --> reproduced but can't test it.

Now my main doubt comes is when to use which flavour?

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii !

Just a note that the screenshot is not that accurate, the WordpressWasabiDebug variant you point there has to actually be a Jetpack variant as it is green and looking Jetpack like.

Initially I was using WordpresJalapenoDebug as its default, through which I was not able to view any people, then I switched to JetpackJalapenoDebug which again doesn't have people in menu. But in WordpresWasabiDebug its reproducible.

So, the People screen is reproducible on both, the WordPress and Jetpack app, it is just that on the Jetpack app you need to click the ... More option to get to that My Site screen where the People menu item is available. For WordPress, this My Site screen is the default as it doesn't have a Dashboard screen, just like Jetpack has.

Does this make sense to you? πŸ™

Edit : The above WordpresWasabiDebugis of playstore jetpack. It's say try jetpack --> Redirects to playstore --> reproduced but can't test it.

πŸ‘

Now my main doubt comes is when to use which flavour?

Both the Wasabi + Jalapeno variant are actually the same, used for debugging purposes, there is no practical difference there. So, try to use Jalapeno only, WordpressJalapeno for the WordPress app and JetpackJalapeno for the Jetpack app. This way you will avoid every variant related confusion.

neeldoshii commented 3 months ago

Just a note that the screenshot is not that accurate, the WordpressWasabiDebug variant you point there has to actually be a Jetpack variant as it is green and looking Jetpack like.

You are correct βœ…. That was jetpack app from Playstore.

So, the People screen is reproducible on both, the WordPress and Jetpack app, it is just that on the Jetpack app you need to click the ... More option to get to that My Site screen where the People menu item is available. For WordPress, this My Site screen is the default as it doesn't have a Dashboard screen, just like Jetpack has.

I am not sure how ❓, but for both Jetpack & Wordpress Jalapeno(both debug version) I am not able to reproduce. the more option similar to jetpack app (playstore release version) & people in Wordpres version.


Several tasks require a WordPress account login, which is currently not possible for contributors due to recent changes in the API. Therefore, I am un-assigning myself so others can tackle the remaining classes who has login access.

ParaskP7 commented 3 months ago

πŸ‘‹ @neeldoshii and I am very 😞 about you not being able to test this functionality, most probably due to the login access, my apologies for that! πŸ«‚

I am un-assigning myself so others can tackle the remaining classes who has login access.

Makes sense to me, let's try and find you something else to work on! πŸ™

neeldoshii commented 2 months ago

Hi @ParaskP7 πŸ‘‹, I guess we have forgotten to tick the AddCategoryFragment, PostSettingsInputDialogFragment, CollapseFullScreenDialogFragment, PluginDetailActivity

ParaskP7 commented 2 months ago

Done, thanks @neeldoshii ! πŸ₯‡