新增:免打扰支持指定星期

This commit is contained in:
sensi 2024-11-08 16:32:01 +08:00 committed by pppscn
parent 8e7c425fdc
commit aa8ab646f5
8 changed files with 239 additions and 33 deletions

View File

@ -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 '' ")
}
}
} }
} }

View File

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

View File

@ -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,
) )
} }

View File

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

View File

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

View File

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

View File

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

View File

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