package com.flounder.fishDiary;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;
import com.flounder.fishDiary.data.Constants;
import com.flounder.fishDiary.data.FishDiary;
public class MyCursorAdapter extends CursorAdapter {
private SpannableStringBuilder mBuilder;
private LayoutInflater mInflater;
private static final String TIME_STAMP_NAME = "yyyy-MM-dd HH:mm";
private static final int SPANNABLE_TITLE = 1;
private static final int SPANNABLE_DATE = 2;
private static final int SPANNABLE_TEXT = 3;
private static final int MAX_LENGTH = 40;
private static final String COLOR_GREY31 = "#FF4F4F4F"; // use for title
private static final String COLOR_BLUE = "#FF4682B4"; // use for timestamp
private static final String COLOR_GREY61 = "#FF9C9C9C"; // use for text
public MyCursorAdapter(Context context) {
super(context, null, false);
mInflater = LayoutInflater.from(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
mBuilder = new SpannableStringBuilder();
final TextView tv = (TextView) view.findViewById(R.id.tv_list_text);
String tagStr = cursor.getString(cursor
.getColumnIndex(FishDiary.Notes.COLUMN_NAME_TAG));
String title = cursor.getString(cursor
.getColumnIndex(FishDiary.Notes.COLUMN_NAME_TITLE));
// Trim whitespace and blank lines
String text = cursor.getString(cursor
.getColumnIndex(FishDiary.Notes.COLUMN_NAME_NOTE)).trim();
int encryptFlag = cursor.getInt(cursor
.getColumnIndex(FishDiary.Notes.COLUMN_NAME_ENCRYTED));
// better use line.separator than "\n"
if (text.split("\n").length > 2) {
// keep the first two lines
text = text.split("\n")[0] + "\n" + text.split("\n")[1] + "...";
} else if (text.length() > MAX_LENGTH) {
text = text.substring(0, MAX_LENGTH) + "...";
}
// Convert millisTime to String format
long lDate = cursor.getLong(cursor
.getColumnIndex(FishDiary.Notes.COLUMN_NAME_MODIFICATION_DATE));
String date = new SimpleDateFormat(TIME_STAMP_NAME).format(new Date(
lDate));
writeSpannableText(title, SPANNABLE_TITLE);
writeSpannableText(date, SPANNABLE_DATE);
String strText = (encryptFlag == 1) ?
context.getString(R.string.hint_encrypted) : text;
writeSpannableText(strText, SPANNABLE_TEXT);
if (!tagStr.equals(""))
writeTag(tagStr);
tv.setText(mBuilder);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return mInflater.inflate(R.layout.list_item, parent, false);
}
private void writeTag(String text) {
String[] tagSelected = text.split(Constants.TAG_SEPERATOR);
// add whitespace at the beginning and the end
// for a better looking tag
for (int i = 0; i < tagSelected.length; i++) {
tagSelected[i] = " " + tagSelected[i] + " ";
}
String tagTotalStr = "";
mBuilder.append("\n"); // add a new line first
int start = mBuilder.length();
for (String str : tagSelected) {
tagTotalStr += (str + " ");
if (tagTotalStr.length() < MAX_LENGTH - 5) {
mBuilder.append(str + " ");
mBuilder.setSpan(
new ForegroundColorSpan(Color.parseColor(COLOR_GREY31)),
start, start + str.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mBuilder.setSpan(new BackgroundColorSpan(Color.LTGRAY), start,
start + str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mBuilder.setSpan(new RelativeSizeSpan(0.9f), start,
start + str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
start += (str + " ").length();
} else {
mBuilder.append("...");
break;
}
}
}
private void writeSpannableText(String text, int flag) {
int start = mBuilder.length();
int end = start + text.length();
mBuilder.append(text + "\n");
switch (flag) {
case SPANNABLE_TITLE:
mBuilder.setSpan(new RelativeSizeSpan(1.1f), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mBuilder.setSpan(
new ForegroundColorSpan(Color.parseColor(COLOR_GREY31)),
start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
break;
case SPANNABLE_DATE:
mBuilder.setSpan(new RelativeSizeSpan(0.9f), start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mBuilder.setSpan(
new ForegroundColorSpan(Color.parseColor(COLOR_BLUE)),
start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
break;
case SPANNABLE_TEXT:
mBuilder.setSpan(
new ForegroundColorSpan(Color.parseColor(COLOR_GREY61)),
start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
break;
}
}
}