package edu.mit.mitmobile2.facilities;
import edu.mit.mitmobile2.TwoLineActionRow;
import android.content.Context;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.database.MatrixCursor;
import android.database.MergeCursor;
import android.graphics.Color;
import android.text.Spannable;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.FilterQueryProvider;
import android.widget.TextView;
public class RoomSearchCursorAdapter extends CursorAdapter implements FilterQueryProvider {
FacilitiesDB mFacilitiesDB;
private static final String TAG = "LocationsSearchCursorAdapter";
public RoomSearchCursorAdapter(Context context, FacilitiesDB facilitiesDB) {
super(context, null);
mFacilitiesDB = facilitiesDB;
setFilterQueryProvider(this);
}
@Override
public Cursor runQuery(CharSequence constraint) {
Log.d(TAG,"constraint = " + constraint);
String trimmedConstraint = constraint.toString().trim();
if(trimmedConstraint.length() > 0) {
Cursor cursor = mFacilitiesDB.getRoomSearchCursor(trimmedConstraint);
return new RoomSearchFilteredCursor(cursor, trimmedConstraint);
} else {
return null;
}
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TwoLineActionRow actionRow = (TwoLineActionRow) view;
int idIndex = cursor.getColumnIndex(FacilitiesDB.RoomTable._ID);
RoomSearchFilteredCursor filteredCursor = (RoomSearchFilteredCursor) cursor;
long id = cursor.getLong(idIndex);
if (id == -1 ) {
String useMyTextString = "Use '" + filteredCursor.getConstraint() + "'";
actionRow.setTitle(useMyTextString);
return;
}
int titleIndex = cursor.getColumnIndex(FacilitiesDB.RoomTable.ROOM);
String result = cursor.getString(titleIndex);
Spannable title = Spannable.Factory.getInstance().newSpannable(result);
// find substrings matching constraint
int currentIndex = 0;
String constraint = filteredCursor.getConstraint().toLowerCase();
String resultLower = result.toLowerCase();
while(resultLower.indexOf(constraint, currentIndex) >= 0) {
int foundIndex = resultLower.indexOf(constraint, currentIndex);
title.setSpan(new ForegroundColorSpan(Color.RED), foundIndex, foundIndex + constraint.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
currentIndex = foundIndex + constraint.length();
}
actionRow.setTitle(title, TextView.BufferType.SPANNABLE);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return new TwoLineActionRow(context);
}
@Override
public String convertToString(Cursor cursor) {
return "";
}
public static class RoomSearchFilteredCursor extends CursorWrapper {
String mConstraint;
public RoomSearchFilteredCursor(Cursor cursor, String constraint) {
super(cursorWithHeader(cursor));
mConstraint = constraint;
}
public String getConstraint() {
return mConstraint;
}
}
private static Cursor cursorWithHeader(Cursor cursor) {
MatrixCursor header = new MatrixCursor(new String[]{"_id"}, 1);
header.addRow(new Object[] { new Long(-1)});
return new MergeCursor(new Cursor[] {header, cursor});
}
}