From b5c5110a5144ae4a00173e2e6ff7ef52e89890b8 Mon Sep 17 00:00:00 2001 From: qinglong Date: Tue, 21 Jul 2026 16:00:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A8=A1=E5=9D=97APPBase=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E6=9C=80=E6=96=B0=E6=97=B6=E9=97=B4=E6=A0=87?= =?UTF-8?q?=E7=AD=BEappbase-v15.21.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- appbase/build.properties | 8 +- appbase/src/beta/AndroidManifest.xml | 17 +- appbase/src/main/AndroidManifest.xml | 9 +- .../winboll/studio/appbase/MainActivity.java | 36 +++ .../APPExcetionMailSettingsActivity.java | 162 +++++++++++ .../main/res/layout-night/activity_main2.xml | 2 +- .../activity_appexcetionmailsettings.xml | 150 ++++++++++ appbase/src/main/res/values-night/styles.xml | 2 +- appbase/src/main/res/values/styles.xml | 2 +- libappbase/build.properties | 8 +- .../studio/libappbase/CrashActivity.java | 5 +- .../libappbase/GlobalCrashReportView.java | 16 +- .../cc/winboll/studio/libappbase/LogView.java | 9 +- .../libappbase/common/ViewColorTable.java | 202 +++++++++++++ .../studio/libappbase/utils/SMTPUtils.java | 274 ++++++++++++++++++ .../studio/libappbase/views/AboutView.java | 11 +- .../libappbase/widget/LogTagSpinner.java | 8 +- .../src/main/res/drawable/bg_toolbar_log.xml | 8 +- .../src/main/res/drawable/btn_gray_bg.xml | 6 +- .../res/drawable/ic_launcher_background.xml | 2 +- .../src/main/res/values-night/styles.xml | 20 +- libappbase/src/main/res/values/styles.xml | 20 +- 22 files changed, 905 insertions(+), 72 deletions(-) create mode 100644 appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java create mode 100644 appbase/src/main/res/layout/activity_appexcetionmailsettings.xml create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/common/ViewColorTable.java create mode 100644 libappbase/src/main/java/cc/winboll/studio/libappbase/utils/SMTPUtils.java diff --git a/appbase/build.properties b/appbase/build.properties index 06e334c..75e9c15 100644 --- a/appbase/build.properties +++ b/appbase/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Jul 21 09:06:49 HKT 2026 -stageCount=1 +#Tue Jul 21 14:10:49 HKT 2026 +stageCount=4 libraryProject=libappbase baseVersion=15.21 -publishVersion=15.21.0 +publishVersion=15.21.3 buildCount=0 -baseBetaVersion=15.21.1 +baseBetaVersion=15.21.4 diff --git a/appbase/src/beta/AndroidManifest.xml b/appbase/src/beta/AndroidManifest.xml index 32817e8..26dcaf0 100644 --- a/appbase/src/beta/AndroidManifest.xml +++ b/appbase/src/beta/AndroidManifest.xml @@ -1,14 +1,15 @@ - - + + + + + - - - - + \ No newline at end of file diff --git a/appbase/src/main/AndroidManifest.xml b/appbase/src/main/AndroidManifest.xml index 4c0df09..90f90be 100644 --- a/appbase/src/main/AndroidManifest.xml +++ b/appbase/src/main/AndroidManifest.xml @@ -22,15 +22,17 @@ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"> + + + + - - + + diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java index 96b99c4..b26c08e 100644 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java +++ b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java @@ -1,8 +1,12 @@ package cc.winboll.studio.appbase; import android.app.Activity; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.pm.ShortcutInfo; +import android.content.pm.ShortcutManager; +import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Bundle; import android.view.Menu; @@ -11,6 +15,7 @@ import android.view.View; import android.widget.Toolbar; import cc.winboll.studio.appbase.R; import cc.winboll.studio.appbase.model.TestBean; +import cc.winboll.studio.appbase.develop.APPExcetionMailSettingsActivity; import cc.winboll.studio.libappbase.LogActivity; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.ToastUtils; @@ -45,6 +50,7 @@ public class MainActivity extends Activity { setActionBar(mToolbar); // 将 Toolbar 替代系统默认 ActionBar initTestData(); + setupShortcuts(); } void initTestData() { @@ -60,6 +66,36 @@ public class MainActivity extends Activity { return "/BaseBaen/"+TestBean.class.getName()+".json"; } + /** + * 注册桌面图标静态快捷方式 + * 长按桌面图标后显示快捷菜单,点击可直接打开异常邮件接收设置页面 + */ + private void setupShortcuts() { + if (!"cc.winboll.studio.appbase.beta".equals(getPackageName())) { + return; + } + + ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); + if (shortcutManager == null) { + return; + } + + Intent intent = new Intent(this, APPExcetionMailSettingsActivity.class); + intent.setAction(Intent.ACTION_VIEW); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "exception_mail_settings") + .setShortLabel("邮件设置") + .setLongLabel("异常邮件接收设置") + .setIcon(Icon.createWithResource(this, R.drawable.ic_winboll)) + .setIntent(intent) + .build(); + + shortcutManager.setDynamicShortcuts( + java.util.Arrays.asList(shortcut) + ); + } + /** * 创建菜单时回调(加载工具栏菜单) * 初始化 ActionBar 菜单,加载自定义菜单布局 diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java new file mode 100644 index 0000000..bce8126 --- /dev/null +++ b/appbase/src/main/java/cc/winboll/studio/appbase/develop/APPExcetionMailSettingsActivity.java @@ -0,0 +1,162 @@ +package cc.winboll.studio.appbase.develop; + +import android.app.Activity; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; +import cc.winboll.studio.appbase.R; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.utils.SMTPUtils; + +/** + * @Author 豆包&BigPickle&MiMo&ZhanGSKen + * @Date 2026/07/21 12:44 + * @Describe 应用异常信息邮件接收账号设置 + * 配置SMTP服务器参数,用于通过邮件发送异常报告 + */ +public class APPExcetionMailSettingsActivity extends Activity { + + public static final String TAG = "APPExcetionMailSettingsActivity"; + + private static final String PREF_NAME = "smtp_config"; + private static final String KEY_SMTP_SERVER = "smtp_server"; + private static final String KEY_SMTP_PORT = "smtp_port"; + private static final String KEY_SENDER_EMAIL = "sender_email"; + private static final String KEY_AUTH_CODE = "auth_code"; + private static final String KEY_RECIPIENT_EMAIL = "recipient_email"; + + private EditText mEtSmtpServer; + private EditText mEtSmtpPort; + private EditText mEtSenderEmail; + private EditText mEtAuthCode; + private EditText mEtRecipientEmail; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_appexcetionmailsettings); + + mEtSmtpServer = (EditText) findViewById(R.id.et_smtp_server); + mEtSmtpPort = (EditText) findViewById(R.id.et_smtp_port); + mEtSenderEmail = (EditText) findViewById(R.id.et_sender_email); + mEtAuthCode = (EditText) findViewById(R.id.et_auth_code); + mEtRecipientEmail = (EditText) findViewById(R.id.et_recipient_email); + + loadConfig(); + + Button btnSave = (Button) findViewById(R.id.btn_save); + btnSave.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + saveConfig(); + } + }); + + Button btnTest = (Button) findViewById(R.id.btn_test); + btnTest.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + testSendMail(); + } + }); + } + + private void loadConfig() { + SharedPreferences sp = getSharedPreferences(PREF_NAME, MODE_PRIVATE); + String server = sp.getString(KEY_SMTP_SERVER, "smtp.qq.com"); + String port = sp.getString(KEY_SMTP_PORT, "465"); + String sender = sp.getString(KEY_SENDER_EMAIL, ""); + String auth = sp.getString(KEY_AUTH_CODE, ""); + String recipient = sp.getString(KEY_RECIPIENT_EMAIL, ""); + + mEtSmtpServer.setText(server); + mEtSmtpPort.setText(port); + mEtSenderEmail.setText(sender); + mEtAuthCode.setText(auth); + mEtRecipientEmail.setText(recipient); + } + + private void saveConfig() { + String server = mEtSmtpServer.getText().toString().trim(); + String port = mEtSmtpPort.getText().toString().trim(); + String sender = mEtSenderEmail.getText().toString().trim(); + String auth = mEtAuthCode.getText().toString().trim(); + String recipient = mEtRecipientEmail.getText().toString().trim(); + + SharedPreferences.Editor editor = getSharedPreferences(PREF_NAME, MODE_PRIVATE).edit(); + editor.putString(KEY_SMTP_SERVER, server); + editor.putString(KEY_SMTP_PORT, port); + editor.putString(KEY_SENDER_EMAIL, sender); + editor.putString(KEY_AUTH_CODE, auth); + editor.putString(KEY_RECIPIENT_EMAIL, recipient); + editor.apply(); + + Toast.makeText(this, "设置已保存", Toast.LENGTH_SHORT).show(); + LogUtils.d(TAG, "saveConfig success, server=" + server + ", port=" + port + ", sender=" + sender); + } + + private void testSendMail() { + String server = mEtSmtpServer.getText().toString().trim(); + String portStr = mEtSmtpPort.getText().toString().trim(); + String sender = mEtSenderEmail.getText().toString().trim(); + String auth = mEtAuthCode.getText().toString().trim(); + String recipient = mEtRecipientEmail.getText().toString().trim(); + + if (server.isEmpty()) { + Toast.makeText(this, "请输入SMTP服务器地址", Toast.LENGTH_SHORT).show(); + return; + } + if (portStr.isEmpty()) { + Toast.makeText(this, "请输入SMTP端口", Toast.LENGTH_SHORT).show(); + return; + } + if (sender.isEmpty()) { + Toast.makeText(this, "请输入发件人邮箱", Toast.LENGTH_SHORT).show(); + return; + } + if (auth.isEmpty()) { + Toast.makeText(this, "请输入邮箱授权码", Toast.LENGTH_SHORT).show(); + return; + } + if (recipient.isEmpty()) { + Toast.makeText(this, "请输入收件人邮箱", Toast.LENGTH_SHORT).show(); + return; + } + + Toast.makeText(this, "正在发送测试邮件...", Toast.LENGTH_SHORT).show(); + + final String finalRecipient = recipient; + final String finalSender = sender; + final String finalAuth = auth; + + new Thread(new Runnable() { + @Override + public void run() { + final boolean success = SMTPUtils.sendTextMail( + finalRecipient, + "APPBase 测试邮件", + "这是一封来自APPBase的测试邮件。\n\n发送时间: " + System.currentTimeMillis(), + finalSender, + finalAuth); + + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + if (success) { + Toast.makeText(APPExcetionMailSettingsActivity.this, + "测试邮件发送成功", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(APPExcetionMailSettingsActivity.this, + "测试邮件发送失败,请检查设置", Toast.LENGTH_SHORT).show(); + } + } + }); + } + }).start(); + } +} diff --git a/appbase/src/main/res/layout-night/activity_main2.xml b/appbase/src/main/res/layout-night/activity_main2.xml index 7a96c0c..7e447c2 100644 --- a/appbase/src/main/res/layout-night/activity_main2.xml +++ b/appbase/src/main/res/layout-night/activity_main2.xml @@ -12,6 +12,6 @@ android:layout_height="wrap_content" android:text="Main2Activity" android:textSize="24sp" - android:textColor="@color/gray_900"/> + android:textColor="#212121"/> \ No newline at end of file diff --git a/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml b/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml new file mode 100644 index 0000000..bede039 --- /dev/null +++ b/appbase/src/main/res/layout/activity_appexcetionmailsettings.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +