Skip to content

Conversation

TranceLove
Copy link
Collaborator

Description

Issue tracker

Fixes #1555

Automatic tests

  • Added test cases

Manual tests

  • Done

Build tasks success

Successfully running following tasks on local:

  • ./gradlew assembledebug
  • ./gradlew spotlessCheck

@TranceLove TranceLove marked this pull request as ready for review March 28, 2025 16:29
@VishnuSanal
Copy link
Member

Build test apk

@VishnuSanal VishnuSanal mentioned this pull request Apr 11, 2025
4 tasks
Copy link

The requested APKs has been built. Please find them from the artifacts section of this PR.


// Force a configuration change by rotating the screen
activityRule.activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
Thread.sleep(1000) // Give time for the rotation to complete
Copy link
Member

Choose a reason for hiding this comment

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

Is using a constant time correct here? Doesn't it depend on the speed of the device whether it crashes or not?

@EmmanuelMess
Copy link
Member

EmmanuelMess commented Apr 12, 2025

Got this when rotating after exiting the app for a bit:

2025-04-12 19:10:00.930 20736-20736 AndroidRuntime          com.amaze.filemanager.debug          E  FATAL EXCEPTION: main
                                                                                                    Process: com.amaze.filemanager.debug, PID: 20736
                                                                                                    java.lang.RuntimeException: Unable to create service leakcanary.internal.HeapAnalyzerService: android.app.MissingForegroundServiceTypeException: Starting FGS without a type  callerApp=ProcessRecord{6ce9d89 20736:com.amaze.filemanager.debug/u0a400} targetSDK=34
                                                                                                    	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4787)
                                                                                                    	at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)
                                                                                                    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2368)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:242)
                                                                                                    	at android.os.Looper.loop(Looper.java:362)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:8393)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:992)
                                                                                                    Caused by: android.app.MissingForegroundServiceTypeException: Starting FGS without a type  callerApp=ProcessRecord{6ce9d89 20736:com.amaze.filemanager.debug/u0a400} targetSDK=34
                                                                                                    	at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:53)
                                                                                                    	at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:49)
                                                                                                    	at android.os.Parcel.readParcelableInternal(Parcel.java:4892)
                                                                                                    	at android.os.Parcel.readParcelable(Parcel.java:4874)
                                                                                                    	at android.os.Parcel.createExceptionOrNull(Parcel.java:3074)
                                                                                                    	at android.os.Parcel.createException(Parcel.java:3063)
                                                                                                    	at android.os.Parcel.readException(Parcel.java:3046)
                                                                                                    	at android.os.Parcel.readException(Parcel.java:2988)
                                                                                                    	at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:7154)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at leakcanary.ServiceWatcher$install$4$2.invoke(ServiceWatcher.kt:85)
                                                                                                    	at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
                                                                                                    	at $Proxy4.setServiceForeground(Unknown Source)
                                                                                                    	at android.app.Service.startForeground(Service.java:775)
                                                                                                    	at leakcanary.internal.ForegroundService.showForegroundNotification(ForegroundService.kt:51)
                                                                                                    	at leakcanary.internal.ForegroundService.onCreate(ForegroundService.kt:33)
                                                                                                    	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4774)
                                                                                                    	at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) 
                                                                                                    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2368) 
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:242) 
                                                                                                    	at android.os.Looper.loop(Looper.java:362) 
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:8393) 
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:992) 
2025-04-12 19:10:00.937 20736-20736 ACRA                    com.amaze.filemanager.debug          E  ACRA caught a RuntimeException for com.amaze.filemanager.debug
                                                                                                    java.lang.RuntimeException: Unable to create service leakcanary.internal.HeapAnalyzerService: android.app.MissingForegroundServiceTypeException: Starting FGS without a type  callerApp=ProcessRecord{6ce9d89 20736:com.amaze.filemanager.debug/u0a400} targetSDK=34
                                                                                                    	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4787)
                                                                                                    	at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0)
                                                                                                    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2368)
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:111)
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:242)
                                                                                                    	at android.os.Looper.loop(Looper.java:362)
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:8393)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:992)
                                                                                                    Caused by: android.app.MissingForegroundServiceTypeException: Starting FGS without a type  callerApp=ProcessRecord{6ce9d89 20736:com.amaze.filemanager.debug/u0a400} targetSDK=34
                                                                                                    	at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:53)
                                                                                                    	at android.app.MissingForegroundServiceTypeException$1.createFromParcel(MissingForegroundServiceTypeException.java:49)
                                                                                                    	at android.os.Parcel.readParcelableInternal(Parcel.java:4892)
                                                                                                    	at android.os.Parcel.readParcelable(Parcel.java:4874)
                                                                                                    	at android.os.Parcel.createExceptionOrNull(Parcel.java:3074)
                                                                                                    	at android.os.Parcel.createException(Parcel.java:3063)
                                                                                                    	at android.os.Parcel.readException(Parcel.java:3046)
                                                                                                    	at android.os.Parcel.readException(Parcel.java:2988)
                                                                                                    	at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:7154)
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method)
                                                                                                    	at leakcanary.ServiceWatcher$install$4$2.invoke(ServiceWatcher.kt:85)
                                                                                                    	at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
                                                                                                    	at $Proxy4.setServiceForeground(Unknown Source)
                                                                                                    	at android.app.Service.startForeground(Service.java:775)
                                                                                                    	at leakcanary.internal.ForegroundService.showForegroundNotification(ForegroundService.kt:51)
                                                                                                    	at leakcanary.internal.ForegroundService.onCreate(ForegroundService.kt:33)
                                                                                                    	at android.app.ActivityThread.handleCreateService(ActivityThread.java:4774)
                                                                                                    	at android.app.ActivityThread.-$$Nest$mhandleCreateService(Unknown Source:0) 
                                                                                                    	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2368) 
                                                                                                    	at android.os.Handler.dispatchMessage(Handler.java:111) 
                                                                                                    	at android.os.Looper.loopOnce(Looper.java:242) 
                                                                                                    	at android.os.Looper.loop(Looper.java:362) 
                                                                                                    	at android.app.ActivityThread.main(ActivityThread.java:8393) 
                                                                                                    	at java.lang.reflect.Method.invoke(Native Method) 
                                                                                                    	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552) 
                                                                                                    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:992) 

