Enable bandwidth module from stats service.

During systemReady(), tell netd to enable bandwidth tracking module,
which is used to provide detailed stats and controls.

Change-Id: Iecfd8b17a3b90f5a817d731fbe1c71777681ed6e
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index 5e99463..1b09242 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -226,4 +226,6 @@
      */
     int getInterfaceTxThrottle(String iface);
 
+    void setBandwidthControlEnabled(boolean enabled);
+
 }
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 19e9a67..afff7e24 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3804,6 +3804,8 @@
                 "dream_timeout";
 
         /** {@hide} */
+        public static final String NETSTATS_ENABLED = "netstats_enabled";
+        /** {@hide} */
         public static final String NETSTATS_POLL_INTERVAL = "netstats_poll_interval";
         /** {@hide} */
         public static final String NETSTATS_PERSIST_THRESHOLD = "netstats_persist_threshold";
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index a8cb333..2b01c5e 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -19,6 +19,7 @@
 import static android.net.NetworkStats.IFACE_ALL;
 import static android.net.NetworkStats.TAG_NONE;
 import static android.net.NetworkStats.UID_ALL;
+import static android.Manifest.permission.MANAGE_NETWORK_POLICY;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
@@ -1022,6 +1023,12 @@
         return getInterfaceThrottle(iface, false);
     }
 
+    @Override
+    public void setBandwidthControlEnabled(boolean enabled) {
+        mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
+        mConnector.doCommand(String.format("bandwidth %s", (enabled ? "enable" : "disable")));
+    }
+
     /**
      * Utility method to read a single plain-text {@link Long} from the given
      * {@link File}, usually from a {@code /proc/} filesystem.
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index 043a581..a80bc04 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -27,6 +27,7 @@
 import static android.net.NetworkStats.TAG_NONE;
 import static android.net.NetworkStats.UID_ALL;
 import static android.net.TrafficStats.UID_REMOVED;
+import static android.provider.Settings.Secure.NETSTATS_ENABLED;
 import static android.provider.Settings.Secure.NETSTATS_NETWORK_BUCKET_DURATION;
 import static android.provider.Settings.Secure.NETSTATS_NETWORK_MAX_HISTORY;
 import static android.provider.Settings.Secure.NETSTATS_PERSIST_THRESHOLD;
@@ -134,6 +135,7 @@
      * Settings that can be changed externally.
      */
     public interface NetworkStatsSettings {
+        public boolean getEnabled();
         public long getPollInterval();
         public long getPersistThreshold();
         public long getNetworkBucketDuration();
@@ -206,6 +208,18 @@
     }
 
     public void systemReady() {
+        if (mSettings.getEnabled()) {
+            try {
+                // enable low-level bandwidth stats and control
+                // TODO: consider shipping with this enabled by default
+                mNetworkManager.setBandwidthControlEnabled(true);
+            } catch (RemoteException e) {
+                Slog.e(TAG, "problem enabling bandwidth controls", e);
+            }
+        } else {
+            Slog.w(TAG, "detailed network stats disabled");
+        }
+
         synchronized (mStatsLock) {
             // read historical network stats from disk, since policy service
             // might need them right away. we delay loading detailed UID stats
@@ -1040,6 +1054,9 @@
             return Settings.Secure.getLong(mResolver, name, def);
         }
 
+        public boolean getEnabled() {
+            return Settings.Secure.getInt(mResolver, NETSTATS_ENABLED, 1) != 0;
+        }
         public long getPollInterval() {
             return getSecureLong(NETSTATS_POLL_INTERVAL, 15 * MINUTE_IN_MILLIS);
         }