13
13
import com .eis .smslibrary .listeners .SMSReceivedServiceListener ;
14
14
import com .eis .smslibrary .listeners .SMSSentListener ;
15
15
16
- import java .lang .ref .WeakReference ;
17
-
18
16
import it .lucacrema .preferences .PreferencesManager ;
19
17
20
-
21
18
/**
22
19
* Communication handler for SMSs. It's a Singleton, you should
23
- * access it with {@link #getInstance}, and before doing anything you
24
- * should call {@link #setup}.<br/>
20
+ * access it with {@link #getInstance}
25
21
*
26
22
* @author Luca Crema, Marco Mariotto, Alberto Ursino, Marco Tommasini, Marco Cognolato
27
- * @since 29/11/2019
28
23
*/
29
24
@ SuppressWarnings ({"WeakerAccess" , "unused" })
30
25
public class SMSManager implements CommunicationManager <SMSMessage > {
@@ -39,11 +34,9 @@ public class SMSManager implements CommunicationManager<SMSMessage> {
39
34
private static SMSManager instance ;
40
35
41
36
/**
42
- * Weak reference doesn't prevent garbage collector to
43
- * de-allocate this class when it has reference to a
44
- * context that is still running. Prevents memory leaks.
37
+ * Received listener reference
45
38
*/
46
- private WeakReference < Context > context ;
39
+ private SMSReceivedServiceListener receivedListener ;
47
40
48
41
/**
49
42
* This message counter is used so that we can have a different action name
@@ -70,15 +63,6 @@ public static SMSManager getInstance() {
70
63
return instance ;
71
64
}
72
65
73
- /**
74
- * Setup for the handler.
75
- *
76
- * @param context current context.
77
- */
78
- public void setup (Context context ) {
79
- this .context = new WeakReference <>(context );
80
- }
81
-
82
66
/**
83
67
* Sends a message to a destination peer via SMS.
84
68
* Requires {@link android.Manifest.permission#SEND_SMS}
@@ -87,7 +71,7 @@ public void setup(Context context) {
87
71
*/
88
72
@ Override
89
73
public void sendMessage (final @ NonNull SMSMessage message ) {
90
- sendMessage (message , null , null );
74
+ sendMessage (message , null , null , null );
91
75
}
92
76
93
77
/**
@@ -96,9 +80,12 @@ public void sendMessage(final @NonNull SMSMessage message) {
96
80
*
97
81
* @param message to be sent in the channel to a peer
98
82
* @param sentListener called on message sent or on error, can be null
83
+ * @param context The context of the application used to setup the listener
99
84
*/
100
- public void sendMessage (final @ NonNull SMSMessage message , final @ Nullable SMSSentListener sentListener ) {
101
- sendMessage (message , sentListener , null );
85
+ public void sendMessage (final @ NonNull SMSMessage message ,
86
+ final @ Nullable SMSSentListener sentListener ,
87
+ Context context ) {
88
+ sendMessage (message , sentListener , null , context );
102
89
}
103
90
104
91
/**
@@ -107,9 +94,12 @@ public void sendMessage(final @NonNull SMSMessage message, final @Nullable SMSSe
107
94
*
108
95
* @param message to be sent in the channel to a peer
109
96
* @param deliveredListener called on message delivered or on error, can be null
97
+ * @param context The context of the application used to setup the listener
110
98
*/
111
- public void sendMessage (final @ NonNull SMSMessage message , final @ Nullable SMSDeliveredListener deliveredListener ) {
112
- sendMessage (message , null , deliveredListener );
99
+ public void sendMessage (final @ NonNull SMSMessage message ,
100
+ final @ Nullable SMSDeliveredListener deliveredListener ,
101
+ Context context ) {
102
+ sendMessage (message , null , deliveredListener , context );
113
103
}
114
104
115
105
/**
@@ -119,13 +109,14 @@ public void sendMessage(final @NonNull SMSMessage message, final @Nullable SMSDe
119
109
* @param message to be sent in the channel to a peer
120
110
* @param sentListener called on message sent or on error, can be null
121
111
* @param deliveredListener called on message delivered or on error, can be null
112
+ * @param context The context of the application used to setup the listener
122
113
*/
123
114
public void sendMessage (final @ NonNull SMSMessage message ,
124
115
final @ Nullable SMSSentListener sentListener ,
125
- final @ Nullable SMSDeliveredListener deliveredListener ) {
126
- checkSetup ();
127
- PendingIntent sentPI = setupNewSentReceiver (message , sentListener );
128
- PendingIntent deliveredPI = setupNewDeliverReceiver (message , deliveredListener );
116
+ final @ Nullable SMSDeliveredListener deliveredListener ,
117
+ Context context ) {
118
+ PendingIntent sentPI = setupNewSentReceiver (message , sentListener , context );
119
+ PendingIntent deliveredPI = setupNewDeliverReceiver (message , deliveredListener , context );
129
120
SMSCore .sendMessage (getSMSContent (message ), message .getPeer ().getAddress (), sentPI , deliveredPI );
130
121
}
131
122
@@ -135,16 +126,19 @@ public void sendMessage(final @NonNull SMSMessage message,
135
126
*
136
127
* @param message that will be sent
137
128
* @param listener to call on broadcast received
129
+ * @param context The context of the application used to setup the listener
138
130
* @return a {@link PendingIntent} to be passed to SMSCore
139
131
*/
140
- private PendingIntent setupNewSentReceiver (final @ NonNull SMSMessage message , final @ Nullable SMSSentListener listener ) {
141
- if (listener == null )
142
- return null ; //Doesn't make any sense to have a BroadcastReceiver if there is no listener
132
+ private PendingIntent setupNewSentReceiver (final @ NonNull SMSMessage message ,
133
+ final @ Nullable SMSSentListener listener ,
134
+ Context context ) {
135
+ if (listener == null || context == null )
136
+ return null ; //Doesn't make any sense to have a BroadcastReceiver if there is no listener or context
143
137
144
138
SMSSentBroadcastReceiver onSentReceiver = new SMSSentBroadcastReceiver (message , listener );
145
139
String actionName = SENT_MESSAGE_INTENT_ACTION + (messageCounter ++);
146
- context .get (). registerReceiver (onSentReceiver , new IntentFilter (actionName ));
147
- return PendingIntent .getBroadcast (context . get () , 0 , new Intent (actionName ), 0 );
140
+ context .registerReceiver (onSentReceiver , new IntentFilter (actionName ));
141
+ return PendingIntent .getBroadcast (context , 0 , new Intent (actionName ), 0 );
148
142
}
149
143
150
144
/**
@@ -153,26 +147,19 @@ private PendingIntent setupNewSentReceiver(final @NonNull SMSMessage message, fi
153
147
*
154
148
* @param message that will be sent
155
149
* @param listener to call on broadcast received
150
+ * @param context The context of the application used to setup the listener
156
151
* @return a {@link PendingIntent} to be passed to SMSCore
157
152
*/
158
- private PendingIntent setupNewDeliverReceiver (final @ NonNull SMSMessage message , final @ Nullable SMSDeliveredListener listener ) {
159
- if (listener == null )
153
+ private PendingIntent setupNewDeliverReceiver (final @ NonNull SMSMessage message ,
154
+ final @ Nullable SMSDeliveredListener listener ,
155
+ Context context ) {
156
+ if (listener == null || context == null )
160
157
return null ; //Doesn't make any sense to have a BroadcastReceiver if there is no listener
161
158
162
159
SMSDeliveredBroadcastReceiver onDeliveredReceiver = new SMSDeliveredBroadcastReceiver (message , listener );
163
160
String actionName = DELIVERED_MESSAGE_INTENT_ACTION + (messageCounter ++);
164
- context .get ().registerReceiver (onDeliveredReceiver , new IntentFilter (actionName ));
165
- return PendingIntent .getBroadcast (context .get (), 0 , new Intent (actionName ), 0 );
166
- }
167
-
168
- /**
169
- * Checks if the handler has been setup
170
- *
171
- * @throws IllegalStateException if the handler has not been setup
172
- */
173
- private void checkSetup () {
174
- if (context == null )
175
- throw new IllegalStateException ("You must call setup() first" );
161
+ context .registerReceiver (onDeliveredReceiver , new IntentFilter (actionName ));
162
+ return PendingIntent .getBroadcast (context , 0 , new Intent (actionName ), 0 );
176
163
}
177
164
178
165
/**
@@ -181,18 +168,19 @@ private void checkSetup() {
181
168
*
182
169
* @param receivedListenerClassName the listener called on message received
183
170
* @param <T> the class type that extends {@link SMSReceivedServiceListener} to be called
171
+ * @param context the context used to set the listener
184
172
*/
185
- public <T extends SMSReceivedServiceListener > void setReceivedListener (Class <T > receivedListenerClassName ) {
186
- checkSetup ();
187
- PreferencesManager .setString (context .get (), SMSReceivedBroadcastReceiver .SERVICE_CLASS_PREFERENCES_KEY , receivedListenerClassName .toString ());
173
+ public <T extends SMSReceivedServiceListener > void setReceivedListener (Class <T > receivedListenerClassName , Context context ) {
174
+ PreferencesManager .setString (context , SMSReceivedBroadcastReceiver .SERVICE_CLASS_PREFERENCES_KEY , receivedListenerClassName .toString ());
188
175
}
189
176
190
177
/**
191
178
* Unsubscribe the current {@link SMSReceivedServiceListener} from being called on message arrival
179
+ *
180
+ * @param context The context used to remove the listener
192
181
*/
193
- public void removeReceivedListener () {
194
- checkSetup ();
195
- PreferencesManager .removeValue (context .get (), SMSReceivedBroadcastReceiver .SERVICE_CLASS_PREFERENCES_KEY );
182
+ public void removeReceivedListener (Context context ) {
183
+ PreferencesManager .removeValue (context , SMSReceivedBroadcastReceiver .SERVICE_CLASS_PREFERENCES_KEY );
196
184
}
197
185
198
186
/**
0 commit comments