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

Commit 56267f7c authored by Ted Bauer's avatar Ted Bauer
Browse files

Read aconfig flags from protobuf.

Change-Id: I830376ff93cdb408c7d642dcd6637c4619612a1c
Test: tested manually
Bug: 307551120
parent 9d38af2d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ android_library {
    ],
    static_libs: [
        "device_config_service_flags_java",
        "libaconfig_java_proto_lite",
        "SettingsLibDeviceStateRotationLock",
        "SettingsLibDisplayUtils",
    ],
+49 −52
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import static android.provider.Settings.Config.SYNC_DISABLED_MODE_UNTIL_REBOOT;

import static com.android.providers.settings.Flags.supportOverrides;

import android.aconfig.Aconfig.parsed_flag;
import android.aconfig.Aconfig.parsed_flags;
import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.AttributionSource;
@@ -39,12 +41,13 @@ import android.provider.DeviceConfigShellCommandHandler;
import android.provider.Settings;
import android.provider.Settings.Config.SyncDisabledMode;
import android.provider.UpdatableDeviceConfigServiceReadiness;
import android.util.Slog;

import com.android.internal.util.FastPrintWriter;

import java.io.File;
import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
@@ -56,18 +59,17 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
 * Receives shell commands from the command line related to device config flags, and dispatches them
 * to the SettingsProvider.
 */
public final class DeviceConfigService extends Binder {
    private static final List<String> aconfigTextProtoFilesOnDevice = List.of(
        "/system/etc/aconfig_flags.textproto",
        "/system_ext/etc/aconfig_flags.textproto",
        "/system_ext/etc/aconfig_flags.textproto",
        "/vendor/etc/aconfig_flags.textproto");
    private static final List<String> sAconfigTextProtoFilesOnDevice = List.of(
            "/system/etc/aconfig_flags.pb",
            "/system_ext/etc/aconfig_flags.pb",
            "/system_ext/etc/aconfig_flags.pb",
            "/vendor/etc/aconfig_flags.pb");

    private static final List<String> PRIVATE_NAMESPACES = List.of(
            "device_config_overrides",
@@ -76,6 +78,8 @@ public final class DeviceConfigService extends Binder {

    final SettingsProvider mProvider;

    private static final String TAG = "DeviceConfigService";

    public DeviceConfigService(SettingsProvider provider) {
        mProvider = provider;
    }
@@ -101,7 +105,7 @@ public final class DeviceConfigService extends Binder {
        }

        ArrayList<String> missingFiles = new ArrayList<String>();
      for (String fileName : aconfigTextProtoFilesOnDevice) {
        for (String fileName : sAconfigTextProtoFilesOnDevice) {
            File aconfigFile = new File(fileName);
            if (!aconfigFile.exists()) {
                missingFiles.add(fileName);
@@ -123,32 +127,25 @@ public final class DeviceConfigService extends Binder {

    private static HashSet<String> getAconfigFlagNamesInDeviceConfig() {
        HashSet<String> nameSet = new HashSet<String>();
        for (String fileName : aconfigTextProtoFilesOnDevice) {
        try {
            File aconfigFile = new File(fileName);
            String packageName = "";
            String namespace = "";
            String name = "";

            try (Scanner scanner = new Scanner(aconfigFile)) {
              while (scanner.hasNextLine()) {
                String data = scanner.nextLine().replaceAll("\\s+","");
                if (data.startsWith("package:\"")) {
                  packageName = data.substring(9, data.length()-1);
                } else if (data.startsWith("name:\"")) {
                  name = data.substring(6, data.length()-1);
                } else if (data.startsWith("namespace:\"")) {
                  namespace = data.substring(11, data.length()-1);
                  nameSet.add(namespace + "/" + packageName + "." + name);
                }
              }
            for (String fileName : sAconfigTextProtoFilesOnDevice) {
                byte[] contents = (new FileInputStream(fileName)).readAllBytes();
                parsed_flags parsedFlags = parsed_flags.parseFrom(contents);
                if (parsedFlags == null) {
                    Slog.e(TAG, "failed to parse aconfig protobuf from " + fileName);
                    continue;
                }

          } catch (FileNotFoundException e) {
            continue;
                for (parsed_flag flag : parsedFlags.getParsedFlagList()) {
                    String namespace = flag.getNamespace();
                    String packageName = flag.getPackage();
                    String name = flag.getName();
                    nameSet.add(namespace + "/" + packageName + "." + name);
                }
            }

        } catch (IOException e) {
            Slog.e(TAG, "failed to read aconfig protobuf", e);
        }
        return nameSet;
    }