But I think it might not be related.

@EmmanuelMess
Copy link
Member

I cannot replicate the original bug in my Moto G73, app might be going too smoothly. Will try to replicate with just the tests.

@EmmanuelMess
Copy link
Member

EmmanuelMess commented Apr 13, 2025

Okay, executing the emulator tests, I get the notifications permission request and the storage permissions popup. And the tests fail with:

androidx.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:1841)
at androidx.test.espresso.base.EspressoExceptionHandler.handleSafely(EspressoExceptionHandler.java:34)
at androidx.test.espresso.base.EspressoExceptionHandler.handleSafely(EspressoExceptionHandler.java:26)
at androidx.test.espresso.base.DefaultFailureHandler$TypedFailureHandler.handle(DefaultFailureHandler.java:158)
at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:120)
at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:385)
at androidx.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:212)
at androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:140)
at com.amaze.filemanager.ui.fragments.TabFragmentTest.testFragmentStateSavingDuringConfigChange(TabFragmentTest.kt:43)

Emulator: Pixel 9 API 34

@@ -83,7 +84,7 @@ public class TabFragment extends Fragment {
private boolean savePaths;
private FragmentManager fragmentManager;

private final List<Fragment> fragments = new ArrayList<>();
final List<Fragment> fragments = new ArrayList<>();
Copy link
Member

Choose a reason for hiding this comment

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

This should probably be public only for tests. Add @VisibleForTesting

@EmmanuelMess
Copy link
Member

For the robolectric tests, they pass both before and after the changes, which suggests it doesn't add as much new info.

@TranceLove
Copy link
Collaborator Author

For the robolectric tests, they pass both before and after the changes, which suggests it doesn't add as much new info.

Indeed, as desktop JVM generally runs faster than Dalvik. Robolectric tests are just for keeping tests at par with Espresso ones.

@TranceLove
Copy link
Collaborator Author

Okay, executing the emulator tests, I get the notifications permission request and the storage permissions popup. And the tests fail with:

androidx.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:1841)
at androidx.test.espresso.base.EspressoExceptionHandler.handleSafely(EspressoExceptionHandler.java:34)
at androidx.test.espresso.base.EspressoExceptionHandler.handleSafely(EspressoExceptionHandler.java:26)
at androidx.test.espresso.base.DefaultFailureHandler$TypedFailureHandler.handle(DefaultFailureHandler.java:158)
at androidx.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:120)
at androidx.test.espresso.ViewInteraction.waitForAndHandleInteractionResults(ViewInteraction.java:385)
at androidx.test.espresso.ViewInteraction.desugaredPerform(ViewInteraction.java:212)
at androidx.test.espresso.ViewInteraction.perform(ViewInteraction.java:140)
at com.amaze.filemanager.ui.fragments.TabFragmentTest.testFragmentStateSavingDuringConfigChange(TabFragmentTest.kt:43)

Emulator: Pixel 9 API 34

The nearest thing I can find: https://stackoverflow.com/questions/75814428/accessing-storage-from-orchestrated-espresso-test

Seems Espresso itself isn't going to do anything about this... yet.

@EmmanuelMess
Copy link
Member

@TranceLove I've added a test and a few fixes, I would approve merging as is, closing the old issue and waiting for new reports.

@EmmanuelMess EmmanuelMess self-requested a review April 16, 2025 01:46
EmmanuelMess
EmmanuelMess previously approved these changes Apr 16, 2025
@EmmanuelMess EmmanuelMess merged commit c64b2cc into TeamAmaze:release/4.0 Apr 18, 2025
3 checks passed
@EmmanuelMess EmmanuelMess deleted the bugfix/1555 branch April 18, 2025 16:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Fragment MainFragment{fb222c4} is not currently in the FragmentManager on install
3 participants