/*
* Copyright 2013-2015 The GDG Frisbee 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 org.gdg.frisbee.android.pulse;
import android.content.Context;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import org.gdg.frisbee.android.R;
import org.gdg.frisbee.android.api.model.Directory;
import org.gdg.frisbee.android.api.model.Pulse;
import org.gdg.frisbee.android.api.model.PulseEntry;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
import butterknife.BindView;
import butterknife.ButterKnife;
class PulseAdapter extends BaseAdapter {
private final LayoutInflater mInflater;
private final ArrayList<Map.Entry<String, PulseEntry>> mPulse;
@Nullable
private final Directory mDirectory;
private int[] mPositions;
private int mMode;
private boolean mCheckValuesAgainstDirectory;
public PulseAdapter(Context ctx, @Nullable int[] positions, @Nullable Directory directory) {
mInflater = LayoutInflater.from(ctx);
mPulse = new ArrayList<>();
mPositions = positions;
mDirectory = directory;
}
public int[] getPositions() {
return mPositions;
}
@Override
public int getCount() {
return mPulse.size();
}
@Override
public Map.Entry<String, PulseEntry> getItem(int i) {
return mPulse.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
rowView = mInflater.inflate(R.layout.list_pulse_item, parent, false);
ViewHolder viewHolder = new ViewHolder(rowView);
rowView.setTag(viewHolder);
}
ViewHolder holder = (ViewHolder) rowView.getTag();
Map.Entry<String, PulseEntry> entry = getItem(i);
if (i > 0) {
Map.Entry<String, PulseEntry> prevEntry = getItem(i - 1);
int z = 2;
while (entry.getValue().compareTo(mMode, prevEntry.getValue()) == 0 && (i - z) >= 0) {
prevEntry = getItem(i - z);
z++;
}
if (z > 2) {
mPositions[i] = mPositions[mPulse.indexOf(prevEntry)] + 1;
} else {
mPositions[i] = mPositions[i - 1] + 1;
}
holder.position.setText(mPositions[i] + ".");
} else {
mPositions[i] = 1;
holder.position.setText("1.");
}
holder.key.setText(entry.getKey());
switch (mMode) {
case 0:
holder.value.setText("(" + entry.getValue().getMeetings() + ")");
break;
case 1:
holder.value.setText("(" + entry.getValue().getAttendees() + ")");
break;
case 2:
holder.value.setText("(" + entry.getValue().getPlusMembers() + ")");
break;
}
if (mCheckValuesAgainstDirectory && mDirectory != null) {
rowView.setEnabled(mDirectory.getGroupById(entry.getValue().getId()) != null);
holder.key.setEnabled(mDirectory.getGroupById(entry.getValue().getId()) != null);
}
return rowView;
}
public void setPulse(final int mode, Pulse pulse, boolean checkValuesAgainstDirectory) {
mMode = mode;
mCheckValuesAgainstDirectory = checkValuesAgainstDirectory;
mPulse.clear();
mPulse.addAll(pulse.entrySet());
//Only initialize if the positions are not provided.
//They are provided in constructor and coming from savedInstanceState of the Fragment.
if (mPositions == null || mPositions.length != mPulse.size()) {
mPositions = new int[mPulse.size()];
}
Collections.sort(mPulse, new Comparator<Map.Entry<String, PulseEntry>>() {
@Override
public int compare(Map.Entry<String, PulseEntry> entry, Map.Entry<String, PulseEntry> entry2) {
return entry.getValue().compareTo(mode, entry2.getValue());
}
});
}
static class ViewHolder {
@BindView(R.id.position)
public TextView position;
@BindView(R.id.key)
public TextView key;
@BindView(R.id.value)
public TextView value;
public ViewHolder(View v) {
ButterKnife.bind(this, v);
}
}
}