package com.patloew.rxlocationsample;
import android.location.Address;
import android.location.Location;
import android.util.Log;
import com.google.android.gms.location.LocationRequest;
import com.patloew.rxlocation.RxLocation;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
/* Copyright 2016 Patrick Löwenstein
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. */
public class MainPresenter {
private final CompositeDisposable disposable = new CompositeDisposable();
private final RxLocation rxLocation;
private final LocationRequest locationRequest;
private MainView view;
public MainPresenter(RxLocation rxLocation) {
this.rxLocation = rxLocation;
this.locationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(5000);
}
public void attachView(MainView view) {
this.view = view;
startLocationRefresh();
}
public void detachView() {
this.view = null;
disposable.clear();
}
public void startLocationRefresh() {
disposable.add(
rxLocation.settings().checkAndHandleResolution(locationRequest)
.flatMapObservable(this::getAddressObservable)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(view::onAddressUpdate, throwable -> Log.e("MainPresenter", "Error fetching location/address updates", throwable))
);
}
private Observable<Address> getAddressObservable(boolean success) {
if(success) {
return rxLocation.location().updates(locationRequest)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(view::onLocationUpdate)
.flatMap(this::getAddressFromLocation);
} else {
view.onLocationSettingsUnsuccessful();
return rxLocation.location().lastLocation()
.doOnSuccess(view::onLocationUpdate)
.flatMapObservable(this::getAddressFromLocation);
}
}
private Observable<Address> getAddressFromLocation(Location location) {
return rxLocation.geocoding().fromLocation(location).toObservable()
.subscribeOn(Schedulers.io());
}
}