feat(app): add intent task

This commit is contained in:
hyb1996
2018-09-13 22:27:03 +08:00
parent 57960bd30b
commit 9a5f6f014c
11 changed files with 201 additions and 8 deletions

View File

@@ -8,8 +8,8 @@ android {
applicationId "org.autojs.autojs" applicationId "org.autojs.autojs"
minSdkVersion 17 minSdkVersion 17
targetSdkVersion 23 targetSdkVersion 23
versionCode 412 versionCode 413
versionName "4.0.2 Alpha7" versionName "4.0.2 Alpha8"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true multiDexEnabled true
ndk { ndk {

View File

@@ -13,8 +13,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.SET_ALARM"/> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<!-- 非Auto.js运行必需不会主动申请某些脚本可以自行申请--> <!-- 非Auto.js运行必需不会主动申请某些脚本可以自行申请-->
@@ -132,6 +131,13 @@
</intent-filter> </intent-filter>
</activity-alias> </activity-alias>
<receiver android:name="org.autojs.autojs.external.boot.BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
<receiver <receiver
android:name=".external.tasker.FireSettingReceiver" android:name=".external.tasker.FireSettingReceiver"
android:exported="true" android:exported="true"

View File

@@ -18,13 +18,16 @@ import com.raizlabs.android.dbflow.runtime.DirectModelNotifier;
import com.stardust.app.GlobalAppContext; import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.core.ui.inflater.ImageLoader; import com.stardust.autojs.core.ui.inflater.ImageLoader;
import com.stardust.autojs.core.ui.inflater.util.Drawables; import com.stardust.autojs.core.ui.inflater.util.Drawables;
import org.autojs.autojs.autojs.AutoJs; import org.autojs.autojs.autojs.AutoJs;
import org.autojs.autojs.autojs.key.GlobalKeyObserver; import org.autojs.autojs.autojs.key.GlobalKeyObserver;
import org.autojs.autojs.network.GlideApp; import org.autojs.autojs.network.GlideApp;
import org.autojs.autojs.storage.database.IntentTaskDatabase;
import org.autojs.autojs.storage.database.TimedTaskDatabase; import org.autojs.autojs.storage.database.TimedTaskDatabase;
import org.autojs.autojs.timing.TimedTaskScheduler; import org.autojs.autojs.timing.TimedTaskScheduler;
import org.autojs.autojs.tool.CrashHandler; import org.autojs.autojs.tool.CrashHandler;
import org.autojs.autojs.ui.error.ErrorReportActivity; import org.autojs.autojs.ui.error.ErrorReportActivity;
import com.stardust.theme.ThemeColor; import com.stardust.theme.ThemeColor;
import com.stardust.theme.ThemeColorManager; import com.stardust.theme.ThemeColorManager;
import com.tencent.bugly.Bugly; import com.tencent.bugly.Bugly;
@@ -83,6 +86,9 @@ public class App extends MultiDexApplication {
.addDatabaseConfig(DatabaseConfig.builder(TimedTaskDatabase.class) .addDatabaseConfig(DatabaseConfig.builder(TimedTaskDatabase.class)
.modelNotifier(DirectModelNotifier.get()) .modelNotifier(DirectModelNotifier.get())
.build()) .build())
.addDatabaseConfig(DatabaseConfig.builder(IntentTaskDatabase.class)
.modelNotifier(DirectModelNotifier.get())
.build())
.build()); .build());
ThemeColorManager.setDefaultThemeColor(new ThemeColor(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent))); ThemeColorManager.setDefaultThemeColor(new ThemeColor(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent)));
ThemeColorManager.init(this); ThemeColorManager.init(this);

View File

@@ -0,0 +1,42 @@
package org.autojs.autojs.external.boot;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.stardust.autojs.execution.ExecutionConfig;
import org.autojs.autojs.autojs.AutoJs;
import org.autojs.autojs.model.script.ScriptFile;
import org.autojs.autojs.timing.IntentTask;
import org.autojs.autojs.timing.TimedTaskManager;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
public class BootCompleteReceiver extends BroadcastReceiver {
private static final String LOG_TAG = "BootCompleteReceiver";
@SuppressLint("CheckResult")
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Log.i(LOG_TAG, "on boot complete");
TimedTaskManager.getInstance().getIntentTaskOfAction(intent.getAction())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(intentTask -> runTask(context, intent, intentTask), Throwable::printStackTrace);
}
}
private void runTask(Context context, Intent intent, IntentTask task) {
ScriptFile file = new ScriptFile(task.getScriptPath());
ExecutionConfig config = new ExecutionConfig();
config.setArgument("intent", intent.clone());
config.executePath(file.getParent());
AutoJs.getInstance().getScriptEngineService().execute(file.toSource(), config);
}
}

View File

