package com.nilhcem.bblfr.ui.baggers.list;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.TextAppearanceSpan;
import com.nilhcem.bblfr.R;
import com.nilhcem.bblfr.core.ui.spannable.CenteredImageSpan;
import com.nilhcem.bblfr.core.utils.CompatibilityUtils;
import com.nilhcem.bblfr.core.utils.NetworkUtils;
import com.nilhcem.bblfr.core.utils.StringUtils;
import com.nilhcem.bblfr.model.baggers.Bagger;
import com.nilhcem.bblfr.model.baggers.Session;
import com.nilhcem.bblfr.model.baggers.Website;
import java.util.List;
import java.util.Locale;
import static android.text.Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
import static com.nilhcem.bblfr.core.utils.CompatibilityUtils.getDrawable;
import static com.nilhcem.bblfr.core.utils.StringUtils.ZERO_WIDTH_SPACE;
import static com.nilhcem.bblfr.core.utils.StringUtils.addLineSeparator;
public class BaggersListEntry implements Parcelable {
public final CharSequence name;
public final CharSequence links;
public final CharSequence sessions;
public final CharSequence bio;
public final CharSequence locations;
public final String pictureUrl;
public final String email;
public BaggersListEntry(Context context, Bagger bagger) {
name = bagger.name;
pictureUrl = NetworkUtils.getAbsoluteUrl(bagger.picture);
links = linksToSpannable(context, bagger.websites, bagger.contacts.twitter);
sessions = sessionsToSpannable(context, bagger.sessions);
bio = htmlTextToSpannable(bagger.bio);
locations = locationsToSpannable(context, bagger.location);
email = toProperEmail(bagger.contacts.mail);
}
private Spanned htmlTextToSpannable(String source) {
if (TextUtils.isEmpty(source)) {
return null;
}
return CompatibilityUtils.fromHtml(source);
}
private Spanned locationsToSpannable(Context context, String location) {
if (TextUtils.isEmpty(location)) {
return null;
}
return htmlTextToSpannable(context.getString(R.string.baggers_list_location, location));
}
private CharSequence sessionsToSpannable(@NonNull Context context, List<Session> sessions) {
SpannableStringBuilder sb = new SpannableStringBuilder();
if (sessions != null) {
Drawable bulletpoint = getDrawable(context, R.drawable.baggers_bulletpoint_ic);
for (Session session : sessions) {
// Title
String title = session.title;
if (!TextUtils.isEmpty(title)) {
addLineSeparator(sb);
int start = addLineSeparator(sb, true);
// Add title (bulletpoint placeholder + title + style)
sb.append(ZERO_WIDTH_SPACE);
sb.append(CompatibilityUtils.fromHtml(title));
sb.setSpan(new TextAppearanceSpan(context, R.style.BaggersSessions_Title), start, sb.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
// Replace the placeholder with the actual image
sb.setSpan(new CenteredImageSpan(bulletpoint), start, start + 1, SPAN_EXCLUSIVE_EXCLUSIVE);
}
// Summary
String summary = session.summary;
if (!TextUtils.isEmpty(summary)) {
int start = addLineSeparator(sb);
sb.append(CompatibilityUtils.fromHtml(summary));
sb.setSpan(new TextAppearanceSpan(context, R.style.BaggersSessions_Summary), start, sb.length(), SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
return sb;
}
private CharSequence linksToSpannable(Context context, List<Website> websites, String twitter) {
SpannableStringBuilder sb = new SpannableStringBuilder();
if (websites != null) {
Drawable icon = getDrawable(context, R.drawable.baggers_link_ic);
for (Website website : websites) {
addLinkToSpannable(sb, icon, StringUtils.createSpannedHtmlLink(website.name, website.url));
}
}
if (!TextUtils.isEmpty(twitter)) {
Drawable icon = getDrawable(context, R.drawable.baggers_twitter_ic);
Spanned text = StringUtils.createSpannedHtmlLink(String.format(Locale.US, "@%s", twitter), NetworkUtils.getTwitterUrl(twitter));
addLinkToSpannable(sb, icon, text);
}
return sb;
}
private void addLinkToSpannable(SpannableStringBuilder sb, Drawable icon, CharSequence text) {
addLineSeparator(sb);
int start = addLineSeparator(sb);
sb.append(ZERO_WIDTH_SPACE);
sb.append(text);
sb.setSpan(new CenteredImageSpan(icon), start, start + 1, SPAN_EXCLUSIVE_EXCLUSIVE);
}
private String toProperEmail(String orig) {
String proper = orig;
if (proper == null) {
proper = "";
}
return proper;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
TextUtils.writeToParcel(name, dest, flags);
TextUtils.writeToParcel(links, dest, flags);
TextUtils.writeToParcel(sessions, dest, flags);
TextUtils.writeToParcel(bio, dest, flags);
TextUtils.writeToParcel(locations, dest, flags);
dest.writeString(pictureUrl);
dest.writeString(email);
}
private BaggersListEntry(Parcel in) {
name = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
links = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
sessions = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
bio = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
locations = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
pictureUrl = in.readString();
email = in.readString();
}
public static final Parcelable.Creator<BaggersListEntry> CREATOR = new Parcelable.Creator<BaggersListEntry>() {
public BaggersListEntry createFromParcel(Parcel source) {
return new BaggersListEntry(source);
}
public BaggersListEntry[] newArray(int size) {
return new BaggersListEntry[size];
}
};
}