commit 2ddfebe2a80a24675a7a1320fc5562737fe5c5e5 Author: Hashik Donthineni HashikDonthineni@gmail.com Date: Wed Jun 17 22:59:20 2020 +0530
Changed fetchOffer into a loop to avoid spaghetti code --- .../torproject/snowflake/MyPersistentService.java | 59 ++++++++++++++-------- 1 file changed, 38 insertions(+), 21 deletions(-)
diff --git a/app/src/main/java/org/torproject/snowflake/MyPersistentService.java b/app/src/main/java/org/torproject/snowflake/MyPersistentService.java index 0273d05..8b20772 100644 --- a/app/src/main/java/org/torproject/snowflake/MyPersistentService.java +++ b/app/src/main/java/org/torproject/snowflake/MyPersistentService.java @@ -40,7 +40,7 @@ import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.schedulers.Schedulers;
/** @@ -55,9 +55,9 @@ public class MyPersistentService extends Service { private SharedPreferences sharedPreferences; private boolean isServiceStarted; private PowerManager.WakeLock wakeLock; - private Disposable serviceDisposable; + private CompositeDisposable compositeDisposable; private NotificationManager mNotificationManager; - + private boolean isConnectionAlive;
@Nullable @Override @@ -91,6 +91,8 @@ public class MyPersistentService extends Service { Log.d(TAG, "onCreate: Service Created");
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); + isConnectionAlive = false; + compositeDisposable = new CompositeDisposable(); sharedPreferences = getSharedPreferences(getString(R.string.sharedpreference_file), MODE_PRIVATE); //Assigning the shared preferences Notification notification = createPersistentNotification(false, null); startForeground(ForegroundServiceConstants.DEF_NOTIFICATION_ID, notification); @@ -99,8 +101,8 @@ public class MyPersistentService extends Service { @Override public void onDestroy() { sharedPreferencesHelper(ForegroundServiceConstants.SERVICE_STOPPED); - if (serviceDisposable != null) - serviceDisposable.dispose(); //Stopping the network request if it's running. + if (compositeDisposable != null) + compositeDisposable.dispose(); //Disposing all the threads. Including network calls. if (mainDataChannel != null) { mainDataChannel.close(); } @@ -220,9 +222,18 @@ public class MyPersistentService extends Service { * Initializing and starting WebRTC connection. */ private void startWebRTCConnection() { + Log.d(TAG, "startWebRTCConnection: Starting Connection."); initializePeerConnectionFactory(); //Android Specific, you can Ignore. mainPeerConnection = createPeerConnection(factory); //Creating New Peer Connection. - fetchOffer(); + compositeDisposable.add( + //First argument is initialDelay, Second argument is the time after which it has to repeat. + Observable.interval(1, 5, TimeUnit.SECONDS) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(aLong -> { + fetchOffer(); //This runs on main thread. + }) + ); }
/** @@ -323,14 +334,19 @@ public class MyPersistentService extends Service { * Sending post request to get offer from the broker. */ private void fetchOffer() { - Log.d(TAG, "fetchOffer: Fetching offer from broker."); - ///Retrofit call - final GetOfferService getOfferService = RetroServiceGenerator.createService(GetOfferService.class); - Observable<SDPOfferResponse> offer = getOfferService.getOffer(GlobalApplication.getHeadersMap(), new OfferRequestBody("555")); //TODO:Randomly Generate SID. - serviceDisposable = offer.subscribeOn(Schedulers.io()) - .delaySubscription(5, TimeUnit.SECONDS) //Delay of 5 seconds before sending request to avoid sending too many requests in case of a failure. - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::offerRequestSuccess, this::offerRequestFailure); + //Fetch offer only when the connection is not alive/active and only when the service is on. + if (isServiceStarted && !isConnectionAlive) { + isConnectionAlive = true; //Considering connection is alive from now on, until it is set to false. + Log.d(TAG, "fetchOffer: Fetching offer from broker."); + ///Retrofit call + final GetOfferService getOfferService = RetroServiceGenerator.createService(GetOfferService.class); + Observable<SDPOfferResponse> offer = getOfferService.getOffer(GlobalApplication.getHeadersMap(), new OfferRequestBody("555")); //TODO:Randomly Generate SID. + compositeDisposable.add( + offer.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(this::offerRequestSuccess, this::offerRequestFailure) + ); + } }
/** @@ -355,8 +371,7 @@ public class MyPersistentService extends Service { } else { updateNotification("No client match, retrying..."); Log.d(TAG, "requestSuccess: NO CLIENT MATCH"); - if (isServiceStarted) - fetchOffer(); //Sending request for offer again. + isConnectionAlive = false; } }
@@ -368,8 +383,7 @@ public class MyPersistentService extends Service { public void offerRequestFailure(Throwable t) { updateNotification("Request failed, retrying..."); Log.d(TAG, "requestFailure: " + t.getMessage()); - if (isServiceStarted) - fetchOffer(); //Sending request for offer again. + isConnectionAlive = false; }
/** @@ -382,8 +396,10 @@ public class MyPersistentService extends Service { AnswerBody body = new AnswerBody("555", bodySDP.toString()); //TODO:Use randomly Generate SID from sendRequest SendAnswerService service = RetroServiceGenerator.createService(SendAnswerService.class); Observable<AnsResponse> response = service.sendAnswer(GlobalApplication.getHeadersMap(), body); - serviceDisposable = response.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()).subscribe(this::answerResponseSuccess, this::answerResponseFailure); + compositeDisposable.add( + response.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()).subscribe(this::answerResponseSuccess, this::answerResponseFailure) + ); }
/** @@ -407,6 +423,7 @@ public class MyPersistentService extends Service { */ private void answerResponseFailure(Throwable throwable) { Log.e(TAG, "answerResponseFailure: " + throwable.getMessage()); + isConnectionAlive = false; }
/** @@ -417,6 +434,6 @@ public class MyPersistentService extends Service { //Closing both to avoid memory leak. mainDataChannel.close(); mainPeerConnection.close(); - fetchOffer(); //Sending request for offer again. + isConnectionAlive = false; } }