From 11b4fb96515c0cc08da9a3e688dc14719cb497af Mon Sep 17 00:00:00 2001 From: gallonyin Date: Fri, 12 May 2023 13:44:03 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=8E=A8=E9=80=81=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F;=E9=AB=98=E7=BA=A7=E9=80=89=E9=A1=B9=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 5 + .../java/org/yameida/worktool/Constant.kt | 53 +- .../worktool/activity/SettingsActivity.kt | 68 +- .../activity/SettingsAdvanceActivity.kt | 228 +++++++ .../worktool/service/WeworkController.kt | 10 +- .../worktool/service/WeworkOperationImpl.kt | 29 +- .../org/yameida/worktool/utils/IWWAPIUtil.kt | 67 +- app/src/main/res/layout/activity_settings.xml | 109 ++-- .../res/layout/activity_settings_advance.xml | 612 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 10 files changed, 1020 insertions(+), 162 deletions(-) create mode 100644 app/src/main/java/org/yameida/worktool/activity/SettingsAdvanceActivity.kt create mode 100644 app/src/main/res/layout/activity_settings_advance.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e109f16..dfeacd2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -54,6 +54,11 @@ android:launchMode="singleTop" android:theme="@style/AppTheme"> + + - dialog.dismiss() - updateRobotQaUrl("") - } - .addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() } - .addAction(getString(R.string.add)) { dialog, index -> - val text = builder.editText.text - if (text != null) { - if (text.matches("https?://[^/]+.*".toRegex())) { - dialog.dismiss() - updateRobotQaUrl(text.toString().trim()) - } else { - ToastUtils.showLong("格式异常!") - } - } else { - ToastUtils.showLong("请勿为空!") - } - } - .create(R.style.QMUI_Dialog).show() - } - private fun showDonateDialog() { DonateUtil.zfbDonate(this) } @@ -183,40 +153,6 @@ class SettingsActivity : AppCompatActivity() { } } - private fun updateRobotQaUrl(callbackUrl: String) { - try { - val json = hashMapOf() - json["robotId"] = Constant.robotId - if (callbackUrl.isEmpty()) { - json["openCallback"] = 0 - } else { - json["openCallback"] = 1 - json["callbackUrl"] = callbackUrl - } - val requestBody = RequestBody.create( - MediaType.parse("application/json;charset=UTF-8"), - GsonUtils.toJson(json) - ) - val call = object : StringCallback() { - override fun onSuccess(response: Response?) { - if (response != null && JSONObject(response.body()).getInt("code") == 200) { - Constant.qaUrl = callbackUrl - ToastUtils.showLong(if (callbackUrl.isEmpty()) "关闭成功" else "更新成功") - } else { - onError(response) - } - } - - override fun onError(response: Response?) { - ToastUtils.showLong(if (callbackUrl.isEmpty()) "关闭失败,请稍后再试~" else "更新失败,请稍后再试~") - } - } - OkGo.post(Constant.getRobotUpdateUrl()).upRequestBody(requestBody).execute(call) - } catch (e: Exception) { - throw RuntimeException(e) - } - } - private fun updateRobotReplyStrategy(type: Int) { try { val json = hashMapOf() diff --git a/app/src/main/java/org/yameida/worktool/activity/SettingsAdvanceActivity.kt b/app/src/main/java/org/yameida/worktool/activity/SettingsAdvanceActivity.kt new file mode 100644 index 0000000..5c39a96 --- /dev/null +++ b/app/src/main/java/org/yameida/worktool/activity/SettingsAdvanceActivity.kt @@ -0,0 +1,228 @@ +package org.yameida.worktool.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.text.InputType +import android.view.View +import android.view.WindowManager +import android.widget.CompoundButton +import androidx.appcompat.app.AppCompatActivity +import com.blankj.utilcode.util.* +import com.lzy.okgo.OkGo +import com.lzy.okgo.callback.StringCallback +import com.lzy.okgo.model.Response +import com.qmuiteam.qmui.widget.dialog.QMUIDialog +import kotlinx.android.synthetic.main.activity_settings_advance.* +import okhttp3.MediaType +import okhttp3.RequestBody +import org.json.JSONObject +import org.yameida.worktool.Constant +import org.yameida.worktool.R +import org.yameida.worktool.utils.* +import java.util.* + + +/** + * 高级选项页 + */ +class SettingsAdvanceActivity : AppCompatActivity() { + + companion object { + fun enterActivity(context: Context) { + LogUtils.d("SettingsAdvanceActivity.enterActivity") + context.startActivity(Intent(context, SettingsAdvanceActivity::class.java).apply { + this.flags = Intent.FLAG_ACTIVITY_NEW_TASK + }) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + setContentView(R.layout.activity_settings_advance) + + initView() + initData() + } + + private fun initView() { + iv_back_left.setOnClickListener { finish() } + sw_full_name.isChecked = Constant.fullGroupName + sw_full_name.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> + LogUtils.i("sw_full_name onCheckedChanged: $isChecked") + Constant.fullGroupName = isChecked + }) + sw_qr_code.isChecked = Constant.groupQrCode + sw_qr_code.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> + LogUtils.i("sw_qr_code onCheckedChanged: $isChecked") + Constant.groupQrCode = isChecked + }) + sw_auto_publish.isChecked = Constant.autoPublishComment + sw_auto_publish.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener { buttonView, isChecked -> + LogUtils.i("sw_auto_publish onCheckedChanged: $isChecked") + Constant.autoPublishComment = isChecked + }) + ll_corp_param.visibility = if (Constant.customLink) View.VISIBLE else View.GONE + rl_username.visibility = if (Constant.customMP) View.VISIBLE else View.GONE + rl_qa_url.setOnClickListener { showQaUrlDialog() } + rl_corp.setOnClickListener { showCorpIdDialog() } + rl_agent.setOnClickListener { showAgentIdDialog() } + rl_schema.setOnClickListener { showSchemaDialog() } + rl_username.setOnClickListener { showUserNameDialog() } + rl_signature.setOnClickListener { showSignatureDialog() } + } + + private fun initData() { + HttpUtil.getMyConfig() + } + + private fun showQaUrlDialog() { + val builder = QMUIDialog.EditTextDialogBuilder(this) + builder.setTitle("消息回调地址") + .setPlaceholder("请输入回调接口地址") + .setDefaultText(Constant.qaUrl) + .setInputType(InputType.TYPE_CLASS_TEXT) + .addAction(getString(R.string.delete)) { dialog, index -> + dialog.dismiss() + updateRobotQaUrl("") + } + .addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() } + .addAction(getString(R.string.add)) { dialog, index -> + val text = builder.editText.text + if (text != null) { + if (text.matches("https?://[^/]+.*".toRegex())) { + dialog.dismiss() + updateRobotQaUrl(text.toString().trim()) + } else { + ToastUtils.showLong("格式异常!") + } + } else { + ToastUtils.showLong("请勿为空!") + } + } + .create(R.style.QMUI_Dialog).show() + } + + private fun updateRobotQaUrl(callbackUrl: String) { + try { + val json = hashMapOf() + json["robotId"] = Constant.robotId + if (callbackUrl.isEmpty()) { + json["openCallback"] = 0 + } else { + json["openCallback"] = 1 + json["callbackUrl"] = callbackUrl + } + val requestBody = RequestBody.create( + MediaType.parse("application/json;charset=UTF-8"), + GsonUtils.toJson(json) + ) + val call = object : StringCallback() { + override fun onSuccess(response: Response?) { + if (response != null && JSONObject(response.body()).getInt("code") == 200) { + Constant.qaUrl = callbackUrl + ToastUtils.showLong(if (callbackUrl.isEmpty()) "关闭成功" else "更新成功") + } else { + onError(response) + } + } + + override fun onError(response: Response?) { + ToastUtils.showLong(if (callbackUrl.isEmpty()) "关闭失败,请稍后再试~" else "更新失败,请稍后再试~") + } + } + OkGo.post(Constant.getRobotUpdateUrl()).upRequestBody(requestBody).execute(call) + } catch (e: Exception) { + throw RuntimeException(e) + } + } + + private fun showCorpIdDialog() { + val builder = QMUIDialog.EditTextDialogBuilder(this) + builder.setTitle("CorpId") + .setDefaultText(Constant.weworkCorpId) + .setInputType(InputType.TYPE_CLASS_TEXT) + .addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() } + .addAction(getString(R.string.add)) { dialog, index -> + val text = builder.editText.text + if (text != null) { + dialog.dismiss() + Constant.weworkCorpId = text.toString().trim() + } else { + ToastUtils.showLong("请勿为空!") + } + } + .create(R.style.QMUI_Dialog).show() + } + + private fun showAgentIdDialog() { + val builder = QMUIDialog.EditTextDialogBuilder(this) + builder.setTitle("AgentId") + .setDefaultText(Constant.weworkAgentId) + .setInputType(InputType.TYPE_CLASS_TEXT) + .addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() } + .addAction(getString(R.string.add)) { dialog, index -> + val text = builder.editText.text + if (text != null) { + dialog.dismiss() + Constant.weworkAgentId = text.toString().trim() + } else { + ToastUtils.showLong("请勿为空!") + } + } + .create(R.style.QMUI_Dialog).show() + } + + private fun showSchemaDialog() { + val builder = QMUIDialog.EditTextDialogBuilder(this) + builder.setTitle("Schema") + .setDefaultText(Constant.weworkSchema) + .setInputType(InputType.TYPE_CLASS_TEXT) + .addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() } + .addAction(getString(R.string.add)) { dialog, index -> + val text = builder.editText.text + if (text != null) { + dialog.dismiss() + Constant.weworkSchema = text.toString().trim() + } else { + ToastUtils.showLong("请勿为空!") + } + } + .create(R.style.QMUI_Dialog).show() + } + + private fun showUserNameDialog() { + val builder = QMUIDialog.EditTextDialogBuilder(this) + builder.setTitle("UserName") + .setDefaultText(Constant.weworkMP) + .setInputType(InputType.TYPE_CLASS_TEXT) + .addAction(getString(R.string.cancel)) { dialog, index -> dialog.dismiss() } + .addAction(getString(R.string.add)) { dialog, index -> + val text = builder.editText.text + if (text != null) { + dialog.dismiss() + Constant.weworkMP = text.toString().trim() + } else { + ToastUtils.showLong("请勿为空!") + } + } + .create(R.style.QMUI_Dialog).show() + } + + private fun showSignatureDialog() { + val signature = AppUtils.getAppSignaturesMD5().firstOrNull()?.replace(":", "")?.toLowerCase(Locale.ROOT) + val builder = QMUIDialog.EditTextDialogBuilder(this) + builder.setTitle("Signature") + .setDefaultText(signature) + .setInputType(InputType.TYPE_NULL) + .addAction(getString(R.string.copy)) { dialog, index -> + dialog.dismiss() + ClipboardUtils.copyText(signature) + ToastUtils.showLong("复制成功") + } + .create(R.style.QMUI_Dialog).show() + } + +} diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkController.kt b/app/src/main/java/org/yameida/worktool/service/WeworkController.kt index 4ad618e..732671c 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkController.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkController.kt @@ -294,19 +294,25 @@ object WeworkController { } /** - * 推送任意小程序 + * 推送小程序 * @see WeworkMessageBean.PUSH_MICROPROGRAM * @param message#titleList 待发送姓名列表 * @param message#objectName 小程序名称 + * @param message#receivedContent 小程序描述 + * @param message#originalContent 小程序链接地址 + * @param message#fileUrl 图片地址 * @param message#extraText 附加留言 可选 */ @RequestMapping fun pushMicroprogram(message: WeworkMessageBean): Boolean { - LogUtils.d("pushMicroprogram(): ${message.titleList} ${message.objectName} ${message.extraText}") + LogUtils.d("pushMicroprogram(): ${message.titleList} ${message.objectName} ${message.receivedContent} ${message.originalContent} ${message.fileUrl} ${message.extraText}") return WeworkOperationImpl.pushMicroprogram( message, message.titleList, message.objectName, + message.receivedContent, + message.originalContent, + message.fileUrl, message.extraText ) } diff --git a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt index e161626..a13c24c 100644 --- a/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt +++ b/app/src/main/java/org/yameida/worktool/service/WeworkOperationImpl.kt @@ -517,19 +517,40 @@ object WeworkOperationImpl { } /** - * 推送任意小程序(不推荐) + * 推送小程序 + * @see WeworkMessageBean.PUSH_MICROPROGRAM * @param titleList 待发送姓名列表 * @param objectName 小程序名称 - * @param extraText 附加留言 可选 + * @param receivedContent 小程序描述 + * @param originalContent 小程序链接地址 + * @param fileUrl 图片地址 + * @param extraText 附加留言 可选 */ fun pushMicroprogram( message: WeworkMessageBean, titleList: List, objectName: String, - extraText: String? = null + receivedContent: String, + originalContent: String, + fileUrl: String, + extraText: String? = null, + maxRetryCount: Int? = null ): Boolean { val startTime = System.currentTimeMillis() - return false + if (IWWAPIUtil.sendMicroProgram(fileUrl, originalContent, objectName, receivedContent)) { + if (relaySelectTarget(titleList, extraText)) { + uploadCommandResult(message, ExecCallbackBean.SUCCESS, "", startTime, titleList, listOf()) + return true + } else { + LogUtils.e("转发失败") + uploadCommandResult(message, ExecCallbackBean.ERROR_RELAY, "转发失败", startTime, listOf(), titleList) + return false + } + } else { + LogUtils.e("非法操作") + uploadCommandResult(message, ExecCallbackBean.ERROR_ILLEGAL_OPERATION, "非法操作", startTime, listOf(), titleList) + return false + } } /** diff --git a/app/src/main/java/org/yameida/worktool/utils/IWWAPIUtil.kt b/app/src/main/java/org/yameida/worktool/utils/IWWAPIUtil.kt index 3516fcd..8dbbea9 100644 --- a/app/src/main/java/org/yameida/worktool/utils/IWWAPIUtil.kt +++ b/app/src/main/java/org/yameida/worktool/utils/IWWAPIUtil.kt @@ -3,16 +3,18 @@ package org.yameida.worktool.utils import android.content.Context import android.graphics.Bitmap import android.graphics.drawable.BitmapDrawable -import android.widget.Toast -import com.blankj.utilcode.util.AppUtils -import com.blankj.utilcode.util.LogUtils -import com.blankj.utilcode.util.Utils +import com.blankj.utilcode.util.* +import com.lzy.okgo.OkGo import com.tencent.wework.api.IWWAPI import com.tencent.wework.api.WWAPIFactory import com.tencent.wework.api.model.WWMediaLink import com.tencent.wework.api.model.WWMediaMiniProgram -import com.tencent.wework.api.model.WWSimpleRespMessage import org.yameida.worktool.Constant +import org.yameida.worktool.R +import java.io.ByteArrayOutputStream +import java.io.File +import java.text.SimpleDateFormat +import java.util.* object IWWAPIUtil { @@ -38,35 +40,48 @@ object IWWAPIUtil { return iwwapi?.sendMessage(link) ?: false } - fun sendMicroProgram() { + fun sendMicroProgram(imageUrl: String?, webpageUrl: String?, title: String?, description: String?): Boolean { val miniProgram = WWMediaMiniProgram() miniProgram.appPkg = AppUtils.getAppPackageName() miniProgram.appName = AppUtils.getAppName() miniProgram.appId = Constant.weworkCorpId miniProgram.agentId = Constant.weworkAgentId miniProgram.schema = Constant.weworkSchema - miniProgram.username = "gh_dde54cb88ce7@app" //必须是应用关联的小程序,注意要有@app后缀 - miniProgram.description = "dddddd" - miniProgram.path = "/pages/plugin/index.html?plugid=1cbd3b7c8674e61769436b5e354ddb2f" -// val bitmap = (getDrawable(R.drawable.test) as BitmapDrawable).bitmap -// val stream = ByteArrayOutputStream() -// bitmap.compress(Bitmap.CompressFormat.JPEG, 0, stream) -// val byteArray: ByteArray = stream.toByteArray() + miniProgram.username = Constant.weworkMP //必须是应用关联的小程序,注意要有@app后缀 + miniProgram.description = description + miniProgram.path = webpageUrl + miniProgram.title = title -// miniProgram.hdImageData = byteArray - miniProgram.title = "测试_MaHow" - iwwapi!!.sendMessage(miniProgram) { resp -> - if (resp is WWSimpleRespMessage) { - val rsp = resp as WWSimpleRespMessage - var t: String? = "" - Toast.makeText( - Utils.getApp(), - "发小程序," + rsp.errCode + "," + rsp.errMsg.also { - t = it - }, - Toast.LENGTH_LONG - ).show() + val bitmap = (Utils.getApp().getDrawable(R.mipmap.ic_launcher) as BitmapDrawable).bitmap + val stream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, 0, stream) + miniProgram.hdImageData = stream.toByteArray() + if (imageUrl != null) { + LogUtils.i("下载开始 $imageUrl") + val execute = OkGo.get(imageUrl).execute() + LogUtils.i("下载完成 $imageUrl") + val body = execute.body() + if (body != null) { + val df = SimpleDateFormat("yyyy-MM-dd") + val filePath = "${ + Utils.getApp().getExternalFilesDir("mp_image_cache") + }/${df.format(Date())}/${imageUrl.split("/").lastOrNull()}" + val newFile = File(filePath) + val create = FileUtils.createFileByDeleteOldFile(newFile) + if (create && newFile.canWrite()) { + newFile.writeBytes(body.bytes()) + LogUtils.i("文件存储本地成功 $filePath") + val bitmap = ImageUtils.bytes2Bitmap(File(filePath).readBytes()) + val stream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, 0, stream) + miniProgram.hdImageData = stream.toByteArray() + } else { + LogUtils.e("文件存储本地失败 $filePath") + } + } else { + LogUtils.e("文件下载失败") } } + return iwwapi?.sendMessage(miniProgram) ?: false } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 4e18a52..bbb4562 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -51,7 +51,7 @@ android:background="@color/background" android:orientation="vertical"> - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a63b758..22606f5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ 请输入新的host 删除 取消 + 复制 确认 新增 host列表