package com.sonycsl.Kadecot.wamp.provider; import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; import android.database.ContentObserver; import android.database.Cursor; import android.os.Handler; import android.os.RemoteException; import com.sonycsl.Kadecot.core.provider.KadecotCoreStore; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; public class TopicObserver { public interface OnSubscriberListener { public void onAppeared(String topic); public void onDisappeared(String topic); } private Map<String, Integer> mRefCounts; private final ContentResolver mResolver; private OnSubscriberListener mListener; private Map<String, Integer> getRefCounts() { Map<String, Integer> refCounts = new ConcurrentHashMap<String, Integer>(); ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Topics.CONTENT_URI); Cursor cursor; try { cursor = provider.query(KadecotCoreStore.Topics.CONTENT_URI, new String[] { KadecotCoreStore.Topics.TopicColumns.NAME, KadecotCoreStore.Topics.TopicColumns.REFERENCE_COUNT }, KadecotCoreStore.Topics.TopicColumns.REFERENCE_COUNT + " == 0 OR " + KadecotCoreStore.Topics.TopicColumns.REFERENCE_COUNT + " == 1", null, null); } catch (RemoteException e) { e.printStackTrace(); return refCounts; } finally { provider.release(); } if (cursor.getCount() <= 0) { cursor.close(); return refCounts; } cursor.moveToFirst(); do { refCounts.put(cursor.getString(cursor .getColumnIndex(KadecotCoreStore.Topics.TopicColumns.NAME)), cursor.getInt(cursor .getColumnIndex(KadecotCoreStore.Topics.TopicColumns.REFERENCE_COUNT))); } while (cursor.moveToNext()); cursor.close(); return refCounts; } public TopicObserver(ContentResolver resolver, Handler handler) { mRefCounts = new HashMap<String, Integer>(); mResolver = resolver; ContentProviderClient provider = mResolver .acquireContentProviderClient(KadecotCoreStore.Topics.CONTENT_URI); ContentValues values = new ContentValues(); values.put(KadecotCoreStore.Topics.TopicColumns.REFERENCE_COUNT, 0); try { provider.update(KadecotCoreStore.Topics.CONTENT_URI, values, null, null); } catch (RemoteException e) { e.printStackTrace(); } finally { provider.release(); } mRefCounts = getRefCounts(); mResolver.registerContentObserver(KadecotCoreStore.Topics.CONTENT_URI, true, new ContentObserver(handler) { @Override public void onChange(boolean selfChange) { Map<String, Integer> newRefConuts = getRefCounts(); for (Entry<String, Integer> entry : newRefConuts.entrySet()) { String topic = entry.getKey(); if (!mRefCounts.containsKey(topic)) { if (mListener != null) { mListener.onAppeared(topic); } continue; } int newRef = entry.getValue(); int oldRef = mRefCounts.get(topic); if (oldRef == newRef) { continue; } if (mListener != null) { if (oldRef < newRef) { mListener.onAppeared(topic); } else { mListener.onDisappeared(topic); } } } mRefCounts = newRefConuts; } }); } public void setOnSubscriberListener(OnSubscriberListener listener) { mListener = listener; } }