mmmoussa Github contribution chart
mmmoussa Github Stats
mmmoussa Most Used Languages

Activity

29 Sep 2022

Mmmoussa

Another SimpleCache instance uses the folder ... TrackPlayer

On the android-redesign branch, I'm bumping into this error:

10-10 19:33:03.219  1845  1845 E AndroidRuntime: java.lang.IllegalStateException: Another SimpleCache instance uses the folder: /data/user/0/com.xxx.xxx/cache/TrackPlayer
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:125)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:112)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:84)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.service.models.Track.toMediaSource(Track.java:148)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.service.player.ExoPlayback.add(ExoPlayback.java:74)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.module.MusicModule.lambda$add$2$MusicModule(MusicModule.java:191)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.module.MusicModule$$Lambda$2.run(Unknown Source:8)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:789)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:98)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:164)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6541)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Forked On 29 Sep 2022 at 02:03:20

Mmmoussa

@VinceBT already doing that, thanks for the suggestion!

Commented On 29 Sep 2022 at 02:03:20

Mmmoussa

fix(android): resolve problem with StopPlaybackAndRemoveNotification not working on subsequent exists

This fixes #1759

Forked On 28 Sep 2022 at 07:03:11

Mmmoussa

Patched this into my project and confirmed it fixed the issue as well.

Commented On 28 Sep 2022 at 07:03:11

Mmmoussa

Another SimpleCache instance uses the folder ... TrackPlayer

On the android-redesign branch, I'm bumping into this error:

10-10 19:33:03.219  1845  1845 E AndroidRuntime: java.lang.IllegalStateException: Another SimpleCache instance uses the folder: /data/user/0/com.xxx.xxx/cache/TrackPlayer
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:125)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:112)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:84)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.service.models.Track.toMediaSource(Track.java:148)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.service.player.ExoPlayback.add(ExoPlayback.java:74)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.module.MusicModule.lambda$add$2$MusicModule(MusicModule.java:191)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.module.MusicModule$$Lambda$2.run(Unknown Source:8)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:789)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:98)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:164)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6541)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Forked On 28 Sep 2022 at 06:56:10

Mmmoussa

Figured out how to test this without a new release by modifying the KA dependency in RNTP to implementation 'com.github.DoubleSymmetry:KotlinAudio:main-SNAPSHOT' and confirmed that the issue is indeed fixed. Thanks @mpivchev and @jspizziri!

Commented On 28 Sep 2022 at 06:56:10

Mmmoussa

Another SimpleCache instance uses the folder ... TrackPlayer

On the android-redesign branch, I'm bumping into this error:

10-10 19:33:03.219  1845  1845 E AndroidRuntime: java.lang.IllegalStateException: Another SimpleCache instance uses the folder: /data/user/0/com.xxx.xxx/cache/TrackPlayer
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:125)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:112)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.google.android.exoplayer2.upstream.cache.SimpleCache.<init>(SimpleCache.java:84)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.service.models.Track.toMediaSource(Track.java:148)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.service.player.ExoPlayback.add(ExoPlayback.java:74)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.module.MusicModule.lambda$add$2$MusicModule(MusicModule.java:191)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.guichaguri.trackplayer.module.MusicModule$$Lambda$2.run(Unknown Source:8)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:789)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:98)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:164)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6541)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
10-10 19:33:03.219  1845  1845 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

Forked On 28 Sep 2022 at 06:28:27

Mmmoussa

Experienced this same issue when using https://github.com/avishayil/react-native-restart for handling app localization changes. I am guessing https://github.com/doublesymmetry/KotlinAudio/pull/53 will fix it but will test it out once it is released.

Commented On 28 Sep 2022 at 06:28:27

Mmmoussa

fix: example app to RN v0.69.6 and appKilledPlaybackBehavior to StopPlaybackAndRemoveNotification

