feat(app): add intent task
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
42
app/src/main/java/org/autojs/autojs/external/boot/BootCompleteReceiver.java
vendored
Normal file
42
app/src/main/java/org/autojs/autojs/external/boot/BootCompleteReceiver.java
vendored
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package org.autojs.autojs.storage.database;
|
||||||
|
|
||||||
|
import com.raizlabs.android.dbflow.annotation.Database;
|
||||||
|
|
||||||
|
@Database(version = 1)
|
||||||
|
public class IntentTaskDatabase {
|
||||||
|
}
|
||||||
90
app/src/main/java/org/autojs/autojs/timing/IntentTask.java
Normal file
90
app/src/main/java/org/autojs/autojs/timing/IntentTask.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user