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

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(
entities = [Frpc::class, Msg::class, Logs::class, Rule::class, Sender::class, Task::class],
views = [LogsDetail::class],
version = 19,
version = 20,
exportSchema = false
)
@TypeConverters(ConvertersDate::class)
@ -110,6 +110,7 @@ custom_domains = smsf.demo.com
MIGRATION_16_17,
MIGRATION_17_18,
MIGRATION_18_19,
MIGRATION_19_20,
)
/*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_end", defaultValue = "0") var silentPeriodEnd: Int = 0,
@ColumnInfo(name = "silent_day_of_week", defaultValue = "") var silentDayOfWeek: String = "",
) : Parcelable {
companion object {

View File

@ -87,6 +87,7 @@ import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import java.util.Calendar
import java.util.Date
@Page(name = "转发规则·编辑器")
@ -639,6 +640,21 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
silentPeriodEnd = rule.silentPeriodEnd
//初始化发送通道下拉框
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 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(
ruleId,
ruleType,
@ -730,7 +759,8 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
senderListSelected,
senderLogic,
silentPeriodStart,
silentPeriodEnd
silentPeriodEnd,
silentDayOfWeek,
)
}

View File

@ -49,6 +49,7 @@ import com.idormy.sms.forwarder.workers.UpdateLogsWorker
import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.resource.ResUtils.getString
import java.util.Calendar
object SendUtils {
private const val TAG = "SendUtils"
@ -97,6 +98,19 @@ object SendUtils {
senderLogic(0, msgInfo, rule, senderIndex, msgId)
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}")
if (rule.silentPeriodStart != rule.silentPeriodEnd) {

View File

@ -509,52 +509,184 @@
style="@style/BarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:ignore="RtlSymmetry">
<LinearLayout
android:layout_width="180dp"
android:layout_width="match_parent"
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
android:layout_width="wrap_content"
android:id="@+id/tv_silent_period"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/silent_time_period"
android:textStyle="bold"
tools:ignore="RelativeOverlap" />
android:layout_marginStart="5dp"
android:layout_weight="1"
android:gravity="center" />
<TextView
<com.xuexiang.xui.widget.button.shadowbutton.RippleShadowShadowButton
android:id="@+id/btn_silent_period"
android:layout_width="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"
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>
<TextView
android:id="@+id/tv_silent_period"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_weight="1"
android:gravity="center" />
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_marginTop="3dp"
android:layout_height="wrap_content">
<com.xuexiang.xui.widget.button.shadowbutton.RippleShadowShadowButton
android:id="@+id/btn_silent_period"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:gravity="center"
android:padding="5dp"
android:text="@string/select"
android:textColor="@color/white"
android:textSize="@dimen/text_size_mini"
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
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<com.xuexiang.xui.widget.button.SmoothCheckBox
android:id="@+id/mon"
android:layout_width="15dp"
android:layout_height="15dp"
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/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>

View File

@ -186,6 +186,13 @@
<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_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-->
<string name="delete_sender_title">Delete confirmation</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="invalid_match_value">匹配的值不可为空</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-->
<string name="delete_sender_title">发送通道操作确认</string>
<string name="delete_sender_tips">删除发送通道后会级联删除其相关的转发规则、转发日志的所有记录!\n\n确定删除该条发送通道?</string>

View File

@ -214,6 +214,13 @@
<string name="switch_rule_status">启用该条转发规则</string>
<string name="invalid_match_value">匹配的值不可为空</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-->
<string name="delete_sender_title">发送通道操作确认</string>
<string name="delete_sender_tips">删除发送通道后会级联删除其相关的转发规则、转发日志的所有记录!\n\n确定删除该条发送通道?</string>