package org.solovyev.android.checkout; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.text.TextUtils; import java.util.ArrayList; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.concurrent.GuardedBy; /** * Receives "com.android.vending.billing.PURCHASES_UPDATED" from the Play Store and notifies the * listener. */ class PlayStoreBroadcastReceiver extends BroadcastReceiver { private static final String ACTION = "com.android.vending.billing.PURCHASES_UPDATED"; @Nonnull private final Context mContext; @Nonnull private final Object mLock; @GuardedBy("mLock") @Nonnull private final List<PlayStoreListener> mListeners = new ArrayList<>(); PlayStoreBroadcastReceiver(@Nonnull Context context, @Nonnull Object lock) { mContext = context; mLock = lock; } void addListener(@Nonnull PlayStoreListener listener) { synchronized (mLock) { Check.isTrue(!mListeners.contains(listener), "Listener " + listener + " is already in the list"); mListeners.add(listener); if (mListeners.size() == 1) { mContext.registerReceiver(this, new IntentFilter(ACTION)); } } } void removeListener(@Nonnull PlayStoreListener listener) { synchronized (mLock) { Check.isTrue(mListeners.contains(listener), "Listener " + listener + " is not in the list"); mListeners.remove(listener); if (mListeners.size() == 0) { mContext.unregisterReceiver(this); } } } boolean contains(@Nonnull PlayStoreListener listener) { synchronized (mLock) { return mListeners.contains(listener); } } @Override public void onReceive(Context context, Intent intent) { if (intent == null || !TextUtils.equals(intent.getAction(), ACTION)) { return; } final List<PlayStoreListener> listeners; synchronized (mLock) { listeners = new ArrayList<>(mListeners); } for (PlayStoreListener listener : listeners) { listener.onPurchasesChanged(); } } }