Refactor repo class and SharedPref

This commit is contained in:
topjohnwu 2016-09-21 11:29:43 +08:00
parent baae3592d3
commit 0addbaa9a8
11 changed files with 374 additions and 443 deletions

View File

@ -85,8 +85,8 @@ public class ModulesAdapter extends RecyclerView.Adapter<ModulesAdapter.ViewHold
holder.description.setText(module.getDescription()); holder.description.setText(module.getDescription());
holder.author.setText(module.getAuthor()); holder.author.setText(module.getAuthor());
String logUrl = module.getmLogUrl(); String logUrl = module.getmLogUrl();
String supportUrl = module.getmSupportUrl(); String supportUrl = module.getSupportUrl();
String donateUrl = module.getmDonateUrl(); String donateUrl = module.getDonateUrl();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.contains("ignoreUpdateAlerts")) { if (prefs.contains("ignoreUpdateAlerts")) {
ignoreAlertUpdate = prefs.getBoolean("ignoreUpdateAlerts", false); ignoreAlertUpdate = prefs.getBoolean("ignoreUpdateAlerts", false);
@ -140,10 +140,10 @@ public class ModulesAdapter extends RecyclerView.Adapter<ModulesAdapter.ViewHold
new WebWindow("Changelog", module.getmLogUrl(), context); new WebWindow("Changelog", module.getmLogUrl(), context);
} }
if (view.getId() == holder.authorLink.getId()) { if (view.getId() == holder.authorLink.getId()) {
new WebWindow("Donate", module.getmDonateUrl(), context); new WebWindow("Donate", module.getDonateUrl(), context);
} }
if (view.getId() == holder.supportLink.getId()) { if (view.getId() == holder.supportLink.getId()) {
new WebWindow("Support", module.getmSupportUrl(), context); new WebWindow("Support", module.getSupportUrl(), context);
} }
}; };

View File

@ -92,9 +92,9 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs = PreferenceManager.getDefaultSharedPreferences(context);
repo = mList.get(position); repo = mList.get(position);
mHolder = holder; mHolder = holder;
mDonateUrl = repo.getmDonateUrl(); mDonateUrl = repo.getDonateUrl();
mSupportUrl = repo.getmSupportUrl(); mSupportUrl = repo.getSupportUrl();
mLogUrl = repo.getmLogUrl(); mLogUrl = repo.getLogUrl();
mExpandedList = new ArrayList<>(mList.size()); mExpandedList = new ArrayList<>(mList.size());
for (int i = 0; i < mList.size(); i++) { for (int i = 0; i < mList.size(); i++) {
mExpandedList.add(false); mExpandedList.add(false);
@ -114,13 +114,10 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
} }
mHolder.title.setText(titleString); mHolder.title.setText(titleString);
mHolder.versionName.setText(repo.getmVersion()); mHolder.versionName.setText(repo.getVersion());
mHolder.description.setText(repo.getDescription()); mHolder.description.setText(repo.getDescription());
String authorString = this.context.getResources().getString(R.string.author) + " " + repo.getmAuthor(); String authorString = this.context.getResources().getString(R.string.author) + " " + repo.getAuthor();
mHolder.author.setText(authorString); mHolder.author.setText(authorString);
String logUrl = repo.getmLogUrl();
String supportUrl = repo.getmSupportUrl();
String donateUrl = repo.getmDonateUrl();
if (prefs.contains("ignoreUpdateAlerts")) { if (prefs.contains("ignoreUpdateAlerts")) {
ignoreAlertUpdate = prefs.getBoolean("ignoreUpdateAlerts",false); ignoreAlertUpdate = prefs.getBoolean("ignoreUpdateAlerts",false);
} }
@ -136,7 +133,7 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
mHolder.updateStatus.setText(repo.canUpdate() ? this.context.getResources().getString(R.string.module_update_available) : this.context.getResources().getString(R.string.module_up_to_date)); mHolder.updateStatus.setText(repo.canUpdate() ? this.context.getResources().getString(R.string.module_update_available) : this.context.getResources().getString(R.string.module_up_to_date));
} }
Log.d("Magisk", "ReposAdapter: Setting up info " + repo.getId() + " and " + repo.getDescription() + " and " + repo.getmVersion()); Log.d("Magisk", "ReposAdapter: Setting up info " + repo.getId() + " and " + repo.getDescription() + " and " + repo.getVersion());
prefs = PreferenceManager.getDefaultSharedPreferences(context); prefs = PreferenceManager.getDefaultSharedPreferences(context);
mCanUpdate = prefs.getBoolean("repo-canUpdate_" + repo.getId(), false); mCanUpdate = prefs.getBoolean("repo-canUpdate_" + repo.getId(), false);
@ -155,19 +152,19 @@ public class ReposAdapter extends RecyclerView.Adapter<ReposAdapter.ViewHolder>
} }
}; };
String filename = repo.getId().replace(" ", "") + ".zip"; String filename = repo.getId().replace(" ", "") + ".zip";
Utils.downloadAndReceive(context, receiver, repo.getmZipUrl(), filename); Utils.downloadAndReceive(context, receiver, repo.getZipUrl(), filename);
} else { } else {
Toast.makeText(context, repo.getId() + " is already installed.", Toast.LENGTH_SHORT).show(); Toast.makeText(context, repo.getId() + " is already installed.", Toast.LENGTH_SHORT).show();
} }
} }
if ((view.getId() == mHolder.changeLog.getId()) && (!repo.getmLogUrl().equals(""))) { if ((view.getId() == mHolder.changeLog.getId()) && (!repo.getLogUrl().equals(""))) {
new WebWindow("Changelog", repo.getmLogUrl(),context); new WebWindow("Changelog", repo.getLogUrl(),context);
} }
if ((view.getId() == mHolder.authorLink.getId()) && (!repo.getmSupportUrl().equals(""))) { if ((view.getId() == mHolder.authorLink.getId()) && (!repo.getSupportUrl().equals(""))) {
new WebWindow("Donate", repo.getmDonateUrl(),context); new WebWindow("Donate", repo.getDonateUrl(),context);
} }
if ((view.getId() == mHolder.supportLink.getId()) && (!repo.getmSupportUrl().equals(""))) { if ((view.getId() == mHolder.supportLink.getId()) && (!repo.getSupportUrl().equals(""))) {
new WebWindow("Support", repo.getmSupportUrl(),context); new WebWindow("Support", repo.getSupportUrl(),context);
} }
}; };
mHolder.changeLog.setOnClickListener(oCl); mHolder.changeLog.setOnClickListener(oCl);

View File

@ -112,14 +112,7 @@ public class ReposFragment extends Fragment {
}; };
Log.d("Magisk","ReposFragment, LoadRepo called"); Log.d("Magisk","ReposFragment, LoadRepo called");
mListRepos.clear(); new Async.LoadRepos(getActivity());
List<Repo> magiskRepos = RepoHelper.listRepos(getActivity(), doReload, taskDelegate);
for (Repo repo : magiskRepos) {
Log.d("Magisk", "ReposFragment: Adding repo from string " + repo.getId());
mListRepos.add(repo);
}
} }
private void NotifyOfAlerts() { private void NotifyOfAlerts() {
@ -138,7 +131,7 @@ public class ReposFragment extends Fragment {
} }
}; };
String filename = repo.getId().replace(" ", "") + ".zip"; String filename = repo.getId().replace(" ", "") + ".zip";
Utils.downloadAndReceive(getActivity(), receiver, repo.getmZipUrl(), filename); Utils.downloadAndReceive(getActivity(), receiver, repo.getZipUrl(), filename);
break; break;

View File

@ -79,10 +79,7 @@ public class WelcomeActivity extends AppCompatActivity implements NavigationView
//Do a thing here when we get a result we want //Do a thing here when we get a result we want
}; };
new Async.LoadModules(this).execute(); new Async.LoadModules(this).execute();
new Async.LoadRepos(this, true, delegate).execute(); new Async.LoadRepos(this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new Async.LoadRepos(this, !prefs.contains("hasCachedRepos"), delegate).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
new Async.LoadModules(getApplication()).execute();
new Async.LoadRepos(this, false, delegate).execute();
setSupportActionBar(toolbar); setSupportActionBar(toolbar);

View File

@ -7,16 +7,13 @@ import java.util.List;
public abstract class BaseModule { public abstract class BaseModule {
protected String mId, mName, mVersion, mDescription, mSupportUrl, mDonateUrl, mAuthor; protected String mId, mName, mVersion, mAuthor, mDescription, mSupportUrl, mDonateUrl;
protected boolean mIsCacheModule = false; protected boolean mIsCacheModule = false;
protected int mVersionCode = 0; protected int mVersionCode = 0;
public BaseModule(List<String> props) { protected void parseProps(List<String> props) { parseProps(props.toArray(new String[props.size()])); }
this(props.toArray(new String[props.size()]));
}
public BaseModule(String[] props) { protected void parseProps(String[] props) {
for (String line : props) { for (String line : props) {
String[] prop = line.split("=", 2); String[] prop = line.split("=", 2);
if (prop.length != 2) { if (prop.length != 2) {
@ -93,11 +90,11 @@ public abstract class BaseModule {
return mVersionCode; return mVersionCode;
} }
public String getmDonateUrl() { public String getDonateUrl() {
return mDonateUrl; return mDonateUrl;
} }
public String getmSupportUrl() { public String getSupportUrl() {
return mSupportUrl; return mSupportUrl;
} }
} }

View File

@ -16,9 +16,10 @@ public class Module extends BaseModule {
private String mZipUrl, mLogUrl; private String mZipUrl, mLogUrl;
private boolean mEnable, mRemove, mUpdateAvailable = false, mIsInstalled; private boolean mEnable, mRemove, mUpdateAvailable = false, mIsInstalled;
public Module(String path, Context context) { public Module(Context context, String path) {
super(Utils.readFile(path + "/module.prop")); super();
parseProps(Utils.readFile(path + "/module.prop"));
mRemoveFile = path + "/remove"; mRemoveFile = path + "/remove";
mDisableFile = path + "/disable"; mDisableFile = path + "/disable";

View File

@ -15,254 +15,47 @@ import org.json.JSONObject;
import java.util.Date; import java.util.Date;
public class Repo { public class Repo extends BaseModule {
private String mBaseUrl; protected String repoName, mLogUrl, mManifestUrl, mZipUrl;
private String mZipUrl; protected Date mLastUpdate;
private String mLogUrl; protected boolean mIsInstalled = false, mCanUpdate = false;
private String mManifestUrl;
private String mVersion;
private String mName;
private String mDescription;
private String mAuthor;
public String mAuthorUrl;
private String mId;
private String mVersionCode;
private String mSupportUrl;
private String mDonateUrl;
private String lastUpdate;
private Context appContext;
private boolean mIsInstalled,mCanUpdate,mIsCacheModule;
public Repo(String manifestString, Context context) {
appContext = context;
ParseProps(manifestString);
public Repo(Context context, String name, Date lastUpdate) {
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);
update();
} }
public void update() {
String props = WebRequest.makeWebServiceCall(mManifestUrl, WebRequest.GET, true);
public Repo(String name, String url, Date updated, Context context) { String lines[] = props.split("\\n");
appContext = context; parseProps(lines);
this.mName = name;
this.mBaseUrl = url;
this.lastUpdate = updated.toString();
this.fetch();
} }
public Repo(String moduleName, String moduleDescription, String zipUrl, Date lastUpdated, Context context) { public void update(Date lastUpdate) {
appContext = context; if (lastUpdate.after(mLastUpdate)) {
this.mZipUrl = zipUrl; mLastUpdate = lastUpdate;
this.mDescription = moduleDescription; update();
this.mName = moduleName;
this.lastUpdate = lastUpdated.toString();
this.fetch();
}
public void fetch() {
// Construct initial url for contents
String repoString = WebRequest.makeWebServiceCall(mBaseUrl + "/contents?access_token=" + Utils.procFile(appContext.getString(R.string.some_string), appContext), WebRequest.GET);
try {
JSONArray repoArray = new JSONArray(repoString);
for (int f = 0; f < repoArray.length(); f++) {
JSONObject jsonobject = repoArray.getJSONObject(f);
String name = jsonobject.getString("name");
String url = jsonobject.getString("download_url").trim();
Log.d("Magisk","Repo - checking object named " + name + " with value of " + url);
if (name.contains(".zip")) {
this.mZipUrl = url;
}
if (name.equals("module.prop")) {
this.mManifestUrl = url;
}
if (name.contains("log.txt")) {
Log.d("Magisk","Repo: Setting log URL for " + name + " of " + url);
this.mLogUrl = url;
}
}
} catch (JSONException e) {
e.printStackTrace();
}
String manifestString = WebRequest.makeWebServiceCall(mManifestUrl, WebRequest.GET, true);
if (ParseProps(manifestString)) {
PutProps(manifestString);
}
}
private void PutProps(String manifestString) {
manifestString = manifestString + "zipUrl=" + mZipUrl + "\nbaseUrl=" + mBaseUrl + "\nlogUrl=" + mLogUrl + "\nmanifestUrl=" + mManifestUrl;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("repo_" + mId, manifestString);
editor.putBoolean("hasCachedRepos", true);
editor.putString("updated_" + mId, this.lastUpdate);
editor.apply();
}
private boolean ParseProps(String string) {
if ((string.length() <= 1) | (!string.contains("id"))) {
return false;
} else {
String lines[] = string.split("\\n");
for (String line : lines) {
if (line != "") {
String props[] = line.split("=");
switch (props[0]) {
case "versionCode":
this.mVersionCode = props[1];
break;
case "name":
this.mName = props[1];
break;
case "author":
this.mAuthor = props[1];
break;
case "id":
this.mId = props[1];
break;
case "version":
this.mVersion = props[1];
break;
case "description":
this.mDescription = props[1];
break;
case "donate":
this.mDonateUrl = props[1];
break;
case "cacheModule":
this.mIsCacheModule = Boolean.valueOf(props[1]);
break;
case "support":
this.mSupportUrl = props[1];
break;
case "logUrl":
this.mLogUrl = props[1];
break;
case "donateUrl":
this.mDonateUrl = props[1];
break;
case "zipUrl":
this.mZipUrl = props[1];
break;
case "baseUrl":
this.mBaseUrl = props[1];
break;
case "manifestUrl":
this.mManifestUrl = props[1];
break;
default:
Log.d("Magisk", "Manifest string not recognized: " + props[0]);
break;
}
}
}
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
if (prefs.contains("repo-isInstalled_" + this.mId)) {
mIsInstalled = prefs.getBoolean("repo-isInstalled_" + this.mId,false);
}
if (prefs.contains("repo-canUpdate_" + this.mId)) {
mCanUpdate = prefs.getBoolean("repo-canUpdate_" + this.mId,false);
}
if (prefs.contains("updated_" + this.mId)) {
lastUpdate = prefs.getString("updated_" + this.mId,"");
}
return this.mId != null;
} }
} }
public String getZipUrl() {
public String getStringProperty(String mValue) {
switch (mValue) {
case "author":
return mAuthor;
case "id":
return mId;
case "version":
return mVersion;
case "description":
return mDescription;
case "supportUrl":
return mSupportUrl;
case "donateUrl":
return mDonateUrl;
case "baseeUrl":
return mBaseUrl;
case "zipUrl":
return mZipUrl;
default:
return null;
}
}
public String getName() {
return mName;
}
public String getmVersion() {
return mVersion;
}
public int getmVersionCode() {
return Integer.valueOf(mVersionCode);
}
public String getDescription() {
return mDescription;
}
public String getId() {
return mId;
}
public String getmZipUrl() {
return mZipUrl; return mZipUrl;
} }
public String getmBaseUrl() { public String getLogUrl() {
return mBaseUrl;
}
public String getmLogUrl() {
return mLogUrl; return mLogUrl;
} }
public String getManifestUrl() {
public String getmAuthor() {
return mAuthor;
}
public String getmDonateUrl() {
return mDonateUrl;
}
public String getmManifestUrl() {
return mManifestUrl; return mManifestUrl;
} }
public String getmSupportUrl() { public Date getLastUpdate() {
return mSupportUrl; return mLastUpdate;
}
public String getLastUpdate() {
return lastUpdate;
} }
public boolean isInstalled() { return mIsInstalled; } public boolean isInstalled() { return mIsInstalled; }
@ -270,3 +63,258 @@ public class Repo {
public boolean isCacheModule() { return mIsCacheModule; } public boolean isCacheModule() { return mIsCacheModule; }
} }
//public class Repo {
// private String mBaseUrl;
// private String mZipUrl;
// private String mLogUrl;
// private String mManifestUrl;
// private String mVersion;
// private String mName;
// private String mDescription;
// private String mAuthor;
// public String mAuthorUrl;
// private String mId;
// private String mVersionCode;
// private String mSupportUrl;
// private String mDonateUrl;
// private String lastUpdate;
// private Context appContext;
// private boolean mIsInstalled,mCanUpdate,mIsCacheModule;
//
//
// public Repo(String manifestString, Context context) {
// appContext = context;
// ParseProps(manifestString);
//
// }
//
//
//
// public Repo(String name, String url, Date updated, Context context) {
// appContext = context;
// this.mName = name;
// this.mBaseUrl = url;
// this.lastUpdate = updated.toString();
//
// this.fetch();
//
// }
//
// public Repo(String moduleName, String moduleDescription, String zipUrl, Date lastUpdated, Context context) {
// appContext = context;
// this.mZipUrl = zipUrl;
// this.mDescription = moduleDescription;
// this.mName = moduleName;
// this.lastUpdate = lastUpdated.toString();
// this.fetch();
//
// }
//
// public void fetch() {
//
// // Construct initial url for contents
// String repoString = WebRequest.makeWebServiceCall(mBaseUrl + "/contents?access_token=" + Utils.procFile(appContext.getString(R.string.some_string), appContext), WebRequest.GET);
// try {
// JSONArray repoArray = new JSONArray(repoString);
// for (int f = 0; f < repoArray.length(); f++) {
// JSONObject jsonobject = repoArray.getJSONObject(f);
// String name = jsonobject.getString("name");
// String url = jsonobject.getString("download_url").trim();
// Log.d("Magisk","Repo - checking object named " + name + " with value of " + url);
// if (name.contains(".zip")) {
// this.mZipUrl = url;
// }
// if (name.equals("module.prop")) {
// this.mManifestUrl = url;
// }
// if (name.contains("log.txt")) {
// Log.d("Magisk","Repo: Setting log URL for " + name + " of " + url);
// this.mLogUrl = url;
// }
// }
// } catch (JSONException e) {
// e.printStackTrace();
// }
//
// String manifestString = WebRequest.makeWebServiceCall(mManifestUrl, WebRequest.GET, true);
//
// if (ParseProps(manifestString)) {
// PutProps(manifestString);
// }
//
// }
//
// private void PutProps(String manifestString) {
// manifestString = manifestString + "zipUrl=" + mZipUrl + "\nbaseUrl=" + mBaseUrl + "\nlogUrl=" + mLogUrl + "\nmanifestUrl=" + mManifestUrl;
// SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
// SharedPreferences.Editor editor = prefs.edit();
// editor.putString("repo_" + mId, manifestString);
// editor.putBoolean("hasCachedRepos", true);
// editor.putString("updated_" + mId, this.lastUpdate);
// editor.apply();
// }
// private boolean ParseProps(String string) {
//
// if ((string.length() <= 1) | (!string.contains("id"))) {
// return false;
// } else {
// String lines[] = string.split("\\n");
// for (String line : lines) {
// if (line != "") {
// String props[] = line.split("=");
// switch (props[0]) {
// case "versionCode":
// this.mVersionCode = props[1];
// break;
// case "name":
// this.mName = props[1];
// break;
// case "author":
// this.mAuthor = props[1];
// break;
// case "id":
// this.mId = props[1];
// break;
// case "version":
// this.mVersion = props[1];
// break;
// case "description":
// this.mDescription = props[1];
// break;
// case "donate":
// this.mDonateUrl = props[1];
// break;
// case "cacheModule":
// this.mIsCacheModule = Boolean.valueOf(props[1]);
// break;
// case "support":
// this.mSupportUrl = props[1];
// break;
// case "logUrl":
// this.mLogUrl = props[1];
// break;
// case "donateUrl":
// this.mDonateUrl = props[1];
// break;
// case "zipUrl":
// this.mZipUrl = props[1];
// break;
// case "baseUrl":
// this.mBaseUrl = props[1];
// break;
// case "manifestUrl":
// this.mManifestUrl = props[1];
// break;
// default:
// Log.d("Magisk", "Manifest string not recognized: " + props[0]);
// break;
// }
// }
//
// }
// SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
// if (prefs.contains("repo-isInstalled_" + this.mId)) {
// mIsInstalled = prefs.getBoolean("repo-isInstalled_" + this.mId,false);
// }
// if (prefs.contains("repo-canUpdate_" + this.mId)) {
// mCanUpdate = prefs.getBoolean("repo-canUpdate_" + this.mId,false);
// }
// if (prefs.contains("updated_" + this.mId)) {
// lastUpdate = prefs.getString("updated_" + this.mId,"");
// }
//
//
//
// return this.mId != null;
//
// }
// }
//
//
//
//
//
//
//
//
// public String getStringProperty(String mValue) {
// switch (mValue) {
// case "author":
// return mAuthor;
// case "id":
// return mId;
// case "version":
// return mVersion;
// case "description":
// return mDescription;
// case "supportUrl":
// return mSupportUrl;
// case "donateUrl":
// return mDonateUrl;
// case "baseeUrl":
// return mBaseUrl;
// case "zipUrl":
// return mZipUrl;
// default:
// return null;
// }
// }
//
// public String getName() {
// return mName;
// }
//
// public String getmVersion() {
// return mVersion;
// }
//
// public int getmVersionCode() {
// return Integer.valueOf(mVersionCode);
// }
//
// public String getDescription() {
// return mDescription;
// }
//
// public String getId() {
// return mId;
// }
//
// public String getZipUrl() {
// return mZipUrl;
// }
//
// public String getmBaseUrl() {
// return mBaseUrl;
// }
//
// public String getLogUrl() {
// return mLogUrl;
// }
//
//
// public String getAuthor() {
// return mAuthor;
// }
//
// public String getDonateUrl() {
// return mDonateUrl;
// }
//
// public String getmManifestUrl() {
// return mManifestUrl;
// }
//
// public String getSupportUrl() {
// return mSupportUrl;
// }
//
// public String getLastUpdate() {
// return lastUpdate;
// }
//
// public boolean isInstalled() { return mIsInstalled; }
// public boolean canUpdate() { return mCanUpdate; }
// public boolean isCacheModule() { return mIsCacheModule; }
//}

View File

@ -2,11 +2,9 @@ package com.topjohnwu.magisk.module;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.utils.Utils; import com.topjohnwu.magisk.utils.Utils;
import com.topjohnwu.magisk.utils.WebRequest; import com.topjohnwu.magisk.utils.WebRequest;
@ -18,181 +16,76 @@ import org.json.JSONObject;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map;
public class RepoHelper { public class RepoHelper {
private static List<Repo> repos = new ArrayList<>(); private static List<Repo> repos = new ArrayList<>();
private static String TAG = "Magisk"; private static String TAG = "Magisk";
public RepoHelper() { private static final String file_key = "RepoMap";
} private static final String key = "repomap";
public static HashMap<String, Repo> repoMap;
public static List<Repo> listRepos(Context context, boolean refresh, TaskDelegate delegate) { public static void createRepoMap(Context context) {
Gson gson = new Gson();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = context.getSharedPreferences(file_key, Context.MODE_PRIVATE);
String jsonString = prefs.getString(key, null);
if (!prefs.contains("hasCachedRepos") | refresh) { if (jsonString != null) {
Log.d(TAG, "RepoHelper: Building from web"); repoMap = gson.fromJson(jsonString, new TypeToken< HashMap<String, Repo> >(){}.getType());
new BuildFromWeb(delegate, context).execute();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
String date = format.format(Calendar.getInstance().getTime());
prefs.edit().putString("last_update", date).apply();
} else {
Log.d(TAG, "RepoHelper: Building from cache");
BuildFromCache(context);
} }
Collections.sort(repos, new CustomComparator()); if (repoMap == null) {
return repos; repoMap = new HashMap<>();
}
private static void BuildFromCache(Context activityContext) {
repos.clear();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activityContext);
Map<String, ?> map = prefs.getAll();
for (Map.Entry<String, ?> entry : map.entrySet()) {
if (entry.getKey().contains("repo_")) {
String repoString = entry.getValue().toString().replace("&quot;", "\"");
repos.add(new Repo(repoString, activityContext));
}
}
}
static class BuildFromWeb extends AsyncTask<String, String, Boolean> {
private TaskDelegate delegate;
private SharedPreferences prefs;
private Context activityContext;
public BuildFromWeb(TaskDelegate delegate, Context activityContext) {
this.delegate = delegate;
this.activityContext = activityContext;
prefs = PreferenceManager.getDefaultSharedPreferences(activityContext);
} }
@Override // Making a request to url and getting response
protected void onPreExecute() { String token = context.getString(R.string.some_string);
super.onPreExecute(); String url1 = context.getString(R.string.url_main);
String jsonStr = WebRequest.makeWebServiceCall(url1 + Utils.procFile(token, context), WebRequest.GET);
} if (jsonStr != null && !jsonStr.isEmpty()) {
try {
@Override JSONArray jsonArray = new JSONArray(jsonStr);
protected void onProgressUpdate(String... values) { for (int i = 0; i < jsonArray.length(); i++) {
super.onProgressUpdate(values); JSONObject jsonobject = jsonArray.getJSONObject(i);
prefs.edit().putBoolean("ignoreUpdateAlerts", false).apply(); String id = jsonobject.getString("description");
Toast.makeText(activityContext, "Refreshing online modules", Toast.LENGTH_SHORT).show(); String name = jsonobject.getString("name");
String lastUpdate = jsonobject.getString("updated_at");
} SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
Date updatedDate;
@Override try {
protected Boolean doInBackground(String... params) { updatedDate = format.parse(lastUpdate);
publishProgress(); } catch (ParseException e) {
continue;
// Making a request to url and getting response }
String token = activityContext.getString(R.string.some_string); Repo repo = repoMap.get(id);
String url1 = activityContext.getString(R.string.url_main); if (repo == null) {
String jsonStr = WebRequest.makeWebServiceCall(url1 + Utils.procFile(token, activityContext), WebRequest.GET); repoMap.put(id, new Repo(context, name, updatedDate));
if (jsonStr != null && !jsonStr.isEmpty()) { } else {
repo.update(updatedDate);
try {
repos.clear();
JSONArray jsonArray = new JSONArray(jsonStr);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonobject = jsonArray.getJSONObject(i);
String name = jsonobject.getString("name");
String url = jsonobject.getString("url");
String lastUpdate = jsonobject.getString("updated_at");
String mId = "";
String cacheUpdate = "";
String manifestString = "";
boolean doUpdate = true;
boolean hasCachedDate = false;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
Date updatedDate;
Map<String, ?> map = prefs.getAll();
for (Map.Entry<String, ?> entry : map.entrySet()) {
if (entry.getValue().toString().contains(url)) {
Log.d("Magisk", "RepoHelper: found matching URL");
manifestString = entry.getValue().toString();
String[] entryStrings = entry.getValue().toString().split("\n");
for (String valueString : entryStrings) {
String[] valueSub = valueString.split("=");
if (valueSub[0].equals("id")) {
mId = valueSub[1];
if (prefs.contains("updated_" + mId)) {
cacheUpdate = prefs.getString("updated_" + mId, "");
hasCachedDate = true;
}
}
}
}
}
try {
updatedDate = format.parse(lastUpdate);
Log.d("Magisk", "RepoHelper: Dates found, online is " + updatedDate + " and cached is " + cacheUpdate);
if (hasCachedDate) {
doUpdate = !cacheUpdate.equals(updatedDate.toString());
Log.d("Magisk", "RepoHelper: DoUpdate is " + doUpdate);
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return true;
}
if (!name.contains("Repo.github.io")) {
if (doUpdate) {
repos.add(new Repo(name, url, updatedDate, activityContext));
Log.d(TAG, "RepoHelper: Trying to add new repo for online refresh - " + name);
} else {
repos.add(new Repo(manifestString, activityContext));
Log.d(TAG, "RepoHelper: Trying to add new repo using manifestString of " + mId);
}
}
for (int f = 0; f < repos.size(); f++) {
repos.get(f).fetch();
}
} }
} catch (JSONException e) {
e.printStackTrace();
} }
return false; } catch (JSONException e) {
} else { e.printStackTrace();
return true;
} }
jsonString = gson.toJson(repoMap);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(key, jsonString);
editor.apply();
} }
}
protected void onPostExecute(Boolean apiFail) { public static List<Repo> getSortedList() {
if (apiFail) { ArrayList<Repo> list = new ArrayList<>(repoMap.values());
Toast.makeText(activityContext, "GitHub API Limit reached, please try refreshing again in an hour.", Toast.LENGTH_LONG).show(); Collections.sort(list, new Utils.ModuleComparator());
} else { return list;
Log.d("Magisk", "RepoHelper: postExecute fired");
delegate.taskCompletionResult("Complete");
BuildFromCache(activityContext);
}
}
} }
public interface TaskDelegate { public interface TaskDelegate {
void taskCompletionResult(String result); void taskCompletionResult(String result);
} }
public static class CustomComparator implements Comparator<Repo> {
@Override
public int compare(Repo o1, Repo o2) {
return o1.getName().compareTo(o2.getName());
}
}
} }

View File

@ -14,7 +14,6 @@ import com.topjohnwu.magisk.ModulesFragment;
import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.ReposFragment; import com.topjohnwu.magisk.ReposFragment;
import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.module.Module;
import com.topjohnwu.magisk.module.Repo;
import com.topjohnwu.magisk.module.RepoHelper; import com.topjohnwu.magisk.module.RepoHelper;
import org.json.JSONException; import org.json.JSONException;
@ -30,6 +29,7 @@ import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URL; import java.net.URL;
import java.util.Collections;
import java.util.List; import java.util.List;
public class Async { public class Async {
@ -195,17 +195,19 @@ public class Async {
for (String mod : magisk) { for (String mod : magisk) {
Log.d("Magisk", "Utils: Adding module from string " + mod); Log.d("Magisk", "Utils: Adding module from string " + mod);
ModulesFragment.listModules.add(new Module(mod, mContext)); ModulesFragment.listModules.add(new Module(mContext, mod));
} }
for (String mod : magiskCache) { for (String mod : magiskCache) {
Log.d("Magisk", "Utils: Adding cache module from string " + mod); Log.d("Magisk", "Utils: Adding cache module from string " + mod);
Module cacheMod = new Module(mod, mContext); Module cacheMod = new Module(mContext, mod);
// Prevent people forgot to change module.prop // Prevent people forgot to change module.prop
cacheMod.setCache(); cacheMod.setCache();
ModulesFragment.listModules.add(cacheMod); ModulesFragment.listModules.add(cacheMod);
} }
Collections.sort(ModulesFragment.listModules, new Utils.ModuleComparator());
return null; return null;
} }
@ -217,22 +219,15 @@ public class Async {
private boolean doReload; private boolean doReload;
private RepoHelper.TaskDelegate mTaskDelegate; private RepoHelper.TaskDelegate mTaskDelegate;
public LoadRepos(Context context, boolean reload, RepoHelper.TaskDelegate delegate) { public LoadRepos(Context context) {
mContext = context; mContext = context;
doReload = reload;
mTaskDelegate = delegate;
} }
@Override @Override
protected Void doInBackground(Void... voids) { protected Void doInBackground(Void... voids) {
ReposFragment.mListRepos.clear(); ReposFragment.mListRepos.clear();
List<Repo> magiskRepos = RepoHelper.listRepos(mContext, doReload, mTaskDelegate); RepoHelper.createRepoMap(mContext);
ReposFragment.mListRepos = RepoHelper.getSortedList();
for (Repo repo : magiskRepos) {
Log.d("Magisk", "Utils: Adding repo from string " + repo.getId());
ReposFragment.mListRepos.add(repo);
}
return null; return null;
} }

View File

@ -31,6 +31,7 @@ import com.topjohnwu.magisk.ModulesFragment;
import com.topjohnwu.magisk.MonitorService; import com.topjohnwu.magisk.MonitorService;
import com.topjohnwu.magisk.R; import com.topjohnwu.magisk.R;
import com.topjohnwu.magisk.ReposFragment; import com.topjohnwu.magisk.ReposFragment;
import com.topjohnwu.magisk.module.BaseModule;
import com.topjohnwu.magisk.module.Module; import com.topjohnwu.magisk.module.Module;
import com.topjohnwu.magisk.module.Repo; import com.topjohnwu.magisk.module.Repo;
import com.topjohnwu.magisk.module.RepoHelper; import com.topjohnwu.magisk.module.RepoHelper;
@ -52,6 +53,7 @@ import java.net.URL;
import java.security.InvalidKeyException; import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException; import java.security.spec.InvalidKeySpecException;
import java.util.Comparator;
import java.util.List; import java.util.List;
import javax.crypto.BadPaddingException; import javax.crypto.BadPaddingException;
@ -304,4 +306,10 @@ public class Utils {
} }
public static class ModuleComparator implements Comparator<BaseModule> {
@Override
public int compare(BaseModule o1, BaseModule o2) {
return o1.getName().compareTo(o2.getName());
}
}
} }

View File

@ -105,4 +105,6 @@
<string name="some_string">GTYybRBTYf5his9kQ16ZNO7qgkBJ/5MyVe4CGceAOIoXgSnnk8FTd4F1dE9p5Eus</string> <string name="some_string">GTYybRBTYf5his9kQ16ZNO7qgkBJ/5MyVe4CGceAOIoXgSnnk8FTd4F1dE9p5Eus</string>
<string name="downloads">Downloads</string> <string name="downloads">Downloads</string>
<string name="url_main">https://api.github.com/orgs/Magisk-Modules-Repo/repos?access_token=</string> <string name="url_main">https://api.github.com/orgs/Magisk-Modules-Repo/repos?access_token=</string>
<string name="file_url">https://raw.githubusercontent.com/Magisk-Modules-Repo/%1$s/master/%2$s</string>
<string name="zip_url">https://github.com/Magisk-Modules-Repo/%1$s/archive/master.zip</string>
</resources> </resources>