Skip to content

Commit e8bab64

Browse files
author
hyb1996
committed
add: timed task
1 parent 9951ffa commit e8bab64

16 files changed

+190
-125
lines changed

.idea/modules.xml

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

+7-4
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,13 @@ dependencies {
124124
exclude group: 'com.android.support'
125125
})
126126
annotationProcessor 'com.github.bumptech.glide:compiler:4.2.0'
127-
//stor
128-
compile 'com.pushtorefresh.storio2:sqlite:2.1.0'
129-
compile 'com.pushtorefresh.storio2:sqlite-annotations:2.1.0'
130-
annotationProcessor 'com.pushtorefresh.storio2:sqlite-annotations-processor:2.1.0'
127+
//dbflow
128+
annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:4.1.2"
129+
compile "com.github.Raizlabs.DBFlow:dbflow-core:4.1.2"
130+
compile "com.github.Raizlabs.DBFlow:dbflow:4.1.2"
131+
compile "com.github.Raizlabs.DBFlow:dbflow-rx2:4.1.2"
132+
//joda time
133+
compile 'joda-time:joda-time:2.9.9'
131134
// Tasker Plugin
132135
compile 'com.twofortyfouram:android-plugin-client-sdk-for-locale:4.0.3'
133136
compile 'com.flurry.android:analytics:7.0.0@aar'

app/src/main/AndroidManifest.xml

+1-3
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,6 @@
206206
</intent-filter>
207207
</service>
208208

209-
<service android:name=".timing.TimedTaskService"/>
210-
211209
<receiver android:name=".external.widget.ScriptWidget">
212210
<intent-filter>
213211
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
@@ -224,7 +222,7 @@
224222
</intent-filter>
225223
</receiver>
226224

227-
<receiver android:name=".timing.TaskSchedulerReceiver">
225+
<receiver android:name=".timing.TimedTaskScheduler">
228226
<intent-filter>
229227
<action android:name="com.stardust.autojs.action.check_task"/>
230228
</intent-filter>

app/src/main/java/com/stardust/scriptdroid/App.java

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.stardust.scriptdroid;
22

3-
import android.app.AlarmManager;
4-
import android.app.PendingIntent;
5-
import android.content.Intent;
63
import android.graphics.Bitmap;
74
import android.graphics.drawable.Drawable;
85
import android.net.Uri;
@@ -15,14 +12,14 @@
1512
import com.flurry.android.FlurryAgent;
1613
import com.nickandjerry.dynamiclayoutinflator.lib.ImageLoader;
1714
import com.nickandjerry.dynamiclayoutinflator.lib.util.Drawables;
15+
import com.raizlabs.android.dbflow.config.FlowManager;
1816
import com.squareup.leakcanary.LeakCanary;
1917
import com.stardust.scriptdroid.autojs.AutoJs;
2018
import com.stardust.scriptdroid.autojs.key.GlobalKeyObserver;
2119
import com.stardust.scriptdroid.autojs.record.GlobalRecorder;
2220
import com.stardust.scriptdroid.network.GlideApp;
23-
import com.stardust.scriptdroid.timing.TaskSchedulerReceiver;
21+
import com.stardust.scriptdroid.timing.TimedTaskScheduler;
2422
import com.stardust.scriptdroid.tool.CrashHandler;
25-
import com.stardust.scriptdroid.tool.JsBeautifierFactory;
2623
import com.stardust.scriptdroid.ui.error.ErrorReportActivity;
2724
import com.stardust.theme.ThemeColor;
2825
import com.stardust.theme.ThemeColorManager;
@@ -71,14 +68,14 @@ private void setUpDebugEnvironment() {
7168
}
7269

7370
private void init() {
71+
FlowManager.init(this);
7472
ThemeColorManager.setDefaultThemeColor(new ThemeColor(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent)));
7573
ThemeColorManager.init(this);
7674
AutoJs.initInstance(this);
77-
JsBeautifierFactory.initJsBeautify(this, "js/jsbeautify.js");
7875
GlobalKeyObserver.getSingleton();
7976
GlobalRecorder.initSingleton(this);
8077
setupDrawableImageLoader();
81-
TaskSchedulerReceiver.setupRepeating(this);
78+
TimedTaskScheduler.setupRepeating(this);
8279
}
8380

