From b4883300b9458c55735933fdf0b612c526362940 Mon Sep 17 00:00:00 2001 From: cofbro <1808413743@qq.com> Date: Wed, 20 Dec 2023 19:25:50 +0800 Subject: [PATCH] fix: refactoring the code for signing --- app/src/main/java/com/cofbro/qian/App.kt | 6 +- .../account/manager/AccountManagerActivity.kt | 6 +- .../cofbro/qian/friend/chat/ChatActivity.kt | 2 +- .../CookieSignCardSelfViewHolder.kt | 2 +- .../CookieSignCardUserViewHolder.kt | 2 +- .../com/cofbro/qian/mapsetting/MapActivity.kt | 12 +- .../cofbro/qian/photo/PhotoSignActivity.kt | 2 +- .../cofbro/qian/profile/ProfileFragment.kt | 1 - .../profile/update/UpdateDetailActivity.kt | 2 +- .../com/cofbro/qian/update/AutoUpdater.kt | 4 +- .../view/{ => dialog}/AutoUpdateTipDialog.kt | 2 +- .../qian/view/{ => dialog}/CodingDialog.kt | 3 +- .../qian/view/{ => dialog}/DownloadDialog.kt | 2 +- .../view/{ => dialog}/FullScreenDialog.kt | 2 +- .../view/{ => dialog}/GestureInputDialog.kt | 3 +- .../qian/view/{ => dialog}/TipDialog.kt | 2 +- .../qian/view/{ => dialog}/WaitDialog.kt | 2 +- .../qian/wrapper/did/DoHomeworkActivity.kt | 2 +- .../cofbro/qian/wrapper/task/TaskFragment.kt | 178 +++++------------- .../cofbro/qian/wrapper/task/holder/Result.kt | 3 + .../cofbro/qian/wrapper/task/holder/Task.kt | 116 ++++++++++++ .../wrapper/task/holder/TaskRunnableHolder.kt | 33 ++++ 22 files changed, 227 insertions(+), 160 deletions(-) rename app/src/main/java/com/cofbro/qian/view/{ => dialog}/AutoUpdateTipDialog.kt (98%) rename app/src/main/java/com/cofbro/qian/view/{ => dialog}/CodingDialog.kt (97%) rename app/src/main/java/com/cofbro/qian/view/{ => dialog}/DownloadDialog.kt (97%) rename app/src/main/java/com/cofbro/qian/view/{ => dialog}/FullScreenDialog.kt (98%) rename app/src/main/java/com/cofbro/qian/view/{ => dialog}/GestureInputDialog.kt (94%) rename app/src/main/java/com/cofbro/qian/view/{ => dialog}/TipDialog.kt (98%) rename app/src/main/java/com/cofbro/qian/view/{ => dialog}/WaitDialog.kt (98%) create mode 100644 app/src/main/java/com/cofbro/qian/wrapper/task/holder/Result.kt create mode 100644 app/src/main/java/com/cofbro/qian/wrapper/task/holder/Task.kt create mode 100644 app/src/main/java/com/cofbro/qian/wrapper/task/holder/TaskRunnableHolder.kt diff --git a/app/src/main/java/com/cofbro/qian/App.kt b/app/src/main/java/com/cofbro/qian/App.kt index e729995b..214387d5 100644 --- a/app/src/main/java/com/cofbro/qian/App.kt +++ b/app/src/main/java/com/cofbro/qian/App.kt @@ -26,7 +26,11 @@ class App : Application(), Application.ActivityLifecycleCallbacks { val filter = IntentFilter(Intent.ACTION_PACKAGE_REPLACED) filter.addDataScheme("package") registerReceiver(installCompleteReceiver, filter) - //LeanCloud.initializeSecurely(this, "C8NqVi2SeysVgB2AImB7CAFB-gzGzoHsz", "https://c8nqvi2s.lc-cn-n1-shared.com") + LeanCloud.initializeSecurely( + this, + "C8NqVi2SeysVgB2AImB7CAFB-gzGzoHsz", + "https://c8nqvi2s.lc-cn-n1-shared.com" + ) } override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/cofbro/qian/account/manager/AccountManagerActivity.kt b/app/src/main/java/com/cofbro/qian/account/manager/AccountManagerActivity.kt index e9738dbf..206b0482 100644 --- a/app/src/main/java/com/cofbro/qian/account/manager/AccountManagerActivity.kt +++ b/app/src/main/java/com/cofbro/qian/account/manager/AccountManagerActivity.kt @@ -24,9 +24,9 @@ import com.cofbro.qian.utils.getIntExt import com.cofbro.qian.utils.getStatusBarHeight import com.cofbro.qian.utils.getStringExt import com.cofbro.qian.utils.safeParseToJson -import com.cofbro.qian.view.CodingDialog -import com.cofbro.qian.view.FullScreenDialog -import com.cofbro.qian.view.TipDialog +import com.cofbro.qian.view.dialog.CodingDialog +import com.cofbro.qian.view.dialog.FullScreenDialog +import com.cofbro.qian.view.dialog.TipDialog import com.google.android.material.bottomsheet.BottomSheetBehavior import com.hjq.toast.ToastUtils import jp.wasabeef.recyclerview.animators.OvershootInLeftAnimator diff --git a/app/src/main/java/com/cofbro/qian/friend/chat/ChatActivity.kt b/app/src/main/java/com/cofbro/qian/friend/chat/ChatActivity.kt index e9c2e579..b0846fab 100644 --- a/app/src/main/java/com/cofbro/qian/friend/chat/ChatActivity.kt +++ b/app/src/main/java/com/cofbro/qian/friend/chat/ChatActivity.kt @@ -28,7 +28,7 @@ import com.cofbro.qian.utils.CacheUtils import com.cofbro.qian.utils.Constants import com.cofbro.qian.utils.KeyboardUtil import com.cofbro.qian.utils.MsgFactory -import com.cofbro.qian.view.TipDialog +import com.cofbro.qian.view.dialog.TipDialog import com.hjq.toast.ToastUtils class ChatActivity : BaseActivity(), IMessageDispatchEvent { diff --git a/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardSelfViewHolder.kt b/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardSelfViewHolder.kt index 67559240..ff0905d2 100644 --- a/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardSelfViewHolder.kt +++ b/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardSelfViewHolder.kt @@ -11,7 +11,7 @@ import com.cofbro.qian.friend.im.IMClientUtils import com.cofbro.qian.friend.viewholder.DefaultViewHolder import com.cofbro.qian.utils.CacheUtils import com.cofbro.qian.utils.MsgFactory -import com.cofbro.qian.view.WaitDialog +import com.cofbro.qian.view.dialog.WaitDialog import com.hjq.toast.ToastUtils class CookieSignCardSelfViewHolder(private val binding: ItemChatCookieSignCardMyselfBinding) : diff --git a/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardUserViewHolder.kt b/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardUserViewHolder.kt index 43eec39e..12ec91c5 100644 --- a/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardUserViewHolder.kt +++ b/app/src/main/java/com/cofbro/qian/friend/chat/viewholder/CookieSignCardUserViewHolder.kt @@ -13,7 +13,7 @@ import com.cofbro.qian.utils.AccountManager import com.cofbro.qian.utils.Constants import com.cofbro.qian.utils.MsgFactory import com.cofbro.qian.utils.getStringExt -import com.cofbro.qian.view.WaitDialog +import com.cofbro.qian.view.dialog.WaitDialog import com.hjq.toast.ToastUtils import kotlin.concurrent.thread diff --git a/app/src/main/java/com/cofbro/qian/mapsetting/MapActivity.kt b/app/src/main/java/com/cofbro/qian/mapsetting/MapActivity.kt index 68090064..fc632ff2 100644 --- a/app/src/main/java/com/cofbro/qian/mapsetting/MapActivity.kt +++ b/app/src/main/java/com/cofbro/qian/mapsetting/MapActivity.kt @@ -5,30 +5,20 @@ import android.app.Dialog import android.content.Intent import android.os.Bundle import android.os.PersistableBundle -import android.util.Log import android.view.View import android.widget.ImageView import android.widget.TextView -import android.widget.Toast import androidx.lifecycle.lifecycleScope import com.alibaba.fastjson.JSONArray import com.alibaba.fastjson.JSONObject -import com.amap.api.location.AMapLocationClient -import com.amap.api.location.AMapLocationClientOption import com.amap.api.maps2d.AMap import com.amap.api.maps2d.CameraUpdateFactory import com.amap.api.maps2d.model.BitmapDescriptorFactory import com.amap.api.maps2d.model.LatLng import com.amap.api.maps2d.model.Marker import com.amap.api.maps2d.model.MarkerOptions -import com.amap.api.services.core.LatLonPoint import com.amap.api.services.core.PoiItemV2 import com.amap.api.services.core.SuggestionCity -import com.amap.api.services.geocoder.GeocodeResult -import com.amap.api.services.geocoder.GeocodeSearch -import com.amap.api.services.geocoder.RegeocodeQuery -import com.amap.api.services.geocoder.RegeocodeResult -import com.amap.api.services.help.Tip import com.amap.api.services.poisearch.PoiResultV2 import com.amap.api.services.poisearch.PoiSearchV2 import com.bumptech.glide.Glide @@ -52,7 +42,7 @@ import com.cofbro.qian.utils.SignRecorder import com.cofbro.qian.utils.dp2px import com.cofbro.qian.utils.getStringExt import com.cofbro.qian.utils.safeParseToJson -import com.cofbro.qian.view.FullScreenDialog +import com.cofbro.qian.view.dialog.FullScreenDialog import com.hjq.toast.ToastUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay diff --git a/app/src/main/java/com/cofbro/qian/photo/PhotoSignActivity.kt b/app/src/main/java/com/cofbro/qian/photo/PhotoSignActivity.kt index 565cf3e3..f7b8ac1a 100644 --- a/app/src/main/java/com/cofbro/qian/photo/PhotoSignActivity.kt +++ b/app/src/main/java/com/cofbro/qian/photo/PhotoSignActivity.kt @@ -13,7 +13,7 @@ import com.cofbro.qian.utils.GlideEngine import com.cofbro.qian.utils.Downloader import com.cofbro.qian.utils.getStringExt import com.cofbro.qian.utils.showSignResult -import com.cofbro.qian.view.FullScreenDialog +import com.cofbro.qian.view.dialog.FullScreenDialog import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.config.SelectMimeType import com.luck.picture.lib.entity.LocalMedia diff --git a/app/src/main/java/com/cofbro/qian/profile/ProfileFragment.kt b/app/src/main/java/com/cofbro/qian/profile/ProfileFragment.kt index 777d00c9..178964d2 100644 --- a/app/src/main/java/com/cofbro/qian/profile/ProfileFragment.kt +++ b/app/src/main/java/com/cofbro/qian/profile/ProfileFragment.kt @@ -27,7 +27,6 @@ import com.cofbro.qian.utils.Constants import com.cofbro.qian.utils.Downloader import com.cofbro.qian.utils.dp2px import com.cofbro.qian.utils.getStatusBarHeight -import com.cofbro.qian.view.AutoUpdateTipDialog import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/cofbro/qian/profile/update/UpdateDetailActivity.kt b/app/src/main/java/com/cofbro/qian/profile/update/UpdateDetailActivity.kt index 58beb97b..36d48a4e 100644 --- a/app/src/main/java/com/cofbro/qian/profile/update/UpdateDetailActivity.kt +++ b/app/src/main/java/com/cofbro/qian/profile/update/UpdateDetailActivity.kt @@ -16,7 +16,7 @@ import com.cofbro.qian.update.AutoUpdater import com.cofbro.qian.utils.Constants import com.cofbro.qian.utils.dp2px import com.cofbro.qian.utils.getStatusBarHeight -import com.cofbro.qian.view.FullScreenDialog +import com.cofbro.qian.view.dialog.FullScreenDialog class UpdateDetailActivity : BaseActivity() { diff --git a/app/src/main/java/com/cofbro/qian/update/AutoUpdater.kt b/app/src/main/java/com/cofbro/qian/update/AutoUpdater.kt index 3dfa8b18..abc449d9 100644 --- a/app/src/main/java/com/cofbro/qian/update/AutoUpdater.kt +++ b/app/src/main/java/com/cofbro/qian/update/AutoUpdater.kt @@ -17,8 +17,8 @@ import com.cofbro.hymvvmutils.base.getBySp import com.cofbro.hymvvmutils.base.saveUsedSp import com.cofbro.qian.utils.Constants import com.cofbro.qian.utils.parse2Long -import com.cofbro.qian.view.AutoUpdateTipDialog -import com.cofbro.qian.view.DownloadDialog +import com.cofbro.qian.view.dialog.AutoUpdateTipDialog +import com.cofbro.qian.view.dialog.DownloadDialog import com.hjq.toast.ToastUtils import java.io.BufferedReader import java.io.File diff --git a/app/src/main/java/com/cofbro/qian/view/AutoUpdateTipDialog.kt b/app/src/main/java/com/cofbro/qian/view/dialog/AutoUpdateTipDialog.kt similarity index 98% rename from app/src/main/java/com/cofbro/qian/view/AutoUpdateTipDialog.kt rename to app/src/main/java/com/cofbro/qian/view/dialog/AutoUpdateTipDialog.kt index f819c190..50328273 100644 --- a/app/src/main/java/com/cofbro/qian/view/AutoUpdateTipDialog.kt +++ b/app/src/main/java/com/cofbro/qian/view/dialog/AutoUpdateTipDialog.kt @@ -1,4 +1,4 @@ -package com.cofbro.qian.view +package com.cofbro.qian.view.dialog import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/com/cofbro/qian/view/CodingDialog.kt b/app/src/main/java/com/cofbro/qian/view/dialog/CodingDialog.kt similarity index 97% rename from app/src/main/java/com/cofbro/qian/view/CodingDialog.kt rename to app/src/main/java/com/cofbro/qian/view/dialog/CodingDialog.kt index 83092080..899b114a 100644 --- a/app/src/main/java/com/cofbro/qian/view/CodingDialog.kt +++ b/app/src/main/java/com/cofbro/qian/view/dialog/CodingDialog.kt @@ -1,4 +1,4 @@ -package com.cofbro.qian.view +package com.cofbro.qian.view.dialog import android.app.AlertDialog import android.content.Context @@ -10,7 +10,6 @@ import android.view.WindowManager import android.widget.EditText import android.widget.TextView import com.cofbro.qian.R -import com.cofbro.qian.utils.KeyboardUtil import com.hjq.toast.ToastUtils class CodingDialog(context: Context) : AlertDialog(context) { diff --git a/app/src/main/java/com/cofbro/qian/view/DownloadDialog.kt b/app/src/main/java/com/cofbro/qian/view/dialog/DownloadDialog.kt similarity index 97% rename from app/src/main/java/com/cofbro/qian/view/DownloadDialog.kt rename to app/src/main/java/com/cofbro/qian/view/dialog/DownloadDialog.kt index 86f29814..5ecda46a 100644 --- a/app/src/main/java/com/cofbro/qian/view/DownloadDialog.kt +++ b/app/src/main/java/com/cofbro/qian/view/dialog/DownloadDialog.kt @@ -1,4 +1,4 @@ -package com.cofbro.qian.view +package com.cofbro.qian.view.dialog import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/com/cofbro/qian/view/FullScreenDialog.kt b/app/src/main/java/com/cofbro/qian/view/dialog/FullScreenDialog.kt similarity index 98% rename from app/src/main/java/com/cofbro/qian/view/FullScreenDialog.kt rename to app/src/main/java/com/cofbro/qian/view/dialog/FullScreenDialog.kt index 4d946ad5..7e3d00a1 100644 --- a/app/src/main/java/com/cofbro/qian/view/FullScreenDialog.kt +++ b/app/src/main/java/com/cofbro/qian/view/dialog/FullScreenDialog.kt @@ -1,4 +1,4 @@ -package com.cofbro.qian.view +package com.cofbro.qian.view.dialog import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/com/cofbro/qian/view/GestureInputDialog.kt b/app/src/main/java/com/cofbro/qian/view/dialog/GestureInputDialog.kt similarity index 94% rename from app/src/main/java/com/cofbro/qian/view/GestureInputDialog.kt rename to app/src/main/java/com/cofbro/qian/view/dialog/GestureInputDialog.kt index c5837070..0153a1e0 100644 --- a/app/src/main/java/com/cofbro/qian/view/GestureInputDialog.kt +++ b/app/src/main/java/com/cofbro/qian/view/dialog/GestureInputDialog.kt @@ -1,4 +1,4 @@ -package com.cofbro.qian.view +package com.cofbro.qian.view.dialog import android.app.AlertDialog import android.content.Context @@ -6,6 +6,7 @@ import android.graphics.Color import android.graphics.drawable.ColorDrawable import android.os.Bundle import com.cofbro.qian.R +import com.cofbro.qian.view.GestureInputView class GestureInputDialog(context: Context) : AlertDialog(context) { override fun onCreate(savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/cofbro/qian/view/TipDialog.kt b/app/src/main/java/com/cofbro/qian/view/dialog/TipDialog.kt similarity index 98% rename from app/src/main/java/com/cofbro/qian/view/TipDialog.kt rename to app/src/main/java/com/cofbro/qian/view/dialog/TipDialog.kt index 0b9740f2..4168bd16 100644 --- a/app/src/main/java/com/cofbro/qian/view/TipDialog.kt +++ b/app/src/main/java/com/cofbro/qian/view/dialog/TipDialog.kt @@ -1,4 +1,4 @@ -package com.cofbro.qian.view +package com.cofbro.qian.view.dialog import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/com/cofbro/qian/view/WaitDialog.kt b/app/src/main/java/com/cofbro/qian/view/dialog/WaitDialog.kt similarity index 98% rename from app/src/main/java/com/cofbro/qian/view/WaitDialog.kt rename to app/src/main/java/com/cofbro/qian/view/dialog/WaitDialog.kt index c6f5b585..413eec97 100644 --- a/app/src/main/java/com/cofbro/qian/view/WaitDialog.kt +++ b/app/src/main/java/com/cofbro/qian/view/dialog/WaitDialog.kt @@ -1,4 +1,4 @@ -package com.cofbro.qian.view +package com.cofbro.qian.view.dialog import android.app.AlertDialog import android.content.Context diff --git a/app/src/main/java/com/cofbro/qian/wrapper/did/DoHomeworkActivity.kt b/app/src/main/java/com/cofbro/qian/wrapper/did/DoHomeworkActivity.kt index e13436e4..345ff099 100644 --- a/app/src/main/java/com/cofbro/qian/wrapper/did/DoHomeworkActivity.kt +++ b/app/src/main/java/com/cofbro/qian/wrapper/did/DoHomeworkActivity.kt @@ -15,7 +15,7 @@ import com.cofbro.qian.utils.dp2px import com.cofbro.qian.utils.getStatusBarHeight import com.cofbro.qian.utils.getStringExt import com.cofbro.qian.utils.safeParseToJson -import com.cofbro.qian.view.FullScreenDialog +import com.cofbro.qian.view.dialog.FullScreenDialog import com.hjq.toast.ToastUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/cofbro/qian/wrapper/task/TaskFragment.kt b/app/src/main/java/com/cofbro/qian/wrapper/task/TaskFragment.kt index 48b2abc4..899bb2ad 100644 --- a/app/src/main/java/com/cofbro/qian/wrapper/task/TaskFragment.kt +++ b/app/src/main/java/com/cofbro/qian/wrapper/task/TaskFragment.kt @@ -26,10 +26,12 @@ import com.cofbro.qian.utils.getJSONArrayExt import com.cofbro.qian.utils.getStringExt import com.cofbro.qian.utils.safeParseToJson import com.cofbro.qian.utils.showSignResult -import com.cofbro.qian.view.CodingDialog -import com.cofbro.qian.view.FullScreenDialog -import com.cofbro.qian.view.GestureInputDialog +import com.cofbro.qian.view.dialog.CodingDialog +import com.cofbro.qian.view.dialog.FullScreenDialog +import com.cofbro.qian.view.dialog.GestureInputDialog import com.cofbro.qian.wrapper.WrapperActivity +import com.cofbro.qian.wrapper.task.holder.Task +import com.cofbro.qian.wrapper.task.holder.TaskRunnableHolder import com.hjq.toast.ToastUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -48,11 +50,8 @@ class TaskFragment : BaseFragment() { private var locationText = "" private var location = "" private var remark = "" - private var alreadySignCount = 0 - private var otherSignUsers: JSONArray? = null private var qrCodeId = "" private var alreadySign = false - private var cookies = "" // 签到的aid private var id = "" @@ -205,48 +204,6 @@ class TaskFragment : BaseFragment() { } } } - - // 尝试登录 - viewModel.loginLiveData.observe(this) { response -> - val data = response.data ?: return@observe - lifecycleScope.launch(Dispatchers.IO) { - val body = data.body?.string()?.safeParseToJson() - val headers = data.headers - cookies = headers.values("Set-Cookie").toString() - if (body?.getBoolean("status") == true) { - signWith(id, code, cookies) - } - } - } - - // cookie签到 - viewModel.cookieSignLiveData.observe(this) { - lifecycleScope.launch(Dispatchers.IO) { - cookies = it - signWith(id, code, cookies) - } - } - - // 绑定签到 - // todo 修改签到逻辑 - viewModel.signTogetherLiveData.observe(this) { response -> - val data = response.data ?: return@observe - lifecycleScope.launch(Dispatchers.IO) { - val body = data.body?.string() ?: "" - signRecord(body, cookies) - alreadySignCount++ - if (alreadySignCount < (otherSignUsers?.size ?: 0)) { - val itemUser = - otherSignUsers?.getOrNull(alreadySignCount) as? JSONObject ?: JSONObject() - remark = itemUser.getStringExt(Constants.Account.REMARK) - tryLogin(itemUser) - } else { - withContext(Dispatchers.Main) { - hideLoadingView() - } - } - } - } } override fun onStop() { @@ -260,7 +217,7 @@ class TaskFragment : BaseFragment() { if (signWith && (signWithHasFailed || data.contains("success") || data.contains("签到成功"))) { // 如果本账号签到成功,则开始自动签到其他绑定账号 showLoadingView() - signWithAccounts() + proxy() } } @@ -417,26 +374,6 @@ class TaskFragment : BaseFragment() { } } - /** - * 除二维码签到的代签流程入口 - */ - private suspend fun signTogether(aid: String, signCode: String = "", cookies: String) { - activity?.let { - viewModel.signTogether( - URL.getNormalSignPath(it.courseId, it.classId, aid, signCode), - cookies - ) - } - } - - /** - * 二维码代签流程入口 - */ - private suspend fun signTogether(qrCodeId: String, cookies: String) { - val uid = findUID(cookies) - viewModel.signTogether(URL.getSignWithCameraPath(qrCodeId, location) + "&uid=$uid", cookies) - } - /** * 签到流程入口 * @param aid activeId @@ -474,6 +411,7 @@ class TaskFragment : BaseFragment() { codeDialog = CodingDialog(requireContext()).apply { setCancelable(false) setPositiveClickListener { + showLoadingView() lifecycleScope.launch(Dispatchers.IO) { code = it analysisAndStartSign(id) @@ -520,31 +458,52 @@ class TaskFragment : BaseFragment() { } } - private suspend fun signWithAccounts() { - withContext(Dispatchers.IO) { - val data = AccountManager.loadAllAccountData(requireContext()) - val cookieSignData = AccountManager.loadAllAccountData( - requireContext(), - Constants.RecycleJson.COOKIE_JSON_DATA - ) - otherSignUsers = data.getJSONArrayExt(Constants.Account.USERS) - cookieSignData.getJSONArrayExt(Constants.Account.USERS).forEach { user -> - val timestamp = - (user as? JSONObject)?.getStringExt(Constants.Account.TIME)?.toLong() ?: 0L - if (System.currentTimeMillis() - timestamp <= 24 * 60 * 60 * 1000) { - otherSignUsers?.add(user) - } + private suspend fun proxy() { + lifecycleScope.launch(Dispatchers.IO) { + val holder = TaskRunnableHolder(produceTasks()) + holder.submit() + holder.blockingFetchingResult().forEach { + remark = it?.remark ?: "" + signRecord(it?.body ?: "", it?.cookies ?: "") } - val firstUser = otherSignUsers?.getOrNull(0) as? JSONObject - if (firstUser != null) { - remark = firstUser.getStringExt(Constants.Account.REMARK) - tryLogin(firstUser) - } else { - withContext(Dispatchers.Main) { - hideLoadingView() - } + withContext(Dispatchers.Main) { + hideLoadingView() + } + } + } + + private fun produceTasks(): List { + val data = loadAllSignUser() + val list = arrayListOf() + data.forEach { + val task = Task(it as JSONObject) + task.aid = id + task.preSignUrl = preSignUrl + task.classId = activity?.classId ?: "" + task.courseId = activity?.courseId ?: "" + task.code = code + task.location = location + task.qrCodeId = qrCodeId + list.add(task) + } + return list + } + + private fun loadAllSignUser(): JSONArray { + val data = AccountManager.loadAllAccountData(requireContext()) + val cookieSignData = AccountManager.loadAllAccountData( + requireContext(), + Constants.RecycleJson.COOKIE_JSON_DATA + ) + val allSignUsers = data.getJSONArrayExt(Constants.Account.USERS) + cookieSignData.getJSONArrayExt(Constants.Account.USERS).forEach { user -> + val timestamp = + (user as? JSONObject)?.getStringExt(Constants.Account.TIME)?.toLong() ?: 0L + if (System.currentTimeMillis() - timestamp <= 24 * 60 * 60 * 1000) { + allSignUsers.add(user) } } + return allSignUsers } private fun signRecord(body: String, cookies: String = "") { @@ -564,43 +523,6 @@ class TaskFragment : BaseFragment() { SignRecorder.record(requireContext(), username, courseName, statusName) } - private fun tryLogin(user: JSONObject) { - val username = user.getStringExt(Constants.Account.USERNAME) - val password = user.getStringExt(Constants.Account.PASSWORD) - val cookieSign = user.getStringExt(Constants.Account.COOKIE) - if (username.isNotEmpty() && password.isNotEmpty()) { - viewModel.tryLogin(URL.getLoginPath(username, password)) - } else { - viewModel.tryLoginWithCookies(cookieSign) - } - } - - private suspend fun signWith(id: String, code: String = "", cookies: String) { - viewModel.analysisForSignTogether(URL.getAnalysisPath(id), - cookies, - onSuccess = { - lifecycleScope.launch(Dispatchers.IO) { - val data = it.body?.string() - val analysis2Code = data?.substringAfter("code='+'")?.substringBefore("'") ?: "" - viewModel.analysis2(URL.getAnalysis2Path(analysis2Code), cookies) - delay(200) - val uid = findUID(cookies) - val signWithPreSign = preSignUrl.substringBefore("uid=") + "uid=$uid" - viewModel.preSign(signWithPreSign, cookies) - if (qrCodeId.isEmpty()) { - viewModel.request(URL.checkSignCodePath(id, code), cookies) - signTogether(id, code, cookies) - } else { - signTogether(qrCodeId, cookies) - } - } - }, - onFailure = { msg -> - ToastUtils.show(msg) - } - ) - } - private fun findUID(cookies: String): String { val uid = cookies.substringAfter("UID=") return uid.substringBefore(";") diff --git a/app/src/main/java/com/cofbro/qian/wrapper/task/holder/Result.kt b/app/src/main/java/com/cofbro/qian/wrapper/task/holder/Result.kt new file mode 100644 index 00000000..98856ec0 --- /dev/null +++ b/app/src/main/java/com/cofbro/qian/wrapper/task/holder/Result.kt @@ -0,0 +1,3 @@ +package com.cofbro.qian.wrapper.task.holder + +class Result(val body: String?, val cookies: String?, val remark: String?) \ No newline at end of file diff --git a/app/src/main/java/com/cofbro/qian/wrapper/task/holder/Task.kt b/app/src/main/java/com/cofbro/qian/wrapper/task/holder/Task.kt new file mode 100644 index 00000000..4b8a74b2 --- /dev/null +++ b/app/src/main/java/com/cofbro/qian/wrapper/task/holder/Task.kt @@ -0,0 +1,116 @@ +package com.cofbro.qian.wrapper.task.holder + +import com.alibaba.fastjson.JSONObject +import com.cofbro.qian.data.URL +import com.cofbro.qian.utils.Constants +import com.cofbro.qian.utils.NetworkUtils +import com.cofbro.qian.utils.getStringExt +import com.hjq.toast.ToastUtils +import okhttp3.Response +import java.lang.Thread.sleep +import java.util.concurrent.Callable + +/** + * @author chy 2023.12.19 + */ +class Task(private val user: JSONObject) : Callable { + // 编码后的位置信息 + var location = "" + + // 二维码读出的信息 + var qrCodeId = "" + + // 签到的aid + var aid = "" + var courseId = "" + var classId = "" + + // 签到密码 + var code = "" + var preSignUrl = "" + + // 用户cookie + private var cookies = "" + + override fun call(): Result? { + tryLoginIfNecessary() + return sign() + } + + /** + * 账号密码登录使用最新的cookie + */ + private fun tryLoginIfNecessary() { + val username = user.getStringExt(Constants.Account.USERNAME) + val password = user.getStringExt(Constants.Account.PASSWORD) + cookies = if (username.isNotEmpty() && password.isNotEmpty()) { + val response = requestWithServer(URL.getLoginPath(username, password)) + val headers = response?.headers + headers?.values("Set-Cookie").toString() + } else { + user.getStringExt(Constants.Account.COOKIE) + } + } + + /** + * 签到 -> 内部分为几个步骤 + */ + private fun sign(): Result? { + val response = analysis(URL.getAnalysisPath(aid)) + return if (response?.code == 200) { + val data = response.body?.string() + analysis2(data) + sleep(200) + preSign() + checkSign() + Result(signReally()?.body?.string(), cookies, user.getStringExt(Constants.Account.REMARK)) + } else { + ToastUtils.show(response?.message.toString()) + null + } + } + + private fun analysis(url: String): Response? { + val request = NetworkUtils.buildClientRequest(url, cookies) + return NetworkUtils.request(request).data + } + + private fun analysis2(data: String?) { + val analysis2Code = data?.substringAfter("code='+'")?.substringBefore("'") ?: "" + request(URL.getAnalysis2Path(analysis2Code)) + } + + private fun preSign() { + val uid = findUID(cookies) + val signWithPreSign = preSignUrl.substringBefore("uid=") + "uid=$uid" + request(signWithPreSign) + } + + private fun checkSign() { + request(URL.checkSignCodePath(aid, code)) + } + + private fun signReally(): Response? { + return if (qrCodeId.isNotEmpty()) { + request(URL.getSignWithCameraPath(qrCodeId, location) + "&uid=${findUID(cookies)}") + } else { + request(URL.getNormalSignPath(courseId, classId, aid, code)) + } + } + + // 网络通用请求 + private fun request(url: String): Response? { + val request = NetworkUtils.buildClientRequest(url, cookies) + return NetworkUtils.request(request).data + } + + private fun requestWithServer(url: String): Response? { + val request = NetworkUtils.buildServerRequest(url) + return NetworkUtils.request(request).data + } + + private fun findUID(cookies: String): String { + val uid = cookies.substringAfter("UID=") + return uid.substringBefore(";") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cofbro/qian/wrapper/task/holder/TaskRunnableHolder.kt b/app/src/main/java/com/cofbro/qian/wrapper/task/holder/TaskRunnableHolder.kt new file mode 100644 index 00000000..fc9021f3 --- /dev/null +++ b/app/src/main/java/com/cofbro/qian/wrapper/task/holder/TaskRunnableHolder.kt @@ -0,0 +1,33 @@ +package com.cofbro.qian.wrapper.task.holder + +import java.util.concurrent.Executors +import java.util.concurrent.Future + + +/** + * @author chy 2023.12.19 + */ +class TaskRunnableHolder { + private val workTasks = arrayListOf() + private var resultFuture: List> = arrayListOf() + private val result = arrayListOf() + private val threadWorker = Executors.newScheduledThreadPool(6) + + private constructor() + constructor(tasks: List) : this() { + workTasks.addAll(tasks) + } + + fun submit(): List> { + resultFuture = threadWorker.invokeAll(workTasks) + return resultFuture + } + + fun blockingFetchingResult(): List { + resultFuture.forEach { + result.add(it.get()) + } + threadWorker.shutdown() + return result + } +} \ No newline at end of file