Skip to content
This repository was archived by the owner on Aug 23, 2024. It is now read-only.

Commit 16f64d4

Browse files
author
Stan Wijckmans
committed
Merge branch 'develop' into 'master'
Develop See merge request !4
2 parents ac3e156 + d5c0970 commit 16f64d4

File tree

5 files changed

+51
-24
lines changed

5 files changed

+51
-24
lines changed

mvvm/build.gradle

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ android {
88
defaultConfig {
99
minSdkVersion 16
1010
targetSdkVersion 25
11-
versionCode 1
12-
versionName "1.0.0.0"
11+
versionCode 4
12+
versionName "1.0.3"
1313
}
1414

1515
dataBinding {
@@ -18,7 +18,7 @@ android {
1818
}
1919

2020
dependencies {
21-
compile 'com.android.support:appcompat-v7:25.1.1'
21+
compile 'com.android.support:appcompat-v7:25.2.0'
2222
compile 'com.google.dagger:dagger:2.9'
2323
}
2424

@@ -43,7 +43,7 @@ publishing {
4343
maven(MavenPublication) {
4444
groupId 'be.stannieman'
4545
artifactId 'mvvm'
46-
version '1.0.0.0'
46+
version '1.0.3'
4747
artifact "$buildDir\\outputs\\aar\\signed-${project.getName()}-release.aar"
4848
artifact createJavaDocJar
4949
artifact createSourcesJar
@@ -66,4 +66,4 @@ publishing {
6666
url "$buildDir\\repo"
6767
}
6868
}
69-
}
69+
}

mvvm/src/main/java/stannieman/mvvm/helpers/MainThreadHelper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
import android.os.Handler;
44
import android.os.Looper;
55

6+
import javax.inject.Inject;
7+
68
/**
79
* Class to run a runnable on the main thread.
810
*/
911
public final class MainThreadHelper implements IMainThreadHelper {
1012
private final Handler mainThreadHandler;
1113

14+
@Inject
1215
public MainThreadHelper() {
1316
mainThreadHandler = new Handler(Looper.getMainLooper());
1417
}

mvvm/src/main/java/stannieman/mvvm/messaging/IHandle.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
/**
44
* Defines a class that can receive messages.
5+
* @param <T> type of the message to receive
56
*/
6-
public interface IHandle {
7+
8+
public interface IHandle<T> {
79
/**
810
* Handles a published message.
911
* @param message published message
1012
*/
11-
void Handle(Object message);
13+
void Handle(T message);
1214
}

mvvm/src/main/java/stannieman/mvvm/messaging/IMessenger.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,23 @@
77
public interface IMessenger {
88
/**
99
* Subscribes a handler to the messenger.
10-
* The subscribed handler will receive all published messages.
10+
* The subscribed handler will receive all published messages
11+
* for which it has IHandle<T> implemented where T is the type of the message.
1112
* @param subscriber handler to subscribe
1213
*/
13-
void subScribe(IHandle subscriber);
14+
void subscribe(Object subscriber);
1415

1516
/**
16-
* Unsuibscribes a handler from the messenger.
17+
* Unsubscribes a handler from the messenger.
1718
* The handler will no longer receive any messages.
1819
* @param subscriber handler to unsubscribe
1920
*/
20-
void unSubscribe(IHandle subscriber);
21+
void unsubscribe(Object subscriber);
2122

2223
/**
23-
* Publishes a message to all subscribed handlers.
24+
* Publishes a message to all subscribed handlers that can receive this type of message.
2425
* @param message message to publish
26+
* @param <T> Type of the message to send.
2527
*/
26-
void publish(Object message);
28+
<T> void publish(T message);
2729
}

mvvm/src/main/java/stannieman/mvvm/messaging/Messenger.java

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package stannieman.mvvm.messaging;
22

3-
import java.util.HashSet;
3+
import java.lang.reflect.ParameterizedType;
4+
import java.lang.reflect.Type;
5+
import java.util.Map;
46
import java.util.Set;
7+
import java.util.WeakHashMap;
58
import java.util.concurrent.locks.Lock;
69
import java.util.concurrent.locks.ReentrantLock;
710

@@ -17,32 +20,38 @@ public final class Messenger implements IMessenger {
1720
private final IMainThreadHelper mainThreadHelper;
1821

1922
private final Lock subscribersLock = new ReentrantLock();
20-
private final Set<IHandle> subscribers = new HashSet<>();
23+
private final Map<Object, Object> subscribers;
2124

25+
/**
26+
* Constructor that takes an IMainTreadHelper.
27+
* @param mainThreadHelper helper to invoke message handlers on the main thread.
28+
*/
2229
@Inject
2330
public Messenger(final IMainThreadHelper mainThreadHelper) {
2431
this.mainThreadHelper = mainThreadHelper;
32+
subscribers = new WeakHashMap<>();
2533
}
2634

2735
/**
2836
* Subscribes a handler to the messenger.
29-
* The subscribed handler will receive all published messages.
37+
* The subscribed handler will receive all published messages
38+
* for which it has IHandle<T> implemented where T is the type of the message.
3039
* @param subscriber handler to subscribe
3140
*/
3241
@Override
33-
public void subScribe(final IHandle subscriber) {
42+
public void subscribe(final Object subscriber) {
3443
subscribersLock.lock();
35-
subscribers.add(subscriber);
44+
subscribers.put(subscriber, null);
3645
subscribersLock.unlock();
3746
}
3847

3948
/**
40-
* Unsuibscribes a handler from the messenger.
49+
* Unsubscribes a handler from the messenger.
4150
* The handler will no longer receive any messages.
4251
* @param subscriber handler to unsubscribe
4352
*/
4453
@Override
45-
public void unSubscribe(final IHandle subscriber) {
54+
public void unsubscribe(final Object subscriber) {
4655
subscribersLock.lock();
4756
subscribers.remove(subscriber);
4857
subscribersLock.unlock();
@@ -52,17 +61,28 @@ public void unSubscribe(final IHandle subscriber) {
5261
* Publishes a message to all subscribed handlers.
5362
* @param message message to publish
5463
*/
64+
@SuppressWarnings("unchecked")
5565
@Override
56-
public void publish(final Object message) {
66+
public <T> void publish(final T message) {
5767
subscribersLock.lock();
58-
final Set<IHandle> copiedSubscribers = new HashSet<>(subscribers);
68+
final Set<Object> copiedSubscribers = subscribers.keySet();
5969
subscribersLock.unlock();
6070

6171
mainThreadHelper.postToMainThreadIfNeeded(new Runnable() {
6272
@Override
6373
public void run() {
64-
for (IHandle subscriber : copiedSubscribers) {
65-
subscriber.Handle(message);
74+
for (Object subscriber : copiedSubscribers) {
75+
Type[] genericInterfaces = subscriber.getClass().getGenericInterfaces();
76+
for (Type genericInterface : genericInterfaces) {
77+
if (genericInterface instanceof ParameterizedType) {
78+
Type[] genericTypes = ((ParameterizedType) genericInterface).getActualTypeArguments();
79+
for (Type type : genericTypes) {
80+
if (type == message.getClass()) {
81+
((IHandle<T>)subscriber).Handle(message);
82+
}
83+
}
84+
}
85+
}
6686
}
6787
}
6888
});

0 commit comments

Comments
 (0)