package org.liberty.android.fantastischmemo.downloader.anymemo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import org.json.JSONArray;
import org.json.JSONObject;
import org.liberty.android.fantastischmemo.common.AMEnv;
import org.liberty.android.fantastischmemo.downloader.common.AbstractDownloaderFragment;
import org.liberty.android.fantastischmemo.downloader.common.DownloadItem;
import org.liberty.android.fantastischmemo.downloader.common.DownloaderUtils;
import org.liberty.android.fantastischmemo.utils.AMZipUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
public class AnyMemoDownloaderFragment extends AbstractDownloaderFragment {
private static final String LIST_DATABASES_PATH = "/api/legacy_database/list";
private static final String DOWNLOAD_DATABASE_PATH = "/api/legacy_database/download";
private Map<String, List<DownloadItem>> categoryDatabasesMap;
@Inject DownloaderUtils downloaderUtils;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
fragmentComponents().inject(this);
}
@Override
protected List<DownloadItem> initialRetrieve() throws Exception {
retrieveAllDatabases();
return getCategories();
}
@Override
protected List<DownloadItem> loadMore() throws Exception {
return null;
}
@Override
protected boolean hasMore() {
return false;
}
@Override
protected List<DownloadItem> openCategory(DownloadItem di) {
String category = di.getTitle();
List<DownloadItem> items = categoryDatabasesMap.get(category);
List<DownloadItem> result = new ArrayList<>(items.size() + 1);
result.add(new DownloadItem(DownloadItem.ItemType.Back, "..","", ""));
result.addAll(items);
return result;
}
@Override
protected List<DownloadItem> goBack() {
return getCategories();
}
@Override
protected String fetchDatabase(DownloadItem di) throws Exception {
String address = di.getAddress();
String fileName = downloaderUtils.getLastPartFromUrl(address);
if (fileName.toLowerCase().endsWith(".db")) {
String filePath = AMEnv.DEFAULT_ROOT_PATH + fileName;
downloaderUtils.downloadFile(address, filePath);
return filePath;
} else if (fileName.toLowerCase().endsWith(".zip")) {
String zipFilePath = AMEnv.DEFAULT_TMP_PATH + fileName;
downloaderUtils.downloadFile(address, zipFilePath);
AMZipUtils.unZipFile(new File(zipFilePath), new File(AMEnv.DEFAULT_ROOT_PATH));
return AMEnv.DEFAULT_ROOT_PATH + fileName.replace(".zip", ".db");
}
throw new IllegalStateException("Downloading file: " + fileName + " that is neither .db or .zip");
}
private void retrieveAllDatabases() throws Exception {
categoryDatabasesMap = new HashMap<>();
String jsonString = downloaderUtils.downloadJSONString(String.format("%s%s",
AMEnv.ANYMEMO_SERVICE_ENDPOINT,
LIST_DATABASES_PATH));
JSONArray jsonArray = new JSONArray(jsonString);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
DownloadItem downloadItem = new DownloadItem();
downloadItem.setType(DownloadItem.ItemType.Database);
downloadItem.setTitle(jsonObject.getString("title"));
downloadItem.setDescription(jsonObject.getString("description"));
downloadItem.setAddress(String.format("%s%s/%s",
AMEnv.ANYMEMO_SERVICE_ENDPOINT,
DOWNLOAD_DATABASE_PATH,
jsonObject.get("name")));
String category = jsonObject.getString("category");
if (!categoryDatabasesMap.containsKey(category)) {
categoryDatabasesMap.put(category, new ArrayList<DownloadItem>(30));
}
categoryDatabasesMap.get(category).add(downloadItem);
}
// Need to sort all the download items by name
for (List<DownloadItem> downloadItemList : categoryDatabasesMap.values()) {
Collections.sort(downloadItemList, new Comparator<DownloadItem>() {
@Override
public int compare(DownloadItem lhs, DownloadItem rhs) {
return lhs.getTitle().compareTo(rhs.getTitle());
}
});
}
}
private List<DownloadItem> getCategories() {
Set<String> categoryNames = categoryDatabasesMap.keySet();
List<DownloadItem> resultItems = new ArrayList<>(50);
for (String categoryName : categoryNames) {
DownloadItem item = new DownloadItem(DownloadItem.ItemType.Category, categoryName, "", "");
resultItems.add(item);
}
Collections.sort(resultItems, new Comparator<DownloadItem>() {
@Override
public int compare(DownloadItem lhs, DownloadItem rhs) {
return lhs.getTitle().compareTo(rhs.getTitle());
}
});
return resultItems;
}
}