Rename Topic -> Event

This commit is contained in:
topjohnwu
2019-03-23 21:58:42 -04:00
parent a199b0ace1
commit 8ac3aaf36c
16 changed files with 183 additions and 178 deletions

View File

@@ -0,0 +1,123 @@
package com.topjohnwu.magisk.utils;
import androidx.annotation.IntDef;
import androidx.collection.ArraySet;
import com.topjohnwu.superuser.internal.UiThreadHandler;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Set;
public class Event {
public static final int MAGISK_HIDE_DONE = 0;
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;
@IntDef({MAGISK_HIDE_DONE, MODULE_LOAD_DONE, REPO_LOAD_DONE,
UPDATE_CHECK_DONE, LOCALE_FETCH_DONE})
@Retention(RetentionPolicy.SOURCE)
public @interface EventID {}
// We will not dynamically add topics, so use arrays instead of hash tables
private static Store[] eventList = new Store[5];
public static void register(Listener listener, @EventID int... events) {
for (int event : events) {
if (eventList[event] == null)
eventList[event] = new Store();
eventList[event].listeners.add(listener);
if (eventList[event].triggered) {
listener.onEvent(event);
}
}
}
public static void register(AutoListener listener) {
register(listener, listener.getListeningEvents());
}
public static void unregister(Listener listener, @EventID int... events) {
for (int event : events) {
if (eventList[event] == null)
continue;
eventList[event].listeners.remove(listener);
}
}
public static void unregister(AutoListener listener) {
unregister(listener, listener.getListeningEvents());
}
public static void trigger(@EventID int event) {
trigger(true, event, null);
}
public static void trigger(@EventID int event, Object result) {
trigger(true, event, result);
}
public static void trigger(boolean perm, @EventID int event) {
trigger(perm, event, null);
}
public static void trigger(boolean perm, @EventID int event, Object result) {
if (eventList[event] == null)
eventList[event] = new Store();
if (perm) {
eventList[event].result = result;
eventList[event].triggered = true;
}
for (Listener sub : eventList[event].listeners) {
UiThreadHandler.run(() -> sub.onEvent(event));
}
}
public static void reset(@EventID int event) {
if (eventList[event] == null)
return;
eventList[event].triggered = false;
eventList[event].result = null;
}
public static void reset(AutoListener listener) {
for (int event : listener.getListeningEvents())
reset(event);
}
public static boolean isTriggered(@EventID int event) {
if (eventList[event] == null)
return false;
return eventList[event].triggered;
}
public static boolean isTriggered(AutoListener listener) {
for (int event : listener.getListeningEvents()) {
if (!isTriggered(event))
return false;
}
return true;
}
public static <T> T getResult(@EventID int event) {
return (T) eventList[event].result;
}
private static class Store {
boolean triggered = false;
Set<Listener> listeners = new ArraySet<>();
Object result;
}
public interface Listener {
void onEvent(int event);
}
public interface AutoListener extends Listener {
@EventID
int[] getListeningEvents();
}
}

View File

@@ -141,7 +141,7 @@ public class LocaleManager {
}
Collections.sort(locales, (a, b) -> a.getDisplayName(a).compareTo(b.getDisplayName(b)));
Topic.publish(Topic.LOCALE_FETCH_DONE);
Event.trigger(Event.LOCALE_FETCH_DONE);
});
}
}

View File

@@ -1,108 +0,0 @@
package com.topjohnwu.magisk.utils;
import androidx.annotation.IntDef;
import com.topjohnwu.superuser.internal.UiThreadHandler;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashSet;
import java.util.Set;
public class Topic {
public static final int MAGISK_HIDE_DONE = 0;
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;
@IntDef({MAGISK_HIDE_DONE, MODULE_LOAD_DONE, REPO_LOAD_DONE,
UPDATE_CHECK_DONE, LOCALE_FETCH_DONE})
@Retention(RetentionPolicy.SOURCE)
public @interface TopicID {}
// We will not dynamically add topics, so use arrays instead of hash tables
private static Store[] topicList = new Store[5];
public static void subscribe(Subscriber sub, @TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
topicList[topic] = new Store();
topicList[topic].subscribers.add(sub);
if (topicList[topic].published) {
sub.onPublish(topic, topicList[topic].results);
}
}
}
public static void subscribe(AutoSubscriber sub) {
subscribe(sub, sub.getSubscribedTopics());
}
public static void unsubscribe(Subscriber sub, @TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
continue;
topicList[topic].subscribers.remove(sub);
}
}
public static void unsubscribe(AutoSubscriber sub) {
unsubscribe(sub, sub.getSubscribedTopics());
}
public static void publish(@TopicID int topic, Object... results) {
publish(true, topic, results);
}
public static void publish(boolean persist, @TopicID int topic, Object... results) {
if (topicList[topic] == null)
topicList[topic] = new Store();
if (persist) {
topicList[topic].results = results;
topicList[topic].published = true;
}
for (Subscriber sub : topicList[topic].subscribers) {
UiThreadHandler.run(() -> sub.onPublish(topic, results));
}
}
public static void reset(@TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
continue;
topicList[topic].published = false;
topicList[topic].results = null;
}
}
public static boolean isPublished(@TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
return false;
if (!topicList[topic].published)
return false;
}
return true;
}
public static boolean isPublished(AutoSubscriber sub) {
return isPublished(sub.getSubscribedTopics());
}
private static class Store {
boolean published = false;
Set<Subscriber> subscribers = new HashSet<>();
Object[] results;
}
public interface Subscriber {
void onPublish(int topic, Object[] result);
}
public interface AutoSubscriber extends Subscriber {
@TopicID
int[] getSubscribedTopics();
}
}

View File

@@ -95,7 +95,7 @@ public class Utils {
}
public static void loadModules() {
Topic.reset(Topic.MODULE_LOAD_DONE);
Event.reset(Event.MODULE_LOAD_DONE);
App.THREAD_POOL.execute(() -> {
Map<String, Module> moduleMap = new ValueSortedMap<>();
SuFile path = new SuFile(Const.MAGISK_PATH);
@@ -106,7 +106,7 @@ public class Utils {
Module module = new Module(Const.MAGISK_PATH + "/" + file.getName());
moduleMap.put(module.getId(), module);
}
Topic.publish(Topic.MODULE_LOAD_DONE, moduleMap);
Event.trigger(Event.MODULE_LOAD_DONE, moduleMap);
});
}