diff --git a/.idea/modules.xml b/.idea/modules.xml index 58fc8a76..f95bb89a 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,8 @@ - + + diff --git a/app/build.gradle b/app/build.gradle index ece61eb2..77cfa00b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -124,10 +124,13 @@ dependencies { exclude group: 'com.android.support' }) annotationProcessor 'com.github.bumptech.glide:compiler:4.2.0' - //stor - compile 'com.pushtorefresh.storio2:sqlite:2.1.0' - compile 'com.pushtorefresh.storio2:sqlite-annotations:2.1.0' - annotationProcessor 'com.pushtorefresh.storio2:sqlite-annotations-processor:2.1.0' + //dbflow + annotationProcessor "com.github.Raizlabs.DBFlow:dbflow-processor:4.1.2" + compile "com.github.Raizlabs.DBFlow:dbflow-core:4.1.2" + compile "com.github.Raizlabs.DBFlow:dbflow:4.1.2" + compile "com.github.Raizlabs.DBFlow:dbflow-rx2:4.1.2" + //joda time + compile 'joda-time:joda-time:2.9.9' // Tasker Plugin compile 'com.twofortyfouram:android-plugin-client-sdk-for-locale:4.0.3' compile 'com.flurry.android:analytics:7.0.0@aar' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4acc57f7..f1d0dbd1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -206,8 +206,6 @@ - - @@ -224,7 +222,7 @@ - + diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index 27bbcc87..538707a4 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -1,8 +1,5 @@ package com.stardust.scriptdroid; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -15,14 +12,14 @@ import com.bumptech.glide.request.transition.Transition; import com.flurry.android.FlurryAgent; import com.nickandjerry.dynamiclayoutinflator.lib.ImageLoader; import com.nickandjerry.dynamiclayoutinflator.lib.util.Drawables; +import com.raizlabs.android.dbflow.config.FlowManager; import com.squareup.leakcanary.LeakCanary; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.autojs.key.GlobalKeyObserver; import com.stardust.scriptdroid.autojs.record.GlobalRecorder; import com.stardust.scriptdroid.network.GlideApp; -import com.stardust.scriptdroid.timing.TaskSchedulerReceiver; +import com.stardust.scriptdroid.timing.TimedTaskScheduler; import com.stardust.scriptdroid.tool.CrashHandler; -import com.stardust.scriptdroid.tool.JsBeautifierFactory; import com.stardust.scriptdroid.ui.error.ErrorReportActivity; import com.stardust.theme.ThemeColor; import com.stardust.theme.ThemeColorManager; @@ -71,14 +68,14 @@ public class App extends MultiDexApplication { } private void init() { + FlowManager.init(this); ThemeColorManager.setDefaultThemeColor(new ThemeColor(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent))); ThemeColorManager.init(this); AutoJs.initInstance(this); - JsBeautifierFactory.initJsBeautify(this, "js/jsbeautify.js"); GlobalKeyObserver.getSingleton(); GlobalRecorder.initSingleton(this); setupDrawableImageLoader(); - TaskSchedulerReceiver.setupRepeating(this); + TimedTaskScheduler.setupRepeating(this); } private void setupDrawableImageLoader() { diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java index 77fbe2e3..42200b47 100644 --- a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java @@ -1,26 +1,79 @@ package com.stardust.scriptdroid.timing; import android.content.Intent; +import android.text.format.Time; + +import com.raizlabs.android.dbflow.annotation.Column; +import com.raizlabs.android.dbflow.annotation.PrimaryKey; +import com.raizlabs.android.dbflow.annotation.Table; +import com.stardust.autojs.execution.ExecutionConfig; +import com.stardust.scriptdroid.external.ScriptIntents; + +import org.joda.time.Instant; +import org.joda.time.LocalDate; +import org.joda.time.LocalDateTime; +import org.joda.time.LocalTime; + +import java.util.Calendar; +import java.util.concurrent.TimeUnit; /** * Created by Stardust on 2017/11/27. */ - +@Table(database = TimedTaskDatabase.class) public class TimedTask { + private static final int FLAG_DISPOSABLE = 0; + public final static int FLAG_SUNDAY = 0x1; + public final static int FLAG_MONDAY = 0x2; + public final static int FLAG_TUESDAY = 0x4; + public final static int FLAG_WEDNESDAY = 0x8; + public final static int FLAG_THURSDAY = 0x10; + public final static int FLAG_FRIDAY = 0x20; + public final static int FLAG_SATURDAY = 0x40; + private static final int FLAG_EVERYDAY = 0x7F; + + @PrimaryKey(autoincrement = true) + @Column(name = "id") int mId; - boolean mDisposable; + @Column(name = "days_of_week") + int mDaysOfWeek; + @Column(name = "scheduled") boolean mScheduled; - public boolean isDisposable() { - return mDisposable; + @Column(name = "delay") + private long mDelay = 0; + + @Column(name = "interval") + private long mInterval = 0; + + @Column(name = "loop_times") + private int mLoopTimes = 1; + + @Column(name = "millis") + private long mMillis; + + @Column(name = "script_path") + private String mScriptPath; + + public TimedTask() { + } - public void setDisposable(boolean disposable) { - mDisposable = disposable; + public TimedTask(long millis, int daysOfWeek, String scriptPath, ExecutionConfig config) { + mMillis = millis; + mDaysOfWeek = daysOfWeek; + mScriptPath = scriptPath; + mDelay = config.delay; + mLoopTimes = config.loopTimes; + mInterval = config.interval; + } + + public boolean isDisposable() { + return mDaysOfWeek == FLAG_DISPOSABLE; } public boolean isScheduled() { @@ -32,7 +85,16 @@ public class TimedTask { } public long getNextTime() { - return 0; + if (isDisposable()) { + return mMillis; + } + // TODO: 2017/11/28 day of week + LocalTime time = LocalTime.fromMillisOfDay(mMillis); + long nextTimeMillis = time.toDateTimeToday().getMillis(); + if (System.currentTimeMillis() > nextTimeMillis) { + return nextTimeMillis + TimeUnit.DAYS.toMillis(1); + } + return nextTimeMillis; } public int getId() { @@ -40,6 +102,20 @@ public class TimedTask { } public Intent createIntent() { - return null; + return new Intent(TaskReceiver.ACTION_TASK) + .putExtra(TaskReceiver.EXTRA_TASK_ID, mId) + .putExtra(ScriptIntents.EXTRA_KEY_PATH, mScriptPath) + .putExtra(ScriptIntents.EXTRA_KEY_DELAY, mDelay) + .putExtra(ScriptIntents.EXTRA_KEY_LOOP_TIMES, mLoopTimes) + .putExtra(ScriptIntents.EXTRA_KEY_LOOP_INTERVAL, mInterval); } + + public static TimedTask dailyTask(LocalTime time, String scriptPath, ExecutionConfig config) { + return new TimedTask(time.getMillisOfDay(), FLAG_EVERYDAY, scriptPath, config); + } + + public static TimedTask disposableTask(long millis, String scriptPath, ExecutionConfig config) { + return new TimedTask(millis, FLAG_EVERYDAY, scriptPath, config); + } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskDatabase.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskDatabase.java new file mode 100644 index 00000000..877cf55a --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskDatabase.java @@ -0,0 +1,10 @@ +package com.stardust.scriptdroid.timing; + +import com.raizlabs.android.dbflow.annotation.Database; + +/** + * Created by Stardust on 2017/11/28. + */ +@Database(version = 1) +public class TimedTaskDatabase { +} diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java index 6556889a..59c3788b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java @@ -1,11 +1,18 @@ package com.stardust.scriptdroid.timing; -import com.pushtorefresh.storio2.sqlite.StorIOSQLite; -import com.pushtorefresh.storio2.sqlite.impl.DefaultStorIOSQLite; -import com.pushtorefresh.storio2.sqlite.queries.Query; +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; -import io.reactivex.Observable; +import com.raizlabs.android.dbflow.config.FlowManager; +import com.raizlabs.android.dbflow.rx2.language.RXSQLite; +import com.raizlabs.android.dbflow.sql.language.SQLite; +import com.raizlabs.android.dbflow.structure.ModelAdapter; + +import io.reactivex.Completable; +import io.reactivex.Flowable; +import io.reactivex.schedulers.Schedulers; /** * Created by Stardust on 2017/11/27. @@ -13,46 +20,59 @@ import io.reactivex.Observable; public class TimedTaskManager { - static final String TABLE_NAME = "timed_tasks"; - - private static TimedTaskManager sInstance = new TimedTaskManager(); - private StorIOSQLite mStorIOSQLite; + private static TimedTaskManager sInstance; + private ModelAdapter mTimedTaskModelAdapter; public static TimedTaskManager getInstance() { + if (sInstance == null) { + sInstance = new TimedTaskManager(); + } return sInstance; } public TimedTaskManager() { - /* mStorIOSQLite = DefaultStorIOSQLite.builder() - .sqliteOpenHelper() - .build();*/ + mTimedTaskModelAdapter = FlowManager.getModelAdapter(TimedTask.class); } public void notifyTaskFinished(int id) { getTaskById(id).subscribe(timedTask -> { if (timedTask.isDisposable()) { - removeTask(id); + removeTask(id).subscribe(); } else { - + timedTask.setScheduled(false); + mTimedTaskModelAdapter.update(timedTask); } }); } - private Observable getTaskById(int id) { - return null; + private Flowable getTaskById(int id) { + return RXSQLite.rx(SQLite.select() + .from(TimedTask.class) + .where(TimedTask_Table.id.is(id))) + .queryStreamResults() + .subscribeOn(Schedulers.io()); } - private void removeTask(int id) { + private Completable removeTask(int id) { + return RXSQLite.rx(SQLite.delete(TimedTaskDatabase.class) + .where(TimedTask_Table.id.is(id))) + .execute() + .subscribeOn(Schedulers.io()); + } - public Observable getAllTasks() { - return null; + public Flowable getAllTasks() { + return RXSQLite.rx(SQLite.select().from(TimedTask.class)) + .queryStreamResults() + .subscribeOn(Schedulers.io()); + } - public Observable getFutureTasksInMillis(long millis) { - long current = System.currentTimeMillis(); - return getAllTasks().filter(timedTask -> - timedTask.getNextTime() - current <= millis); + public void notifyTaskScheduled(TimedTask timedTask) { + timedTask.setScheduled(true); + mTimedTaskModelAdapter.update(timedTask); + } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskScheduler.java similarity index 55% rename from app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java rename to app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskScheduler.java index 70275580..6fadbb9e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskScheduler.java @@ -18,12 +18,13 @@ import io.reactivex.schedulers.Schedulers; * Created by Stardust on 2017/11/27. */ -public class TaskSchedulerReceiver extends BroadcastReceiver { +public class TimedTaskScheduler extends BroadcastReceiver { public static final String ACTION_CHECK_TASK = "com.stardust.autojs.action.check_task"; - private static final String LOG_TAG = "TaskSchedulerReceiver"; - private static final int REQUEST_CODE = 4056; + private static final String LOG_TAG = "TimedTaskScheduler"; + private static final int REQUEST_CODE = 4000; private static final long INTERVAL = 60 * 1000; + private static final long ONE_HOUR = TimeUnit.HOURS.toMillis(1); @Override public void onReceive(Context context, Intent intent) { @@ -33,29 +34,46 @@ public class TaskSchedulerReceiver extends BroadcastReceiver { public static void checkTasks(Context context) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); - TimedTaskManager.getInstance().getFutureTasksInMillis(TimeUnit.HOURS.toMillis(1)) + TimedTaskManager.getInstance().getAllTasks() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(timedTask -> scheduleTask(context, alarmManager, timedTask)); + .subscribe(timedTask -> scheduleTaskIfNeeded(context, alarmManager, timedTask)); } - private static void scheduleTask(Context context, AlarmManager alarmManager, TimedTask timedTask) { + public static void scheduleTaskIfNeeded(Context context, AlarmManager alarmManager, TimedTask timedTask) { long millis = timedTask.getNextTime(); + if (timedTask.isScheduled() || millis - System.currentTimeMillis() > ONE_HOUR) { + return; + } + scheduleTask(context, alarmManager, timedTask, millis); + TimedTaskManager.getInstance() + .notifyTaskScheduled(timedTask); + + } + + public static void scheduleTaskIfNeeded(Context context, TimedTask timedTask) { + scheduleTaskIfNeeded(context, (AlarmManager) context.getSystemService(Context.ALARM_SERVICE), timedTask); + } + + private static void scheduleTask(Context context, AlarmManager alarmManager, TimedTask timedTask, long millis) { + if (millis <= System.currentTimeMillis()) { + context.sendBroadcast(timedTask.createIntent()); + return; + } + // FIXME: 2017/11/28 requestCode may > 65535 PendingIntent op = PendingIntent.getBroadcast(context, REQUEST_CODE + 1 + timedTask.getId(), - timedTask.createIntent().setAction(TaskReceiver.ACTION_TASK), - PendingIntent.FLAG_UPDATE_CURRENT); + timedTask.createIntent(), PendingIntent.FLAG_UPDATE_CURRENT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarmManager.setExact(AlarmManager.RTC_WAKEUP, millis, op); } else { alarmManager.set(AlarmManager.RTC_WAKEUP, millis, op); } - } public static void setupRepeating(Context context) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, INTERVAL, PendingIntent.getBroadcast(context, REQUEST_CODE, - new Intent(TaskSchedulerReceiver.ACTION_CHECK_TASK), PendingIntent.FLAG_UPDATE_CURRENT)); + new Intent(TimedTaskScheduler.ACTION_CHECK_TASK), PendingIntent.FLAG_UPDATE_CURRENT)); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskService.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskService.java deleted file mode 100644 index 46651feb..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.stardust.scriptdroid.timing; - -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.IBinder; -import android.support.annotation.Nullable; -import android.util.Log; - -/** - * Created by Stardust on 2017/11/27. - */ - -public class TimedTaskService extends Service { - - private static final int REQUEST_CODE_CHECK_TASK = 4056; - - private AlarmManager mAlarmManager; - - @Override - public void onCreate() { - super.onCreate(); - - } - - @Nullable - @Override - public IBinder onBind(Intent intent) { - return null; - } - - @Override - public void onDestroy() { - super.onDestroy(); - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/JsBeautifierFactory.java b/app/src/main/java/com/stardust/scriptdroid/tool/JsBeautifierFactory.java deleted file mode 100644 index 9637f2a1..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/tool/JsBeautifierFactory.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.stardust.scriptdroid.tool; - -import android.annotation.SuppressLint; -import android.app.Application; - -import com.stardust.autojs.script.JsBeautifier; - -/** - * Created by Stardust on 2017/4/18. - */ - -public class JsBeautifierFactory { - - @SuppressLint("StaticFieldLeak") - private static JsBeautifier jsBeautifier; - - public static JsBeautifier getJsBeautify() { - return jsBeautifier; - } - - public static void initJsBeautify(Application context, String path) { - jsBeautifier = new JsBeautifier(context, path); - jsBeautifier.prepare(); - } -} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index 6f7aa51d..e9921989 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -26,7 +26,6 @@ import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.timing.TimedTaskService; import com.stardust.scriptdroid.ui.common.NotAskAgainDialog; import com.stardust.scriptdroid.ui.doc.OnlineDocsFragment_; import com.stardust.scriptdroid.ui.floating.FloatyWindowManger; diff --git a/autojs/build.gradle b/autojs/build.gradle index 0289e85a..90bfd864 100644 --- a/autojs/build.gradle +++ b/autojs/build.gradle @@ -22,8 +22,8 @@ android { compileOptions { - targetCompatibility 1.8 - sourceCompatibility 1.8 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } } diff --git a/automator/build.gradle b/automator/build.gradle index d3261a33..3ca16296 100644 --- a/automator/build.gradle +++ b/automator/build.gradle @@ -13,6 +13,10 @@ android { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } buildTypes { release { minifyEnabled false diff --git a/common/build.gradle b/common/build.gradle index 6ecf72d3..00d806fb 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,6 +13,7 @@ android { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } + buildTypes { release { minifyEnabled false diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2af64641..6fc53efd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Thu Oct 26 16:01:06 CST 2017 +#Mon Nov 27 21:40:02 CST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/inrt/build.gradle b/inrt/build.gradle index c1e843a0..6fd6cbbb 100644 --- a/inrt/build.gradle +++ b/inrt/build.gradle @@ -20,6 +20,10 @@ android { disable 'MissingTranslation' disable 'ExtraTranslation' } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } buildTypes { debug { minifyEnabled false