@@ -0,0 +1,7 @@
package org.autojs.autojs.storage.database;
import com.raizlabs.android.dbflow.annotation.Database;
@Database(version = 1)
public class IntentTaskDatabase {
}

View File

@@ -0,0 +1,90 @@
package org.autojs.autojs.timing;
import android.content.IntentFilter;
import com.raizlabs.android.dbflow.annotation.Column;
import com.raizlabs.android.dbflow.annotation.NotNull;
import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
import org.autojs.autojs.storage.database.IntentTaskDatabase;
import org.autojs.autojs.storage.database.TimedTaskDatabase;
@Table(database = IntentTaskDatabase.class)
public class IntentTask {
@PrimaryKey(autoincrement = true, quickCheckAutoIncrement = true)
@Column(name = "id")
int mId = -1;
@NotNull
@Column(name = "script_path")
String mScriptPath;
@Column(name = "action")
String mAction;
@Column(name = "category")
String mCategory;
@Column(name = "data_type")
String mDataType;
public IntentFilter getIntentFilter() {
IntentFilter filter = new IntentFilter();
if (mAction != null) {
filter.addAction(mAction);
}
if (mCategory != null) {
filter.addCategory(mCategory);
}
if (mDataType != null) {
try {
filter.addDataType(mDataType);
} catch (IntentFilter.MalformedMimeTypeException e) {
e.printStackTrace();
}
}
return filter;
}
public int getId() {
return mId;
}
public void setId(int id) {
mId = id;
}
public String getScriptPath() {
return mScriptPath;
}
public void setScriptPath(String scriptPath) {
mScriptPath = scriptPath;
}
public String getAction() {
return mAction;
}
public void setAction(String action) {
mAction = action;
}
public String getCategory() {
return mCategory;
}
public void setCategory(String category) {
mCategory = category;
}
public String getDataType() {
return mDataType;
}
public void setDataType(String dataType) {
mDataType = dataType;
}
}

View File

@@ -2,6 +2,7 @@ package org.autojs.autojs.timing;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
@@ -14,7 +15,9 @@ import com.raizlabs.android.dbflow.structure.ModelAdapter;
import com.stardust.app.GlobalAppContext; import com.stardust.app.GlobalAppContext;
import org.autojs.autojs.storage.database.ModelChange; import org.autojs.autojs.storage.database.ModelChange;
import org.autojs.autojs.storage.file.StorageFileProvider;
import java.io.File;
import java.util.List; import java.util.List;
import io.reactivex.Flowable; import io.reactivex.Flowable;
@@ -31,6 +34,7 @@ public class TimedTaskManager {
private static TimedTaskManager sInstance; private static TimedTaskManager sInstance;
private ModelAdapter<TimedTask> mTimedTaskModelAdapter; private ModelAdapter<TimedTask> mTimedTaskModelAdapter;
private ModelAdapter<IntentTask> mIntentTaskModelAdapter;
private Context mContext; private Context mContext;
private PublishSubject<ModelChange<TimedTask>> mTimedTaskChanges = PublishSubject.create(); private PublishSubject<ModelChange<TimedTask>> mTimedTaskChanges = PublishSubject.create();
@@ -44,6 +48,7 @@ public class TimedTaskManager {
public TimedTaskManager(Context context) { public TimedTaskManager(Context context) {
mContext = context; mContext = context;
mTimedTaskModelAdapter = FlowManager.getModelAdapter(TimedTask.class); mTimedTaskModelAdapter = FlowManager.getModelAdapter(TimedTask.class);
mIntentTaskModelAdapter = FlowManager.getModelAdapter(IntentTask.class);
DirectModelNotifier.get().registerForModelChanges(TimedTask.class, new DirectModelNotifier.ModelChangedListener<TimedTask>() { DirectModelNotifier.get().registerForModelChanges(TimedTask.class, new DirectModelNotifier.ModelChangedListener<TimedTask>() {
@Override @Override
public void onModelChanged(@NonNull TimedTask model, @NonNull BaseModel.Action action) { public void onModelChanged(@NonNull TimedTask model, @NonNull BaseModel.Action action) {
@@ -74,7 +79,7 @@ public class TimedTaskManager {
} }
} }
public void cancelTask(TimedTask timedTask) { public void removeTask(TimedTask timedTask) {
TimedTaskScheduler.cancel(mContext, timedTask); TimedTaskScheduler.cancel(mContext, timedTask);
mTimedTaskModelAdapter.delete(timedTask); mTimedTaskModelAdapter.delete(timedTask);
} }
@@ -84,14 +89,31 @@ public class TimedTaskManager {
TimedTaskScheduler.scheduleTaskIfNeeded(mContext, timedTask); TimedTaskScheduler.scheduleTaskIfNeeded(mContext, timedTask);
} }
public void addTask(IntentTask intentTask) {
mIntentTaskModelAdapter.insert(intentTask);
}
public void removeTask(IntentTask intentTask) {
mIntentTaskModelAdapter.delete(intentTask);
}
public Flowable<TimedTask> getAllTasks() { public Flowable<TimedTask> getAllTasks() {
return RXSQLite.rx(SQLite.select().from(TimedTask.class)) return RXSQLite.rx(SQLite.select().from(TimedTask.class))
.queryStreamResults() .queryStreamResults()
.subscribeOn(Schedulers.io()); .subscribeOn(Schedulers.io());
} }
public Flowable<IntentTask> getIntentTaskOfAction(String action) {
IntentTask intentTask = new IntentTask();
intentTask.setAction(Intent.ACTION_BOOT_COMPLETED);
intentTask.setScriptPath(new File(StorageFileProvider.getDefaultDirectory(), "boot.js").getPath());
return Flowable.just(intentTask);
// return RXSQLite.rx(SQLite.select().from(IntentTask.class))
// .queryStreamResults()
// .subscribeOn(Schedulers.io());
}
public Observable<ModelChange<TimedTask>> getTimeTaskChanges() { public Observable<ModelChange<TimedTask>> getTimeTaskChanges() {
return mTimedTaskChanges; return mTimedTaskChanges;
} }

View File

@@ -5,7 +5,6 @@ import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.execution.ScriptExecution;
import com.stardust.autojs.script.AutoFileSource; import com.stardust.autojs.script.AutoFileSource;
import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.JavaScriptSource;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.pio.PFiles; import com.stardust.pio.PFiles;
import org.autojs.autojs.R; import org.autojs.autojs.R;
@@ -55,7 +54,7 @@ public abstract class Task {
@Override @Override
public void cancel() { public void cancel() {
TimedTaskManager.getInstance().cancelTask(mTimedTask); TimedTaskManager.getInstance().removeTask(mTimedTask);
} }
@Override @Override

View File

@@ -36,6 +36,7 @@ import org.androidannotations.annotations.ViewById;
import org.autojs.autojs.R; import org.autojs.autojs.R;
import org.autojs.autojs.external.ScriptIntents; import org.autojs.autojs.external.ScriptIntents;
import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.model.script.ScriptFile;
import org.autojs.autojs.timing.IntentTask;
import org.autojs.autojs.timing.TaskReceiver; import org.autojs.autojs.timing.TaskReceiver;
import org.autojs.autojs.timing.TimedTask; import org.autojs.autojs.timing.TimedTask;
import org.autojs.autojs.timing.TimedTaskManager; import org.autojs.autojs.timing.TimedTaskManager;
@@ -76,6 +77,10 @@ public class TimedTaskSettingActivity extends BaseActivity {
@ViewById(R.id.weekly_task_radio) @ViewById(R.id.weekly_task_radio)
RadioButton mWeeklyTaskRadio; RadioButton mWeeklyTaskRadio;
@ViewById(R.id.run_on_boot_radio)
RadioButton mRunOnBootRadio;
@ViewById(R.id.disposable_task_time) @ViewById(R.id.disposable_task_time)
TextView mDisposableTaskTime; TextView mDisposableTaskTime;
@@ -283,6 +288,14 @@ public class TimedTaskSettingActivity extends BaseActivity {
} }
private void createOrUpdateTimedTask() { private void createOrUpdateTimedTask() {
if (mRunOnBootRadio.isChecked()) {
IntentTask task = new IntentTask();
task.setAction(Intent.ACTION_BOOT_COMPLETED);
task.setScriptPath(mScriptFile.getPath());
TimedTaskManager.getInstance().addTask(task);
finish();
return;
}
TimedTask task = createTimedTask(); TimedTask task = createTimedTask();
if (task == null) if (task == null)
return; return;

View File

@@ -252,6 +252,13 @@
</com.github.aakira.expandablelayout.ExpandableRelativeLayout> </com.github.aakira.expandablelayout.ExpandableRelativeLayout>
<RadioButton
android:id="@+id/run_on_boot_radio"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:paddingLeft="16dp"
android:text="@string/text_run_on_boot"/>
</RadioGroup> </RadioGroup>
</LinearLayout> </LinearLayout>

View File

@@ -382,4 +382,5 @@
<string name="text_use_alarm_clock">使用系统闹钟唤醒Auto.js</string> <string name="text_use_alarm_clock">使用系统闹钟唤醒Auto.js</string>
<string name="error_connect_to_remote">连接失败: %s</string> <string name="error_connect_to_remote">连接失败: %s</string>
<string name="text_are_you_sure_to_delete">确定要删除%s吗</string> <string name="text_are_you_sure_to_delete">确定要删除%s吗</string>
<string name="text_run_on_boot">开机时运行</string>
</resources> </resources>