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