/* * TV-Browser for Android * Copyright (C) 2013 René Mach (rene@tvbrowser.org) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to use, copy, modify or merge the Software, * furthermore to publish and distribute the Software free of charge without modifications and to * permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.tvbrowser.filter; import java.util.ArrayList; import android.database.Cursor; import android.database.CursorWrapper; public class FilterCursorWrapper extends CursorWrapper { private Integer[] filterMap = null; private int mPos = -1; private Cursor mCursor; @Override public int getCount() { return filterMap != null ? filterMap.length : super.getCount(); } @Override public boolean moveToPosition(int pos) { boolean moved = false; if(filterMap == null) { moved = super.moveToPosition(pos); } else if(filterMap.length > pos) { moved = super.moveToPosition(filterMap[pos]); } if (moved) mPos = pos; return moved; } @Override public final boolean move(int offset) { return moveToPosition(mPos + offset); } @Override public final boolean moveToFirst() { return moveToPosition(0); } @Override public final boolean moveToLast() { return moveToPosition(getCount() - 1); } @Override public final boolean moveToNext() { return moveToPosition(mPos + 1); } @Override public final boolean moveToPrevious() { return moveToPosition(mPos - 1); } @Override public final boolean isFirst() { return mPos == 0 && getCount() != 0; } @Override public final boolean isLast() { int cnt = getCount(); return mPos == (cnt - 1) && cnt != 0; } @Override public final boolean isBeforeFirst() { if (getCount() == 0) { return true; } return mPos == -1; } @Override public final boolean isAfterLast() { if (getCount() == 0) { return true; } return mPos == getCount(); } @Override public int getPosition() { return mPos; } public FilterCursorWrapper(Cursor cursor) { super(cursor); mCursor = cursor; filterMap = null; mPos = -1; } public void updateFilter(CursorFilter filter) { ArrayList<Integer> newFilterMap = new ArrayList<Integer>(); for(int i = 0; i < super.getCount(); i++) { if(mCursor.moveToNext()) { if(filter.accept(mCursor)) { newFilterMap.add(i); } } } mPos = -1; filterMap = newFilterMap.toArray(new Integer[newFilterMap.size()]); } }