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"
minSdkVersion 17
targetSdkVersion 23
versionCode 412
versionName "4.0.2 Alpha7"
versionCode 413
versionName "4.0.2 Alpha8"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {

View File

@ -13,8 +13,7 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<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.SET_ALARM"/>
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<!-- 非Auto.js运行必需不会主动申请某些脚本可以自行申请-->
@ -132,6 +131,13 @@
</intent-filter>
</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
android:name=".external.tasker.FireSettingReceiver"
android:exported="true"

View File

@ -18,13 +18,16 @@ import com.raizlabs.android.dbflow.runtime.DirectModelNotifier;
import com.stardust.app.GlobalAppContext;
import com.stardust.autojs.core.ui.inflater.ImageLoader;
import com.stardust.autojs.core.ui.inflater.util.Drawables;
import org.autojs.autojs.autojs.AutoJs;
import org.autojs.autojs.autojs.key.GlobalKeyObserver;
import org.autojs.autojs.network.GlideApp;
import org.autojs.autojs.storage.database.IntentTaskDatabase;
import org.autojs.autojs.storage.database.TimedTaskDatabase;
import org.autojs.autojs.timing.TimedTaskScheduler;
import org.autojs.autojs.tool.CrashHandler;
import org.autojs.autojs.ui.error.ErrorReportActivity;
import com.stardust.theme.ThemeColor;
import com.stardust.theme.ThemeColorManager;
import com.tencent.bugly.Bugly;
@ -83,6 +86,9 @@ public class App extends MultiDexApplication {
.addDatabaseConfig(DatabaseConfig.builder(TimedTaskDatabase.class)
.modelNotifier(DirectModelNotifier.get())
.build())
.addDatabaseConfig(DatabaseConfig.builder(IntentTaskDatabase.class)
.modelNotifier(DirectModelNotifier.get())
.build())
.build());
ThemeColorManager.setDefaultThemeColor(new ThemeColor(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent)));
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.Intent;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
@ -14,7 +15,9 @@ import com.raizlabs.android.dbflow.structure.ModelAdapter;
import com.stardust.app.GlobalAppContext;
import org.autojs.autojs.storage.database.ModelChange;
import org.autojs.autojs.storage.file.StorageFileProvider;
import java.io.File;
import java.util.List;
import io.reactivex.Flowable;
@ -31,6 +34,7 @@ public class TimedTaskManager {
private static TimedTaskManager sInstance;
private ModelAdapter<TimedTask> mTimedTaskModelAdapter;
private ModelAdapter<IntentTask> mIntentTaskModelAdapter;
private Context mContext;
private PublishSubject<ModelChange<TimedTask>> mTimedTaskChanges = PublishSubject.create();
@ -44,6 +48,7 @@ public class TimedTaskManager {
public TimedTaskManager(Context context) {
mContext = context;
mTimedTaskModelAdapter = FlowManager.getModelAdapter(TimedTask.class);
mIntentTaskModelAdapter = FlowManager.getModelAdapter(IntentTask.class);
DirectModelNotifier.get().registerForModelChanges(TimedTask.class, new DirectModelNotifier.ModelChangedListener<TimedTask>() {
@Override
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);
mTimedTaskModelAdapter.delete(timedTask);
}
@ -84,14 +89,31 @@ public class TimedTaskManager {
TimedTaskScheduler.scheduleTaskIfNeeded(mContext, timedTask);
}
public void addTask(IntentTask intentTask) {
mIntentTaskModelAdapter.insert(intentTask);
}
public void removeTask(IntentTask intentTask) {
mIntentTaskModelAdapter.delete(intentTask);
}
public Flowable<TimedTask> getAllTasks() {
return RXSQLite.rx(SQLite.select().from(TimedTask.class))
.queryStreamResults()
.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() {
return mTimedTaskChanges;
}

View File

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

View File

@ -36,6 +36,7 @@ import org.androidannotations.annotations.ViewById;
import org.autojs.autojs.R;
import org.autojs.autojs.external.ScriptIntents;
import org.autojs.autojs.model.script.ScriptFile;
import org.autojs.autojs.timing.IntentTask;
import org.autojs.autojs.timing.TaskReceiver;
import org.autojs.autojs.timing.TimedTask;
import org.autojs.autojs.timing.TimedTaskManager;
@ -76,6 +77,10 @@ public class TimedTaskSettingActivity extends BaseActivity {
@ViewById(R.id.weekly_task_radio)
RadioButton mWeeklyTaskRadio;
@ViewById(R.id.run_on_boot_radio)
RadioButton mRunOnBootRadio;
@ViewById(R.id.disposable_task_time)
TextView mDisposableTaskTime;
@ -283,6 +288,14 @@ public class TimedTaskSettingActivity extends BaseActivity {
}
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();
if (task == null)
return;

View File

@ -252,6 +252,13 @@
</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>
</LinearLayout>

View File

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