1b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller/*
2b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * Copyright (C) 2014 The Android Open Source Project
3b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller *
4b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License");
5b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * you may not use this file except in compliance with the License.
6b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * You may obtain a copy of the License at
7b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller *
8b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller *      http://www.apache.org/licenses/LICENSE-2.0
9b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller *
10b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * Unless required by applicable law or agreed to in writing, software
11b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS,
12b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * See the License for the specific language governing permissions and
14b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * limitations under the License.
15b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller */
16b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
17b1e60e2015b81c285938ca569b66edda63d6533dNeil Fullerpackage libcore.net.event;
18b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
19b1e60e2015b81c285938ca569b66edda63d6533dNeil Fullerimport java.util.List;
20b1e60e2015b81c285938ca569b66edda63d6533dNeil Fullerimport java.util.concurrent.CopyOnWriteArrayList;
21b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
22b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller/**
23b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller * A singleton used to dispatch network events to registered listeners.
24b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller */
25b1e60e2015b81c285938ca569b66edda63d6533dNeil Fullerpublic class NetworkEventDispatcher {
26b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
27b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  private static final NetworkEventDispatcher instance = new NetworkEventDispatcher();
28b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
29b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  private final List<NetworkEventListener> listeners =
30b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller      new CopyOnWriteArrayList<NetworkEventListener>();
31b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
32b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  /**
33b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   * Returns the shared {@link NetworkEventDispatcher} instance.
34b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   */
35b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  public static NetworkEventDispatcher getInstance() {
36b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    return instance;
37b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  }
38b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
39b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  /** Visible for testing. Use {@link #getInstance()} instead. */
40b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  protected NetworkEventDispatcher() {
41b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  }
42b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
43b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  /**
44b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   * Registers a listener to be notified when network events occur.
45b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   * It can be deregistered using {@link #removeListener(NetworkEventListener)}
46b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   */
47b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  public void addListener(NetworkEventListener toAdd) {
48b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    if (toAdd == null) {
49b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller      throw new NullPointerException("toAdd == null");
50b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    }
51b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    listeners.add(toAdd);
52b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  }
53b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
54b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  /**
55b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   * De-registers a listener previously added with {@link #addListener(NetworkEventListener)}. If
56b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   * the listener was not previously registered this is a no-op.
57b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   */
58b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  public void removeListener(NetworkEventListener toRemove) {
59b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    for (NetworkEventListener listener : listeners) {
60b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller      if (listener == toRemove) {
61b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller        listeners.remove(listener);
62b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller        return;
63b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller      }
64b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    }
65b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  }
66b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller
67b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  /**
68b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   * Notifies registered listeners of a network configuration change.
69b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller   */
70b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  public void onNetworkConfigurationChanged() {
71b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    for (NetworkEventListener listener : listeners) {
72b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller      try {
73b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller        listener.onNetworkConfigurationChanged();
74b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller      } catch (RuntimeException e) {
75b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller        System.logI("Exception thrown during network event propagation", e);
76b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller      }
77b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller    }
78b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller  }
79b1e60e2015b81c285938ca569b66edda63d6533dNeil Fuller}
80