From 3e259021d05ded0c03b596c4a95fe4a543a644b0 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 13 Nov 2016 03:07:16 +0800 Subject: [PATCH] Sort module/repo by name --- .../topjohnwu/magisk/module/BaseModule.java | 9 +- .../com/topjohnwu/magisk/module/Repo.java | 13 ++- .../topjohnwu/magisk/utils/ModuleHelper.java | 88 ++++++++++++++----- 3 files changed, 82 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/module/BaseModule.java b/app/src/main/java/com/topjohnwu/magisk/module/BaseModule.java index b18de2d73..8704e7f45 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/BaseModule.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/BaseModule.java @@ -1,11 +1,13 @@ package com.topjohnwu.magisk.module; +import android.support.annotation.NonNull; + import com.topjohnwu.magisk.utils.Logger; import java.util.List; -public abstract class BaseModule { +public abstract class BaseModule implements Comparable { protected String mId, mName, mVersion, mAuthor, mDescription, mSupportUrl, mDonateUrl; protected boolean mIsCacheModule = false; @@ -98,4 +100,9 @@ public abstract class BaseModule { Logger.dev("Cache mods are no longer supported! id: " + id); } } + + @Override + public int compareTo(@NonNull BaseModule o) { + return this.getName().toLowerCase().compareTo(o.getName().toLowerCase()); + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/module/Repo.java b/app/src/main/java/com/topjohnwu/magisk/module/Repo.java index c76ae905e..2a64a17aa 100644 --- a/app/src/main/java/com/topjohnwu/magisk/module/Repo.java +++ b/app/src/main/java/com/topjohnwu/magisk/module/Repo.java @@ -9,20 +9,19 @@ import com.topjohnwu.magisk.utils.WebRequest; import java.util.Date; public class Repo extends BaseModule { - protected String repoName, mLogUrl, mManifestUrl, mZipUrl; - protected Date mLastUpdate; + private String mLogUrl, mManifestUrl, mZipUrl; + private Date mLastUpdate; public Repo(Context context, String name, Date lastUpdate) throws CacheModException { - repoName = name; mLastUpdate = lastUpdate; - mLogUrl = context.getString(R.string.file_url, repoName, "changelog.txt"); - mManifestUrl = context.getString(R.string.file_url, repoName, "module.prop"); - mZipUrl = context.getString(R.string.zip_url, repoName); + mLogUrl = context.getString(R.string.file_url, name, "changelog.txt"); + mManifestUrl = context.getString(R.string.file_url, name, "module.prop"); + mZipUrl = context.getString(R.string.zip_url, name); update(); } public void update() throws CacheModException { - Logger.dev("Repo: Re-fetch prop " + mId); + Logger.dev("Repo: Re-fetch prop"); String props = WebRequest.makeWebServiceCall(mManifestUrl, WebRequest.GET, true); String lines[] = props.split("\\n"); parseProps(lines); diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/ModuleHelper.java b/app/src/main/java/com/topjohnwu/magisk/utils/ModuleHelper.java index bdad0dfc4..c5b864c4c 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/ModuleHelper.java +++ b/app/src/main/java/com/topjohnwu/magisk/utils/ModuleHelper.java @@ -2,6 +2,7 @@ package com.topjohnwu.magisk.utils; import android.content.Context; import android.content.SharedPreferences; +import android.support.annotation.NonNull; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -16,19 +17,24 @@ import org.json.JSONObject; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Comparator; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Locale; -import java.util.TreeMap; +import java.util.Map; public class ModuleHelper { - public static final String MAGISK_PATH = "/magisk"; + private static final String MAGISK_PATH = "/magisk"; + private static final String FILE_KEY = "RepoMap"; + private static final String REPO_KEY = "repomap"; + private static final String VERSION_KEY = "version"; + private static final int DATABASE_VER = 1; - private static final String file_key = "RepoMap"; - private static final String key = "repomap"; - private static TreeMap repoMap = new TreeMap<>(new ModuleComparator()); - private static TreeMap moduleMap = new TreeMap<>(new ModuleComparator()); + private static ValueSortedMap repoMap = new ValueSortedMap<>(); + private static ValueSortedMap moduleMap = new ValueSortedMap<>(); public static void createModuleMap() { @@ -54,24 +60,34 @@ public class ModuleHelper { repoMap.clear(); Gson gson = new Gson(); - SharedPreferences prefs = context.getSharedPreferences(file_key, Context.MODE_PRIVATE); - String jsonString = prefs.getString(key, null); + SharedPreferences prefs = context.getSharedPreferences(FILE_KEY, Context.MODE_PRIVATE); + String jsonString; - TreeMap cached = null; + int cachedVersion = prefs.getInt(VERSION_KEY, 0); + if (cachedVersion != DATABASE_VER) { + // Ignore incompatible cached database + jsonString = null; + } else { + jsonString = prefs.getString(REPO_KEY, null); + } + + ValueSortedMap cached = null; if (jsonString != null) { - cached = gson.fromJson(jsonString, new TypeToken< TreeMap >(){}.getType()); + cached = gson.fromJson(jsonString, new TypeToken< ValueSortedMap >(){}.getType()); } if (cached == null) { - cached = new TreeMap<>(new ModuleComparator()); + cached = new ValueSortedMap<>(); } // Making a request to url and getting response - String jsonStr = WebRequest.makeWebServiceCall(context.getString(R.string.url_main) + Utils.getToken(), WebRequest.GET); - if (jsonStr != null && !jsonStr.isEmpty()) { + jsonString = WebRequest.makeWebServiceCall(context.getString(R.string.url_main) + Utils.getToken(), WebRequest.GET); + + if (jsonString != null && !jsonString.isEmpty()) { + // Have internet access try { - JSONArray jsonArray = new JSONArray(jsonStr); + JSONArray jsonArray = new JSONArray(jsonString); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonobject = jsonArray.getJSONObject(i); String id = jsonobject.getString("description"); @@ -101,10 +117,16 @@ public class ModuleHelper { } catch (JSONException e) { e.printStackTrace(); } - - prefs.edit().putString(key, gson.toJson(repoMap)).apply(); + } else { + // Use cached if no internet + repoMap.putAll(cached); } + prefs.edit() + .putInt(VERSION_KEY, DATABASE_VER) + .putString(REPO_KEY, gson.toJson(repoMap)) + .apply(); + Logger.dev("ModuleHelper: Repo load done"); } @@ -131,10 +153,36 @@ public class ModuleHelper { } } - public static class ModuleComparator implements Comparator { + private static class ValueSortedMap extends HashMap { + + private List sorted = new ArrayList<>(); + + @NonNull @Override - public int compare(String o1, String o2) { - return o1.toLowerCase().compareTo(o2.toLowerCase()); + public Collection values() { + if (sorted.isEmpty()) { + sorted.addAll(super.values()); + Collections.sort(sorted); + } + return sorted; + } + + @Override + public V put(K key, V value) { + sorted.clear(); + return super.put(key, value); + } + + @Override + public void putAll(Map m) { + sorted.clear(); + super.putAll(m); + } + + @Override + public V remove(Object key) { + sorted.clear(); + return super.remove(key); } } }