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

Commit d68a5b29 authored by Pechetty Sravani (xWF)'s avatar Pechetty Sravani (xWF) Committed by Gerrit Code Review
Browse files

Merge "Revert "SystemServer: reformat flag dumpsys"" into main

parents 3285d053 043a7e7e
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -30,7 +30,6 @@ java_defaults {
            "-Xep:EmptyCatch:ERROR",
            "-Xep:EmptyCatch:ERROR",
            "-Xep:EqualsIncompatibleType:ERROR",
            "-Xep:EqualsIncompatibleType:ERROR",
            "-Xep:FutureReturnValueIgnored:ERROR",
            "-Xep:FutureReturnValueIgnored:ERROR",
            "-Xep:InlineFormatString:ERROR",
            "-Xep:InlineMeInliner:ERROR",
            "-Xep:InlineMeInliner:ERROR",
            "-Xep:InvalidBlockTag:ERROR",
            "-Xep:InvalidBlockTag:ERROR",
            "-Xep:InvalidInlineTag:ERROR",
            "-Xep:InvalidInlineTag:ERROR",
+22 −96
Original line number Original line Diff line number Diff line
@@ -76,7 +76,6 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.provider.Settings;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.provider.Settings.SettingNotFoundException;
import android.sysprop.BluetoothProperties;
import android.sysprop.BluetoothProperties;
@@ -117,7 +116,6 @@ import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.stream.Collectors;


class BluetoothManagerService {
class BluetoothManagerService {
    private static final String TAG = BluetoothManagerService.class.getSimpleName();
    private static final String TAG = BluetoothManagerService.class.getSimpleName();
@@ -2337,13 +2335,6 @@ class BluetoothManagerService {
        }
        }
        String errorMsg = null;
        String errorMsg = null;


        String flagString = "";
        try {
            flagString = dumpBluetoothFlags(writer);
        } catch (Exception e) {
            writer.println("Exception while dumping Bluetooth Flags");
        }

        writer.println("Bluetooth Status");
        writer.println("Bluetooth Status");
        writer.println("  enabled: " + isEnabled());
        writer.println("  enabled: " + isEnabled());
        writer.println("  state: " + mState);
        writer.println("  state: " + mState);
@@ -2399,7 +2390,11 @@ class BluetoothManagerService {
            args[0] = "--print";
            args[0] = "--print";
        }
        }


        writer.println(flagString);
        try {
            dumpBluetoothFlags(writer);
        } catch (Exception e) {
            writer.println("Exception while dumping Bluetooth Flags");
        }


        if (mAdapter == null) {
        if (mAdapter == null) {
            errorMsg = "Bluetooth Service not connected";
            errorMsg = "Bluetooth Service not connected";
@@ -2415,97 +2410,28 @@ class BluetoothManagerService {
        }
        }
    }
    }


    private static class FlagValue {
    private void dumpBluetoothFlags(PrintWriter writer)
        private final String mSnakeName;
            throws IllegalAccessException, InvocationTargetException {
        private final boolean mDefaultValue;
        writer.println("🚩Flag dump:");
        private final boolean mManuallyEnabledInJava;
        private final boolean mManuallyEnabledInNative;

        FlagValue(String name, boolean defaultValue) {
            mSnakeName = name.replaceAll("([A-Z])", "_$1").toLowerCase(Locale.US);
            mDefaultValue = defaultValue;
            mManuallyEnabledInJava = getJavaFlagValue();
            mManuallyEnabledInNative = getNativeFlagValue();
        }

        private boolean getJavaFlagValue() {
            return DeviceConfig.getBoolean(
                    DeviceConfig.NAMESPACE_BLUETOOTH,
                    "com.android.bluetooth.flags." + mSnakeName,
                    false);
        }

        private boolean getNativeFlagValue() {
            return SystemProperties.getBoolean(
                    "persist.device_config.aconfig_flags.bluetooth.com.android.bluetooth.flags."
                            + mSnakeName,
                    false);
        }

        boolean isManuallyOverride() {
            return mManuallyEnabledInJava || mManuallyEnabledInNative;
        }


        boolean isPartiallyOverride() {
        // maxLen is used to align the flag output
            return isManuallyOverride()
        int maxLen =
                    && (mDefaultValue != mManuallyEnabledInJava
                Arrays.stream(Flags.class.getDeclaredMethods())
                            || mDefaultValue != mManuallyEnabledInNative
                        .map(Method::getName)
                            || mManuallyEnabledInJava != mManuallyEnabledInNative);
                        .map(String::length)
        }
                        .max(Integer::compare)
                        .get();


        static String toIcon(boolean flagValue) {
        String fmt = "\t%s: %-" + maxLen + "s %s";
            return flagValue ? "[■]" : "[ ]";
        }


        void dump(StringBuilder sb) {
        for (Method m : Flags.class.getDeclaredMethods()) {
            sb.append("\t").append(toIcon(mDefaultValue)).append(": ").append(mSnakeName);
            String flagStatus = ((Boolean) m.invoke(null)) ? "[■]" : "[ ]";
            if (isManuallyOverride()) {
            String name = m.getName();
                sb.append(" (Manual override)");
            String snakeCaseName = name.replaceAll("([A-Z])", "_$1").toLowerCase(Locale.US);
                if (isPartiallyOverride()) {
            writer.println(String.format(fmt, flagStatus, name, snakeCaseName));
                    sb.append(String.format(" (%s: Java)", toIcon(mManuallyEnabledInJava)));
                    sb.append(String.format(" (%s: Native)", toIcon(mManuallyEnabledInNative)));
                    sb.append(" INCONSISTENT OVERRIDE FOR THIS FLAG.")
                            .append(" This can lead to unpredictable behavior.");
                }
            }
            sb.append("\n");
        }
        }
        }

    private String dumpBluetoothFlags(PrintWriter writer) {
        List<FlagValue> flags =
                Arrays.stream(Flags.class.getDeclaredMethods())
                        .map(
                                (Method m) -> {
                                    try {
                                        return new FlagValue(m.getName(), (boolean) m.invoke(null));
                                    } catch (IllegalAccessException | InvocationTargetException e) {
                                        writer.println("Exception caught while dumping flag:" + e);
                                        throw new RuntimeException(e);
                                    }
                                })
                        .collect(Collectors.toList());

        StringBuilder flagOverride = new StringBuilder();
        flags.stream().filter(FlagValue::isManuallyOverride).forEach(f -> f.dump(flagOverride));
        if (flagOverride.length() > 0) {
            writer.println("🚩Some flag have a local override. Make sure this is expected");
            if (flags.stream().anyMatch(FlagValue::isPartiallyOverride)) {
                writer.println("CRITICAL WARNING:");
                writer.println("\tSome flags differ between native and java code !");
                writer.println(
                        "\tEither they are only enabled in java or only enabled in native. This can"
                                + " lead to critical failure and/or hard to debug issues.");
            }

            writer.println(flagOverride.toString());
            writer.println("---------------------------------------------------------------------");
        writer.println("");
        writer.println("");
    }
    }
        StringBuilder flagDumpBuilder = new StringBuilder("🚩Flag dump:\n");
        flags.stream().forEach(f -> f.dump(flagDumpBuilder));
        return flagDumpBuilder.toString();
    }


    private void dumpProto(FileDescriptor fd) {
    private void dumpProto(FileDescriptor fd) {
        final ProtoOutputStream proto = new ProtoOutputStream(new FileOutputStream(fd));
        final ProtoOutputStream proto = new ProtoOutputStream(new FileOutputStream(fd));