package org.freemp.droid.playlist; import android.content.Context; import org.freemp.droid.ClsTrack; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; /** * Created with IntelliJ IDEA. * User: recoilme * Date: 25/11/13 * Time: 13:51 * To change this template use File | Settings | File Templates. */ public abstract class MakePlaylistAbstract { private static final String RECENTLY_ADDED = "RECENTLY_ADDED"; private static final String OTHERS = "OTHERS"; public ArrayList<ClsTrack> allTracks; long t = System.currentTimeMillis(); private ArrayList<ClsTrack> tmpTracks = new ArrayList<ClsTrack>(); private ArrayList<ClsArrTrack> arrTracks = new ArrayList<ClsArrTrack>(); public MakePlaylistAbstract(Context context, boolean refresh) { allTracks = new ArrayList<ClsTrack>(); getAllTracks(context, refresh); //save all tracks //раскомментируй это в тяжелый день //http://developer.android.com/reference/android/provider/MediaStore.Audio.AudioColumns.html //sort descending Collections.sort(allTracks, new Comparator<ClsTrack>() { @Override public int compare(ClsTrack o1, ClsTrack o2) { return o1.getLastModified() > o2.getLastModified() ? -1 : o1.getLastModified() == o2.getLastModified() ? 0 : 1; } }); logTime();//1ms,2,2 tmpTracks.clear(); HashMap<String, Integer> foldersMap = new HashMap<String, Integer>(); HashMap<String, String> artistsMap = new HashMap<String, String>(); //get recently added long firstRecentlyAddedTrack = 0; Iterator<ClsTrack> iterator = allTracks.iterator(); String artistInRecenlyAddedFolder = ""; while (iterator.hasNext()) { ClsTrack playlist = iterator.next(); if (firstRecentlyAddedTrack == 0) firstRecentlyAddedTrack = playlist.getLastModified(); //если трек был добавлен недавно по сравнению с последним добавленным if (firstRecentlyAddedTrack - playlist.getLastModified() <= 1 * 60 * 1000) { //треки добавленные в течение n минут от 1 трека (на реальных данных интервал при копировании порядка 7 секунд) ClsTrack clsTrack = ClsTrack.newInstance(playlist); clsTrack.setGroup(RECENTLY_ADDED); tmpTracks.add(clsTrack); if (!artistInRecenlyAddedFolder.contains(playlist.getArtist())) { if (!artistInRecenlyAddedFolder.equals("")) { artistInRecenlyAddedFolder += ", "; } artistInRecenlyAddedFolder += playlist.getArtist(); } //delete old iterator.remove(); } else { String currFolder = playlist.getFolder(); if (foldersMap.containsKey(currFolder)) { foldersMap.put(currFolder, foldersMap.get(currFolder) + 1); if (!artistsMap.get(currFolder).contains(playlist.getArtist())) { artistsMap.put(currFolder, artistsMap.get(currFolder) + "," + playlist.getArtist()); } } else { foldersMap.put(currFolder, 1); artistsMap.put(currFolder, "" + playlist.getArtist()); } } //Log.w(menu_playlist.getTitle()," :: "+(menu_playlist.getLastModified() - firstRecentlyAddedTrack)); } //Log.w("allTracks:",""+allTracks.size()); logTime();//2,2 arrTracks.clear(); addToTracks(RECENTLY_ADDED, artistInRecenlyAddedFolder); //bigFolders finder //sort by folder name and track number Collections.sort(allTracks, new Comparator<ClsTrack>() { @Override public int compare(ClsTrack lhs, ClsTrack rhs) { return (lhs.getFolder() + (lhs.getArtist())).compareTo(rhs.getFolder() + (rhs.getArtist())); } }); iterator = allTracks.iterator(); String prevFolder = null; while (iterator.hasNext()) { ClsTrack playlist = iterator.next(); String currFolder = playlist.getFolder(); if (prevFolder == null) { prevFolder = currFolder; } else if (!prevFolder.equals(currFolder)) { addToTracks(prevFolder, artistsMap.get(prevFolder)); } playlist.setGroup(artistsMap.get(currFolder)); /* if (foldersMap.get(currFolder)>20) { //add bigfolders ClsTrack clsTrack = ClsTrack.newInstance(menu_playlist); clsTrack.setGroup("BIG_FOLDERS:"+currFolder); tmpTracks.add(clsTrack); //delete old iterator.remove(); prevFolder = currFolder; } else { menu_playlist.setGroup(artistsMap.get(currFolder)); } */ } logTime(); //40,39,70,44 addToTracks(prevFolder, artistsMap.get(prevFolder)); Collections.sort(allTracks, new Comparator<ClsTrack>() { @Override public int compare(ClsTrack lhs, ClsTrack rhs) { return (lhs.getGroup() + lhs.getFolder() + (lhs.getTrack() + 1000)).compareTo(rhs.getGroup() + rhs.getFolder() + (rhs.getTrack() + 1000)); } }); iterator = allTracks.iterator(); prevFolder = null; while (iterator.hasNext()) { ClsTrack playlist = iterator.next(); String currFolder = playlist.getFolder(); if (prevFolder == null) { prevFolder = currFolder; } else if (!prevFolder.equals(currFolder)) { addToTracks(prevFolder, artistsMap.get(prevFolder)); } if (foldersMap.get(currFolder) > 3) { ClsTrack clsTrack = ClsTrack.newInstance(playlist); clsTrack.setGroup(artistsMap.get(currFolder)); tmpTracks.add(clsTrack); prevFolder = currFolder; //delete old iterator.remove(); } } addToTracks(prevFolder, artistsMap.get(prevFolder)); // Others String artistInOthersFolder = ""; iterator = allTracks.iterator(); while (iterator.hasNext()) { ClsTrack playlist = iterator.next(); ClsTrack clsTrack = ClsTrack.newInstance(playlist); clsTrack.setGroup(OTHERS); tmpTracks.add(clsTrack); if (!artistInOthersFolder.contains(playlist.getArtist())) { if (!artistInOthersFolder.equals("")) { artistInOthersFolder += ", "; } artistInOthersFolder += playlist.getArtist(); } } addToTracks(OTHERS, artistInOthersFolder); } public abstract void getAllTracks(Context context, boolean refresh); void addToTracks(String desc, String artists) { if (tmpTracks.size() > 0) { ClsArrTrack clsArrTrack = new ClsArrTrack(); clsArrTrack.setDescription(desc); clsArrTrack.setArtists(artists); clsArrTrack.setPlaylists(tmpTracks); arrTracks.add(clsArrTrack); tmpTracks = new ArrayList<ClsTrack>(); } } void logTime() { //Log.w("time","(ms):"+(System.currentTimeMillis()-t)/1); t = System.currentTimeMillis(); } public ArrayList<ClsArrTrack> getArrTracks() { return arrTracks; } }