diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aa1cb820..d68b0544 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -164,6 +164,14 @@ + + + + + + + + instance; - private DynamicBroadcastReceiver mDynamicBroadcastReceiver; + private DynamicBroadcastReceivers mDynamicBroadcastReceivers; public static App getApp() { return instance.get(); @@ -56,6 +58,10 @@ public class App extends MultiDexApplication { init(); } + public DynamicBroadcastReceivers getDynamicBroadcastReceivers() { + return mDynamicBroadcastReceivers; + } + private void setUpStaticsTool() { if (BuildConfig.DEBUG) return; @@ -98,7 +104,18 @@ public class App extends MultiDexApplication { } setupDrawableImageLoader(); TimedTaskScheduler.checkTasksRepeatedlyIfNeeded(this); - mDynamicBroadcastReceiver = new DynamicBroadcastReceiver(this); + initDynamicBroadcastReceivers(); + } + + @SuppressLint("CheckResult") + private void initDynamicBroadcastReceivers() { + mDynamicBroadcastReceivers = new DynamicBroadcastReceivers(this); + TimedTaskManager.getInstance().getAllIntentTasks() + .filter(task -> task.getAction() != null) + .map(IntentTask::getAction) + .collectInto(new ArrayList(), ArrayList::add) + .subscribe(list -> mDynamicBroadcastReceivers.register(list), + Throwable::printStackTrace); } private void setupDrawableImageLoader() { diff --git a/app/src/main/java/org/autojs/autojs/external/receiver/BaseBroadcastReceiver.java b/app/src/main/java/org/autojs/autojs/external/receiver/BaseBroadcastReceiver.java index a7d68b87..5cad9f4f 100644 --- a/app/src/main/java/org/autojs/autojs/external/receiver/BaseBroadcastReceiver.java +++ b/app/src/main/java/org/autojs/autojs/external/receiver/BaseBroadcastReceiver.java @@ -4,6 +4,7 @@ import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.util.Log; import android.widget.Toast; @@ -24,7 +25,7 @@ public class BaseBroadcastReceiver extends BroadcastReceiver { @SuppressLint("CheckResult") public void onReceive(Context context, Intent intent) { - Log.d(LOG_TAG, "onReceive: action = " + intent.getAction() + ", intent = " + intent); + Log.d(LOG_TAG, "onReceive: intent = " + intent + ", this = " + this); try { TimedTaskManager.getInstance().getIntentTaskOfAction(intent.getAction()) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceiver.java b/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceivers.java similarity index 50% rename from app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceiver.java rename to app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceivers.java index 62ff15c5..b837f046 100644 --- a/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceiver.java +++ b/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceivers.java @@ -1,41 +1,31 @@ package org.autojs.autojs.external.receiver; +import android.content.BroadcastReceiver; import android.content.Context; -import android.content.Intent; import android.content.IntentFilter; -import android.media.AudioManager; import android.os.Build; -import org.autojs.autojs.BuildConfig; - import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import static android.content.Intent.ACTION_BATTERY_CHANGED; import static android.content.Intent.ACTION_CONFIGURATION_CHANGED; -import static android.content.Intent.ACTION_DATE_CHANGED; import static android.content.Intent.ACTION_PACKAGES_SUSPENDED; import static android.content.Intent.ACTION_PACKAGES_UNSUSPENDED; -import static android.content.Intent.ACTION_PACKAGE_ADDED; -import static android.content.Intent.ACTION_PACKAGE_CHANGED; -import static android.content.Intent.ACTION_PACKAGE_DATA_CLEARED; -import static android.content.Intent.ACTION_PACKAGE_REMOVED; -import static android.content.Intent.ACTION_PACKAGE_RESTARTED; -import static android.content.Intent.ACTION_POWER_CONNECTED; -import static android.content.Intent.ACTION_POWER_DISCONNECTED; -import static android.content.Intent.ACTION_SHUTDOWN; -import static android.content.Intent.ACTION_TIMEZONE_CHANGED; -import static android.content.Intent.ACTION_TIME_CHANGED; +import static android.content.Intent.ACTION_SCREEN_OFF; +import static android.content.Intent.ACTION_SCREEN_ON; import static android.content.Intent.ACTION_TIME_TICK; -import static android.content.Intent.ACTION_UID_REMOVED; -public class DynamicBroadcastReceiver extends BaseBroadcastReceiver { +public class DynamicBroadcastReceivers { private static final List DEFAULT_ACTIONS = new ArrayList<>(Arrays.asList( ACTION_TIME_TICK, + ACTION_SCREEN_OFF, + ACTION_SCREEN_ON, ACTION_BATTERY_CHANGED, ACTION_CONFIGURATION_CHANGED )); @@ -49,31 +39,40 @@ public class DynamicBroadcastReceiver extends BaseBroadcastReceiver { } } - private boolean mRegistered = false; private final Set mActions = new LinkedHashSet<>(); + private final List mReceivers = new ArrayList<>(); private final Context mContext; - public DynamicBroadcastReceiver(Context context) { + public DynamicBroadcastReceivers(Context context) { mContext = context; register(DEFAULT_ACTIONS); } - public void register(List actions) { - int oldSize = mActions.size(); - mActions.addAll(actions); - if (oldSize == mActions.size()) { - return; - } - IntentFilter filter = new IntentFilter(); - for (String action : mActions) { - filter.addAction(action); - } - if(mRegistered){ - mContext.unregisterReceiver(this); - } - mContext.registerReceiver(this, filter); - mRegistered = true; + public void register(String action) { + register(Collections.singletonList(action)); } + public void register(List actions) { + IntentFilter filter = new IntentFilter(); + for (String action : actions) { + if (!StaticBroadcastReceiver.ACTIONS.contains(action) + && !mActions.contains(action)) { + mActions.add(action); + filter.addAction(action); + } + } + if (filter.countActions() == 0) { + return; + } + BaseBroadcastReceiver receiver = new BaseBroadcastReceiver(); + mContext.registerReceiver(receiver, filter); + } + + public void unregisterAll() { + for (BroadcastReceiver receiver : mReceivers) { + mContext.unregisterReceiver(receiver); + } + mReceivers.clear(); + } } diff --git a/app/src/main/java/org/autojs/autojs/external/tasker/TaskerScriptEditActivity.java b/app/src/main/java/org/autojs/autojs/external/tasker/TaskerScriptEditActivity.java index 764ad4e5..345d9ea8 100644 --- a/app/src/main/java/org/autojs/autojs/external/tasker/TaskerScriptEditActivity.java +++ b/app/src/main/java/org/autojs/autojs/external/tasker/TaskerScriptEditActivity.java @@ -31,7 +31,6 @@ import static org.autojs.autojs.ui.edit.EditorView.EXTRA_SAVE_ENABLED; public class TaskerScriptEditActivity extends BaseActivity { public static final int REQUEST_CODE = 10016; - public static final String EXTRA_INTENT_TASK_ID = "intent_task_id"; public static final String EXTRA_TASK_ID = TaskReceiver.EXTRA_TASK_ID; public static void edit(Activity activity, String title, String summary, String content) { diff --git a/app/src/main/java/org/autojs/autojs/pluginclient/DevPluginService.java b/app/src/main/java/org/autojs/autojs/pluginclient/DevPluginService.java index 2824b3cb..51de8c25 100644 --- a/app/src/main/java/org/autojs/autojs/pluginclient/DevPluginService.java +++ b/app/src/main/java/org/autojs/autojs/pluginclient/DevPluginService.java @@ -12,10 +12,9 @@ import android.util.Pair; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.stardust.util.MapEntries; +import com.stardust.util.MapBuilder; import org.autojs.autojs.BuildConfig; -import org.autojs.autojs.tool.EmptyObservers; import java.io.IOException; import java.net.SocketTimeoutException; @@ -24,7 +23,6 @@ import java.util.concurrent.TimeUnit; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.PublishSubject; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -171,12 +169,12 @@ public class DevPluginService { @WorkerThread private void sayHelloToServer(JsonWebSocket socket) throws IOException { - writeMap(socket, TYPE_HELLO, new MapEntries() - .entry("device_name", Build.BRAND + " " + Build.MODEL) - .entry("client_version", CLIENT_VERSION) - .entry("app_version", BuildConfig.VERSION_NAME) - .entry("app_version_code", BuildConfig.VERSION_CODE) - .map()); + writeMap(socket, TYPE_HELLO, new MapBuilder() + .put("device_name", Build.BRAND + " " + Build.MODEL) + .put("client_version", CLIENT_VERSION) + .put("app_version", BuildConfig.VERSION_NAME) + .put("app_version_code", BuildConfig.VERSION_CODE) + .build()); mHandshakeTimeoutHandler.postDelayed(() -> { if (mSocket != socket && !socket.isClosed()) { onHandshakeTimeout(socket); diff --git a/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java b/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java index 97169850..a8898ce9 100644 --- a/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java +++ b/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java @@ -3,9 +3,11 @@ package org.autojs.autojs.timing; import android.annotation.SuppressLint; import android.content.Context; +import android.text.TextUtils; import com.stardust.app.GlobalAppContext; +import org.autojs.autojs.App; import org.autojs.autojs.storage.database.IntentTaskDatabase; import org.autojs.autojs.storage.database.ModelChange; import org.autojs.autojs.storage.database.TimedTaskDatabase; @@ -15,7 +17,6 @@ import java.util.List; import io.reactivex.Flowable; import io.reactivex.Observable; -import io.reactivex.subjects.PublishSubject; /** * Created by Stardust on 2017/11/27. @@ -82,7 +83,12 @@ public class TimedTaskManager { @SuppressLint("CheckResult") public void addTask(IntentTask intentTask) { mIntentTaskDatabase.insert(intentTask) - .subscribe(EmptyObservers.consumer(), Throwable::printStackTrace); + .subscribe(i -> { + if(!TextUtils.isEmpty(intentTask.getAction())){ + App.getApp().getDynamicBroadcastReceivers() + .register(intentTask.getAction()); + } + }, Throwable::printStackTrace); } @SuppressLint("CheckResult") @@ -128,6 +134,17 @@ public class TimedTaskManager { TimedTaskScheduler.scheduleTaskIfNeeded(mContext, task); } + @SuppressLint("CheckResult") + public void updateTask(IntentTask task) { + mIntentTaskDatabase.update(task) + .subscribe(i -> { + if(i > 0 && !TextUtils.isEmpty(task.getAction())){ + App.getApp().getDynamicBroadcastReceivers() + .register(task.getAction()); + } + }, Throwable::printStackTrace); + } + public long countTasks() { return mTimedTaskDatabase.count(); } @@ -139,4 +156,12 @@ public class TimedTaskManager { public Observable> getIntentTaskChanges() { return mIntentTaskDatabase.getModelChange(); } + + public IntentTask getIntentTask(long intentTaskId) { + return mIntentTaskDatabase.queryById(intentTaskId); + } + + public Flowable getAllIntentTasks() { + return mIntentTaskDatabase.queryAllAsFlowable(); + } } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java b/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java index 4e5e03f4..3ad1ec0a 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java @@ -1,11 +1,14 @@ package org.autojs.autojs.ui.main.task; +import android.content.Intent; + import com.stardust.app.GlobalAppContext; 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.pio.PFiles; +import com.stardust.util.MapBuilder; import org.autojs.autojs.R; import org.autojs.autojs.timing.IntentTask; @@ -14,12 +17,17 @@ import org.autojs.autojs.timing.TimedTaskManager; import org.joda.time.format.DateTimeFormat; +import java.util.Map; + +import static org.autojs.autojs.ui.timing.TimedTaskSettingActivity.ACTION_DESC_MAP; + /** * Created by Stardust on 2017/11/28. */ public abstract class Task { + public abstract String getName(); public abstract String getDesc(); @@ -30,6 +38,7 @@ public abstract class Task { public static class PendingTask extends Task { + private TimedTask mTimedTask; private IntentTask mIntentTask; @@ -44,8 +53,8 @@ public abstract class Task { mTimedTask = null; } - public boolean taskEquals(Object task){ - if(mTimedTask != null){ + public boolean taskEquals(Object task) { + if (mTimedTask != null) { return mTimedTask.equals(task); } return mIntentTask.equals(task); @@ -68,6 +77,10 @@ public abstract class Task { DateTimeFormat.shortDateTime().print(nextTime); } else { assert mIntentTask != null; + Integer desc = ACTION_DESC_MAP.get(mIntentTask.getAction()); + if(desc != null){ + return GlobalAppContext.getString(desc); + } return mIntentTask.getAction(); } @@ -75,7 +88,11 @@ public abstract class Task { @Override public void cancel() { - TimedTaskManager.getInstance().removeTask(mTimedTask); + if (mTimedTask != null) { + TimedTaskManager.getInstance().removeTask(mTimedTask); + } else { + TimedTaskManager.getInstance().removeTask(mIntentTask); + } } private String getScriptPath() { @@ -103,6 +120,12 @@ public abstract class Task { public void setIntentTask(IntentTask intentTask) { mIntentTask = intentTask; } + + public long getId() { + if(mTimedTask != null) + return mTimedTask.getId(); + return mIntentTask.getId(); + } } public static class RunningTask extends Task { diff --git a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java index 8a4f7e68..18a6f018 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java @@ -56,6 +56,7 @@ public abstract class TaskGroup implements Parent { @Override public void refresh() { + mTasks.clear(); for (TimedTask timedTask : TimedTaskManager.getInstance().getAllTasksAsList()) { mTasks.add(new Task.PendingTask(timedTask)); } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java index 6825c9fe..3371aa46 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java @@ -32,6 +32,7 @@ import org.autojs.autojs.timing.IntentTask; import org.autojs.autojs.timing.TaskReceiver; import org.autojs.autojs.timing.TimedTask; import org.autojs.autojs.timing.TimedTaskManager; +import org.autojs.autojs.ui.timing.TimedTaskSettingActivity; import org.autojs.autojs.ui.timing.TimedTaskSettingActivity_; import java.util.ArrayList; @@ -248,8 +249,11 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView { void onItemClick(View view) { if (mTask instanceof Task.PendingTask) { + Task.PendingTask task = (Task.PendingTask) mTask; + String extra = task.getTimedTask() == null ? TimedTaskSettingActivity.EXTRA_INTENT_TASK_ID + : TimedTaskSettingActivity.EXTRA_TASK_ID; TimedTaskSettingActivity_.intent(getContext()) - .extra(TaskerScriptEditActivity.EXTRA_TASK_ID, ((Task.PendingTask) mTask).getTimedTask().getId()) + .extra(extra, task.getId()) .start(); } } diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java b/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java index bcf4ccbc..a8423d6d 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/settings/SettingsActivity.java @@ -12,7 +12,7 @@ import android.view.View; import com.stardust.theme.app.ColorSelectActivity; import com.stardust.theme.preference.ThemeColorPreferenceFragment; import com.stardust.theme.util.ListBuilder; -import com.stardust.util.MapEntries; +import com.stardust.util.MapBuilder; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; @@ -100,14 +100,14 @@ public class SettingsActivity extends BaseActivity { @Override public void onStart() { super.onStart(); - ACTION_MAP = new MapEntries() - .entry(getString(R.string.text_theme_color), () -> selectThemeColor(getActivity())) - .entry(getString(R.string.text_check_for_updates), () -> new UpdateCheckDialog(getActivity()) + ACTION_MAP = new MapBuilder() + .put(getString(R.string.text_theme_color), () -> selectThemeColor(getActivity())) + .put(getString(R.string.text_check_for_updates), () -> new UpdateCheckDialog(getActivity()) .show()) - .entry(getString(R.string.text_issue_report), () -> startActivity(new Intent(getActivity(), IssueReporterActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) - .entry(getString(R.string.text_about_me_and_repo), () -> startActivity(new Intent(getActivity(), AboutActivity_.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) - .entry(getString(R.string.text_licenses), () -> showLicenseDialog()) - .map(); + .put(getString(R.string.text_issue_report), () -> startActivity(new Intent(getActivity(), IssueReporterActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) + .put(getString(R.string.text_about_me_and_repo), () -> startActivity(new Intent(getActivity(), AboutActivity_.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))) + .put(getString(R.string.text_licenses), () -> showLicenseDialog()) + .build(); } @Override diff --git a/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java b/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java index 130c49cf..0997e7c3 100644 --- a/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/timing/TimedTaskSettingActivity.java @@ -3,6 +3,8 @@ package org.autojs.autojs.ui.timing; import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.content.Intent; +import android.graphics.ColorFilter; +import android.net.ConnectivityManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -30,7 +32,7 @@ import com.github.aakira.expandablelayout.ExpandableRelativeLayout; import com.stardust.autojs.execution.ExecutionConfig; import com.stardust.util.BiMap; import com.stardust.util.BiMaps; -import com.stardust.util.MapEntries; +import com.stardust.util.MapBuilder; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.CheckedChange; @@ -61,16 +63,44 @@ import java.util.Map; @EActivity(R.layout.activity_timed_task_setting) public class TimedTaskSettingActivity extends BaseActivity { + public static final String EXTRA_INTENT_TASK_ID = "intent_task_id"; + public static final String EXTRA_TASK_ID = TaskReceiver.EXTRA_TASK_ID; private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormat.forPattern("HH:mm"); private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormat.forPattern("yy-MM-dd"); private static final int REQUEST_CODE_IGNORE_BATTERY = 27101; + private static final String LOG_TAG = "TimedTaskSettings"; + + public static final Map ACTION_DESC_MAP = new MapBuilder() + .put(Intent.ACTION_BOOT_COMPLETED, R.string.text_run_on_boot) + .put(Intent.ACTION_SCREEN_OFF, R.string.text_run_on_screen_off) + .put(Intent.ACTION_SCREEN_ON, R.string.text_run_on_screen_on) + .put(Intent.ACTION_USER_PRESENT, R.string.text_run_on_screen_unlock) + .put(Intent.ACTION_BATTERY_CHANGED, R.string.text_run_on_battery_change) + .put(Intent.ACTION_POWER_CONNECTED, R.string.text_run_on_power_connect) + .put(Intent.ACTION_POWER_DISCONNECTED, R.string.text_run_on_power_disconnect) + .put(ConnectivityManager.CONNECTIVITY_ACTION, R.string.text_run_on_conn_change) + .put(Intent.ACTION_PACKAGE_ADDED, R.string.text_run_on_package_install) + .put(Intent.ACTION_PACKAGE_REMOVED, R.string.text_run_on_package_uninstall) + .put(Intent.ACTION_PACKAGE_REPLACED, R.string.text_run_on_package_update) + .put(Intent.ACTION_HEADSET_PLUG, R.string.text_run_on_headset_plug) + .build(); + private static final BiMap ACTIONS = BiMaps.newBuilder() .put(R.id.run_on_boot, Intent.ACTION_BOOT_COMPLETED) .put(R.id.run_on_screen_off, Intent.ACTION_SCREEN_OFF) .put(R.id.run_on_screen_on, Intent.ACTION_SCREEN_ON) + .put(R.id.run_on_screen_unlock, Intent.ACTION_USER_PRESENT) + .put(R.id.run_on_battery_change, Intent.ACTION_BATTERY_CHANGED) + .put(R.id.run_on_power_connect, Intent.ACTION_POWER_CONNECTED) + .put(R.id.run_on_power_disconnect, Intent.ACTION_POWER_DISCONNECTED) + .put(R.id.run_on_conn_change, ConnectivityManager.CONNECTIVITY_ACTION) + .put(R.id.run_on_package_install, Intent.ACTION_PACKAGE_ADDED) + .put(R.id.run_on_package_uninstall, Intent.ACTION_PACKAGE_REMOVED) + .put(R.id.run_on_package_update, Intent.ACTION_PACKAGE_REPLACED) + .put(R.id.run_on_headset_plug, Intent.ACTION_HEADSET_PLUG) .build(); @@ -90,7 +120,10 @@ public class TimedTaskSettingActivity extends BaseActivity { RadioButton mWeeklyTaskRadio; @ViewById(R.id.run_on_broadcast) - RadioButton mRunOnBroadcast; + RadioButton mRunOnBroadcastRadio; + + @ViewById(R.id.run_on_other_broadcast) + RadioButton mRunOnOtherBroadcast; @ViewById(R.id.action) EditText mOtherBroadcastAction; @@ -117,22 +150,31 @@ public class TimedTaskSettingActivity extends BaseActivity { private ScriptFile mScriptFile; private TimedTask mTimedTask; + private IntentTask mIntentTask; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - long taskId = getIntent().getLongExtra(TaskReceiver.EXTRA_TASK_ID, -1); + long taskId = getIntent().getLongExtra(EXTRA_TASK_ID, -1); if (taskId != -1) { mTimedTask = TimedTaskManager.getInstance().getTimedTask(taskId); if (mTimedTask != null) { mScriptFile = new ScriptFile(mTimedTask.getScriptPath()); } } else { - String path = getIntent().getStringExtra(ScriptIntents.EXTRA_KEY_PATH); - if (TextUtils.isEmpty(path)) { - finish(); + long intentTaskId = getIntent().getLongExtra(EXTRA_INTENT_TASK_ID, -1); + if (intentTaskId != -1) { + mIntentTask = TimedTaskManager.getInstance().getIntentTask(intentTaskId); + if (mIntentTask != null) { + mScriptFile = new ScriptFile(mIntentTask.getScriptPath()); + } + } else { + String path = getIntent().getStringExtra(ScriptIntents.EXTRA_KEY_PATH); + if (TextUtils.isEmpty(path)) { + finish(); + } + mScriptFile = new ScriptFile(path); } - mScriptFile = new ScriptFile(path); } } @@ -144,7 +186,7 @@ public class TimedTaskSettingActivity extends BaseActivity { mToolbar.setSubtitle(mScriptFile.getName()); } findDayOfWeekCheckBoxes(mWeeklyTaskContainer); - setUpTime(); + setUpTaskSettings(); } private void findDayOfWeekCheckBoxes(ViewGroup parent) { @@ -161,13 +203,32 @@ public class TimedTaskSettingActivity extends BaseActivity { } - private void setUpTime() { + private void setUpTaskSettings() { mDisposableTaskDate.setText(DATE_FORMATTER.print(LocalDate.now())); mDisposableTaskTime.setText(TIME_FORMATTER.print(LocalTime.now())); - if (mTimedTask == null) { - mDailyTaskRadio.setChecked(true); + if (mTimedTask != null) { + setupTime(); return; } + if (mIntentTask != null) { + setupAction(); + return; + } + mDailyTaskRadio.setChecked(true); + } + + private void setupAction() { + mRunOnBroadcastRadio.setChecked(true); + Integer buttonId = ACTIONS.getKey(mIntentTask.getAction()); + if (buttonId == null) { + mRunOnOtherBroadcast.setChecked(true); + mOtherBroadcastAction.setText(mIntentTask.getAction()); + } else { + ((RadioButton) findViewById(buttonId)).setChecked(true); + } + } + + private void setupTime() { if (mTimedTask.isDisposable()) { mDisposableTaskRadio.setChecked(true); mDisposableTaskTime.setText(TIME_FORMATTER.print(mTimedTask.getMillis())); @@ -187,7 +248,6 @@ public class TimedTaskSettingActivity extends BaseActivity { mDayOfWeekCheckBoxes.get(i).setChecked(mTimedTask.hasDayOfWeek(i + 1)); } } - } @@ -285,7 +345,7 @@ public class TimedTaskSettingActivity extends BaseActivity { startActivityForResult(new Intent().setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) .setData(Uri.parse("package:" + getPackageName())), REQUEST_CODE_IGNORE_BATTERY); } else { - createOrUpdateTimedTask(); + createOrUpdateTask(); } return true; } @@ -296,14 +356,14 @@ public class TimedTaskSettingActivity extends BaseActivity { protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_IGNORE_BATTERY) { Log.d(LOG_TAG, "result code = " + requestCode); - createOrUpdateTimedTask(); + createOrUpdateTask(); } super.onActivityResult(requestCode, resultCode, data); } - private void createOrUpdateTimedTask() { - if (mRunOnBroadcast.isChecked()) { - createIntentTask(); + private void createOrUpdateTask() { + if (mRunOnBroadcastRadio.isChecked()) { + createOrUpdateIntentTask(); return; } TimedTask task = createTimedTask(); @@ -311,6 +371,9 @@ public class TimedTaskSettingActivity extends BaseActivity { return; if (mTimedTask == null) { TimedTaskManager.getInstance().addTask(task); + if (mIntentTask != null) { + TimedTaskManager.getInstance().removeTask(mIntentTask); + } Toast.makeText(this, R.string.text_already_create, Toast.LENGTH_SHORT).show(); } else { task.setId(mTimedTask.getId()); @@ -320,22 +383,36 @@ public class TimedTaskSettingActivity extends BaseActivity { } - private void createIntentTask() { + private void createOrUpdateIntentTask() { int buttonId = mBroadcastGroup.getCheckedRadioButtonId(); + if (buttonId == -1) { + Toast.makeText(this, R.string.error_empty_selection, Toast.LENGTH_SHORT).show(); + return; + } String action; - if(buttonId == R.id.run_on_other_broadcast){ + if (buttonId == R.id.run_on_other_broadcast) { action = mOtherBroadcastAction.getText().toString(); - if(action.isEmpty()){ + if (action.isEmpty()) { mOtherBroadcastAction.setError(getString(R.string.text_should_not_be_empty)); return; } - }else { + } else { action = ACTIONS.get(buttonId); } IntentTask task = new IntentTask(); task.setAction(action); task.setScriptPath(mScriptFile.getPath()); - TimedTaskManager.getInstance().addTask(task); + if (mIntentTask != null) { + task.setId(mIntentTask.getId()); + TimedTaskManager.getInstance().updateTask(task); + Toast.makeText(this, R.string.text_already_create, Toast.LENGTH_SHORT).show(); + } else { + TimedTaskManager.getInstance().addTask(task); + if (mTimedTask != null) { + TimedTaskManager.getInstance().removeTask(mTimedTask); + } + } + finish(); } } diff --git a/app/src/main/res/layout/activity_timed_task_setting.xml b/app/src/main/res/layout/activity_timed_task_setting.xml index 4d90b0e8..ee7e0c11 100644 --- a/app/src/main/res/layout/activity_timed_task_setting.xml +++ b/app/src/main/res/layout/activity_timed_task_setting.xml @@ -303,6 +303,78 @@ android:paddingLeft="8dp" android:text="@string/text_run_on_screen_off"/> + + + + + + + + + + + + + + + + + + 前台服务通知 Auto.js保持运行中 点击进入主界面 - 开机时运行 - 亮屏时运行 - 息屏时运行 其他事件(广播) 广播Action android.intent.action. + 开机时 + 亮屏时 + 息屏时 + 请选择一个广播事件选项 + 电量变化时 + 屏幕解锁时 + 电源连接时 + 电源断开时 + 网络连接变化时 + 新应用安装时 + 应用卸载时 + 应用更新时 + 耳机插拔时 diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Sensors.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Sensors.java index 06cebbe6..e011e6f4 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Sensors.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Sensors.java @@ -11,7 +11,7 @@ import com.stardust.autojs.core.eventloop.EventEmitter; import com.stardust.autojs.core.looper.Loopers; import com.stardust.autojs.runtime.ScriptBridges; import com.stardust.autojs.runtime.ScriptRuntime; -import com.stardust.util.MapEntries; +import com.stardust.util.MapBuilder; import java.lang.reflect.Field; import java.util.HashSet; @@ -59,21 +59,21 @@ public class Sensors extends EventEmitter implements Loopers.LooperQuitHandler { } - private static final Map SENSORS = new MapEntries() - .entry("ACCELEROMETER", Sensor.TYPE_ACCELEROMETER) - .entry("MAGNETIC_FIELD", Sensor.TYPE_MAGNETIC_FIELD) - .entry("ORIENTATION", Sensor.TYPE_ORIENTATION) - .entry("GYROSCOPE", Sensor.TYPE_GYROSCOPE) - .entry("LIGHT", Sensor.TYPE_LIGHT) - .entry("TEMPERATURE", Sensor.TYPE_TEMPERATURE) - .entry("PRESSURE", Sensor.TYPE_PRESSURE) - .entry("AMBIENT_TEMPERATURE", Sensor.TYPE_AMBIENT_TEMPERATURE) - .entry("PROXIMITY", Sensor.TYPE_PROXIMITY) - .entry("GRAVITY", Sensor.TYPE_GRAVITY) - .entry("LINEAR_ACCELERATION", Sensor.TYPE_LINEAR_ACCELERATION) - .entry("RELATIVE_HUMIDITY", Sensor.TYPE_RELATIVE_HUMIDITY) - .entry("AMBIENT_TEMPERATURE", Sensor.TYPE_AMBIENT_TEMPERATURE) - .map(); + private static final Map SENSORS = new MapBuilder() + .put("ACCELEROMETER", Sensor.TYPE_ACCELEROMETER) + .put("MAGNETIC_FIELD", Sensor.TYPE_MAGNETIC_FIELD) + .put("ORIENTATION", Sensor.TYPE_ORIENTATION) + .put("GYROSCOPE", Sensor.TYPE_GYROSCOPE) + .put("LIGHT", Sensor.TYPE_LIGHT) + .put("TEMPERATURE", Sensor.TYPE_TEMPERATURE) + .put("PRESSURE", Sensor.TYPE_PRESSURE) + .put("AMBIENT_TEMPERATURE", Sensor.TYPE_AMBIENT_TEMPERATURE) + .put("PROXIMITY", Sensor.TYPE_PROXIMITY) + .put("GRAVITY", Sensor.TYPE_GRAVITY) + .put("LINEAR_ACCELERATION", Sensor.TYPE_LINEAR_ACCELERATION) + .put("RELATIVE_HUMIDITY", Sensor.TYPE_RELATIVE_HUMIDITY) + .put("AMBIENT_TEMPERATURE", Sensor.TYPE_AMBIENT_TEMPERATURE) + .build(); public boolean ignoresUnsupportedSensor = false; public final Delay delay = new Delay(); diff --git a/autojs/src/main/java/com/stardust/autojs/script/JavaScriptSource.java b/autojs/src/main/java/com/stardust/autojs/script/JavaScriptSource.java index c6008135..93e8f0fa 100644 --- a/autojs/src/main/java/com/stardust/autojs/script/JavaScriptSource.java +++ b/autojs/src/main/java/com/stardust/autojs/script/JavaScriptSource.java @@ -3,7 +3,7 @@ package com.stardust.autojs.script; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import com.stardust.util.MapEntries; +import com.stardust.util.MapBuilder; import java.io.Reader; import java.io.StringReader; @@ -23,10 +23,10 @@ public abstract class JavaScriptSource extends ScriptSource { public static final int EXECUTION_MODE_UI = 0x00000001; public static final int EXECUTION_MODE_AUTO = 0x00000002; - private static final Map EXECUTION_MODES = new MapEntries() - .entry("ui", EXECUTION_MODE_UI) - .entry("auto", EXECUTION_MODE_AUTO) - .map(); + private static final Map EXECUTION_MODES = new MapBuilder() + .put("ui", EXECUTION_MODE_UI) + .put("auto", EXECUTION_MODE_AUTO) + .build(); private static final int EXECUTION_MODE_STRING_MAX_LENGTH = 7; private int mExecutionMode = -1; diff --git a/autojs/src/main/java/com/stardust/autojs/script/ScriptSource.java b/autojs/src/main/java/com/stardust/autojs/script/ScriptSource.java index 53303a1a..b66d3b74 100644 --- a/autojs/src/main/java/com/stardust/autojs/script/ScriptSource.java +++ b/autojs/src/main/java/com/stardust/autojs/script/ScriptSource.java @@ -1,17 +1,6 @@ package com.stardust.autojs.script; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.view.View; - -import com.stardust.util.MapEntries; - -import java.io.Reader; import java.io.Serializable; -import java.io.StringReader; -import java.util.Arrays; -import java.util.List; -import java.util.Map; /** * Created by Stardust on 2017/4/2. diff --git a/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java b/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java index 50c27c2f..e18fe2e9 100644 --- a/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java +++ b/automator/src/main/java/com/stardust/automator/simple_action/ActionFactory.java @@ -7,7 +7,7 @@ import android.support.annotation.RequiresApi; import android.view.accessibility.AccessibilityNodeInfo; import com.stardust.automator.UiObject; -import com.stardust.util.MapEntries; +import com.stardust.util.MapBuilder; import java.util.Map; @@ -17,15 +17,15 @@ import java.util.Map; public class ActionFactory { - private static Map searchUpAction = new MapEntries() - .entry(AccessibilityNodeInfo.ACTION_CLICK, null) - .entry(AccessibilityNodeInfo.ACTION_LONG_CLICK, null) - .entry(AccessibilityNodeInfo.ACTION_SELECT, null) - .entry(AccessibilityNodeInfo.ACTION_FOCUS, null) - .entry(AccessibilityNodeInfo.ACTION_SELECT, null) - .entry(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD, null) - .entry(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD, null) - .map(); + private static Map searchUpAction = new MapBuilder() + .put(AccessibilityNodeInfo.ACTION_CLICK, null) + .put(AccessibilityNodeInfo.ACTION_LONG_CLICK, null) + .put(AccessibilityNodeInfo.ACTION_SELECT, null) + .put(AccessibilityNodeInfo.ACTION_FOCUS, null) + .put(AccessibilityNodeInfo.ACTION_SELECT, null) + .put(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD, null) + .put(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD, null) + .build(); public static SimpleAction createActionWithTextFilter(int action, String text, int index) { if (searchUpAction.containsKey(action)) diff --git a/common/src/main/java/com/stardust/util/MapEntries.java b/common/src/main/java/com/stardust/util/MapBuilder.java similarity index 66% rename from common/src/main/java/com/stardust/util/MapEntries.java rename to common/src/main/java/com/stardust/util/MapBuilder.java index 588ed5a5..3f465b81 100644 --- a/common/src/main/java/com/stardust/util/MapEntries.java +++ b/common/src/main/java/com/stardust/util/MapBuilder.java @@ -2,30 +2,29 @@ package com.stardust.util; import java.util.HashMap; import java.util.Map; -import java.util.TreeMap; /** * Created by Stardust on 2017/1/26. */ -public class MapEntries { +public class MapBuilder { private Map mMap; - public MapEntries() { + public MapBuilder() { this(new HashMap()); } - public MapEntries(Map map) { + public MapBuilder(Map map) { mMap = map; } - public MapEntries entry(K key, V value) { + public MapBuilder put(K key, V value) { mMap.put(key, value); return this; } - public Map map() { + public Map build() { return mMap; }