1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
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>
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) {
this.cursor = cursor;
this.clock = clock;
}
@Override
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, this);
newVoicemailViewHolderSet.add(newVoicemailViewHolder);
return newVoicemailViewHolder;
}
@Override
public void onBindViewHolder(NewVoicemailViewHolder viewHolder, int position) {
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();
}
}
}
}
|