mirror of
https://github.com/pppscn/SmsForwarder
synced 2025-08-02 17:07:41 +08:00
新增:免打扰支持指定星期
This commit is contained in:
parent
8e7c425fdc
commit
aa8ab646f5
@ -28,7 +28,7 @@ import com.idormy.sms.forwarder.utils.TAG_LIST
|
|||||||
@Database(
|
@Database(
|
||||||
entities = [Frpc::class, Msg::class, Logs::class, Rule::class, Sender::class, Task::class],
|
entities = [Frpc::class, Msg::class, Logs::class, Rule::class, Sender::class, Task::class],
|
||||||
views = [LogsDetail::class],
|
views = [LogsDetail::class],
|
||||||
version = 19,
|
version = 20,
|
||||||
exportSchema = false
|
exportSchema = false
|
||||||
)
|
)
|
||||||
@TypeConverters(ConvertersDate::class)
|
@TypeConverters(ConvertersDate::class)
|
||||||
@ -110,6 +110,7 @@ custom_domains = smsf.demo.com
|
|||||||
MIGRATION_16_17,
|
MIGRATION_16_17,
|
||||||
MIGRATION_17_18,
|
MIGRATION_17_18,
|
||||||
MIGRATION_18_19,
|
MIGRATION_18_19,
|
||||||
|
MIGRATION_19_20,
|
||||||
)
|
)
|
||||||
|
|
||||||
/*if (BuildConfig.DEBUG) {
|
/*if (BuildConfig.DEBUG) {
|
||||||
@ -452,6 +453,13 @@ CREATE TABLE "Task" (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//免打扰星期段
|
||||||
|
private val MIGRATION_19_20 = object : Migration(19, 20) {
|
||||||
|
override fun migrate(database: SupportSQLiteDatabase) {
|
||||||
|
database.execSQL("Alter table rule add column silent_day_of_week TEXT NOT NULL DEFAULT '' ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,7 @@ data class Rule(
|
|||||||
//免打扰(禁用转发)时间段
|
//免打扰(禁用转发)时间段
|
||||||
@ColumnInfo(name = "silent_period_start", defaultValue = "0") var silentPeriodStart: Int = 0,
|
@ColumnInfo(name = "silent_period_start", defaultValue = "0") var silentPeriodStart: Int = 0,
|
||||||
@ColumnInfo(name = "silent_period_end", defaultValue = "0") var silentPeriodEnd: Int = 0,
|
@ColumnInfo(name = "silent_period_end", defaultValue = "0") var silentPeriodEnd: Int = 0,
|
||||||
|
@ColumnInfo(name = "silent_day_of_week", defaultValue = "") var silentDayOfWeek: String = "",
|
||||||
) : Parcelable {
|
) : Parcelable {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -87,6 +87,7 @@ import io.reactivex.SingleObserver
|
|||||||
import io.reactivex.android.schedulers.AndroidSchedulers
|
import io.reactivex.android.schedulers.AndroidSchedulers
|
||||||
import io.reactivex.disposables.Disposable
|
import io.reactivex.disposables.Disposable
|
||||||
import io.reactivex.schedulers.Schedulers
|
import io.reactivex.schedulers.Schedulers
|
||||||
|
import java.util.Calendar
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
||||||
@Page(name = "转发规则·编辑器")
|
@Page(name = "转发规则·编辑器")
|
||||||
@ -639,6 +640,21 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
|
|||||||
silentPeriodEnd = rule.silentPeriodEnd
|
silentPeriodEnd = rule.silentPeriodEnd
|
||||||
//初始化发送通道下拉框
|
//初始化发送通道下拉框
|
||||||
initSenderSpinner()
|
initSenderSpinner()
|
||||||
|
|
||||||
|
//绑定免打扰日期
|
||||||
|
val silentPeriodDays = rule.silentDayOfWeek.split(",").filter { it.isNotEmpty() }.map { it.toInt() }
|
||||||
|
if (silentPeriodDays.isNotEmpty()) {
|
||||||
|
val map = mapOf(
|
||||||
|
Calendar.SUNDAY to binding!!.sun,
|
||||||
|
Calendar.MONDAY to binding!!.mon,
|
||||||
|
Calendar.TUESDAY to binding!!.tue,
|
||||||
|
Calendar.WEDNESDAY to binding!!.wed,
|
||||||
|
Calendar.THURSDAY to binding!!.thu,
|
||||||
|
Calendar.FRIDAY to binding!!.fri,
|
||||||
|
Calendar.SATURDAY to binding!!.sat,
|
||||||
|
)
|
||||||
|
silentPeriodDays.forEach { map[it]?.isChecked = true }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -715,6 +731,19 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
|
|||||||
}
|
}
|
||||||
val status = if (binding!!.sbStatus.isChecked) STATUS_ON else STATUS_OFF
|
val status = if (binding!!.sbStatus.isChecked) STATUS_ON else STATUS_OFF
|
||||||
|
|
||||||
|
val map = mapOf(
|
||||||
|
Calendar.SUNDAY to binding!!.sun,
|
||||||
|
Calendar.MONDAY to binding!!.mon,
|
||||||
|
Calendar.TUESDAY to binding!!.tue,
|
||||||
|
Calendar.WEDNESDAY to binding!!.wed,
|
||||||
|
Calendar.THURSDAY to binding!!.thu,
|
||||||
|
Calendar.FRIDAY to binding!!.fri,
|
||||||
|
Calendar.SATURDAY to binding!!.sat,
|
||||||
|
)
|
||||||
|
|
||||||
|
val silentDayOfWeek = map.filter { it.value.isChecked }
|
||||||
|
.toList().map {it.first }.joinToString(",")
|
||||||
|
|
||||||
return Rule(
|
return Rule(
|
||||||
ruleId,
|
ruleId,
|
||||||
ruleType,
|
ruleType,
|
||||||
@ -730,7 +759,8 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
|
|||||||
senderListSelected,
|
senderListSelected,
|
||||||
senderLogic,
|
senderLogic,
|
||||||
silentPeriodStart,
|
silentPeriodStart,
|
||||||
silentPeriodEnd
|
silentPeriodEnd,
|
||||||
|
silentDayOfWeek,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ import com.idormy.sms.forwarder.workers.UpdateLogsWorker
|
|||||||
import com.jeremyliao.liveeventbus.LiveEventBus
|
import com.jeremyliao.liveeventbus.LiveEventBus
|
||||||
import com.xuexiang.xutil.XUtil
|
import com.xuexiang.xutil.XUtil
|
||||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
import com.xuexiang.xutil.resource.ResUtils.getString
|
||||||
|
import java.util.Calendar
|
||||||
|
|
||||||
object SendUtils {
|
object SendUtils {
|
||||||
private const val TAG = "SendUtils"
|
private const val TAG = "SendUtils"
|
||||||
@ -97,6 +98,19 @@ object SendUtils {
|
|||||||
senderLogic(0, msgInfo, rule, senderIndex, msgId)
|
senderLogic(0, msgInfo, rule, senderIndex, msgId)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
//免打扰(禁用转发)日期段
|
||||||
|
Log.d(TAG, "silentDayOfWeek = ${rule.silentDayOfWeek}")
|
||||||
|
val silentDayOfWeek = rule.silentDayOfWeek.split(",").filter { it.isNotEmpty() }.map { it.toInt() }
|
||||||
|
if (silentDayOfWeek.isNotEmpty()) {
|
||||||
|
val dayOfWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
|
||||||
|
if (silentDayOfWeek.contains(dayOfWeek)) {
|
||||||
|
Log.d(TAG, "免打扰(禁用转发)日期段")
|
||||||
|
updateLogs(logId, 0, getString(R.string.silent_time_period))
|
||||||
|
senderLogic(0, msgInfo, rule, senderIndex, msgId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//免打扰(禁用转发)时间段
|
//免打扰(禁用转发)时间段
|
||||||
Log.d(TAG, "silentPeriodStart = ${rule.silentPeriodStart}, silentPeriodEnd = ${rule.silentPeriodEnd}")
|
Log.d(TAG, "silentPeriodStart = ${rule.silentPeriodStart}, silentPeriodEnd = ${rule.silentPeriodEnd}")
|
||||||
if (rule.silentPeriodStart != rule.silentPeriodEnd) {
|
if (rule.silentPeriodStart != rule.silentPeriodEnd) {
|
||||||
|
@ -509,52 +509,184 @@
|
|||||||
style="@style/BarStyle"
|
style="@style/BarStyle"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
tools:ignore="RtlSymmetry">
|
tools:ignore="RtlSymmetry">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:layout_width="180dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical">
|
tools:ignore="RtlSymmetry">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="180dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/silent_time_period"
|
||||||
|
android:textStyle="bold"
|
||||||
|
tools:ignore="RelativeOverlap" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/silent_time_period_tips"
|
||||||
|
android:textSize="@dimen/text_size_mini"
|
||||||
|
tools:ignore="SmallSp,TooManyViews" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:id="@+id/tv_silent_period"
|
||||||
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/silent_time_period"
|
android:layout_marginStart="5dp"
|
||||||
android:textStyle="bold"
|
android:layout_weight="1"
|
||||||
tools:ignore="RelativeOverlap" />
|
android:gravity="center" />
|
||||||
|
|
||||||
<TextView
|
<com.xuexiang.xui.widget.button.shadowbutton.RippleShadowShadowButton
|
||||||
|
android:id="@+id/btn_silent_period"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/silent_time_period_tips"
|
android:layout_marginStart="5dp"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:text="@string/select"
|
||||||
|
android:textColor="@color/white"
|
||||||
android:textSize="@dimen/text_size_mini"
|
android:textSize="@dimen/text_size_mini"
|
||||||
tools:ignore="SmallSp,TooManyViews" />
|
app:sb_color_unpressed="@color/colorPrimary"
|
||||||
|
app:sb_ripple_color="@color/white"
|
||||||
|
app:sb_ripple_duration="500"
|
||||||
|
app:sb_shape_type="rectangle"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<TextView
|
<HorizontalScrollView
|
||||||
android:id="@+id/tv_silent_period"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="0dp"
|
android:layout_marginTop="3dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content">
|
||||||
android:layout_marginStart="5dp"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center" />
|
|
||||||
|
|
||||||
<com.xuexiang.xui.widget.button.shadowbutton.RippleShadowShadowButton
|
<LinearLayout
|
||||||
android:id="@+id/btn_silent_period"
|
android:layout_width="wrap_content"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:gravity="center_vertical"
|
||||||
android:layout_marginStart="5dp"
|
android:orientation="horizontal">
|
||||||
android:gravity="center"
|
|
||||||
android:padding="5dp"
|
<com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
android:text="@string/select"
|
android:id="@+id/mon"
|
||||||
android:textColor="@color/white"
|
android:layout_width="15dp"
|
||||||
android:textSize="@dimen/text_size_mini"
|
android:layout_height="15dp"
|
||||||
app:sb_color_unpressed="@color/colorPrimary"
|
app:scb_color_checked="@color/colorPrimary"
|
||||||
app:sb_ripple_color="@color/white"
|
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
|
||||||
app:sb_ripple_duration="500"
|
|
||||||
app:sb_shape_type="rectangle"
|
<TextView
|
||||||
tools:ignore="SmallSp" />
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/mon"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
|
android:id="@+id/tue"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
app:scb_color_checked="@color/colorPrimary"
|
||||||
|
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/tue"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
|
android:id="@+id/wed"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
app:scb_color_checked="@color/colorPrimary"
|
||||||
|
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/wed"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
|
android:id="@+id/thu"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
app:scb_color_checked="@color/colorPrimary"
|
||||||
|
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/thu"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
|
android:id="@+id/fri"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
app:scb_color_checked="@color/colorPrimary"
|
||||||
|
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/fri"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
|
android:id="@+id/sat"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
app:scb_color_checked="@color/colorPrimary"
|
||||||
|
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/sat"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
|
||||||
|
<com.xuexiang.xui.widget.button.SmoothCheckBox
|
||||||
|
android:id="@+id/sun"
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:layout_marginStart="5dp"
|
||||||
|
app:scb_color_checked="@color/colorPrimary"
|
||||||
|
tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:text="@string/sun"
|
||||||
|
android:textSize="@dimen/text_size_small"
|
||||||
|
tools:ignore="SmallSp" />
|
||||||
|
</LinearLayout>
|
||||||
|
</HorizontalScrollView>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
@ -186,6 +186,13 @@
|
|||||||
<string name="switch_rule_status">Enable This Forwarding Rule</string>
|
<string name="switch_rule_status">Enable This Forwarding Rule</string>
|
||||||
<string name="invalid_match_value">The matched value cannot be null</string>
|
<string name="invalid_match_value">The matched value cannot be null</string>
|
||||||
<string name="invalid_call_type">The call type is incorrect, you can only enter any number from 1 to 6.</string>
|
<string name="invalid_call_type">The call type is incorrect, you can only enter any number from 1 to 6.</string>
|
||||||
|
<string name="mon">MON</string>
|
||||||
|
<string name="tue">TUE</string>
|
||||||
|
<string name="wed">WED</string>
|
||||||
|
<string name="thu">THU</string>
|
||||||
|
<string name="fri">FRI</string>
|
||||||
|
<string name="sat">SAT</string>
|
||||||
|
<string name="sun">SUN</string>
|
||||||
<!--SenderActivity-->
|
<!--SenderActivity-->
|
||||||
<string name="delete_sender_title">Delete confirmation</string>
|
<string name="delete_sender_title">Delete confirmation</string>
|
||||||
<string name="delete_sender_tips">Are you sure to delete this sender?</string>
|
<string name="delete_sender_tips">Are you sure to delete this sender?</string>
|
||||||
|
@ -187,6 +187,13 @@
|
|||||||
<string name="switch_rule_status">启用该条转发规则</string>
|
<string name="switch_rule_status">启用该条转发规则</string>
|
||||||
<string name="invalid_match_value">匹配的值不可为空</string>
|
<string name="invalid_match_value">匹配的值不可为空</string>
|
||||||
<string name="invalid_call_type">通话类型不正确,只能填写1到6的任意一个数字</string>
|
<string name="invalid_call_type">通话类型不正确,只能填写1到6的任意一个数字</string>
|
||||||
|
<string name="mon">周一</string>
|
||||||
|
<string name="tue">周二</string>
|
||||||
|
<string name="wed">周三</string>
|
||||||
|
<string name="thu">周四</string>
|
||||||
|
<string name="fri">周五</string>
|
||||||
|
<string name="sat">周六</string>
|
||||||
|
<string name="sun">周日</string>
|
||||||
<!--SenderActivity-->
|
<!--SenderActivity-->
|
||||||
<string name="delete_sender_title">发送通道操作确认</string>
|
<string name="delete_sender_title">发送通道操作确认</string>
|
||||||
<string name="delete_sender_tips">删除发送通道后会级联删除其相关的转发规则、转发日志的所有记录!\n\n确定删除该条发送通道?</string>
|
<string name="delete_sender_tips">删除发送通道后会级联删除其相关的转发规则、转发日志的所有记录!\n\n确定删除该条发送通道?</string>
|
||||||
|
@ -214,6 +214,13 @@
|
|||||||
<string name="switch_rule_status">启用该条转发规则</string>
|
<string name="switch_rule_status">启用该条转发规则</string>
|
||||||
<string name="invalid_match_value">匹配的值不可为空</string>
|
<string name="invalid_match_value">匹配的值不可为空</string>
|
||||||
<string name="invalid_call_type">通话类型不正确,只能填写1到6的任意一个数字</string>
|
<string name="invalid_call_type">通话类型不正确,只能填写1到6的任意一个数字</string>
|
||||||
|
<string name="mon">周一</string>
|
||||||
|
<string name="tue">周二</string>
|
||||||
|
<string name="wed">周三</string>
|
||||||
|
<string name="thu">周四</string>
|
||||||
|
<string name="fri">周五</string>
|
||||||
|
<string name="sat">周六</string>
|
||||||
|
<string name="sun">周日</string>
|
||||||
<!--SenderActivity-->
|
<!--SenderActivity-->
|
||||||
<string name="delete_sender_title">发送通道操作确认</string>
|
<string name="delete_sender_title">发送通道操作确认</string>
|
||||||
<string name="delete_sender_tips">删除发送通道后会级联删除其相关的转发规则、转发日志的所有记录!\n\n确定删除该条发送通道?</string>
|
<string name="delete_sender_tips">删除发送通道后会级联删除其相关的转发规则、转发日志的所有记录!\n\n确定删除该条发送通道?</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user