Adds logging to push settings changed to statsd.

Introduces atom and logging for every time a setting is updated.
We also include the previous value to validate our logging
data quality. We need to add the INTERACT_ACROSS_USERS_FULL
permission to prevent a security exception during testing; since the
logging occurs from system_server uid, this security exception should
not occur normally.

Test: Manual by inspecting the statsd output while toggling settings.
Change-Id: I92ca2afa596e54e61936e22611d749bb60ccb364
diff --git a/cmds/statsd/src/stats_events.proto b/cmds/statsd/src/stats_events.proto
index 74ee332..3789baf 100644
--- a/cmds/statsd/src/stats_events.proto
+++ b/cmds/statsd/src/stats_events.proto
@@ -69,7 +69,7 @@
         WifiSignalStrengthChanged wifi_signal_strength_changed = 38;
         WifiScanStateChanged wifi_scan_state_changed = 39;
         PhoneSignalStrengthChanged phone_signal_strength_changed = 40;
-
+        SettingChanged setting_changed = 41;
         // TODO: Reorder the numbering so that the most frequent occur events occur in the first 15.
     }
 }
@@ -479,7 +479,7 @@
  * Logs battery level (percent full, from 0 to 100).
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message BatteryLevelChanged {
     // Battery level. Should be in [0, 100].
@@ -490,7 +490,7 @@
  * Logs change in charging status of the device.
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message ChargingStateChanged {
     // TODO: Link directly to BatteryManager.java's constants (via a proto).
@@ -508,7 +508,7 @@
  * Logs whether the device is plugged in, and what power source it is using.
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message PluggedStateChanged {
     // TODO: Link directly to BatteryManager.java's constants (via a proto).
@@ -529,7 +529,7 @@
  * Logs the temperature of the device, in tenths of a degree Celsius.
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message DeviceTemperatureReported {
     // Temperature in tenths of a degree C.
@@ -542,7 +542,7 @@
  * Logs when the device turns off or on.
  *
  * Logged from:
-  *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+ *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
  */
 message DeviceOnStatusChanged {
     enum State {
@@ -556,7 +556,7 @@
  * Logs when an app's wakeup alarm fires.
  *
  * Logged from:
-  *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+ *   frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
  */
 message WakeupAlarmOccurred {
     // TODO: Add attribution instead of uid?
@@ -581,7 +581,7 @@
  * Logs wifi locks held by an app.
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message WifiLockStateChanged {
     // TODO: Add attribution instead of uid.
@@ -598,7 +598,7 @@
  * Logs wifi signal strength changes.
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message WifiSignalStrengthChanged {
     // TODO: Reference the actual telephony/java/android/telephony/SignalStrength.java states.
@@ -616,7 +616,7 @@
  * Logs wifi scans performed by an app.
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message WifiScanStateChanged {
     // TODO: Add attribution instead of uid.
@@ -633,7 +633,7 @@
  * Logs phone signal strength changes.
  *
  * Logged from:
-  *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
+ *   frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java
  */
 message PhoneSignalStrengthChanged {
     // TODO: Reference the actual telephony/java/android/telephony/SignalStrength.java states.
@@ -645,4 +645,37 @@
         SIGNAL_STRENGTH_GREAT = 4;
     }
     optional SignalStrength signal_strength = 1;
-}
\ No newline at end of file
+}
+
+/**
+ * Logs that a setting was updated.
+ * Logged from:
+ *   frameworks/base/core/java/android/provider/Settings.java
+ * The tag and is_default allow resetting of settings to default values based on the specified
+ * tag. See Settings#putString(ContentResolver, String, String, String, boolean) for more details.
+ */
+message SettingChanged {
+    // The name of the setting.
+    optional string setting = 1;
+
+    // The change being imposed on this setting. May represent a number, eg "3".
+    optional string value = 2;
+
+    // The new value of this setting. For most settings, this is same as value. For some settings,
+    // value is +X or -X where X represents an element in a set. For example, if the previous value
+    // is A,B,C and value is -B, then new_value is A,C and prev_value is A,B,C.
+    // The +/- feature is currently only used for location_providers_allowed.
+    optional string new_value = 3;
+
+    // The previous value of this setting.
+    optional string prev_value = 4;
+
+    // The tag used with the is_default for resetting sets of settings. This is generally null.
+    optional string tag = 5;
+
+    // 1 indicates that this setting with tag should be resettable.
+    optional int32 is_default = 6;
+
+    // The user ID associated. Defined in android/os/UserHandle.java
+    optional int32 user = 7;
+}