whitelist "snet_event_log" when turning logs off

- Before silencing the logs, ensure security logs are whitelisted
- Only touch persist.log.tag properties if they need to be, add
  stacking to the property.
- Clear persist.logd.size property when at default setting

Bug: 26178938
Change-Id: I8fdb040062dc9cbb23d7bc3c117d96ff8550c132
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 2ffd515..f237a7d 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -148,7 +148,16 @@
     private static final String SELECT_LOGD_SIZE_KEY = "select_logd_size";
     private static final String SELECT_LOGD_SIZE_PROPERTY = "persist.logd.size";
     private static final String SELECT_LOGD_TAG_PROPERTY = "persist.log.tag";
+    // Tricky, isLoggable only checks for first character, assumes silence
+    private static final String SELECT_LOGD_TAG_SILENCE = "Settings";
+    private static final String SELECT_LOGD_SNET_TAG_PROPERTY = "persist.log.tag.snet_event_log";
+    private static final String SELECT_LOGD_RUNTIME_SNET_TAG_PROPERTY = "log.tag.snet_event_log";
     private static final String SELECT_LOGD_DEFAULT_SIZE_PROPERTY = "ro.logd.size";
+    private static final String SELECT_LOGD_DEFAULT_SIZE_VALUE = "262144";
+    private static final String SELECT_LOGD_SVELTE_DEFAULT_SIZE_VALUE = "65536";
+    // 32768 is merely a menu marker, 64K is our lowest log buffer size we replace it with.
+    private static final String SELECT_LOGD_MINIMUM_SIZE_VALUE = "65536";
+    private static final String SELECT_LOGD_OFF_SIZE_MARKER_VALUE = "32768";
 
     private static final String WIFI_DISPLAY_CERTIFICATION_KEY = "wifi_display_certification";
     private static final String WIFI_VERBOSE_LOGGING_KEY = "wifi_verbose_logging";
@@ -180,8 +189,6 @@
 
     private static final int REQUEST_CODE_ENABLE_OEM_UNLOCK = 0;
 
-    private static String DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES = "262144"; // 256K
-
     private static final int[] MOCK_LOCATION_APP_OPS = new int[] {AppOpsManager.OP_MOCK_LOCATION};
 
     private static final String MULTI_WINDOW_SYSTEM_PROPERTY = "persist.sys.debug.multi_window";
@@ -1257,22 +1264,27 @@
                 mMobileDataAlwaysOn.isChecked() ? 1 : 0);
     }
 
+    private String defaultLogdSizeValue() {
+        String defaultValue = SystemProperties.get(SELECT_LOGD_DEFAULT_SIZE_PROPERTY);
+        if ((defaultValue == null) || (defaultValue.length() == 0)) {
+            if (SystemProperties.get("ro.config.low_ram").equals("true")) {
+                defaultValue = SELECT_LOGD_SVELTE_DEFAULT_SIZE_VALUE;
+            } else {
+                defaultValue = SELECT_LOGD_DEFAULT_SIZE_VALUE;
+            }
+        }
+        return defaultValue;
+    }
+
     private void updateLogdSizeValues() {
         if (mLogdSize != null) {
             String currentTag = SystemProperties.get(SELECT_LOGD_TAG_PROPERTY);
             String currentValue = SystemProperties.get(SELECT_LOGD_SIZE_PROPERTY);
-            if ((currentTag != null) && currentTag.equals("S")) {
-                currentValue = "32768";
+            if ((currentTag != null) && currentTag.startsWith(SELECT_LOGD_TAG_SILENCE)) {
+                currentValue = SELECT_LOGD_OFF_SIZE_MARKER_VALUE;
             }
-            if (currentValue == null) {
-                currentValue = SystemProperties.get(SELECT_LOGD_DEFAULT_SIZE_PROPERTY);
-                if (currentValue == null) {
-                    if (SystemProperties.get("ro.config.low_ram").equals("true")) {
-                        currentValue = "64K";
-                    } else {
-                        currentValue = "256K";
-                    }
-                }
+            if ((currentValue == null) || (currentValue.length() == 0)) {
+                currentValue = defaultLogdSizeValue();
             }
             String[] values = getResources().getStringArray(R.array.select_logd_size_values);
             String[] titles = getResources().getStringArray(R.array.select_logd_size_titles);
@@ -1297,20 +1309,42 @@
     }
 
     private void writeLogdSizeOption(Object newValue) {
-        String currentValue = SystemProperties.get(SELECT_LOGD_DEFAULT_SIZE_PROPERTY);
-        if (currentValue != null) {
-            DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES = currentValue;
+        boolean disable = (newValue != null) &&
+            (newValue.toString().equals(SELECT_LOGD_OFF_SIZE_MARKER_VALUE));
+        String currentTag = SystemProperties.get(SELECT_LOGD_TAG_PROPERTY);
+        if (currentTag == null) {
+            currentTag = "";
         }
-        boolean disable = (newValue != null) && (newValue.equals("32768"));
+        // filter clean and unstack all references to our setting
+        String newTag = currentTag.replaceAll(
+                ",+" + SELECT_LOGD_TAG_SILENCE, "").replaceFirst(
+                "^" + SELECT_LOGD_TAG_SILENCE + ",*", "").replaceAll(
+                ",+", ",").replaceFirst(
+                ",+$", "");
         if (disable) {
-            newValue = "65536";
-            SystemProperties.set(SELECT_LOGD_TAG_PROPERTY, "S");
-        } else {
-            SystemProperties.set(SELECT_LOGD_TAG_PROPERTY, "");
+            newValue = SELECT_LOGD_MINIMUM_SIZE_VALUE;
+            // Make sure snet_event_log get through first, but do not override
+            String snetValue = SystemProperties.get(SELECT_LOGD_SNET_TAG_PROPERTY);
+            if ((snetValue == null) || (snetValue.length() == 0)) {
+                snetValue = SystemProperties.get(SELECT_LOGD_RUNTIME_SNET_TAG_PROPERTY);
+                if ((snetValue == null) || (snetValue.length() == 0)) {
+                    SystemProperties.set(SELECT_LOGD_SNET_TAG_PROPERTY, "I");
+                }
+            }
+            // Silence all log sources, security logs notwithstanding
+            if (newTag.length() != 0) {
+                newTag = "," + newTag;
+            }
+            // Stack settings, stack to help preserve original value
+            newTag = SELECT_LOGD_TAG_SILENCE + newTag;
         }
-        final String size = (newValue != null) ?
-                newValue.toString() : DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES;
-        SystemProperties.set(SELECT_LOGD_SIZE_PROPERTY, size);
+        if (!newTag.equals(currentTag)) {
+            SystemProperties.set(SELECT_LOGD_TAG_PROPERTY, newTag);
+        }
+        String defaultValue = defaultLogdSizeValue();
+        final String size = ((newValue != null) && (newValue.toString().length() != 0)) ?
+            newValue.toString() : defaultValue;
+        SystemProperties.set(SELECT_LOGD_SIZE_PROPERTY, defaultValue.equals(size) ? "" : size);
         SystemProperties.set("ctl.start", "logd-reinit");
         pokeSystemProperties();
         updateLogdSizeValues();