/* * Copyright (C) 2009 Muthu Ramadoss. All rights reserved. * * Modified from Romain Guy Shelves project to suit Books-Exchange requirements. * Original source from Shelves - http://code.google.com/p/shelves/ */ /* * Copyright (C) 2008 Romain Guy * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.androidrocks.bex.activity; import android.widget.CursorAdapter; import android.widget.FilterQueryProvider; import android.widget.TextView; import android.widget.AbsListView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.database.Cursor; import android.database.CharArrayBuffer; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import com.androidrocks.bex.drawable.CrossFadeDrawable; import com.androidrocks.bex.drawable.FastBitmapDrawable; import com.androidrocks.bex.provider.BooksStore; import com.androidrocks.bex.util.ImageUtilities; import com.androidrocks.bex.R; class BooksAdapter extends CursorAdapter implements FilterQueryProvider { private static final String[] PROJECTION_IDS_AND_TITLE = new String[] { BooksStore.Book._ID, BooksStore.Book.INTERNAL_ID, BooksStore.Book.TITLE, BooksStore.Book.SORT_TITLE }; private final LayoutInflater mInflater; private final int mTitleIndex; private final int mSortTitleIndex; private final int mInternalIdIndex; private final String mSelection; private final ShelvesActivity mActivity; private final Bitmap mDefaultCoverBitmap; private final FastBitmapDrawable mDefaultCover; private final String[] mArguments2 = new String[2]; BooksAdapter(ShelvesActivity activity) { super(activity, activity.managedQuery(BooksStore.Book.CONTENT_URI, PROJECTION_IDS_AND_TITLE, null, null, BooksStore.Book.DEFAULT_SORT_ORDER), true); final Cursor c = getCursor(); mActivity = activity; mInflater = LayoutInflater.from(activity); mTitleIndex = c.getColumnIndexOrThrow(BooksStore.Book.TITLE); mSortTitleIndex = c.getColumnIndexOrThrow(BooksStore.Book.SORT_TITLE); mInternalIdIndex = c.getColumnIndexOrThrow(BooksStore.Book.INTERNAL_ID); mDefaultCoverBitmap = BitmapFactory.decodeResource(activity.getResources(), R.drawable.unknown_cover); mDefaultCover = new FastBitmapDrawable(mDefaultCoverBitmap); final StringBuilder selection = new StringBuilder(); selection.append(BooksStore.Book.TITLE); selection.append(" LIKE ? OR "); selection.append(BooksStore.Book.AUTHORS); selection.append(" LIKE ?"); mSelection = selection.toString(); setFilterQueryProvider(this); } FastBitmapDrawable getDefaultCover() { return mDefaultCover; } public View newView(Context context, Cursor cursor, ViewGroup parent) { final TextView view = (TextView) mInflater.inflate(R.layout.shelf_book, parent, false); BookViewHolder holder = new BookViewHolder(); holder.title = view; view.setTag(holder); final CrossFadeDrawable transition = new CrossFadeDrawable(mDefaultCoverBitmap, null); transition.setCallback(view); transition.setCrossFadeEnabled(true); holder.transition = transition; return view; } public void bindView(View view, Context context, Cursor c) { BookViewHolder holder = (BookViewHolder) view.getTag(); String bookId = c.getString(mInternalIdIndex); holder.bookId = bookId; holder.sortTitle = c.getString(mSortTitleIndex); final ShelvesActivity activity = mActivity; if (activity.getScrollState() == AbsListView.OnScrollListener.SCROLL_STATE_FLING || activity.isPendingCoversUpdate()) { holder.title.setCompoundDrawablesWithIntrinsicBounds(null, null, null, mDefaultCover); holder.queryCover = true; } else { holder.title.setCompoundDrawablesWithIntrinsicBounds(null, null, null, ImageUtilities.getCachedCover(bookId, mDefaultCover)); holder.queryCover = false; } final CharArrayBuffer buffer = holder.buffer; c.copyStringToBuffer(mTitleIndex, buffer); final int size = buffer.sizeCopied; if (size != 0) { holder.title.setText(buffer.data, 0, size); } } @Override public void changeCursor(Cursor cursor) { final Cursor oldCursor = getCursor(); if (oldCursor != null) mActivity.stopManagingCursor(oldCursor); super.changeCursor(cursor); } public Cursor runQuery(CharSequence constraint) { if (constraint == null || constraint.length() == 0) { return mActivity.managedQuery(BooksStore.Book.CONTENT_URI, PROJECTION_IDS_AND_TITLE, null, null, BooksStore.Book.DEFAULT_SORT_ORDER); } final StringBuilder buffer = new StringBuilder(); buffer.append('%').append(constraint).append('%'); final String pattern = buffer.toString(); final String[] arguments2 = mArguments2; arguments2[0] = arguments2[1] = pattern; return mActivity.managedQuery(BooksStore.Book.CONTENT_URI, PROJECTION_IDS_AND_TITLE, mSelection, arguments2, BooksStore.Book.DEFAULT_SORT_ORDER); } }