add: support for weekly task
This commit is contained in:
@@ -8,8 +8,8 @@ android {
|
|||||||
applicationId "com.stardust.scriptdroid"
|
applicationId "com.stardust.scriptdroid"
|
||||||
minSdkVersion 17
|
minSdkVersion 17
|
||||||
targetSdkVersion 23
|
targetSdkVersion 23
|
||||||
versionCode 223
|
versionCode 224
|
||||||
versionName "3.0.0 Alpha23"
|
versionName "3.0.0 Alpha24"
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
ndk {
|
ndk {
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import com.stardust.autojs.execution.ExecutionConfig;
|
|||||||
import com.stardust.scriptdroid.external.ScriptIntents;
|
import com.stardust.scriptdroid.external.ScriptIntents;
|
||||||
import com.stardust.scriptdroid.storage.database.TimedTaskDatabase;
|
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.LocalDateTime;
|
||||||
import org.joda.time.LocalTime;
|
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;
|
mMillis = millis;
|
||||||
mTimeFlag = timeFlag;
|
mTimeFlag = timeFlag;
|
||||||
mScriptPath = scriptPath;
|
mScriptPath = scriptPath;
|
||||||
@@ -88,13 +90,58 @@ public class TimedTask {
|
|||||||
if (isDisposable()) {
|
if (isDisposable()) {
|
||||||
return mMillis;
|
return mMillis;
|
||||||
}
|
}
|
||||||
// TODO: 2017/11/28 day of week
|
if (isDaily()) {
|
||||||
LocalTime time = LocalTime.fromMillisOfDay(mMillis);
|
LocalTime time = LocalTime.fromMillisOfDay(mMillis);
|
||||||
long nextTimeMillis = time.toDateTimeToday().getMillis();
|
long nextTimeMillis = time.toDateTimeToday().getMillis();
|
||||||
if (System.currentTimeMillis() > nextTimeMillis) {
|
if (System.currentTimeMillis() > nextTimeMillis) {
|
||||||
return nextTimeMillis + TimeUnit.DAYS.toMillis(1);
|
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() {
|
public long getMillis() {
|
||||||
@@ -210,4 +257,11 @@ public class TimedTask {
|
|||||||
return new TimedTask(dateTime.toDateTime().getMillis(), FLAG_DISPOSABLE, scriptPath, config);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,11 @@ import android.support.v7.widget.Toolbar;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.CheckBox;
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
import android.widget.RadioButton;
|
import android.widget.RadioButton;
|
||||||
import android.widget.RadioGroup;
|
import android.widget.RadioGroup;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
@@ -38,6 +41,9 @@ import org.joda.time.LocalTime;
|
|||||||
import org.joda.time.format.DateTimeFormat;
|
import org.joda.time.format.DateTimeFormat;
|
||||||
import org.joda.time.format.DateTimeFormatter;
|
import org.joda.time.format.DateTimeFormatter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/11/28.
|
* Created by Stardust on 2017/11/28.
|
||||||
*/
|
*/
|
||||||
@@ -73,7 +79,13 @@ public class TimedTaskSettingActivity extends BaseActivity {
|
|||||||
TimePicker mDailyTaskTimePicker;
|
TimePicker mDailyTaskTimePicker;
|
||||||
|
|
||||||
@ViewById(R.id.weekly_task_time_picker)
|
@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 ScriptFile mScriptFile;
|
||||||
private TimedTask mTimedTask;
|
private TimedTask mTimedTask;
|
||||||
@@ -103,9 +115,24 @@ public class TimedTaskSettingActivity extends BaseActivity {
|
|||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||||
mToolbar.setSubtitle(mScriptFile.getName());
|
mToolbar.setSubtitle(mScriptFile.getName());
|
||||||
}
|
}
|
||||||
|
findDayOfWeekCheckBoxes(mWeeklyTaskContainer);
|
||||||
setUpTime();
|
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() {
|
private void setUpTime() {
|
||||||
mDisposableTaskDate.setText(DATE_FORMATTER.print(LocalDate.now()));
|
mDisposableTaskDate.setText(DATE_FORMATTER.print(LocalDate.now()));
|
||||||
mDisposableTaskTime.setText(TIME_FORMATTER.print(LocalTime.now()));
|
mDisposableTaskTime.setText(TIME_FORMATTER.print(LocalTime.now()));
|
||||||
@@ -119,14 +146,18 @@ public class TimedTaskSettingActivity extends BaseActivity {
|
|||||||
mDisposableTaskDate.setText(DATE_FORMATTER.print(mTimedTask.getMillis()));
|
mDisposableTaskDate.setText(DATE_FORMATTER.print(mTimedTask.getMillis()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
LocalTime time = LocalTime.fromMillisOfDay(mTimedTask.getMillis());
|
||||||
|
mDailyTaskTimePicker.setCurrentHour(time.getHourOfDay());
|
||||||
|
mDailyTaskTimePicker.setCurrentMinute(time.getMinuteOfHour());
|
||||||
if (mTimedTask.isDaily()) {
|
if (mTimedTask.isDaily()) {
|
||||||
mDailyTaskRadio.setChecked(true);
|
mDailyTaskRadio.setChecked(true);
|
||||||
LocalTime time = LocalTime.fromMillisOfDay(mTimedTask.getMillis());
|
} else {
|
||||||
mDailyTaskTimePicker.setCurrentHour(time.getHourOfDay());
|
mWeeklyTaskRadio.setChecked(true);
|
||||||
mDailyTaskTimePicker.setCurrentMinute(time.getMinuteOfHour());
|
for (int i = 0; i < mDayOfWeekCheckBoxes.size(); i++) {
|
||||||
return;
|
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() {
|
private TimedTask createWeeklyTask() {
|
||||||
// TODO: 2017/11/28 Weekly
|
long timeFlag = 0;
|
||||||
return null;
|
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() {
|
private TimedTask createDailyTask() {
|
||||||
|
|||||||
@@ -174,11 +174,81 @@
|
|||||||
app:ael_interpolator="fastOutSlowIn"
|
app:ael_interpolator="fastOutSlowIn"
|
||||||
app:ael_orientation="vertical">
|
app:ael_orientation="vertical">
|
||||||
|
|
||||||
<TimePicker
|
<LinearLayout
|
||||||
android:id="@+id/weekly_task_time_picker"
|
android:id="@+id/weekly_task_container"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
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>
|
</com.github.aakira.expandablelayout.ExpandableRelativeLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -322,4 +322,12 @@
|
|||||||
<string name="text_timing">定时</string>
|
<string name="text_timing">定时</string>
|
||||||
<string name="text_disposable_task_time_before_now">任务时间小于当前时间</string>
|
<string name="text_disposable_task_time_before_now">任务时间小于当前时间</string>
|
||||||
<string name="text_next_run_time">下次运行</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>
|
</resources>
|
||||||
|
|||||||
Reference in New Issue
Block a user