/* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.micode.notes.tool; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; import android.preference.PreferenceManager; import net.micode.notes.R; /** * 主题管理器 * 负责应用主题的切换、管理和应用,支持浅色、深色和跟随系统主题 */ public class ThemeManager { // 主题模式偏好设置键 private static final String PREF_THEME_MODE = "theme_mode"; // 跟随系统主题偏好设置键 private static final String PREF_FOLLOW_SYSTEM = "follow_system_theme"; // 主题模式常量 public static final int THEME_LIGHT = 0; // 浅色主题 public static final int THEME_DARK = 1; // 深色主题 public static final int THEME_SYSTEM = 2; // 跟随系统主题 /** * 为Activity应用主题 * 根据当前主题设置应用相应的主题样式 * @param activity 要应用主题的Activity */ public static void applyTheme(Activity activity) { int themeMode = getThemeMode(activity); switch (themeMode) { case THEME_LIGHT: // 应用浅色主题 activity.setTheme(R.style.AppTheme); break; case THEME_DARK: // 应用深色主题 activity.setTheme(R.style.AppTheme_Dark); break; case THEME_SYSTEM: // 跟随系统主题 if (isSystemDarkMode(activity)) { activity.setTheme(R.style.AppTheme_Dark); } else { activity.setTheme(R.style.AppTheme); } break; } } /** * 为Activity应用笔记主题 * 专门用于笔记编辑界面的主题设置 * @param activity 要应用主题的Activity */ public static void applyNoteTheme(Activity activity) { int themeMode = getThemeMode(activity); switch (themeMode) { case THEME_LIGHT: // 应用浅色笔记主题 activity.setTheme(R.style.NoteTheme); break; case THEME_DARK: // 应用深色笔记主题 activity.setTheme(R.style.NoteTheme_Dark); break; case THEME_SYSTEM: // 跟随系统主题 if (isSystemDarkMode(activity)) { activity.setTheme(R.style.NoteTheme_Dark); } else { activity.setTheme(R.style.NoteTheme); } break; } } /** * 获取当前主题模式 * @param context 上下文对象 * @return 主题模式常量 */ public static int getThemeMode(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); return prefs.getInt(PREF_THEME_MODE, THEME_SYSTEM); } /** * 设置主题模式 * @param context 上下文对象 * @param themeMode 要设置的主题模式 */ public static void setThemeMode(Context context, int themeMode) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs.edit().putInt(PREF_THEME_MODE, themeMode).apply(); } /** * 检查系统是否处于深色模式 * @param context 上下文对象 * @return true表示系统处于深色模式,false表示浅色模式 */ public static boolean isSystemDarkMode(Context context) { int nightModeFlags = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; return nightModeFlags == Configuration.UI_MODE_NIGHT_YES; } /** * 检查当前主题是否为深色模式 * @param context 上下文对象 * @return true表示当前为深色主题,false表示浅色主题 */ public static boolean isDarkMode(Context context) { int themeMode = getThemeMode(context); switch (themeMode) { case THEME_DARK: return true; case THEME_LIGHT: return false; case THEME_SYSTEM: return isSystemDarkMode(context); default: return false; } } /** * 获取主题名称用于显示 * @param context 上下文对象 * @param themeMode 主题模式 * @return 主题名称字符串 */ public static String getThemeName(Context context, int themeMode) { switch (themeMode) { case THEME_LIGHT: return context.getString(R.string.theme_light); case THEME_DARK: return context.getString(R.string.theme_dark); case THEME_SYSTEM: return context.getString(R.string.theme_system); default: return context.getString(R.string.theme_system); } } /** * Get background color for current theme */ public static int getBackgroundColor(Context context) { if (isDarkMode(context)) { return context.getResources().getColor(R.color.backgroundDark); } else { return context.getResources().getColor(android.R.color.white); } } /** * Get text color for current theme */ public static int getTextColor(Context context) { if (isDarkMode(context)) { return context.getResources().getColor(R.color.textPrimaryDark); } else { return context.getResources().getColor(android.R.color.black); } } /** * Get secondary text color for current theme */ public static int getSecondaryTextColor(Context context) { if (isDarkMode(context)) { return context.getResources().getColor(R.color.textSecondaryDark); } else { return context.getResources().getColor(android.R.color.darker_gray); } } /** * Get note background resource based on color ID and theme * 修改为使用动态着色,统一使用蓝色背景 */ public static int getNoteBackgroundResource(Context context, int colorId) { boolean isDark = isDarkMode(context); // 深色模式使用深色背景 if (isDark) { return R.drawable.edit_dark; } else { // 浅色模式统一使用蓝色背景,通过动态着色实现其他颜色 return ResourceParser.NoteBgResources.getNoteBgResource(colorId); } } /** * Get tag color for theme */ public static int getTagColor(Context context, int tagColorId) { boolean isDark = isDarkMode(context); if (isDark) { switch (tagColorId) { case 0: return context.getResources().getColor(R.color.tagBlueDark); case 1: return context.getResources().getColor(R.color.tagGreenDark); case 2: return context.getResources().getColor(R.color.tagOrangeDark); case 3: return context.getResources().getColor(R.color.tagRedDark); case 4: return context.getResources().getColor(R.color.tagPurpleDark); case 5: return context.getResources().getColor(R.color.tagGrayDark); default: return context.getResources().getColor(R.color.tagBlueDark); } } else { switch (tagColorId) { case 0: return context.getResources().getColor(android.R.color.holo_blue_bright); case 1: return context.getResources().getColor(android.R.color.holo_green_light); case 2: return context.getResources().getColor(android.R.color.holo_orange_light); case 3: return context.getResources().getColor(android.R.color.holo_red_light); case 4: return context.getResources().getColor(android.R.color.holo_purple); case 5: return context.getResources().getColor(android.R.color.darker_gray); default: return context.getResources().getColor(android.R.color.holo_blue_bright); } } } }