108 lines
3.3 KiB
Java
Raw Normal View History

package com.topjohnwu.magisk.utils;
2018-08-01 00:47:31 +08:00
import com.topjohnwu.magisk.Data;
2018-03-17 20:20:05 +08:00
2018-08-01 00:47:31 +08:00
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashSet;
import java.util.Set;
2018-09-10 02:27:45 -04:00
import androidx.annotation.IntDef;
2018-08-01 00:47:31 +08:00
public class Topic {
2018-06-02 22:00:52 +08:00
2018-08-01 00:47:31 +08:00
public static final int MAGISK_HIDE_DONE = 0;
2018-09-17 23:29:38 -04:00
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 SNET_CHECK_DONE = 4;
public static final int LOCALE_FETCH_DONE = 5;
@IntDef({MAGISK_HIDE_DONE, MODULE_LOAD_DONE, REPO_LOAD_DONE,
UPDATE_CHECK_DONE, SNET_CHECK_DONE, LOCALE_FETCH_DONE})
2018-08-01 00:47:31 +08:00
@Retention(RetentionPolicy.SOURCE)
public @interface TopicID {}
// We will not dynamically add topics, so use arrays instead of hash tables
2018-09-17 23:29:38 -04:00
private static Store[] topicList = new Store[6];
2018-08-01 00:47:31 +08:00
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);
}
}
}
2018-08-01 00:47:31 +08:00
public static void subscribe(AutoSubscriber sub) {
if (sub instanceof Subscriber)
subscribe((Subscriber) sub, sub.getSubscribedTopics());
}
2018-08-01 00:47:31 +08:00
public static void unsubscribe(Subscriber sub, @TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
continue;
topicList[topic].subscribers.remove(sub);
}
}
2018-08-01 00:47:31 +08:00
public static void unsubscribe(AutoSubscriber sub) {
if (sub instanceof Subscriber)
unsubscribe((Subscriber) sub, sub.getSubscribedTopics());
}
2018-08-01 00:47:31 +08:00
public static void publish(@TopicID int topic, Object... results) {
publish(true, topic, results);
2017-10-07 17:12:36 +08:00
}
2018-08-01 00:47:31 +08:00
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) {
Data.mainHandler.post(() -> sub.onPublish(topic, results));
}
}
2018-08-01 00:47:31 +08:00
public static void reset(@TopicID int... topics) {
for (int topic : topics) {
if (topicList[topic] == null)
continue;
topicList[topic].published = false;
topicList[topic].results = null;
}
2018-03-17 20:20:05 +08:00
}
2018-08-02 00:41:10 +08:00
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;
}
2018-08-01 00:47:31 +08:00
private static class Store {
boolean published = false;
Set<Subscriber> subscribers = new HashSet<>();
Object[] results;
2018-03-17 20:20:05 +08:00
}
public interface Subscriber {
2018-08-01 00:47:31 +08:00
void onPublish(int topic, Object[] result);
}
2018-06-02 22:00:52 +08:00
2018-08-01 00:47:31 +08:00
public interface AutoSubscriber {
@TopicID
int[] getSubscribedTopics();
2018-06-02 22:00:52 +08:00
}
}