Home | History | Annotate | Download | only in res
      1 package org.robolectric.res;
      2 
      3 import java.util.HashMap;
      4 import java.util.Map;
      5 
      6 /**
      7  * Tracks resource ids and generates new unique values.
      8  */
      9 public class ResourceIdGenerator {
     10 
     11   private final Map<String, TypeTracker> typeInfo = new HashMap<>();
     12   private int packageIdentifier;
     13 
     14   private static class TypeTracker {
     15     private int typeIdentifier;
     16     private int currentMaxEntry;
     17 
     18     TypeTracker(int typeIdentifier) {
     19       this.typeIdentifier = typeIdentifier;
     20     }
     21 
     22     void record(int entryIdentifier) {
     23       currentMaxEntry = Math.max(currentMaxEntry, entryIdentifier);
     24     }
     25 
     26     public int getFreeIdentifier() {
     27       return ++currentMaxEntry;
     28     }
     29 
     30     public int getTypeIdentifier() {
     31       return typeIdentifier;
     32     }
     33   }
     34 
     35   ResourceIdGenerator(int packageIdentifier) {
     36     this.packageIdentifier = packageIdentifier;
     37   }
     38 
     39   public void record(int resId, String type, String name) {
     40     TypeTracker typeTracker = typeInfo.get(type);
     41     if (typeTracker == null) {
     42       typeTracker = new TypeTracker(ResourceIds.getTypeIdentifier(resId));
     43       typeInfo.put(type, typeTracker);
     44     }
     45     typeTracker.record(ResourceIds.getEntryIdentifier(resId));
     46   }
     47 
     48   public int generate(String type, String name) {
     49     TypeTracker typeTracker = typeInfo.get(type);
     50     if (typeTracker == null) {
     51       typeTracker = new TypeTracker(getNextFreeTypeIdentifier());
     52       typeInfo.put(type, typeTracker);
     53     }
     54     return ResourceIds.makeIdentifer(packageIdentifier, typeTracker.getTypeIdentifier(), typeTracker.getFreeIdentifier());
     55   }
     56 
     57   private int getNextFreeTypeIdentifier() {
     58     int result = 0;
     59     for (TypeTracker typeTracker : typeInfo.values()) {
     60       result = Math.max(result, typeTracker.getTypeIdentifier());
     61     }
     62     return ++result;
     63   }
     64 }
     65