package com.raizlabs.android.dbflow.runtime; import android.content.ContentResolver; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.raizlabs.android.dbflow.config.FlowManager; import com.raizlabs.android.dbflow.sql.SqlUtils; import com.raizlabs.android.dbflow.sql.language.SQLOperator; import com.raizlabs.android.dbflow.structure.BaseModel; import com.raizlabs.android.dbflow.structure.ModelAdapter; /** * The default use case, it notifies via the {@link ContentResolver} system. */ public class ContentResolverNotifier implements ModelNotifier { @Override public <T> void notifyModelChanged(@Nullable T model, @NonNull ModelAdapter<T> adapter, @NonNull BaseModel.Action action) { if (FlowContentObserver.shouldNotify()) { FlowManager.getContext().getContentResolver() .notifyChange(SqlUtils.getNotificationUri(adapter.getModelClass(), action, adapter.getPrimaryConditionClause(model).getConditions()), null, true); } } @Override public <T> void notifyTableChanged(@NonNull Class<T> table, @NonNull BaseModel.Action action) { if (FlowContentObserver.shouldNotify()) { FlowManager.getContext().getContentResolver() .notifyChange(SqlUtils.getNotificationUri(table, action, (SQLOperator[]) null), null, true); } } @Override public TableNotifierRegister newRegister() { return new FlowContentTableNotifierRegister(); } public static class FlowContentTableNotifierRegister implements TableNotifierRegister { private final FlowContentObserver flowContentObserver = new FlowContentObserver(); @Nullable private OnTableChangedListener tableChangedListener; public FlowContentTableNotifierRegister() { flowContentObserver.addOnTableChangedListener(internalContentChangeListener); } @Override public <T> void register(Class<T> tClass) { flowContentObserver.registerForContentChanges(FlowManager.getContext(), tClass); } @Override public <T> void unregister(Class<T> tClass) { flowContentObserver.unregisterForContentChanges(FlowManager.getContext()); } @Override public void unregisterAll() { flowContentObserver.removeTableChangedListener(internalContentChangeListener); this.tableChangedListener = null; } @Override public void setListener(OnTableChangedListener contentChangeListener) { this.tableChangedListener = contentChangeListener; } @Override public boolean isSubscribed() { return !flowContentObserver.isSubscribed(); } private final OnTableChangedListener internalContentChangeListener = new OnTableChangedListener() { @Override public void onTableChanged(@Nullable Class<?> tableChanged, @NonNull BaseModel.Action action) { if (tableChangedListener != null) { tableChangedListener.onTableChanged(tableChanged, action); } } }; } }