@Override public void call(final Subscriber<? super Location> subscriber) { MainThreadSubscription.verifyMainThread(); LocationSource.OnLocationChangedListener listener = new LocationSource.OnLocationChangedListener() { @Override public void onLocationChanged(Location location) { if (!subscriber.isUnsubscribed()) { subscriber.onNext(location); } } }; locationSource.activate(listener); subscriber.add(new MainThreadSubscription() { @Override protected void onUnsubscribe() { locationSource.deactivate(); } }); }
@Override public void setLocationSource(LocationSource locationSource) { real.setLocationSource(locationSource); }
@Override public final void setLocationSource(LocationSource source) { map.setLocationSource(source); }
LocationChangeOnSubscribe(LocationSource locationSource) { this.locationSource = locationSource; }
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (savedInstanceState != null) { keepCurrentLocationVisible = savedInstanceState.getBoolean( KEEP_CURRENT_LOCATION_VISIBLE_KEY, false); if (keepCurrentLocationVisible) { Location location = (Location) savedInstanceState.getParcelable(CURRENT_LOCATION_KEY); if (location != null) { setCurrentLocation(location); } } } /* * At this point, after onCreateView, getMap will not return null and we can * initialize googleMap. However, onActivityCreated can be called multiple * times, e.g., when the user switches tabs. With * GoogleMapOptions.useViewLifecycleInFragment == false, googleMap lifecycle * is tied to the fragment lifecycle and the same googleMap object is * returned in getMap. Thus we only need to initialize googleMap once, when * it is null. */ if (googleMap == null) { googleMap = getMap(); googleMap.setMyLocationEnabled(true); /* * My Tracks needs to handle the onClick event when the my location button * is clicked. Currently, the API doesn't allow handling onClick event, * thus hiding the default my location button and providing our own. */ googleMap.getUiSettings().setMyLocationButtonEnabled(false); googleMap.setIndoorEnabled(true); googleMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { if (isResumed()) { String title = marker.getTitle(); if (title != null && title.length() > 0) { long id = Long.valueOf(title); Context context = getActivity(); Intent intent = IntentUtils.newIntent(context, MarkerDetailActivity.class) .putExtra(MarkerDetailActivity.EXTRA_MARKER_ID, id); context.startActivity(intent); } } return true; } }); googleMap.setLocationSource(new LocationSource() { @Override public void activate(OnLocationChangedListener listener) { onLocationChangedListener = listener; } @Override public void deactivate() { onLocationChangedListener = null; } }); googleMap.setOnCameraChangeListener(new OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { if (isResumed() && keepCurrentLocationVisible && currentLocation != null && !isLocationVisible(currentLocation)) { keepCurrentLocationVisible = false; } } }); } }
/** * Create an observable which emits on {@code source} location change events. * <p> * <em>Warning:</em> The created observable keeps a strong reference to {@code source}. * Unsubscribe to free this reference. * </p> */ @CheckResult @NonNull public static Observable<Location> locationSourceLocationChanges(@NonNull LocationSource source) { checkNotNull(source, "source == null"); return Observable.create(new LocationChangeOnSubscribe(source)); }
void setLocationSource(LocationSource locationSource);
void setLocationSource(LocationSource source);