Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix memory leaks and add documentation #10394

Merged
merged 1 commit into from
Sep 19, 2023
Merged

Fix memory leaks and add documentation #10394

merged 1 commit into from
Sep 19, 2023

Conversation

TobiGr
Copy link
Member

@TobiGr TobiGr commented Aug 29, 2023

What is it?

  • Bugfix (user facing)
  • Feature (user facing)
  • Codebase improvement (dev facing)
  • Meta improvement to the project (dev facing)

Description of the changes in your PR

Fixed three memory leaks and added documentation to BaseFragment.initViews() and BaseFragment.initListeners().
The leaks were detected in the channel tabs PR APK, but also occur to the current dev version.
LeakCanary warnings for each leak:

BaseFragment
┬───
│ GC Root: Global variable in native code
│
├─ android.database.ContentObserver$Transport instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    ↓ ContentObserver$Transport.mContentObserver
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment$1 instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    Anonymous subclass of android.database.ContentObserver
│    ↓ VideoDetailFragment$1.this$0
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment instance
│    Leaking: NO (MainActivity↓ is not leaking and Fragment#mFragmentManager is
│    not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ BaseFragment.activity
├─ org.schabi.newpipe.MainActivity instance
│    Leaking: NO (BookmarkFragment↓ is not leaking and Activity#mDestroyed is
│    false)
│    mApplication instance of org.schabi.newpipe.DebugApp
│    mBase instance of androidx.appcompat.view.ContextThemeWrapper
│    ↓ ComponentActivity.mActivityResultRegistry
├─ androidx.activity.ComponentActivity$2 instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
│    this$0 instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ ActivityResultRegistry.mKeyToCallback
├─ java.util.HashMap instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓
│    HashMap["FragmentManager:a9522914-3ef2-44fa-8348-a154d73d1f3d:StartActivity
│    ForResult"]
├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
├─ androidx.fragment.app.FragmentManager$7 instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    Anonymous class implementing androidx.activity.result.
│    ActivityResultCallback
│    ↓ FragmentManager$7.this$0
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (BookmarkFragment↓ is not leaking)
│    ↓ FragmentManager.mParent
├─ org.schabi.newpipe.local.bookmark.BookmarkFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ BaseStateFragment.emptyStateView
│                        ~~~~~~~~~~~~~~
├─ android.widget.LinearLayout instance
│    Leaking: UNKNOWN
│    Retaining 4.6 kB in 62 objects
│    View not part of a window view hierarchy
│    View.mAttachInfo is null (view detached)
│    View.mID = R.id.empty_state_view
│    View.mWindowAttachCount = 1
│    mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ View.mParent
│           ~~~~~~~
╰→ android.widget.RelativeLayout instance
​     Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.
​     local.bookmark.BookmarkFragment received Fragment#onDestroyView()
​     callback (references to its views should be cleared to prevent leaks))
​     Retaining 37.2 kB in 752 objects
​     key = a2cfc288-352e-46cf-acd5-aeeb81b3543a
​     watchDurationMillis = 5653
​     retainedDurationMillis = 653
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

METADATA

Build.VERSION.SDK_INT: 33
Build.MANUFACTURER: Google
LeakCanary version: 2.12
App process name: org.schabi.newpipe.debug.channeltabs
Class count: 29937
Instance count: 302474
Primitive array count: 178526
Object array count: 46362
Thread count: 70
Heap total bytes: 39375594
Bitmap count: 37
Bitmap total bytes: 6990037
Large bitmap count: 0
Large bitmap total bytes: 0
Db 1: open /data/user/0/org.schabi.newpipe.debug.channeltabs/databases/newpipe.
db
Db 2: open /data/user/0/org.schabi.newpipe.debug.
channeltabs/databases/exoplayer_internal.db
Db 3: open /data/user/0/org.schabi.newpipe.debug.channeltabs/no_backup/androidx.
work.workdb
Stats: LruCache[maxSize=3000,hits=145229,misses=299165,hitRate=32%]
RandomAccess[bytes=16106429,reads=299165,travel=147301735717,range=44855238,size
=56086672]
Analysis duration: 8867 ms
MainFragment.binding
┬───
│ GC Root: Global variable in native code
│
├─ android.database.ContentObserver$Transport instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    ↓ ContentObserver$Transport.mContentObserver
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment$1 instance
│    Leaking: NO (VideoDetailFragment↓ is not leaking)
│    Anonymous subclass of android.database.ContentObserver
│    ↓ VideoDetailFragment$1.this$0
├─ org.schabi.newpipe.fragments.detail.VideoDetailFragment instance
│    Leaking: NO (MainFragment↓ is not leaking and Fragment#mFragmentManager is
│    not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ Fragment.mFragmentManager
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentManager.mFragmentStore
├─ androidx.fragment.app.FragmentStore instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentStore.mActive
├─ java.util.HashMap instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ HashMap["a7644fcc-e730-4ce5-a2c2-2930b43e4070"]
├─ androidx.fragment.app.FragmentStateManager instance
│    Leaking: NO (MainFragment↓ is not leaking)
│    ↓ FragmentStateManager.mFragment
├─ org.schabi.newpipe.fragments.MainFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ MainFragment.binding
│                   ~~~~~~~
├─ org.schabi.newpipe.databinding.FragmentMainBinding instance
│    Leaking: UNKNOWN
│    Retaining 35.6 kB in 675 objects
│    ↓ FragmentMainBinding.rootView
│                          ~~~~~~~~
╰→ android.widget.RelativeLayout instance
​     Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.
​     fragments.MainFragment received Fragment#onDestroyView() callback
​     (references to its views should be cleared to prevent leaks))
​     Retaining 2.5 kB in 61 objects
​     key = 7cafed14-babd-4f63-b765-2b8f8b126b51
​     watchDurationMillis = 5653
​     retainedDurationMillis = 653
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

METADATA

Build.VERSION.SDK_INT: 33
Build.MANUFACTURER: Google
LeakCanary version: 2.12
App process name: org.schabi.newpipe.debug.channeltabs
Class count: 29937
Instance count: 302474
Primitive array count: 178526
Object array count: 46362
Thread count: 70
Heap total bytes: 39375594
Bitmap count: 37
Bitmap total bytes: 6990037
Large bitmap count: 0
Large bitmap total bytes: 0
Db 1: open /data/user/0/org.schabi.newpipe.debug.channeltabs/databases/newpipe.
db
Db 2: open /data/user/0/org.schabi.newpipe.debug.
channeltabs/databases/exoplayer_internal.db
Db 3: open /data/user/0/org.schabi.newpipe.debug.channeltabs/no_backup/androidx.
work.workdb
Stats: LruCache[maxSize=3000,hits=145229,misses=299165,hitRate=32%]
RandomAccess[bytes=16106429,reads=299165,travel=147301735717,range=44855238,size
=56086672]
Analysis duration: 8867 ms
SubscriptionFragment
┬───
│ GC Root: Thread object
│
├─ android.os.HandlerThread instance
│    Leaking: NO (PathClassLoader↓ is not leaking)
│    Thread name: 'LeakCanary-Heap-Dump'
│    ↓ Thread.contextClassLoader
├─ dalvik.system.PathClassLoader instance
│    Leaking: NO (InternalLeakCanary↓ is not leaking and A ClassLoader is never
│    leaking)
│    ↓ ClassLoader.runtimeInternalObjects
├─ java.lang.Object[] array
│    Leaking: NO (InternalLeakCanary↓ is not leaking)
│    ↓ Object[22]
├─ leakcanary.internal.InternalLeakCanary class
│    Leaking: NO (MainActivity↓ is not leaking and a class is never leaking)
│    ↓ static InternalLeakCanary.resumedActivity
├─ org.schabi.newpipe.MainActivity instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking and Activity#mDestroyed
│    is false)
│    mApplication instance of org.schabi.newpipe.DebugApp
│    mBase instance of androidx.appcompat.view.ContextThemeWrapper
│    ↓ ComponentActivity.mActivityResultRegistry
├─ androidx.activity.ComponentActivity$2 instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    Anonymous subclass of androidx.activity.result.ActivityResultRegistry
│    this$0 instance of org.schabi.newpipe.MainActivity with mDestroyed = false
│    ↓ ActivityResultRegistry.mKeyToCallback
├─ java.util.HashMap instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓
│    HashMap["FragmentManager:702cd362-5180-4953-ad5e-c175b0bbae41:StartIntentSe
│    nderForResult"]
├─ androidx.activity.result.ActivityResultRegistry$CallbackAndContract instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ ActivityResultRegistry$CallbackAndContract.mCallback
├─ androidx.fragment.app.FragmentManager$8 instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    Anonymous class implementing androidx.activity.result.
│    ActivityResultCallback
│    ↓ FragmentManager$8.this$0
├─ androidx.fragment.app.FragmentManagerImpl instance
│    Leaking: NO (SubscriptionFragment↓ is not leaking)
│    ↓ FragmentManager.mParent
├─ org.schabi.newpipe.local.subscription.SubscriptionFragment instance
│    Leaking: NO (Fragment#mFragmentManager is not null)
│    activity instance of org.schabi.newpipe.MainActivity with mDestroyed =
│    false
│    ↓ SubscriptionFragment._binding
│                           ~~~~~~~~
├─ org.schabi.newpipe.databinding.FragmentSubscriptionBinding instance
│    Leaking: UNKNOWN
│    Retaining 72 B in 3 objects
│    ↓ FragmentSubscriptionBinding.rootView
│                                  ~~~~~~~~
╰→ android.widget.RelativeLayout instance
​     Leaking: YES (ObjectWatcher was watching this because org.schabi.newpipe.
​     local.subscription.SubscriptionFragment received Fragment#onDestroyView()
​     callback (references to its views should be cleared to prevent leaks))
​     Retaining 4.1 kB in 88 objects
​     key = 4e1921b2-3398-473a-a79b-53ca1fdfa44c
​     watchDurationMillis = 5557
​     retainedDurationMillis = 557
​     View not part of a window view hierarchy
​     View.mAttachInfo is null (view detached)
​     View.mWindowAttachCount = 1
​     mContext instance of org.schabi.newpipe.MainActivity with mDestroyed =
​     false

METADATA

Build.VERSION.SDK_INT: 33
Build.MANUFACTURER: Google
LeakCanary version: 2.12
App process name: org.schabi.newpipe.debug.channeltabs
Class count: 27581
Instance count: 229859
Primitive array count: 146666
Object array count: 34391
Thread count: 56
Heap total bytes: 30822107
Bitmap count: 11
Bitmap total bytes: 5314931
Large bitmap count: 0
Large bitmap total bytes: 0
Db 1: open /data/user/0/org.schabi.newpipe.debug.channeltabs/databases/newpipe.
db
Db 2: open /data/user/0/org.schabi.newpipe.debug.channeltabs/no_backup/androidx.
work.workdb
Stats: LruCache[maxSize=3000,hits=125879,misses=227557,hitRate=35%]
RandomAccess[bytes=11728626,reads=227557,travel=86156950881,range=37027951,size=
45095731]
Analysis duration: 7243 ms

Note

I sometimes get an undeliverable Exception thrown with this APK. Not sure if this is related:

Details
RxJavaPlugins.ErrorHandler called with -> : throwable = [io.reactivex.rxjava3.exceptions.UndeliverableException]
2023-08-29 19:43:01.593  4823-4859  ACRA                    org....newpipe.debug.fixmemoryleaks  E  ACRA caught a ParsingException for org.schabi.newpipe.debug.fixmemoryleaks
                                                                                                    org.schabi.newpipe.extractor.exceptions.ParsingException: Could not store JavaScript player
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.storePlayerJs(YoutubeStreamExtractor.java:1117)
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.initStsFromPlayerJsIfNeeded(YoutubeStreamExtractor.java:1185)
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.onFetchPage(YoutubeStreamExtractor.java:817)
                                                                                                    	at org.schabi.newpipe.extractor.Extractor.fetchPage(Extractor.java:60)
                                                                                                    	at org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:78)
                                                                                                    	at org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:73)
                                                                                                    	at org.schabi.newpipe.util.ExtractorHelper.lambda$getStreamInfo$3(ExtractorHelper.java:119)
                                                                                                    	at org.schabi.newpipe.util.ExtractorHelper$$ExternalSyntheticLambda8.call(Unknown Source:4)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:43)
                                                                                                    	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)
                                                                                                    	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeFromSingle.subscribeActual(MaybeFromSingle.java:41)
                                                                                                    	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5377)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.drain(MaybeConcatArray.java:153)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.request(MaybeConcatArray.java:78)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onSubscribe(FlowableElementAtMaybe.java:66)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray.subscribeActual(MaybeConcatArray.java:42)
                                                                                                    	at io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:16013)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe.subscribeActual(FlowableElementAtMaybe.java:36)
                                                                                                    	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5377)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeToSingle.subscribeActual(MaybeToSingle.java:46)
                                                                                                    	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855)
                                                                                                    	at io.reactivex.rxjava3.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
                                                                                                    	at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:644)
                                                                                                    	at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
                                                                                                    	at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
                                                                                                    	at java.util.concurrent.FutureTask.run(FutureTask.java:264)
                                                                                                    	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307)
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
                                                                                                    	at java.lang.Thread.run(Thread.java:1012)
                                                                                                    Caused by: org.schabi.newpipe.extractor.exceptions.ParsingException: Embedded info did not provide YouTube player js url
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.YoutubeJavaScriptExtractor.extractJavaScriptUrl(YoutubeJavaScriptExtractor.java:116)
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.YoutubeJavaScriptExtractor.extractJavaScriptCode(YoutubeJavaScriptExtractor.java:46)
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.YoutubeJavaScriptExtractor.extractJavaScriptCode(YoutubeJavaScriptExtractor.java:65)
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.storePlayerJs(YoutubeStreamExtractor.java:1115)
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.initStsFromPlayerJsIfNeeded(YoutubeStreamExtractor.java:1185) 
                                                                                                    	at org.schabi.newpipe.extractor.services.youtube.extractors.YoutubeStreamExtractor.onFetchPage(YoutubeStreamExtractor.java:817) 
                                                                                                    	at org.schabi.newpipe.extractor.Extractor.fetchPage(Extractor.java:60) 
                                                                                                    	at org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:78) 
                                                                                                    	at org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:73) 
                                                                                                    	at org.schabi.newpipe.util.ExtractorHelper.lambda$getStreamInfo$3(ExtractorHelper.java:119) 
                                                                                                    	at org.schabi.newpipe.util.ExtractorHelper$$ExternalSyntheticLambda8.call(Unknown Source:4) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:43) 
                                                                                                    	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35) 
                                                                                                    	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeFromSingle.subscribeActual(MaybeFromSingle.java:41) 
                                                                                                    	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5377) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.drain(MaybeConcatArray.java:153) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.request(MaybeConcatArray.java:78) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onSubscribe(FlowableElementAtMaybe.java:66) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray.subscribeActual(MaybeConcatArray.java:42) 
                                                                                                    	at io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:16013) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe.subscribeActual(FlowableElementAtMaybe.java:36) 
                                                                                                    	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5377) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.maybe.MaybeToSingle.subscribeActual(MaybeToSingle.java:46) 
                                                                                                    	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855) 
                                                                                                    	at io.reactivex.rxjava3.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89) 
                                                                                                    	at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:644) 
                                                                                                    	at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65) 
                                                                                                    	at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56) 
                                                                                                    	at java.util.concurrent.FutureTask.run(FutureTask.java:264) 
                                                                                                    	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307) 
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137) 
                                                                                                    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637) 
                                                                                                    	at java.lang.Thread.run(Thread.java:1012) 