This is not meant to be merged necessarily (the update to the RN version could be but the appKilledPlaybackBehavior doesn't need to be). The goal of this PR is to demonstrate that the appKilledPlaybackBehavior option of StopPlaybackAndRemoveNotification does not work correctly.

Repro steps:

  1. Install the app on your device and start playing music
  2. Close the app and note that the music stopped playing and the notification disappeared
  3. Open the app and start playing music
  4. Close the app and note that the music continued playing and the notification did not disappear

RN version update followed https://react-native-community.github.io/upgrade-helper/?from=0.68.1&to=0.69.6

Forked On 27 Sep 2022 at 06:01:15

Mmmoussa

I couldn't get the release build working without upgrading React Native and so that's why I've got it here, but if the release build is working for you as is then all you need to do is change appKilledPlaybackBehaviour. You can even test with a debug build and you should experience the same issue.

Commented On 27 Sep 2022 at 06:01:15

Mmmoussa

feat(android): add back option to remove notification

This adds an AndroidOptions interface to RN that adds optional flags specifically for Android. It also adds the android flag stoppingAppRemovesNotification which will remove the notification when the app is killed.

Forked On 27 Sep 2022 at 05:26:27

Mmmoussa

I got the release build of the example app working and found the behaviour to be the same as debug, which is still broken. You can see this yourself if you take a look at https://github.com/doublesymmetry/react-native-track-player/pull/1758.

Commented On 27 Sep 2022 at 05:26:27
Create Branch
Mmmoussa In mmmoussa/react-native-track-player Create Branchexample-updates

Mmmoussa

A fully fledged audio module created for music apps. Provides audio playback, external media controls, chromecast support, background mode and more!

On 27 Sep 2022 at 05:22:23

Mmmoussa

fix: example app to RN v0.69.6 and appKilledPlaybackBehavior to StopPlaybackAndRemoveNotification

Created On 27 Sep 2022 at 05:22:21

Mmmoussa

feat(android): add back option to remove notification

This adds an AndroidOptions interface to RN that adds optional flags specifically for Android. It also adds the android flag stoppingAppRemovesNotification which will remove the notification when the app is killed.

Forked On 27 Sep 2022 at 04:04:13

Mmmoussa

@jspizziri that is what I tried to do but I encountered the above issue for the release build. I am looking into resolving it. Is the release build of the example app working for you?

Commented On 27 Sep 2022 at 04:04:13

Mmmoussa

feat(android): add back option to remove notification

This adds an AndroidOptions interface to RN that adds optional flags specifically for Android. It also adds the android flag stoppingAppRemovesNotification which will remove the notification when the app is killed.

Forked On 27 Sep 2022 at 03:59:05

Mmmoussa

Seems that the old functionality was to unbind the service based on https://github.com/doublesymmetry/react-native-track-player/commit/3c292a88067df5808927512a2e5e089a02cf82c1 and that is no longer the approach, so I'm not sure where to start looking for the issue. What would be helpful is if the example app could be bundled for release and tested to determine if the expected functionality even works in that app correctly.

Commented On 27 Sep 2022 at 03:59:05

Mmmoussa

feat(android): add back option to remove notification

This adds an AndroidOptions interface to RN that adds optional flags specifically for Android. It also adds the android flag stoppingAppRemovesNotification which will remove the notification when the app is killed.

Forked On 27 Sep 2022 at 03:32:41

Mmmoussa

With the example app, when I run the app in debug mode after modifying the appKilledPlaybackBehavior value it does work the first time I close the app but then when I open the app again, start plaback, then close it again it continues playing and doesn't dismiss the notification. I wanted to test with a release build but the task :app:checkReleaseDuplicateClasses fails with the following:

Execution failed for task ':app:checkReleaseDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
   > Duplicate class androidx.appcompat.content.res.AppCompatResources found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.content.res.AppCompatResources$ColorStateListCacheEntry found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat$1 found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat$AnimatableTransition found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat$AnimatedStateListState found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat$AnimatedVectorDrawableTransition found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat$AnimationDrawableTransition found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat$FrameInterpolator found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat$Transition found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.DrawableContainer found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.DrawableContainer$1 found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.DrawableContainer$BlockInvalidateCallback found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.DrawableContainer$DrawableContainerState found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.DrawableWrapper found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.StateListDrawable found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.graphics.drawable.StateListDrawable$StateListState found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.widget.DrawableUtils found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.widget.ResourcesWrapper found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.widget.TintContextWrapper found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.widget.TintInfo found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.widget.TintResources found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     Duplicate class androidx.appcompat.widget.VectorEnabledTintResources found in modules appcompat-1.0.2-runtime (androidx.appcompat:appcompat:1.0.2) and jetified-appcompat-resources-1.3.1-runtime (androidx.appcompat:appcompat-resources:1.3.1)
     ```
     
In the case of my app, the release build does stop the audio playback but the notification remains. However, the debug build behaviour also has the notification get removed like with the example app. 

Commented On 27 Sep 2022 at 03:32:41

Mmmoussa

Test Kotlin conversion

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

WIP

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Fix building

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Update deps

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Fix compilation

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Fix manifest merger issues

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Implement QueuedAudioPlayer

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Deprecate old module and service

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Module and service building blocks

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Add basic module, service, and binder

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Implement more basic functoins

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Implement more basic functions

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Fix refactoring errors

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Try to upgrade Gradle

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Revert "Try to upgrade Gradle"

This reverts commit 58d323e3a543c066060a2cb29606b8ae5b907074.

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

WIP

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Add KotlinAudio as a local lib (temporary)

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Hook UI to service

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Refactoring pass

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

Load track details to UI

Pushed On 27 Sep 2022 at 02:35:33

Mmmoussa

feat(android): add back option to remove notification

This adds an AndroidOptions interface to RN that adds optional flags specifically for Android. It also adds the android flag stoppingAppRemovesNotification which will remove the notification when the app is killed.

Forked On 27 Sep 2022 at 02:32:40

Mmmoussa

Cleared cache and did a fresh install but still having the same issue. I am entirely unfamiliar with Kotlin but will try to debug.

Commented On 27 Sep 2022 at 02:32:40

Mmmoussa

feat(android): add back option to remove notification

This adds an AndroidOptions interface to RN that adds optional flags specifically for Android. It also adds the android flag stoppingAppRemovesNotification which will remove the notification when the app is killed.

Forked On 27 Sep 2022 at 02:00:54

Mmmoussa

Moto G Fast running Android 11

Commented On 27 Sep 2022 at 02:00:54

Mmmoussa

feat(android): add back option to remove notification

This adds an AndroidOptions interface to RN that adds optional flags specifically for Android. It also adds the android flag stoppingAppRemovesNotification which will remove the notification when the app is killed.

Forked On 27 Sep 2022 at 01:22:39

Mmmoussa

@mpivchev I tested this in my app with v3.2.0 using appKilledPlaybackBehavior: AppKilledPlaybackBehavior.StopPlaybackAndRemoveNotification but the notification is not being removed when I remove the app from recents, and when I re-open the app I find that playback was only paused, not stopped. Is there something I'm missing?

Commented On 27 Sep 2022 at 01:22:39
Issue Comment

Mmmoussa

Please specify "higher minimum deployment target" dependency

Report

While installing a pod to a local podspec, I get the Specs satisfying the xxx dependency were found, but they required a higher minimum deployment target. It would be good if it could tell me WHAT dependency had a higher minimum deployment target.

What did you do?

Run pod install

What did you expect to happen?

Install all pod dependencies correctly.

What happened instead?

Got an error about minimum deployment target.

CocoaPods Environment

Stack

 CocoaPods : 1.4.0.rc.1
        Ruby : ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
    RubyGems : 2.0.14.1
        Host : Mac OS X 10.12.6 (16G1114)
       Xcode : 9.2 (9C40b)
         Git : git version 2.14.3 (Apple Git-98)
Ruby lib dir : /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib
Repositories : livepersoninc - https://github.com/LivePersonInc/iOSPodSpecs.git @ fab2df00efa71fb4996a44a7f39c98354c821643
               lprnd-lp-coapp-pods - git@lpgithub.dev.lprnd.net:RnD-Mannheim/lp-coapp-pods.git @ 20f665d3a1039f5218d6aeec789f6439cda94cd3
               lprnd-lpmessagingsdk-pod - git@lpgithub.dev.lprnd.net:lp-mobile/LPMessagingSDK-Pod.git @ 30965a6f6d59e8685c828fad54592b760425df28
               master - https://github.com/CocoaPods/Specs.git @ 8ccb84beba24a27269a61dfcb32c566927085370 

Installation Source

Executable Path: /usr/local/bin/pod 

Plugins

cocoapods-deintegrate : 1.0.1
cocoapods-plugins     : 1.0.0
cocoapods-search      : 1.0.0
cocoapods-stats       : 1.0.0
cocoapods-trunk       : 1.3.0
cocoapods-try         : 1.1.0 

Podfile

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

target 'Reference App' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  pod 'ContactAtOnceMessaging', :path => 'ContactAtOnceMessaging/'

end 

Forked On 26 Sep 2022 at 10:00:16

Mmmoussa

Had the same issue, running pod update was the solution.

Commented On 26 Sep 2022 at 10:00:16

Mmmoussa

Dismiss notification when app is removed from recent apps list

With version 3.1.0 the multimedia notification is not dismissed when the app has been terminated by the user. The only way to dismiss the notification is to force quit the app from the settings. I have made these changes to prevent this behavior, now when the user kills the app the notification also closes.

Forked On 08 Sep 2022 at 06:33:19

Mmmoussa

The new "feature" of the notification persisting after the user terminates the app is a bug in my opinion as well. It's actually blocking us from upgrading to 3.x. If it was opt-in or opt-out that would be fine, but in our use-case the track player is a secondary functionality of the app rather than primary and persisting the notification is guaranteed to bring us bug reports.

Commented On 08 Sep 2022 at 06:33:19
Issue Comment

Mmmoussa

Flatlist performance and loading mechanism

Description

I'm testing initial performance of Flatlist (without any optimization code) and found something interesting:

  • it used 7.37 seconds to finish loading of 300 simple numbers
  • after initial batch of load (<100 numbers) is finished, system loaded 10 numbers per batch, but repeat start from 1-100, 1-110,1-120...until 1-300 (so in total around 3000 times)

I don't understand this mechanism as well as long duration to load just 300 numbers. Maybe somewhere is wrong? Thanks in advance for help and clarifications.

Since this is testing only for initial performance, pls forget any optimization solution temporarily.

Version

0.68.2

Output of npx react-native info

{ "name": "myunittest", "version": "1.0.0", "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start", "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web", "eject": "expo eject" }, "dependencies": { "@react-native-async-storage/async-storage": "^1.17.7", "@react-native-community/netinfo": "8.2.0", "@react-navigation/native": "^6.0.10", "@react-navigation/native-stack": "^6.6.2", "axios": "^0.27.2", "cos-js-sdk-v5": "^1.3.9", "expo": "~45.0.0", "expo-av": "~11.2.3", "expo-camera": "^12.2.0", "expo-media-library": "~14.1.0", "expo-web-browser": "^10.2.1", "react": "17.0.2", "react-native": "0.68.2", "react-native-countdown-component": "^2.7.1", "react-native-radio-buttons-group": "^2.2.11", "expo-file-system": "~14.0.0" }, "devDependencies": { "@babel/core": "^7.12.9" }, "private": true }

Steps to reproduce

import React from "react"; import { StyleSheet, Text, View, FlatList } from "react-native";

export default function App() { const list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, ];

console.log(Date.now());

function renItem({ item, index }) { if (index === 299) console.log(Date.now()); return <Text style={{ width: 100 }}>{item}; }

return ( ); }

const styles = StyleSheet.create({ container: { backgroundColor: "fff", justifyContent: "center", alignItems: "center", marginVertical: 36, paddingVertical: 16, }, });

Snack, code example, screenshot, or link to a repository

image

Forked On 06 Sep 2022 at 10:39:37

Mmmoussa

Thanks @GenoD! We did end up finding the cause to be the inverted prop as well and we ended up fixing it by reversing our data before feeding it to the list and then also inverting all logic that made use of item index.

Commented On 06 Sep 2022 at 10:39:37
Issue Comment

Mmmoussa

Flatlist performance and loading mechanism

Description

I'm testing initial performance of Flatlist (without any optimization code) and found something interesting:

  • it used 7.37 seconds to finish loading of 300 simple numbers
  • after initial batch of load (<100 numbers) is finished, system loaded 10 numbers per batch, but repeat start from 1-100, 1-110,1-120...until 1-300 (so in total around 3000 times)

I don't understand this mechanism as well as long duration to load just 300 numbers. Maybe somewhere is wrong? Thanks in advance for help and clarifications.

Since this is testing only for initial performance, pls forget any optimization solution temporarily.

Version

0.68.2

Output of npx react-native info

{ "name": "myunittest", "version": "1.0.0", "main": "node_modules/expo/AppEntry.js", "scripts": { "start": "expo start", "android": "expo start --android", "ios": "expo start --ios", "web": "expo start --web", "eject": "expo eject" }, "dependencies": { "@react-native-async-storage/async-storage": "^1.17.7", "@react-native-community/netinfo": "8.2.0", "@react-navigation/native": "^6.0.10", "@react-navigation/native-stack": "^6.6.2", "axios": "^0.27.2", "cos-js-sdk-v5": "^1.3.9", "expo": "~45.0.0", "expo-av": "~11.2.3", "expo-camera": "^12.2.0", "expo-media-library": "~14.1.0", "expo-web-browser": "^10.2.1", "react": "17.0.2", "react-native": "0.68.2", "react-native-countdown-component": "^2.7.1", "react-native-radio-buttons-group": "^2.2.11", "expo-file-system": "~14.0.0" }, "devDependencies": { "@babel/core": "^7.12.9" }, "private": true }

Steps to reproduce

import React from "react"; import { StyleSheet, Text, View, FlatList } from "react-native";

export default function App() { const list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, ];

console.log(Date.now());

function renItem({ item, index }) { if (index === 299) console.log(Date.now()); return <Text style={{ width: 100 }}>{item}; }

return ( ); }

const styles = StyleSheet.create({ container: { backgroundColor: "fff", justifyContent: "center", alignItems: "center", marginVertical: 36, paddingVertical: 16, }, });

Snack, code example, screenshot, or link to a repository

image

Forked On 01 Sep 2022 at 12:51:16

Mmmoussa

@alickcai did you test this on an Android device running Android 13 by any chance? I have encountered an issue where flatlist performance is massively degraded on Android 13.

Commented On 01 Sep 2022 at 12:51:16
Issue Comment

Mmmoussa

Dimensions reports wrong sizes on Chromebooks

Description

All values from Dimensions and useWindowDimensions are wrong when running Android apps on a Chromebook. The reported dimensions seem to match the size of the full Chromebook screen, not the actual window in which the app is running. As the app's window is resized, the reported dimensions do not change.

For now I was able to work around this issue by using useSafeAreaFrame from the react-native-safe-area-context package.

Version

0.67.2

Output of npx react-native info

System: OS: macOS 12.0.1 CPU: (12) x64 Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz Memory: 79.57 MB / 32.00 GB Shell: 3.2.57 - /bin/bash Binaries: Node: 14.15.1 - /usr/local/bin/node Yarn: 1.22.17 - /usr/local/bin/yarn npm: 8.1.0 - /usr/local/bin/npm Watchman: 2021.10.18.00 - /usr/local/bin/watchman Managers: CocoaPods: 1.11.2 - /usr/local/bin/pod SDKs: iOS SDK: Platforms: DriverKit 21.2, iOS 15.2, macOS 12.1, tvOS 15.2, watchOS 8.3 Android SDK: API Levels: 21, 22, 23, 28, 29, 30 Build Tools: 21.1.2, 22.0.1, 23.0.1, 23.0.2, 26.0.2, 28.0.2, 28.0.3, 29.0.2, 30.0.2, 30.0.3, 31.0.0 System Images: android-10 | Intel x86 Atom, android-15 | Intel x86 Atom, android-23 | Google APIs Intel x86 Atom, android-29 | Google APIs Intel x86 Atom, android-29 | Google Play Intel x86 Atom, android-29 | Google Play Intel x86 Atom_64, android-30 | Google APIs Intel x86 Atom Android NDK: Not Found IDEs: Android Studio: 4.2 AI-202.7660.26.42.7322048 Xcode: 13.2.1/13C100 - /usr/bin/xcodebuild Languages: Java: 1.8.0_40 - /usr/bin/javac npmPackages: @react-native-community/cli: Not Found react: 17.0.2 => 17.0.2 react-native: 0.67.2 => 0.67.2 react-native-macos: Not Found npmGlobalPackages: react-native: Not Found

Steps to reproduce

To setup a Chromebook for debugging, follow this guide: https://developer.android.com/topic/arc/development-environment. Afterwards, follow these steps:

  1. Run an Android app built with RN on a Chromebook in debug mode
  2. If the app fills the full screen, resize it to not fill the screen
  3. Add const { height, width } = useWindowDimensions() into any component and log the height and width
  4. Note that the height and width values are wrong

Bonus:

  1. Install react-native-safe-area-context
  2. Add const { height: fHeight, width: fWidth } = useSafeAreaFrame() into any component and log fHeight and fWidth
  3. Note that the frame height and width are correct and do not match the values from useWindowDimensions

Snack, code example, screenshot, or link to a repository

Repro is trivial if you have access to a Chromebook

Forked On 09 Aug 2022 at 07:53:52

Mmmoussa

This issue still needs to be addressed

Commented On 09 Aug 2022 at 07:53:52
Issue Comment

Mmmoussa

RTL Bug Android

Current behavior

On RTL Mode, the list is completely weird.

RTL:

https://user-images.githubusercontent.com/27680142/182146469-d083b166-3dc4-4c9b-8931-51764c1967a6.mp4

LTR:

https://user-images.githubusercontent.com/27680142/182146494-a4266294-62c2-4554-a528-d8dd060f70ba.mp4

Expected behavior

Well it should simply behave like LTR but only the direction changes.

To Reproduce

I'm sorry I don't use anything but expo managed workflow so I couldn't get your sample app to work, but here's a simple repro.

import {FlashList} from "@shopify/flash-list";
import React, {Component} from "react";
import {FlatList, ScrollView, Text, View, I18nManager} from "react-native";

export default function App() {
    const data1 = [1, 2];
    const data2 = [
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
    ];

    React.useEffect(() => {
        I18nManager.forceRTL(true);
        I18nManager.allowRTL(true);
    }, []);

    return (
        <View>
            <View style={{marginTop: 100}} />
            <FlashList
                horizontal
                data={data2}
                estimatedItemSize={100}
                renderItem={(info) => {
                    return (
                        <View
                            style={{
                                marginHorizontal: 8,
                                width: 100,
                                height: 100,
                                backgroundColor: "gray",
                            }}
                        >
                            <Text>{info.item}</Text>
                        </View>
                    );
                }}
            />
        </View>
    );
} 

Remember you need to restart your app to get the I18nManager's effect.

Platform:

  • [ ] iOS
  • [ X ] Android

Environment

@shopify/flash-list@1.2.0 
npx expo-env-info

  expo-env-info 1.0.5 environment info:
    System:
      OS: macOS 10.15.7
      Shell: 5.7.1 - /bin/zsh
    Binaries:
      Node: 16.16.0 - ~/.nvm/versions/node/v16.16.0/bin/node
      Yarn: 1.22.19 - ~/.nvm/versions/node/v16.16.0/bin/yarn
      npm: 8.15.1 - ~/.nvm/versions/node/v16.16.0/bin/npm
      Watchman: 2022.02.14.00 - /usr/local/bin/watchman
    SDKs:
      iOS SDK:
        Platforms: iOS 14.4, DriverKit 20.2, macOS 11.1, tvOS 14.3, watchOS 7.2
      Android SDK:
        API Levels: 28, 29, 30, 32
        Build Tools: 28.0.3, 29.0.2, 29.0.3
    IDEs:
      Android Studio: 4.0 AI-193.6911.18.40.6626763
      Xcode: 12.4/12D4e - /usr/bin/xcodebuild
    npmPackages:
      expo: ~45.0.0 => 45.0.6 
      react: 17.0.2 => 17.0.2 
      react-dom: 17.0.2 => 17.0.2 
      react-native: 0.68.2 => 0.68.2 
      react-native-web: 0.17.7 => 0.17.7 
      react-navigation: 4 => 4.4.4 
    npmGlobalPackages:
      eas-cli: 0.56.0
      expo-cli: 6.0.1
    Expo Workflow: managed 

I though giving your library try because FlatList's RTL is corrupted on the latest version: https://github.com/facebook/react-native/issues/34314

Had no idea yours doesn't work too :(

It's a horrible time for having an RTL app right now!

Forked On 07 Aug 2022 at 02:27:59

Mmmoussa

Did some more testing and found that flashlist is not even working correctly for iOS RTL still. Will try to put up a stripped down example repo.

Commented On 07 Aug 2022 at 02:27:59
Issue Comment

Mmmoussa

RTL Bug Android

Current behavior

On RTL Mode, the list is completely weird.

RTL:

https://user-images.githubusercontent.com/27680142/182146469-d083b166-3dc4-4c9b-8931-51764c1967a6.mp4

LTR:

https://user-images.githubusercontent.com/27680142/182146494-a4266294-62c2-4554-a528-d8dd060f70ba.mp4

Expected behavior

Well it should simply behave like LTR but only the direction changes.

To Reproduce

I'm sorry I don't use anything but expo managed workflow so I couldn't get your sample app to work, but here's a simple repro.

import {FlashList} from "@shopify/flash-list";
import React, {Component} from "react";
import {FlatList, ScrollView, Text, View, I18nManager} from "react-native";

export default function App() {
    const data1 = [1, 2];
    const data2 = [
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
    ];

    React.useEffect(() => {
        I18nManager.forceRTL(true);
        I18nManager.allowRTL(true);
    }, []);

    return (
        <View>
            <View style={{marginTop: 100}} />
            <FlashList
                horizontal
                data={data2}
                estimatedItemSize={100}
                renderItem={(info) => {
                    return (
                        <View
                            style={{
                                marginHorizontal: 8,
                                width: 100,
                                height: 100,
                                backgroundColor: "gray",
                            }}
                        >
                            <Text>{info.item}</Text>
                        </View>
                    );
                }}
            />
        </View>
    );
} 

Remember you need to restart your app to get the I18nManager's effect.

Platform:

  • [ ] iOS
  • [ X ] Android

Environment

@shopify/flash-list@1.2.0 
npx expo-env-info

  expo-env-info 1.0.5 environment info:
    System:
      OS: macOS 10.15.7
      Shell: 5.7.1 - /bin/zsh
    Binaries:
      Node: 16.16.0 - ~/.nvm/versions/node/v16.16.0/bin/node
      Yarn: 1.22.19 - ~/.nvm/versions/node/v16.16.0/bin/yarn
      npm: 8.15.1 - ~/.nvm/versions/node/v16.16.0/bin/npm
      Watchman: 2022.02.14.00 - /usr/local/bin/watchman
    SDKs:
      iOS SDK:
        Platforms: iOS 14.4, DriverKit 20.2, macOS 11.1, tvOS 14.3, watchOS 7.2
      Android SDK:
        API Levels: 28, 29, 30, 32
        Build Tools: 28.0.3, 29.0.2, 29.0.3
    IDEs:
      Android Studio: 4.0 AI-193.6911.18.40.6626763
      Xcode: 12.4/12D4e - /usr/bin/xcodebuild
    npmPackages:
      expo: ~45.0.0 => 45.0.6 
      react: 17.0.2 => 17.0.2 
      react-dom: 17.0.2 => 17.0.2 
      react-native: 0.68.2 => 0.68.2 
      react-native-web: 0.17.7 => 0.17.7 
      react-navigation: 4 => 4.4.4 
    npmGlobalPackages:
      eas-cli: 0.56.0
      expo-cli: 6.0.1
    Expo Workflow: managed 

I though giving your library try because FlatList's RTL is corrupted on the latest version: https://github.com/facebook/react-native/issues/34314

Had no idea yours doesn't work too :(

It's a horrible time for having an RTL app right now!

Forked On 07 Aug 2022 at 01:23:38

Mmmoussa

Tested the RLV patch in my app using the latest version of flashlist and confirmed it doesn't fix the problem, which I mentioned in https://github.com/Shopify/flash-list/pull/520#issuecomment-1180717192. I got sidetracked on other tasks but am trying to reserve some time to investigate this issue.

Commented On 07 Aug 2022 at 01:23:38
Issue Comment

Mmmoussa

Horizontal inversion

Description

resolves #512 In horizontal mode, inverted mode should be using scaleX transform. It was being skipped in current implementation.

Checklist

Forked On 11 Jul 2022 at 06:14:34

Mmmoussa

Tested this in my closed-source app. It is working correctly on iOS. On Android, it works when the app locale is a ltr language but is broken when switching to an rtl language. The cells appear to be there because the viewability callback is working correctly but the contents of the cells are missing. I am investigating further.

Commented On 11 Jul 2022 at 06:14:34
Issue Comment

Mmmoussa

`inverted` prop flips horizontal lists vertically instead of horizontally

Current behavior

Setting the inverted prop to true on a horizontal list inverts the list vertically instead of horizontally.

Expected behavior

The list should be inverted horizontally.

To Reproduce

Render a horizontal list of items containing text and set inverted to true.

Platform:

  • [X] iOS
  • [X] Android

Environment

1.0.4

Forked On 07 Jul 2022 at 04:17:05

Mmmoussa

For more specific context, in our app (https://tarteel.ai) we render the Quran (which is in Arabic) with mapping to the most common physical book format. We currently render using a slighltly modified version of VirtualizedList. On iOS, we use the app locale directionality (I18nManager.isRTL) in conjunction with the inverted prop to ensure the list of pages is always rendered from right to left. On Android, the default list behaviour is different (read: wrong), and we always render the list of pages as inverted but leverage renderScrollComponent to pass a different flexDirection value in the contentContainerStyle prop of the ScrollView depending on app locale directionality.

Commented On 07 Jul 2022 at 04:17:05
Issue Comment

Mmmoussa

`inverted` prop flips horizontal lists vertically instead of horizontally

Current behavior

Setting the inverted prop to true on a horizontal list inverts the list vertically instead of horizontally.

Expected behavior

The list should be inverted horizontally.

To Reproduce

Render a horizontal list of items containing text and set inverted to true.

Platform:

  • [X] iOS
  • [X] Android

Environment

1.0.4

Forked On 07 Jul 2022 at 04:05:46

Mmmoussa

Rendering books. Books have a directionality that is independent of device locale. For example, when rendering an English book, you can render each page as an item in a horizontal list, going from left to right. If the app is in an rtl locale, the pages should still go from left to right and hence you need the inverted prop. Similarly, in the case of a book from an rtl language, you may want to always render the list of pages from right to left and hence need to use the inverted prop when the app is using a ltr locale.

More broadly, I can imagine there are many use cases where leveraging the inverted prop in combination with app locale directionality woud be important, let alone the case I mentioned above where the content directionality is a factor as well.

Commented On 07 Jul 2022 at 04:05:46

Mmmoussa

fix(ios): fix an issue with `reset()` causing a crash on iOS due to o…

…ut of range exception

https://github.com/doublesymmetry/react-native-track-player/issues/1585

Forked On 06 Jul 2022 at 04:23:25

Mmmoussa

Tested this in my app and seems to work without any side effects

Commented On 06 Jul 2022 at 04:23:25

Mmmoussa

Raise tslib version to latest

Pushed On 06 Jul 2022 at 03:11:42
Merge

Mmmoussa

Add `tslib` as a dependency to fix #513

Description

Fixes #513

Without adding tslib as a dependency, errors are thrown when using onViewableItemsChanged

Reviewers’ hat-rack :tophat:

  • [ ]

Screenshots or videos (if needed)

N/A

Checklist

Forked On 06 Jul 2022 at 03:10:53

Mmmoussa

Meant to use the latest one but instead used the minimum one. I will update this.
On 06 Jul 2022 at 03:10:53

Mmmoussa

Add `tslib` as a dependency to fix #513

Description

Fixes #513

Without adding tslib as a dependency, errors are thrown when using onViewableItemsChanged

Reviewers’ hat-rack :tophat:

  • [ ]

Screenshots or videos (if needed)

N/A

Checklist

Merged On 06 Jul 2022 at 03:10:53

Mmmoussa

Commented On 06 Jul 2022 at 03:10:53

Mmmoussa

Update CHANGELOG.md

Pushed On 05 Jul 2022 at 09:31:45