package io.github.memfis19.cadar.internal.ui.list.adapter.holder;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Handler;
import android.support.v4.content.ContextCompat;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextUtils;
import android.text.format.DateFormat;
import android.text.style.RelativeSizeSpan;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.Target;
import java.text.SimpleDateFormat;
import io.github.memfis19.cadar.R;
import io.github.memfis19.cadar.data.entity.Event;
import io.github.memfis19.cadar.event.OnEventClickListener;
import io.github.memfis19.cadar.internal.ui.events.TimeOutClickListener;
import io.github.memfis19.cadar.internal.ui.list.adapter.decorator.EventDecorator;
import io.github.memfis19.cadar.internal.ui.list.adapter.decorator.factory.EventDecoratorFactory;
import io.github.memfis19.cadar.internal.ui.list.adapter.model.ListItemModel;
import io.github.memfis19.cadar.internal.utils.DateUtils;
import io.github.memfis19.cadar.internal.utils.ViewUtils;
/**
* Created by memfis on 9/5/16.
*/
public class EventHolder extends ListHolder {
private TextView title;
private TextView dayLabel;
private ImageView synchronizeButton;
private TextView indicators;
private TextView eventTime;
private final String DAY_NUMBER_FORMAT = "dd";
private final String WEEK_DAY_FORMAT = "EEE";
private final String TIME_FORMAT = "HH:mm";
private Handler backgroundHandler;
private Handler uiHandler;
private static Drawable serverSyncIcon;
private static Drawable editIndicatorIcon;
private static int syncEditIconsSizePx = 0;
private static int smileSizePx = 0;
private static String allDayLabelText;
private Event event;
private int position;
private EventDecorator eventDecorator;
public EventHolder(View itemView,
Handler backgroundHandler,
Handler uiHandler,
final OnEventClickListener onEventClickListener,
EventDecoratorFactory eventDecoratorFactory) {
super(itemView);
this.backgroundHandler = backgroundHandler;
this.uiHandler = uiHandler;
itemView.setOnClickListener(new TimeOutClickListener() {
@Override
public void onViewClick(View view) {
if (onEventClickListener != null)
onEventClickListener.onEventClick(event, position);
}
});
if (eventDecoratorFactory != null) {
eventDecorator = eventDecoratorFactory.createEventDecorator(itemView);
} else {
if (syncEditIconsSizePx == 0)
syncEditIconsSizePx = ViewUtils.convertDipToPixels(20, itemView.getContext());
if (smileSizePx == 0)
smileSizePx = ViewUtils.convertDipToPixels(24, itemView.getContext());
if (serverSyncIcon == null) {
serverSyncIcon = ContextCompat.getDrawable(itemView.getContext(), R.drawable.item_sync_ico);
double multiplier = (double) serverSyncIcon.getIntrinsicWidth() / serverSyncIcon.getIntrinsicHeight();
serverSyncIcon.setBounds(0, 0, (int) (syncEditIconsSizePx * multiplier), syncEditIconsSizePx);
}
if (editIndicatorIcon == null) {
editIndicatorIcon = ContextCompat.getDrawable(itemView.getContext(), R.drawable.item_edit_ico);
double multiplier = (double) editIndicatorIcon.getIntrinsicWidth() / editIndicatorIcon.getIntrinsicHeight();
editIndicatorIcon.setBounds(0, 0, (int) (syncEditIconsSizePx * multiplier), syncEditIconsSizePx);
}
if (TextUtils.isEmpty(allDayLabelText))
allDayLabelText = itemView.getContext().getResources().getString(R.string.default_all_day_label);
indicators = (TextView) itemView.findViewById(R.id.indicators_owner_synchronize);
title = (TextView) itemView.findViewById(R.id.event_title);
synchronizeButton = (ImageView) itemView.findViewById(R.id.calendar_sync_icon);
dayLabel = (TextView) itemView.findViewById(R.id.day_title);
eventTime = (TextView) itemView.findViewById(R.id.event_time);
if (synchronizeButton != null) {
synchronizeButton.setOnClickListener(new TimeOutClickListener() {
@Override
public void onViewClick(View view) {
if (onEventClickListener != null) {
onEventClickListener.onSyncClick(event, position);
}
}
});
}
}
}
public void bindView(final Event event, final ListItemModel previous, int position) {
if (eventDecorator != null) {
this.event = event;
this.position = position;
eventDecorator.onBindEventView(itemView, event, previous, position);
} else {
this.event = event;
this.position = position;
backgroundHandler.post(new Runnable() {
@Override
public void run() {
final boolean displayDayIndicator;
if (previous != null) {
if (previous.getType() == ListItemModel.EVENT) {
Event before = (Event) previous.getValue();
displayDayIndicator = !DateUtils.isSameDay(event.getEventStartDate(), before.getEventStartDate());
} else {
displayDayIndicator = true;
}
} else {
displayDayIndicator = true;
}
final Spannable dayLabelText;
if (displayDayIndicator) {
String dayNumber = DateFormat.format(DAY_NUMBER_FORMAT, event.getEventStartDate()).toString();
int dayNumberLength = dayNumber.length();
dayLabelText = new SpannableString(dayNumber + "\n" + DateFormat.format(WEEK_DAY_FORMAT, event.getEventStartDate()).toString());
int wholeLength = dayLabelText.length();
dayLabelText.setSpan(new RelativeSizeSpan(0.5f), dayNumberLength, wholeLength, 0);
} else dayLabelText = new SpannableString("");
final Spannable eventTitle = new SpannableString(event.getEventTitle());
uiHandler.post(new Runnable() {
@Override
public void run() {
if (displayDayIndicator) {
EventHolder.this.dayLabel.setVisibility(View.VISIBLE);
EventHolder.this.dayLabel.setText(dayLabelText);
} else EventHolder.this.dayLabel.setVisibility(View.INVISIBLE);
title.setText(eventTitle);
}
});
}
});
//Synchronize button
updateSyncButton();
if (!TextUtils.isEmpty(event.getEventIconUrl())) {
Picasso.with(title.getContext()).load(event.getEventIconUrl()).into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
Drawable drawable = new BitmapDrawable(title.getContext().getResources(), bitmap);
double multiplier = (double) drawable.getIntrinsicWidth() / drawable.getIntrinsicHeight();
drawable.setBounds(0, 0, (int) (smileSizePx * multiplier), smileSizePx);
title.setCompoundDrawables(drawable, null, null, null);
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
} else title.setCompoundDrawables(null, null, null, null);
Drawable sync, edit;
sync = null;
if (event.isEditable()) edit = editIndicatorIcon;
else edit = null;
indicators.setCompoundDrawables(sync, null, edit, null);
SimpleDateFormat timeFormat = new SimpleDateFormat(TIME_FORMAT, DateUtils.getLocale());
if (event.isAllDayEvent()) {
eventTime.setText(allDayLabelText);
} else if (event.getEventEndDate() != null && !event.getEventEndDate().equals(DateUtils.setTimeToEndOfTheDay(event.getEventEndDate()))) {
eventTime.setText(timeFormat.format(event.getEventStartDate()) + " - " +
timeFormat.format(event.getEventEndDate()));
} else eventTime.setText(timeFormat.format(event.getEventStartDate()));
}
}
private void updateSyncButton() {
if (event.getCalendarId() == null || event.getCalendarId() == 0)
if (Build.VERSION.SDK_INT > 10) synchronizeButton.setAlpha(0.4f);
else if (Build.VERSION.SDK_INT > 10) synchronizeButton.setAlpha(1f);
}
}