mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-12-25 21:07:38 +00:00
Removed update repos as it can be done via repository
This commit is contained in:
parent
e65f9740fb
commit
90d85eaf7d
@ -1,177 +0,0 @@
|
|||||||
package com.topjohnwu.magisk.tasks;
|
|
||||||
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.util.Pair;
|
|
||||||
|
|
||||||
import com.topjohnwu.magisk.App;
|
|
||||||
import com.topjohnwu.magisk.Config;
|
|
||||||
import com.topjohnwu.magisk.Const;
|
|
||||||
import com.topjohnwu.magisk.model.entity.Repo;
|
|
||||||
import com.topjohnwu.magisk.utils.Event;
|
|
||||||
import com.topjohnwu.magisk.utils.Logger;
|
|
||||||
import com.topjohnwu.magisk.utils.Utils;
|
|
||||||
import com.topjohnwu.net.Networking;
|
|
||||||
import com.topjohnwu.net.Request;
|
|
||||||
|
|
||||||
import org.json.JSONArray;
|
|
||||||
import org.json.JSONException;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
|
|
||||||
import java.net.HttpURLConnection;
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.text.ParseException;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.Queue;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.TimeZone;
|
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.concurrent.Future;
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public class UpdateRepos {
|
|
||||||
private static final DateFormat DATE_FORMAT;
|
|
||||||
|
|
||||||
private final App app = App.self;
|
|
||||||
private Set<String> cached;
|
|
||||||
private Queue<Pair<String, Date>> moduleQueue;
|
|
||||||
|
|
||||||
static {
|
|
||||||
DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
|
|
||||||
DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void runTasks(Runnable task) {
|
|
||||||
Future[] futures = new Future[App.THREAD_POOL.getMaximumPoolSize() - 1];
|
|
||||||
for (int i = 0; i < futures.length; ++i) {
|
|
||||||
futures[i] = App.THREAD_POOL.submit(task);
|
|
||||||
}
|
|
||||||
for (Future f : futures) {
|
|
||||||
while (true) {
|
|
||||||
try {
|
|
||||||
f.get();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
continue;
|
|
||||||
} catch (ExecutionException ignored) {}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We sort repos by last push, which means that we only need to check whether the
|
|
||||||
* first page is updated to determine whether the online repo database is changed
|
|
||||||
*/
|
|
||||||
private boolean parsePage(int page) {
|
|
||||||
Request req = Networking.get(Utils.fmt(Const.Url.REPO_URL, page + 1));
|
|
||||||
if (page == 0) {
|
|
||||||
String etag = Config.get(Config.Key.ETAG_KEY);
|
|
||||||
if (etag != null)
|
|
||||||
req.addHeaders(Const.Key.IF_NONE_MATCH, etag);
|
|
||||||
}
|
|
||||||
Request.Result<JSONArray> res = req.execForJSONArray();
|
|
||||||
// JSON not updated
|
|
||||||
if (res.getCode() == HttpURLConnection.HTTP_NOT_MODIFIED)
|
|
||||||
return false;
|
|
||||||
// Network error
|
|
||||||
if (res.getResult() == null) {
|
|
||||||
cached.clear();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
// Current page is the last page
|
|
||||||
if (res.getResult().length() == 0)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
try {
|
|
||||||
for (int i = 0; i < res.getResult().length(); i++) {
|
|
||||||
JSONObject rawRepo = res.getResult().getJSONObject(i);
|
|
||||||
String id = rawRepo.getString("name");
|
|
||||||
Date date = DATE_FORMAT.parse(rawRepo.getString("pushed_at"));
|
|
||||||
moduleQueue.offer(new Pair<>(id, date));
|
|
||||||
}
|
|
||||||
} catch (JSONException | ParseException e) {
|
|
||||||
// Should not happen, but if exception occurs, page load fails
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update ETAG
|
|
||||||
if (page == 0) {
|
|
||||||
String etag = res.getConnection().getHeaderField(Config.Key.ETAG_KEY);
|
|
||||||
if (etag != null) {
|
|
||||||
etag = etag.substring(etag.indexOf('\"'), etag.lastIndexOf('\"') + 1);
|
|
||||||
Config.set(Config.Key.ETAG_KEY, etag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String links = res.getConnection().getHeaderField(Const.Key.LINK_KEY);
|
|
||||||
return links == null || !links.contains("next") || parsePage(page + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean loadPages() {
|
|
||||||
if (!parsePage(0))
|
|
||||||
return false;
|
|
||||||
runTasks(() -> {
|
|
||||||
while (true) {
|
|
||||||
Pair<String, Date> pair = moduleQueue.poll();
|
|
||||||
if (pair == null)
|
|
||||||
return;
|
|
||||||
Repo repo = app.getRepoDB().getRepo(pair.first);
|
|
||||||
try {
|
|
||||||
if (repo == null)
|
|
||||||
repo = new Repo(pair.first);
|
|
||||||
else
|
|
||||||
cached.remove(pair.first);
|
|
||||||
repo.update(pair.second);
|
|
||||||
app.getRepoDB().addRepo(repo);
|
|
||||||
} catch (Repo.IllegalRepoException e) {
|
|
||||||
Logger.debug(e.getMessage());
|
|
||||||
app.getRepoDB().removeRepo(pair.first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fullReload() {
|
|
||||||
Cursor c = app.getRepoDB().getRawCursor();
|
|
||||||
runTasks(() -> {
|
|
||||||
while (true) {
|
|
||||||
Repo repo;
|
|
||||||
synchronized (c) {
|
|
||||||
if (!c.moveToNext())
|
|
||||||
return;
|
|
||||||
repo = new Repo(c);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
repo.update();
|
|
||||||
app.getRepoDB().addRepo(repo);
|
|
||||||
} catch (Repo.IllegalRepoException e) {
|
|
||||||
Logger.debug(e.getMessage());
|
|
||||||
app.getRepoDB().removeRepo(repo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void exec(boolean force) {
|
|
||||||
Event.reset(Event.REPO_LOAD_DONE);
|
|
||||||
App.THREAD_POOL.execute(() -> {
|
|
||||||
cached = Collections.synchronizedSet(app.getRepoDB().getRepoIDSet());
|
|
||||||
moduleQueue = new ConcurrentLinkedQueue<>();
|
|
||||||
|
|
||||||
if (loadPages()) {
|
|
||||||
// The leftover cached means they are removed from online repo
|
|
||||||
app.getRepoDB().removeRepo(cached);
|
|
||||||
} else if (force) {
|
|
||||||
fullReload();
|
|
||||||
}
|
|
||||||
Event.trigger(Event.REPO_LOAD_DONE);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void exec() {
|
|
||||||
exec(false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,19 +6,11 @@ import com.skoumal.teanity.viewmodel.LoadingViewModel
|
|||||||
import com.topjohnwu.magisk.model.events.BackPressEvent
|
import com.topjohnwu.magisk.model.events.BackPressEvent
|
||||||
import com.topjohnwu.magisk.model.events.PermissionEvent
|
import com.topjohnwu.magisk.model.events.PermissionEvent
|
||||||
import com.topjohnwu.magisk.model.events.ViewActionEvent
|
import com.topjohnwu.magisk.model.events.ViewActionEvent
|
||||||
import com.topjohnwu.magisk.utils.Event
|
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
import io.reactivex.subjects.PublishSubject
|
import io.reactivex.subjects.PublishSubject
|
||||||
import timber.log.Timber
|
|
||||||
|
|
||||||
|
|
||||||
abstract class MagiskViewModel : LoadingViewModel(), Event.AutoListener {
|
abstract class MagiskViewModel : LoadingViewModel() {
|
||||||
|
|
||||||
@Deprecated("")
|
|
||||||
override fun onEvent(event: Int) = Timber.i("Event of $event was not handled")
|
|
||||||
|
|
||||||
@Deprecated("")
|
|
||||||
override fun getListeningEvents(): IntArray = intArrayOf()
|
|
||||||
|
|
||||||
fun withView(action: Activity.() -> Unit) {
|
fun withView(action: Activity.() -> Unit) {
|
||||||
ViewActionEvent(action).publish()
|
ViewActionEvent(action).publish()
|
||||||
|
@ -10,7 +10,6 @@ import com.topjohnwu.magisk.data.repository.MagiskRepository
|
|||||||
import com.topjohnwu.magisk.model.events.*
|
import com.topjohnwu.magisk.model.events.*
|
||||||
import com.topjohnwu.magisk.model.observer.Observer
|
import com.topjohnwu.magisk.model.observer.Observer
|
||||||
import com.topjohnwu.magisk.ui.base.MagiskViewModel
|
import com.topjohnwu.magisk.ui.base.MagiskViewModel
|
||||||
import com.topjohnwu.magisk.utils.Event
|
|
||||||
import com.topjohnwu.magisk.utils.ISafetyNetHelper
|
import com.topjohnwu.magisk.utils.ISafetyNetHelper
|
||||||
import com.topjohnwu.magisk.utils.toggle
|
import com.topjohnwu.magisk.utils.toggle
|
||||||
import com.topjohnwu.superuser.Shell
|
import com.topjohnwu.superuser.Shell
|
||||||
@ -87,8 +86,6 @@ class HomeViewModel(
|
|||||||
private val latest = resources.getString(R.string.latest_version)
|
private val latest = resources.getString(R.string.latest_version)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
Event.register(this)
|
|
||||||
|
|
||||||
isForceEncryption.addOnPropertyChangedCallback {
|
isForceEncryption.addOnPropertyChangedCallback {
|
||||||
Config.keepEnc = it ?: return@addOnPropertyChangedCallback
|
Config.keepEnc = it ?: return@addOnPropertyChangedCallback
|
||||||
}
|
}
|
||||||
@ -99,13 +96,6 @@ class HomeViewModel(
|
|||||||
refresh()
|
refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onEvent(event: Int) {
|
|
||||||
updateSelf()
|
|
||||||
ensureEnv()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getListeningEvents(): IntArray = intArrayOf(Event.UPDATE_CHECK_DONE)
|
|
||||||
|
|
||||||
fun paypalPressed() = OpenLinkEvent(Const.Url.PAYPAL_URL).publish()
|
fun paypalPressed() = OpenLinkEvent(Const.Url.PAYPAL_URL).publish()
|
||||||
fun patreonPressed() = OpenLinkEvent(Const.Url.PATREON_URL).publish()
|
fun patreonPressed() = OpenLinkEvent(Const.Url.PATREON_URL).publish()
|
||||||
fun twitterPressed() = OpenLinkEvent(Const.Url.TWITTER_URL).publish()
|
fun twitterPressed() = OpenLinkEvent(Const.Url.TWITTER_URL).publish()
|
||||||
|
@ -79,7 +79,7 @@ public class SettingsFragment extends BasePreferenceFragment {
|
|||||||
});
|
});
|
||||||
findPreference("hosts").setOnPreferenceClickListener(pref -> {
|
findPreference("hosts").setOnPreferenceClickListener(pref -> {
|
||||||
Shell.su("add_hosts_module").exec();
|
Shell.su("add_hosts_module").exec();
|
||||||
Utils.loadModules();
|
//Utils.loadModules();
|
||||||
Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT);
|
Utils.toast(R.string.settings_hosts_toast, Toast.LENGTH_SHORT);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
@ -288,11 +288,13 @@ public class SettingsFragment extends BasePreferenceFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public void onEvent(int event) {
|
public void onEvent(int event) {
|
||||||
setLocalePreference((ListPreference) findPreference(Config.Key.LOCALE));
|
setLocalePreference((ListPreference) findPreference(Config.Key.LOCALE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Deprecated
|
||||||
public int[] getListeningEvents() {
|
public int[] getListeningEvents() {
|
||||||
return new int[] {Event.LOCALE_FETCH_DONE};
|
return new int[] {Event.LOCALE_FETCH_DONE};
|
||||||
}
|
}
|
||||||
|
@ -12,14 +12,10 @@ import androidx.collection.ArraySet;
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
public class Event {
|
public class Event {
|
||||||
|
|
||||||
public static final int MAGISK_HIDE_DONE = 0;
|
@Deprecated
|
||||||
public static final int MODULE_LOAD_DONE = 1;
|
|
||||||
public static final int REPO_LOAD_DONE = 2;
|
|
||||||
public static final int UPDATE_CHECK_DONE = 3;
|
|
||||||
public static final int LOCALE_FETCH_DONE = 4;
|
public static final int LOCALE_FETCH_DONE = 4;
|
||||||
|
|
||||||
@IntDef({MAGISK_HIDE_DONE, MODULE_LOAD_DONE, REPO_LOAD_DONE,
|
@IntDef(LOCALE_FETCH_DONE)
|
||||||
UPDATE_CHECK_DONE, LOCALE_FETCH_DONE})
|
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
public @interface EventID {}
|
public @interface EventID {}
|
||||||
|
|
||||||
|
@ -7,8 +7,6 @@ import android.content.res.Resources;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import androidx.annotation.StringRes;
|
|
||||||
|
|
||||||
import com.topjohnwu.magisk.App;
|
import com.topjohnwu.magisk.App;
|
||||||
import com.topjohnwu.magisk.Config;
|
import com.topjohnwu.magisk.Config;
|
||||||
import com.topjohnwu.superuser.Shell;
|
import com.topjohnwu.superuser.Shell;
|
||||||
@ -20,9 +18,11 @@ import java.util.HashSet;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
|
|
||||||
public class LocaleManager {
|
public class LocaleManager {
|
||||||
public static Locale locale = Locale.getDefault();
|
public static Locale locale = Locale.getDefault();
|
||||||
public final static Locale defaultLocale = Locale.getDefault();
|
public static final Locale defaultLocale = Locale.getDefault();
|
||||||
public static List<Locale> locales;
|
public static List<Locale> locales;
|
||||||
|
|
||||||
public static Locale forLanguageTag(String tag) {
|
public static Locale forLanguageTag(String tag) {
|
||||||
@ -44,7 +44,7 @@ public class LocaleManager {
|
|||||||
default:
|
default:
|
||||||
language = tok[0];
|
language = tok[0];
|
||||||
}
|
}
|
||||||
if ((language.length() != 2 && language.length() != 3))
|
if (language.length() != 2 && language.length() != 3)
|
||||||
return new Locale("");
|
return new Locale("");
|
||||||
if (tok.length == 1)
|
if (tok.length == 1)
|
||||||
return new Locale(language);
|
return new Locale(language);
|
||||||
@ -114,6 +114,7 @@ public class LocaleManager {
|
|||||||
return getLocaleContext(locale).getString(id);
|
return getLocaleContext(locale).getString(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public static void loadAvailableLocales(@StringRes int compareId) {
|
public static void loadAvailableLocales(@StringRes int compareId) {
|
||||||
Shell.EXECUTOR.execute(() -> {
|
Shell.EXECUTOR.execute(() -> {
|
||||||
locales = new ArrayList<>();
|
locales = new ArrayList<>();
|
||||||
|
@ -85,24 +85,6 @@ public class Utils {
|
|||||||
.replace("#", "").replace("@", "").replace("\\", "_");
|
.replace("#", "").replace("@", "").replace("\\", "_");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public static void loadModules() {
|
|
||||||
loadModules(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public static void loadModules(boolean async) {
|
|
||||||
Event.reset(Event.MODULE_LOAD_DONE);
|
|
||||||
Runnable run = () -> {
|
|
||||||
Map<String, OldModule> moduleMap = loadModulesLeanback();
|
|
||||||
Event.trigger(Event.MODULE_LOAD_DONE, moduleMap);
|
|
||||||
};
|
|
||||||
if (async)
|
|
||||||
App.THREAD_POOL.execute(run);
|
|
||||||
else
|
|
||||||
run.run();
|
|
||||||
}
|
|
||||||
|
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public static Map<String, OldModule> loadModulesLeanback() {
|
public static Map<String, OldModule> loadModulesLeanback() {
|
||||||
final Map<String, OldModule> moduleMap = new ValueSortedMap<>();
|
final Map<String, OldModule> moduleMap = new ValueSortedMap<>();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user