/**
   * Swap in a new Cursor, returning the old Cursor. Unlike {@link #changeCursor(AbstractCursor)},
   * the returned old Cursor is <em>not</em> closed.
   *
   * @param newCursor The new cursor to be used.
   * @return Returns the previously set Cursor, or null if there wasa not one. If the given new
   *     Cursor is the same instance is the previously set Cursor, null is also returned.
   */
  public C swapCursor(C newCursor) {
    if (newCursor == mCursor) {
      return null;
    }

    C oldCursor = mCursor;
    if (oldCursor != null) {
      if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver);
      if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver);
    }

    mCursor = newCursor;
    if (newCursor != null) {
      if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver);
      if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver);
      mDataValid = true;
      // notify the observers about the new cursor
      onContentChanged();
    } else {
      mDataValid = false;
      // notify the observers about the lack of a data set
      onContentChanged();
    }

    return oldCursor;
  }
  private void init(Context context, C c, int flags) {
    boolean cursorPresent = c != null;
    mCursor = c;
    mDataValid = cursorPresent;
    mContext = context;
    if ((flags & FLAG_REGISTER_CONTENT_OBSERVER) == FLAG_REGISTER_CONTENT_OBSERVER) {
      mChangeObserver = new ChangeObserver();
      mDataSetObserver = new MyDataSetObserver();
    } else {
      mChangeObserver = null;
      mDataSetObserver = null;
    }

    if (cursorPresent) {
      if (mChangeObserver != null) c.registerContentObserver(mChangeObserver);
      if (mDataSetObserver != null) c.registerDataSetObserver(mDataSetObserver);
    }

    setHasStableIds(true);
  }