From 0d8f96eff708be7acd15f52d01c6c7b4fd4451d5 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 28 Nov 2017 22:12:48 +0800 Subject: [PATCH] add: support for weekly task --- app/build.gradle | 4 +- .../scriptdroid/timing/TimedTask.java | 68 +++++++++++++++-- .../ui/timing/TimedTaskSettingActivity.java | 57 ++++++++++++-- .../layout/activity_timed_task_setting.xml | 76 ++++++++++++++++++- app/src/main/res/values/strings.xml | 8 ++ 5 files changed, 193 insertions(+), 20 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 77cfa00b..72d82d38 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 223 - versionName "3.0.0 Alpha23" + versionCode 224 + versionName "3.0.0 Alpha24" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { 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 3d6b8d9d..bed9f9c2 100644 --- a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java @@ -11,6 +11,8 @@ import com.stardust.autojs.execution.ExecutionConfig; import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.storage.database.TimedTaskDatabase; +import org.joda.time.DateTime; +import org.joda.time.DateTimeConstants; import org.joda.time.LocalDateTime; import org.joda.time.LocalTime; @@ -63,7 +65,7 @@ public class TimedTask { } - public TimedTask(long millis, int timeFlag, String scriptPath, ExecutionConfig config) { + public TimedTask(long millis, long timeFlag, String scriptPath, ExecutionConfig config) { mMillis = millis; mTimeFlag = timeFlag; mScriptPath = scriptPath; @@ -88,13 +90,58 @@ public class TimedTask { 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); + if (isDaily()) { + LocalTime time = LocalTime.fromMillisOfDay(mMillis); + long nextTimeMillis = time.toDateTimeToday().getMillis(); + if (System.currentTimeMillis() > nextTimeMillis) { + return nextTimeMillis + TimeUnit.DAYS.toMillis(1); + } + return nextTimeMillis; } - return nextTimeMillis; + return getNextTimeOfWeeklyTask(); + + } + + private long getNextTimeOfWeeklyTask() { + int dayOfWeek = DateTime.now().getDayOfWeek(); + long nextTimeMillis = LocalTime.fromMillisOfDay(mMillis).toDateTimeToday().getMillis(); + for (int i = 0; i < 8; i++) { + if ((getDayOfWeekTimeFlag(dayOfWeek) & mTimeFlag) != 0) { + if (System.currentTimeMillis() <= nextTimeMillis) { + return nextTimeMillis; + } + } + dayOfWeek++; + nextTimeMillis += TimeUnit.DAYS.toMillis(1); + } + throw new IllegalStateException("Should not happen! timeFlag = " + mTimeFlag + ", dayOfWeek = " + DateTime.now().getDayOfWeek()); + } + + public static long getDayOfWeekTimeFlag(int dayOfWeek) { + dayOfWeek = (dayOfWeek - 1) % 7 + 1; + switch (dayOfWeek) { + case DateTimeConstants.SUNDAY: + return FLAG_SUNDAY; + + case DateTimeConstants.MONDAY: + return FLAG_MONDAY; + + case DateTimeConstants.SATURDAY: + return FLAG_SATURDAY; + + case DateTimeConstants.WEDNESDAY: + return FLAG_WEDNESDAY; + + case DateTimeConstants.TUESDAY: + return FLAG_TUESDAY; + + case DateTimeConstants.THURSDAY: + return FLAG_THURSDAY; + case DateTimeConstants.FRIDAY: + return FLAG_FRIDAY; + + } + throw new IllegalArgumentException("dayOfWeek = " + dayOfWeek); } public long getMillis() { @@ -210,4 +257,11 @@ public class TimedTask { return new TimedTask(dateTime.toDateTime().getMillis(), FLAG_DISPOSABLE, scriptPath, config); } + public static TimedTask weeklyTask(LocalTime time, long timeFlag, String scriptPath, ExecutionConfig config) { + return new TimedTask(time.getMillisOfDay(), timeFlag, scriptPath, config); + } + + public boolean hasDayOfWeek(int dayOfWeek) { + return (mTimeFlag & getDayOfWeekTimeFlag(dayOfWeek)) != 0; + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/timing/TimedTaskSettingActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/timing/TimedTaskSettingActivity.java index 4608c023..ebdf393f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/timing/TimedTaskSettingActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/timing/TimedTaskSettingActivity.java @@ -9,8 +9,11 @@ import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import android.view.ViewGroup; +import android.widget.CheckBox; import android.widget.CompoundButton; +import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; @@ -38,6 +41,9 @@ import org.joda.time.LocalTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + /** * Created by Stardust on 2017/11/28. */ @@ -73,7 +79,13 @@ public class TimedTaskSettingActivity extends BaseActivity { TimePicker mDailyTaskTimePicker; @ViewById(R.id.weekly_task_time_picker) - TimePicker mWWeeklyTaskTimePicker; + TimePicker mWeeklyTaskTimePicker; + + @ViewById(R.id.weekly_task_container) + LinearLayout mWeeklyTaskContainer; + + private List mDayOfWeekCheckBoxes = new ArrayList<>(); + private ScriptFile mScriptFile; private TimedTask mTimedTask; @@ -103,9 +115,24 @@ public class TimedTaskSettingActivity extends BaseActivity { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mToolbar.setSubtitle(mScriptFile.getName()); } + findDayOfWeekCheckBoxes(mWeeklyTaskContainer); setUpTime(); } + private void findDayOfWeekCheckBoxes(ViewGroup parent) { + for (int i = 0; i < parent.getChildCount(); i++) { + View child = parent.getChildAt(i); + if (child instanceof CheckBox) { + mDayOfWeekCheckBoxes.add((CheckBox) child); + } else if (child instanceof ViewGroup) { + findDayOfWeekCheckBoxes((ViewGroup) child); + } + if (mDayOfWeekCheckBoxes.size() >= 7) + break; + } + + } + private void setUpTime() { mDisposableTaskDate.setText(DATE_FORMATTER.print(LocalDate.now())); mDisposableTaskTime.setText(TIME_FORMATTER.print(LocalTime.now())); @@ -119,14 +146,18 @@ public class TimedTaskSettingActivity extends BaseActivity { mDisposableTaskDate.setText(DATE_FORMATTER.print(mTimedTask.getMillis())); return; } + LocalTime time = LocalTime.fromMillisOfDay(mTimedTask.getMillis()); + mDailyTaskTimePicker.setCurrentHour(time.getHourOfDay()); + mDailyTaskTimePicker.setCurrentMinute(time.getMinuteOfHour()); if (mTimedTask.isDaily()) { mDailyTaskRadio.setChecked(true); - LocalTime time = LocalTime.fromMillisOfDay(mTimedTask.getMillis()); - mDailyTaskTimePicker.setCurrentHour(time.getHourOfDay()); - mDailyTaskTimePicker.setCurrentMinute(time.getMinuteOfHour()); - return; + } else { + mWeeklyTaskRadio.setChecked(true); + for (int i = 0; i < mDayOfWeekCheckBoxes.size(); i++) { + mDayOfWeekCheckBoxes.get(i).setChecked(mTimedTask.hasDayOfWeek(i + 1)); + } } - // TODO: 2017/11/28 Weekly + } @@ -180,8 +211,18 @@ public class TimedTaskSettingActivity extends BaseActivity { } private TimedTask createWeeklyTask() { - // TODO: 2017/11/28 Weekly - return null; + long timeFlag = 0; + for (int i = 0; i < mDayOfWeekCheckBoxes.size(); i++) { + if (mDayOfWeekCheckBoxes.get(i).isChecked()) { + timeFlag |= TimedTask.getDayOfWeekTimeFlag(i + 1); + } + } + if (timeFlag == 0) { + Toast.makeText(this, R.string.text_weekly_task_should_check_day_of_week, Toast.LENGTH_SHORT).show(); + return null; + } + LocalTime time = new LocalTime(mDailyTaskTimePicker.getCurrentHour(), mDailyTaskTimePicker.getCurrentMinute()); + return TimedTask.weeklyTask(time, timeFlag, mScriptFile.getPath(), ExecutionConfig.getDefault()); } private TimedTask createDailyTask() { 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 bb8e461a..3b744d53 100644 --- a/app/src/main/res/layout/activity_timed_task_setting.xml +++ b/app/src/main/res/layout/activity_timed_task_setting.xml @@ -174,11 +174,81 @@ app:ael_interpolator="fastOutSlowIn" app:ael_orientation="vertical"> - + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4eee01e2..2570ca2f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -322,4 +322,12 @@ 定时 任务时间小于当前时间 下次运行 + + + + + + + + 至少选择一周中的一天