5454import com .smartdevicelink .transport .enums .TransportType ;
5555import com .smartdevicelink .util .DebugTool ;
5656
57+ import java .lang .ref .WeakReference ;
5758import java .util .ArrayList ;
5859import java .util .Collections ;
5960import java .util .concurrent .Callable ;
7071@ RestrictTo (RestrictTo .Scope .LIBRARY )
7172public 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