diff --git a/OsmAnd/src/net/osmand/plus/WorldRegion.java b/OsmAnd/src/net/osmand/plus/WorldRegion.java index 1185169b21..888150d54b 100644 --- a/OsmAnd/src/net/osmand/plus/WorldRegion.java +++ b/OsmAnd/src/net/osmand/plus/WorldRegion.java @@ -39,10 +39,7 @@ public class WorldRegion { private List subregions; private List flattenedSubregions; - private boolean purchased; - private boolean isInPurchasedArea; - private MapState mapState = MapState.NOT_DOWNLOADED; public String getRegionId() { return regionId; @@ -76,32 +73,6 @@ public class WorldRegion { return flattenedSubregions; } - public boolean isPurchased() { - return purchased; - } - - public boolean isInPurchasedArea() { - return isInPurchasedArea; - } - - public MapState getMapState() { - return mapState; - } - - public void processNewMapState(MapState mapState) { - switch (this.mapState) { - case NOT_DOWNLOADED: - this.mapState = mapState; - break; - case DOWNLOADED: - if (mapState == MapState.OUTDATED) - this.mapState = mapState; - break; - case OUTDATED: - break; - } - } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -315,9 +286,5 @@ public class WorldRegion { return null; } - public enum MapState { - NOT_DOWNLOADED, - DOWNLOADED, - OUTDATED - } + } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/items/ActiveDownloadsDialogFragment.java b/OsmAnd/src/net/osmand/plus/download/ActiveDownloadsDialogFragment.java similarity index 95% rename from OsmAnd/src/net/osmand/plus/download/items/ActiveDownloadsDialogFragment.java rename to OsmAnd/src/net/osmand/plus/download/ActiveDownloadsDialogFragment.java index 245d05ba96..46bd280d65 100644 --- a/OsmAnd/src/net/osmand/plus/download/items/ActiveDownloadsDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/ActiveDownloadsDialogFragment.java @@ -1,13 +1,9 @@ -package net.osmand.plus.download.items; +package net.osmand.plus.download; import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; import net.osmand.plus.R; -import net.osmand.plus.download.BaseDownloadActivity; -import net.osmand.plus.download.DownloadActivity; -import net.osmand.plus.download.IndexItem; +import net.osmand.plus.download.items.TwoLineWithImagesViewHolder; import android.app.AlertDialog; import android.app.Dialog; import android.graphics.drawable.Drawable; diff --git a/OsmAnd/src/net/osmand/plus/download/BaseDownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/BaseDownloadActivity.java index a1f7ccef76..e3f52689e7 100644 --- a/OsmAnd/src/net/osmand/plus/download/BaseDownloadActivity.java +++ b/OsmAnd/src/net/osmand/plus/download/BaseDownloadActivity.java @@ -3,8 +3,6 @@ package net.osmand.plus.download; import java.lang.ref.WeakReference; import java.text.MessageFormat; import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; import java.util.Set; import net.osmand.access.AccessibleToast; @@ -12,9 +10,7 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.Version; -import net.osmand.plus.WorldRegion; import net.osmand.plus.activities.ActionBarProgressActivity; -import net.osmand.plus.download.items.ItemsListBuilder; import android.app.AlertDialog; import android.app.Dialog; import android.content.ActivityNotFoundException; @@ -30,7 +26,7 @@ import android.widget.Toast; public class BaseDownloadActivity extends ActionBarProgressActivity { protected OsmandSettings settings; - public static DownloadIndexesThread downloadListIndexThread; + private static DownloadIndexesThread downloadListIndexThread; protected Set> fragSet = new HashSet<>(); public static final int MAXIMUM_AVAILABLE_FREE_DOWNLOADS = 10; @@ -65,62 +61,23 @@ public class BaseDownloadActivity extends ActionBarProgressActivity { } - // FIXME - public void onCategorizationFinished() { + @UiThread + public void downloadInProgress() { } @UiThread - public void updateDownloadList() { + public void downloadHasFinished() { } - + @UiThread - public void updateProgress(boolean updateOnlyProgress) { + public void newDownloadIndexes() { } - - public void downloadedIndexes() { - } - - - public void downloadListUpdated() { - } - /////// FIXME - + public OsmandApplication getMyApplication() { return (OsmandApplication) getApplication(); } - public ItemsListBuilder getItemsBuilder() { - return getItemsBuilder("", false); - } - - public ItemsListBuilder getVoicePromptsBuilder() { - return getItemsBuilder("", true); - } - - public ItemsListBuilder getItemsBuilder(String regionId, boolean voicePromptsOnly) { - if (downloadListIndexThread.getResourcesByRegions().size() > 0) { - ItemsListBuilder builder = new ItemsListBuilder(getMyApplication(), regionId, downloadListIndexThread.getResourcesByRegions(), - downloadListIndexThread.getVoiceRecItems(), downloadListIndexThread.getVoiceTTSItems()); - if (!voicePromptsOnly) { - return builder.build(); - } else { - return builder; - } - } else { - return null; - } - } - - public List getIndexItemsByRegion(WorldRegion region) { - if (downloadListIndexThread.getResourcesByRegions().size() > 0) { - return new LinkedList<>(downloadListIndexThread.getResourcesByRegions().get(region).values()); - } else { - return new LinkedList<>(); - } - } - - public void downloadFilesCheck_3_ValidateSpace(final IndexItem... items) { long szLong = 0; int i = 0; @@ -153,7 +110,7 @@ public class BaseDownloadActivity extends ActionBarProgressActivity { private void downloadFileCheck_Final_Run(IndexItem[] items) { downloadListIndexThread.runDownloadFiles(items); - updateProgress(false); + downloadInProgress(); } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java index 918f011029..83514c15c0 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivity.java @@ -20,7 +20,6 @@ import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; import net.osmand.plus.activities.OsmandExpandableListFragment; import net.osmand.plus.activities.TabActivity; import net.osmand.plus.base.BasicProgressAsyncTask; -import net.osmand.plus.download.items.ActiveDownloadsDialogFragment; import net.osmand.plus.download.items.DialogDismissListener; import net.osmand.plus.download.items.RegionItemsFragment; import net.osmand.plus.download.items.SearchDialogFragment; @@ -36,6 +35,7 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.StatFs; +import android.support.annotation.UiThread; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; @@ -71,8 +71,8 @@ public class DownloadActivity extends BaseDownloadActivity implements DialogDism protected void onCreate(Bundle savedInstanceState) { getMyApplication().applyTheme(this); super.onCreate(savedInstanceState); - if (downloadListIndexThread.getCachedIndexFiles() == null || !downloadListIndexThread.isDownloadedFromInternet()) { - downloadListIndexThread.runReloadIndexFiles(); + if (!getDownloadThread().isDownloadedFromInternet()) { + getDownloadThread().runReloadIndexFiles(); } setContentView(R.layout.download); @@ -111,15 +111,11 @@ public class DownloadActivity extends BaseDownloadActivity implements DialogDism } - public Map getIndexActivatedFileNames() { - return downloadListIndexThread != null ? downloadListIndexThread.getIndexActivatedFileNames() : null; - } - @Override protected void onResume() { super.onResume(); getMyApplication().getAppCustomization().resumeActivity(DownloadActivity.class, this); - updateProgress(false); + downloadInProgress(); } @@ -148,24 +144,39 @@ public class DownloadActivity extends BaseDownloadActivity implements DialogDism super.onPause(); getMyApplication().getAppCustomization().pauseActivity(DownloadActivity.class); } - + @Override - public void updateProgress(boolean updateOnlyProgress) { - BasicProgressAsyncTask basicProgressAsyncTask = - downloadListIndexThread.getCurrentRunningTask(); - if (visibleBanner != null) { - final int countedDownloads = downloadListIndexThread.getCountedDownloads(); - visibleBanner.updateProgress(countedDownloads, basicProgressAsyncTask); - } + @UiThread + public void downloadHasFinished() { + + updateBannerInProgress(); if(activeDownloads != null) { - if(updateOnlyProgress) { - activeDownloads.notifyDataSetChanged(); - } else { - activeDownloads.notifyDataSetInvalidated(); - } + activeDownloads.notifyDataSetInvalidated(); } // FIXME //((DownloadActivity) getActivity()).updateDescriptionTextWithSize(getView()); + for (WeakReference ref : fragSet) { + Fragment f = ref.get(); + notifyUpdateDataSetChanged(f); + if (f instanceof UpdatesIndexFragment) { + if (f.isAdded()) { + ((UpdatesIndexFragment) f).updateItemsList(); + } + } else if(f instanceof RegionItemsFragment) { + Fragment innerFragment = ((RegionItemsFragment)f).getChildFragmentManager().findFragmentById(R.id.fragmentContainer); + notifyUpdateDataSetChanged(innerFragment); + + } + } + } + + @Override + @UiThread + public void downloadInProgress() { + updateBannerInProgress(); + if(activeDownloads != null) { + activeDownloads.notifyDataSetChanged(); + } for (WeakReference ref : fragSet) { Fragment f = ref.get(); notifyUpdateDataSetChanged(f); @@ -176,20 +187,18 @@ public class DownloadActivity extends BaseDownloadActivity implements DialogDism } } - @Override - public void updateDownloadList() { - for (WeakReference ref : fragSet) { - Fragment f = ref.get(); - if (f instanceof UpdatesIndexFragment) { - if (f.isAdded()) { - ((UpdatesIndexFragment) f).updateItemsList(); - } - } + + private void updateBannerInProgress() { + BasicProgressAsyncTask basicProgressAsyncTask = getDownloadThread().getCurrentRunningTask(); + if (visibleBanner != null) { + final int countedDownloads = getDownloadThread().getCountedDownloads(); + visibleBanner.updateProgress(countedDownloads, basicProgressAsyncTask); } } - + @Override - public void onCategorizationFinished() { + @UiThread + public void newDownloadIndexes() { for (WeakReference ref : fragSet) { Fragment f = ref.get(); if (f instanceof WorldItemsFragment) { @@ -200,31 +209,19 @@ public class DownloadActivity extends BaseDownloadActivity implements DialogDism if (f.isAdded()) { ((SearchDialogFragment) f).onCategorizationFinished(); } - } - } - } - - - @Override - public void downloadedIndexes() { - for (WeakReference ref : fragSet) { - Fragment f = ref.get(); - if (f instanceof LocalIndexesFragment) { + } else if (f instanceof LocalIndexesFragment) { if (f.isAdded()) { ((LocalIndexesFragment) f).reloadData(); } } } + downloadHasFinished(); } - - public void setActiveDownloads(ActiveDownloadsDialogFragment activeDownloads) { this.activeDownloads = activeDownloads; } - - private void notifyUpdateDataSetChanged(Fragment f) { if (f != null && f.isAdded()) { if(f instanceof OsmandExpandableListFragment) { @@ -247,18 +244,10 @@ public class DownloadActivity extends BaseDownloadActivity implements DialogDism return ((OsmandApplication) getApplication()).getSettings().isLightActionBar(); } - public Map getIndexFileNames() { - return downloadListIndexThread != null ? downloadListIndexThread.getIndexFileNames() : null; - } - - public List getIndexFiles() { - return downloadListIndexThread != null ? downloadListIndexThread.getCachedIndexFiles() : null; - } - public void registerFreeVersionBanner(View view) { visibleBanner = new BannerAndDownloadFreeVersion(view, this); - updateProgress(true); + updateBannerInProgress(); } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java index 0e22d6ed15..b0f09d08e7 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadActivityType.java @@ -1,8 +1,15 @@ package net.osmand.plus.download; -import android.content.Context; -import android.os.Parcel; -import android.os.Parcelable; +import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; + +import java.io.File; +import java.io.IOException; +import java.net.URLEncoder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; import net.osmand.AndroidUtils; import net.osmand.IndexConstants; @@ -15,18 +22,9 @@ import net.osmand.util.Algorithms; import org.xmlpull.v1.XmlPullParser; -import java.io.File; -import java.io.IOException; -import java.net.URLEncoder; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; +import android.content.Context; -import static net.osmand.IndexConstants.BINARY_MAP_INDEX_EXT; - -public class DownloadActivityType implements Parcelable { +public class DownloadActivityType { private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy"); private static Map byTag = new HashMap<>(); @@ -64,7 +62,6 @@ public class DownloadActivityType implements Parcelable { public DownloadActivityType(int stringResource, String tag, int orderIndex) { this.stringResource = stringResource; this.tag = tag; - this.orderIndex = orderIndex; byTag.put(tag, this); iconResource = R.drawable.ic_map; } @@ -371,32 +368,4 @@ public class DownloadActivityType implements Parcelable { return fileName; } - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(this.stringResource); - dest.writeInt(this.iconResource); - dest.writeString(this.tag); - } - - protected DownloadActivityType(Parcel in) { - this.stringResource = in.readInt(); - this.iconResource = in.readInt(); - this.tag = in.readString(); - byTag.put(tag, this); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public DownloadActivityType createFromParcel(Parcel source) { - return new DownloadActivityType(source); - } - - public DownloadActivityType[] newArray(int size) { - return new DownloadActivityType[size]; - } - }; } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java index 1dc12ec2c5..d4cc98574d 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadIndexesThread.java @@ -1,36 +1,23 @@ package net.osmand.plus.download; import java.io.File; -import java.io.FilenameFilter; import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Set; -import java.util.TreeSet; import java.util.concurrent.ConcurrentLinkedQueue; -import net.osmand.Collator; import net.osmand.IndexConstants; -import net.osmand.OsmAndCollator; import net.osmand.PlatformUtil; import net.osmand.access.AccessibleToast; -import net.osmand.map.OsmandRegions; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings.OsmandPreference; import net.osmand.plus.R; import net.osmand.plus.Version; -import net.osmand.plus.WorldRegion; import net.osmand.plus.base.BasicProgressAsyncTask; import net.osmand.plus.download.DownloadFileHelper.DownloadFileShowWarning; -import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetIndexItem; import net.osmand.plus.helpers.DatabaseHelper; import net.osmand.plus.resources.ResourceManager; import net.osmand.util.Algorithms; @@ -57,7 +44,7 @@ public class DownloadIndexesThread { private final static Log LOG = PlatformUtil.getLog(DownloadIndexesThread.class); private final Context ctx; private OsmandApplication app; - private java.text.DateFormat dateFormat; + private BaseDownloadActivity uiActivity = null; private DatabaseHelper dbHelper; private DownloadFileHelper downloadFileHelper; @@ -66,25 +53,15 @@ public class DownloadIndexesThread { private IndexItem currentDownloadingItem = null; private int currentDownloadingItemProgress = 0; - - private DownloadIndexes indexes = new DownloadIndexes(); - public static class DownloadIndexes { - Map> resourcesByRegions = new HashMap<>(); - List voiceRecItems = new LinkedList<>(); - List voiceTTSItems = new LinkedList<>(); - IndexFileList indexFiles = null; - } - private Map indexFileNames = new LinkedHashMap<>(); - private Map indexActivatedFileNames = new LinkedHashMap<>(); - private List itemsToUpdate = new ArrayList<>(); - + private DownloadResources indexes; public DownloadIndexesThread(Context ctx) { this.ctx = ctx; app = (OsmandApplication) ctx.getApplicationContext(); + indexes = new DownloadResources(app); + indexes.initAlreadyLoadedFiles(); downloadFileHelper = new DownloadFileHelper(app); - dateFormat = app.getResourceManager().getDateFormat(); dbHelper = new DatabaseHelper(app); } @@ -93,34 +70,26 @@ public class DownloadIndexesThread { public void setUiActivity(BaseDownloadActivity uiActivity) { this.uiActivity = uiActivity; } - - + @UiThread - private void updateProgressUI(boolean onlyProgress) { + protected void downloadInProgress() { if (uiActivity != null) { - uiActivity.updateProgress(onlyProgress); + uiActivity.downloadInProgress(); } } + @UiThread - private void onCategorizationFinished() { + protected void downloadHasFinished() { if (uiActivity != null) { - uiActivity.onCategorizationFinished(); + uiActivity.downloadHasFinished(); } } @UiThread - private void updateDownloadList() { + protected void newDownloadIndexes() { if (uiActivity != null) { - uiActivity.updateDownloadList(); - } - } - - @UiThread - private void notifyFilesToUpdateChanged() { - List filtered = getCachedIndexFiles(); - if (filtered != null) { - updateDownloadList(); + uiActivity.newDownloadIndexes(); } } @@ -161,164 +130,7 @@ public class DownloadIndexesThread { } return i; } - - - // FIXME - public List getCachedIndexFiles() { - return indexes.indexFiles != null ? indexes.indexFiles.getIndexFiles() : null; - } - - // FIXME - public Map getIndexFileNames() { - return indexFileNames; - } - - // FIXME - public Map getIndexActivatedFileNames() { - return indexActivatedFileNames; - } - - public void updateLoadedFiles() { - Map indexActivatedFileNames = app.getResourceManager().getIndexFileNames(); - listWithAlternatives(dateFormat, app.getAppPath(""), IndexConstants.EXTRA_EXT, - indexActivatedFileNames); - Map indexFileNames = app.getResourceManager().getIndexFileNames(); - listWithAlternatives(dateFormat, app.getAppPath(""), IndexConstants.EXTRA_EXT, - indexFileNames); - app.getAppCustomization().updatedLoadedFiles(indexFileNames, indexActivatedFileNames); - listWithAlternatives(dateFormat, app.getAppPath(IndexConstants.TILES_INDEX_DIR), - IndexConstants.SQLITE_EXT, indexFileNames); - app.getResourceManager().getBackupIndexes(indexFileNames); - this.indexFileNames = indexFileNames; - this.indexActivatedFileNames = indexActivatedFileNames; - //updateFilesToDownload(); - } - - public Map getDownloadedIndexFileNames() { - return indexFileNames; - } - - public boolean isDownloadedFromInternet() { - return indexes.indexFiles != null && indexes.indexFiles.isDownloadedFromInternet(); - } - - public List getItemsToUpdate() { - return itemsToUpdate; - } - - public Map> getResourcesByRegions() { - return indexes.resourcesByRegions; - } - - public List getVoiceRecItems() { - return indexes.voiceRecItems; - } - - public List getVoiceTTSItems() { - return indexes.voiceTTSItems; - } - - private boolean prepareData(List resources, - Map> resourcesByRegions, - List voiceRecItems, List voiceTTSItems) { - List resourcesInRepository; - if (resources != null) { - resourcesInRepository = resources; - } else { - resourcesInRepository = DownloadActivity.downloadListIndexThread.getCachedIndexFiles(); - } - if (resourcesInRepository == null) { - return false; - } - - for (WorldRegion region : app.getWorldRegion().getFlattenedSubregions()) { - processRegion(resourcesInRepository, resourcesByRegions, voiceRecItems, voiceTTSItems, false, region); - } - processRegion(resourcesInRepository, resourcesByRegions, voiceRecItems, voiceTTSItems, true, app.getWorldRegion()); - - final Collator collator = OsmAndCollator.primaryCollator(); - final OsmandRegions osmandRegions = app.getRegions(); - - Collections.sort(voiceRecItems, new Comparator() { - @Override - public int compare(IndexItem lhs, IndexItem rhs) { - return collator.compare(lhs.getVisibleName(app.getApplicationContext(), osmandRegions), - rhs.getVisibleName(app.getApplicationContext(), osmandRegions)); - } - }); - - Collections.sort(voiceTTSItems, new Comparator() { - @Override - public int compare(IndexItem lhs, IndexItem rhs) { - return collator.compare(lhs.getVisibleName(app.getApplicationContext(), osmandRegions), - rhs.getVisibleName(app.getApplicationContext(), osmandRegions)); - } - }); - - return true; - } - - // FIXME argument list - private void processRegion(List resourcesInRepository, Map> resourcesByRegions, - List voiceRecItems, List voiceTTSItems, - boolean processVoiceFiles, WorldRegion region) { - String downloadsIdPrefix = region.getDownloadsIdPrefix(); - Map regionResources = new HashMap<>(); - Set typesSet = new TreeSet<>(new Comparator() { - @Override - public int compare(DownloadActivityType dat1, DownloadActivityType dat2) { - return dat1.getTag().compareTo(dat2.getTag()); - } - }); - for (IndexItem resource : resourcesInRepository) { - if (processVoiceFiles) { - if (resource.getSimplifiedFileName().endsWith(".voice.zip")) { - voiceRecItems.add(resource); - continue; - } else if (resource.getSimplifiedFileName().contains(".ttsvoice.zip")) { - voiceTTSItems.add(resource); - continue; - } - } - if (!resource.getSimplifiedFileName().startsWith(downloadsIdPrefix)) { - continue; - } - - if (resource.type == DownloadActivityType.NORMAL_FILE - || resource.type == DownloadActivityType.ROADS_FILE) { - if (resource.isAlreadyDownloaded(indexFileNames)) { - region.processNewMapState(checkIfItemOutdated(resource) - ? WorldRegion.MapState.OUTDATED : WorldRegion.MapState.DOWNLOADED); - } else { - region.processNewMapState(WorldRegion.MapState.NOT_DOWNLOADED); - } - } - typesSet.add(resource.getType()); - regionResources.put(resource.getSimplifiedFileName(), resource); - } - - if (region.getSuperregion() != null && region.getSuperregion().getSuperregion() != app.getWorldRegion()) { - if (region.getSuperregion().getResourceTypes() == null) { - region.getSuperregion().setResourceTypes(typesSet); - } else { - region.getSuperregion().getResourceTypes().addAll(typesSet); - } - } - - region.setResourceTypes(typesSet); - resourcesByRegions.put(region, regionResources); - } - - - private boolean checkRunning() { - if (getCurrentRunningTask() != null) { - AccessibleToast.makeText(app, R.string.wait_current_task_finished, Toast.LENGTH_SHORT).show(); - return true; - } - return false; - } - + public void runReloadIndexFiles() { if (checkRunning()) { return; @@ -348,76 +160,11 @@ public class DownloadIndexesThread { } } - private

void execute(BasicProgressAsyncTask task, P... indexItems) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, indexItems); - } else { - task.execute(indexItems); - } + + public boolean isDownloadedFromInternet() { + return indexes.isDownloadedFromInternet; } - - private void prepareFilesToUpdate() { - List filtered = getCachedIndexFiles(); - if (filtered != null) { - itemsToUpdate.clear(); - for (IndexItem item : filtered) { - boolean outdated = checkIfItemOutdated(item); - //include only activated files here - if (outdated && indexActivatedFileNames.containsKey(item.getTargetFileName())) { - itemsToUpdate.add(item); - } - } - } - } - - - public boolean checkIfItemOutdated(IndexItem item) { - boolean outdated = false; - String sfName = item.getTargetFileName(); - java.text.DateFormat format = app.getResourceManager().getDateFormat(); - String date = item.getDate(format); - String indexactivateddate = indexActivatedFileNames.get(sfName); - String indexfilesdate = indexFileNames.get(sfName); - if (date != null && - !date.equals(indexactivateddate) && - !date.equals(indexfilesdate)) { - if ((item.getType() == DownloadActivityType.NORMAL_FILE && !item.extra) || - item.getType() == DownloadActivityType.ROADS_FILE || - item.getType() == DownloadActivityType.WIKIPEDIA_FILE || - item.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) { - outdated = true; - } else { - long itemSize = item.getContentSize(); - long oldItemSize = 0; - if (item.getType() == DownloadActivityType.VOICE_FILE) { - if (item instanceof AssetIndexItem) { - File file = new File(((AssetIndexItem) item).getDestFile()); - oldItemSize = file.length(); - } else { - File fl = new File(item.getType().getDownloadFolder(app, item), sfName + "/_config.p"); - if (fl.exists()) { - oldItemSize = fl.length(); - try { - InputStream is = ctx.getAssets().open("voice/" + sfName + "/config.p"); - if (is != null) { - itemSize = is.available(); - is.close(); - } - } catch (IOException e) { - } - } - } - } else { - oldItemSize = app.getAppPath(item.getTargetFileName()).length(); - } - if (itemSize != oldItemSize) { - outdated = true; - } - } - } - return outdated; - } - + public IndexItem getCurrentDownloadingItem() { return currentDownloadingItem; } @@ -440,6 +187,7 @@ public class DownloadIndexesThread { return null; } + @SuppressWarnings("deprecation") public double getAvailableSpace() { File dir = app.getAppPath("").getParentFile(); double asz = -1; @@ -449,44 +197,29 @@ public class DownloadIndexesThread { } return asz; } + + /// PRIVATE IMPL - - public Map listWithAlternatives(final java.text.DateFormat dateFormat, File file, final String ext, - final Map files) { - if (file.isDirectory()) { - file.list(new FilenameFilter() { - @Override - public boolean accept(File dir, String filename) { - if (filename.endsWith(ext)) { - String date = dateFormat.format(findFileInDir(new File(dir, filename)).lastModified()); - files.put(filename, date); - return true; - } else { - return false; - } - } - }); - + private boolean checkRunning() { + if (getCurrentRunningTask() != null) { + AccessibleToast.makeText(app, R.string.wait_current_task_finished, Toast.LENGTH_SHORT).show(); + return true; } - return files; + return false; } - public File findFileInDir(File file) { - if(file.isDirectory()) { - File[] lf = file.listFiles(); - if(lf != null) { - for(File f : lf) { - if(f.isFile()) { - return f; - } - } - } + @SuppressWarnings("unchecked") + private

void execute(BasicProgressAsyncTask task, P... indexItems) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, indexItems); + } else { + task.execute(indexItems); } - return file; } - public class ReloadIndexesTask extends BasicProgressAsyncTask { + + private class ReloadIndexesTask extends BasicProgressAsyncTask { public ReloadIndexesTask(Context ctx) { super(ctx); @@ -500,31 +233,26 @@ public class DownloadIndexesThread { } @Override - protected DownloadIndexes doInBackground(Void... params) { - DownloadIndexes result = new DownloadIndexes(); - IndexFileList indexFileList = DownloadOsmandIndexesHelper.getIndexesList(ctx); - result.indexFiles = indexFileList; + protected DownloadResources doInBackground(Void... params) { + DownloadResources result = new DownloadResources(app); + DownloadOsmandIndexesHelper.IndexFileList indexFileList = DownloadOsmandIndexesHelper.getIndexesList(ctx); if (indexFileList != null) { - updateLoadedFiles(); - prepareFilesToUpdate(); - prepareData(indexFileList.getIndexFiles(), result.resourcesByRegions, result.voiceRecItems, result.voiceTTSItems); + result.isDownloadedFromInternet = indexFileList.isDownloadedFromInternet(); + result.mapVersionIsIncreased = indexFileList.isIncreasedMapVersion(); + result.prepareData(indexFileList.getIndexFiles()); } return result; } - protected void onPostExecute(DownloadIndexes result) { + protected void onPostExecute(DownloadResources result) { indexes = result; - if (result.indexFiles != null) { - if (result.indexFiles.isIncreasedMapVersion()) { - showWarnDialog(); - } - } else { + if (result.mapVersionIsIncreased) { + showWarnDialog(); + } else if (!result.isDownloadedFromInternet) { AccessibleToast.makeText(ctx, R.string.list_index_files_was_not_loaded, Toast.LENGTH_LONG).show(); } currentRunningTask.remove(this); - notifyFilesToUpdateChanged(); - updateProgressUI(false); - onCategorizationFinished(); + newDownloadIndexes(); } private void showWarnDialog() { @@ -552,31 +280,12 @@ public class DownloadIndexesThread { @Override protected void updateProgress(boolean updateOnlyProgress, Void tag) { - updateProgressUI(true); + downloadInProgress(); } } - //FIXME - private void updateFilesToUpdate() { - List stillUpdate = new ArrayList(); - for (IndexItem item : itemsToUpdate) { - String sfName = item.getTargetFileName(); - java.text.DateFormat format = app.getResourceManager().getDateFormat(); - String date = item.getDate(format); - String indexactivateddate = indexActivatedFileNames.get(sfName); - String indexfilesdate = indexFileNames.get(sfName); - if (date != null && - !date.equals(indexactivateddate) && - !date.equals(indexfilesdate) && - indexActivatedFileNames.containsKey(sfName)) { - stillUpdate.add(item); - } - } - itemsToUpdate = stillUpdate; - } - - public class DownloadIndexesAsyncTask extends BasicProgressAsyncTask implements DownloadFileShowWarning { + private class DownloadIndexesAsyncTask extends BasicProgressAsyncTask implements DownloadFileShowWarning { private OsmandPreference downloads; @@ -598,7 +307,6 @@ public class DownloadIndexesThread { protected void onProgressUpdate(Object... values) { for (Object o : values) { if (o instanceof IndexItem) { - updateProgressUI(false); IndexItem item = (IndexItem) o; String name = item.getBasename(); long count = dbHelper.getCount(name, DatabaseHelper.DOWNLOAD_ENTRY) + 1; @@ -616,9 +324,9 @@ public class DownloadIndexesThread { AccessibleToast.makeText(ctx, message, Toast.LENGTH_LONG).show(); } } - updateProgressUI(false); } } + downloadInProgress(); super.onProgressUpdate(values); } @@ -648,9 +356,8 @@ public class DownloadIndexesThread { } } currentRunningTask.remove(this); - notifyFilesToUpdateChanged(); - updateFilesToUpdate(); - updateProgressUI(false); + downloadHasFinished(); + indexes.updateFilesToUpdate(); } @@ -698,7 +405,6 @@ public class DownloadIndexesThread { currentDownloadingItemProgress = 0; } String warn = reindexFiles(filesToReindex); - updateLoadedFiles(); return warn; } catch (InterruptedException e) { LOG.info("Download Interrupted"); @@ -803,7 +509,7 @@ public class DownloadIndexesThread { @Override protected void updateProgress(boolean updateOnlyProgress, IndexItem tag) { currentDownloadingItemProgress = getProgressPercentage(); - updateProgressUI(true); + downloadInProgress(); } } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java index ba1cee8752..513d9da551 100644 --- a/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java +++ b/OsmAnd/src/net/osmand/plus/download/DownloadOsmandIndexesHelper.java @@ -1,11 +1,13 @@ package net.osmand.plus.download; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.Serializable; import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,9 +34,81 @@ import android.content.res.AssetManager; public class DownloadOsmandIndexesHelper { private final static Log log = PlatformUtil.getLog(DownloadOsmandIndexesHelper.class); + public static class IndexFileList implements Serializable { + private static final long serialVersionUID = 1L; + + private boolean downloadedFromInternet = false; + IndexItem basemap; + ArrayList indexFiles = new ArrayList(); + private String mapversion; + + private Comparator comparator = new Comparator(){ + @Override + public int compare(IndexItem o1, IndexItem o2) { + String object1 = o1.getFileName(); + String object2 = o2.getFileName(); + if(object1.endsWith(IndexConstants.ANYVOICE_INDEX_EXT_ZIP)){ + if(object2.endsWith(IndexConstants.ANYVOICE_INDEX_EXT_ZIP)){ + return object1.compareTo(object2); + } else { + return -1; + } + } else if(object2.endsWith(IndexConstants.ANYVOICE_INDEX_EXT_ZIP)){ + return 1; + } + return object1.compareTo(object2); + } + }; + + public void setDownloadedFromInternet(boolean downloadedFromInternet) { + this.downloadedFromInternet = downloadedFromInternet; + } + + public boolean isDownloadedFromInternet() { + return downloadedFromInternet; + } + + public void setMapVersion(String mapversion) { + this.mapversion = mapversion; + } + + public void add(IndexItem indexItem) { + indexFiles.add(indexItem); + if(indexItem.getFileName().toLowerCase().startsWith("world_basemap")) { + basemap = indexItem; + } + } + + public void sort(){ + Collections.sort(indexFiles, comparator); + } + + public boolean isAcceptable() { + return (indexFiles != null && !indexFiles.isEmpty()) || (mapversion != null); + } + + public List getIndexFiles() { + return indexFiles; + } + + public IndexItem getBasemap() { + return basemap; + } + + public boolean isIncreasedMapVersion() { + try { + int mapVersionInList = Integer.parseInt(mapversion); + return IndexConstants.BINARY_MAP_VERSION < mapVersionInList; + } catch (NumberFormatException e) { + //ignore this... + } + return false; + } + + } public static IndexFileList getIndexesList(Context ctx) { - PackageManager pm =ctx.getPackageManager(); + PackageManager pm = ctx.getPackageManager(); AssetManager amanager = ctx.getAssets(); IndexFileList result = downloadIndexesListFromInternet((OsmandApplication) ctx.getApplicationContext()); if (result == null) { @@ -42,7 +116,7 @@ public class DownloadOsmandIndexesHelper { } else { result.setDownloadedFromInternet(true); } - //add all tts files from assets + // add all tts files from assets listVoiceAssets(result, amanager, pm, ((OsmandApplication) ctx.getApplicationContext()).getSettings()); return result; } diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java b/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java new file mode 100644 index 0000000000..f7bed5b604 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResourceGroup.java @@ -0,0 +1,91 @@ +package net.osmand.plus.download; + +import java.util.ArrayList; +import java.util.List; + +import net.osmand.plus.WorldRegion; + +public class DownloadResourceGroup { + + private final DownloadResourceGroupType type; + private final DownloadResourceGroup parentGroup; + // ASSERT: individualResources are not empty if and only if groups are empty + private final List individualResources; + private final List groups; + protected final String id; + + protected WorldRegion region; + + public enum DownloadResourceGroupType { + WORLD, VOICE, WORLD_MAPS, REGION + + } + + public DownloadResourceGroup(DownloadResourceGroup parentGroup, DownloadResourceGroupType type, String id, + boolean flat) { + if (flat) { + this.individualResources = new ArrayList(); + this.groups = null; + } else { + this.individualResources = null; + this.groups = new ArrayList(); + } + this.id = id; + this.type = type; + this.parentGroup = parentGroup; + } + + public String getGroupId() { + return id; + } + + public boolean flatGroup() { + return individualResources != null; + } + + public DownloadResourceGroup getParentGroup() { + return parentGroup; + } + + public DownloadResources getRoot() { + if (this instanceof DownloadResources) { + return (DownloadResources) this; + } else if (parentGroup != null) { + return parentGroup.getRoot(); + } + return null; + } + + public DownloadResourceGroupType getType() { + return type; + } + + public DownloadResourceGroup getGroupById(String uid) { + String[] lst = uid.split("\\#"); + return getGroupById(lst, 0); + } + + private DownloadResourceGroup getGroupById(String[] lst, int subInd) { + if (lst.length > subInd && lst[subInd].equals(id)) { + if (lst.length == subInd + 1) { + return this; + } else if (groups != null) { + for (DownloadResourceGroup rg : groups) { + DownloadResourceGroup r = rg.getGroupById(lst, subInd + 1); + if (r != null) { + return r; + } + } + } + } + return null; + } + + public String getUniqueId() { + if (parentGroup == null) { + return id; + } + return parentGroup.getUniqueId() + "#" + id; + } + +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/DownloadResources.java b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java new file mode 100644 index 0000000000..9fb9372724 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/download/DownloadResources.java @@ -0,0 +1,464 @@ +package net.osmand.plus.download; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.text.Collator; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import android.content.Context; +import net.osmand.IndexConstants; +import net.osmand.OsmAndCollator; +import net.osmand.PlatformUtil; +import net.osmand.map.OsmandRegions; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.OsmandPlugin; +import net.osmand.plus.R; +import net.osmand.plus.WorldRegion; +import net.osmand.plus.download.DownloadOsmandIndexesHelper.AssetIndexItem; +import net.osmand.plus.download.items.DownloadIndexes; +import net.osmand.plus.download.items.ItemsListBuilder; +import net.osmand.plus.download.items.ResourceItem; +import net.osmand.plus.download.items.ResourceItemComparator; +import net.osmand.plus.download.items.ItemsListBuilder.VoicePromptsType; +import net.osmand.plus.srtmplugin.SRTMPlugin; +import net.osmand.util.Algorithms; + +public class DownloadResources extends DownloadResourceGroup { + public boolean isDownloadedFromInternet = false; + public boolean mapVersionIsIncreased = false; + public OsmandApplication app; + private Map indexFileNames = new LinkedHashMap<>(); + private Map indexActivatedFileNames = new LinkedHashMap<>(); + private List itemsToUpdate = new ArrayList<>(); + + public DownloadResources(OsmandApplication app) { + super(null, DownloadResourceGroupType.WORLD, "", false); + this.region = app.getWorldRegion(); + this.app = app; + } + + public void initAlreadyLoadedFiles() { + java.text.DateFormat dateFormat = app.getResourceManager().getDateFormat(); + Map indexActivatedFileNames = app.getResourceManager().getIndexFileNames(); + listWithAlternatives(dateFormat, app.getAppPath(""), IndexConstants.EXTRA_EXT, indexActivatedFileNames); + Map indexFileNames = app.getResourceManager().getIndexFileNames(); + listWithAlternatives(dateFormat, app.getAppPath(""), IndexConstants.EXTRA_EXT, indexFileNames); + app.getAppCustomization().updatedLoadedFiles(indexFileNames, indexActivatedFileNames); + listWithAlternatives(dateFormat, app.getAppPath(IndexConstants.TILES_INDEX_DIR), IndexConstants.SQLITE_EXT, + indexFileNames); + app.getResourceManager().getBackupIndexes(indexFileNames); + this.indexFileNames = indexFileNames; + this.indexActivatedFileNames = indexActivatedFileNames; + prepareFilesToUpdate(); + } + + public boolean checkIfItemOutdated(IndexItem item) { + boolean outdated = false; + String sfName = item.getTargetFileName(); + java.text.DateFormat format = app.getResourceManager().getDateFormat(); + String date = item.getDate(format); + String indexactivateddate = indexActivatedFileNames.get(sfName); + String indexfilesdate = indexFileNames.get(sfName); + if (date != null && !date.equals(indexactivateddate) && !date.equals(indexfilesdate)) { + if ((item.getType() == DownloadActivityType.NORMAL_FILE && !item.extra) + || item.getType() == DownloadActivityType.ROADS_FILE + || item.getType() == DownloadActivityType.WIKIPEDIA_FILE + || item.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) { + outdated = true; + } else { + long itemSize = item.getContentSize(); + long oldItemSize = 0; + if (item.getType() == DownloadActivityType.VOICE_FILE) { + if (item instanceof AssetIndexItem) { + File file = new File(((AssetIndexItem) item).getDestFile()); + oldItemSize = file.length(); + } else { + File fl = new File(item.getType().getDownloadFolder(app, item), sfName + "/_config.p"); + if (fl.exists()) { + oldItemSize = fl.length(); + try { + InputStream is = app.getAssets().open("voice/" + sfName + "/config.p"); + if (is != null) { + itemSize = is.available(); + is.close(); + } + } catch (IOException e) { + } + } + } + } else { + oldItemSize = app.getAppPath(item.getTargetFileName()).length(); + } + if (itemSize != oldItemSize) { + outdated = true; + } + } + } + return outdated; + } + + + + protected void updateFilesToUpdate() { + List stillUpdate = new ArrayList(); + for (IndexItem item : itemsToUpdate) { + String sfName = item.getTargetFileName(); + java.text.DateFormat format = app.getResourceManager().getDateFormat(); + String date = item.getDate(format); + String indexactivateddate = indexActivatedFileNames.get(sfName); + String indexfilesdate = indexFileNames.get(sfName); + if (date != null && !date.equals(indexactivateddate) && !date.equals(indexfilesdate) + && indexActivatedFileNames.containsKey(sfName)) { + stillUpdate.add(item); + } + } + itemsToUpdate = stillUpdate; + } + + private Map listWithAlternatives(final java.text.DateFormat dateFormat, File file, + final String ext, final Map files) { + if (file.isDirectory()) { + file.list(new FilenameFilter() { + @Override + public boolean accept(File dir, String filename) { + if (filename.endsWith(ext)) { + String date = dateFormat.format(findFileInDir(new File(dir, filename)).lastModified()); + files.put(filename, date); + return true; + } else { + return false; + } + } + }); + + } + return files; + } + + private File findFileInDir(File file) { + if (file.isDirectory()) { + File[] lf = file.listFiles(); + if (lf != null) { + for (File f : lf) { + if (f.isFile()) { + return f; + } + } + } + } + return file; + } + + + + ////////// FIXME //////////// + + private void prepareFilesToUpdate() { + List filtered = getCachedIndexFiles(); + if (filtered != null) { + itemsToUpdate.clear(); + for (IndexItem item : filtered) { + boolean outdated = checkIfItemOutdated(item); + // include only activated files here + if (outdated && indexActivatedFileNames.containsKey(item.getTargetFileName())) { + itemsToUpdate.add(item); + } + } + } + } + + private void processRegion(List resourcesInRepository, DownloadResources di, + boolean processVoiceFiles, WorldRegion region) { + String downloadsIdPrefix = region.getDownloadsIdPrefix(); + Map regionResources = new HashMap<>(); + Set typesSet = new TreeSet<>(new Comparator() { + @Override + public int compare(DownloadActivityType dat1, DownloadActivityType dat2) { + return dat1.getTag().compareTo(dat2.getTag()); + } + }); + for (IndexItem resource : resourcesInRepository) { + if (processVoiceFiles) { + if (resource.getSimplifiedFileName().endsWith(".voice.zip")) { + voiceRecItems.add(resource); + continue; + } else if (resource.getSimplifiedFileName().contains(".ttsvoice.zip")) { + voiceTTSItems.add(resource); + continue; + } + } + if (!resource.getSimplifiedFileName().startsWith(downloadsIdPrefix)) { + continue; + } + + if (resource.type == DownloadActivityType.NORMAL_FILE + || resource.type == DownloadActivityType.ROADS_FILE) { + if (resource.isAlreadyDownloaded(indexFileNames)) { + region.processNewMapState(checkIfItemOutdated(resource) + ? WorldRegion.MapState.OUTDATED : WorldRegion.MapState.DOWNLOADED); + } else { + region.processNewMapState(WorldRegion.MapState.NOT_DOWNLOADED); + } + } + typesSet.add(resource.getType()); + regionResources.put(resource.getSimplifiedFileName(), resource); + } + + if (region.getSuperregion() != null && region.getSuperregion().getSuperregion() != app.getWorldRegion()) { + if (region.getSuperregion().getResourceTypes() == null) { + region.getSuperregion().setResourceTypes(typesSet); + } else { + region.getSuperregion().getResourceTypes().addAll(typesSet); + } + } + + region.setResourceTypes(typesSet); + resourcesByRegions.put(region, regionResources); + } + + protected boolean prepareData(List resources) { + for (WorldRegion region : app.getWorldRegion().getFlattenedSubregions()) { + processRegion(resourcesInRepository, di, false, region); + } + processRegion(resourcesInRepository, di, true, app.getWorldRegion()); + + final net.osmand.Collator collator = OsmAndCollator.primaryCollator(); + final OsmandRegions osmandRegions = app.getRegions(); + + Collections.sort(di.voiceRecItems, new Comparator() { + @Override + public int compare(IndexItem lhs, IndexItem rhs) { + return collator.compare(lhs.getVisibleName(app.getApplicationContext(), osmandRegions), + rhs.getVisibleName(app.getApplicationContext(), osmandRegions)); + } + }); + + Collections.sort(di.voiceTTSItems, new Comparator() { + @Override + public int compare(IndexItem lhs, IndexItem rhs) { + return collator.compare(lhs.getVisibleName(app.getApplicationContext(), osmandRegions), + rhs.getVisibleName(app.getApplicationContext(), osmandRegions)); + } + }); + initAlreadyLoadedFiles(); + return true; + } + + + public class ItemsListBuilder { + + //public static final String WORLD_BASEMAP_KEY = "world_basemap.obf.zip"; + public static final String WORLD_SEAMARKS_KEY = "world_seamarks_basemap.obf.zip"; + private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(ItemsListBuilder.class); + + private DownloadIndexes downloadIndexes; + + private List regionMapItems; + private List allResourceItems; + private List allSubregionItems; + + private OsmandApplication app; + private WorldRegion region; + + private boolean srtmDisabled; + private boolean hasSrtm; + private boolean hasHillshade; + + public List getRegionMapItems() { + return regionMapItems; + } + + public List getAllResourceItems() { + return allResourceItems; + } + + public List getRegionsFromAllItems() { + List list = new LinkedList<>(); + for (Object obj : allResourceItems) { + if (obj instanceof WorldRegion) { + list.add((WorldRegion) obj); + } + } + return list; + } + + public static String getVoicePromtName(Context ctx, VoicePromptsType type) { + switch (type) { + case RECORDED: + return ctx.getResources().getString(R.string.index_name_voice); + case TTS: + return ctx.getResources().getString(R.string.index_name_tts_voice); + default: + return ""; + } + } + + public List getVoicePromptsItems(VoicePromptsType type) { + switch (type) { + case RECORDED: + return downloadIndexes.voiceRecItems; + case TTS: + return downloadIndexes.voiceTTSItems; + default: + return new LinkedList<>(); + } + } + + public boolean isVoicePromptsItemsEmpty(VoicePromptsType type) { + switch (type) { + case RECORDED: + return downloadIndexes.voiceRecItems.isEmpty(); + case TTS: + return downloadIndexes.voiceTTSItems.isEmpty(); + default: + return true; + } + } + + // FIXME + public ItemsListBuilder(OsmandApplication app, String regionId, DownloadIndexes di) { + this.app = app; + this.downloadIndexes = di; + + regionMapItems = new LinkedList<>(); + allResourceItems = new LinkedList<>(); + allSubregionItems = new LinkedList<>(); + + region = app.getWorldRegion().getRegionById(regionId); + } + + public ItemsListBuilder build() { + if (obtainDataAndItems()) { + return this; + } else { + return null; + } + } + + private boolean obtainDataAndItems() { + if (downloadIndexes.resourcesByRegions.isEmpty() || region == null) { + return false; + } + + collectSubregionsDataAndItems(); + collectResourcesDataAndItems(); + + return true; + } + + private void collectSubregionsDataAndItems() { + srtmDisabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) == null; + hasSrtm = false; + hasHillshade = false; + + // Collect all regions (and their parents) that have at least one + // resource available in repository or locally. + + allResourceItems.clear(); + allSubregionItems.clear(); + regionMapItems.clear(); + + for (WorldRegion subregion : region.getFlattenedSubregions()) { + if (subregion.getSuperregion() == region) { + if (subregion.getFlattenedSubregions().size() > 0) { + allSubregionItems.add(subregion); + } else { + collectSubregionItems(subregion); + } + } + } + } + + private void collectSubregionItems(WorldRegion region) { + Map regionResources = downloadIndexes.resourcesByRegions.get(region); + + if (regionResources == null) { + return; + } + + List regionMapArray = new LinkedList<>(); + List allResourcesArray = new LinkedList<>(); + + Context context = app.getApplicationContext(); + OsmandRegions osmandRegions = app.getRegions(); + + for (IndexItem indexItem : regionResources.values()) { + + String name = indexItem.getVisibleName(context, osmandRegions, false); + if (Algorithms.isEmpty(name)) { + continue; + } + + ResourceItem resItem = new ResourceItem(indexItem, region); + resItem.setResourceId(indexItem.getSimplifiedFileName()); + resItem.setTitle(name); + + if (region != this.region && srtmDisabled) { + if (indexItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) { + if (hasSrtm) { + continue; + } else { + hasSrtm = true; + } + } else if (indexItem.getType() == DownloadActivityType.HILLSHADE_FILE) { + if (hasHillshade) { + continue; + } else { + hasHillshade = true; + } + } + } + + + if (region == this.region) { + regionMapArray.add(resItem); + } else { + allResourcesArray.add(resItem); + } + + } + + regionMapItems.addAll(regionMapArray); + + if (allResourcesArray.size() > 1) { + allSubregionItems.add(region); + } else { + allResourceItems.addAll(allResourcesArray); + } + } + + private void collectResourcesDataAndItems() { + collectSubregionItems(region); + + allResourceItems.addAll(allSubregionItems); + + Collections.sort(allResourceItems, new ResourceItemComparator()); + Collections.sort(regionMapItems, new ResourceItemComparator()); + } + + public enum MapState { + NOT_DOWNLOADED, + DOWNLOADED, + OUTDATED + } + + + public enum VoicePromptsType { + NONE, + RECORDED, + TTS + } + } + +} \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/download/IndexFileList.java b/OsmAnd/src/net/osmand/plus/download/IndexFileList.java deleted file mode 100644 index 059bd5b1fb..0000000000 --- a/OsmAnd/src/net/osmand/plus/download/IndexFileList.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.osmand.plus.download; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import net.osmand.IndexConstants; - -public class IndexFileList implements Serializable { - private static final long serialVersionUID = 1L; - - private boolean downloadedFromInternet = false; - IndexItem basemap; - ArrayList indexFiles = new ArrayList(); - private String mapversion; - - private Comparator comparator = new Comparator(){ - @Override - public int compare(IndexItem o1, IndexItem o2) { - String object1 = o1.getFileName(); - String object2 = o2.getFileName(); - if(object1.endsWith(IndexConstants.ANYVOICE_INDEX_EXT_ZIP)){ - if(object2.endsWith(IndexConstants.ANYVOICE_INDEX_EXT_ZIP)){ - return object1.compareTo(object2); - } else { - return -1; - } - } else if(object2.endsWith(IndexConstants.ANYVOICE_INDEX_EXT_ZIP)){ - return 1; - } - return object1.compareTo(object2); - } - }; - - public void setDownloadedFromInternet(boolean downloadedFromInternet) { - this.downloadedFromInternet = downloadedFromInternet; - } - - public boolean isDownloadedFromInternet() { - return downloadedFromInternet; - } - - public void setMapVersion(String mapversion) { - this.mapversion = mapversion; - } - - public void add(IndexItem indexItem) { - indexFiles.add(indexItem); - if(indexItem.getFileName().toLowerCase().startsWith("world_basemap")) { - basemap = indexItem; - } - } - - public void sort(){ - Collections.sort(indexFiles, comparator); - } - - public boolean isAcceptable() { - return (indexFiles != null && !indexFiles.isEmpty()) || (mapversion != null); - } - - public List getIndexFiles() { - return indexFiles; - } - - public IndexItem getBasemap() { - return basemap; - } - - public boolean isIncreasedMapVersion() { - try { - int mapVersionInList = Integer.parseInt(mapversion); - return IndexConstants.BINARY_MAP_VERSION < mapVersionInList; - } catch (NumberFormatException e) { - //ignore this... - } - return false; - } - - public IndexItem getIndexFilesByName(String key) { - for(IndexItem i : indexFiles) { - if(i.getFileName().equals(key)) { - return i; - } - } - return null; - } -} diff --git a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java b/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java deleted file mode 100644 index c0417eb3a9..0000000000 --- a/OsmAnd/src/net/osmand/plus/download/IndexItemCategory.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.osmand.plus.download; - -import android.support.annotation.NonNull; - -import net.osmand.Collator; -import net.osmand.OsmAndCollator; -import net.osmand.map.OsmandRegions; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.R; -import net.osmand.plus.Version; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -public class IndexItemCategory implements Comparable { - public final String name; - public final List items = new ArrayList<>(); - private final int order; - - public IndexItemCategory(String name, int order) { - this.name = name; - this.order = order; - } - - @Override - public int compareTo(@NonNull IndexItemCategory another) { - return order < another.order ? -1 : 1; - } - - public static List categorizeIndexItems(final OsmandApplication ctx, - Collection indexItems) { - boolean skipWiki = Version.isFreeVersion(ctx); - final Map cats = new TreeMap<>(); - for (IndexItem i : indexItems) { - int nameId = R.string.index_name_other; - int order = 0; - String lc = i.getFileName().toLowerCase(); - if (lc.endsWith(".voice.zip")) { - nameId = R.string.index_name_voice; - order = 1; - } else if (lc.contains(".ttsvoice.zip")) { - nameId = R.string.index_name_tts_voice; - order = 2; - } else if (lc.contains("_wiki_")) { - if(skipWiki) { - continue; - } - nameId = R.string.index_name_wiki; - order = 10; - } else if (lc.startsWith("us") || - (lc.contains("united states") && lc.startsWith("north-america")) ) { - nameId = R.string.index_name_us; - order = 31; - } else if (lc.startsWith("canada")) { - nameId = R.string.index_name_canada; - order = 32; - } else if (lc.contains("openmaps")) { - nameId = R.string.index_name_openmaps; - order = 90; - } else if (lc.contains("northamerica") || lc.contains("north-america")) { - nameId = R.string.index_name_north_america; - order = 30; - } else if (lc.contains("centralamerica") || lc.contains("central-america") - || lc.contains("caribbean")) { - nameId = R.string.index_name_central_america; - order = 40; - } else if (lc.contains("southamerica") || lc.contains("south-america")) { - nameId = R.string.index_name_south_america; - order = 45; - } else if ( lc.contains("germany")) { - nameId = R.string.index_name_germany; - order = 16; - } else if (lc.startsWith("france_")) { - nameId = R.string.index_name_france; - order = 17; - } else if (lc.startsWith("italy_")) { - nameId = R.string.index_name_italy; - order = 18; - } else if (lc.startsWith("gb_") || lc.startsWith("british")) { - nameId = R.string.index_name_gb; - order = 19; - } else if ( lc.contains("netherlands")) { - nameId = R.string.index_name_netherlands; - order = 20; - } else if (lc.contains("russia")) { - nameId = R.string.index_name_russia; - order = 25; - } else if (lc.contains("europe")) { - nameId = R.string.index_name_europe; - order = 15; - } else if (lc.contains("africa") && !lc.contains("_wiki_")) { - nameId = R.string.index_name_africa; - order = 80; - } else if (lc.contains("_asia")|| lc.startsWith("asia")) { - nameId = R.string.index_name_asia; - order = 50; - } else if (lc.contains("oceania") || lc.contains("australia")) { - nameId = R.string.index_name_oceania; - order = 70; - } else if (lc.contains("tour")) { - nameId = R.string.index_tours; - } - - String name = ctx.getString(nameId); - if (!cats.containsKey(name)) { - cats.put(name, new IndexItemCategory(name, order)); - } - cats.get(name).items.add(i); - } - ArrayList r = new ArrayList<>(cats.values()); - final Collator collator = OsmAndCollator.primaryCollator(); - for(IndexItemCategory ct : r) { - final OsmandRegions osmandRegions = ctx.getResourceManager().getOsmandRegions(); - Collections.sort(ct.items, new Comparator() { - @Override - public int compare(IndexItem lhs, IndexItem rhs) { - return collator.compare(lhs.getVisibleName(ctx, osmandRegions), - rhs.getVisibleName(ctx, osmandRegions)); - } - }); - } - Collections.sort(r); - return r; - } -} diff --git a/OsmAnd/src/net/osmand/plus/download/items/ItemsListBuilder.java b/OsmAnd/src/net/osmand/plus/download/items/ItemsListBuilder.java deleted file mode 100644 index 297b0ebe74..0000000000 --- a/OsmAnd/src/net/osmand/plus/download/items/ItemsListBuilder.java +++ /dev/null @@ -1,286 +0,0 @@ -package net.osmand.plus.download.items; - -import android.content.Context; - -import net.osmand.PlatformUtil; -import net.osmand.map.OsmandRegions; -import net.osmand.plus.OsmandApplication; -import net.osmand.plus.OsmandPlugin; -import net.osmand.plus.R; -import net.osmand.plus.WorldRegion; -import net.osmand.plus.download.DownloadActivityType; -import net.osmand.plus.download.IndexItem; -import net.osmand.plus.srtmplugin.SRTMPlugin; -import net.osmand.util.Algorithms; - -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -public class ItemsListBuilder { - - //public static final String WORLD_BASEMAP_KEY = "world_basemap.obf.zip"; - public static final String WORLD_SEAMARKS_KEY = "world_seamarks_basemap.obf.zip"; - - private Map> resourcesByRegions; - private List voiceRecItems; - private List voiceTTSItems; - - public static class ResourceItem { - - private String resourceId; - private String title; - - private IndexItem indexItem; - private WorldRegion worldRegion; - - public IndexItem getIndexItem() { - return indexItem; - } - - public WorldRegion getWorldRegion() { - return worldRegion; - } - - public String getResourceId() { - return resourceId; - } - - public void setResourceId(String resourceId) { - this.resourceId = resourceId; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public ResourceItem(IndexItem indexItem, WorldRegion worldRegion) { - this.indexItem = indexItem; - this.worldRegion = worldRegion; - } - } - - class ResourceItemComparator implements Comparator { - @Override - public int compare(Object obj1, Object obj2) { - String str1; - String str2; - - if (obj1 instanceof WorldRegion) { - str1 = ((WorldRegion) obj1).getName(); - } else { - ResourceItem item = (ResourceItem) obj1; - str1 = item.title + item.getIndexItem().getType().getOrderIndex(); - } - - if (obj2 instanceof WorldRegion) { - str2 = ((WorldRegion) obj2).getName(); - } else { - ResourceItem item = (ResourceItem) obj2; - str2 = item.title + item.getIndexItem().getType().getOrderIndex(); - } - - return str1.compareTo(str2); - } - } - - public enum VoicePromptsType { - NONE, - RECORDED, - TTS - } - - private static final org.apache.commons.logging.Log LOG = PlatformUtil.getLog(ItemsListBuilder.class); - - private List regionMapItems; - private List allResourceItems; - private List allSubregionItems; - - private OsmandApplication app; - private WorldRegion region; - - private boolean srtmDisabled; - private boolean hasSrtm; - private boolean hasHillshade; - - public List getRegionMapItems() { - return regionMapItems; - } - - public List getAllResourceItems() { - return allResourceItems; - } - - public List getRegionsFromAllItems() { - List list = new LinkedList<>(); - for (Object obj : allResourceItems) { - if (obj instanceof WorldRegion) { - list.add((WorldRegion) obj); - } - } - return list; - } - - public static String getVoicePromtName(Context ctx, VoicePromptsType type) { - switch (type) { - case RECORDED: - return ctx.getResources().getString(R.string.index_name_voice); - case TTS: - return ctx.getResources().getString(R.string.index_name_tts_voice); - default: - return ""; - } - } - - public List getVoicePromptsItems(VoicePromptsType type) { - switch (type) { - case RECORDED: - return voiceRecItems; - case TTS: - return voiceTTSItems; - default: - return new LinkedList<>(); - } - } - - public boolean isVoicePromptsItemsEmpty(VoicePromptsType type) { - switch (type) { - case RECORDED: - return voiceRecItems.isEmpty(); - case TTS: - return voiceTTSItems.isEmpty(); - default: - return true; - } - } - - // FIXME - public ItemsListBuilder(OsmandApplication app, String regionId, Map> resourcesByRegions, - List voiceRecItems, List voiceTTSItems) { - this.app = app; - this.resourcesByRegions = resourcesByRegions; - this.voiceRecItems = voiceRecItems; - this.voiceTTSItems = voiceTTSItems; - - regionMapItems = new LinkedList<>(); - allResourceItems = new LinkedList<>(); - allSubregionItems = new LinkedList<>(); - - region = app.getWorldRegion().getRegionById(regionId); - } - - public ItemsListBuilder build() { - if (obtainDataAndItems()) { - return this; - } else { - return null; - } - } - - private boolean obtainDataAndItems() { - if (resourcesByRegions.isEmpty() || region == null) { - return false; - } - - collectSubregionsDataAndItems(); - collectResourcesDataAndItems(); - - return true; - } - - private void collectSubregionsDataAndItems() { - srtmDisabled = OsmandPlugin.getEnabledPlugin(SRTMPlugin.class) == null; - hasSrtm = false; - hasHillshade = false; - - // Collect all regions (and their parents) that have at least one - // resource available in repository or locally. - - allResourceItems.clear(); - allSubregionItems.clear(); - regionMapItems.clear(); - - for (WorldRegion subregion : region.getFlattenedSubregions()) { - if (subregion.getSuperregion() == region) { - if (subregion.getFlattenedSubregions().size() > 0) { - allSubregionItems.add(subregion); - } else { - collectSubregionItems(subregion); - } - } - } - } - - private void collectSubregionItems(WorldRegion region) { - Map regionResources = resourcesByRegions.get(region); - - if (regionResources == null) { - return; - } - - List regionMapArray = new LinkedList<>(); - List allResourcesArray = new LinkedList<>(); - - Context context = app.getApplicationContext(); - OsmandRegions osmandRegions = app.getRegions(); - - for (IndexItem indexItem : regionResources.values()) { - - String name = indexItem.getVisibleName(context, osmandRegions, false); - if (Algorithms.isEmpty(name)) { - continue; - } - - ResourceItem resItem = new ResourceItem(indexItem, region); - resItem.setResourceId(indexItem.getSimplifiedFileName()); - resItem.setTitle(name); - - if (region != this.region && srtmDisabled) { - if (indexItem.getType() == DownloadActivityType.SRTM_COUNTRY_FILE) { - if (hasSrtm) { - continue; - } else { - hasSrtm = true; - } - } else if (indexItem.getType() == DownloadActivityType.HILLSHADE_FILE) { - if (hasHillshade) { - continue; - } else { - hasHillshade = true; - } - } - } - - - if (region == this.region) { - regionMapArray.add(resItem); - } else { - allResourcesArray.add(resItem); - } - - } - - regionMapItems.addAll(regionMapArray); - - if (allResourcesArray.size() > 1) { - allSubregionItems.add(region); - } else { - allResourceItems.addAll(allResourcesArray); - } - } - - private void collectResourcesDataAndItems() { - collectSubregionItems(region); - - allResourceItems.addAll(allSubregionItems); - - Collections.sort(allResourceItems, new ResourceItemComparator()); - Collections.sort(regionMapItems, new ResourceItemComparator()); - } -} diff --git a/OsmAnd/src/net/osmand/plus/download/items/RegionItemsFragment.java b/OsmAnd/src/net/osmand/plus/download/items/RegionItemsFragment.java index 410a66c15c..b76f7a0b21 100644 --- a/OsmAnd/src/net/osmand/plus/download/items/RegionItemsFragment.java +++ b/OsmAnd/src/net/osmand/plus/download/items/RegionItemsFragment.java @@ -103,7 +103,6 @@ public class RegionItemsFragment extends OsmandExpandableListFragment { } } getMyActivity().startDownload(indexItem); - return true; } } @@ -163,7 +162,6 @@ public class RegionItemsFragment extends OsmandExpandableListFragment { private int groupInProgressPosition = -1; private int childInProgressPosition = -1; private int progress = -1; - private boolean isFinished; public RegionsItemsAdapter() { }