MockWalker.java
import android.content.Context;
import android.os.Bundle;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
import rx.Observable;
import rx.subjects.PublishSubject;
public class MockWalker implements GoogleApiClient.ConnectionCallbacks {
private static MockWalker sMockWalker;
public static synchronized MockWalker get(Context context) {
if (sMockWalker == null) {
sMockWalker = new MockWalker(context);
}
return sMockWalker;
}
private PublishSubject<MockWalker> mChanges;
private Context mContext;
private final GoogleApiClient mClient;
private boolean mStarted;
private MockWalk mMockWalk;
private MockWalker(Context context) {
mContext = context.getApplicationContext();
mChanges = PublishSubject.create();
mClient = new GoogleApiClient.Builder(mContext)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.build();
mClient.connect();
}
public Observable<MockWalker> getChanges() {
return mChanges;
}
@Override
public void onConnected(Bundle bundle) {
syncWalkState();
}
public void setStarted(boolean started) {
mStarted = started;
syncWalkState();
mChanges.onNext(this);
}
public boolean isStarted() {
return mStarted;
}
private void syncWalkState() {
if (!mStarted && mMockWalk != null) {
mMockWalk.quit();
mMockWalk = null;
} else if (!mStarted && mMockWalk == null) {
// all good
} else if (mStarted && mMockWalk == null && !mClient.isConnected()) {
// all good
} else if (mStarted && mMockWalk == null && mClient.isConnected()) {
mMockWalk = new MockWalk(mClient);
mMockWalk.start();
}
}
@Override
public void onConnectionSuspended(int i) {
}
}