Skip to content

Commit d10bcdb

Browse files
committed
Initial setup for cleanup with JobService
Signed-off-by: Arka Prava Basu <arkaprava94@gmail.com>
1 parent 448a1fd commit d10bcdb

4 files changed

Lines changed: 106 additions & 0 deletions

File tree

build.gradle

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,8 @@ dependencies {
168168
androidTestImplementation "com.android.support.test.espresso:espresso-core:3.0.2"
169169
androidTestImplementation "com.android.support.test.espresso:espresso-intents:3.0.2"
170170
androidTestImplementation "android.arch.persistence.room:testing:1.1.1"
171+
172+
// firebase job dispatcher
173+
implementation 'com.firebase:firebase-jobdispatcher:0.8.3'
174+
implementation 'com.google.android.gms:play-services-base:16.0.1'
171175
}

src/main/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@
8282
android:name=".service.MonitorService"
8383
android:exported="false" />
8484

85+
<service android:name=".service.RemoveDeletedFilesService"
86+
android:exported="false" />
87+
8588
<meta-data
8689
android:name="DATABASE"
8790
android:value="haven.db" />

src/main/java/org/havenapp/main/ListActivity.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@
4949
import android.view.MenuItem;
5050
import android.view.View;
5151

52+
import com.firebase.jobdispatcher.Constraint;
53+
import com.firebase.jobdispatcher.FirebaseJobDispatcher;
54+
import com.firebase.jobdispatcher.GooglePlayDriver;
55+
import com.firebase.jobdispatcher.Job;
56+
import com.firebase.jobdispatcher.Lifetime;
57+
import com.firebase.jobdispatcher.RetryStrategy;
58+
import com.firebase.jobdispatcher.Trigger;
59+
import com.google.android.gms.common.GoogleApiAvailability;
5260
import com.mikepenz.aboutlibraries.Libs;
5361
import com.mikepenz.aboutlibraries.LibsBuilder;
5462

@@ -60,6 +68,7 @@
6068
import org.havenapp.main.model.Event;
6169
import org.havenapp.main.resources.IResourceManager;
6270
import org.havenapp.main.resources.ResourceManager;
71+
import org.havenapp.main.service.RemoveDeletedFilesService;
6372
import org.havenapp.main.service.SignalSender;
6473
import org.havenapp.main.ui.EventActivity;
6574
import org.havenapp.main.ui.EventAdapter;
@@ -74,6 +83,7 @@
7483
import static org.havenapp.main.database.DbConstantsKt.DB_INIT_END;
7584
import static org.havenapp.main.database.DbConstantsKt.DB_INIT_START;
7685
import static org.havenapp.main.database.DbConstantsKt.DB_INIT_STATUS;
86+
import static org.havenapp.main.service.RemoveDeletedFilesServiceKt.SERVICE_TAG;
7787

7888
public class ListActivity extends AppCompatActivity {
7989

@@ -198,6 +208,8 @@ public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
198208
initializeRecyclerViewComponents();
199209

200210
fetchEventList();
211+
212+
scheduleCleanupJob(this);
201213
}
202214

203215
private void initializeRecyclerViewComponents() {
@@ -234,6 +246,29 @@ private void fetchEventList() {
234246
}
235247
}
236248

249+
private static void scheduleCleanupJob(Context context) {
250+
if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == 0) {
251+
return;
252+
}
253+
254+
FirebaseJobDispatcher dispatcher = new
255+
FirebaseJobDispatcher(new GooglePlayDriver(context));
256+
dispatcher.mustSchedule(createJob(dispatcher));
257+
}
258+
259+
private static Job createJob(FirebaseJobDispatcher dispatcher) {
260+
return dispatcher.newJobBuilder()
261+
.setLifetime(Lifetime.FOREVER)
262+
.setService(RemoveDeletedFilesService.class)
263+
.setTag(SERVICE_TAG)
264+
.setReplaceCurrent(true)
265+
.setRecurring(true)
266+
.setTrigger(Trigger.executionWindow(0, 24 * 60 * 60))
267+
.setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
268+
.setConstraints(Constraint.ON_ANY_NETWORK, Constraint.DEVICE_CHARGING)
269+
.build();
270+
}
271+
237272
private void showEmptyState() {
238273
recyclerView.setVisibility(View.GONE);
239274
findViewById(R.id.empty_view).setVisibility(View.VISIBLE);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package org.havenapp.main.service
2+
3+
import android.util.Log
4+
import com.firebase.jobdispatcher.JobParameters
5+
import com.firebase.jobdispatcher.JobService
6+
import org.havenapp.main.PreferenceManager
7+
import org.havenapp.main.database.HavenEventDB
8+
import org.havenapp.main.model.EventTrigger
9+
import java.io.File
10+
11+
/**
12+
* A [JobService] to delete files related to deleted logs.
13+
* <p>
14+
* Created by Arka Prava Basu <arka.basu@zomato.com> on 28/10/18.
15+
*/
16+
17+
const val SERVICE_TAG = "HavenCleanupService"
18+
19+
class RemoveDeletedFilesService: JobService() {
20+
override fun onStopJob(job: JobParameters?): Boolean {
21+
Log.d(SERVICE_TAG, "Cleanup Service interrupted")
22+
return false
23+
}
24+
25+
override fun onStartJob(job: JobParameters): Boolean {
26+
Log.d(SERVICE_TAG, "Starting Cleanup Service")
27+
Thread {
28+
// remove all deleted logs from disk and reschedule this task
29+
removeDeletedLogsFromDisk()
30+
jobFinished(job, true)
31+
Log.d(SERVICE_TAG, "Stopping Cleanup service")
32+
}
33+
34+
return true
35+
}
36+
37+
private fun removeDeletedLogsFromDisk() {
38+
val database = HavenEventDB.getDatabase(this)
39+
40+
val eventList = database.getEventDAO().getAllEvent()
41+
val eventTriggerList = database.getEventTriggerDAO().getAllEventTriggers()
42+
43+
// keep a list of all invalid event triggers
44+
val inValidEventTriggerList = mutableListOf<EventTrigger>()
45+
eventTriggerList.filter { it.mEventId !in eventList.map { it.id } }.mapTo(inValidEventTriggerList) { it }
46+
47+
val currentFileList = mutableListOf<File>()
48+
val storageDir = File(PreferenceManager(this).defaultMediaStoragePath)
49+
currentFileList.addAll(storageDir.listFiles())
50+
51+
val targetFileList = mutableListOf<File>()
52+
currentFileList.filter { it.absolutePath in inValidEventTriggerList.map { it.mPath } }.mapTo(targetFileList) { it }
53+
54+
// delete these files from disk
55+
for (file in targetFileList) {
56+
file.delete()
57+
}
58+
59+
// remove entry of all invalid event triggers from database
60+
for (inValidEventTrigger in inValidEventTriggerList) {
61+
database.getEventTriggerDAO().delete(inValidEventTrigger)
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)