From f8e84eee4e8034429ad05978f76851bb6fc6cf59 Mon Sep 17 00:00:00 2001
From: Hydramboo <2815968613@qq.com>
Date: Fri, 2 Jan 2026 18:43:25 +0800
Subject: [PATCH 01/13] =?UTF-8?q?feat.=20=E7=AE=80=E5=8D=95=E8=83=8C?=
=?UTF-8?q?=E6=99=AF=E8=AE=BE=E7=BD=AE=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../activity/base/BaseActivity.java | 66 +++++++++++++++++++
.../settings/SettingLaboratoryActivity.java | 2 +
app/src/main/res/values/strings.xml | 1 +
3 files changed, 69 insertions(+)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java b/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
index 92033b1e..24a317a3 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
@@ -5,8 +5,12 @@ import static com.RobinNotBad.BiliClient.activity.dynamic.DynamicActivity.getRel
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
@@ -31,6 +35,8 @@ import androidx.core.view.ViewConfigurationCompat;
import androidx.core.widget.NestedScrollView;
import androidx.lifecycle.Lifecycle;
import androidx.recyclerview.widget.RecyclerView;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
import com.RobinNotBad.BiliClient.BiliTerminal;
import com.RobinNotBad.BiliClient.R;
@@ -43,6 +49,8 @@ import com.RobinNotBad.BiliClient.util.MsgUtil;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
import com.RobinNotBad.BiliClient.util.ToolsUtil;
+import java.io.File;
+
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@@ -187,7 +195,65 @@ public class BaseActivity extends AppCompatActivity {
EventBus.getDefault().register(this);
eventBusInit = true;
}
+ //set bg for activity
+ String bgPath = SharedPreferencesUtil.getString("bg_path", "");
+ if ("".equals(bgPath)) {
+ return;
+ }
+
+ if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(this,
+ new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
+ 9999);
+ }
+
+ File bgFile = new File(bgPath);
+ if (!bgFile.exists() || !bgFile.isFile()) {
+ return;
+ }
+
+ try {
+ DisplayMetrics displayMetrics = new DisplayMetrics();
+ getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
+ int screenWidth = displayMetrics.widthPixels;
+ int screenHeight = displayMetrics.heightPixels;
+
+ BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeFile(bgFile.getAbsolutePath(), options);
+
+ int sampleSize = 1;
+ if (options.outHeight > screenHeight || options.outWidth > screenWidth) {
+ final int halfHeight = options.outHeight / 2;
+ final int halfWidth = options.outWidth / 2;
+
+ while ((halfHeight / sampleSize) >= screenHeight
+ && (halfWidth / sampleSize) >= screenWidth) {
+ sampleSize *= 2;
+ }
+ }
+
+ options.inJustDecodeBounds = false;
+ options.inSampleSize = sampleSize;
+ Bitmap bitmap = BitmapFactory.decodeFile(bgFile.getAbsolutePath(), options);
+
+ if (bitmap != null) {
+ BitmapDrawable background = new BitmapDrawable(getResources(), bitmap);
+
+ View rootView = findViewById(android.R.id.content);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ rootView.setBackground(background);
+ } else {
+ rootView.setBackgroundDrawable(background);
+ }
+ }
+ Logu.d("set_bg", "ok");
+ } catch (Exception e) {
+ MsgUtil.err("unable to set bg", e);
+ }
}
+
@Override
protected void onResume() {
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java b/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java
index f1c76a3a..86699968 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java
@@ -37,6 +37,8 @@ public class SettingLaboratoryActivity extends RefreshListActivity {
getString(R.string.setting_lab_splashtext), "欢迎使用\n哔哩终端"));
add(new SettingSection("input_string", "缓存路径", "save_path_video",
getString(R.string.setting_lab_path_video), FileUtil.getVideoDownloadPath().toString()));
+ add(new SettingSection("input_string", "背景路径", "bg_path",
+ getString(R.string.setting_lab_path_bg), ""));
add(new SettingSection("input_string", "图片下载路径", "save_path_pictures",
getString(R.string.setting_lab_path_pictures), FileUtil.getPicturePath().toString()));
add(new SettingSection("switch", "文字跑马灯", "marquee_enable", getString(R.string.setting_lab_marquee),
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 34811776..5aae8935 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -29,6 +29,7 @@
!此功能将不再继续进行改进,除非开发者有时间!\n开启选项后,软件将会变为横屏,部分列表会变为三列,更适合平板等默认横屏的设备\n*注意:部分页面仍为单列式,可能有一些页面适配不佳,电视请移步官方电视版本或使用其他第三方软件。
开启开关将会使用表冠适配方案。下面的三项若非0则滚动距离会乘以该值。\n请从1.0开始上下调节,直至你自己满意为止。打开新页面才能生效。
缓存的视频将会保存到这个位置,若文件夹不存在会自动创建。之前缓存的视频请用文件管理器手动移动到新文件夹内。\n不保证会不会出现奇怪的问题。
+ 一个简单的背景设置,不保证能用,填写文件路径即可,支持大多数图片格式
下载的图片将会保存到这个位置,若文件夹不存在会自动创建。之前下载的图片请用文件管理器手动移动到新文件夹内。\n不保证会不会出现奇怪的问题。
关闭此开关后,将会全局禁用文字跑马灯,可能会提升性能但会导致部分文字显示不全。
若后台下载在你的设备上有问题,请打开此选项以换回旧版的前台下载器!
--
Gitee
From 56974243c818e33bbd11ac52c34674755294ef0a Mon Sep 17 00:00:00 2001
From: Hydramboo <2815968613@qq.com>
Date: Fri, 2 Jan 2026 23:47:56 +0800
Subject: [PATCH 02/13] =?UTF-8?q?feat.=20=E4=B8=BB=E9=A2=98=E7=B3=BB?=
=?UTF-8?q?=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../RobinNotBad/BiliClient/BiliTerminal.java | 2 +
.../activity/base/BaseActivity.java | 66 ++------------
.../settings/SettingLaboratoryActivity.java | 4 +-
.../RobinNotBad/BiliClient/util/Theme.java | 87 +++++++++++++++++++
.../BiliClient/util/ThemeUtils.java | 48 ++++++++++
app/src/main/res/values/strings.xml | 2 +-
6 files changed, 145 insertions(+), 64 deletions(-)
create mode 100644 app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java
create mode 100644 app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java b/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
index 6193d84d..57911009 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
@@ -18,6 +18,7 @@ import com.RobinNotBad.BiliClient.util.Logu;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
import com.RobinNotBad.BiliClient.util.TerminalContext;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.lang.ref.WeakReference;
public class BiliTerminal extends Application {
@@ -48,6 +49,7 @@ public class BiliTerminal extends Application {
Logu.LOGV_ENABLED = SharedPreferencesUtil.getBoolean("dev_logv", debugBuild);
Logu.LOGD_ENABLED = SharedPreferencesUtil.getBoolean("dev_logd", debugBuild);
Logu.LOGI_ENABLED = SharedPreferencesUtil.getBoolean("dev_logi", debugBuild);
+ ThemeUtils.loadThemeData();
}
}
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java b/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
index 24a317a3..6e64cdfe 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
@@ -31,12 +31,12 @@ import android.widget.TextView;
import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
import androidx.core.view.ViewConfigurationCompat;
import androidx.core.widget.NestedScrollView;
import androidx.lifecycle.Lifecycle;
import androidx.recyclerview.widget.RecyclerView;
-import androidx.core.app.ActivityCompat;
-import androidx.core.content.ContextCompat;
import com.RobinNotBad.BiliClient.BiliTerminal;
import com.RobinNotBad.BiliClient.R;
@@ -47,14 +47,14 @@ import com.RobinNotBad.BiliClient.util.AsyncLayoutInflaterX;
import com.RobinNotBad.BiliClient.util.Logu;
import com.RobinNotBad.BiliClient.util.MsgUtil;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.RobinNotBad.BiliClient.util.ToolsUtil;
-import java.io.File;
-
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
+import java.io.File;
public class BaseActivity extends AppCompatActivity {
public int window_width, window_height;
@@ -195,63 +195,7 @@ public class BaseActivity extends AppCompatActivity {
EventBus.getDefault().register(this);
eventBusInit = true;
}
- //set bg for activity
- String bgPath = SharedPreferencesUtil.getString("bg_path", "");
- if ("".equals(bgPath)) {
- return;
- }
-
- if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
- != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this,
- new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
- 9999);
- }
-
- File bgFile = new File(bgPath);
- if (!bgFile.exists() || !bgFile.isFile()) {
- return;
- }
-
- try {
- DisplayMetrics displayMetrics = new DisplayMetrics();
- getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
- int screenWidth = displayMetrics.widthPixels;
- int screenHeight = displayMetrics.heightPixels;
-
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- BitmapFactory.decodeFile(bgFile.getAbsolutePath(), options);
-
- int sampleSize = 1;
- if (options.outHeight > screenHeight || options.outWidth > screenWidth) {
- final int halfHeight = options.outHeight / 2;
- final int halfWidth = options.outWidth / 2;
-
- while ((halfHeight / sampleSize) >= screenHeight
- && (halfWidth / sampleSize) >= screenWidth) {
- sampleSize *= 2;
- }
- }
-
- options.inJustDecodeBounds = false;
- options.inSampleSize = sampleSize;
- Bitmap bitmap = BitmapFactory.decodeFile(bgFile.getAbsolutePath(), options);
-
- if (bitmap != null) {
- BitmapDrawable background = new BitmapDrawable(getResources(), bitmap);
-
- View rootView = findViewById(android.R.id.content);
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- rootView.setBackground(background);
- } else {
- rootView.setBackgroundDrawable(background);
- }
- }
- Logu.d("set_bg", "ok");
- } catch (Exception e) {
- MsgUtil.err("unable to set bg", e);
- }
+ ThemeUtils.apply(this);
}
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java b/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java
index 86699968..cb908dce 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/SettingLaboratoryActivity.java
@@ -37,8 +37,8 @@ public class SettingLaboratoryActivity extends RefreshListActivity {
getString(R.string.setting_lab_splashtext), "欢迎使用\n哔哩终端"));
add(new SettingSection("input_string", "缓存路径", "save_path_video",
getString(R.string.setting_lab_path_video), FileUtil.getVideoDownloadPath().toString()));
- add(new SettingSection("input_string", "背景路径", "bg_path",
- getString(R.string.setting_lab_path_bg), ""));
+ add(new SettingSection("input_string", "主题路径", "theme_path",
+ getString(R.string.setting_lab_path_theme), ""));
add(new SettingSection("input_string", "图片下载路径", "save_path_pictures",
getString(R.string.setting_lab_path_pictures), FileUtil.getPicturePath().toString()));
add(new SettingSection("switch", "文字跑马灯", "marquee_enable", getString(R.string.setting_lab_marquee),
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java
new file mode 100644
index 00000000..919c2557
--- /dev/null
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java
@@ -0,0 +1,87 @@
+package com.RobinNotBad.BiliClient.util;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class Theme {
+ private final String name;
+ private final String publisher;
+ private final String version;
+ private final int baseThemeColor;
+ private final boolean useBackgroundImage;
+ private Drawable backgroundDrawable;
+
+ public Theme(String themePath) throws IOException, JSONException {
+ File themeFile = new File(themePath);
+
+ try (ZipFile zip = new ZipFile(themeFile)) {
+ ZipEntry configEntry = zip.getEntry("config.json");
+ if (configEntry == null) {
+ throw new IOException("missing config.json in theme package");
+ }
+
+ StringBuilder jsonSb = new StringBuilder();
+ try (InputStream is = zip.getInputStream(configEntry);
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ jsonSb.append(line);
+ }
+ }
+ String jsonStr = jsonSb.toString();
+
+ JSONObject json = new JSONObject(jsonStr);
+ name = json.optString("name", "未命名");
+ publisher = json.optString("publisher", "未知");
+ version = json.optString("version", "0");
+ useBackgroundImage = json.optBoolean("bg", false);
+
+ String colorHex = json.optString("themeColor", "#000000");
+ int parsedColor;
+ try {
+ if (!colorHex.startsWith("#")) {
+ colorHex = "#" + colorHex;
+ }
+ if (colorHex.length() == 4) {
+ char r = colorHex.charAt(1);
+ char g = colorHex.charAt(2);
+ char b = colorHex.charAt(3);
+ colorHex = "#" + r + r + g + g + b + b;
+ }
+ parsedColor = Color.parseColor(colorHex);
+ } catch (Exception e) {
+ Logu.w("invalid color format: " + colorHex + ", using default");
+ parsedColor = Color.parseColor("#000000");
+ }
+ baseThemeColor = parsedColor;
+ if (useBackgroundImage) {
+ ZipEntry bgEntry = zip.getEntry("bg.jpg");
+ if (bgEntry != null) {
+ try (InputStream is = zip.getInputStream(bgEntry)) {
+ Bitmap backgroundBitmap = BitmapFactory.decodeStream(is);
+ backgroundDrawable = new BitmapDrawable(backgroundBitmap);
+ } catch (Exception e) {
+ Logu.w("failed to decode background image: " + e.getMessage());
+ }
+ }
+ }
+ }
+ }
+
+ public String getName() { return name; }
+ public String getPublisher() { return publisher; }
+ public String getVersion() { return version; }
+ public int getBaseThemeColor() { return baseThemeColor; }
+ public boolean isUseBackgroundImage() { return useBackgroundImage; }
+ public Drawable getBackground() { return backgroundDrawable; }
+}
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
new file mode 100644
index 00000000..16c4dc90
--- /dev/null
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
@@ -0,0 +1,48 @@
+package com.RobinNotBad.BiliClient.util;
+
+import android.app.Activity;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.view.Window;
+
+public class ThemeUtils {
+ private static Theme sCurrentTheme;
+
+ public static void loadThemeData() {
+ String path = SharedPreferencesUtil.getString("theme_path", "");
+ if (path.isEmpty()) {
+ Logu.d("no theme path saved");
+ sCurrentTheme = null;
+ return;
+ }
+ if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(this,
+ new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
+ 9999);
+ }
+ try {
+ sCurrentTheme = new Theme(path);
+ } catch (Exception e) {
+ Logu.e("theme load failed: " + e.getMessage());
+ MsgUtil.err("unable to load theme", e);
+ sCurrentTheme = null;
+ }
+ }
+
+ public static void apply(Activity activity) {
+ if (sCurrentTheme == null) return;
+
+ Window window = activity.getWindow();
+
+ window.setStatusBarColor(sCurrentTheme.getBaseThemeColor());
+ window.setNavigationBarColor(sCurrentTheme.getBaseThemeColor());
+
+ Drawable background = sCurrentTheme.getBackground();
+ if (background != null) {
+ window.setBackgroundDrawable(background);
+ } else {
+ window.setBackgroundDrawable(new ColorDrawable(sCurrentTheme.getBaseThemeColor()));
+ }
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 5aae8935..28e83703 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -29,7 +29,7 @@
!此功能将不再继续进行改进,除非开发者有时间!\n开启选项后,软件将会变为横屏,部分列表会变为三列,更适合平板等默认横屏的设备\n*注意:部分页面仍为单列式,可能有一些页面适配不佳,电视请移步官方电视版本或使用其他第三方软件。
开启开关将会使用表冠适配方案。下面的三项若非0则滚动距离会乘以该值。\n请从1.0开始上下调节,直至你自己满意为止。打开新页面才能生效。
缓存的视频将会保存到这个位置,若文件夹不存在会自动创建。之前缓存的视频请用文件管理器手动移动到新文件夹内。\n不保证会不会出现奇怪的问题。
- 一个简单的背景设置,不保证能用,填写文件路径即可,支持大多数图片格式
+ 主题设置,填写文件路径即可,压缩包需要包含config.json配置,可选bg.jpg背景
下载的图片将会保存到这个位置,若文件夹不存在会自动创建。之前下载的图片请用文件管理器手动移动到新文件夹内。\n不保证会不会出现奇怪的问题。
关闭此开关后,将会全局禁用文字跑马灯,可能会提升性能但会导致部分文字显示不全。
若后台下载在你的设备上有问题,请打开此选项以换回旧版的前台下载器!
--
Gitee
From ab357b119470c7f4dc507154e87e29e751d52b9b Mon Sep 17 00:00:00 2001
From: Hydramboo <2815968613@qq.com>
Date: Fri, 2 Jan 2026 23:49:19 +0800
Subject: [PATCH 03/13] =?UTF-8?q?fix.=20=E5=BF=98=E4=BF=AE=E4=BA=86?=
=?UTF-8?q?=E6=88=91=E6=98=AF=E7=BA=B8=E5=BC=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
index 16c4dc90..2e29ee87 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
@@ -4,6 +4,9 @@ import android.app.Activity;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.view.Window;
+import androidx.core.content.ContextCompat;
+import android.content.pm.PackageManager;
+import androidx.core.app.ActivityCompat;
public class ThemeUtils {
private static Theme sCurrentTheme;
--
Gitee
From ab173d9eac32913995bfc9ed398de3ff7a820897 Mon Sep 17 00:00:00 2001
From: Hydramboo <2815968613@qq.com>
Date: Sat, 3 Jan 2026 13:55:01 +0800
Subject: [PATCH 04/13] =?UTF-8?q?feat.=E6=94=B9=E8=BF=9B=E4=B8=BB=E9=A2=98?=
=?UTF-8?q?=E7=B3=BB=E7=BB=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../RobinNotBad/BiliClient/BiliTerminal.java | 2 +-
.../BiliClient/activity/SplashActivity.java | 4 ++
.../BiliClient/util/ThemeUtils.java | 67 +++++++++++++++----
app/src/main/res/values/strings.xml | 2 +-
4 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java b/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
index 57911009..e5e3a696 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
@@ -17,8 +17,8 @@ import com.RobinNotBad.BiliClient.activity.user.info.UserInfoActivity;
import com.RobinNotBad.BiliClient.util.Logu;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
import com.RobinNotBad.BiliClient.util.TerminalContext;
-
import com.RobinNotBad.BiliClient.util.ThemeUtils;
+
import java.lang.ref.WeakReference;
public class BiliTerminal extends Application {
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/activity/SplashActivity.java b/app/src/main/java/com/RobinNotBad/BiliClient/activity/SplashActivity.java
index d92bab8f..5c168199 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/activity/SplashActivity.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/activity/SplashActivity.java
@@ -24,6 +24,7 @@ import com.RobinNotBad.BiliClient.util.MsgUtil;
import com.RobinNotBad.BiliClient.util.NetWorkUtil;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import org.json.JSONException;
import org.json.JSONObject;
@@ -54,8 +55,11 @@ public class SplashActivity extends Activity {
super.onCreate(savedInstanceState);
setTheme(R.style.Theme_BiliClient);
setContentView(R.layout.activity_splash);
+
Log.e("debug", "进入应用");
+ ThemeUtils.init(this);
+
splashTextView = findViewById(R.id.splashText);
splashText = SharedPreferencesUtil.getString("ui_splashtext", "欢迎使用\n哔哩终端");
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
index 2e29ee87..6f2648ef 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
@@ -1,12 +1,20 @@
package com.RobinNotBad.BiliClient.util;
import android.app.Activity;
+import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
+import android.view.View;
+import android.view.ViewGroup;
import android.view.Window;
+import android.widget.TextView;
+
import androidx.core.content.ContextCompat;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
+import com.google.android.material.card.MaterialCardView;
+
+import java.util.ArrayDeque;
+import java.util.Deque;
public class ThemeUtils {
private static Theme sCurrentTheme;
@@ -18,12 +26,6 @@ public class ThemeUtils {
sCurrentTheme = null;
return;
}
- if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
- != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(this,
- new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
- 9999);
- }
try {
sCurrentTheme = new Theme(path);
} catch (Exception e) {
@@ -35,17 +37,56 @@ public class ThemeUtils {
public static void apply(Activity activity) {
if (sCurrentTheme == null) return;
-
+ // set bg
Window window = activity.getWindow();
-
window.setStatusBarColor(sCurrentTheme.getBaseThemeColor());
window.setNavigationBarColor(sCurrentTheme.getBaseThemeColor());
-
- Drawable background = sCurrentTheme.getBackground();
- if (background != null) {
- window.setBackgroundDrawable(background);
+ if (sCurrentTheme.isUseBackgroundImage()) {
+ window.setBackgroundDrawable(sCurrentTheme.getBackground());
} else {
window.setBackgroundDrawable(new ColorDrawable(sCurrentTheme.getBaseThemeColor()));
}
+ // set color
+ int baseColor = sCurrentTheme.getBaseThemeColor();
+ float r = Color.red(baseColor) / 255f;
+ float g = Color.green(baseColor) / 255f;
+ float b = Color.blue(baseColor) / 255f;
+ float luminance = 0.2126f * r + 0.7152f * g + 0.0722f * b;
+ boolean isTooLight = luminance > 0.7f;
+
+ View rootView = activity.getWindow().getDecorView().findViewById(android.R.id.content);
+ Deque stack = new ArrayDeque<>();
+ stack.push(rootView);
+ while (!stack.isEmpty()) {
+ View view = stack.pop();
+ if (view instanceof MaterialCardView) {
+ int darkenedColor = Color.rgb(
+ (int)(Color.red(baseColor) * 0.85f),
+ (int)(Color.green(baseColor) * 0.85f),
+ (int)(Color.blue(baseColor) * 0.85f)
+ );
+ ((MaterialCardView) view).setCardBackgroundColor(darkenedColor);
+ }
+ if (isTooLight && view instanceof TextView) {
+ ((TextView) view).setTextColor(Color.BLACK);
+ }
+ if (view instanceof ViewGroup) {
+ ViewGroup group = (ViewGroup) view;
+ for (int i = group.getChildCount() - 1; i >= 0; i--) {
+ stack.push(group.getChildAt(i));
+ }
+ }
+ }
+
+ }
+ public static void init(Activity a) {
+ if (ContextCompat.checkSelfPermission(a, android.Manifest.permission.READ_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(a,
+ new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
+ 9999);
+ }
+ if (SharedPreferencesUtil.getString("theme_path", "").isEmpty()) return;
+ loadThemeData();
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 28e83703..93b4f169 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -29,7 +29,7 @@
!此功能将不再继续进行改进,除非开发者有时间!\n开启选项后,软件将会变为横屏,部分列表会变为三列,更适合平板等默认横屏的设备\n*注意:部分页面仍为单列式,可能有一些页面适配不佳,电视请移步官方电视版本或使用其他第三方软件。
开启开关将会使用表冠适配方案。下面的三项若非0则滚动距离会乘以该值。\n请从1.0开始上下调节,直至你自己满意为止。打开新页面才能生效。
缓存的视频将会保存到这个位置,若文件夹不存在会自动创建。之前缓存的视频请用文件管理器手动移动到新文件夹内。\n不保证会不会出现奇怪的问题。
- 主题设置,填写文件路径即可,压缩包需要包含config.json配置,可选bg.jpg背景
+ 填写主题包路径即可,正在开发\n不保证可用。
下载的图片将会保存到这个位置,若文件夹不存在会自动创建。之前下载的图片请用文件管理器手动移动到新文件夹内。\n不保证会不会出现奇怪的问题。
关闭此开关后,将会全局禁用文字跑马灯,可能会提升性能但会导致部分文字显示不全。
若后台下载在你的设备上有问题,请打开此选项以换回旧版的前台下载器!
--
Gitee
From e8c9995c0a3d4a7d78a141a97649e0845abf1c94 Mon Sep 17 00:00:00 2001
From: RJMultiDev <2815968613@qq.com>
Date: Wed, 7 Jan 2026 21:33:04 +0800
Subject: [PATCH 05/13] chore. version++
Signed-off-by: RJMultiDev <2815968613@qq.com>
---
app/build.gradle | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 3b03f357..774c82f9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,7 +2,7 @@ plugins {
id 'com.android.application'
}
-int betaVer = 0 //如果为0则是正式版
+int betaVer = 1 //如果为0则是正式版
android {
@@ -21,8 +21,8 @@ android {
minSdk 14
//noinspection ExpiredTargetSdkVersion
targetSdk 26
- versionCode 20251002
- versionName "2.9.3-fix"
+ versionCode 20260107
+ versionName "2.10.0"
if (betaVer) {
versionName += "-BETA" + betaVer
--
Gitee
From caaed5ac89c252393d9cccb2fbbf50ddee39b4f4 Mon Sep 17 00:00:00 2001
From: RJMultiDev <2815968613@qq.com>
Date: Thu, 8 Jan 2026 16:25:43 +0800
Subject: [PATCH 06/13] feat. set holder items color(recyclerview fix)
Signed-off-by: RJMultiDev <2815968613@qq.com>
---
.../BiliClient/adapter/SettingsAdapter.java | 2 ++
.../adapter/video/VideoCardAdapter.java | 5 ++++-
.../BiliClient/util/ThemeUtils.java | 22 +++++++++++++------
3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SettingsAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SettingsAdapter.java
index ef4ec99c..4668b040 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SettingsAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SettingsAdapter.java
@@ -18,6 +18,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.model.SettingSection;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.google.android.material.switchmaterial.SwitchMaterial;
import java.util.HashMap;
@@ -82,6 +83,7 @@ public class SettingsAdapter extends RecyclerView.Adapter {
return;
holder.showVideoCard(videoCard, context);
-
+
+ ThemeUtils.apply(holder.itemView);
+
holder.itemView.setOnClickListener(view -> {
switch (videoCard.type) {
case "video":
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
index 6f2648ef..89d503c2 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
@@ -11,6 +11,7 @@ import android.widget.TextView;
import androidx.core.content.ContextCompat;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
+import com.google.android.material.button.MaterialButton;
import com.google.android.material.card.MaterialCardView;
import java.util.ArrayDeque;
@@ -46,6 +47,12 @@ public class ThemeUtils {
} else {
window.setBackgroundDrawable(new ColorDrawable(sCurrentTheme.getBaseThemeColor()));
}
+
+ View rootView = activity.getWindow().getDecorView().findViewById(android.R.id.content);
+ apply(rootView);
+ }
+
+ public static void apply(View rootView)
// set color
int baseColor = sCurrentTheme.getBaseThemeColor();
float r = Color.red(baseColor) / 255f;
@@ -53,20 +60,21 @@ public class ThemeUtils {
float b = Color.blue(baseColor) / 255f;
float luminance = 0.2126f * r + 0.7152f * g + 0.0722f * b;
boolean isTooLight = luminance > 0.7f;
-
- View rootView = activity.getWindow().getDecorView().findViewById(android.R.id.content);
+ int darkenedColor = Color.rgb(
+ (int)(Color.red(baseColor) * 0.85f),
+ (int)(Color.green(baseColor) * 0.85f),
+ (int)(Color.blue(baseColor) * 0.85f)
+ );
Deque stack = new ArrayDeque<>();
stack.push(rootView);
while (!stack.isEmpty()) {
View view = stack.pop();
if (view instanceof MaterialCardView) {
- int darkenedColor = Color.rgb(
- (int)(Color.red(baseColor) * 0.85f),
- (int)(Color.green(baseColor) * 0.85f),
- (int)(Color.blue(baseColor) * 0.85f)
- );
((MaterialCardView) view).setCardBackgroundColor(darkenedColor);
}
+ if (view instanceof MaterialButton) {
+ ((MaterialButton) view).setBackgroundColor(darkenedColor);
+ }
if (isTooLight && view instanceof TextView) {
((TextView) view).setTextColor(Color.BLACK);
}
--
Gitee
From 6647279e33fa25ec4188b3b99c117642a50a72c9 Mon Sep 17 00:00:00 2001
From: RJMultiDev <2815968613@qq.com>
Date: Thu, 8 Jan 2026 21:33:59 +0800
Subject: [PATCH 07/13] fix. imsb (havnt done yet)
Signed-off-by: RJMultiDev <2815968613@qq.com>
---
.../main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
index 89d503c2..6b2799ce 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
@@ -52,7 +52,7 @@ public class ThemeUtils {
apply(rootView);
}
- public static void apply(View rootView)
+ public static void apply(View rootView) {
// set color
int baseColor = sCurrentTheme.getBaseThemeColor();
float r = Color.red(baseColor) / 255f;
--
Gitee
From f75be327c65505f2b6caac6655fcee2bc1a5c755 Mon Sep 17 00:00:00 2001
From: RJMultiDev <2815968613@qq.com>
Date: Fri, 9 Jan 2026 12:18:04 +0800
Subject: [PATCH 08/13] fix. theme check
Signed-off-by: RJMultiDev <2815968613@qq.com>
---
.gitignore | 3 ++-
.../BiliClient/util/ThemeUtils.java | 25 +++++++++++++------
2 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/.gitignore b/.gitignore
index 406674ca..549f623f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,5 @@
.cxx
local.properties
.androidide
-
+.project
+.settings
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
index 6b2799ce..baf25dbc 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
@@ -53,6 +53,7 @@ public class ThemeUtils {
}
public static void apply(View rootView) {
+ if (sCurrentTheme == null) return;
// set color
int baseColor = sCurrentTheme.getBaseThemeColor();
float r = Color.red(baseColor) / 255f;
@@ -60,20 +61,30 @@ public class ThemeUtils {
float b = Color.blue(baseColor) / 255f;
float luminance = 0.2126f * r + 0.7152f * g + 0.0722f * b;
boolean isTooLight = luminance > 0.7f;
- int darkenedColor = Color.rgb(
- (int)(Color.red(baseColor) * 0.85f),
- (int)(Color.green(baseColor) * 0.85f),
- (int)(Color.blue(baseColor) * 0.85f)
- );
+ int highlightColor;
+ if (isTooLight) {
+ highlightColor = Color.rgb(
+ (int)(Color.red(baseColor) * 0.85f),
+ (int)(Color.green(baseColor) * 0.85f),
+ (int)(Color.blue(baseColor) * 0.85f)
+ );
+ }
+ else {
+ highlightColor = Color.rgb(
+ (int)(Color.red(baseColor) * 1.15f),
+ (int)(Color.green(baseColor) * 1.15f),
+ (int)(Color.blue(baseColor) * 1.15f)
+ );
+ }
Deque stack = new ArrayDeque<>();
stack.push(rootView);
while (!stack.isEmpty()) {
View view = stack.pop();
if (view instanceof MaterialCardView) {
- ((MaterialCardView) view).setCardBackgroundColor(darkenedColor);
+ ((MaterialCardView) view).setCardBackgroundColor(highlightColor);
}
if (view instanceof MaterialButton) {
- ((MaterialButton) view).setBackgroundColor(darkenedColor);
+ ((MaterialButton) view).setBackgroundColor(highlightColor);
}
if (isTooLight && view instanceof TextView) {
((TextView) view).setTextColor(Color.BLACK);
--
Gitee
From ab591551c71a7afe151b4eb5fd5ef3d48aeda360 Mon Sep 17 00:00:00 2001
From: Hydramboo <2815968613@qq.com>
Date: Sat, 10 Jan 2026 20:53:35 +0800
Subject: [PATCH 09/13] chore. more apply on progress
---
.../java/com/RobinNotBad/BiliClient/adapter/DragAdapter.java | 3 +++
.../com/RobinNotBad/BiliClient/adapter/LiveCardAdapter.java | 3 +++
.../com/RobinNotBad/BiliClient/adapter/LoginRecordAdapter.java | 3 +++
.../RobinNotBad/BiliClient/adapter/QualityChooseAdapter.java | 3 +++
.../RobinNotBad/BiliClient/adapter/QualitySelectorAdapter.java | 3 +++
.../java/com/RobinNotBad/BiliClient/adapter/ReplyAdapter.java | 2 ++
.../RobinNotBad/BiliClient/adapter/SearchHistoryAdapter.java | 3 +++
.../BiliClient/adapter/SearchSuggestionsAdapter.java | 3 ++-
.../BiliClient/adapter/article/ArticleCardAdapter.java | 3 +++
.../BiliClient/adapter/article/ArticleContentAdapter.java | 2 ++
.../RobinNotBad/BiliClient/adapter/article/OpusAdapter.java | 2 ++
.../BiliClient/adapter/article/OpusContentAdapter.java | 2 ++
12 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/DragAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/DragAdapter.java
index 4b3d438f..c2a1c342 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/DragAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/DragAdapter.java
@@ -10,6 +10,7 @@ import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.RobinNotBad.BiliClient.R;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.List;
@@ -53,6 +54,8 @@ public class DragAdapter extends RecyclerView.Adapter {
}
return false;
});
+
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LiveCardAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LiveCardAdapter.java
index a57b7396..26b11d09 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LiveCardAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LiveCardAdapter.java
@@ -17,6 +17,7 @@ import com.RobinNotBad.BiliClient.model.VideoCard;
import com.RobinNotBad.BiliClient.util.StringUtil;
import com.RobinNotBad.BiliClient.util.TerminalContext;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.List;
public class LiveCardAdapter extends RecyclerView.Adapter {
@@ -63,6 +64,8 @@ public class LiveCardAdapter extends RecyclerView.Adapter {
holder.showVideoCard(videoCard, context);
+ ThemeUtils.apply(holder.itemView);
+
holder.itemView
.setOnClickListener(view -> TerminalContext.getInstance().enterLiveDetailPage(context, room.roomid));
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LoginRecordAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LoginRecordAdapter.java
index 8462807c..b95c5827 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LoginRecordAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/LoginRecordAdapter.java
@@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.model.LoginRecord;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.List;
@@ -46,6 +47,8 @@ public class LoginRecordAdapter extends RecyclerView.Adapter {
if (onItemClickListener != null) onItemClickListener.onItemClick(position);
});
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/QualitySelectorAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/QualitySelectorAdapter.java
index 536b8aea..a70bba82 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/QualitySelectorAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/QualitySelectorAdapter.java
@@ -12,6 +12,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.listener.OnItemClickListener;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
+
import com.google.android.material.button.MaterialButton;
public class QualitySelectorAdapter extends RecyclerView.Adapter {
@@ -67,6 +69,7 @@ public class QualitySelectorAdapter extends RecyclerView.Adapter
context.startActivity(intent);
});
}
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchHistoryAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchHistoryAdapter.java
index 97093e64..2eeaccdf 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchHistoryAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchHistoryAdapter.java
@@ -14,6 +14,7 @@ import com.RobinNotBad.BiliClient.listener.OnItemClickListener;
import com.RobinNotBad.BiliClient.listener.OnItemLongClickListener;
import com.RobinNotBad.BiliClient.util.StringUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.ArrayList;
public class SearchHistoryAdapter extends RecyclerView.Adapter {
@@ -48,6 +49,8 @@ public class SearchHistoryAdapter extends RecyclerView.Adapter= historyList.size())
return;
holder.show(historyList.get(position));
+
+ ThemeUtils.apply(holder.itemView);
holder.itemView.setOnClickListener(view -> {
if (clickListener != null) {
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchSuggestionsAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchSuggestionsAdapter.java
index 1ac59c95..97779451 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchSuggestionsAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/SearchSuggestionsAdapter.java
@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.listener.OnItemClickListener;
import com.RobinNotBad.BiliClient.util.StringUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.ArrayList;
@@ -42,7 +43,7 @@ public class SearchSuggestionsAdapter extends RecyclerView.Adapter= suggestionsList.size())
return;
holder.show(suggestionsList.get(position));
-
+ ThemeUtils.apply(holder.itemView);
holder.itemView.setOnClickListener(view -> {
if (clickListener != null) {
clickListener.onItemClick(position);
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleCardAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleCardAdapter.java
index 1b0ff7e5..1021f3ae 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleCardAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleCardAdapter.java
@@ -12,6 +12,7 @@ import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.listener.OnItemLongClickListener;
import com.RobinNotBad.BiliClient.model.ArticleCard;
import com.RobinNotBad.BiliClient.util.TerminalContext;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.ArrayList;
@@ -47,6 +48,8 @@ public class ArticleCardAdapter extends RecyclerView.Adapter
holder.showArticleCard(articleCard, context);
+ ThemeUtils.apply(holder.itemView);
+
holder.itemView.setOnClickListener(
view -> TerminalContext.getInstance().enterArticleDetailPage(context, articleCard.id));
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleContentAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleContentAdapter.java
index 98e569fd..31d787f7 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleContentAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/ArticleContentAdapter.java
@@ -26,6 +26,7 @@ import com.RobinNotBad.BiliClient.util.GlideUtil;
import com.RobinNotBad.BiliClient.util.MsgUtil;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
import com.RobinNotBad.BiliClient.util.StringUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.RobinNotBad.BiliClient.util.ToolsUtil;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DecodeFormat;
@@ -303,6 +304,7 @@ public class ArticleContentAdapter extends RecyclerView.Adapter {
holder.itemView
.setOnClickListener(v -> TerminalContext.getInstance().enterOpusDetailPage(context, opus.id));
}
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/OpusContentAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/OpusContentAdapter.java
index 9c854f72..3d0e3ee9 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/OpusContentAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/article/OpusContentAdapter.java
@@ -27,6 +27,7 @@ import com.RobinNotBad.BiliClient.util.GlideUtil;
import com.RobinNotBad.BiliClient.util.MsgUtil;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
import com.RobinNotBad.BiliClient.util.StringUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.RobinNotBad.BiliClient.util.ToolsUtil;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DecodeFormat;
@@ -341,6 +342,7 @@ public class OpusContentAdapter extends RecyclerView.Adapter
Date: Sat, 10 Jan 2026 21:22:55 +0800
Subject: [PATCH 10/13] =?UTF-8?q?feat.=20=E6=90=9E=E5=AE=9A=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../BiliClient/adapter/AnnouncementAdapter.java | 3 +++
.../BiliClient/adapter/dynamic/DynamicAdapter.java | 2 ++
.../BiliClient/adapter/dynamic/UserDynamicAdapter.java | 8 ++------
.../adapter/favorite/FavoriteFolderAdapter.java | 2 ++
.../BiliClient/adapter/favorite/FolderChooseAdapter.java | 6 ++----
.../adapter/message/MessageSettingsAdapter.java | 2 ++
.../BiliClient/adapter/message/NoticeAdapter.java | 2 ++
.../BiliClient/adapter/message/PrivateMsgAdapter.java | 6 ++----
.../adapter/message/PrivateMsgSessionsAdapter.java | 2 ++
.../BiliClient/adapter/user/ElectricUserAdapter.java | 2 ++
.../BiliClient/adapter/user/UserListAdapter.java | 2 ++
.../BiliClient/adapter/video/DownloadAdapter.java | 2 ++
.../BiliClient/adapter/video/LocalVideoAdapter.java | 2 ++
.../BiliClient/adapter/video/MediaEpisodeAdapter.java | 2 ++
.../BiliClient/adapter/video/PageChooseAdapter.java | 2 ++
.../BiliClient/adapter/video/SeriesCardAdapter.java | 2 ++
.../BiliClient/adapter/video/UserVideoAdapter.java | 2 ++
.../BiliClient/adapter/video/VideoCardAdapter.java | 3 +--
18 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java
index 49e3e0ba..43abdaa3 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java
@@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.model.Announcement;
import com.RobinNotBad.BiliClient.util.MsgUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.google.android.material.card.MaterialCardView;
import java.util.ArrayList;
@@ -53,6 +54,8 @@ public class AnnouncementAdapter extends RecyclerView.Adapter MsgUtil.showText(announcement.title, announcement.content));
+
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java
index 405ab3d6..6be36b49 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java
@@ -17,6 +17,7 @@ import com.RobinNotBad.BiliClient.activity.dynamic.DynamicActivity;
import com.RobinNotBad.BiliClient.activity.dynamic.send.SendDynamicActivity;
import com.RobinNotBad.BiliClient.activity.live.FollowLiveActivity;
import com.RobinNotBad.BiliClient.model.Dynamic;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.google.android.material.button.MaterialButton;
import java.util.ArrayList;
@@ -105,6 +106,7 @@ public class DynamicAdapter extends RecyclerView.Adapter {
if (message == null)
return;
holder.showMessage(message, context);
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java
index 89b5d828..f1cdbebb 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java
@@ -24,10 +24,7 @@ import com.RobinNotBad.BiliClient.activity.CopyTextActivity;
import com.RobinNotBad.BiliClient.activity.ImageViewerActivity;
import com.RobinNotBad.BiliClient.api.PrivateMsgApi;
import com.RobinNotBad.BiliClient.model.PrivateMessage;
-import com.RobinNotBad.BiliClient.util.CenterThreadPool;
-import com.RobinNotBad.BiliClient.util.GlideUtil;
-import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
-import com.RobinNotBad.BiliClient.util.TerminalContext;
+import com.RobinNotBad.BiliClient.util.*;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
@@ -239,6 +236,7 @@ public class PrivateMsgAdapter extends RecyclerView.Adapter list) {
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java
index 6ade2cf2..076f7228 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java
@@ -21,6 +21,7 @@ import com.RobinNotBad.BiliClient.model.PrivateMessage;
import com.RobinNotBad.BiliClient.model.PrivateMsgSession;
import com.RobinNotBad.BiliClient.model.UserInfo;
import com.RobinNotBad.BiliClient.util.GlideUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
@@ -114,6 +115,7 @@ public class PrivateMsgSessionsAdapter
} catch (JSONException err) {
Log.e("PrivateMsgUserAdapter", err.toString());
}
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java
index 5db191b4..3d8f9d60 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java
@@ -15,6 +15,7 @@ import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.activity.user.info.UserInfoActivity;
import com.RobinNotBad.BiliClient.model.ElectricUser;
import com.RobinNotBad.BiliClient.util.GlideUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
@@ -65,6 +66,7 @@ public class ElectricUserAdapter extends RecyclerView.Adapter {
intent.putExtra("name", series.title);
context.startActivity(intent);
});
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java
index 65a28d47..f55abf01 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java
@@ -16,6 +16,7 @@ import com.RobinNotBad.BiliClient.activity.video.series.UserSeriesActivity;
import com.RobinNotBad.BiliClient.adapter.dynamic.DynamicHolder;
import com.RobinNotBad.BiliClient.model.VideoCard;
import com.RobinNotBad.BiliClient.util.TerminalContext;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.List;
@@ -71,6 +72,7 @@ public class UserVideoAdapter extends RecyclerView.Adapter TerminalContext.getInstance().enterVideoDetailPage(context, videoCard.aid, videoCard.bvid));
}
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java
index f2fe15f7..568c7636 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java
@@ -53,8 +53,6 @@ public class VideoCardAdapter extends RecyclerView.Adapter {
holder.showVideoCard(videoCard, context);
- ThemeUtils.apply(holder.itemView);
-
holder.itemView.setOnClickListener(view -> {
switch (videoCard.type) {
case "video":
@@ -73,6 +71,7 @@ public class VideoCardAdapter extends RecyclerView.Adapter {
} else
return false;
});
+ ThemeUtils.apply(holder.itemView);
}
@Override
--
Gitee
From 7f05a8091554bd7506e67152f3acbbf88d56bc6c Mon Sep 17 00:00:00 2001
From: RJMultiDev <2815968613@qq.com>
Date: Sat, 10 Jan 2026 21:22:55 +0800
Subject: [PATCH 11/13] =?UTF-8?q?fix.=20=E9=83=A8=E5=88=86=E9=A1=B5?=
=?UTF-8?q?=E9=9D=A2=E6=9C=AA=E6=88=90=E5=8A=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../BiliClient/activity/base/BaseActivity.java | 1 +
.../BiliClient/activity/settings/login/LoginActivity.java | 2 ++
.../BiliClient/adapter/AnnouncementAdapter.java | 3 +++
.../BiliClient/adapter/dynamic/DynamicAdapter.java | 2 ++
.../BiliClient/adapter/dynamic/UserDynamicAdapter.java | 8 ++------
.../adapter/favorite/FavoriteFolderAdapter.java | 2 ++
.../BiliClient/adapter/favorite/FolderChooseAdapter.java | 6 ++----
.../adapter/message/MessageSettingsAdapter.java | 2 ++
.../BiliClient/adapter/message/NoticeAdapter.java | 2 ++
.../BiliClient/adapter/message/PrivateMsgAdapter.java | 6 ++----
.../adapter/message/PrivateMsgSessionsAdapter.java | 2 ++
.../BiliClient/adapter/user/ElectricUserAdapter.java | 2 ++
.../BiliClient/adapter/user/UserListAdapter.java | 2 ++
.../BiliClient/adapter/video/DownloadAdapter.java | 2 ++
.../BiliClient/adapter/video/LocalVideoAdapter.java | 2 ++
.../BiliClient/adapter/video/MediaEpisodeAdapter.java | 2 ++
.../BiliClient/adapter/video/PageChooseAdapter.java | 2 ++
.../BiliClient/adapter/video/SeriesCardAdapter.java | 2 ++
.../BiliClient/adapter/video/UserVideoAdapter.java | 2 ++
.../BiliClient/adapter/video/VideoCardAdapter.java | 3 +--
20 files changed, 39 insertions(+), 16 deletions(-)
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java b/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
index 6e64cdfe..4973f683 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/activity/base/BaseActivity.java
@@ -250,6 +250,7 @@ public class BaseActivity extends AppCompatActivity {
setRound();
callBack.finishInflate(view, layoutId);
+ ThemeUtils.apply(this);
});
}
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/login/LoginActivity.java b/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/login/LoginActivity.java
index 5c0627ea..497ff861 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/login/LoginActivity.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/activity/settings/login/LoginActivity.java
@@ -12,6 +12,7 @@ import com.RobinNotBad.BiliClient.activity.base.BaseActivity;
import com.RobinNotBad.BiliClient.adapter.viewpager.ViewPagerFragmentAdapter;
import com.RobinNotBad.BiliClient.util.MsgUtil;
import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.ArrayList;
import java.util.List;
@@ -49,6 +50,7 @@ public class LoginActivity extends BaseActivity {
MsgUtil.showMsgLong("提示:本页面可以左右滑动");
SharedPreferencesUtil.putBoolean("first_" + LoginActivity.class.getSimpleName(), false);
}
+ ThemeUtils.apply(this);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java
index 49e3e0ba..43abdaa3 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/AnnouncementAdapter.java
@@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.model.Announcement;
import com.RobinNotBad.BiliClient.util.MsgUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.google.android.material.card.MaterialCardView;
import java.util.ArrayList;
@@ -53,6 +54,8 @@ public class AnnouncementAdapter extends RecyclerView.Adapter MsgUtil.showText(announcement.title, announcement.content));
+
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java
index 405ab3d6..6be36b49 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/dynamic/DynamicAdapter.java
@@ -17,6 +17,7 @@ import com.RobinNotBad.BiliClient.activity.dynamic.DynamicActivity;
import com.RobinNotBad.BiliClient.activity.dynamic.send.SendDynamicActivity;
import com.RobinNotBad.BiliClient.activity.live.FollowLiveActivity;
import com.RobinNotBad.BiliClient.model.Dynamic;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.google.android.material.button.MaterialButton;
import java.util.ArrayList;
@@ -105,6 +106,7 @@ public class DynamicAdapter extends RecyclerView.Adapter {
if (message == null)
return;
holder.showMessage(message, context);
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java
index 89b5d828..f1cdbebb 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgAdapter.java
@@ -24,10 +24,7 @@ import com.RobinNotBad.BiliClient.activity.CopyTextActivity;
import com.RobinNotBad.BiliClient.activity.ImageViewerActivity;
import com.RobinNotBad.BiliClient.api.PrivateMsgApi;
import com.RobinNotBad.BiliClient.model.PrivateMessage;
-import com.RobinNotBad.BiliClient.util.CenterThreadPool;
-import com.RobinNotBad.BiliClient.util.GlideUtil;
-import com.RobinNotBad.BiliClient.util.SharedPreferencesUtil;
-import com.RobinNotBad.BiliClient.util.TerminalContext;
+import com.RobinNotBad.BiliClient.util.*;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DecodeFormat;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
@@ -239,6 +236,7 @@ public class PrivateMsgAdapter extends RecyclerView.Adapter list) {
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java
index 6ade2cf2..076f7228 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/message/PrivateMsgSessionsAdapter.java
@@ -21,6 +21,7 @@ import com.RobinNotBad.BiliClient.model.PrivateMessage;
import com.RobinNotBad.BiliClient.model.PrivateMsgSession;
import com.RobinNotBad.BiliClient.model.UserInfo;
import com.RobinNotBad.BiliClient.util.GlideUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
@@ -114,6 +115,7 @@ public class PrivateMsgSessionsAdapter
} catch (JSONException err) {
Log.e("PrivateMsgUserAdapter", err.toString());
}
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java
index 5db191b4..3d8f9d60 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/user/ElectricUserAdapter.java
@@ -15,6 +15,7 @@ import com.RobinNotBad.BiliClient.R;
import com.RobinNotBad.BiliClient.activity.user.info.UserInfoActivity;
import com.RobinNotBad.BiliClient.model.ElectricUser;
import com.RobinNotBad.BiliClient.util.GlideUtil;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
@@ -65,6 +66,7 @@ public class ElectricUserAdapter extends RecyclerView.Adapter {
intent.putExtra("name", series.title);
context.startActivity(intent);
});
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java
index 65a28d47..f55abf01 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/UserVideoAdapter.java
@@ -16,6 +16,7 @@ import com.RobinNotBad.BiliClient.activity.video.series.UserSeriesActivity;
import com.RobinNotBad.BiliClient.adapter.dynamic.DynamicHolder;
import com.RobinNotBad.BiliClient.model.VideoCard;
import com.RobinNotBad.BiliClient.util.TerminalContext;
+import com.RobinNotBad.BiliClient.util.ThemeUtils;
import java.util.List;
@@ -71,6 +72,7 @@ public class UserVideoAdapter extends RecyclerView.Adapter TerminalContext.getInstance().enterVideoDetailPage(context, videoCard.aid, videoCard.bvid));
}
+ ThemeUtils.apply(holder.itemView);
}
@Override
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java
index f2fe15f7..568c7636 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/adapter/video/VideoCardAdapter.java
@@ -53,8 +53,6 @@ public class VideoCardAdapter extends RecyclerView.Adapter {
holder.showVideoCard(videoCard, context);
- ThemeUtils.apply(holder.itemView);
-
holder.itemView.setOnClickListener(view -> {
switch (videoCard.type) {
case "video":
@@ -73,6 +71,7 @@ public class VideoCardAdapter extends RecyclerView.Adapter {
} else
return false;
});
+ ThemeUtils.apply(holder.itemView);
}
@Override
--
Gitee
From 26ac34d54de4bfc006246ece4b047c57272e281d Mon Sep 17 00:00:00 2001
From: RJMultiDev <2815968613@qq.com>
Date: Sat, 10 Jan 2026 22:03:34 +0800
Subject: [PATCH 12/13] =?UTF-8?q?chore.=20=E6=97=A0=E6=B3=95=E7=90=86?=
=?UTF-8?q?=E8=A7=A3=E4=B8=BA=E4=BB=80=E4=B9=88=E4=B8=8D=E5=88=A0=E8=BF=99?=
=?UTF-8?q?=E4=BF=A9test?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../brotlij/ExampleInstrumentedTest.java | 26 -------------------
.../wolfcstech/brotlij/ExampleUnitTest.java | 17 ------------
2 files changed, 43 deletions(-)
delete mode 100644 brotlij/src/androidTest/java/com/wolfcstech/brotlij/ExampleInstrumentedTest.java
delete mode 100644 brotlij/src/test/java/com/wolfcstech/brotlij/ExampleUnitTest.java
diff --git a/brotlij/src/androidTest/java/com/wolfcstech/brotlij/ExampleInstrumentedTest.java b/brotlij/src/androidTest/java/com/wolfcstech/brotlij/ExampleInstrumentedTest.java
deleted file mode 100644
index 7866f40c..00000000
--- a/brotlij/src/androidTest/java/com/wolfcstech/brotlij/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.wolfcstech.brotlij;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static org.junit.Assert.*;
-
-/**
- * Instrumentation test, which will execute on an Android device.
- *
- * @see Testing documentation
- */
-@RunWith(AndroidJUnit4.class)
-public class ExampleInstrumentedTest {
- @Test
- public void useAppContext() throws Exception {
- // Context of the app under test.
- Context appContext = InstrumentationRegistry.getTargetContext();
-
- assertEquals("com.wolfcstech.brotlij.test", appContext.getPackageName());
- }
-}
diff --git a/brotlij/src/test/java/com/wolfcstech/brotlij/ExampleUnitTest.java b/brotlij/src/test/java/com/wolfcstech/brotlij/ExampleUnitTest.java
deleted file mode 100644
index 64cefcbc..00000000
--- a/brotlij/src/test/java/com/wolfcstech/brotlij/ExampleUnitTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.wolfcstech.brotlij;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see Testing documentation
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
-}
\ No newline at end of file
--
Gitee
From ed8f5477ed4a9c4927ec0c87f78b7b87ca1b0695 Mon Sep 17 00:00:00 2001
From: RJMultiDev <2815968613@qq.com>
Date: Sat, 10 Jan 2026 23:13:44 +0800
Subject: [PATCH 13/13] feat. blur
---
app/build.gradle | 2 +-
.../RobinNotBad/BiliClient/BiliTerminal.java | 2 +-
.../RobinNotBad/BiliClient/util/Theme.java | 29 +++++++++++++++----
.../BiliClient/util/ThemeUtils.java | 9 +++---
4 files changed, 30 insertions(+), 12 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index 774c82f9..c7cd197b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,7 +2,7 @@ plugins {
id 'com.android.application'
}
-int betaVer = 1 //如果为0则是正式版
+int betaVer = 2 //如果为0则是正式版
android {
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java b/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
index e5e3a696..385a7613 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/BiliTerminal.java
@@ -49,7 +49,7 @@ public class BiliTerminal extends Application {
Logu.LOGV_ENABLED = SharedPreferencesUtil.getBoolean("dev_logv", debugBuild);
Logu.LOGD_ENABLED = SharedPreferencesUtil.getBoolean("dev_logd", debugBuild);
Logu.LOGI_ENABLED = SharedPreferencesUtil.getBoolean("dev_logi", debugBuild);
- ThemeUtils.loadThemeData();
+ ThemeUtils.loadThemeData(this);
}
}
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java
index 919c2557..4617416b 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/Theme.java
@@ -1,8 +1,7 @@
package com.RobinNotBad.BiliClient.util;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Color;
+import android.content.Context;
+import android.graphics.*;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
@@ -13,15 +12,21 @@ import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
+/**
+ * 主题描述类!
+ * @author MultiDev
+ */
+@SuppressWarnings("unused")
public class Theme {
private final String name;
private final String publisher;
private final String version;
private final int baseThemeColor;
private final boolean useBackgroundImage;
+ private final boolean isBlur;
private Drawable backgroundDrawable;
- public Theme(String themePath) throws IOException, JSONException {
+ public Theme(Context ctx, String themePath) throws IOException, JSONException {
File themeFile = new File(themePath);
try (ZipFile zip = new ZipFile(themeFile)) {
@@ -45,7 +50,7 @@ public class Theme {
publisher = json.optString("publisher", "未知");
version = json.optString("version", "0");
useBackgroundImage = json.optBoolean("bg", false);
-
+ isBlur = json.optBoolean("blur", false);
String colorHex = json.optString("themeColor", "#000000");
int parsedColor;
try {
@@ -69,7 +74,18 @@ public class Theme {
if (bgEntry != null) {
try (InputStream is = zip.getInputStream(bgEntry)) {
Bitmap backgroundBitmap = BitmapFactory.decodeStream(is);
- backgroundDrawable = new BitmapDrawable(backgroundBitmap);
+ if (isBlur) {
+ Bitmap resisedBitmap = Bitmap.createBitmap((int) (backgroundBitmap.getWidth() / 32f),
+ (int) (backgroundBitmap.getHeight() / 32f),
+ Bitmap.Config.ARGB_8888);
+ Matrix matrix = new Matrix();
+ matrix.setScale(1 / 32f, 1 / 32f);
+ new Canvas(resisedBitmap).drawBitmap(backgroundBitmap,
+ matrix,
+ null);
+ backgroundBitmap = Bitmap.createScaledBitmap(resisedBitmap,backgroundBitmap.getWidth(), backgroundBitmap.getHeight(),true);
+ }
+ backgroundDrawable = new BitmapDrawable(ctx.getResources(), backgroundBitmap);
} catch (Exception e) {
Logu.w("failed to decode background image: " + e.getMessage());
}
@@ -83,5 +99,6 @@ public class Theme {
public String getVersion() { return version; }
public int getBaseThemeColor() { return baseThemeColor; }
public boolean isUseBackgroundImage() { return useBackgroundImage; }
+ public boolean isBlur() { return isBlur; }
public Drawable getBackground() { return backgroundDrawable; }
}
diff --git a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
index baf25dbc..14aff7d5 100644
--- a/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
+++ b/app/src/main/java/com/RobinNotBad/BiliClient/util/ThemeUtils.java
@@ -1,6 +1,7 @@
package com.RobinNotBad.BiliClient.util;
import android.app.Activity;
+import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.View;
@@ -20,7 +21,7 @@ import java.util.Deque;
public class ThemeUtils {
private static Theme sCurrentTheme;
- public static void loadThemeData() {
+ public static void loadThemeData(Context ctx) {
String path = SharedPreferencesUtil.getString("theme_path", "");
if (path.isEmpty()) {
Logu.d("no theme path saved");
@@ -28,7 +29,7 @@ public class ThemeUtils {
return;
}
try {
- sCurrentTheme = new Theme(path);
+ sCurrentTheme = new Theme(ctx, path);
} catch (Exception e) {
Logu.e("theme load failed: " + e.getMessage());
MsgUtil.err("unable to load theme", e);
@@ -84,7 +85,7 @@ public class ThemeUtils {
((MaterialCardView) view).setCardBackgroundColor(highlightColor);
}
if (view instanceof MaterialButton) {
- ((MaterialButton) view).setBackgroundColor(highlightColor);
+ view.setBackgroundColor(highlightColor);
}
if (isTooLight && view instanceof TextView) {
((TextView) view).setTextColor(Color.BLACK);
@@ -106,6 +107,6 @@ public class ThemeUtils {
9999);
}
if (SharedPreferencesUtil.getString("theme_path", "").isEmpty()) return;
- loadThemeData();
+ if (sCurrentTheme != null)loadThemeData(a);
}
}
--
Gitee