Home | History | Annotate | Download | only in res
      1 package org.robolectric.res;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 /**
      7  * Represents the list of styles applied to a Theme.
      8  */
      9 public class ThemeStyleSet implements Style {
     10 
     11   private List<OverlayedStyle> styles = new ArrayList<>();
     12 
     13   @Override public AttributeResource getAttrValue(ResName attrName) {
     14     AttributeResource attribute = null;
     15 
     16     for (OverlayedStyle overlayedStyle : styles) {
     17       AttributeResource overlayedAttribute = overlayedStyle.style.getAttrValue(attrName);
     18       if (overlayedAttribute != null && (attribute == null || overlayedStyle.force)) {
     19         attribute = overlayedAttribute;
     20       }
     21     }
     22 
     23     return attribute;
     24   }
     25 
     26   public void apply(Style style, boolean force) {
     27     OverlayedStyle styleToAdd = new OverlayedStyle(style, force);
     28     for (int i = 0; i < styles.size(); ++i) {
     29       if (styleToAdd.equals(styles.get(i))) {
     30         styles.remove(i);
     31         break;
     32       }
     33     }
     34     styles.add(styleToAdd);
     35   }
     36 
     37   public ThemeStyleSet copy() {
     38     ThemeStyleSet themeStyleSet = new ThemeStyleSet();
     39     themeStyleSet.styles.addAll(this.styles);
     40     return themeStyleSet;
     41   }
     42 
     43   @Override
     44   public String toString() {
     45     if (styles.isEmpty()) {
     46       return "theme with no applied styles";
     47     } else {
     48       return "theme with applied styles: " + styles + "";
     49     }
     50   }
     51 
     52   private static class OverlayedStyle {
     53     Style style;
     54     boolean force;
     55 
     56     OverlayedStyle(Style style, boolean force) {
     57       this.style = style;
     58       this.force = force;
     59     }
     60 
     61     @Override
     62     public boolean equals(Object obj) {
     63       if (!(obj instanceof OverlayedStyle)) {
     64         return false;
     65       }
     66       OverlayedStyle overlayedStyle = (OverlayedStyle) obj;
     67       return style.equals(overlayedStyle.style);
     68     }
     69 
     70     @Override
     71     public int hashCode() {
     72       return style.hashCode();
     73     }
     74 
     75     @Override
     76     public String toString() {
     77       return style.toString() + (force ? " (forced)" : "");
     78     }
     79   }
     80 
     81 }
     82