Search in sources :

Example 1 with DynamicPackageEntry

use of org.robolectric.res.android.LoadedArsc.DynamicPackageEntry in project robolectric by robolectric.

the class CppAssetManager2 method BuildDynamicRefTable.

// Assigns package IDs to all shared library ApkAssets.
// Should be called whenever the ApkAssets are changed.
// void BuildDynamicRefTable();
void BuildDynamicRefTable() {
    package_groups_.clear();
    // package_ids_.fill(0xff);
    for (int i = 0; i < package_ids_.length; i++) {
        package_ids_[i] = (byte) 0xff;
    }
    // 0x01 is reserved for the android package.
    int next_package_id = 0x02;
    final int apk_assets_count = apk_assets_.size();
    for (int i = 0; i < apk_assets_count; i++) {
        final LoadedArsc loaded_arsc = apk_assets_.get(i).GetLoadedArsc();
        // for (final std.unique_ptr<final LoadedPackage>& package_ :
        for (final LoadedPackage package_ : loaded_arsc.GetPackages()) {
            // Get the package ID or assign one if a shared library.
            int package_id;
            if (package_.IsDynamic()) {
                package_id = next_package_id++;
            } else {
                package_id = package_.GetPackageId();
            }
            // Add the mapping for package ID to index if not present.
            byte idx = package_ids_[package_id];
            if (idx == (byte) 0xff) {
                // package_ids_[package_id] = idx = static_cast<byte>(package_groups_.size());
                package_ids_[package_id] = idx = (byte) package_groups_.size();
                // DynamicRefTable& ref_table = package_groups_.back().dynamic_ref_table;
                // ref_table.mAssignedPackageId = package_id;
                // ref_table.mAppAsLib = package->IsDynamic() && package->GetPackageId() == 0x7f;
                DynamicRefTable ref_table = new DynamicRefTable((byte) package_id, package_.IsDynamic() && package_.GetPackageId() == 0x7f);
                PackageGroup newPackageGroup = new PackageGroup();
                newPackageGroup.dynamic_ref_table = ref_table;
                package_groups_.add(newPackageGroup);
            }
            PackageGroup package_group = package_groups_.get(idx);
            // Add the package and to the set of packages with the same ID.
            // package_group->packages_.push_back(ConfiguredPackage{package.get(), {}});
            // package_group.cookies_.push_back(static_cast<ApkAssetsCookie>(i));
            package_group.packages_.add(new ConfiguredPackage(package_));
            package_group.cookies_.add(ApkAssetsCookie.forInt(i));
            // Add the package name . build time ID mappings.
            for (final DynamicPackageEntry entry : package_.GetDynamicPackageMap()) {
                // String package_name(entry.package_name.c_str(), entry.package_name.size());
                package_group.dynamic_ref_table.mEntries.put(entry.package_name, (byte) entry.package_id);
            }
        }
    }
    // Now assign the runtime IDs so that we have a build-time to runtime ID map.
    for (PackageGroup iter : package_groups_) {
        String package_name = iter.packages_.get(0).loaded_package_.GetPackageName();
        for (PackageGroup iter2 : package_groups_) {
            iter2.dynamic_ref_table.addMapping(package_name, iter.dynamic_ref_table.mAssignedPackageId);
        }
    }
}
Also used : LoadedPackage(org.robolectric.res.android.LoadedArsc.LoadedPackage) DynamicPackageEntry(org.robolectric.res.android.LoadedArsc.DynamicPackageEntry)

Aggregations

DynamicPackageEntry (org.robolectric.res.android.LoadedArsc.DynamicPackageEntry)1 LoadedPackage (org.robolectric.res.android.LoadedArsc.LoadedPackage)1