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

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

package org.robolectric.res;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;

import java.util.logging.Logger;

public class ResourceIndex {
  private static final Logger LOGGER = Logger.getLogger(ResourceTableFactory.class.getName());

  private final BiMap resourceTable = HashBiMap.create();

  private final ResourceIdGenerator androidResourceIdGenerator = new ResourceIdGenerator(0x01);
  private final String packageName;
  private int packageIdentifier;

  public ResourceIndex(String packageName) {
    this.packageName = packageName;
  }

  public synchronized Integer getResourceId(ResName resName) {
    if (resName == null) {
      return null;
    }
    Integer id = resourceTable.inverse().get(resName);
    if (id == null && isAndroidPackage(resName)) {
      id = androidResourceIdGenerator.generate(resName.type, resName.name);
      resourceTable.put(id, resName);
      LOGGER.fine("no id mapping found for " + resName.getFullyQualifiedName() + "; assigning ID #0x" + Integer.toHexString(id));
    }
    if (id == null) return 0;

    return id;
  }

  private boolean isAndroidPackage(ResName resName) {
    return "android".equals(resName.packageName) || "".equals(resName.packageName);
  }

  public synchronized ResName getResName(int resourceId) {
    return resourceTable.get(resourceId);
  }

  public synchronized void dump() {
    System.out.println(resourceTable);
  }

  public String getPackageName() {
    return packageName;
  }

  int getPackageIdentifier() {
    return packageIdentifier;
  }

  synchronized void addResource(int id, String type, String name) {
    if (ResourceIds.isFrameworkResource(id)) {
      androidResourceIdGenerator.record(id, type, name);
    }
    ResName resName = new ResName(packageName, type, name);
    int resIdPackageIdentifier = ResourceIds.getPackageIdentifier(id);
    if (getPackageIdentifier() == 0) {
      this.packageIdentifier = resIdPackageIdentifier;
    } else if (getPackageIdentifier() != resIdPackageIdentifier) {
      throw new IllegalArgumentException("Attempted to add resId " + resIdPackageIdentifier + " to ResourceIndex with packageIdentifier " + getPackageIdentifier());
    }

    ResName existingEntry = resourceTable.put(id, resName);
    if (existingEntry != null && !existingEntry.equals(resName)) {
      throw new IllegalArgumentException("ResId " + Integer.toHexString(id) + " mapped to both " + resName + " and " + existingEntry);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy