package com.prolificinteractive.materialcalendarview;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
/**
* Abstraction layer to help in decorating Day views
*/
public class DayViewFacade {
private boolean isDecorated;
private Drawable backgroundDrawable = null;
private Drawable selectionDrawable = null;
private final LinkedList<Span> spans = new LinkedList<>();
private boolean daysDisabled = false;
DayViewFacade() {
isDecorated = false;
}
/**
* Set a drawable to draw behind everything else
*
* @param drawable Drawable to draw behind everything
*/
public void setBackgroundDrawable(@NonNull Drawable drawable) {
if (drawable == null) {
throw new IllegalArgumentException("Cannot be null");
}
this.backgroundDrawable = drawable;
isDecorated = true;
}
/**
* Set a custom selection drawable
* TODO: define states that can/should be used in StateListDrawables
*
* @param drawable the drawable for selection
*/
public void setSelectionDrawable(@NonNull Drawable drawable) {
if (drawable == null) {
throw new IllegalArgumentException("Cannot be null");
}
selectionDrawable = drawable;
isDecorated = true;
}
/**
* Add a span to the entire text of a day
*
* @param span text span instance
*/
public void addSpan(@NonNull Object span) {
if (spans != null) {
this.spans.add(new Span(span));
isDecorated = true;
}
}
/**
* <p>Set days to be in a disabled state, or re-enabled.</p>
* <p>Note, passing true here will <b>not</b> override minimum and maximum dates, if set.
* This will only re-enable disabled dates.</p>
*
* @param daysDisabled true to disable days, false to re-enable days
*/
public void setDaysDisabled(boolean daysDisabled) {
this.daysDisabled = daysDisabled;
this.isDecorated = true;
}
void reset() {
backgroundDrawable = null;
selectionDrawable = null;
spans.clear();
isDecorated = false;
daysDisabled = false;
}
/**
* Apply things set this to other
*
* @param other facade to apply our data to
*/
void applyTo(DayViewFacade other) {
if (selectionDrawable != null) {
other.setSelectionDrawable(selectionDrawable);
}
if (backgroundDrawable != null) {
other.setBackgroundDrawable(backgroundDrawable);
}
other.spans.addAll(spans);
other.isDecorated |= this.isDecorated;
other.daysDisabled = daysDisabled;
}
boolean isDecorated() {
return isDecorated;
}
Drawable getSelectionDrawable() {
return selectionDrawable;
}
Drawable getBackgroundDrawable() {
return backgroundDrawable;
}
List<Span> getSpans() {
return Collections.unmodifiableList(spans);
}
/**
* Are days from this facade disabled
*
* @return true if disabled, false if not re-enabled
*/
public boolean areDaysDisabled() {
return daysDisabled;
}
static class Span {
final Object span;
public Span(Object span) {
this.span = span;
}
}
}