In Progress
Status Update
Comments
st...@deliveroo.co.uk <st...@deliveroo.co.uk> #3
This is due to a bug in Fragment - using 1.1.0-alpha02 of Preference uses a newer Fragment dependency, and fixes this issue.
da...@google.com <da...@google.com> #4
Actually, I just checked and it still crashes using 1.1.0-alpha02.
ra...@google.com <ra...@google.com> #5
Could you maybe upload a simpler project with reproduction steps? Or at least provide reproduction steps for the project you linked - Does it crash when using Preference 1.0.0?
This still seems suspiciously similar tohttps://issuetracker.google.com/issues/120240628 , which can not be reproduced with 1.1.0-alpha02 (following the reproduction steps in the first comment).
This still seems suspiciously similar to
st...@deliveroo.co.uk <st...@deliveroo.co.uk> #6
Hi guys. I can also confirm that it still crashes using preferences 1.1.0-alpha02. I ran the barebones sample project included in https://issuetracker.google.com/issues/120240628 on a Samsung Galaxy J2 Prime running Android 6.0.1.
If I use 1.0.0 version, the NPE issue will not appear. If I use any of the 1.1.0 alphas with/without fragments 1.1.0-alpha02, the NPE issue is there. This issue also exists for MultiSelectListPreference.
If I use 1.0.0 version, the NPE issue will not appear. If I use any of the 1.1.0 alphas with/without fragments 1.1.0-alpha02, the NPE issue is there. This issue also exists for MultiSelectListPreference.
st...@deliveroo.co.uk <st...@deliveroo.co.uk> #7
I also ran it on a Samsung Galaxy J4+ running Android 8.1.0, and it is the same story. There is no NPE issue using preferences 1.0.0, but using any of the 1.1.0 alphas with/without fragments 1.1.0-alpha02 will cause the NPE.
va...@gmail.com <va...@gmail.com> #8
Thanks for the further details - it appears there are two similar issues here with Fragment - one has been fixed, but there is still one that exists, causing this bug.
Apologies for the inconvenience.
Apologies for the inconvenience.
da...@google.com <da...@google.com> #9
This has been fixed and will be available in an upcoming release.
ap...@google.com <ap...@google.com> #10
@9 Which one?
ap...@google.com <ap...@google.com> #11
Both the Fragment issues and a workaround in Preference library to prevent this from happening in the future will be released.
rw...@gmail.com <rw...@gmail.com> #12
@11 I mean in which version exactly should we expect it to happen? What would be in the gradle file?
Description
Version used: 2.9.0
Devices/Android versions reproduced on: API 34
When we target API 34, WorkManager is crashing our application on startup if the "location" permissions are removed whilst the application is running.
Everything works fine whilst the application has the "location" permissions. When the "location" permissions are removed (whilst the application is running), the OS is killing the application (OS behaviour) and because SystemForegroundService is a STICKY service, the OS tries to restart the service which causes a security exception because the "location" permissions are no longer present.
This is a realistic user scenario which will happen many times in our production app. We can not prevent our application from crashing as this relates to the STICKY SystemForegroundService. Our application, can check the "location" permissions before scheduling the "worker", but we have no control over the user removing the "location" permissions after the "worker" has been scheduled by the WorkManager.
This behaviour only happens with WorkManager when targeting API 34 as per the restrictions documented here:
Here is the crash we are seeing on application startup:
Java.lang.SecurityException: Starting FGS with type location callerApp=ProcessRecord{34bbf76 32120:com.deliveroo.driverapp.test/u0a190} targetSDK=34 requires permissions: all of the permissions allOf=true [android.permission.FOREGROUND_SERVICE_LOCATION] any of the permissions allOf=false [android.permission.ACCESS_COARSE_LOCATION, android.permission.ACCESS_FINE_LOCATION] and the app must be in the eligible state/exemptions to access the foreground only permission
We are using the WorkManager to run a CoroutineWorker which accesses the device location. We are scheduling the Worker as follows:
val request = OneTimeWorkRequest.Builder(worker.java)
.setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)
.build()
WorkManager.getInstance(context).enqueueUniqueWork(
ExistingWorkPolicy.KEEP,
request,
)
We are specifying FOREGROUND_SERVICE_TYPE_LOCATION in the ForegroundInfo:
ForegroundInfo(ONLINE_NOTIFICATION_ID, notificationsManager.onlineNotification, ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION)
Our Android manifest specifies the "location" foregroundServiceType:
<service
android:name="androidx.work.impl.foreground.SystemForegroundService"
android:foregroundServiceType="location"/>
As stated above, everything works fine until the user removes the "location" permissions after the "worker" has started. Then the OS kills our application and the OS tries to recover the STICKY SystemForegroundService which crashes because the app no longer as "location" permissions.
Please can you advise how we can avoid WorkManager crashing our application in the above scenario.