8481
private void setupDrawableImageLoader() {
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,79 @@
11
package com.stardust.scriptdroid.timing;
22

33
import android.content.Intent;
4+
import android.text.format.Time;
5+
6+
import com.raizlabs.android.dbflow.annotation.Column;
7+
import com.raizlabs.android.dbflow.annotation.PrimaryKey;
8+
import com.raizlabs.android.dbflow.annotation.Table;
9+
import com.stardust.autojs.execution.ExecutionConfig;
10+
import com.stardust.scriptdroid.external.ScriptIntents;
11+
12+
import org.joda.time.Instant;
13+
import org.joda.time.LocalDate;
14+
import org.joda.time.LocalDateTime;
15+
import org.joda.time.LocalTime;
16+
17+
import java.util.Calendar;
18+
import java.util.concurrent.TimeUnit;
419

520

621
/**
722
* Created by Stardust on 2017/11/27.
823
*/
9-
24+
@Table(database = TimedTaskDatabase.class)
1025
public class TimedTask {
1126

27+
private static final int FLAG_DISPOSABLE = 0;
28+
public final static int FLAG_SUNDAY = 0x1;
29+
public final static int FLAG_MONDAY = 0x2;
30+
public final static int FLAG_TUESDAY = 0x4;
31+
public final static int FLAG_WEDNESDAY = 0x8;
32+
public final static int FLAG_THURSDAY = 0x10;
33+
public final static int FLAG_FRIDAY = 0x20;
34+
public final static int FLAG_SATURDAY = 0x40;
35+
private static final int FLAG_EVERYDAY = 0x7F;
36+
37+
@PrimaryKey(autoincrement = true)
38+
@Column(name = "id")
1239
int mId;
1340

14-
boolean mDisposable;
41+
@Column(name = "days_of_week")
42+
int mDaysOfWeek;
1543

44+
@Column(name = "scheduled")
1645
boolean mScheduled;
1746

18-
public boolean isDisposable() {
19-
return mDisposable;
47+
@Column(name = "delay")
48+
private long mDelay = 0;
49+
50+
@Column(name = "interval")
51+
private long mInterval = 0;
52+
53+
@Column(name = "loop_times")
54+
private int mLoopTimes = 1;
55+
56+
@Column(name = "millis")
57+
private long mMillis;
58+
59+
@Column(name = "script_path")
60+
private String mScriptPath;
61+
62+
public TimedTask() {
63+
2064
}
2165

22-
public void setDisposable(boolean disposable) {
23-
mDisposable = disposable;
66+
public TimedTask(long millis, int daysOfWeek, String scriptPath, ExecutionConfig config) {
67+
mMillis = millis;
68+
mDaysOfWeek = daysOfWeek;
69+
mScriptPath = scriptPath;
70+
mDelay = config.delay;
71+
mLoopTimes = config.loopTimes;
72+
mInterval = config.interval;
73+
}
74+
75+
public boolean isDisposable() {
76+
return mDaysOfWeek == FLAG_DISPOSABLE;
2477
}
2578

2679
public boolean isScheduled() {
@@ -32,14 +85,37 @@ public void setScheduled(boolean scheduled) {
3285
}
3386

3487
public long getNextTime() {
35-
return 0;
88+
if (isDisposable()) {
89+
return mMillis;
90+
}
91+
// TODO: 2017/11/28 day of week
92+
LocalTime time = LocalTime.fromMillisOfDay(mMillis);
93+
long nextTimeMillis = time.toDateTimeToday().getMillis();
94+
if (System.currentTimeMillis() > nextTimeMillis) {
95+
return nextTimeMillis + TimeUnit.DAYS.toMillis(1);
96+
}
97+
return nextTimeMillis;
3698
}
3799

38100
public int getId() {
39101
return mId;
40102
}
41103

42104
public Intent createIntent() {
43-
return null;
105+
return new Intent(TaskReceiver.ACTION_TASK)
106+
.putExtra(TaskReceiver.EXTRA_TASK_ID, mId)
107+
.putExtra(ScriptIntents.EXTRA_KEY_PATH, mScriptPath)
108+
.putExtra(ScriptIntents.EXTRA_KEY_DELAY, mDelay)
109+
.putExtra(ScriptIntents.EXTRA_KEY_LOOP_TIMES, mLoopTimes)
110+
.putExtra(ScriptIntents.EXTRA_KEY_LOOP_INTERVAL, mInterval);
44111
}
112+
113+
public static TimedTask dailyTask(LocalTime time, String scriptPath, ExecutionConfig config) {
114+
return new TimedTask(time.getMillisOfDay(), FLAG_EVERYDAY, scriptPath, config);
115+
}
116+
117+
public static TimedTask disposableTask(long millis, String scriptPath, ExecutionConfig config) {
118+
return new TimedTask(millis, FLAG_EVERYDAY, scriptPath, config);
119+
}
120+
45121
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.stardust.scriptdroid.timing;
2+
3+
import com.raizlabs.android.dbflow.annotation.Database;
4+
5+
/**
6+
* Created by Stardust on 2017/11/28.
7+
*/
8+
@Database(version = 1)
9+
public class TimedTaskDatabase {
10+
}
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,78 @@
11
package com.stardust.scriptdroid.timing;
22

33

4-
import com.pushtorefresh.storio2.sqlite.StorIOSQLite;
5-
import com.pushtorefresh.storio2.sqlite.impl.DefaultStorIOSQLite;
6-
import com.pushtorefresh.storio2.sqlite.queries.Query;
4+
import android.content.Context;
5+
import android.database.sqlite.SQLiteDatabase;
6+
import android.database.sqlite.SQLiteOpenHelper;
77

8-
import io.reactivex.Observable;
8+
import com.raizlabs.android.dbflow.config.FlowManager;
9+
import com.raizlabs.android.dbflow.rx2.language.RXSQLite;
10+
import com.raizlabs.android.dbflow.sql.language.SQLite;
11+
import com.raizlabs.android.dbflow.structure.ModelAdapter;
12+
13+
import io.reactivex.Completable;
14+
import io.reactivex.Flowable;
15+
import io.reactivex.schedulers.Schedulers;
916

1017
/**
1118
* Created by Stardust on 2017/11/27.
1219
*/
1320

1421
public class TimedTaskManager {
1522

16-
static final String TABLE_NAME = "timed_tasks";
17-
18-
private static TimedTaskManager sInstance = new TimedTaskManager();
19-
private StorIOSQLite mStorIOSQLite;
23+
private static TimedTaskManager sInstance;
24+
private ModelAdapter<TimedTask> mTimedTaskModelAdapter;
2025

2126
public static TimedTaskManager getInstance() {
27+
if (sInstance == null) {
28+
sInstance = new TimedTaskManager();
29+
}
2230
return sInstance;
2331
}
2432

2533
public TimedTaskManager() {
26-
/* mStorIOSQLite = DefaultStorIOSQLite.builder()
27-
.sqliteOpenHelper()
28-
.build();*/
34+
mTimedTaskModelAdapter = FlowManager.getModelAdapter(TimedTask.class);
2935
}
3036

3137
public void notifyTaskFinished(int id) {
3238
getTaskById(id).subscribe(timedTask -> {
3339
if (timedTask.isDisposable()) {
34-
removeTask(id);
40+
removeTask(id).subscribe();
3541
} else {
36-
42+
timedTask.setScheduled(false);
43+
mTimedTaskModelAdapter.update(timedTask);
3744
}
3845
});
3946
}
4047

41-
private Observable<TimedTask> getTaskById(int id) {
42-
return null;
48+
private Flowable<TimedTask> getTaskById(int id) {
49+
return RXSQLite.rx(SQLite.select()
50+
.from(TimedTask.class)
51+
.where(TimedTask_Table.id.is(id)))
52+
.queryStreamResults()
53+
.subscribeOn(Schedulers.io());
4354
}
4455

45-
private void removeTask(int id) {
56+
private Completable removeTask(int id) {
57+
return RXSQLite.rx(SQLite.delete(TimedTaskDatabase.class)
58+
.where(TimedTask_Table.id.is(id)))
59+
.execute()
60+
.subscribeOn(Schedulers.io());
61+
4662
}
4763

4864

49-
public Observable<TimedTask> getAllTasks() {
50-
return null;
65+
public Flowable<TimedTask> getAllTasks() {
66+
return RXSQLite.rx(SQLite.select().from(TimedTask.class))
67+
.queryStreamResults()
68+
.subscribeOn(Schedulers.io());
69+
5170
}
5271

53-
public Observable<TimedTask> getFutureTasksInMillis(long millis) {
54-
long current = System.currentTimeMillis();
55-
return getAllTasks().filter(timedTask ->
56-
timedTask.getNextTime() - current <= millis);
72+
public void notifyTaskScheduled(TimedTask timedTask) {
73+
timedTask.setScheduled(true);
74+
mTimedTaskModelAdapter.update(timedTask);
75+
5776
}
77+
5878
}

app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskScheduler.java

+28-10
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@
1818
* Created by Stardust on 2017/11/27.
1919
*/
2020

21-
public class TaskSchedulerReceiver extends BroadcastReceiver {
21+
public class TimedTaskScheduler extends BroadcastReceiver {
2222

2323
public static final String ACTION_CHECK_TASK = "com.stardust.autojs.action.check_task";
24-
private static final String LOG_TAG = "TaskSchedulerReceiver";
25-
private static final int REQUEST_CODE = 4056;
24+
private static final String LOG_TAG = "TimedTaskScheduler";
25+
private static final int REQUEST_CODE = 4000;
2626
private static final long INTERVAL = 60 * 1000;
27+
private static final long ONE_HOUR = TimeUnit.HOURS.toMillis(1);
2728

2829
@Override
2930
public void onReceive(Context context, Intent intent) {
@@ -33,29 +34,46 @@ public void onReceive(Context context, Intent intent) {
3334

3435
public static void checkTasks(Context context) {
3536
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
36-
TimedTaskManager.getInstance().getFutureTasksInMillis(TimeUnit.HOURS.toMillis(1))
37+
TimedTaskManager.getInstance().getAllTasks()
3738
.subscribeOn(Schedulers.io())
3839
.observeOn(AndroidSchedulers.mainThread())
39-
.subscribe(timedTask -> scheduleTask(context, alarmManager, timedTask));
40+
.subscribe(timedTask -> scheduleTaskIfNeeded(context, alarmManager, timedTask));
4041
}
4142

42-
private static void scheduleTask(Context context, AlarmManager alarmManager, TimedTask timedTask) {
43+
public static void scheduleTaskIfNeeded(Context context, AlarmManager alarmManager, TimedTask timedTask) {
4344
long millis = timedTask.getNextTime();
45+
if (timedTask.isScheduled() || millis - System.currentTimeMillis() > ONE_HOUR) {
46+
return;
47+
}
48+
scheduleTask(context, alarmManager, timedTask, millis);
49+
TimedTaskManager.getInstance()
50+
.notifyTaskScheduled(timedTask);
51+
52+
}
53+
54+
public static void scheduleTaskIfNeeded(Context context, TimedTask timedTask) {
55+
scheduleTaskIfNeeded(context, (AlarmManager) context.getSystemService(Context.ALARM_SERVICE), timedTask);
56+
}
57+
58+
private static void scheduleTask(Context context, AlarmManager alarmManager, TimedTask timedTask, long millis) {
59+
if (millis <= System.currentTimeMillis()) {
60+
context.sendBroadcast(timedTask.createIntent());
61+
return;
62+
}
63+
// FIXME: 2017/11/28 requestCode may > 65535
4464
PendingIntent op = PendingIntent.getBroadcast(context, REQUEST_CODE + 1 + timedTask.getId(),
45-
timedTask.createIntent().setAction(TaskReceiver.ACTION_TASK),
46-
PendingIntent.FLAG_UPDATE_CURRENT);
65+
timedTask.createIntent(), PendingIntent.FLAG_UPDATE_CURRENT);
4766
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
4867
alarmManager.setExact(AlarmManager.RTC_WAKEUP, millis, op);
4968
} else {
5069
alarmManager.set(AlarmManager.RTC_WAKEUP, millis, op);
5170
}
52-
5371
}
5472

5573
public static void setupRepeating(Context context) {
5674
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
5775
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000,
5876
INTERVAL, PendingIntent.getBroadcast(context, REQUEST_CODE,
59-
new Intent(TaskSchedulerReceiver.ACTION_CHECK_TASK), PendingIntent.FLAG_UPDATE_CURRENT));
77+
new Intent(TimedTaskScheduler.ACTION_CHECK_TASK), PendingIntent.FLAG_UPDATE_CURRENT));
6078
}
6179
}

0 commit comments

Comments
 (0)