| 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)" : ""); |
| } |
| } |
| |
| } |