content: /*
  * Copyright (C) 2014 The CyanogenMod Project
  *
  * 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.wm.remusic.recent;
  
  import android.content.Context;
  import android.database.Cursor;
  import android.provider.BaseColumns;
  
  import com.wm.remusic.provider.RecentStore;
  
  import java.util.ArrayList;
  
  public class TopTracksLoader extends SongLoader {
  
      public static final int NUMBER_OF_SONGS = 99;
      public static QueryType mQueryType;
      private static Context mContext;
  
      public TopTracksLoader(final Context context, QueryType type) {
          mContext = context;
          mQueryType = type;
      }
  
      public static Cursor getCursor(Context context, QueryType queryType) {
          mQueryType = queryType;
          mContext = context;
          return getCursor();
      }
  
      public static int getCount(Context context, QueryType queryType) {
          Cursor cursor = getCursor(context, queryType);
          if (cursor != null) {
              return cursor.getCount();
          } else {
              return 0;
          }
      }
  
      public static Cursor getCursor() {
          SortedCursor retCursor = null;
          if (mQueryType == QueryType.TopTracks) {
              retCursor = makeTopTracksCursor(mContext);
          } else if (mQueryType == QueryType.RecentSongs) {
              retCursor = makeRecentTracksCursor(mContext);
          }
  
          if (retCursor != null) {
              ArrayList<Long> missingIds = retCursor.getMissingIds();
              if (missingIds != null && missingIds.size() > 0) {
                  for (long id : missingIds) {
                      if (mQueryType == QueryType.TopTracks) {
                          SongPlayCount.getInstance(mContext).removeItem(id);
                      } else if (mQueryType == QueryType.RecentSongs) {
                          RecentStore.getInstance(mContext).removeItem(id);
                      }
                  }
              }
          }
  
          return retCursor;
      }
  
      public static final SortedCursor makeTopTracksCursor(final Context context) {
  
          Cursor songs = SongPlayCount.getInstance(context).getTopPlayedResults(NUMBER_OF_SONGS);
  
          try {
              return makeSortedCursor(context, songs,
                      songs.getColumnIndex(SongPlayCount.SongPlayCountColumns.ID));
          } finally {
              if (songs != null) {
                  songs.close();
                  songs = null;
              }
          }
      }
  
      public static final SortedCursor makeRecentTracksCursor(final Context context) {
  
          Cursor songs = RecentStore.getInstance(context).queryRecentIds(null);
  
          try {
              return makeSortedCursor(context, songs,
                      songs.getColumnIndex(SongPlayCount.SongPlayCountColumns.ID));
          } finally {
              if (songs != null) {
                  songs.close();
                  songs = null;
              }
          }
      }
  
      public static final SortedCursor makeSortedCursor(final Context context, final Cursor cursor,
                                                        final int idColumn) {
          if (cursor != null && cursor.moveToFirst()) {
  
              StringBuilder selection = new StringBuilder();
              selection.append(BaseColumns._ID);
              selection.append(" IN (");
  
              long[] order = new long[cursor.getCount()];
  
              long id = cursor.getLong(idColumn);
              selection.append(id);
              order[cursor.getPosition()] = id;
  
              while (cursor.moveToNext()) {
                  selection.append(",");
  
                  id = cursor.getLong(idColumn);
                  order[cursor.getPosition()] = id;
                  selection.append(String.valueOf(id));
              }
  
              selection.append(")");
  
              Cursor songCursor = makeSongCursor(context, selection.toString(), null);
              if (songCursor != null) {
                  return new SortedCursor(songCursor, order, BaseColumns._ID, null);
              }
          }
  
          return null;
      }
  
  
      public enum QueryType {
          TopTracks,
          RecentSongs,
      }
  }
  