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

View File

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

View File

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

View File

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

View File

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