package yuku.alkitab.base.util;
import android.util.Log;
import com.google.gson.JsonSyntaxException;
import yuku.alkitab.base.App;
public class Highlights {
static final String TAG = Highlights.class.getSimpleName();
final static ThreadLocal<Info> tmpInfo = new ThreadLocal<Info>() {
@Override
protected Info initialValue() {
return new Info();
}
};
final static ThreadLocal<Info.Partial> tmpPartial = new ThreadLocal<Info.Partial>() {
@Override
protected Info.Partial initialValue() {
return new Info.Partial();
}
};
public static class Info {
/** rgb only, without the alpha */
public int colorRgb;
public Partial partial;
public static class Partial {
/** hashCode of the plain text (not with formatting) */
public int hashCode;
public int startOffset;
public int endOffset;
}
public boolean shouldRenderAsPartialForVerseText(final CharSequence verseText) {
return partial != null && partial.hashCode == Highlights.hashCode(verseText.toString()) && partial.startOffset <= verseText.length() && partial.endOffset <= verseText.length();
}
}
/** Encode a full-verse highlight */
public static String encode(final int colorRgb) {
final Info info = tmpInfo.get();
info.colorRgb = colorRgb;
info.partial = null;
return App.getDefaultGson().toJson(info);
}
/** Encode a partial highlight */
public static String encode(final int colorRgb, final int hashCode, final int startOffset, final int endOffset) {
final Info info = tmpInfo.get();
info.colorRgb = colorRgb;
final Info.Partial partial = info.partial = tmpPartial.get();
partial.hashCode = hashCode;
partial.startOffset = startOffset;
partial.endOffset = endOffset;
return App.getDefaultGson().toJson(info);
}
/**
* Decodes color code for highlight. It starts with the string "c" then 6 hex digits rrggbb.
* @return highlight info, or null if cannot decode
*/
public static Info decode(final String text) {
if (text == null) return null;
if (text.length() >= 7 && text.charAt(0) == 'c') { // legacy compat
try {
final int colorRgb = Integer.parseInt(text.substring(1, 7), 16);
final Info res = new Info();
res.colorRgb = colorRgb;
res.partial = null;
return res;
} catch (NumberFormatException e) {
Log.e(TAG, "@@decode", e);
return null;
}
} else if (text.startsWith("{")) { // json format
try {
return App.getDefaultGson().fromJson(text, Info.class);
} catch (JsonSyntaxException e) {
Log.e(TAG, "@@decode", e);
return null;
}
} else {
return null;
}
}
public static int alphaMix(int colorRgb) {
return 0xa0000000 | colorRgb;
}
public static int hashCode(final String verseText) {
return verseText.hashCode();
}
}