package org.holoeverywhere.preference; import org.holoeverywhere.LayoutInflater; import org.holoeverywhere.ThemeManager; import org.holoeverywhere.addon.IAddonThemes; import org.holoeverywhere.addon.IAddonThemes.ThemeResolver; import org.holoeverywhere.app.Activity; import com.actionbarsherlock.R; import android.annotation.SuppressLint; import android.content.Context; import android.util.TypedValue; import android.view.ContextThemeWrapper; @SuppressLint("Recycle") public class PreferenceInit { public static final String PACKAGE; public static final int THEME_FLAG; private static final IAddonThemes sThemes; static { PACKAGE = PreferenceInit.class.getPackage().getName(); sThemes = new IAddonThemes(); THEME_FLAG = sThemes.getThemeFlag(); LayoutInflater.register(PreferenceFrameLayout.class); LayoutInflater.register(FragmentBreadCrumbs.class); map(R.style.Holo_Internal_Preference, R.style.Holo_Internal_Preference_Light); } /** * Nop method for execute static code block */ public static void init() { } /** * Remap all Preference themes */ public static void map(int theme) { map(theme, theme, theme); } /** * Remap PreferenceThemes, splited by dark and light color scheme. For mixed * color scheme will be using light theme */ public static void map(int darkTheme, int lightTheme) { map(darkTheme, lightTheme, lightTheme); } /** * Remap PreferenceThemes, splited by color scheme */ public static void map(int darkTheme, int lightTheme, int mixedTheme) { sThemes.map(darkTheme, lightTheme, mixedTheme); } private static final ThemeResolver sThemeResolver = new ThemeResolver() { @Override public int resolveThemeForContext(Context context, int invalidTheme) { int theme, mod = 0; TypedValue outValue = new TypedValue(); context.obtainStyledAttributes(new int[] { R.attr.preferenceTheme }).getValue(0, outValue); switch (outValue.type) { case TypedValue.TYPE_REFERENCE: if (new ContextThemeWrapper(context, theme = outValue.resourceId) .obtainStyledAttributes(new int[] { R.attr.holoTheme }).getInt(0, 0) == 4) { return theme; } break; case TypedValue.TYPE_INT_DEC: case TypedValue.TYPE_INT_HEX: mod = outValue.resourceId; break; } theme = THEME_FLAG; if (context instanceof Activity) { if (mod == 0 || mod == ThemeManager.getDefaultTheme()) { mod = ThemeManager.getThemeType(context); if (mod == PreferenceInit.THEME_FLAG) { theme = mod; mod = 0; } else if (mod == ThemeManager.INVALID) { mod = ThemeManager.getDefaultTheme() & ThemeManager.COLOR_SCHEME_MASK; if (mod == 0) { mod = ThemeManager.DARK; } } } if (mod > 0) { theme |= mod & ThemeManager.COLOR_SCHEME_MASK; } } else { theme |= ThemeManager.getDefaultTheme() & ThemeManager.COLOR_SCHEME_MASK; } theme = ThemeManager.getThemeResource(theme, false); if (theme == ThemeManager.getDefaultTheme() || theme == 0) { theme = sThemes.getDarkTheme(); } return theme; } }; public static Context context(Context context) { return sThemes.context(context, ThemeManager.DARK, sThemeResolver); } public static Context unwrap(Context context) { return sThemes.unwrap(context); } private PreferenceInit() { } }