Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f65a4a21 authored by Zhi Dou's avatar Zhi Dou Committed by Gerrit Code Review
Browse files

Merge "Return list of packages" into main

parents 0797d028 733023a9
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -63,4 +63,8 @@ public class ByteBufferReader {
    public void position(int newPosition) {
        mByteBuffer.position(newPosition);
    }

    public int position() {
        return mByteBuffer.position();
    }
}
+18 −0
Original line number Diff line number Diff line
@@ -19,10 +19,16 @@ package android.aconfig.storage;
import static java.nio.charset.StandardCharsets.UTF_8;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class PackageTable {

    private static final int FINGERPRINT_BYTES = 8;
    // int: mPackageId + int: mBooleanStartIndex + int: mNextOffset
    private static final int NODE_SKIP_BYTES = 12;

    private Header mHeader;
    private ByteBufferReader mReader;

@@ -60,6 +66,18 @@ public class PackageTable {
        return null;
    }

    public List<String> getPackageList() {
        List<String> list = new ArrayList<>(mHeader.mNumPackages);
        mReader.position(mHeader.mNodeOffset);
        int fingerprintBytes = mHeader.mVersion == 1 ? 0 : FINGERPRINT_BYTES;
        int skipBytes = fingerprintBytes + NODE_SKIP_BYTES;
        for (int i = 0; i < mHeader.mNumPackages; i++) {
            list.add(mReader.readString());
            mReader.position(mReader.position() + skipBytes);
        }
        return list;
    }

    public Header getHeader() {
        return mHeader;
    }
+6 −7
Original line number Diff line number Diff line
@@ -39,13 +39,15 @@ public class StorageFileProvider {
    private static final String PMAP_FILE_EXT = ".package.map";
    private static final String FMAP_FILE_EXT = ".flag.map";
    private static final String VAL_FILE_EXT = ".val";
    private static final StorageFileProvider DEFAULT_INSTANCE =
            new StorageFileProvider(DEFAULT_MAP_PATH, DEFAULT_BOOT_PATH);

    private final String mMapPath;
    private final String mBootPath;

    /** @hide */
    public static StorageFileProvider getDefaultProvider() {
        return new StorageFileProvider(DEFAULT_MAP_PATH, DEFAULT_BOOT_PATH);
        return DEFAULT_INSTANCE;
    }

    /** @hide */
@@ -82,7 +84,9 @@ public class StorageFileProvider {

    /** @hide */
    public PackageTable getPackageTable(String container) {
        return getPackageTable(Paths.get(mMapPath, container + PMAP_FILE_EXT));
        return PackageTable.fromBytes(
                mapStorageFile(
                        Paths.get(mMapPath, container + PMAP_FILE_EXT), FileType.PACKAGE_MAP));
    }

    /** @hide */
@@ -97,11 +101,6 @@ public class StorageFileProvider {
                mapStorageFile(Paths.get(mBootPath, container + VAL_FILE_EXT), FileType.FLAG_VAL));
    }

    /** @hide */
    public static PackageTable getPackageTable(Path path) {
        return PackageTable.fromBytes(mapStorageFile(path, FileType.PACKAGE_MAP));
    }

    // Map a storage file given file path
    private static MappedByteBuffer mapStorageFile(Path file, FileType type) {
        FileChannel channel = null;
+21 −0
Original line number Diff line number Diff line
@@ -27,6 +27,9 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.util.HashSet;
import java.util.Set;

@RunWith(JUnit4.class)
public class PackageTableTest {

@@ -121,4 +124,22 @@ public class PackageTableTest {
        assertEquals(4431940502274857964L, node2.getPackageFingerprint());
        assertEquals(-2213514155997929241L, node4.getPackageFingerprint());
    }

    @Test
    public void testPackageTable_getPackageList() throws Exception {
        PackageTable packageTable =
                PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(2));
        Set<String> packages = new HashSet<>(packageTable.getPackageList());
        assertEquals(3, packages.size());
        assertTrue(packages.contains("com.android.aconfig.storage.test_1"));
        assertTrue(packages.contains("com.android.aconfig.storage.test_2"));
        assertTrue(packages.contains("com.android.aconfig.storage.test_4"));

        packageTable = PackageTable.fromBytes(TestDataUtils.getTestPackageMapByteBuffer(1));
        packages = new HashSet<>(packageTable.getPackageList());
        assertEquals(3, packages.size());
        assertTrue(packages.contains("com.android.aconfig.storage.test_1"));
        assertTrue(packages.contains("com.android.aconfig.storage.test_2"));
        assertTrue(packages.contains("com.android.aconfig.storage.test_4"));
    }
}