APK testing

The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR. You can find more info and a video demonstration on this wiki page.

Due diligence

@TobiGr TobiGr added the codequality Improvements to the codebase to improve the code quality label Aug 29, 2023
@AudricV AudricV added the bug Issue is related to a bug label Aug 29, 2023
Copy link
Member

@AudricV AudricV left a comment

Choose a reason for hiding this comment

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

Thank you, your changes look good to me.

Here are some improvements on the Javadocs you added which would make them better.

app/src/main/java/org/schabi/newpipe/BaseFragment.java Outdated Show resolved Hide resolved
app/src/main/java/org/schabi/newpipe/BaseFragment.java Outdated Show resolved Hide resolved
app/src/main/java/org/schabi/newpipe/BaseFragment.java Outdated Show resolved Hide resolved
@TobiGr TobiGr requested a review from Stypox August 30, 2023 12:57
Add documentation to BaseFragment.initViews(View, Bundle) and BaseFragment.initListeners()
@sonarcloud
Copy link

sonarcloud bot commented Sep 18, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

0.0% 0.0% Coverage
0.0% 0.0% Duplication

Copy link
Member

@Stypox Stypox left a comment

Choose a reason for hiding this comment

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

Thank you!

I sometimes get an undeliverable Exception thrown with this APK. Not sure if this is related:

It's unrelated, it's a problem in the extractor

@Stypox Stypox merged commit 9e353f1 into dev Sep 19, 2023
7 of 8 checks passed
@TobiGr TobiGr deleted the fix/memory-leaks branch September 19, 2023 12:30
This was referenced Oct 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Issue is related to a bug codequality Improvements to the codebase to improve the code quality
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants