add: support for weekly task

This commit is contained in:
hyb1996 2017-11-28 22:12:48 +08:00
parent 97382965da
commit 0d8f96eff7
5 changed files with 193 additions and 20 deletions

View File

@ -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 {

View File

@ -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;
}
}

View File

@ -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<CheckBox> 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() {

View File

@ -174,11 +174,81 @@
app:ael_interpolator="fastOutSlowIn"
app:ael_orientation="vertical">
<TimePicker
android:id="@+id/weekly_task_time_picker"
<LinearLayout
android:id="@+id/weekly_task_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:timePickerMode="spinner"/>
android:orientation="vertical">
<TimePicker
android:id="@+id/weekly_task_time_picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:timePickerMode="spinner"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:orientation="horizontal"
android:weightSum="4">
<CheckBox
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/text_day1"/>
<CheckBox
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/text_day2"/>
<CheckBox
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/text_day3"/>
<CheckBox
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/text_day4"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="25dp"
android:orientation="horizontal"
android:weightSum="4">
<CheckBox
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/text_day5"/>
<CheckBox
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/text_day6"/>
<CheckBox
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/text_day7"/>
</LinearLayout>
</LinearLayout>
</com.github.aakira.expandablelayout.ExpandableRelativeLayout>

View File

@ -322,4 +322,12 @@
<string name="text_timing">定时</string>
<string name="text_disposable_task_time_before_now">任务时间小于当前时间</string>
<string name="text_next_run_time">下次运行</string>
<string name="text_day1"></string>
<string name="text_day2"></string>
<string name="text_day3"></string>
<string name="text_day4"></string>
<string name="text_day5"></string>
<string name="text_day6"></string>
<string name="text_day7"></string>
<string name="text_weekly_task_should_check_day_of_week">至少选择一周中的一天</string>
</resources>