/*
* 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.eventseries;
import android.content.Context;
import android.net.Uri;
import android.support.annotation.DrawableRes;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import org.gdg.frisbee.android.Const;
import org.gdg.frisbee.android.R;
import org.gdg.frisbee.android.api.model.Event;
import org.gdg.frisbee.android.api.model.SimpleEvent;
import org.gdg.frisbee.android.utils.Utils;
import org.joda.time.DateTime;
import org.joda.time.LocalDateTime;
import org.joda.time.format.DateTimeFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;
import butterknife.BindView;
import butterknife.ButterKnife;
class EventAdapter extends BaseAdapter {
private static final DateTime DATETIME_NOW = DateTime.now();
private final Context context;
private final Picasso picasso;
private final int mDefaultIcon;
private final LayoutInflater mInflater;
private final ArrayList<Item> mEvents;
public EventAdapter(Context context, Picasso picasso) {
this(context, picasso, R.drawable.icon);
}
public EventAdapter(Context context, Picasso picasso, @DrawableRes int defaultIcon) {
this.context = context;
this.picasso = picasso;
mInflater = LayoutInflater.from(this.context);
mEvents = new ArrayList<>();
mDefaultIcon = defaultIcon;
}
public void addAll(Collection<? extends SimpleEvent> items) {
for (SimpleEvent a : items) {
mEvents.add(new Item(a));
}
notifyDataSetChanged();
}
public void add(SimpleEvent item) {
mEvents.add(new Item(item));
notifyDataSetChanged();
}
@Override
public int getCount() {
return mEvents.size();
}
@Override
public SimpleEvent getItem(int i) {
return mEvents.get(i).getEvent();
}
private Item getItemInternal(int i) {
return mEvents.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ViewHolder holder;
if (convertView != null && convertView.getTag() != null) {
holder = (ViewHolder) convertView.getTag();
} else {
convertView = mInflater.inflate(R.layout.list_event_item, viewGroup, false);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
Item item = getItemInternal(i);
final SimpleEvent event = item.getEvent();
if (event.getIconUrl() != null) {
picasso.load(Const.URL_DEVELOPERS_GOOGLE_COM + event.getIconUrl())
.into(holder.icon);
} else {
holder.icon.setImageResource(mDefaultIcon);
}
holder.eventTitle.setText(event.getTitle());
final LocalDateTime dateTime = event.getStart().toLocalDateTime();
Locale locale = context.getResources().getConfiguration().locale;
holder.eventDate.setText(dateTime.toString(DateTimeFormat.patternForStyle("S-", locale)));
holder.eventTime.setText(dateTime.toString(DateTimeFormat.patternForStyle("-S", locale)));
holder.eventLocation.setText(event.getLocation());
if (event.getStart().isBefore(DATETIME_NOW)) {
holder.past.setVisibility(View.VISIBLE);
} else {
holder.past.setVisibility(View.GONE);
}
// That item will contain a special property that tells if it was freshly retrieved
if (!item.isConsumed()) {
item.setConsumed(true);
// In which case we magically instantiate our effect and launch it directly on the view
Animation animation = AnimationUtils.makeInChildBottomAnimation(context);
convertView.startAnimation(animation);
}
return convertView;
}
private void openEventLink(SimpleEvent event) {
String link = event.getGPlusEventLink();
if (!TextUtils.isEmpty(link)) {
if (!link.startsWith("http")) {
link = "https://" + link;
}
openEventInExternalApp(link);
} else {
link = event.getLink();
if (!TextUtils.isEmpty(link)) {
if (!link.startsWith("http")) {
link = Const.URL_DEVELOPERS_GOOGLE_COM + link;
}
openEventInExternalApp(link);
}
}
}
private void openEventInExternalApp(String uri) {
context.startActivity(Utils.createExternalIntent(context, Uri.parse(uri)));
}
public void sort(Comparator<Item> eventComparator) {
Collections.sort(mEvents, eventComparator);
notifyDataSetChanged();
}
public static class Item {
private SimpleEvent mEvent;
private boolean mConsumed = false;
public Item(SimpleEvent a) {
mEvent = a;
mConsumed = false;
}
public boolean isConsumed() {
return mConsumed;
}
public void setConsumed(boolean mConsumed) {
this.mConsumed = mConsumed;
}
public SimpleEvent getEvent() {
return mEvent;
}
public void setEvent(Event mEvent) {
this.mEvent = mEvent;
}
}
static class ViewHolder {
@BindView(R.id.event_title)
TextView eventTitle;
@BindView(R.id.event_date)
TextView eventDate;
@BindView(R.id.event_time)
TextView eventTime;
@BindView(R.id.event_location)
TextView eventLocation;
@BindView(R.id.past)
TextView past;
@BindView(R.id.icon)
ImageView icon;
// @BindView(R.id.event_image_header) ImageView eventHeader;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
}