package org.holoeverywhere.addon; import java.util.Map; import java.util.WeakHashMap; import org.holoeverywhere.ThemeManager; import org.holoeverywhere.ThemeManager.ThemeSetter; import org.holoeverywhere.app.ContextThemeWrapperPlus; import android.content.Context; public class IAddonThemes implements ThemeSetter { private static final class AddonThemeWrapper extends ContextThemeWrapperPlus { public AddonThemeWrapper(Context base, int themeres) { super(base, themeres); } } public interface ThemeResolver { public int resolveThemeForContext(Context context, int invalidTheme); } private Map<Context, AddonThemeWrapper> mContexts; private int mDarkTheme = -1; private final ThemeResolver mDefaultThemeResolver = new ThemeResolver() { @Override public int resolveThemeForContext(Context context, int invalidTheme) { int theme = ThemeManager.getThemeType(context); if (theme == ThemeManager.INVALID) { theme = invalidTheme & ThemeManager.getThemeMask(); if (theme == 0) { theme = ThemeManager.DARK; } } theme |= mThemeFlag; return ThemeManager.getThemeResource(theme, false); } }; private int mLightTheme = -1; private int mMixedTheme = -1; private final int mThemeFlag; public IAddonThemes() { mThemeFlag = ThemeManager.makeNewFlag(); ThemeManager.registerThemeSetter(this); } public Context context(Context context) { return context(context, ThemeManager.DARK); } public Context context(Context context, int invalidTheme) { return context(context, invalidTheme, mDefaultThemeResolver); } public Context context(Context context, int invalidTheme, ThemeResolver themeResolver) { if (context instanceof AddonThemeWrapper) { return context; } AddonThemeWrapper wrapper = null; if (mContexts != null) { mContexts.get(context); } if (wrapper == null) { final int theme = themeResolver.resolveThemeForContext(context, invalidTheme); if (theme <= 0) { return null; } wrapper = new AddonThemeWrapper(context, theme); if (mContexts == null) { mContexts = new WeakHashMap<Context, AddonThemeWrapper>(); } mContexts.put(context, wrapper); } return wrapper; } public int getDarkTheme() { return mDarkTheme; } public int getLightTheme() { return mLightTheme; } public int getMixedTheme() { return mMixedTheme; } public int getThemeFlag() { return mThemeFlag; } public void map(int darkTheme, int lightTheme, int mixedTheme) { mDarkTheme = darkTheme; mLightTheme = lightTheme; mMixedTheme = mixedTheme; setupThemes(); } public void setDarkTheme(int darkTheme) { mDarkTheme = darkTheme; setupThemes(); } public void setLightTheme(int lightTheme) { mLightTheme = lightTheme; setupThemes(); } public void setMixedTheme(int mixedTheme) { mMixedTheme = mixedTheme; setupThemes(); } @Override public void setupThemes() { ThemeManager.map(mThemeFlag | ThemeManager.DARK, mDarkTheme); ThemeManager.map(mThemeFlag | ThemeManager.LIGHT, mLightTheme); ThemeManager.map(mThemeFlag | ThemeManager.MIXED, mMixedTheme); } public Context unwrap(Context context) { if (context == null) { return null; } while (context instanceof AddonThemeWrapper) { context = ((AddonThemeWrapper) context).getBaseContext(); } return context; } }