blob: 2c35bcf306b56f50741e65e9cb8a1bccc141a748 [file] [log] [blame]
package org.robolectric.res;
import java.util.ArrayList;
import java.util.List;
/**
* Represents the list of styles applied to a Theme.
*/
public class ThemeStyleSet implements Style {
private List<OverlayedStyle> styles = new ArrayList<>();
public AttributeResource getAttrValue(ResName attrName) {
AttributeResource attribute = null;
for (OverlayedStyle overlayedStyle : styles) {
AttributeResource overlayedAttribute = overlayedStyle.style.getAttrValue(attrName);
if (overlayedAttribute != null && (attribute == null || overlayedStyle.force)) {
attribute = overlayedAttribute;
}
}
return attribute;
}
public void apply(Style style, boolean force) {
OverlayedStyle styleToAdd = new OverlayedStyle(style, force);
for (int i = 0; i < styles.size(); ++i) {
if (styleToAdd.equals(styles.get(i))) {
styles.remove(i);
break;
}
}
styles.add(styleToAdd);
}
public ThemeStyleSet copy() {
ThemeStyleSet themeStyleSet = new ThemeStyleSet();
themeStyleSet.styles.addAll(this.styles);
return themeStyleSet;
}
@Override
public String toString() {
if (styles.isEmpty()) {
return "theme with no applied styles";
} else {
return "theme with applied styles: " + styles + "";
}
}
private static class OverlayedStyle {
Style style;
boolean force;
OverlayedStyle(Style style, boolean force) {
this.style = style;
this.force = force;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof OverlayedStyle)) {
return false;
}
OverlayedStyle overlayedStyle = (OverlayedStyle) obj;
return style.equals(overlayedStyle.style);
}
@Override
public int hashCode() {
return style.hashCode();
}
@Override
public String toString() {
return style.toString() + (force ? " (forced)" : "");
}
}
}