/* * This is the source code of Telegram for Android v. 1.3.2. * It is licensed under GNU GPL v. 2 or later. * You should have received a copy of the license in this archive (see LICENSE). * * Copyright Nikolai Kudashov, 2013. */ package org.telegram.messenger; import java.util.ArrayList; import java.util.HashMap; public class NotificationCenter { final private HashMap> observers = new HashMap>(); final private HashMap removeAfterBroadcast = new HashMap(); final private HashMap addAfterBroadcast = new HashMap(); private boolean broadcasting = false; private static volatile NotificationCenter Instance = null; public static NotificationCenter getInstance() { NotificationCenter localInstance = Instance; if (localInstance == null) { synchronized (NotificationCenter.class) { localInstance = Instance; if (localInstance == null) { Instance = localInstance = new NotificationCenter(); } } } return localInstance; } public interface NotificationCenterDelegate { public abstract void didReceivedNotification(int id, Object... args); } public void postNotificationName(int id, Object... args) { synchronized (observers) { broadcasting = true; ArrayList objects = observers.get(id); if (objects != null) { for (Object obj : objects) { ((NotificationCenterDelegate)obj).didReceivedNotification(id, args); } } broadcasting = false; if (!removeAfterBroadcast.isEmpty()) { for (HashMap.Entry entry : removeAfterBroadcast.entrySet()) { removeObserver(entry.getValue(), entry.getKey()); } removeAfterBroadcast.clear(); } if (!addAfterBroadcast.isEmpty()) { for (HashMap.Entry entry : addAfterBroadcast.entrySet()) { addObserver(entry.getValue(), entry.getKey()); } addAfterBroadcast.clear(); } } } public void addObserver(Object observer, int id) { synchronized (observers) { if (broadcasting) { addAfterBroadcast.put(id, observer); return; } ArrayList objects = observers.get(id); if (objects == null) { observers.put(id, (objects = new ArrayList())); } if (objects.contains(observer)) { return; } objects.add(observer); } } public void removeObserver(Object observer, int id) { synchronized (observers) { if (broadcasting) { removeAfterBroadcast.put(id, observer); return; } ArrayList objects = observers.get(id); if (objects != null) { objects.remove(observer); if (objects.size() == 0) { observers.remove(id); } } } } }