Skip to content

Commit 39d5b6e

Browse files
committed
Refactor to more descriptive naming
and make context into a weakreference
1 parent d917c6b commit 39d5b6e

1 file changed

Lines changed: 62 additions & 52 deletions

File tree

android/sdl_android/src/main/java/com/smartdevicelink/managers/lifecycle/LifecycleManager.java

Lines changed: 62 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.smartdevicelink.transport.enums.TransportType;
5555
import com.smartdevicelink.util.DebugTool;
5656

57+
import java.lang.ref.WeakReference;
5758
import java.util.ArrayList;
5859
import java.util.Collections;
5960
import java.util.concurrent.Callable;
@@ -70,14 +71,14 @@
7071
@RestrictTo(RestrictTo.Scope.LIBRARY)
7172
public class LifecycleManager extends BaseLifecycleManager {
7273
private static final int RESPONSE_WAIT_TIME = 2000;
73-
private ISdlServiceListener navServiceListener;
74-
private boolean navServiceStartResponseReceived = false;
75-
private boolean navServiceStartResponse = false;
76-
private boolean navServiceEndResponseReceived = false;
77-
private boolean navServiceEndResponse = false;
78-
private boolean pcmServiceEndResponseReceived = false;
79-
private boolean pcmServiceEndResponse = false;
80-
private Context context;
74+
private ISdlServiceListener videoServiceListener;
75+
private boolean videoServiceStartResponseReceived = false; //FIXME these statuses should be improved
76+
private boolean videoServiceStartResponse = false;
77+
private boolean videoServiceEndResponseReceived = false;
78+
private boolean videoServiceEndResponse = false;
79+
private boolean audioServiceEndResponseReceived = false;
80+
private boolean audioServiceEndResponse = false;
81+
private WeakReference<Context> contextWeakReference;
8182

8283
public LifecycleManager(AppConfig appConfig, BaseTransportConfig config, LifecycleListener listener) {
8384
super(appConfig, config, listener);
@@ -131,14 +132,19 @@ void cycle(SdlDisconnectedReason disconnectedReason) {
131132

132133
@RestrictTo(RestrictTo.Scope.LIBRARY)
133134
public void setContext(Context context) {
134-
this.context = context;
135+
this.contextWeakReference = new WeakReference<>(context);
135136
}
136137

137138
@Override
138139
void setSdlSecurityStaticVars() {
139140
super.setSdlSecurityStaticVars();
140141

142+
Context context = null;
141143
Service service = null;
144+
145+
if(this.contextWeakReference != null){
146+
context = contextWeakReference.get();
147+
}
142148
if (context != null && context instanceof Service) {
143149
service = (Service) context;
144150
}
@@ -150,8 +156,8 @@ void setSdlSecurityStaticVars() {
150156
void onProtocolSessionStarted(SessionType sessionType) {
151157
super.onProtocolSessionStarted(sessionType);
152158
if (sessionType.eq(SessionType.NAV)) {
153-
navServiceStartResponseReceived = true;
154-
navServiceStartResponse = true;
159+
videoServiceStartResponseReceived = true;
160+
videoServiceStartResponse = true;
155161
}
156162
}
157163

@@ -171,32 +177,32 @@ void onTransportDisconnected(String info, boolean availablePrimary, BaseTranspor
171177
void onProtocolSessionStartedNACKed(SessionType sessionType) {
172178
super.onProtocolSessionStartedNACKed(sessionType);
173179
if (sessionType.eq(SessionType.NAV)) {
174-
navServiceStartResponseReceived = true;
175-
navServiceStartResponse = false;
180+
videoServiceStartResponseReceived = true;
181+
videoServiceStartResponse = false;
176182
}
177183
}
178184

179185
@Override
180186
void onProtocolSessionEnded(SessionType sessionType) {
181187
super.onProtocolSessionEnded(sessionType);
182188
if (sessionType.eq(SessionType.NAV)) {
183-
navServiceEndResponseReceived = true;
184-
navServiceEndResponse = true;
189+
videoServiceEndResponseReceived = true;
190+
videoServiceEndResponse = true;
185191
} else if (sessionType.eq(SessionType.PCM)) {
186-
pcmServiceEndResponseReceived = true;
187-
pcmServiceEndResponse = true;
192+
audioServiceEndResponseReceived = true;
193+
audioServiceEndResponse = true;
188194
}
189195
}
190196

191197
@Override
192198
void onProtocolSessionEndedNACKed(SessionType sessionType) {
193199
super.onProtocolSessionEndedNACKed(sessionType);
194200
if (sessionType.eq(SessionType.NAV)) {
195-
navServiceEndResponseReceived = true;
196-
navServiceEndResponse = false;
201+
videoServiceEndResponseReceived = true;
202+
videoServiceEndResponse = false;
197203
} else if (sessionType.eq(SessionType.PCM)) {
198-
pcmServiceEndResponseReceived = true;
199-
pcmServiceEndResponse = false;
204+
audioServiceEndResponseReceived = true;
205+
audioServiceEndResponse = false;
200206
}
201207
}
202208

@@ -247,25 +253,26 @@ private VideoStreamingParameters tryStartVideoStream(boolean isEncrypted, VideoS
247253
return null;
248254
}
249255

250-
if (!navServiceStartResponseReceived || !navServiceStartResponse //If we haven't started the service before
251-
|| (navServiceStartResponse && isEncrypted && !session.isServiceProtected(SessionType.NAV))) { //Or the service has been started but we'd like to start an encrypted one
256+
257+
if (!videoServiceStartResponseReceived || !videoServiceStartResponse //If we haven't started the service before
258+
|| (videoServiceStartResponse && isEncrypted && !session.isServiceProtected(SessionType.NAV))) { //Or the service has been started but we'd like to start an encrypted one
252259
session.setDesiredVideoParams(parameters);
253260

254-
navServiceStartResponseReceived = false;
255-
navServiceStartResponse = false;
261+
videoServiceStartResponseReceived = false;
262+
videoServiceStartResponse = false;
256263

257264
session.startService(SessionType.NAV, session.getSessionId(), isEncrypted);
258-
addNavListener();
259-
FutureTask<Void> fTask = new FutureTask<>(new CallableMethod(RESPONSE_WAIT_TIME));
265+
addVideoServiceListener();
266+
FutureTask<Void> timeoutTask = new FutureTask<>(new TimeoutCallable(RESPONSE_WAIT_TIME));
260267
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
261-
scheduler.execute(fTask);
268+
scheduler.execute(timeoutTask);
262269

263270
//noinspection StatementWithEmptyBody
264-
while (!navServiceStartResponseReceived && !fTask.isDone()) ;
271+
while (!videoServiceStartResponseReceived && !timeoutTask.isDone()) ;
265272
scheduler.shutdown();
266273
}
267274

268-
if (navServiceStartResponse) {
275+
if (videoServiceStartResponse) {
269276
if (getProtocolVersion() != null && getProtocolVersion().getMajor() < 5) { //Versions 1-4 do not support streaming parameter negotiations
270277
session.setAcceptedVideoParams(parameters);
271278
}
@@ -275,30 +282,30 @@ private VideoStreamingParameters tryStartVideoStream(boolean isEncrypted, VideoS
275282
return null;
276283
}
277284

278-
private void addNavListener() {
285+
private void addVideoServiceListener() {
279286
// videos may be started and stopped. Only add this once
280-
if (navServiceListener == null) {
287+
if (videoServiceListener == null) {
281288

282-
navServiceListener = new ISdlServiceListener() {
289+
videoServiceListener = new ISdlServiceListener() {
283290
@Override
284291
public void onServiceStarted(SdlSession session, SessionType type, boolean isEncrypted) {
285292
}
286293

287294
@Override
288295
public void onServiceEnded(SdlSession session, SessionType type) {
289296
// reset nav flags so nav can start upon the next transport connection
290-
navServiceStartResponseReceived = false;
291-
navServiceStartResponse = false;
297+
videoServiceStartResponseReceived = false;
298+
videoServiceStartResponse = false;
292299
}
293300

294301
@Override
295302
public void onServiceError(SdlSession session, SessionType type, String reason) {
296303
// if there is an error reset the flags so that there is a chance to restart streaming
297-
navServiceStartResponseReceived = false;
298-
navServiceStartResponse = false;
304+
videoServiceStartResponseReceived = false;
305+
videoServiceStartResponse = false;
299306
}
300307
};
301-
session.addServiceListener(SessionType.NAV, navServiceListener);
308+
session.addServiceListener(SessionType.NAV, videoServiceListener);
302309
}
303310
}
304311

@@ -318,19 +325,19 @@ boolean endVideoStream() {
318325
return false;
319326
}
320327

321-
navServiceEndResponseReceived = false;
322-
navServiceEndResponse = false;
328+
videoServiceEndResponseReceived = false;
329+
videoServiceEndResponse = false;
323330
session.stopVideoStream();
324331

325-
FutureTask<Void> fTask = new FutureTask<>(new CallableMethod(RESPONSE_WAIT_TIME));
332+
FutureTask<Void> timeoutTask = new FutureTask<>(new TimeoutCallable(RESPONSE_WAIT_TIME));
326333
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
327-
scheduler.execute(fTask);
334+
scheduler.execute(timeoutTask);
328335

329336
//noinspection StatementWithEmptyBody
330-
while (!navServiceEndResponseReceived && !fTask.isDone()) ;
337+
while (!videoServiceEndResponseReceived && !timeoutTask.isDone()) ;
331338
scheduler.shutdown();
332339

333-
return navServiceEndResponse;
340+
return videoServiceEndResponse;
334341
}
335342

336343
@Override
@@ -362,25 +369,28 @@ boolean endAudioStream() {
362369
return false;
363370
}
364371

365-
pcmServiceEndResponseReceived = false;
366-
pcmServiceEndResponse = false;
372+
audioServiceEndResponseReceived = false;
373+
audioServiceEndResponse = false;
367374
session.stopAudioStream();
368375

369-
FutureTask<Void> fTask = new FutureTask<>(new CallableMethod(RESPONSE_WAIT_TIME));
376+
FutureTask<Void> timeoutTask = new FutureTask<>(new TimeoutCallable(RESPONSE_WAIT_TIME));
370377
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
371-
scheduler.execute(fTask);
378+
scheduler.execute(timeoutTask);
372379

373380
//noinspection StatementWithEmptyBody
374-
while (!pcmServiceEndResponseReceived && !fTask.isDone()) ;
381+
while (!audioServiceEndResponseReceived && !timeoutTask.isDone()) ;
375382
scheduler.shutdown();
376383

377-
return pcmServiceEndResponse;
384+
return audioServiceEndResponse;
378385
}
379386

380-
private class CallableMethod implements Callable<Void> {
387+
/**
388+
* This is a small class that's only purpose is to be a waiting type callable.
389+
*/
390+
private class TimeoutCallable implements Callable<Void> {
381391
private final long waitTime;
382392

383-
public CallableMethod(int timeInMillis) {
393+
public TimeoutCallable(int timeInMillis) {
384394
this.waitTime = timeInMillis;
385395
}
386396

0 commit comments

Comments
 (0)