/* * 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); } } }