NetworkManagementService: Introduce INetworkManagementEventObserver

  Introduce a callback event observer which can be registered on the
INetworkManagementService instance to receive events from the service.

Signed-off-by: San Mehat <san@google.com>
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index 7b66a76..8594e44 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -25,6 +25,7 @@
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.net.InterfaceConfiguration;
+import android.net.INetworkManagementEventObserver;
 import android.os.INetworkManagementService;
 import android.os.Handler;
 import android.text.TextUtils;
@@ -70,6 +71,8 @@
      */
     private NativeDaemonConnector mConnector;
 
+    private ArrayList<INetworkManagementEventObserver> mObservers;
+
     /**
      * Constructs a new NetworkManagementService instance
      *
@@ -78,12 +81,64 @@
     private NetworkManagementService(Context context) {
         mContext = context;
 
+        mObservers = new ArrayList<INetworkManagementEventObserver>();
+
         mConnector = new NativeDaemonConnector(
                 new NetdCallbackReceiver(), "netd", 10, "NetdConnector");
         Thread thread = new Thread(mConnector, NativeDaemonConnector.class.getName());
         thread.start();
     }
 
+    public void registerObserver(INetworkManagementEventObserver obs) {
+        Log.d(TAG, "Registering observer");
+        mObservers.add(obs);
+    }
+
+    public void unregisterObserver(INetworkManagementEventObserver obs) {
+        Log.d(TAG, "Unregistering observer");
+        mObservers.remove(mObservers.indexOf(obs));
+    }
+
+    /**
+     * Notify our observers of an interface link status change
+     */
+    private void notifyInterfaceLinkStatusChanged(String iface, boolean link) {
+        for (INetworkManagementEventObserver obs : mObservers) {
+            try {
+                obs.interfaceLinkStatusChanged(iface, link);
+            } catch (Exception ex) {
+                Log.w(TAG, "Observer notifier failed", ex);
+            }
+        }
+    }
+
+    /**
+     * Notify our observers of an interface addition.
+     */
+    private void notifyInterfaceAdded(String iface) {
+        for (INetworkManagementEventObserver obs : mObservers) {
+            try {
+                obs.interfaceAdded(iface);
+            } catch (Exception ex) {
+                Log.w(TAG, "Observer notifier failed", ex);
+            }
+        }
+    }
+
+    /**
+     * Notify our observers of an interface removal.
+     */
+    private void notifyInterfaceRemoved(String iface) {
+        for (INetworkManagementEventObserver obs : mObservers) {
+            try {
+                obs.interfaceRemoved(iface);
+            } catch (Exception ex) {
+                Log.w(TAG, "Observer notifier failed", ex);
+            }
+        }
+    }
+
+
     //
     // Netd Callback handling
     //