All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.robolectric.res.OverlayResourceIndex Maven / Gradle / Ivy

package org.robolectric.res;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

class OverlayResourceIndex extends ResourceIndex {
  private final String packageName;
  private final Set actualPackageNames = new HashSet();

  public OverlayResourceIndex(String packageName, List subResourceLoaders) {
    this(packageName, map(subResourceLoaders));
  }

  private static ResourceIndex[] map(List subResourceLoaders) {
    ResourceIndex[] resourceIndexes = new ResourceIndex[subResourceLoaders.size()];
    for (int i = 0; i < subResourceLoaders.size(); i++) {
      resourceIndexes[i] = subResourceLoaders.get(i).getResourceIndex();
    }
    return resourceIndexes;
  }

  public OverlayResourceIndex(String packageName, ResourceIndex... subResourceIndexes) {
    this.packageName = packageName;
    actualPackageNames.add(packageName);

    for (ResourceIndex subResourceIndex : subResourceIndexes) {
      actualPackageNames.addAll(subResourceIndex.getPackages());

      for (Map.Entry entry : subResourceIndex.resourceNameToId.entrySet()) {
        ResName resName = entry.getKey();
        int value = entry.getValue();
        ResName localResName = resName.withPackageName(packageName);
        if (!resourceNameToId.containsKey(localResName)) {
          resourceNameToId.put(localResName, value);
          resourceIdToResName.put(value, localResName);
        }
      }
    }

//        if (OverlayResourceLoader.DEBUG) resEntries.check(subResourceIndexes);
  }

  @Override
  public Integer getResourceId(ResName resName) {
    if (!actualPackageNames.contains(resName.packageName)) {
      return null;
    }
    return resourceNameToId.get(resName.withPackageName(packageName));
  }

  @Override
  public ResName getResName(int resourceId) {
    ResName resName = resourceIdToResName.get(resourceId);
    return resName == null ? null : resName.withPackageName(packageName);
  }

  @Override public Collection getPackages() {
    return actualPackageNames;
  }

  class ResEntries {
    private final Map> resEntries = new HashMap>();

    public void add(ResName localResName, ResName resName, int value) {
      List resEntryList = resEntries.get(localResName);
      if (resEntryList == null) {
        resEntryList = new ArrayList();
        resEntries.put(localResName, resEntryList);
      }
      resEntryList.add(new ResEntry(resName, value));
    }

//    public void check(ResourceIndex... subResourceIndex) {
//      for (Map.Entry> entries : resEntries.entrySet()) {
//        List value = entries.getValue();
//        int first = value.get(0).value;
//        for (int i = 1, valueSize = value.size(); i < valueSize; i++) {
//          ResEntry resEntry = value.get(i);
//          if (resEntry.value != first) {
//            Class rClass = subResourceIndex[i].resourcePath.rClass;
//            setField(rClass, resEntry.resName, first);
//
//            System.err.println("*** WARNING!!! resource mismatch!");
//            for (ResEntry entry : value) {
//              System.err.println("* " + entry.resName + " -> 0x" + Integer.toHexString(entry.value));
//            }
//            break;
//          }
//        }
//      }
//    }
//
//    private void setField(Class rClass, ResName resName, int value) {
//      Class innerClass = getInnerClass(rClass, resName.type);
//      try {
//        Field field = innerClass.getDeclaredField(resName.name);
//        if (Modifier.isFinal(field.getModifiers())) {
//          System.err.println("*** WARNING!!! " + field + " is final!");
//          Robolectric.Reflection.setFinalStaticField(innerClass, resName.name, value);
//        } else {
//          field.set(null, value);
//        }
//      } catch (NoSuchFieldException e) {
//        throw new RuntimeException(e);
//      } catch (IllegalAccessException e) {
//        throw new RuntimeException(e);
//      }
//
//    }
//
//    private Class getInnerClass(Class rClass, String name) {
//      for (Class aClass : rClass.getClasses()) {
//        if (aClass.getSimpleName().equals(name)) {
//          return aClass;
//        }
//      }
//      throw new RuntimeException("couldn't find " + rClass.getName() + "." + name);
//    }
  }

  class ResEntry {
    private final ResName resName;
    private final int value;

    public ResEntry(ResName resName, int value) {
      this.resName = resName;
      this.value = value;
    }
  }

  @Override public String toString() {
    return "OverlayResourceIndex{" +
        "package='" + packageName + '\'' +
        '}';
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy