refine message cursor update accept/reject logic

Conversation view should ignore no-op or irrelevant
MessageCursor changes, but certain other changes should refresh
the view. Use hash codes for each message and for the entire
cursor to distinguish.

Updates from the server confirming a client-side read/star
change no longer cause the conversation view to reload.
Other cases that do cause a reload:
* edit draft locally or on the server
* read/star change on the server
* discard draft locally or on the server

Now that mCursor is changing all the time, and not always
reloading the view, we have to be extra careful to not keep
stale references to the old mCursor after a change (because
CursorLoader will close the old cursor after onLoadFinished).
This meant mPendingCursor wasn't needed.
This also meant ConversationMessage needed an intermediary to
get the current cursor.

Bug: 6951782
Bug: 6437156
Change-Id: Ibd94eb9dc0e72fae371e47db08dff0d7c09ee145
6 files changed