package com.florianmski.tracktoid.errors;
import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan;
import android.widget.TextView;
import java.util.HashMap;
import java.util.Map;
import timber.log.Timber;
public class ErrorHandler
{
// TODO maybe cleaner to provide a builder (and for comportment too?)
private boolean reportToUser = true;
private Map<Class, Comportment> handlers = new HashMap<>();
private Comportment defaultComportment = null;
private Context context;
private TextView tv;
public ErrorHandler(Context context)
{
this.context = context;
}
public ErrorHandler(Context context, Comportment defaultComportment)
{
this(context);
this.defaultComportment = defaultComportment;
}
public ErrorHandler(Context context, TextView target, Comportment defaultComportment)
{
this(context, defaultComportment);
this.tv = target;
}
public ErrorHandler reportToUser(boolean reportToUser)
{
this.reportToUser = reportToUser;
return this;
}
public ErrorHandler putComportment(Comportment comportment)
{
handlers.put(comportment.clazz, comportment);
return this;
}
public void handle(Throwable t, String messageIfNotHandled)
{
Comportment comportment = handlers.get(t.getClass());
if(comportment == null || (comportment.func != null && !comportment.func.call(t, comportment)))
{
comportment = defaultComportment;
Timber.e(t, messageIfNotHandled);
}
if(!reportToUser)
return;
// display error in the textview
if(tv != null)
{
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(comportment.userMessage).append("\n");
int start = builder.length();
if(comportment.userActionMessage != null)
{
builder.append(comportment.userActionMessage.toUpperCase());
builder.setSpan(new ForegroundColorSpan(Color.WHITE), start, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new RelativeSizeSpan(0.9f), start, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.setSpan(new TypefaceSpan("sans-serif-condensed"), start, builder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tv.setText(builder);
tv.setOnClickListener(comportment.actionOnTap);
tv.setClickable(comportment.actionOnTap != null);
}
// else display in a toast
else
{
// TODO use snackbar and event bus (rx?) so it can be displayed in the current activity
}
}
}