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