From 28f24ef73b8b34fc9c6f6b9c766a162692c9a7bc Mon Sep 17 00:00:00 2001 From: pppscn <35696959@qq.com> Date: Fri, 22 Dec 2023 22:46:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=C2=B7=E5=BF=AB=E6=8D=B7=E6=8C=87=E4=BB=A4=20?= =?UTF-8?q?=EF=BC=88=E5=BC=80=E5=8F=91=E4=B8=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/spinner/FrpcAdapterItem.kt | 49 +++++ .../adapter/spinner/FrpcSpinnerAdapter.kt | 167 +++++++++++++++++ .../adapter/spinner/RuleAdapterItem.kt | 2 + .../sms/forwarder/database/dao/FrpcDao.kt | 8 +- .../sms/forwarder/database/dao/LogsDao.kt | 19 +- .../sms/forwarder/database/dao/RuleDao.kt | 4 + .../sms/forwarder/database/dao/SenderDao.kt | 8 +- .../sms/forwarder/database/dao/TaskDao.kt | 37 ++-- .../sms/forwarder/database/entity/Frpc.kt | 3 + .../database/repository/FrpcRepository.kt | 27 ++- .../database/repository/LogsRepository.kt | 21 +-- .../database/repository/MsgRepository.kt | 22 +-- .../database/repository/RuleRepository.kt | 26 +-- .../database/repository/SenderRepository.kt | 14 +- .../database/repository/TaskRepository.kt | 22 ++- .../database/viewmodel/TaskViewModel.kt | 2 +- .../forwarder/entity/action/RuleSetting.kt | 2 +- .../forwarder/entity/action/SenderSetting.kt | 2 +- .../sms/forwarder/fragment/LogsFragment.kt | 6 +- .../forwarder/fragment/RulesEditFragment.kt | 6 +- .../forwarder/fragment/TasksEditFragment.kt | 19 +- .../forwarder/fragment/action/FrpcFragment.kt | 177 +++++++++++++++--- .../fragment/action/HttpServerFragment.kt | 4 +- .../fragment/action/NotificationFragment.kt | 6 +- .../forwarder/fragment/action/RuleFragment.kt | 46 +++-- .../fragment/action/SenderFragment.kt | 28 +-- .../fragment/action/SettingsFragment.kt | 4 +- .../condition/LeaveAddressFragment.kt | 2 +- .../fragment/condition/ToAddressFragment.kt | 2 +- .../fragment/senders/BarkFragment.kt | 4 +- .../senders/DingtalkGroupRobotFragment.kt | 77 ++++---- .../senders/DingtalkInnerRobotFragment.kt | 87 ++++----- .../fragment/senders/EmailFragment.kt | 91 ++++----- .../fragment/senders/FeishuAppFragment.kt | 6 +- .../fragment/senders/FeishuFragment.kt | 71 +++---- .../fragment/senders/GotifyFragment.kt | 69 +++---- .../fragment/senders/PushplusFragment.kt | 85 ++++----- .../fragment/senders/ServerchanFragment.kt | 69 +++---- .../forwarder/fragment/senders/SmsFragment.kt | 105 +++++------ .../fragment/senders/SocketFragment.kt | 4 +- .../fragment/senders/TelegramFragment.kt | 81 ++++---- .../fragment/senders/UrlSchemeFragment.kt | 65 +++---- .../fragment/senders/WebhookFragment.kt | 111 +++++------ .../fragment/senders/WeworkAgentFragment.kt | 97 +++++----- .../fragment/senders/WeworkRobotFragment.kt | 75 ++++---- .../receiver/NetworkChangeReceiver.kt | 16 +- .../forwarder/service/ForegroundService.kt | 9 +- .../idormy/sms/forwarder/utils/Constants.kt | 4 +- .../sms/forwarder/utils/SmsCommandUtils.kt | 6 +- .../forwarder/utils/task/ConditionUtils.kt | 4 +- .../sms/forwarder/utils/task/TaskUtils.kt | 4 +- .../sms/forwarder/workers/ActionWorker.kt | 44 ++++- .../sms/forwarder/workers/BatteryWorker.kt | 7 +- .../sms/forwarder/workers/CronWorker.kt | 7 +- .../sms/forwarder/workers/LocationWorker.kt | 7 +- .../sms/forwarder/workers/LockScreenWorker.kt | 5 +- .../sms/forwarder/workers/NetworkWorker.kt | 10 +- .../idormy/sms/forwarder/workers/SimWorker.kt | 4 +- .../res/drawable/auto_task_icon_incall.xml | 6 + ...cation.xml => auto_task_icon_location.xml} | 0 .../auto_task_icon_start_activity.xml | 6 + .../res/layout/fragment_senders_pushplus.xml | 1 + .../layout/fragment_senders_wework_agent.xml | 6 +- app/src/main/res/layout/fragment_settings.xml | 87 ++++++--- .../res/layout/fragment_tasks_action_frpc.xml | 93 ++++----- .../fragment_tasks_action_notification.xml | 2 +- .../layout/fragment_tasks_action_settings.xml | 31 +-- .../layout/fragment_tasks_condition_cron.xml | 21 ++- app/src/main/res/layout/item_add_frpc.xml | 68 +++++++ app/src/main/res/layout/item_add_rule.xml | 2 +- app/src/main/res/values-en/strings.xml | 19 +- app/src/main/res/values-zh-rCN/strings.xml | 21 ++- app/src/main/res/values-zh-rTW/strings.xml | 21 ++- app/src/main/res/values/strings.xml | 21 ++- 74 files changed, 1350 insertions(+), 1014 deletions(-) create mode 100644 app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcAdapterItem.kt create mode 100644 app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcSpinnerAdapter.kt create mode 100644 app/src/main/res/drawable/auto_task_icon_incall.xml rename app/src/main/res/drawable/{icon_location.xml => auto_task_icon_location.xml} (100%) create mode 100644 app/src/main/res/drawable/auto_task_icon_start_activity.xml create mode 100644 app/src/main/res/layout/item_add_frpc.xml diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcAdapterItem.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcAdapterItem.kt new file mode 100644 index 00000000..a47aa4de --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcAdapterItem.kt @@ -0,0 +1,49 @@ +package com.idormy.sms.forwarder.adapter.spinner + +import android.graphics.drawable.Drawable + +@Suppress("unused") +class FrpcAdapterItem( + var title: CharSequence, + var icon: Drawable? = null, + var uid: String = "", + var autorun: Int? = 1 +) { + + fun setTitle(title: CharSequence): FrpcAdapterItem { + this.title = title + return this + } + + fun setIcon(icon: Drawable?): FrpcAdapterItem { + this.icon = icon + return this + } + + fun setUid(uid: String): FrpcAdapterItem { + this.uid = uid + return this + } + + fun setAutorun(autorun: Int): FrpcAdapterItem { + this.autorun = autorun + return this + } + + // 注意:自定义实体需要重写对象的 toString 方法 + override fun toString(): String { + return title.toString() + } + + companion object { + @JvmStatic + fun of(title: CharSequence): FrpcAdapterItem { + return FrpcAdapterItem(title) + } + + @JvmStatic + fun arrayOf(vararg titles: CharSequence): Array { + return titles.map { FrpcAdapterItem(it) }.toTypedArray() + } + } +} diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcSpinnerAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcSpinnerAdapter.kt new file mode 100644 index 00000000..be039dbb --- /dev/null +++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/FrpcSpinnerAdapter.kt @@ -0,0 +1,167 @@ +package com.idormy.sms.forwarder.adapter.spinner + +import android.annotation.SuppressLint +import android.os.Build +import android.text.Html +import android.text.TextUtils +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.annotation.DrawableRes +import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.utils.Log +import com.idormy.sms.forwarder.utils.STATUS_ON +import com.xuexiang.xui.utils.CollectionUtils +import com.xuexiang.xui.widget.spinner.editspinner.BaseEditSpinnerAdapter +import com.xuexiang.xui.widget.spinner.editspinner.EditSpinnerFilter +import com.xuexiang.xutil.resource.ResUtils.getDrawable + +@Suppress("unused", "NAME_SHADOWING", "DEPRECATION") +class FrpcSpinnerAdapter : BaseEditSpinnerAdapter, EditSpinnerFilter { + /** + * 选项的文字颜色 + */ + private var mTextColor = 0 + + /** + * 选项的文字大小 + */ + private var mTextSize = 0f + + /** + * 背景颜色 + */ + private var mBackgroundSelector = 0 + + /** + * 过滤关键词的选中颜色 + */ + private var mFilterColor = "#F15C58" + private var mIsFilterKey = false + + /** + * 构造方法 + * + * @param data 选项数据 + */ + constructor(data: List?) : super(data) + + /** + * 构造方法 + * + * @param data 选项数据 + */ + constructor(data: Array?) : super(data) + + override fun getEditSpinnerFilter(): EditSpinnerFilter { + return this + } + + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? { + var convertView = convertView + val holder: ViewHolder + if (convertView == null) { + convertView = LayoutInflater.from(parent.context).inflate(R.layout.item_spinner_with_icon, parent, false) + holder = ViewHolder(convertView, mTextColor, mTextSize, mBackgroundSelector) + convertView.tag = holder + } else { + holder = convertView.tag as ViewHolder + } + val item = CollectionUtils.getListItem(mDataSource, mIndexs[position]) as FrpcAdapterItem + holder.iconView.setImageDrawable(item.icon) + holder.statusView.setImageDrawable( + getDrawable( + when (item.autorun) { + STATUS_ON -> R.drawable.ic_autorun + else -> R.drawable.ic_manual + } + ) + ) + //holder.titleView.text = Html.fromHtml(item.toString()) + holder.titleView.text = Html.fromHtml(getItem(position)) + return convertView + } + + override fun onFilter(keyword: String): Boolean { + mDisplayData.clear() + Log.d("FrpcSpinnerAdapter", "keyword = $keyword") + Log.d("FrpcSpinnerAdapter", "mIndexs.indices = ${mIndexs.indices}") + if (TextUtils.isEmpty(keyword)) { + initDisplayData(mDataSource) + for (i in mIndexs.indices) { + mIndexs[i] = i + } + } else { + try { + for (i in mDataSource.indices) { + if (getDataSourceString(i).contains(keyword, ignoreCase = true)) { + mIndexs[mDisplayData.size] = i + if (mIsFilterKey) { + mDisplayData.add(getDataSourceString(i).replaceFirst(keyword.toRegex(), "$keyword")) + } else { + mDisplayData.add(getDataSourceString(i)) + } + } + } + } catch (e: Exception) { + e.printStackTrace() + Log.e("FrpcSpinnerAdapter", "onFilter error: ${e.message}") + } + } + Log.d("FrpcSpinnerAdapter", "mDisplayData = $mDisplayData") + notifyDataSetChanged() + return mDisplayData.size > 0 + } + + fun setTextColor(@ColorInt textColor: Int): FrpcSpinnerAdapter<*> { + mTextColor = textColor + return this + } + + fun setTextSize(textSize: Float): FrpcSpinnerAdapter<*> { + mTextSize = textSize + return this + } + + fun setBackgroundSelector(@DrawableRes backgroundSelector: Int): FrpcSpinnerAdapter<*> { + mBackgroundSelector = backgroundSelector + return this + } + + fun setFilterColor(filterColor: String): FrpcSpinnerAdapter<*> { + mFilterColor = filterColor + return this + } + + fun setIsFilterKey(isFilterKey: Boolean): FrpcSpinnerAdapter<*> { + mIsFilterKey = isFilterKey + return this + } + + @SuppressLint("ObsoleteSdkInt") + private class ViewHolder(convertView: View, @ColorInt textColor: Int, textSize: Float, @DrawableRes backgroundSelector: Int) { + val iconView: ImageView = convertView.findViewById(R.id.iv_icon) + val statusView: ImageView = convertView.findViewById(R.id.iv_status) + val titleView: TextView = convertView.findViewById(R.id.tv_title) + + init { + if (textColor > 0) titleView.setTextColor(textColor) + if (textSize > 0F) titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize) + if (backgroundSelector != 0) titleView.setBackgroundResource(backgroundSelector) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + val config = convertView.resources.configuration + if (config.layoutDirection == View.LAYOUT_DIRECTION_RTL) { + titleView.textDirection = View.TEXT_DIRECTION_RTL + } + } + } + } + + fun getItemSource(position: Int): T { + return mDataSource[mIndexs[position]] + } +} diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/RuleAdapterItem.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/RuleAdapterItem.kt index 7a221206..dc3ff5e7 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/RuleAdapterItem.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/RuleAdapterItem.kt @@ -36,10 +36,12 @@ class RuleAdapterItem( } companion object { + @JvmStatic fun of(title: CharSequence): RuleAdapterItem { return RuleAdapterItem(title) } + @JvmStatic fun arrayOf(vararg titles: CharSequence): Array { return titles.map { RuleAdapterItem(it) }.toTypedArray() } diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/FrpcDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/FrpcDao.kt index 74612605..3987e30b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/FrpcDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/FrpcDao.kt @@ -24,6 +24,9 @@ interface FrpcDao { @Query("DELETE FROM Frpc where uid=:uid") fun delete(uid: String) + @Query("DELETE FROM Frpc") + fun deleteAll() + @Update fun update(frpc: Frpc) @@ -43,10 +46,11 @@ interface FrpcDao { @Query("SELECT * FROM Frpc ORDER BY time DESC") fun pagingSource(): PagingSource + @Query("SELECT * FROM Frpc ORDER BY time DESC") + fun getAll(): Single> + @Transaction @RawQuery(observedEntities = [Frpc::class]) fun getAllRaw(query: SupportSQLiteQuery): List - @Query("DELETE FROM Frpc") - fun deleteAll() } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt index a65a87fc..915e761a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt @@ -34,6 +34,16 @@ interface LogsDao { @Update fun update(logs: Logs): Completable + @Query( + "UPDATE Logs SET forward_status=:status" + + ",forward_response=CASE WHEN (trim(forward_response) = '' or trim(forward_response) = 'ok')" + + " THEN :response" + + " ELSE forward_response || '\n--------------------\n' || :response" + + " END" + + " where id=:id" + ) + fun updateStatus(id: Long, status: Int, response: String): Int + @Query("SELECT * FROM Logs where id=:id") fun get(id: Long): Single @@ -48,13 +58,4 @@ interface LogsDao { @Query("SELECT * FROM Logs WHERE type = :type ORDER BY id DESC") fun pagingSource(type: String): PagingSource - @Query( - "UPDATE Logs SET forward_status=:status" + - ",forward_response=CASE WHEN (trim(forward_response) = '' or trim(forward_response) = 'ok')" + - " THEN :response" + - " ELSE forward_response || '\n--------------------\n' || :response" + - " END" + - " where id=:id" - ) - fun updateStatus(id: Long, status: Int, response: String): Int } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt index 03d0504b..a2ab2eb6 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt @@ -31,6 +31,9 @@ interface RuleDao { @Update fun update(rule: Rule) + @Query("UPDATE Rule SET status=:status WHERE id IN (:ids)") + fun updateStatusByIds(ids: List, status: Int) + @Query("SELECT * FROM Rule where id=:id") fun get(id: Long): Single @@ -54,4 +57,5 @@ interface RuleDao { @Query("SELECT * FROM Rule ORDER BY id DESC") fun getAll(): Single> + } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/SenderDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/SenderDao.kt index 708922df..93a372f3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/SenderDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/SenderDao.kt @@ -26,9 +26,15 @@ interface SenderDao { @Query("DELETE FROM Sender where id=:id") fun delete(id: Long) + @Query("DELETE FROM Sender") + fun deleteAll() + @Update fun update(sender: Sender) + @Query("UPDATE Sender SET status=:status WHERE id IN (:ids)") + fun updateStatusByIds(ids: List, status: Int) + @Query("SELECT * FROM Sender where id=:id") fun get(id: Long): Single @@ -54,6 +60,4 @@ interface SenderDao { @Query("SELECT COUNT(id) FROM Sender WHERE status = 1") fun getOnCount(): Flow - @Query("DELETE FROM Sender") - fun deleteAll() } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt index ea40a75a..87d1ecd4 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/TaskDao.kt @@ -3,6 +3,7 @@ package com.idormy.sms.forwarder.database.dao import androidx.paging.PagingSource import androidx.room.Dao import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.RawQuery import androidx.room.Transaction @@ -15,6 +16,24 @@ import java.util.Date @Dao interface TaskDao { + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(task: Task): Long + + @Query("DELETE FROM Task WHERE id = :taskId") + fun delete(taskId: Long) + + @Query("DELETE FROM Task") + fun deleteAll() + + @Update + fun update(task: Task) + + @Query("UPDATE Task SET last_exec_time = :lastExecTime, next_exec_time = :nextExecTime, status = :status WHERE id = :taskId") + fun updateExecTime(taskId: Long, lastExecTime: Date, nextExecTime: Date, status: Int) + + @Query("UPDATE Task SET status = :status WHERE id = :id") + fun updateStatus(id: Long, status: Int) + @Query("SELECT * FROM Task where id=:id") fun get(id: Long): Single @@ -34,22 +53,4 @@ interface TaskDao { @Query("SELECT * FROM Task WHERE status = 1 AND type = :taskType") fun getByType(taskType: Int): List - @Insert - fun insert(task: Task) - - @Update - fun update(task: Task) - - @Query("UPDATE Task SET last_exec_time = :lastExecTime, next_exec_time = :nextExecTime, status = :status WHERE id = :taskId") - fun updateExecTime(taskId: Long, lastExecTime: Date, nextExecTime: Date, status: Int) - - @Query("DELETE FROM Task WHERE id = :taskId") - fun delete(taskId: Long) - - @Query("DELETE FROM Task") - fun deleteAll() - - @Query("UPDATE Task SET status = :status WHERE id = :id") - fun updateStatus(id: Long, status: Int) - } diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/entity/Frpc.kt b/app/src/main/java/com/idormy/sms/forwarder/database/entity/Frpc.kt index 70b0851f..2bd81beb 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/entity/Frpc.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/entity/Frpc.kt @@ -22,6 +22,9 @@ data class Frpc( @Ignore var connecting: Boolean = false, ) : Parcelable { + val imageId: Int + get() = R.drawable.ic_menu_frpc + val autorunImageId: Int get() = when (autorun) { STATUS_ON -> R.drawable.ic_autorun diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/FrpcRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/FrpcRepository.kt index 85364c88..92539d14 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/FrpcRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/FrpcRepository.kt @@ -4,34 +4,33 @@ import androidx.annotation.WorkerThread import androidx.sqlite.db.SimpleSQLiteQuery import com.idormy.sms.forwarder.database.dao.FrpcDao import com.idormy.sms.forwarder.database.entity.Frpc +import io.reactivex.Single -class FrpcRepository( - private val frpcDao: FrpcDao, -) { +class FrpcRepository(private val frpcDao: FrpcDao) { @WorkerThread - fun insert(frpc: Frpc) { - frpcDao.insert(frpc) - } + fun insert(frpc: Frpc) = frpcDao.insert(frpc) @WorkerThread - fun delete(uid: String) { - frpcDao.delete(uid) - } + fun delete(uid: String) = frpcDao.delete(uid) - @WorkerThread - fun get(uid: String) = frpcDao.get(uid) + fun deleteAll() = frpcDao.deleteAll() @WorkerThread fun update(frpc: Frpc) = frpcDao.update(frpc) + @WorkerThread + fun get(uid: String) = frpcDao.get(uid) + fun getAllNonCache(): List { val query = SimpleSQLiteQuery("SELECT * FROM Frpc ORDER BY time DESC") return frpcDao.getAllRaw(query) } - fun deleteAll() { - frpcDao.deleteAll() - } + fun getAll(): Single> = frpcDao.getAll() + + fun getAutorun(): List = frpcDao.getAutorun() + + fun getByUids(uids: List): List = frpcDao.getByUids(uids) } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt index 41800d34..a672fa3c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt @@ -6,26 +6,17 @@ import com.idormy.sms.forwarder.database.entity.Logs class LogsRepository(private val logsDao: LogsDao) { - @WorkerThread - fun delete(id: Long) { - logsDao.delete(id) - } - - //@WorkerThread - //fun deleteTimeAgo(time: Long) { - // logsDao.deleteTimeAgo(time) - //} - @WorkerThread suspend fun insert(logs: Logs): Long = logsDao.insert(logs) @WorkerThread - fun updateStatus(id: Long, status: Int, response: String): Int = - logsDao.updateStatus(id, status, response) + fun delete(id: Long) = logsDao.delete(id) + + fun deleteAll() = logsDao.deleteAll() + + @WorkerThread + fun updateStatus(id: Long, status: Int, response: String): Int = logsDao.updateStatus(id, status, response) fun getOne(id: Long) = logsDao.getOne(id) - fun deleteAll() { - logsDao.deleteAll() - } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt index 6eeafe52..d83011b1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt @@ -6,21 +6,17 @@ import com.idormy.sms.forwarder.database.entity.Msg class MsgRepository(private val msgDao: MsgDao) { - @WorkerThread - fun delete(id: Long) { - msgDao.delete(id) - } - - @WorkerThread - fun deleteTimeAgo(time: Long) { - msgDao.deleteTimeAgo(time) - } - @WorkerThread suspend fun insert(msg: Msg): Long = msgDao.insert(msg) - fun deleteAll() { - msgDao.deleteAll() - } + @WorkerThread + fun delete(id: Long) = msgDao.delete(id) + + fun deleteAll() = msgDao.deleteAll() + + fun deleteAll(type: String) = msgDao.deleteAll(type) + + @WorkerThread + fun deleteTimeAgo(time: Long) = msgDao.deleteTimeAgo(time) } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt index 52facab4..052fa0ac 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt @@ -4,17 +4,14 @@ import androidx.annotation.WorkerThread import androidx.sqlite.db.SimpleSQLiteQuery import com.idormy.sms.forwarder.database.dao.RuleDao import com.idormy.sms.forwarder.database.entity.Rule +import io.reactivex.Single -class RuleRepository( - private val ruleDao: RuleDao, -) { +class RuleRepository(private val ruleDao: RuleDao) { private var listener: Listener? = null @WorkerThread - fun insert(rule: Rule) { - ruleDao.insert(rule) - } + fun insert(rule: Rule) = ruleDao.insert(rule) @WorkerThread fun delete(id: Long) { @@ -22,23 +19,26 @@ class RuleRepository( ruleDao.delete(id) } + fun deleteAll() = ruleDao.deleteAll() + + @WorkerThread + fun update(rule: Rule) = ruleDao.update(rule) + + fun updateStatusByIds(ids: List, status: Int) = ruleDao.updateStatusByIds(ids, status) + @WorkerThread fun get(id: Long) = ruleDao.get(id) @WorkerThread fun getOne(id: Long) = ruleDao.getOne(id) - fun getRuleList(type: String, status: Int, simSlot: String) = ruleDao.getRuleList(type, status, simSlot) - - @WorkerThread - fun update(rule: Rule) = ruleDao.update(rule) + fun getAll(): Single> = ruleDao.getAll() fun getAllNonCache(): List { val query = SimpleSQLiteQuery("SELECT * FROM Rule ORDER BY id ASC") return ruleDao.getAllRaw(query) } - fun deleteAll() { - ruleDao.deleteAll() - } + fun getRuleList(type: String, status: Int, simSlot: String) = ruleDao.getRuleList(type, status, simSlot) + } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/SenderRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/SenderRepository.kt index 41791ddd..ddcd0248 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/SenderRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/SenderRepository.kt @@ -4,6 +4,7 @@ import androidx.annotation.WorkerThread import androidx.sqlite.db.SimpleSQLiteQuery import com.idormy.sms.forwarder.database.dao.SenderDao import com.idormy.sms.forwarder.database.entity.Sender +import io.reactivex.Single import kotlinx.coroutines.flow.Flow class SenderRepository(private val senderDao: SenderDao) { @@ -19,22 +20,25 @@ class SenderRepository(private val senderDao: SenderDao) { senderDao.delete(id) } + fun deleteAll() = senderDao.deleteAll() + + fun update(sender: Sender) = senderDao.update(sender) + + fun updateStatusByIds(ids: List, status: Int) = senderDao.updateStatusByIds(ids, status) + fun get(id: Long) = senderDao.get(id) fun getOne(id: Long) = senderDao.getOne(id) fun getByIds(ids: List) = senderDao.getByIds(ids) - fun update(sender: Sender) = senderDao.update(sender) - fun getAllNonCache(): List { val query = SimpleSQLiteQuery("SELECT * FROM Sender ORDER BY id ASC") return senderDao.getAllRaw(query) } + fun getAll(): Single> = senderDao.getAll() + val count: Flow = senderDao.getOnCount() - fun deleteAll() { - senderDao.deleteAll() - } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/TaskRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/TaskRepository.kt index de4cafc8..bbd7d118 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/TaskRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/TaskRepository.kt @@ -4,27 +4,31 @@ import androidx.annotation.WorkerThread import androidx.sqlite.db.SimpleSQLiteQuery import com.idormy.sms.forwarder.database.dao.TaskDao import com.idormy.sms.forwarder.database.entity.Task +import java.util.Date class TaskRepository(private val taskDao: TaskDao) { @WorkerThread - fun insert(task: Task) = taskDao.insert(task) + fun insert(task: Task): Long = taskDao.insert(task) - suspend fun getOne(id: Long) = taskDao.getOne(id) + @WorkerThread + fun delete(id: Long) = taskDao.delete(id) + + fun deleteAll() = taskDao.deleteAll() fun update(task: Task) = taskDao.update(task) + fun updateExecTime(taskId: Long, lastExecTime: Date, nextExecTime: Date, status: Int) = taskDao.updateExecTime(taskId, lastExecTime, nextExecTime, status) + + fun get(id: Long) = taskDao.get(id) + + suspend fun getOne(id: Long) = taskDao.getOne(id) + fun getAllNonCache(): List { val query = SimpleSQLiteQuery("SELECT * FROM Task ORDER BY id ASC") return taskDao.getAllRaw(query) } - @WorkerThread - fun delete(id: Long) { - taskDao.delete(id) - } + fun getByType(type: Int): List = taskDao.getByType(type) - fun deleteAll() { - taskDao.deleteAll() - } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt b/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt index 519050aa..ee9e4ebe 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/viewmodel/TaskViewModel.kt @@ -26,7 +26,7 @@ class TaskViewModel(private val dao: TaskDao) : ViewModel() { initialLoadSize = 10 ) ) { - //TODO:根据条件查询,咱不使用 + //TODO:根据条件查询,暂不使用 //dao.pagingSource(type) if (type == "mine") dao.pagingSourceMine() else dao.pagingSourceFixed() }.flow.cachedIn(viewModelScope) diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/action/RuleSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/action/RuleSetting.kt index 36605ddc..db81e2bc 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/action/RuleSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/action/RuleSetting.kt @@ -5,6 +5,6 @@ import java.io.Serializable data class RuleSetting( var description: String = "", //描述 - var status: String = "enable", //状态: enable=启用,disable=禁用 + var status: Int = 1, //状态:0-禁用;1-启用 var ruleList: List, //转发规则列表 ) : Serializable diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/action/SenderSetting.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/action/SenderSetting.kt index edc85c7f..a02af270 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/action/SenderSetting.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/action/SenderSetting.kt @@ -5,6 +5,6 @@ import java.io.Serializable data class SenderSetting( var description: String = "", //描述 - var status: String = "enable", //状态: enable=启用,disable=禁用 + var status: Int = 1, //状态:0-禁用;1-启用 var senderList: List, //发送通道列表 ) : Serializable diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt index c4069f36..d98de60b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/LogsFragment.kt @@ -13,7 +13,7 @@ import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.activity.MainActivity import com.idormy.sms.forwarder.adapter.MsgPagingAdapter import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.LogsDetail import com.idormy.sms.forwarder.database.entity.MsgAndLogs import com.idormy.sms.forwarder.database.entity.Rule @@ -78,9 +78,7 @@ class LogsFragment : BaseFragment(), MsgPagingAdapter.OnIt .positiveText(R.string.lab_yes) .negativeText(R.string.lab_no) .onPositive { _: MaterialDialog?, _: DialogAction? -> - AppDatabase.getInstance(requireContext()) - .msgDao() - .deleteAll(currentType) + Core.msg.deleteAll(currentType) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : CompletableObserver { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt index 30437c39..62128e8c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/RulesEditFragment.kt @@ -16,7 +16,7 @@ import com.idormy.sms.forwarder.adapter.spinner.AppListSpinnerAdapter import com.idormy.sms.forwarder.adapter.spinner.SenderAdapterItem import com.idormy.sms.forwarder.adapter.spinner.SenderSpinnerAdapter import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Rule import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory @@ -405,7 +405,7 @@ class RulesEditFragment : BaseFragment(), View.OnClic //免打扰(禁用转发)时间段 binding!!.tvSilentPeriod.text = mTimeOption[silentPeriodStart] + " ~ " + mTimeOption[silentPeriodEnd] - AppDatabase.getInstance(requireContext()).senderDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { + Core.sender.getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { @@ -568,7 +568,7 @@ class RulesEditFragment : BaseFragment(), View.OnClic //初始化表单 private fun initForm() { - AppDatabase.getInstance(requireContext()).ruleDao().get(ruleId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + Core.rule.get(ruleId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt index 81618be0..d445c53f 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/TasksEditFragment.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.* -import androidx.fragment.app.viewModels import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -18,10 +17,8 @@ import com.idormy.sms.forwarder.adapter.ItemMoveCallback import com.idormy.sms.forwarder.adapter.TaskSettingAdapter import com.idormy.sms.forwarder.adapter.WidgetItemAdapter import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Task -import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory -import com.idormy.sms.forwarder.database.viewmodel.TaskViewModel import com.idormy.sms.forwarder.databinding.FragmentTasksEditBinding import com.idormy.sms.forwarder.entity.TaskSetting import com.idormy.sms.forwarder.entity.condition.CronSetting @@ -59,7 +56,6 @@ class TasksEditFragment : BaseFragment(), View.OnClic private val TAG: String = TasksEditFragment::class.java.simpleName private val that = this private var titleBar: TitleBar? = null - private val viewModel by viewModels { BaseViewModelFactory(context) } private val dialog: BottomSheetDialog by lazy { BottomSheetDialog(requireContext()) } @JvmField @@ -345,10 +341,14 @@ class TasksEditFragment : BaseFragment(), View.OnClic val taskNew = checkForm() if (isClone) taskNew.id = 0 Log.d(TAG, taskNew.toString()) + //保存任务 + if (taskNew.id > 0) { + Core.task.update(taskNew) + } else { + taskNew.id = Core.task.insert(taskNew) + } //应用任务 applyTask(taskNew) - //保存任务 - viewModel.insertOrUpdate(taskNew) XToastUtils.success(R.string.tipSaveSuccess) popToBack() return @@ -363,7 +363,7 @@ class TasksEditFragment : BaseFragment(), View.OnClic //初始化表单 private fun initForm() { - AppDatabase.getInstance(requireContext()).taskDao().get(taskId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + Core.task.get(taskId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { @@ -464,6 +464,7 @@ class TasksEditFragment : BaseFragment(), View.OnClic when (task.type) { //定时任务 TASK_CONDITION_CRON -> { + if (task.id <= 0) return //取消旧任务的定时器 & 设置新的定时器 CronJobScheduler.cancelTask(task.id) CronJobScheduler.scheduleTask(task) @@ -490,7 +491,7 @@ class TasksEditFragment : BaseFragment(), View.OnClic //必须开启定位服务,才能使用进入地点 或 离开地点 类型条件 if ((typeCondition == TASK_CONDITION_TO_ADDRESS || typeCondition == TASK_CONDITION_LEAVE_ADDRESS) && !App.LocationClient.isStarted()) { MaterialDialog.Builder(requireContext()) - .iconRes(R.drawable.icon_location) + .iconRes(R.drawable.auto_task_icon_location) .title(R.string.enable_location) .content(R.string.enable_location_dialog) .cancelable(false) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/FrpcFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/FrpcFragment.kt index 2b8f3803..8ffb1c0a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/FrpcFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/FrpcFragment.kt @@ -5,9 +5,17 @@ import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView import com.google.gson.Gson import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.adapter.spinner.FrpcAdapterItem +import com.idormy.sms.forwarder.adapter.spinner.FrpcSpinnerAdapter import com.idormy.sms.forwarder.core.BaseFragment +import com.idormy.sms.forwarder.core.Core +import com.idormy.sms.forwarder.database.entity.Frpc import com.idormy.sms.forwarder.databinding.FragmentTasksActionFrpcBinding import com.idormy.sms.forwarder.entity.action.FrpcSetting import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION @@ -15,6 +23,7 @@ import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION import com.idormy.sms.forwarder.utils.Log +import com.idormy.sms.forwarder.utils.STATUS_ON import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC import com.idormy.sms.forwarder.utils.XToastUtils import com.jeremyliao.liveeventbus.LiveEventBus @@ -24,6 +33,11 @@ import com.xuexiang.xrouter.annotation.AutoWired import com.xuexiang.xrouter.launcher.XRouter import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.widget.actionbar.TitleBar +import com.xuexiang.xutil.resource.ResUtils.getDrawable +import io.reactivex.SingleObserver +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers @Page(name = "Frpc") @Suppress("PrivatePropertyName") @@ -33,6 +47,16 @@ class FrpcFragment : BaseFragment(), View.OnCli private var titleBar: TitleBar? = null private var mCountDownHelper: CountDownButtonHelper? = null + //当前发送通道 + private var frpcUid = "" + private var frpcListSelected: MutableList = mutableListOf() + private var frpcItemMap = HashMap(2) + + //发送通道列表 + private var frpcListAll: MutableList = mutableListOf() + private val frpcSpinnerList = ArrayList() + private lateinit var frpcSpinnerAdapter: FrpcSpinnerAdapter<*> + @JvmField @AutoWired(name = KEY_EVENT_DATA_ACTION) var eventData: String? = null @@ -69,28 +93,15 @@ class FrpcFragment : BaseFragment(), View.OnCli } }) - binding!!.rgFrpcState.setOnCheckedChangeListener { _, checkedId -> - when (checkedId) { - R.id.rb_start_server -> { - binding!!.layoutStartServer.visibility = View.VISIBLE - binding!!.layoutStopServer.visibility = View.GONE - } - - R.id.rb_stop_server -> { - binding!!.layoutStartServer.visibility = View.GONE - binding!!.layoutStopServer.visibility = View.VISIBLE - } - } - } - Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, FrpcSetting::class.java) - binding!!.etStartUid.setText(settingVo.uids) - binding!!.etStopUid.setText(settingVo.uids) binding!!.rgFrpcState.check(if (settingVo.action == "start") R.id.rb_start_server else R.id.rb_stop_server) Log.d(TAG, "initViews settingVo:$settingVo") } + + //初始化发送通道下拉框 + initFrpcSpinner() } @SuppressLint("SetTextI18n") @@ -151,23 +162,131 @@ class FrpcFragment : BaseFragment(), View.OnCli } } + //初始化发送通道下拉框 + @SuppressLint("SetTextI18n") + private fun initFrpcSpinner() { + Core.frpc.getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { + override fun onSubscribe(d: Disposable) {} + + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "initFrpcSpinner error: ${e.message}") + } + + override fun onSuccess(frpcList: List) { + if (frpcList.isEmpty()) { + XToastUtils.error(R.string.add_frpc_first) + return + } + + frpcListAll = frpcList as MutableList + for (frpc in frpcList) { + val name = if (frpc.name.length > 20) frpc.name.substring(0, 19) else frpc.name + frpcSpinnerList.add(FrpcAdapterItem(name, getDrawable(R.drawable.auto_task_icon_frpc), frpc.uid, frpc.autorun)) + } + frpcSpinnerAdapter = FrpcSpinnerAdapter(frpcSpinnerList) + .setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg) + binding!!.spFrpc.setAdapter(frpcSpinnerAdapter) + + if (frpcListSelected.isNotEmpty()) { + for (frpc in frpcListSelected) { + for (frpcItem in frpcSpinnerList) { + if (frpc.uid == frpcItem.uid) { + addFrpcItemLinearLayout(frpcItemMap, binding!!.layoutFrpcs, frpcItem) + } + } + } + } + } + }) + binding!!.spFrpc.setOnItemClickListener { _: AdapterView<*>, _: View, position: Int, _: Long -> + try { + val frpc = frpcSpinnerAdapter.getItemSource(position) as FrpcAdapterItem + frpcUid = frpc.uid + if (frpcUid.isNotEmpty()) { + frpcListSelected.forEach { + if (frpcUid == it.uid) { + XToastUtils.warning(getString(R.string.frpc_contains_tips)) + return@setOnItemClickListener + } + } + frpcListAll.forEach { + if (frpcUid == it.uid) { + frpcListSelected.add(it) + addFrpcItemLinearLayout(frpcItemMap, binding!!.layoutFrpcs, frpc) + } + } + + /*if (STATUS_OFF == frpc.status) { + XToastUtils.warning(getString(R.string.frpc_disabled_tips)) + }*/ + } + } catch (e: Exception) { + XToastUtils.error(e.message.toString()) + } + } + } + + /** + * 动态增删Frpc + * + * @param frpcItemMap 管理item的map,用于删除指定header + * @param layoutFrpcs 需要挂载item的LinearLayout + * @param frpc FrpcAdapterItem + */ + @SuppressLint("SetTextI18n") + private fun addFrpcItemLinearLayout( + frpcItemMap: MutableMap, layoutFrpcs: LinearLayout, frpc: FrpcAdapterItem + ) { + val layoutFrpcItem = View.inflate(requireContext(), R.layout.item_add_frpc, null) as LinearLayout + val ivRemoveFrpc = layoutFrpcItem.findViewById(R.id.iv_remove_frpc) + val ivFrpcImage = layoutFrpcItem.findViewById(R.id.iv_frpc_image) + val ivFrpcStatus = layoutFrpcItem.findViewById(R.id.iv_frpc_status) + val tvFrpcName = layoutFrpcItem.findViewById(R.id.tv_frpc_name) + + ivFrpcImage.setImageDrawable(frpc.icon) + ivFrpcStatus.setImageDrawable(getDrawable(if (STATUS_ON == frpc.autorun) R.drawable.ic_autorun else R.drawable.ic_manual)) + val frpcItemId = frpc.uid + tvFrpcName.text = frpc.title + + ivRemoveFrpc.tag = frpcItemId + ivRemoveFrpc.setOnClickListener { view2: View -> + val tagId = view2.tag + layoutFrpcs.removeView(frpcItemMap[tagId]) + frpcItemMap.remove(tagId) + //frpcListSelected.removeIf { it.uid == tagId } + for (it in frpcListSelected) { + if (it.uid == tagId) { + frpcListSelected -= it + break + } + } + Log.d(TAG, frpcListSelected.count().toString()) + Log.d(TAG, frpcListSelected.toString()) + if (frpcListSelected.isEmpty()) frpcUid = "" + } + layoutFrpcs.addView(layoutFrpcItem) + frpcItemMap[frpcItemId] = layoutFrpcItem + } + //检查设置 @SuppressLint("SetTextI18n") private fun checkSetting(): FrpcSetting { - val startUid = binding!!.etStartUid.text.toString().trim() - val stopUid = binding!!.etStopUid.text.toString().trim() - val description: String - val action: String - val uids: String - if (binding!!.rgFrpcState.checkedRadioButtonId == R.id.rb_start_server) { - description = if (startUid == "") "启动全部自启动的Frpc" else "启动UID为${startUid}的Frpc" - action = "start" - uids = startUid + val description = StringBuilder() + val action = if (binding!!.rgFrpcState.checkedRadioButtonId == R.id.rb_start_server) { + description.append(getString(R.string.enable)) + "start" } else { - description = if (stopUid == "") "停止全部自启动的Frpc" else "停止UID为${stopUid}的Frpc" - action = "stop" - uids = stopUid + description.append(getString(R.string.disable)) + "stop" } - return FrpcSetting(description, action, uids) + if (frpcListSelected.isEmpty()) { + description.append(getString(R.string.all_auto_started_frpc)) + } else { + description.append(getString(R.string.specified_frpc)).append(": ") + description.append(frpcListSelected.joinToString(",") { it.name }) + } + + return FrpcSetting(description.toString(), action, frpcListSelected) } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt index f6c30ae6..561868af 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/HttpServerFragment.kt @@ -215,10 +215,10 @@ class HttpServerFragment : BaseFragment() val action = if (binding!!.rgHttpServerState.checkedRadioButtonId == R.id.rb_start_server) { description.append(getString(R.string.start_server)) if (enableList.isNotEmpty()) { - description.append(", ").append(getString(R.string.enable_function)).append(": ").append(enableList.joinToString("/")) + description.append(", ").append(getString(R.string.enable_function)).append(": ").append(enableList.joinToString(",")) } if (disableList.isNotEmpty()) { - description.append(", ").append(getString(R.string.disable_function)).append(": ").append(disableList.joinToString("/")) + description.append(", ").append(getString(R.string.disable_function)).append(": ").append(disableList.joinToString(",")) } "start" } else { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/NotificationFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/NotificationFragment.kt index 8d52d5d9..a3cae857 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/NotificationFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/NotificationFragment.kt @@ -11,7 +11,7 @@ import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.adapter.spinner.SenderAdapterItem import com.idormy.sms.forwarder.adapter.spinner.SenderSpinnerAdapter import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Rule import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.databinding.FragmentTasksActionNotificationBinding @@ -268,7 +268,7 @@ class NotificationFragment : BaseFragment { val settingVo = checkSetting() - var description = getString(R.string.select_sender) + ": " + var description = getString(R.string.task_notification) + ": " description += settingVo.senderList.joinToString(",") { it.name } if (settingVo.senderList.size > 1) { description += "; " + getString(R.string.sender_logic) + ": " + when (settingVo.senderLogic) { @@ -298,7 +298,7 @@ class NotificationFragment : BaseFragment> { + Core.sender.getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/RuleFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/RuleFragment.kt index dc800951..84b7b384 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/RuleFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/RuleFragment.kt @@ -14,7 +14,7 @@ import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.adapter.spinner.RuleAdapterItem import com.idormy.sms.forwarder.adapter.spinner.RuleSpinnerAdapter import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Rule import com.idormy.sms.forwarder.databinding.FragmentTasksActionRuleBinding import com.idormy.sms.forwarder.entity.action.RuleSetting @@ -24,7 +24,7 @@ import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION import com.idormy.sms.forwarder.utils.Log import com.idormy.sms.forwarder.utils.STATUS_OFF -import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER +import com.idormy.sms.forwarder.utils.TASK_ACTION_RULE import com.idormy.sms.forwarder.utils.XToastUtils import com.jeremyliao.liveeventbus.LiveEventBus import com.xuexiang.xaop.annotation.SingleClick @@ -52,7 +52,7 @@ class RuleFragment : BaseFragment(), View.OnCli private var ruleListSelected: MutableList = mutableListOf() private var ruleItemMap = HashMap(2) - //发送通道列表 + //转发规则列表 private var ruleListAll: MutableList = mutableListOf() private val ruleSpinnerList = ArrayList() private lateinit var ruleSpinnerAdapter: RuleSpinnerAdapter<*> @@ -96,7 +96,7 @@ class RuleFragment : BaseFragment(), View.OnCli Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, RuleSetting::class.java) - binding!!.rgStatus.check(if (settingVo.status == "enable") R.id.rb_status_enable else R.id.rb_status_disable) + binding!!.rgStatus.check(if (settingVo.status == 1) R.id.rb_status_enable else R.id.rb_status_disable) Log.d(TAG, settingVo.ruleList.toString()) settingVo.ruleList.forEach { ruleId = it.id @@ -105,7 +105,7 @@ class RuleFragment : BaseFragment(), View.OnCli Log.d(TAG, "initViews settingVo:$settingVo") } - //初始化发送通道下拉框 + //初始化转发规则下拉框 initRuleSpinner() } @@ -155,7 +155,7 @@ class RuleFragment : BaseFragment(), View.OnCli val intent = Intent() intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description) intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo)) - setFragmentResult(TASK_ACTION_SENDER, intent) + setFragmentResult(TASK_ACTION_RULE, intent) popToBack() return } @@ -167,10 +167,10 @@ class RuleFragment : BaseFragment(), View.OnCli } } - //初始化发送通道下拉框 + //初始化转发规则下拉框 @SuppressLint("SetTextI18n") private fun initRuleSpinner() { - AppDatabase.getInstance(requireContext()).ruleDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { + Core.rule.getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { @@ -187,7 +187,13 @@ class RuleFragment : BaseFragment(), View.OnCli ruleListAll = ruleList as MutableList for (rule in ruleList) { val name = if (rule.name.length > 20) rule.name.substring(0, 19) else rule.name - ruleSpinnerList.add(RuleAdapterItem(name, getDrawable(rule.imageId), rule.id, rule.status)) + val icon = when (rule.type) { + "sms" -> R.drawable.auto_task_icon_sms + "call" -> R.drawable.auto_task_icon_incall + "app" -> R.drawable.auto_task_icon_start_activity + else -> R.drawable.auto_task_icon_sms + } + ruleSpinnerList.add(RuleAdapterItem(name, getDrawable(icon), rule.id, rule.status)) } ruleSpinnerAdapter = RuleSpinnerAdapter(ruleSpinnerList) .setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg) @@ -222,9 +228,9 @@ class RuleFragment : BaseFragment(), View.OnCli } } - if (STATUS_OFF == rule.status) { + /*if (STATUS_OFF == rule.status) { XToastUtils.warning(getString(R.string.rule_disabled_tips)) - } + }*/ } } catch (e: Exception) { XToastUtils.error(e.message.toString()) @@ -277,21 +283,21 @@ class RuleFragment : BaseFragment(), View.OnCli //检查设置 @SuppressLint("SetTextI18n") private fun checkSetting(): RuleSetting { + if (ruleListSelected.isEmpty() || ruleId == 0L) { + throw Exception(getString(R.string.new_sender_first)) + } + val description = StringBuilder() - val status: String + val status: Int if (binding!!.rgStatus.checkedRadioButtonId == R.id.rb_status_enable) { - status = "enable" + status = 1 description.append(getString(R.string.enable)) } else { - status = "disable" + status = 0 description.append(getString(R.string.disable)) } - description.append(getString(R.string.menu_rules)) - - if (ruleListSelected.isNotEmpty()) { - description.append(", ").append(getString(R.string.specified_rule)).append(": ") - description.append(ruleListSelected.joinToString("/") { it.id.toString() }) - } + description.append(getString(R.string.menu_rules)).append(", ").append(getString(R.string.specified_rule)).append(": ") + description.append(ruleListSelected.joinToString(",") { it.id.toString() }) return RuleSetting(description.toString(), status, ruleListSelected) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SenderFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SenderFragment.kt index 8ae605e2..0366f6aa 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SenderFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SenderFragment.kt @@ -14,7 +14,7 @@ import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.adapter.spinner.SenderAdapterItem import com.idormy.sms.forwarder.adapter.spinner.SenderSpinnerAdapter import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.databinding.FragmentTasksActionSenderBinding import com.idormy.sms.forwarder.entity.action.SenderSetting @@ -96,7 +96,7 @@ class SenderFragment : BaseFragment(), View.O Log.d(TAG, "initViews eventData:$eventData") if (eventData != null) { val settingVo = Gson().fromJson(eventData, SenderSetting::class.java) - binding!!.rgStatus.check(if (settingVo.status == "enable") R.id.rb_status_enable else R.id.rb_status_disable) + binding!!.rgStatus.check(if (settingVo.status == 1) R.id.rb_status_enable else R.id.rb_status_disable) Log.d(TAG, settingVo.senderList.toString()) settingVo.senderList.forEach { senderId = it.id @@ -170,7 +170,7 @@ class SenderFragment : BaseFragment(), View.O //初始化发送通道下拉框 @SuppressLint("SetTextI18n") private fun initSenderSpinner() { - AppDatabase.getInstance(requireContext()).senderDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { + Core.sender.getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver> { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { @@ -222,9 +222,9 @@ class SenderFragment : BaseFragment(), View.O } } - if (STATUS_OFF == sender.status) { + /*if (STATUS_OFF == sender.status) { XToastUtils.warning(getString(R.string.sender_disabled_tips)) - } + }*/ } } catch (e: Exception) { XToastUtils.error(e.message.toString()) @@ -277,21 +277,21 @@ class SenderFragment : BaseFragment(), View.O //检查设置 @SuppressLint("SetTextI18n") private fun checkSetting(): SenderSetting { + if (senderListSelected.isEmpty() || senderId == 0L) { + throw Exception(getString(R.string.new_sender_first)) + } + val description = StringBuilder() - val status: String + val status: Int if (binding!!.rgStatus.checkedRadioButtonId == R.id.rb_status_enable) { - status = "enable" + status = 1 description.append(getString(R.string.enable)) } else { - status = "disable" + status = 0 description.append(getString(R.string.disable)) } - description.append(getString(R.string.menu_senders)) - - if (senderListSelected.isNotEmpty()) { - description.append(", ").append(getString(R.string.specified_sender)).append(": ") - description.append(senderListSelected.joinToString("/") { it.name }) - } + description.append(getString(R.string.menu_senders)).append(", ").append(getString(R.string.specified_sender)).append(": ") + description.append(senderListSelected.joinToString(",") { it.name }) return SenderSetting(description.toString(), status, senderListSelected) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SettingsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SettingsFragment.kt index 86b89e82..b52de1bc 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SettingsFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/action/SettingsFragment.kt @@ -476,10 +476,10 @@ class SettingsFragment : BaseFragment(), Vi val description = StringBuilder() if (enableList.isNotEmpty()) { - description.append(" ").append(getString(R.string.enable_function)).append(": ").append(enableList.joinToString("/")) + description.append(" ").append(getString(R.string.enable_function)).append(": ").append(enableList.joinToString(",")) } if (disableList.isNotEmpty()) { - description.append(" ").append(getString(R.string.disable_function)).append(": ").append(disableList.joinToString("/")) + description.append(" ").append(getString(R.string.disable_function)).append(": ").append(disableList.joinToString(",")) } return SettingsSetting(description.toString().trim(), enableSms, enablePhone, enableCallType1, enableCallType2, enableCallType3, enableCallType4, enableCallType5, enableCallType6, enableAppNotify, enableCancelAppNotify, enableNotUserPresent, enableLocation, locationAccuracy, locationPowerRequirement, locationMinInterval, locationMinDistance, enableSmsCommand, smsCommandSafePhone, enableLoadAppList, enableLoadUserAppList, enableLoadSystemAppList, cancelExtraAppNotify, duplicateMessagesLimits) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt index da8690cd..06e89692 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/LeaveAddressFragment.kt @@ -172,7 +172,7 @@ class LeaveAddressFragment : BaseFragment { if (!App.LocationClient.isStarted()) { - MaterialDialog.Builder(requireContext()).iconRes(R.drawable.icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + MaterialDialog.Builder(requireContext()).iconRes(R.drawable.auto_task_icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> SettingUtils.enableLocation = true val serviceIntent = Intent(requireContext(), LocationService::class.java) serviceIntent.action = "START" diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt index cc7db5e1..19a6c8e1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/condition/ToAddressFragment.kt @@ -172,7 +172,7 @@ class ToAddressFragment : BaseFragment( when (v.id) { R.id.btn_current_coordinates -> { if (!App.LocationClient.isStarted()) { - MaterialDialog.Builder(requireContext()).iconRes(R.drawable.icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + MaterialDialog.Builder(requireContext()).iconRes(R.drawable.auto_task_icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> SettingUtils.enableLocation = true val serviceIntent = Intent(requireContext(), LocationService::class.java) serviceIntent.action = "START" diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/BarkFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/BarkFragment.kt index 437b97e2..3d674f52 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/BarkFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/BarkFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -145,7 +145,7 @@ class BarkFragment : BaseFragment(), View.OnClickLi //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()).senderDao().get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkGroupRobotFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkGroupRobotFragment.kt index f25ff359..d55562b1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkGroupRobotFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkGroupRobotFragment.kt @@ -11,7 +11,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -105,41 +105,36 @@ class DingtalkGroupRobotFragment : BaseFragment { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, DingtalkGroupRobotSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etToken.setText(settingVo.token) - binding!!.etSecret.setText(settingVo.secret) - binding!!.sbAtAll.isChecked = settingVo.atAll == true - binding!!.etAtMobiles.setText(settingVo.atMobiles) - binding!!.etAtDingtalkIds.setText(settingVo.atDingtalkIds) - binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) - binding!!.etTitleTemplate.setText(settingVo.titleTemplate) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, DingtalkGroupRobotSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etToken.setText(settingVo.token) + binding!!.etSecret.setText(settingVo.secret) + binding!!.sbAtAll.isChecked = settingVo.atAll == true + binding!!.etAtMobiles.setText(settingVo.atMobiles) + binding!!.etAtDingtalkIds.setText(settingVo.atDingtalkIds) + binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) + binding!!.etTitleTemplate.setText(settingVo.titleTemplate) + } + } + }) } override fun initListeners() { @@ -220,17 +215,11 @@ class DingtalkGroupRobotFragment : BaseFragment - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkInnerRobotFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkInnerRobotFragment.kt index 4eb90e5a..28862ace 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkInnerRobotFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/DingtalkInnerRobotFragment.kt @@ -12,7 +12,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -99,46 +99,41 @@ class DingtalkInnerRobotFragment : BaseFragment { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, DingtalkInnerRobotSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etAgentID.setText(settingVo.agentID) - binding!!.etAppKey.setText(settingVo.appKey) - binding!!.etAppSecret.setText(settingVo.appSecret) - binding!!.etUserIds.setText(settingVo.userIds) - binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) - binding!!.etTitleTemplate.setText(settingVo.titleTemplate) - binding!!.rgProxyType.check(settingVo.getProxyTypeCheckId()) - binding!!.etProxyHost.setText(settingVo.proxyHost) - binding!!.etProxyPort.setText(settingVo.proxyPort) - binding!!.sbProxyAuthenticator.isChecked = settingVo.proxyAuthenticator == true - binding!!.etProxyUsername.setText(settingVo.proxyUsername) - binding!!.etProxyPassword.setText(settingVo.proxyPassword) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, DingtalkInnerRobotSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etAgentID.setText(settingVo.agentID) + binding!!.etAppKey.setText(settingVo.appKey) + binding!!.etAppSecret.setText(settingVo.appSecret) + binding!!.etUserIds.setText(settingVo.userIds) + binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) + binding!!.etTitleTemplate.setText(settingVo.titleTemplate) + binding!!.rgProxyType.check(settingVo.getProxyTypeCheckId()) + binding!!.etProxyHost.setText(settingVo.proxyHost) + binding!!.etProxyPort.setText(settingVo.proxyPort) + binding!!.sbProxyAuthenticator.isChecked = settingVo.proxyAuthenticator == true + binding!!.etProxyUsername.setText(settingVo.proxyUsername) + binding!!.etProxyPassword.setText(settingVo.proxyPassword) + } + } + }) } override fun initListeners() { @@ -228,17 +223,11 @@ class DingtalkInnerRobotFragment : BaseFragment - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/EmailFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/EmailFragment.kt index 4298b4cd..a042fdc9 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/EmailFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/EmailFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -121,50 +121,45 @@ class EmailFragment : BaseFragment(), View.OnClick //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } + + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, EmailSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - if (!TextUtils.isEmpty(settingVo.mailType)) { - mailType = settingVo.mailType.toString() - binding!!.spMailType.setSelectedItem(mailType) - if (mailType != getString(R.string.other_mail_type)) { - binding!!.layoutServiceSetting.visibility = View.GONE - } + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, EmailSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + if (!TextUtils.isEmpty(settingVo.mailType)) { + mailType = settingVo.mailType.toString() + binding!!.spMailType.setSelectedItem(mailType) + if (mailType != getString(R.string.other_mail_type)) { + binding!!.layoutServiceSetting.visibility = View.GONE } - binding!!.etFromEmail.setText(settingVo.fromEmail) - binding!!.etPwd.setText(settingVo.pwd) - binding!!.etNickname.setText(settingVo.nickname) - binding!!.etHost.setText(settingVo.host) - binding!!.etPort.setText(settingVo.port) - binding!!.sbSsl.isChecked = settingVo.ssl == true - binding!!.sbStartTls.isChecked = settingVo.startTls == true - binding!!.etToEmail.setText(settingVo.toEmail) - binding!!.etTitleTemplate.setText(settingVo.title) } + binding!!.etFromEmail.setText(settingVo.fromEmail) + binding!!.etPwd.setText(settingVo.pwd) + binding!!.etNickname.setText(settingVo.nickname) + binding!!.etHost.setText(settingVo.host) + binding!!.etPort.setText(settingVo.port) + binding!!.sbSsl.isChecked = settingVo.ssl == true + binding!!.sbStartTls.isChecked = settingVo.startTls == true + binding!!.etToEmail.setText(settingVo.toEmail) + binding!!.etTitleTemplate.setText(settingVo.title) } - }) + } + }) } override fun initListeners() { @@ -253,17 +248,11 @@ class EmailFragment : BaseFragment(), View.OnClick return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt index e37389df..1c392556 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuAppFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -103,9 +103,7 @@ class FeishuAppFragment : BaseFragment(), View //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) + Core.sender.get(senderId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : SingleObserver { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt index 7e8e3ff9..524bd971 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/FeishuFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -103,38 +103,33 @@ class FeishuFragment : BaseFragment(), View.OnCli //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, FeishuSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etWebhook.setText(settingVo.webhook) - binding!!.etSecret.setText(settingVo.secret) - binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) - binding!!.etTitleTemplate.setText(settingVo.titleTemplate) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, FeishuSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etWebhook.setText(settingVo.webhook) + binding!!.etSecret.setText(settingVo.secret) + binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) + binding!!.etTitleTemplate.setText(settingVo.titleTemplate) + } + } + }) } override fun initListeners() { @@ -198,17 +193,11 @@ class FeishuFragment : BaseFragment(), View.OnCli return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/GotifyFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/GotifyFragment.kt index 9dd0ea2e..86b77b62 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/GotifyFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/GotifyFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -103,37 +103,32 @@ class GotifyFragment : BaseFragment(), View.OnCli //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError $e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError $e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, GotifySetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etWebServer.setText(settingVo.webServer) - binding!!.etTitleTemplate.setText(settingVo.title) - binding!!.etPriority.setText(settingVo.priority) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, GotifySetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etWebServer.setText(settingVo.webServer) + binding!!.etTitleTemplate.setText(settingVo.title) + binding!!.etPriority.setText(settingVo.priority) + } + } + }) } override fun initListeners() { @@ -197,17 +192,11 @@ class GotifyFragment : BaseFragment(), View.OnCli return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/PushplusFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/PushplusFragment.kt index 8a99c119..dc37198d 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/PushplusFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/PushplusFragment.kt @@ -10,7 +10,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -104,47 +104,42 @@ class PushplusFragment : BaseFragment(), View.O //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } + + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, PushplusSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + if (TextUtils.isEmpty(settingVo.website) || settingVo.website == getString(R.string.pushplus_plus)) { + binding!!.rgWebsite.check(R.id.rb_website_plus) } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, PushplusSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - if (TextUtils.isEmpty(settingVo.website) || settingVo.website == getString(R.string.pushplus_plus)) { - binding!!.rgWebsite.check(R.id.rb_website_plus) - } else { - binding!!.rgWebsite.check(R.id.rb_website_hxtrip) - } - binding!!.etToken.setText(settingVo.token) - binding!!.etTopic.setText(settingVo.topic) - binding!!.etTemplate.setText(settingVo.template) - binding!!.etChannel.setText(settingVo.channel) - binding!!.etWebhook.setText(settingVo.webhook) - binding!!.etCallbackUrl.setText(settingVo.callbackUrl) - binding!!.etValidTime.setText(settingVo.validTime) - binding!!.etTitleTemplate.setText(settingVo.titleTemplate) + binding!!.rgWebsite.check(R.id.rb_website_hxtrip) } + binding!!.etToken.setText(settingVo.token) + binding!!.etTopic.setText(settingVo.topic) + binding!!.etTemplate.setText(settingVo.template) + binding!!.etChannel.setText(settingVo.channel) + binding!!.etWebhook.setText(settingVo.webhook) + binding!!.etCallbackUrl.setText(settingVo.callbackUrl) + binding!!.etValidTime.setText(settingVo.validTime) + binding!!.etTitleTemplate.setText(settingVo.titleTemplate) } - }) + } + }) } override fun initListeners() { @@ -217,17 +212,11 @@ class PushplusFragment : BaseFragment(), View.O return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/ServerchanFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/ServerchanFragment.kt index 691b7ea4..c150c173 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/ServerchanFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/ServerchanFragment.kt @@ -8,7 +8,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -101,37 +101,32 @@ class ServerchanFragment : BaseFragment(), Vi //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, ServerchanSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etSendKey.setText(settingVo.sendKey) - binding!!.etChannel.setText(settingVo.channel) - binding!!.etOpenid.setText(settingVo.openid) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, ServerchanSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etSendKey.setText(settingVo.sendKey) + binding!!.etChannel.setText(settingVo.channel) + binding!!.etOpenid.setText(settingVo.openid) + } + } + }) } override fun initListeners() { @@ -170,17 +165,11 @@ class ServerchanFragment : BaseFragment(), Vi return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SmsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SmsFragment.kt index 2fc196ec..c012ab9a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SmsFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SmsFragment.kt @@ -11,7 +11,7 @@ import com.hjq.permissions.Permission import com.hjq.permissions.XXPermissions import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -86,27 +86,25 @@ class SmsFragment : BaseFragment(), View.OnClickList */ override fun initViews() { //检查发短信权限 - XXPermissions.with(this) - .permission(Permission.SEND_SMS) - .request(object : OnPermissionCallback { - override fun onGranted(permissions: List, all: Boolean) { - if (!all) { - XToastUtils.error(R.string.toast_granted_part) - HttpServerUtils.enableApiSmsSend = false - } - } - - override fun onDenied(permissions: List, never: Boolean) { + XXPermissions.with(this).permission(Permission.SEND_SMS).request(object : OnPermissionCallback { + override fun onGranted(permissions: List, all: Boolean) { + if (!all) { + XToastUtils.error(R.string.toast_granted_part) HttpServerUtils.enableApiSmsSend = false - if (never) { - XToastUtils.error(R.string.toast_denied_never) - // 如果是被永久拒绝就跳转到应用权限系统设置页面 - XXPermissions.startPermissionActivity(requireContext(), permissions) - } else { - XToastUtils.error(R.string.toast_denied) - } } - }) + } + + override fun onDenied(permissions: List, never: Boolean) { + HttpServerUtils.enableApiSmsSend = false + if (never) { + XToastUtils.error(R.string.toast_denied_never) + // 如果是被永久拒绝就跳转到应用权限系统设置页面 + XXPermissions.startPermissionActivity(requireContext(), permissions) + } else { + XToastUtils.error(R.string.toast_denied) + } + } + }) //测试按钮增加倒计时,避免重复点击 mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, SettingUtils.requestTimeout) @@ -129,37 +127,32 @@ class SmsFragment : BaseFragment(), View.OnClickList //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, SmsSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.rgSimSlot.check(settingVo.getSmsSimSlotCheckId()) - binding!!.etMobiles.setText(settingVo.mobiles) - binding!!.sbOnlyNoNetwork.isChecked = settingVo.onlyNoNetwork == true - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, SmsSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.rgSimSlot.check(settingVo.getSmsSimSlotCheckId()) + binding!!.etMobiles.setText(settingVo.mobiles) + binding!!.sbOnlyNoNetwork.isChecked = settingVo.onlyNoNetwork == true + } + } + }) } override fun initListeners() { @@ -204,17 +197,11 @@ class SmsFragment : BaseFragment(), View.OnClickList return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SocketFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SocketFragment.kt index 1fca07da..7fe2a30f 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SocketFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/SocketFragment.kt @@ -9,7 +9,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -103,7 +103,7 @@ class SocketFragment : BaseFragment(), View.OnCli //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()).senderDao().get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { override fun onSubscribe(d: Disposable) {} override fun onError(e: Throwable) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/TelegramFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/TelegramFragment.kt index e76adbee..ad44cb38 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/TelegramFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/TelegramFragment.kt @@ -10,7 +10,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -104,43 +104,38 @@ class TelegramFragment : BaseFragment(), View.O //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, TelegramSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.rgMethod.check(settingVo.getMethodCheckId()) - binding!!.etApiToken.setText(settingVo.apiToken) - binding!!.etChatId.setText(settingVo.chatId) - binding!!.rgProxyType.check(settingVo.getProxyTypeCheckId()) - binding!!.etProxyHost.setText(settingVo.proxyHost) - binding!!.etProxyPort.setText(settingVo.proxyPort) - binding!!.sbProxyAuthenticator.isChecked = settingVo.proxyAuthenticator == true - binding!!.etProxyUsername.setText(settingVo.proxyUsername) - binding!!.etProxyPassword.setText(settingVo.proxyPassword) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, TelegramSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.rgMethod.check(settingVo.getMethodCheckId()) + binding!!.etApiToken.setText(settingVo.apiToken) + binding!!.etChatId.setText(settingVo.chatId) + binding!!.rgProxyType.check(settingVo.getProxyTypeCheckId()) + binding!!.etProxyHost.setText(settingVo.proxyHost) + binding!!.etProxyPort.setText(settingVo.proxyPort) + binding!!.sbProxyAuthenticator.isChecked = settingVo.proxyAuthenticator == true + binding!!.etProxyUsername.setText(settingVo.proxyUsername) + binding!!.etProxyPassword.setText(settingVo.proxyPassword) + } + } + }) } override fun initListeners() { @@ -196,17 +191,11 @@ class TelegramFragment : BaseFragment(), View.O return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/UrlSchemeFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/UrlSchemeFragment.kt index 8819d2f5..006e70c2 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/UrlSchemeFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/UrlSchemeFragment.kt @@ -12,7 +12,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -106,35 +106,30 @@ class UrlSchemeFragment : BaseFragment(), View //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, UrlSchemeSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etUrlScheme.setText(settingVo.urlScheme) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, UrlSchemeSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etUrlScheme.setText(settingVo.urlScheme) + } + } + }) } override fun initListeners() { @@ -173,17 +168,11 @@ class UrlSchemeFragment : BaseFragment(), View return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WebhookFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WebhookFragment.kt index 00e38987..bf7da0ab 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WebhookFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WebhookFragment.kt @@ -11,7 +11,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -87,8 +87,7 @@ class WebhookFragment : BaseFragment(), View.OnC override fun initViews() { //测试按钮增加倒计时,避免重复点击 mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, SettingUtils.requestTimeout) - mCountDownHelper!!.setOnCountDownListener(object : - CountDownButtonHelper.OnCountDownListener { + mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { override fun onCountDown(time: Int) { binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time) } @@ -107,50 +106,42 @@ class WebhookFragment : BaseFragment(), View.OnC //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } + + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, WebhookSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.rgMethod.check(settingVo.getMethodCheckId()) - binding!!.etWebServer.setText(settingVo.webServer) - binding!!.etSecret.setText(settingVo.secret) - binding!!.etResponse.setText(settingVo.response) - binding!!.etWebParams.setText(settingVo.webParams) - //set header - if (settingVo.headers != null) { - for ((key, value) in settingVo.headers) { - addHeaderItemLinearLayout( - headerItemMap, - binding!!.layoutHeaders, - key, - value - ) - } + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, WebhookSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.rgMethod.check(settingVo.getMethodCheckId()) + binding!!.etWebServer.setText(settingVo.webServer) + binding!!.etSecret.setText(settingVo.secret) + binding!!.etResponse.setText(settingVo.response) + binding!!.etWebParams.setText(settingVo.webParams) + //set header + if (settingVo.headers != null) { + for ((key, value) in settingVo.headers) { + addHeaderItemLinearLayout( + headerItemMap, binding!!.layoutHeaders, key, value + ) } } } - }) + } + }) } override fun initListeners() { @@ -192,17 +183,11 @@ class WebhookFragment : BaseFragment(), View.OnC return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } @@ -215,8 +200,7 @@ class WebhookFragment : BaseFragment(), View.OnC val status = if (binding!!.sbEnable.isChecked) 1 else 0 val settingVo = checkSetting() if (isClone) senderId = 0 - val senderNew = - Sender(senderId, senderType, name, Gson().toJson(settingVo), status) + val senderNew = Sender(senderId, senderType, name, Gson().toJson(settingVo), status) Log.d(TAG, senderNew.toString()) viewModel.insertOrUpdate(senderNew) @@ -265,20 +249,13 @@ class WebhookFragment : BaseFragment(), View.OnC * @param value header的value,为空则不设置 */ private fun addHeaderItemLinearLayout( - headerItemMap: MutableMap, - linearLayoutWebNotifyHeaders: LinearLayout, - key: String?, - value: String? + headerItemMap: MutableMap, linearLayoutWebNotifyHeaders: LinearLayout, key: String?, value: String? ) { - val linearLayoutItemAddHeader = - View.inflate(requireContext(), R.layout.item_add_header, null) as LinearLayout - val imageViewRemoveHeader = - linearLayoutItemAddHeader.findViewById(R.id.imageViewRemoveHeader) + val linearLayoutItemAddHeader = View.inflate(requireContext(), R.layout.item_add_header, null) as LinearLayout + val imageViewRemoveHeader = linearLayoutItemAddHeader.findViewById(R.id.imageViewRemoveHeader) if (key != null && value != null) { - val editTextHeaderKey = - linearLayoutItemAddHeader.findViewById(R.id.editTextHeaderKey) - val editTextHeaderValue = - linearLayoutItemAddHeader.findViewById(R.id.editTextHeaderValue) + val editTextHeaderKey = linearLayoutItemAddHeader.findViewById(R.id.editTextHeaderKey) + val editTextHeaderValue = linearLayoutItemAddHeader.findViewById(R.id.editTextHeaderValue) editTextHeaderKey.setText(key) editTextHeaderValue.setText(value) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkAgentFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkAgentFragment.kt index 64de66d2..28fa1596 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkAgentFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkAgentFragment.kt @@ -11,7 +11,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -98,51 +98,46 @@ class WeworkAgentFragment : BaseFragment(), //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, WeworkAgentSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etCorpID.setText(settingVo.corpID) - binding!!.etAgentID.setText(settingVo.agentID) - binding!!.etSecret.setText(settingVo.secret) - binding!!.sbAtAll.isChecked = settingVo.atAll == true - binding!!.etToUser.setText(settingVo.toUser) - binding!!.etToParty.setText(settingVo.toParty) - binding!!.etToTag.setText(settingVo.toTag) - binding!!.layoutToUser.visibility = if (settingVo.atAll == true) View.GONE else View.VISIBLE - binding!!.layoutToParty.visibility = if (settingVo.atAll == true) View.GONE else View.VISIBLE - binding!!.layoutToTag.visibility = if (settingVo.atAll == true) View.GONE else View.VISIBLE - binding!!.rgProxyType.check(settingVo.getProxyTypeCheckId()) - binding!!.etProxyHost.setText(settingVo.proxyHost) - binding!!.etProxyPort.setText(settingVo.proxyPort) - binding!!.sbProxyAuthenticator.isChecked = settingVo.proxyAuthenticator == true - binding!!.etProxyUsername.setText(settingVo.proxyUsername) - binding!!.etProxyPassword.setText(settingVo.proxyPassword) - binding!!.etCustomizeAPI.setText(settingVo.customizeAPI) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, WeworkAgentSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etCorpID.setText(settingVo.corpID) + binding!!.etAgentID.setText(settingVo.agentID) + binding!!.etSecret.setText(settingVo.secret) + binding!!.sbAtAll.isChecked = settingVo.atAll == true + binding!!.etToUser.setText(settingVo.toUser) + binding!!.etToParty.setText(settingVo.toParty) + binding!!.etToTag.setText(settingVo.toTag) + binding!!.layoutToUser.visibility = if (settingVo.atAll == true) View.GONE else View.VISIBLE + binding!!.layoutToParty.visibility = if (settingVo.atAll == true) View.GONE else View.VISIBLE + binding!!.layoutToTag.visibility = if (settingVo.atAll == true) View.GONE else View.VISIBLE + binding!!.rgProxyType.check(settingVo.getProxyTypeCheckId()) + binding!!.etProxyHost.setText(settingVo.proxyHost) + binding!!.etProxyPort.setText(settingVo.proxyPort) + binding!!.sbProxyAuthenticator.isChecked = settingVo.proxyAuthenticator == true + binding!!.etProxyUsername.setText(settingVo.proxyUsername) + binding!!.etProxyPassword.setText(settingVo.proxyPassword) + binding!!.etCustomizeAPI.setText(settingVo.customizeAPI) + } + } + }) } override fun initListeners() { @@ -223,17 +218,11 @@ class WeworkAgentFragment : BaseFragment(), return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt index 4677a637..05701beb 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/senders/WeworkRobotFragment.kt @@ -10,7 +10,7 @@ import androidx.fragment.app.viewModels import com.google.gson.Gson import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.BaseFragment -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.database.entity.Sender import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel @@ -104,40 +104,35 @@ class WeworkRobotFragment : BaseFragment(), //编辑 binding!!.btnDel.setText(R.string.del) - AppDatabase.getInstance(requireContext()) - .senderDao() - .get(senderId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : SingleObserver { - override fun onSubscribe(d: Disposable) {} + Core.sender.get(senderId).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { + override fun onSubscribe(d: Disposable) {} - override fun onError(e: Throwable) { - e.printStackTrace() - Log.e(TAG, "onError:$e") - } + override fun onError(e: Throwable) { + e.printStackTrace() + Log.e(TAG, "onError:$e") + } - override fun onSuccess(sender: Sender) { - if (isClone) { - titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) - binding!!.btnDel.setText(R.string.discard) - } else { - titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) - } - binding!!.etName.setText(sender.name) - binding!!.sbEnable.isChecked = sender.status == 1 - val settingVo = Gson().fromJson(sender.jsonSetting, WeworkRobotSetting::class.java) - Log.d(TAG, settingVo.toString()) - if (settingVo != null) { - binding!!.etWebHook.setText(settingVo.webHook) - binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) - binding!!.layoutAt.visibility = if (settingVo.getMsgTypeCheckId() == R.id.rb_msg_type_text) View.VISIBLE else View.GONE - binding!!.sbAtAll.isChecked = settingVo.atAll == true - binding!!.etAtMobiles.setText(settingVo.atMobiles) - binding!!.etAtUserIds.setText(settingVo.atUserIds) - } + override fun onSuccess(sender: Sender) { + if (isClone) { + titleBar?.setSubTitle(getString(R.string.clone_sender) + ": " + sender.name) + binding!!.btnDel.setText(R.string.discard) + } else { + titleBar?.setSubTitle(getString(R.string.edit_sender) + ": " + sender.name) } - }) + binding!!.etName.setText(sender.name) + binding!!.sbEnable.isChecked = sender.status == 1 + val settingVo = Gson().fromJson(sender.jsonSetting, WeworkRobotSetting::class.java) + Log.d(TAG, settingVo.toString()) + if (settingVo != null) { + binding!!.etWebHook.setText(settingVo.webHook) + binding!!.rgMsgType.check(settingVo.getMsgTypeCheckId()) + binding!!.layoutAt.visibility = if (settingVo.getMsgTypeCheckId() == R.id.rb_msg_type_text) View.VISIBLE else View.GONE + binding!!.sbAtAll.isChecked = settingVo.atAll == true + binding!!.etAtMobiles.setText(settingVo.atMobiles) + binding!!.etAtUserIds.setText(settingVo.atUserIds) + } + } + }) } override fun initListeners() { @@ -193,17 +188,11 @@ class WeworkRobotFragment : BaseFragment(), return } - MaterialDialog.Builder(requireContext()) - .title(R.string.delete_sender_title) - .content(R.string.delete_sender_tips) - .positiveText(R.string.lab_yes) - .negativeText(R.string.lab_no) - .onPositive { _: MaterialDialog?, _: DialogAction? -> - viewModel.delete(senderId) - XToastUtils.success(R.string.delete_sender_toast) - popToBack() - } - .show() + MaterialDialog.Builder(requireContext()).title(R.string.delete_sender_title).content(R.string.delete_sender_tips).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? -> + viewModel.delete(senderId) + XToastUtils.success(R.string.delete_sender_toast) + popToBack() + }.show() return } diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/NetworkChangeReceiver.kt b/app/src/main/java/com/idormy/sms/forwarder/receiver/NetworkChangeReceiver.kt index 17ef584a..21e7605b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/receiver/NetworkChangeReceiver.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/NetworkChangeReceiver.kt @@ -16,11 +16,13 @@ import androidx.annotation.RequiresApi import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.workDataOf +import com.idormy.sms.forwarder.utils.DELAY_TIME_AFTER_SIM_READY import com.idormy.sms.forwarder.utils.Log import com.idormy.sms.forwarder.utils.TASK_CONDITION_NETWORK import com.idormy.sms.forwarder.utils.TaskWorker import com.idormy.sms.forwarder.utils.task.TaskUtils import com.idormy.sms.forwarder.workers.NetworkWorker +import java.util.concurrent.TimeUnit @Suppress("PrivatePropertyName", "DEPRECATION", "UNUSED_PARAMETER") class NetworkChangeReceiver : BroadcastReceiver() { @@ -84,12 +86,14 @@ class NetworkChangeReceiver : BroadcastReceiver() { return } - //获取公网IP地址后执行任务 - val request = OneTimeWorkRequestBuilder().setInputData( - workDataOf( - TaskWorker.conditionType to TASK_CONDITION_NETWORK, - ) - ).build() + //【注意】延迟5秒(给够搜索信号时间)才执行任务 + val request = OneTimeWorkRequestBuilder() + .setInitialDelay(DELAY_TIME_AFTER_SIM_READY, TimeUnit.MILLISECONDS) + .setInputData( + workDataOf( + TaskWorker.conditionType to TASK_CONDITION_NETWORK, + ) + ).build() WorkManager.getInstance(context).enqueue(request) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt b/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt index ffd63ba7..2341c360 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/service/ForegroundService.kt @@ -12,10 +12,9 @@ import androidx.core.app.NotificationCompat import androidx.lifecycle.Observer import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager -import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.activity.MainActivity -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.utils.* import com.idormy.sms.forwarder.utils.task.CronJobScheduler import com.idormy.sms.forwarder.workers.LoadAppListWorker @@ -45,7 +44,7 @@ class ForegroundService : Service() { if (Frpclib.isRunning(uid)) { return@Observer } - AppDatabase.getInstance(App.context).frpcDao().get(uid).flatMap { (uid1, _, config) -> + Core.frpc.get(uid).flatMap { (uid1, _, config) -> val error = Frpclib.runContent(uid1, config) Single.just(error) }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver { @@ -130,7 +129,7 @@ class ForegroundService : Service() { //启动定时任务 GlobalScope.async(Dispatchers.IO) { - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(TASK_CONDITION_CRON) + val taskList = Core.task.getByType(TASK_CONDITION_CRON) taskList.forEach { task -> Log.d(TAG, "task = $task") CronJobScheduler.cancelTask(task.id) @@ -150,7 +149,7 @@ class ForegroundService : Service() { LiveEventBus.get(INTENT_FRPC_APPLY_FILE, String::class.java).observeStickyForever(frpcObserver) //自启动的Frpc GlobalScope.async(Dispatchers.IO) { - val frpcList = AppDatabase.getInstance(App.context).frpcDao().getAutorun() + val frpcList = Core.frpc.getAutorun() if (frpcList.isEmpty()) { Log.d(TAG, "没有自启动的Frpc") diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt index 568a4aa4..75cd6ffb 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt @@ -237,8 +237,8 @@ const val TASK_ACTION_SENDSMS = 2000 const val TASK_ACTION_NOTIFICATION = 2001 const val TASK_ACTION_CLEANER = 2002 const val TASK_ACTION_SETTINGS = 2003 -const val TASK_ACTION_HTTPSERVER = 2004 -const val TASK_ACTION_FRPC = 2005 +const val TASK_ACTION_FRPC = 2004 +const val TASK_ACTION_HTTPSERVER = 2005 const val TASK_ACTION_RULE = 2006 const val TASK_ACTION_SENDER = 2007 diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SmsCommandUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/SmsCommandUtils.kt index 849642ec..3f290666 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/SmsCommandUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SmsCommandUtils.kt @@ -8,7 +8,7 @@ import android.net.wifi.WifiManager import androidx.core.app.ActivityCompat import com.google.gson.Gson import com.idormy.sms.forwarder.App -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.server.model.SmsSendData import com.idormy.sms.forwarder.service.HttpServerService import com.xuexiang.xrouter.utils.TextUtils @@ -50,10 +50,10 @@ class SmsCommandUtils { GlobalScope.async(Dispatchers.IO) { val frpcList = if (param.isEmpty()) { - AppDatabase.getInstance(App.context).frpcDao().getAutorun() + Core.frpc.getAutorun() } else { val uids = param.split(",") - AppDatabase.getInstance(App.context).frpcDao().getByUids(uids) + Core.frpc.getByUids(uids) } if (frpcList.isEmpty()) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt index 3699ac29..c679e0a4 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/ConditionUtils.kt @@ -43,9 +43,9 @@ class ConditionUtils private constructor() { return true } - //注意:触发条件 = SIM卡已准备就绪时,延迟5秒(给够搜索信号时间)才执行任务 + //注意:触发条件 = SIM卡已准备就绪/网络状态改变时,延迟5秒(给够搜索信号时间)才执行任务 val firstCondition = conditionList.firstOrNull() - val needDelay = firstCondition?.type == TASK_CONDITION_SIM && TaskUtils.simState == 5 + val needDelay = (firstCondition?.type == TASK_CONDITION_SIM && TaskUtils.simState == 5) || (firstCondition?.type == TASK_CONDITION_NETWORK && TaskUtils.networkState != 0) for (i in startIndex until conditionList.size) { val condition = conditionList[i] diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt index df831d3a..0ebcba4d 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/task/TaskUtils.kt @@ -57,8 +57,8 @@ class TaskUtils private constructor() { TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_notification TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner TASK_ACTION_SETTINGS -> R.drawable.auto_task_icon_settings - TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc + TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server TASK_ACTION_RULE -> R.drawable.auto_task_icon_rule TASK_ACTION_SENDER -> R.drawable.auto_task_icon_sender else -> R.drawable.auto_task_icon_custom_time @@ -80,8 +80,8 @@ class TaskUtils private constructor() { TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_notification_grey TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner_grey TASK_ACTION_SETTINGS -> R.drawable.auto_task_icon_settings_grey - TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc_grey + TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey TASK_ACTION_RULE -> R.drawable.auto_task_icon_rule_grey TASK_ACTION_SENDER -> R.drawable.auto_task_icon_sender_grey else -> R.drawable.auto_task_icon_custom_time_grey diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt index 31b9f082..ef7741ee 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/ActionWorker.kt @@ -13,13 +13,14 @@ import com.google.gson.Gson import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R import com.idormy.sms.forwarder.core.Core -import com.idormy.sms.forwarder.database.AppDatabase import com.idormy.sms.forwarder.database.entity.Rule import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting import com.idormy.sms.forwarder.entity.action.CleanerSetting import com.idormy.sms.forwarder.entity.action.FrpcSetting import com.idormy.sms.forwarder.entity.action.HttpServerSetting +import com.idormy.sms.forwarder.entity.action.RuleSetting +import com.idormy.sms.forwarder.entity.action.SenderSetting import com.idormy.sms.forwarder.entity.action.SettingsSetting import com.idormy.sms.forwarder.entity.action.SmsSetting import com.idormy.sms.forwarder.service.HttpServerService @@ -39,6 +40,8 @@ import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION +import com.idormy.sms.forwarder.utils.TASK_ACTION_RULE +import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS import com.idormy.sms.forwarder.utils.TASK_ACTION_SETTINGS import com.idormy.sms.forwarder.utils.TaskWorker @@ -197,11 +200,8 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker continue } - val frpcList = if (frpcSetting.uids.isEmpty()) { - AppDatabase.getInstance(App.context).frpcDao().getAutorun() - } else { - val uids = frpcSetting.uids.split(",") - AppDatabase.getInstance(App.context).frpcDao().getByUids(uids) + val frpcList = frpcSetting.frpcList.ifEmpty { + Core.frpc.getAutorun() } if (frpcList.isEmpty()) { @@ -256,6 +256,38 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker writeLog("httpServer success", "SUCCESS") } + TASK_ACTION_RULE -> { + val ruleSetting = Gson().fromJson(action.setting, RuleSetting::class.java) + if (ruleSetting == null) { + writeLog("httpServerSetting is null") + continue + } + + val ids = ruleSetting.ruleList.map { it.id } + if (ids.isNotEmpty()) { + Core.rule.updateStatusByIds(ids, ruleSetting.status) + } + + successNum++ + writeLog("update rule success", "SUCCESS") + } + + TASK_ACTION_SENDER -> { + val senderSetting = Gson().fromJson(action.setting, SenderSetting::class.java) + if (senderSetting == null) { + writeLog("senderSetting is null") + continue + } + + val ids = senderSetting.senderList.map { it.id } + if (ids.isNotEmpty()) { + Core.sender.updateStatusByIds(ids, senderSetting.status) + } + + successNum++ + writeLog("update sender success", "SUCCESS") + } + else -> { writeLog("action.type is ${action.type}") } diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt index d4d82cc3..33ef92f3 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/BatteryWorker.kt @@ -7,8 +7,7 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.WorkerParameters import com.google.gson.Gson -import com.idormy.sms.forwarder.App -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting import com.idormy.sms.forwarder.entity.condition.BatterySetting @@ -40,7 +39,7 @@ class BatteryWorker(context: Context, params: WorkerParameters) : CoroutineWorke return Result.failure() } - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) + val taskList = Core.task.getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") @@ -95,7 +94,7 @@ class BatteryWorker(context: Context, params: WorkerParameters) : CoroutineWorke return Result.failure() } - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) + val taskList = Core.task.getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt index f4a97c21..bec9f926 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/CronWorker.kt @@ -7,8 +7,7 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.WorkerParameters import com.google.gson.Gson -import com.idormy.sms.forwarder.App -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting import com.idormy.sms.forwarder.entity.condition.CronSetting @@ -32,7 +31,7 @@ class CronWorker(context: Context, params: WorkerParameters) : CoroutineWorker(c return Result.failure() } - val task = AppDatabase.getInstance(App.context).taskDao().getOne(taskId) + val task = Core.task.getOne(taskId) if (task == null || task.status == 0) { Log.d(TAG, "TASK-$taskId:task is disabled") return Result.success() @@ -77,7 +76,7 @@ class CronWorker(context: Context, params: WorkerParameters) : CoroutineWorker(c } // 更新任务信息 - AppDatabase.getInstance(App.context).taskDao().updateExecTime(task.id, task.lastExecTime, task.nextExecTime, task.status) + Core.task.updateExecTime(task.id, task.lastExecTime, task.nextExecTime, task.status) if (task.status == 0) { Log.d(TAG, "TASK-${task.id}:task is disabled") diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt index 9f4dc84f..e6bdaa3a 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/LocationWorker.kt @@ -7,9 +7,8 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.WorkerParameters import com.google.gson.Gson -import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.LocationInfo import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting @@ -51,7 +50,7 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork //到达地点 TASK_CONDITION_TO_ADDRESS -> { - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) + val taskList = Core.task.getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") @@ -114,7 +113,7 @@ class LocationWorker(context: Context, params: WorkerParameters) : CoroutineWork //离开地点 TASK_CONDITION_LEAVE_ADDRESS -> { - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) + val taskList = Core.task.getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt index 8b4d7670..9d3eb7cd 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/LockScreenWorker.kt @@ -8,8 +8,7 @@ import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.WorkerParameters import com.google.gson.Gson -import com.idormy.sms.forwarder.App -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting import com.idormy.sms.forwarder.entity.condition.LockScreenSetting @@ -29,7 +28,7 @@ class LockScreenWorker(context: Context, params: WorkerParameters) : CoroutineWo val conditionType = inputData.getInt(TaskWorker.conditionType, -1) val action = inputData.getString(TaskWorker.action) - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) + val taskList = Core.task.getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt index 18c5e7f9..1eb73695 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/NetworkWorker.kt @@ -9,7 +9,7 @@ import androidx.work.WorkerParameters import com.google.gson.Gson import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting import com.idormy.sms.forwarder.entity.condition.NetworkSetting @@ -34,7 +34,7 @@ class NetworkWorker(context: Context, params: WorkerParameters) : CoroutineWorke override suspend fun doWork(): Result { try { val conditionType = inputData.getInt(TaskWorker.conditionType, -1) - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) + val taskList = Core.task.getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") @@ -61,7 +61,7 @@ class NetworkWorker(context: Context, params: WorkerParameters) : CoroutineWorke continue } - //TODO:判断其他条件是否满足 + //TODO:判断其他条件是否满足,注意:延迟5秒(给够搜索信号时间)才执行任务 if (!ConditionUtils.checkCondition(task.id, conditionList)) { Log.d(TAG, "TASK-${task.id}:other condition is not satisfied") continue @@ -92,7 +92,6 @@ class NetworkWorker(context: Context, params: WorkerParameters) : CoroutineWorke } } - Thread.sleep(1000) //延迟2秒,等待获取IP地址 ipv4 = getPublicIP(false) ipv6 = getPublicIP(true) } @@ -106,7 +105,6 @@ class NetworkWorker(context: Context, params: WorkerParameters) : CoroutineWorke msg.append(getString(R.string.net_wifi)).append("\n") msg.append(getString(R.string.wifi_ssid)).append(": ").append(TaskUtils.wifiSsid).append("\n") - Thread.sleep(2000) //延迟2秒,等待获取IP地址 ipv4 = getPublicIP(false) ipv6 = getPublicIP(true) } @@ -154,6 +152,8 @@ class NetworkWorker(context: Context, params: WorkerParameters) : CoroutineWorke //获取公网IP地址 private fun getPublicIP(ipv6: Boolean = false): String { + if (TaskUtils.networkState == 0) return "" + return try { val url = if (ipv6) URL("https://api6.ipify.org/") else URL("https://api.ipify.org/") val urlConnection = url.openConnection() as HttpURLConnection diff --git a/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt b/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt index f4e3560b..876a9bc4 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/workers/SimWorker.kt @@ -10,7 +10,7 @@ import androidx.work.WorkerParameters import com.google.gson.Gson import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R -import com.idormy.sms.forwarder.database.AppDatabase +import com.idormy.sms.forwarder.core.Core import com.idormy.sms.forwarder.entity.MsgInfo import com.idormy.sms.forwarder.entity.TaskSetting import com.idormy.sms.forwarder.entity.condition.SimSetting @@ -31,7 +31,7 @@ class SimWorker(context: Context, params: WorkerParameters) : CoroutineWorker(co try { val conditionType = inputData.getInt(TaskWorker.conditionType, -1) val simStateStr = inputData.getString(TaskWorker.msg) - val taskList = AppDatabase.getInstance(App.context).taskDao().getByType(conditionType) + val taskList = Core.task.getByType(conditionType) for (task in taskList) { Log.d(TAG, "task = $task") diff --git a/app/src/main/res/drawable/auto_task_icon_incall.xml b/app/src/main/res/drawable/auto_task_icon_incall.xml new file mode 100644 index 00000000..7c04e4d0 --- /dev/null +++ b/app/src/main/res/drawable/auto_task_icon_incall.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_location.xml b/app/src/main/res/drawable/auto_task_icon_location.xml similarity index 100% rename from app/src/main/res/drawable/icon_location.xml rename to app/src/main/res/drawable/auto_task_icon_location.xml diff --git a/app/src/main/res/drawable/auto_task_icon_start_activity.xml b/app/src/main/res/drawable/auto_task_icon_start_activity.xml new file mode 100644 index 00000000..c0223832 --- /dev/null +++ b/app/src/main/res/drawable/auto_task_icon_start_activity.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_senders_pushplus.xml b/app/src/main/res/layout/fragment_senders_pushplus.xml index f29faf7c..6536a684 100644 --- a/app/src/main/res/layout/fragment_senders_pushplus.xml +++ b/app/src/main/res/layout/fragment_senders_pushplus.xml @@ -58,6 +58,7 @@ + + tools:ignore="TouchTargetSizeCheck,DuplicateSpeakableTextCheck" /> @@ -1119,6 +1120,7 @@ android:text="@string/retry_interval_tips" android:textSize="@dimen/text_size_mini" tools:ignore="SmallSp" /> + + + android:layout_weight="1" + tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" /> + tools:ignore="SmallSp,DuplicateSpeakableTextCheck,TextContrastCheck,TouchTargetSizeCheck" /> @@ -1320,6 +1324,7 @@ android:text="@string/carrier_mobile" android:textSize="@dimen/text_size_mini" tools:ignore="SmallSp" /> + + app:met_validateOnFocusLost="true" + tools:ignore="DuplicateSpeakableTextCheck,TextContrastCheck,TouchTargetSizeCheck" /> + app:met_clearButton="true" + tools:ignore="DuplicateSpeakableTextCheck,TextContrastCheck,TouchTargetSizeCheck" /> + tools:ignore="SmallSp,TextContrastCheck,TouchTargetSizeCheck" /> @@ -1391,6 +1398,7 @@ android:text="@string/carrier_mobile" android:textSize="@dimen/text_size_mini" tools:ignore="SmallSp" /> + + app:met_validateOnFocusLost="true" + tools:ignore="TextContrastCheck,TouchTargetSizeCheck" /> + app:met_clearButton="true" + tools:ignore="TextContrastCheck,TouchTargetSizeCheck" /> + tools:ignore="SmallSp,TextContrastCheck,TouchTargetSizeCheck" /> @@ -1457,7 +1467,8 @@ android:layout_marginStart="5dp" android:layout_weight="1" android:inputType="textMultiLine" - android:minLines="1" /> + android:minLines="1" + tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" /> @@ -1485,13 +1496,15 @@ android:text="@string/enable_custom_templates_tips" android:textSize="@dimen/text_size_mini" tools:ignore="SmallSp" /> + + android:layout_height="wrap_content" + tools:ignore="TouchTargetSizeCheck" /> @@ -1533,7 +1546,7 @@ android:inputType="textMultiLine" android:minLines="1" android:text="" - tools:ignore="RtlHardcoded" /> + tools:ignore="RtlHardcoded,SpeakableTextPresentCheck" /> + + - + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + - - + - - - - - - - - - - - - - - - - + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_tasks_action_notification.xml b/app/src/main/res/layout/fragment_tasks_action_notification.xml index a7db7e9c..5387303c 100644 --- a/app/src/main/res/layout/fragment_tasks_action_notification.xml +++ b/app/src/main/res/layout/fragment_tasks_action_notification.xml @@ -60,7 +60,7 @@ diff --git a/app/src/main/res/layout/fragment_tasks_action_settings.xml b/app/src/main/res/layout/fragment_tasks_action_settings.xml index 3c8f9702..64854414 100644 --- a/app/src/main/res/layout/fragment_tasks_action_settings.xml +++ b/app/src/main/res/layout/fragment_tasks_action_settings.xml @@ -54,7 +54,7 @@ @@ -69,7 +69,7 @@ android:layout_height="wrap_content" android:text="@string/forward_sms" android:textStyle="bold" - tools:ignore="RelativeOverlap,TextContrastCheck" /> + tools:ignore="RelativeOverlap" /> + @@ -260,7 +261,7 @@ @@ -290,7 +291,8 @@ android:layout_width="match_parent" android:layout_height="25dp" android:gravity="center_vertical" - android:orientation="horizontal"> + android:orientation="horizontal" + tools:ignore="TextSizeCheck"> + app:scb_color_checked="@color/colorPrimary" + tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" /> + app:scb_color_checked="@color/colorPrimary" + tools:ignore="SpeakableTextPresentCheck,TouchTargetSizeCheck" /> @@ -366,7 +370,7 @@ @@ -618,7 +622,8 @@ android:id="@+id/et_safe_phone" android:layout_width="match_parent" android:layout_height="wrap_content" - android:hint="@string/safe_phone_tips" /> + android:hint="@string/safe_phone_tips" + tools:ignore="TextContrastCheck,TouchTargetSizeCheck" /> @@ -632,7 +637,7 @@ diff --git a/app/src/main/res/layout/fragment_tasks_condition_cron.xml b/app/src/main/res/layout/fragment_tasks_condition_cron.xml index cbaf05ec..3154b1aa 100644 --- a/app/src/main/res/layout/fragment_tasks_condition_cron.xml +++ b/app/src/main/res/layout/fragment_tasks_condition_cron.xml @@ -66,49 +66,56 @@ android:layout_height="wrap_content" android:layout_weight="1" android:gravity="center" - android:text="@string/second" /> + android:text="@string/second" + android:textSize="@dimen/text_size_mini" /> + android:text="@string/minute" + android:textSize="@dimen/text_size_mini" /> + android:text="@string/hour" + android:textSize="@dimen/text_size_mini" /> + android:text="@string/day" + android:textSize="@dimen/text_size_mini" /> + android:text="@string/month" + android:textSize="@dimen/text_size_mini" /> + android:text="@string/week" + android:textSize="@dimen/text_size_mini" /> + android:text="@string/year" + android:textSize="@dimen/text_size_mini" /> + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_add_rule.xml b/app/src/main/res/layout/item_add_rule.xml index 813949e9..061cce30 100644 --- a/app/src/main/res/layout/item_add_rule.xml +++ b/app/src/main/res/layout/item_add_rule.xml @@ -28,7 +28,7 @@ android:id="@+id/iv_rule_image" android:layout_width="24dp" android:layout_height="24dp" - tools:ignore="ContentDescription" /> + tools:ignore="ContentDescription,UseAppTint" /> Universal Browser navigation - guide_key_sliding_root_navigation - Open navigation drawer - Close navigation drawer Logs Senders @@ -234,8 +231,11 @@ Are you sure to delete this rule? The rule has deleted. Please add a new sender and then choose it. + Please add a new rule and then choose it. + Please add a new frpc and then choose it. Please add a sender first. Please add a rule first. + Please add a frpc first. Select Sender Rule tester: Test SIM Slot @@ -336,7 +336,7 @@ Customize API Corp ID Agent ID - App Secret + Secret Is At All Specified Member \@all @@ -826,6 +826,7 @@ Please go to the corresponding official website to obtain Drop-down selection, keyword fuzzy match Drop-down selection, keyword fuzzy match + Drop-down selection, keyword fuzzy match Installed Apps Extra Apps One package name per line\nEnable async loading of the App list for selection. @@ -976,6 +977,7 @@ [Note] The rule has been disabled, will not be sent even if they match! [Note] The sending channel is already in the list, no need to add it again! [Note] The rule is already in the list, no need to add it again! + [Note] The frpc is already in the list, no need to add it again! Local Call: Remote SMS: Clear @@ -1087,6 +1089,7 @@ Del Rule Del Sender + Del Frpc Sender is disabled Unknown sender Network Type @@ -1176,10 +1179,10 @@ Screen Off/On Trigger upon screen lock/unlock instantly or after a set time. Send Sms - Notification - Frpc Setting + Notify + Frpc On/Off Control the start/stop of FRPC. - Server Setting + Server On/Off Manage HttpServer start/stop and enable/disable functions Cleaner Delete FW. logs older than N days, delete cache, etc. @@ -1314,4 +1317,6 @@ English Log Export Failed! Log exported successfully! Path: + All auto-started Frpc + Specified Frpc diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 544bbd33..39930892 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -21,9 +21,6 @@ 通用浏览器 导航条 - guide_key_sliding_root_navigation - 打开导航抽屉 - 关闭导航抽屉 转发日志 发送通道 @@ -235,8 +232,11 @@ 删除转发规则后会级联删除其相关的转发日志的所有记录!\n\n确定删除该条规则? 该条规则已经删除! 请选择发送通道(若无,请先添加) + 请选择发送通道(若无,请先添加) + 请选择发送通道(若无,请先添加) 请先去设置发送通道页面添加 请先去设置转发规则页面添加 + 请先去设置FRPC页面添加 发送通道 转发规则测试 测试模拟的接收卡槽 @@ -345,9 +345,9 @@ 指定成员 指定部门 指定标签 - Tip:接收消息的成员ID列表(多个接收者用‘|’分隔,最多支持1000个) - Tip:接收消息的部门ID列表(多个接收者用‘|’分隔,最多支持1000个) - Tip:接收消息的标签ID列表(多个接收者用‘|’分隔,最多支持1000个) + Tip:接收消息的成员ID列表(多个用‘|’分隔,最多支持1000个) + Tip:接收消息的部门ID列表(多个用‘|’分隔,最多支持1000个) + Tip:接收消息的标签ID列表(多个用‘|’分隔,最多支持1000个) Tip:通过反向代理(proxy_pass)绕过IP白名单限制 Tip:接收用户的userid,每次最多传20个(用‘|’分隔) SendKey @@ -827,6 +827,7 @@ 请前往对应的官网地址获取 下拉选择,关键字模糊匹配 下拉选择,关键字模糊匹配 + 下拉选择,关键字模糊匹配 已装APP列表 额外消除应用通知 一行一个包名\n开启异步加载App列表以便选择 @@ -977,6 +978,7 @@ 【注意】该转发规则已经禁用,即便匹配上也不会发送! 【注意】该发送通道已经在列表中,无需重复添加! 【注意】该转发规则已经在列表中,无需重复添加! + 【注意】该Frpc已经在列表中,无需重复添加! 本地呼叫: 远程发短信: 清除 @@ -1088,6 +1090,7 @@ 删除转发规则 删除发送通道 + 删除Frpc 发送通道已禁用 未知发送通道 网络类型 @@ -1178,9 +1181,9 @@ 在屏幕锁定或解锁后立即或指定时间触发 发送短信 推送通知 - Frpc设置 + 启停Frpc 控制内网穿透·FRPC的启动/停止 - HttpServer设置 + 启停HttpServer 控制HttpServer的启动/停止,并支持启用/禁用功能 清理日志 批量删除N天前的转发记录、删除缓存等 @@ -1315,4 +1318,6 @@ English 导出日志失败! 导出日志成功!存放路径: + 所有自启动的Frpc + 指定的Frpc diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 87cf3317..9a165a8d 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -21,9 +21,6 @@ 通用瀏覽器 導航列 - guide_key_sliding_root_navigation - 打開導航抽屜 - 關閉導航抽屜 轉發日誌 發送通道 @@ -235,8 +232,11 @@ 刪除轉發規則後會級聯刪除其相關的轉發日誌的所有記錄!\n\n確定刪除該條規則? 該條規則已刪除! 請選擇發送通道(若無,請先添加) + 請選擇轉發規則(若無,請先添加) + 請選擇FRPC(若無,請先添加) 請先去設置發送通道頁面添加 請先去設置轉發規則頁面添加 + 請先去設置FRPC頁面添加 發送通道 轉發規則測試 測試模擬的接收卡槽 @@ -345,9 +345,9 @@ 指定成員 指定部門 指定標籤 - Tip:接收消息的成員ID列表(多個接收者用‘|’分隔,最多支持1000個) - Tip:接收消息的部門ID列表(多個接收者用‘|’分隔,最多支持1000個) - Tip:接收消息的標籤ID列表(多個接收者用‘|’分隔,最多支持1000個) + Tip:接收消息的成員ID列表(多個用‘|’分隔,最多支持1000個) + Tip:接收消息的部門ID列表(多個用‘|’分隔,最多支持1000個) + Tip:接收消息的標籤ID列表(多個用‘|’分隔,最多支持1000個) Tip:通過反向代理(proxy_pass)繞過IP白名單限制 Tip:接收用戶的userid,每次最多傳20個(用‘|’分隔) SendKey @@ -827,6 +827,7 @@ 請前往對應的官網地址獲取 下拉選擇,關鍵字模糊匹配 下拉選擇,關鍵字模糊匹配 + 下拉選擇,關鍵字模糊匹配 已裝APP列表 額外消除應用通知 一行一個包名\n開啟異步加載App列表以便選擇 @@ -977,6 +978,7 @@ 【注意】該轉發規則已經禁用,即便匹配上也不會發送! 【注意】該發送通道已經在列表中,無需重複添加! 【注意】該轉發規則已經在列表中,無需重複添加! + 【注意】該Frpc已經在列表中,無需重複添加! 本地呼叫: 遠程發簡訊: 清除 @@ -1088,6 +1090,7 @@ 刪除轉發規則 刪除發送通道 + 刪除Frpc 發送通道已停用 未知的發送通道 網絡類型 @@ -1178,9 +1181,9 @@ 在屏幕鎖定或解鎖後立即或指定時間觸發 發送簡訊 推送通知 - Frpc設置 + 啟停Frpc 控制內網穿透·FRPC的啟動/停止 - HttpServer設置 + 啟停HttpServer 控制HttpServer的啟動/停止,並支持啟用/禁用功能 清理日誌 批量刪除N天前的轉發記錄、刪除快取等 @@ -1316,4 +1319,6 @@ English 日誌匯出失敗! 日誌匯出成功!儲存路徑: + 所有自動啟動的Frpc + 特定的Frpc diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47dc5e04..77033306 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -21,9 +21,6 @@ 通用浏览器 导航条 - guide_key_sliding_root_navigation - 打开导航抽屉 - 关闭导航抽屉 转发日志 发送通道 @@ -235,8 +232,11 @@ 删除转发规则后会级联删除其相关的转发日志的所有记录!\n\n确定删除该条规则? 该条规则已经删除! 请选择发送通道(若无,请先添加) + 请选择转发规则(若无,请先添加) + 请选择Frpc(若无,请先添加) 请先去设置发送通道页面添加 请先去设置转发规则页面添加 + 请先去设置Frpc页面添加 发送通道 转发规则测试 测试模拟的接收卡槽 @@ -345,9 +345,9 @@ 指定成员 指定部门 指定标签 - Tip:接收消息的成员ID列表(多个接收者用‘|’分隔,最多支持1000个) - Tip:接收消息的部门ID列表(多个接收者用‘|’分隔,最多支持1000个) - Tip:接收消息的标签ID列表(多个接收者用‘|’分隔,最多支持1000个) + Tip:接收消息的成员ID列表(多个用‘|’分隔,最多支持1000个) + Tip:接收消息的部门ID列表(多个用‘|’分隔,最多支持1000个) + Tip:接收消息的标签ID列表(多个用‘|’分隔,最多支持1000个) Tip:通过反向代理(proxy_pass)绕过IP白名单限制 Tip:接收用户的userid,每次最多传20个(用‘|’分隔) SendKey @@ -827,6 +827,7 @@ 请前往对应的官网地址获取 下拉选择,关键字模糊匹配 下拉选择,关键字模糊匹配 + 下拉选择,关键字模糊匹配 已装APP列表 额外消除应用通知 一行一个包名\n开启异步加载App列表以便选择 @@ -977,6 +978,7 @@ 【注意】该转发规则已经禁用,即便匹配上也不会发送! 【注意】该发送通道已经在列表中,无需重复添加! 【注意】该转发规则已经在列表中,无需重复添加! + 【注意】该Frpc已经在列表中,无需重复添加! 本地呼叫: 远程发短信: 清除 @@ -1088,6 +1090,7 @@ 删除转发规则 删除发送通道 + 删除Frpc 发送通道已禁用 未知发送通道 网络类型 @@ -1178,9 +1181,9 @@ 在屏幕锁定或解锁后立即或指定时间触发 发送短信 推送通知 - Frpc设置 + 启停Frpc 控制内网穿透·FRPC的启动/停止 - HttpServer设置 + 启停HttpServer 控制HttpServer的启动/停止,并支持启用/禁用功能 清理日志 批量删除N天前的转发记录、删除缓存等 @@ -1315,4 +1318,6 @@ English 导出日志失败! 导出日志成功!存放路径: + 所有自启动的Frpc + 指定的Frpc