package piuk.blockchain.android; import java.lang.ref.WeakReference; import java.util.HashSet; import java.util.Set; import com.google.bitcoin.core.Transaction; import android.os.Handler; public class EventListeners { public static class ListenerWeakContainer extends WeakReference<EventListener> { public ListenerWeakContainer(EventListener r) { super(r); } @Override public int hashCode() { EventListener listener = get(); if (listener == null) return 0; return listener.hashCode(); } @Override public boolean equals(Object object) { EventListener listener = get(); if (listener == null) return false; return listener.equals(((ListenerWeakContainer)object).get()); } } final static Handler handler = new Handler(); public static abstract class EventListener { public abstract String getDescription(); @Override public int hashCode() { return getDescription().hashCode(); } @Override public boolean equals(Object object) { return getDescription().equals(((EventListener)object).getDescription()); } public void onWalletDidChange() { }; public void onCoinsSent(final Transaction tx, final long result) { }; public void onCoinsReceived(final Transaction tx, final long result) { }; public void onTransactionsChanged() { }; public void onCurrencyChanged() { }; public void onMultiAddrError() { }; } private static final Set<ListenerWeakContainer> listeners = new HashSet<ListenerWeakContainer>(); public static boolean addEventListener(EventListener listener) { synchronized (listeners) { if (listeners.add(new ListenerWeakContainer(listener))) { return true; } else { return false; } } } public static boolean removeEventListener(EventListener listener) { synchronized (listeners) { return listeners.remove(new ListenerWeakContainer(listener)); } } public static void invokeOnCoinsReceived(final Transaction tx, final long result) { new Thread(new Runnable() { @Override public void run() { synchronized (listeners) { for (final ListenerWeakContainer listener : listeners) { if (listener.get() == null) return; handler.post(new Runnable() { @Override public void run() { EventListener _listener = listener.get(); if (_listener != null) { _listener.onCoinsReceived(tx, result); } } }); } } } }).start(); } public static void invokeOnTransactionsChanged() { new Thread(new Runnable() { @Override public void run() { synchronized (listeners) { for (final ListenerWeakContainer listener : listeners) { if (listener.get() == null) return; handler.post(new Runnable() { @Override public void run() { EventListener _listener = listener.get(); if (_listener != null) { _listener.onTransactionsChanged(); } } }); } } } }).start(); } public static void invokeOnCoinsSent(final Transaction tx, final long result) { new Thread(new Runnable() { @Override public void run() { synchronized (listeners) { for (final ListenerWeakContainer listener : listeners) { if (listener.get() == null) return; handler.post(new Runnable() { @Override public void run() { EventListener _listener = listener.get(); if (_listener != null) { _listener.onCoinsSent(tx, result); } } }); } } } }).start(); } public static void invokeWalletDidChange() { new Thread(new Runnable() { @Override public void run() { synchronized (listeners) { for (final ListenerWeakContainer listener : listeners) { if (listener.get() == null) return; handler.post(new Runnable() { @Override public void run() { EventListener _listener = listener.get(); if (_listener != null) { _listener.onWalletDidChange(); } } }); } } } }).start(); } public static void invokeCurrencyDidChange() { new Thread(new Runnable() { @Override public void run() { synchronized (listeners) { for (final ListenerWeakContainer listener : listeners) { if (listener.get() == null) return; handler.post(new Runnable() { @Override public void run() { EventListener _listener = listener.get(); if (_listener != null) { _listener.onCurrencyChanged(); } } }); } } } }).start(); } public static void invokeOnMultiAddrError() { new Thread(new Runnable() { @Override public void run() { synchronized (listeners) { for (final ListenerWeakContainer listener : listeners) { if (listener.get() == null) return; handler.post(new Runnable() { @Override public void run() { EventListener _listener = listener.get(); if (_listener != null) { _listener.onMultiAddrError(); } } }); } } } }).start(); } }