diff options
| -rw-r--r-- | Android.mk | 1 | ||||
| -rw-r--r-- | core/java/android/net/INetworkManagementEventObserver.aidl | 46 | ||||
| -rw-r--r-- | core/java/android/os/INetworkManagementService.aidl | 11 | ||||
| -rw-r--r-- | services/java/com/android/server/NetworkManagementService.java | 55 |
4 files changed, 113 insertions, 0 deletions
diff --git a/Android.mk b/Android.mk index d6beac5e64f6..568352ea796b 100644 --- a/Android.mk +++ b/Android.mk @@ -108,6 +108,7 @@ LOCAL_SRC_FILES += \ core/java/android/database/IContentObserver.aidl \ core/java/android/hardware/ISensorService.aidl \ core/java/android/net/IConnectivityManager.aidl \ + core/java/android/net/INetworkManagementEventObserver.aidl \ core/java/android/os/ICheckinService.aidl \ core/java/android/os/IMessenger.aidl \ core/java/android/os/IMountService.aidl \ diff --git a/core/java/android/net/INetworkManagementEventObserver.aidl b/core/java/android/net/INetworkManagementEventObserver.aidl new file mode 100644 index 000000000000..d30b63dab806 --- /dev/null +++ b/core/java/android/net/INetworkManagementEventObserver.aidl @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net; + +/** + * Callback class for receiving events from an INetworkManagementService + * + * @hide + */ +interface INetworkManagementEventObserver { + /** + * Interface link status has changed. + * + * @param iface The interface. + * @param link True if link is up. + */ + void interfaceLinkStatusChanged(String iface, boolean link); + + /** + * An interface has been added to the system + * + * @param iface The interface. + */ + void interfaceAdded(String iface); + + /** + * An interface has been removed from the system + * + * @param iface The interface. + */ + void interfaceRemoved(String iface); +} diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 49abb4d7c105..e4ec098eeb26 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -18,6 +18,7 @@ package android.os; import android.net.InterfaceConfiguration; +import android.net.INetworkManagementEventObserver; /** * @hide @@ -29,6 +30,16 @@ interface INetworkManagementService **/ /** + * Register an observer to receive events + */ + void registerObserver(INetworkManagementEventObserver obs); + + /** + * Unregister an observer from receiving events. + */ + void unregisterObserver(INetworkManagementEventObserver obs); + + /** * Returns a list of currently known network interfaces */ String[] listInterfaces(); diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 7b66a767c1e8..8594e444438f 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -25,6 +25,7 @@ import android.content.res.Resources; 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 @@ class NetworkManagementService extends INetworkManagementService.Stub { */ private NativeDaemonConnector mConnector; + private ArrayList<INetworkManagementEventObserver> mObservers; + /** * Constructs a new NetworkManagementService instance * @@ -78,12 +81,64 @@ class NetworkManagementService extends INetworkManagementService.Stub { 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 // |