package org.holoeverywhere.addon;
import android.content.Context;
import org.holoeverywhere.ThemeManager;
import org.holoeverywhere.ThemeManager.ThemeSetter;
import org.holoeverywhere.app.ContextThemeWrapperPlus;
import org.holoeverywhere.util.WeaklyMap;
import java.util.Map;
/**
* Helper for handling custom themes for required parts of library, like view themes in preferences addon
*/
public class IAddonThemes implements ThemeSetter {
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 final int mThemeFlag;
private final boolean mFlagOwner;
private Map<Context, AddonThemeWrapper> mContexts;
private int mDarkTheme = -1;
private int mLightTheme = -1;
private int mMixedTheme = -1;
public IAddonThemes() {
this(true);
}
public IAddonThemes(final boolean createFlag) {
this(createFlag ? ThemeManager.makeNewFlag() : -1, createFlag);
if (createFlag) {
ThemeManager.registerThemeSetter(this);
}
}
public IAddonThemes(final int themeFlag) {
this(themeFlag, false);
}
public IAddonThemes(final int themeFlag, final boolean flagOwner) {
mThemeFlag = themeFlag;
mFlagOwner = flagOwner;
}
public IAddonThemes(final IAddonThemes addonThemes) {
this(addonThemes.getThemeFlag(), false);
map(addonThemes.getDarkTheme(), addonThemes.getLightTheme(), addonThemes.getMixedTheme());
}
public int getTheme(int themeType) {
if (themeType == ThemeManager.DARK) {
return mDarkTheme;
} else if (themeType == ThemeManager.LIGHT) {
return mLightTheme;
} else if (themeType == ThemeManager.MIXED) {
return mMixedTheme;
} else {
return 0;
}
}
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) {
wrapper = 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 WeaklyMap<Context, AddonThemeWrapper>();
}
mContexts.put(context, wrapper);
}
return wrapper;
}
public int getDarkTheme() {
return mDarkTheme;
}
public void setDarkTheme(int darkTheme) {
mDarkTheme = darkTheme;
setupThemes();
}
public int getLightTheme() {
return mLightTheme;
}
public void setLightTheme(int lightTheme) {
mLightTheme = lightTheme;
setupThemes();
}
public int getMixedTheme() {
return mMixedTheme;
}
public void setMixedTheme(int mixedTheme) {
mMixedTheme = mixedTheme;
setupThemes();
}
public int getThemeFlag() {
return mThemeFlag;
}
public void map(int darkTheme, int lightTheme, int mixedTheme) {
mDarkTheme = darkTheme;
mLightTheme = lightTheme;
mMixedTheme = mixedTheme;
setupThemes();
}
@Override
public void setupThemes() {
if (mFlagOwner) {
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;
}
public interface ThemeResolver {
public int resolveThemeForContext(Context context, int invalidTheme);
}
private static final class AddonThemeWrapper extends ContextThemeWrapperPlus {
public AddonThemeWrapper(Context base, int themeres) {
super(base, themeres);
}
}
}