package org.mtransit.android.task; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import org.mtransit.android.commons.CollectionUtils; import org.mtransit.android.commons.TimeUtils; import org.mtransit.android.commons.data.POI; import org.mtransit.android.commons.provider.POIProviderContract; import org.mtransit.android.data.DataSourceManager; import org.mtransit.android.data.DataSourceType; import org.mtransit.android.data.Favorite; import org.mtransit.android.data.POIManager; import org.mtransit.android.provider.FavoriteManager; import android.content.Context; import android.support.v4.util.ArrayMap; public class FavoritesLoader extends MTAsyncTaskLoaderV4<ArrayList<POIManager>> { private static final String TAG = FavoritesLoader.class.getSimpleName(); @Override public String getLogTag() { return TAG; } private ArrayList<POIManager> pois; public FavoritesLoader(Context context) { super(context); } @Override public ArrayList<POIManager> loadInBackgroundMT() { if (this.pois != null) { return this.pois; } this.pois = new ArrayList<POIManager>(); ArrayList<Favorite> favorites = FavoriteManager.findFavorites(getContext()); HashSet<Integer> favoriteFolderIds = new HashSet<Integer>(); HashMap<String, Integer> uuidToFavoriteFolderId = new HashMap<String, Integer>(); if (favorites != null) { for (Favorite favorite : favorites) { uuidToFavoriteFolderId.put(favorite.getFkId(), favorite.getFolderId()); } } ArrayMap<String, HashSet<String>> authorityToUUIDs = splitByAgency(favorites); if (authorityToUUIDs != null && authorityToUUIDs.size() > 0) { for (String authority : authorityToUUIDs.keySet()) { HashSet<String> authorityUUIDs = authorityToUUIDs.get(authority); if (CollectionUtils.getSize(authorityUUIDs) > 0) { ArrayList<POIManager> agencyPOIs = DataSourceManager.findPOIs(getContext(), authority, POIProviderContract.Filter.getNewUUIDsFilter(authorityUUIDs)); if (agencyPOIs != null) { CollectionUtils.sort(agencyPOIs, POIManager.POI_ALPHA_COMPARATOR); this.pois.addAll(agencyPOIs); } } } } CollectionUtils.sort(this.pois, new DataSourceType.POIManagerTypeShortNameComparator(getContext())); for (POIManager poim : this.pois) { Integer favoriteFolderId = uuidToFavoriteFolderId.get(poim.poi.getUUID()); if (favoriteFolderId != null && favoriteFolderId > FavoriteManager.DEFAULT_FOLDER_ID) { poim.poi.setDataSourceTypeId(FavoriteManager.generateFavoriteFolderId(favoriteFolderId)); favoriteFolderIds.add(favoriteFolderId); } } HashMap<Integer, Favorite.Folder> favoriteFoders = FavoriteManager.findFolders(getContext()); if (favoriteFoders != null) { long textMessageId = TimeUtils.currentTimeMillis(); for (Favorite.Folder favoriteFolder : favoriteFoders.values()) { if (favoriteFolder.getId() > FavoriteManager.DEFAULT_FOLDER_ID && !favoriteFolderIds.contains(favoriteFolder.getId())) { this.pois.add(FavoriteManager.getNewEmptyFolder(getContext(), textMessageId++, favoriteFolder.getId())); } } } CollectionUtils.sort(this.pois, new Favorite.FavoriteFolderNameComparator(favoriteFoders)); return this.pois; } public static ArrayMap<String, HashSet<String>> splitByAgency(ArrayList<Favorite> favorites) { ArrayMap<String, HashSet<String>> authorityToUUIDs = new ArrayMap<String, HashSet<String>>(); if (favorites != null) { for (Favorite favorite : favorites) { String uuid = favorite.getFkId(); String authority = POI.POIUtils.extractAuthorityFromUUID(uuid); if (!authorityToUUIDs.containsKey(authority)) { authorityToUUIDs.put(authority, new HashSet<String>()); } authorityToUUIDs.get(authority).add(uuid); } } return authorityToUUIDs; } @Override protected void onStartLoading() { super.onStartLoading(); if (this.pois != null) { deliverResult(this.pois); } if (this.pois == null) { forceLoad(); } } @Override protected void onStopLoading() { super.onStopLoading(); cancelLoad(); } @Override public void deliverResult(ArrayList<POIManager> data) { this.pois = data; if (isStarted()) { super.deliverResult(data); } } }