Skip to content
This repository was archived by the owner on Jan 10, 2024. It is now read-only.

Commit 33bf492

Browse files
JobIntentService replacement with WorkManager (#1588)
* replace geofencing JobIntentService with workmanager * Finish changing all jobIntentServices into Workers * removal of old files * remove services from manifest * remove startservice calls, use workmanager methods --------- Co-authored-by: Frank Elsinga <frank@elsinga.de>
1 parent 0c8e525 commit 33bf492

File tree

13 files changed

+180
-182
lines changed

13 files changed

+180
-182
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -506,17 +506,9 @@
506506
</intent-filter>
507507
</receiver>
508508

509-
<service
510-
android:name=".service.SilenceService"
511-
android:exported="false"
512-
android:permission="android.permission.BIND_JOB_SERVICE" />
513509
<service
514510
android:name=".service.ScanResultsAvailableReceiver$NeverShowAgainService"
515511
android:exported="false" />
516-
<service
517-
android:name=".service.QueryLocationsService"
518-
android:exported="false"
519-
android:permission="android.permission.BIND_JOB_SERVICE" />
520512
<service
521513
android:name=".service.FcmReceiverService"
522514
android:enabled="true"
@@ -526,9 +518,6 @@
526518
<action android:name="com.google.firebase.MESSAGING_EVENT" />
527519
</intent-filter>
528520
</service>
529-
<service
530-
android:name=".service.GeofencingRegistrationService"
531-
android:permission="android.permission.BIND_JOB_SERVICE" />
532521

533522
<receiver android:name=".service.GeofencingUpdateReceiver" />
534523
<receiver android:name=".service.GeofencingStartupReceiver"

app/src/main/java/de/tum/in/tumcampusapp/component/other/settings/SettingsFragment.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import de.tum.`in`.tumcampusapp.component.ui.news.NewsController
3131
import de.tum.`in`.tumcampusapp.component.ui.onboarding.StartupActivity
3232
import de.tum.`in`.tumcampusapp.database.TcaDb
3333
import de.tum.`in`.tumcampusapp.di.injector
34-
import de.tum.`in`.tumcampusapp.service.SilenceService
34+
import de.tum.`in`.tumcampusapp.service.SilenceWorker
3535
import de.tum.`in`.tumcampusapp.service.StartSyncReceiver
3636
import de.tum.`in`.tumcampusapp.utils.Const
3737
import de.tum.`in`.tumcampusapp.utils.Utils
@@ -183,19 +183,19 @@ class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceClic
183183
// If the silent mode was activated, start the service. This will invoke
184184
// the service to call onHandleIntent which checks available lectures
185185
if (key == Const.SILENCE_SERVICE) {
186-
val service = Intent(requireContext(), SilenceService::class.java)
186+
val service = Intent(requireContext(), SilenceWorker::class.java)
187187
if (sharedPrefs.getBoolean(key, false)) {
188-
if (!SilenceService.hasPermissions(requireContext())) {
188+
if (!SilenceWorker.hasPermissions(requireContext())) {
189189
// disable until silence service permission is resolved
190190
val silenceSwitch = findPreference(Const.SILENCE_SERVICE) as SwitchPreferenceCompat
191191
silenceSwitch.isChecked = false
192192
Utils.setSetting(requireContext(), Const.SILENCE_SERVICE, false)
193-
SilenceService.requestPermissions(requireContext())
193+
SilenceWorker.requestPermissions(requireContext())
194194
} else {
195-
requireContext().startService(service)
195+
SilenceWorker.enqueueWork(requireContext())
196196
}
197197
} else {
198-
requireContext().stopService(service)
198+
SilenceWorker.dequeueWork(requireContext())
199199
}
200200
}
201201

app/src/main/java/de/tum/in/tumcampusapp/component/tumui/calendar/CalendarFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import de.tum.`in`.tumcampusapp.component.tumui.calendar.model.EventsResponse
2929
import de.tum.`in`.tumcampusapp.component.ui.transportation.TransportController
3030
import de.tum.`in`.tumcampusapp.database.TcaDb
3131
import de.tum.`in`.tumcampusapp.databinding.FragmentCalendarBinding
32-
import de.tum.`in`.tumcampusapp.service.QueryLocationsService
32+
import de.tum.`in`.tumcampusapp.service.QueryLocationWorker
3333
import de.tum.`in`.tumcampusapp.utils.*
3434
import io.reactivex.Completable
3535
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -193,7 +193,7 @@ class CalendarFragment :
193193
private fun onCalendarImportedIntoDatabase() {
194194
// Update the action bar to display the enabled menu options
195195
requireActivity().invalidateOptionsMenu()
196-
QueryLocationsService.enqueueWork(requireContext())
196+
QueryLocationWorker.enqueueWork(requireContext())
197197
}
198198

199199
private fun scheduleNotifications(events: List<Event>) {

app/src/main/java/de/tum/in/tumcampusapp/component/ui/onboarding/OnboardingExtrasFragment.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import de.tum.`in`.tumcampusapp.component.ui.chat.model.ChatMember
1818
import de.tum.`in`.tumcampusapp.component.ui.onboarding.di.OnboardingComponent
1919
import de.tum.`in`.tumcampusapp.component.ui.onboarding.di.OnboardingComponentProvider
2020
import de.tum.`in`.tumcampusapp.databinding.FragmentOnboardingExtrasBinding
21-
import de.tum.`in`.tumcampusapp.service.SilenceService
21+
import de.tum.`in`.tumcampusapp.service.SilenceWorker
2222
import de.tum.`in`.tumcampusapp.utils.CacheManager
2323
import de.tum.`in`.tumcampusapp.utils.Const
2424
import de.tum.`in`.tumcampusapp.utils.NetUtils
@@ -69,8 +69,8 @@ class OnboardingExtrasFragment : FragmentForLoadingInBackground<ChatMember>(
6969
silentModeCheckBox.isChecked =
7070
Utils.getSettingBool(requireContext(), Const.SILENCE_SERVICE, false)
7171
silentModeCheckBox.setOnCheckedChangeListener { _, isChecked ->
72-
if (isChecked && !SilenceService.hasPermissions(requireContext())) {
73-
SilenceService.requestPermissions(requireContext())
72+
if (isChecked && !SilenceWorker.hasPermissions(requireContext())) {
73+
SilenceWorker.requestPermissions(requireContext())
7474
silentModeCheckBox.isChecked = false
7575
}
7676
}

app/src/main/java/de/tum/in/tumcampusapp/component/ui/overview/MainFragment.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package de.tum.`in`.tumcampusapp.component.ui.overview
22

33
import android.content.Context
4-
import android.content.Intent
54
import android.graphics.Color
65
import android.net.ConnectivityManager
76
import android.net.Network
@@ -26,7 +25,7 @@ import de.tum.`in`.tumcampusapp.databinding.FragmentMainBinding
2625
import de.tum.`in`.tumcampusapp.di.ViewModelFactory
2726
import de.tum.`in`.tumcampusapp.di.injector
2827
import de.tum.`in`.tumcampusapp.service.DownloadWorker
29-
import de.tum.`in`.tumcampusapp.service.SilenceService
28+
import de.tum.`in`.tumcampusapp.service.SilenceWorker
3029
import de.tum.`in`.tumcampusapp.utils.Const
3130
import de.tum.`in`.tumcampusapp.utils.NetUtils
3231
import de.tum.`in`.tumcampusapp.utils.Utils
@@ -96,9 +95,8 @@ class MainFragment : BaseFragment<Unit>(
9695
ItemTouchHelper(ItemTouchHelperCallback()).attachToRecyclerView(cardsRecyclerView)
9796
}
9897

99-
// Start silence Service (if already started it will just invoke a check)
100-
val service = Intent(requireContext(), SilenceService::class.java)
101-
requireContext().startService(service)
98+
// Enqueue a request for the silence worker (if already started it will just invoke a check)
99+
SilenceWorker.enqueueWork(requireContext())
102100

103101
viewModel.cards.observe(viewLifecycleOwner) {
104102
it?.let { onNewCardsAvailable(it) }
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package de.tum.`in`.tumcampusapp.service
2+
3+
import android.Manifest
4+
import android.annotation.SuppressLint
5+
import android.app.PendingIntent
6+
import android.content.Context
7+
import android.content.Intent
8+
import android.content.pm.PackageManager
9+
import androidx.core.content.ContextCompat
10+
import androidx.work.Data
11+
import androidx.work.OneTimeWorkRequestBuilder
12+
import androidx.work.WorkRequest
13+
import androidx.work.Worker
14+
import androidx.work.WorkerParameters
15+
import com.google.android.gms.location.Geofence
16+
import com.google.android.gms.location.GeofencingClient
17+
import com.google.android.gms.location.GeofencingRequest
18+
import com.google.android.gms.location.LocationServices
19+
import de.tum.`in`.tumcampusapp.utils.Const
20+
import de.tum.`in`.tumcampusapp.utils.Utils
21+
22+
class GeoFencingRegistrationWorker(appContext: Context, workerParams: WorkerParameters) :
23+
Worker(appContext, workerParams) {
24+
25+
private lateinit var locationClient: GeofencingClient
26+
27+
private fun isLocationPermissionGranted(): Boolean {
28+
return ContextCompat.checkSelfPermission(
29+
applicationContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
30+
}
31+
32+
@SuppressLint("MissingPermission")
33+
override fun doWork(): Result {
34+
locationClient = LocationServices.getGeofencingClient(applicationContext)
35+
36+
Utils.log("Geo fencing service worker started …")
37+
if (!isLocationPermissionGranted()) {
38+
return Result.failure()
39+
}
40+
// get the data to create the Geofence request
41+
val id = inputData.getString(Const.ADD_GEOFENCE_ID) ?: return Result.failure()
42+
val latitude = inputData.getDouble(Const.ADD_GEOFENCE_LAT, 48.137430)
43+
val longitude = inputData.getDouble(Const.ADD_GEOFENCE_LON, 11.575490)
44+
val range = inputData.getFloat(Const.ADD_GEOFENCE_RANGE, 50_000f)
45+
46+
// build request
47+
val geofence = Geofence.Builder()
48+
.setRequestId(id)
49+
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT)
50+
.setCircularRegion(latitude, longitude, range)
51+
.setExpirationDuration(Geofence.NEVER_EXPIRE)
52+
.build()
53+
54+
val geofencingRequest = GeofencingRequest.Builder()
55+
.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER or GeofencingRequest.INITIAL_TRIGGER_EXIT)
56+
.addGeofences(arrayListOf(geofence))
57+
.build()
58+
59+
val geofenceIntent = Intent(applicationContext, GeofencingUpdateReceiver::class.java)
60+
val geofencePendingIntent = PendingIntent.getBroadcast(
61+
applicationContext, 0, geofenceIntent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
62+
63+
locationClient.addGeofences(geofencingRequest, geofencePendingIntent)
64+
Utils.log("Registered new Geofence")
65+
// Indicate whether the work finished successfully with the Result*/
66+
return Result.success()
67+
}
68+
69+
companion object {
70+
71+
/**
72+
* Helper method for creating an intent containing a geofencing request
73+
*/
74+
fun buildGeofence(id: String, latitude: Double, longitude: Double, range: Float): WorkRequest {
75+
val data = Data.Builder()
76+
.putString(Const.ADD_GEOFENCE_ID, id)
77+
.putDouble(Const.ADD_GEOFENCE_LAT, latitude)
78+
.putDouble(Const.ADD_GEOFENCE_LON, longitude)
79+
.putFloat(Const.ADD_GEOFENCE_RANGE, range)
80+
.build()
81+
82+
return OneTimeWorkRequestBuilder<GeoFencingRegistrationWorker>()
83+
.setInputData(data)
84+
.build()
85+
}
86+
}
87+
}

app/src/main/java/de/tum/in/tumcampusapp/service/GeofencingRegistrationService.kt

Lines changed: 0 additions & 82 deletions
This file was deleted.

app/src/main/java/de/tum/in/tumcampusapp/service/GeofencingStartupReceiver.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package de.tum.`in`.tumcampusapp.service
33
import android.content.BroadcastReceiver
44
import android.content.Context
55
import android.content.Intent
6+
import androidx.work.WorkManager
67
import de.tum.`in`.tumcampusapp.utils.Const.DISTANCE_IN_METER
78
import de.tum.`in`.tumcampusapp.utils.Const.MUNICH_GEOFENCE
89
import de.tum.`in`.tumcampusapp.utils.Utils
@@ -16,9 +17,10 @@ class GeofencingStartupReceiver : BroadcastReceiver() {
1617

1718
Utils.log("Restarting geofencing due to " + intent?.action)
1819
context?.let {
19-
val geofencingIntent = GeofencingRegistrationService.buildGeofence(it, MUNICH_GEOFENCE,
20+
val geofencingWorker = GeoFencingRegistrationWorker.buildGeofence(MUNICH_GEOFENCE,
2021
48.137430, 11.575490, DISTANCE_IN_METER)
21-
GeofencingRegistrationService.startGeofencing(it, geofencingIntent)
22+
val workManager = WorkManager.getInstance(context)
23+
workManager.enqueue(geofencingWorker)
2224
}
2325
}
2426

@@ -28,4 +30,4 @@ class GeofencingStartupReceiver : BroadcastReceiver() {
2830
intent.action == "android.intent.action.QUICKBOOT_POWERON" ||
2931
intent.action == "android.location.PROVIDERS_CHANGED")
3032
}
31-
}
33+
}

0 commit comments

Comments
 (0)