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