Loading service/Android.bp +0 −1 Original line number Original line Diff line number Diff line Loading @@ -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", Loading service/src/com/android/server/bluetooth/BluetoothManagerService.java +22 −96 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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"; Loading @@ -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)); Loading Loading
service/Android.bp +0 −1 Original line number Original line Diff line number Diff line Loading @@ -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", Loading
service/src/com/android/server/bluetooth/BluetoothManagerService.java +22 −96 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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); Loading Loading @@ -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"; Loading @@ -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)); Loading