diff options
Diffstat (limited to 'java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java')
-rw-r--r-- | java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java b/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java index ca0b5dcb0..d04143f59 100644 --- a/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java +++ b/java/com/android/dialer/voicemail/listui/NewVoicemailAdapter.java @@ -17,17 +17,27 @@ package com.android.dialer.voicemail.listui; import android.database.Cursor; import android.support.v7.widget.RecyclerView; +import android.util.ArraySet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.android.dialer.common.LogUtil; import com.android.dialer.time.Clock; +import com.android.dialer.voicemail.listui.NewVoicemailViewHolder.NewVoicemailViewHolderListener; +import com.android.dialer.voicemail.model.VoicemailEntry; +import java.util.Set; /** {@link RecyclerView.Adapter} for the new voicemail call log fragment. */ -final class NewVoicemailAdapter extends RecyclerView.Adapter<NewVoicemailViewHolder> { +final class NewVoicemailAdapter extends RecyclerView.Adapter<NewVoicemailViewHolder> + implements NewVoicemailViewHolderListener { private final Cursor cursor; private final Clock clock; + /** A valid id for {@link VoicemailEntry} is greater than 0 */ + private int currentlyExpandedViewHolderId = -1; + + // A set of (re-usable) view holders being used by the recycler view to display voicemails + private final Set<NewVoicemailViewHolder> newVoicemailViewHolderSet = new ArraySet<>(); /** @param cursor whose projection is {@link VoicemailCursorLoader.VOICEMAIL_COLUMNS} */ NewVoicemailAdapter(Cursor cursor, Clock clock) { @@ -39,7 +49,8 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<NewVoicemailViewHol public NewVoicemailViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext()); View view = inflater.inflate(R.layout.new_voicemail_entry, viewGroup, false); - NewVoicemailViewHolder newVoicemailViewHolder = new NewVoicemailViewHolder(view, clock); + NewVoicemailViewHolder newVoicemailViewHolder = new NewVoicemailViewHolder(view, clock, this); + newVoicemailViewHolderSet.add(newVoicemailViewHolder); return newVoicemailViewHolder; } @@ -48,10 +59,43 @@ final class NewVoicemailAdapter extends RecyclerView.Adapter<NewVoicemailViewHol LogUtil.i("onBindViewHolder", "position" + position); cursor.moveToPosition(position); viewHolder.bind(cursor); + expandOrCollapseViewHolder(viewHolder); + } + + /** + * Ensures a voicemail {@link NewVoicemailViewHolder} that was expanded and scrolled out of view, + * doesn't have it's corresponding recycled view also expanded. It also ensures than when the + * expanded voicemail is scrolled back into view, it still remains expanded. + * + * @param viewHolder an {@link NewVoicemailViewHolder} that is either expanded or collapsed + */ + private void expandOrCollapseViewHolder(NewVoicemailViewHolder viewHolder) { + if (viewHolder.getViewHolderId() == currentlyExpandedViewHolderId) { + viewHolder.expandViewHolder(); + } else { + viewHolder.collapseViewHolder(); + } } @Override public int getItemCount() { return cursor.getCount(); } + + /** + * We can only have one expanded voicemail view holder. This allows us to ensure that except for + * the currently expanded view holder, all the other view holders visible on the screen are + * collapsed. + * + * @param expandedViewHolder is the view holder that is currently expanded. + */ + @Override + public void onViewHolderExpanded(NewVoicemailViewHolder expandedViewHolder) { + currentlyExpandedViewHolderId = expandedViewHolder.getViewHolderId(); + for (NewVoicemailViewHolder viewHolder : newVoicemailViewHolderSet) { + if (!viewHolder.equals(expandedViewHolder)) { + viewHolder.collapseViewHolder(); + } + } + } } |