package com.ideabag.playtunes.adapter.search; import com.ideabag.playtunes.adapter.SongListAdapter; import com.ideabag.playtunes.database.MediaQuery; import com.ideabag.playtunes.util.ISearchableAdapter; import android.content.Context; import android.provider.MediaStore; import android.view.View.OnClickListener; public class SearchSongsAdapter extends SongListAdapter implements ISearchableAdapter { private static final String SEPARATORS = ":|;|,|.|-|_|\"|'|\\s|"; public static final String TAG = "SongSearchAdapter"; private int mTruncateAmount; public SearchSongsAdapter( Context context, OnClickListener menuClickListener, String searchTerms, int truncated, MediaQuery.OnQueryCompletedListener listener ) { super(context, menuClickListener); mTruncateAmount = truncated; setOnQueryCompletedListener( listener ); if ( null != searchTerms && searchTerms.length() > 0 ) { setSearchTerms( searchTerms ); } } // // This is where the search query is generated using the SQL LIKE operator, we use a dumb algorithm to determine a 'best' match // If a term is anywhere in the title, artist, or album ('%term%') it gets 3 points, // if a term is at the beginning of the title, artist, or album ('term%') it gets 30 points // if a term is in the title, artist, or album and is preceded by whitespace (' +term%') it gets 9 points // @Override public void setSearchTerms( String searchTerms ) { String[] terms = searchTerms.split( "\\s+" ); String mRelevance = "("; for ( int i = 0, count = terms.length; i < count; i++ ) { String term = terms[ i ]; if ( i > 0 ) { mRelevance += "+"; } mRelevance += "3 * (" + MediaStore.Audio.Media.TITLE + " LIKE '%" + term + "%' )"; mRelevance += "+ 30 * (" + MediaStore.Audio.Media.TITLE + " LIKE '" + term + "%' )"; mRelevance += "+ 9 * (" + MediaStore.Audio.Media.TITLE + " LIKE '% +" + term + "%' )"; mRelevance += "+ (" + MediaStore.Audio.Media.ARTIST + " LIKE '%" + term + "%' )"; mRelevance += "+ 10 * (" + MediaStore.Audio.Media.ARTIST + " LIKE '" + term + "%' )"; mRelevance += "+ 3 * (" + MediaStore.Audio.Media.ARTIST + " LIKE '% +" + term + "%' )"; mRelevance += "+ (" + MediaStore.Audio.Media.ALBUM + " LIKE '%" + term + "%' )"; mRelevance += "+ 10 * (" + MediaStore.Audio.Media.ALBUM + " LIKE '" + term + "%' )"; mRelevance += "+ 3 * (" + MediaStore.Audio.Media.ALBUM + " LIKE '% +" + term + "%' )"; } mRelevance += ") WEIGHT"; String[] songSearchSelection = new String[] { MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM, MediaStore.Audio.Media.TRACK, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID, MediaStore.Audio.Media.ARTIST_ID, mRelevance }; //android.util.Log.i( TAG + "@setQuery", "Weight projection: " + mRelevance ); mQuery = new MediaQuery( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, songSearchSelection, MediaStore.Audio.Media.IS_MUSIC + " != 0 AND WEIGHT > 0", null, "WEIGHT DESC" ); //setMediaQuery( mQuery ); requery(); } @Override public int getCount() { int count = 0; if ( null != mCursor ) { if ( mTruncateAmount <= 0 ) { count = mCursor.getCount(); } else { count = ( mCursor.getCount() > mTruncateAmount ? mTruncateAmount : mCursor.getCount() ); } } return count; } public int hasMore() { return ( mCursor != null && mTruncateAmount > 0 && mCursor.getCount() > mTruncateAmount ? mCursor.getCount() - mTruncateAmount : 0 ); } public void setTruncateAmount( int mAmt ) { mTruncateAmount = mAmt; notifyDataSetChanged(); } }