diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java index 35dbb5f19..7b36ee3bf 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyMapContract.java @@ -1,8 +1,10 @@ package fr.free.nrw.commons.nearby.mvp.contract; import android.net.Uri; +import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.mapbox.mapboxsdk.maps.MapView; import fr.free.nrw.commons.nearby.Place; @@ -21,7 +23,7 @@ public interface NearbyMapContract { void updateMapMarkers(); void updateMapToTrackPosition(); void setListeners(); - void setupMapView(); + MapView setupMapView(Bundle savedInstanceState); void addCurrentLocationMarker(); void setSearchThisAreaButtonVisibility(boolean visible); boolean isCurrentLocationMarkerVisible(); @@ -38,6 +40,7 @@ public interface NearbyMapContract { void animateFABs(boolean isFabOpen); void closeFabs ( boolean isFabOpen); void updateMarker(boolean isBookmarked, Place place); + void setViewsAreReady(NearbyParentFragmentContract.ViewsAreReadyCallback viewsAreReadyCallback); } interface UserActions extends NearbyElementContract.UserActions { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java index 53b10f3f3..7565915e1 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/contract/NearbyParentFragmentContract.java @@ -23,4 +23,8 @@ public interface NearbyParentFragmentContract { void updateMapAndList(LocationServiceManager.LocationChangeType locationChangeType); void lockNearby(boolean isNearbyLocked); } + + interface ViewsAreReadyCallback { + void nearbyFragmentAndMapViewReady(); + } } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java index 631c85548..0ed44ca18 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyMapFragment.java @@ -1,14 +1,114 @@ package fr.free.nrw.commons.nearby.mvp.fragments; import android.net.Uri; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import butterknife.BindView; +import butterknife.ButterKnife; +import fr.free.nrw.commons.R; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; +import fr.free.nrw.commons.nearby.NearbyFragment; import fr.free.nrw.commons.nearby.Place; import fr.free.nrw.commons.nearby.mvp.contract.NearbyMapContract; +import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract; +import timber.log.Timber; public class NearbyMapFragment extends CommonsDaggerSupportFragment implements NearbyMapContract.View { + @BindView(R.id.bottom_sheet) + View bottomSheetList; + + @BindView(R.id.bottom_sheet_details) + View bottomSheetDetails; + + MapView mapView; + public NearbyParentFragmentContract.ViewsAreReadyCallback viewsAreReadyCallback; + + private BottomSheetBehavior bottomSheetListBehavior; + private BottomSheetBehavior bottomSheetDetailsBehavior; + private Animation rotate_backward; + private Animation fab_close; + private Animation fab_open; + private Animation rotate_forward; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Timber.d("Nearby map fragment created"); + Mapbox.getInstance(getActivity(), + getString(R.string.mapbox_commons_app_token)); + Mapbox.getTelemetry().setUserTelemetryRequestState(false); + setRetainInstance(true); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + Timber.d("onCreateView called"); + this.mapView = setupMapView(savedInstanceState); + setHasOptionsMenu(false); + initViews(); + return mapView; + } + + @Override + public void initViews() { + Timber.d("init views called"); + View view = ((NearbyFragment)getParentFragment()).view; + ButterKnife.bind(this, view); + bottomSheetListBehavior = BottomSheetBehavior.from(bottomSheetList); + bottomSheetDetailsBehavior = BottomSheetBehavior.from(bottomSheetDetails); + bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + bottomSheetDetails.setVisibility(View.VISIBLE); + + fab_open = AnimationUtils.loadAnimation(getParentFragment().getActivity(), R.anim.fab_open); + fab_close = AnimationUtils.loadAnimation(getParentFragment().getActivity(), R.anim.fab_close); + rotate_forward = AnimationUtils.loadAnimation(getParentFragment().getActivity(), R.anim.rotate_forward); + rotate_backward = AnimationUtils.loadAnimation(getParentFragment().getActivity(), R.anim.rotate_backward); + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + super.onViewCreated(view, savedInstanceState); + this.getView().setFocusableInTouchMode(true); + this.getView().requestFocus(); + this.getView().setOnKeyListener((v, keyCode, event) -> { + if (keyCode == KeyEvent.KEYCODE_BACK) { + if (bottomSheetDetailsBehavior.getState() == BottomSheetBehavior + .STATE_EXPANDED) { + bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); + return true; + } else if (bottomSheetDetailsBehavior.getState() == BottomSheetBehavior + .STATE_COLLAPSED) { + bottomSheetDetailsBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); + mapView.getMapAsync(MapboxMap::deselectMarkers); + return true; + } + } + return false; + }); + viewsAreReadyCallback.nearbyFragmentAndMapViewReady(); + } + + @Override + public MapView setupMapView(Bundle savedInstanceState) { + return null; + } + @Override public void showSearchThisAreaButton() { @@ -19,11 +119,6 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N } - @Override - public void initViews() { - - } - @Override public void updateMapMarkers() { @@ -39,11 +134,6 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N } - @Override - public void setupMapView() { - - } - @Override public void addCurrentLocationMarker() { @@ -124,6 +214,11 @@ public class NearbyMapFragment extends CommonsDaggerSupportFragment implements N } + @Override + public void setViewsAreReady(NearbyParentFragmentContract.ViewsAreReadyCallback viewsAreReadyCallback) { + this.viewsAreReadyCallback = viewsAreReadyCallback; + } + @Override public void showPlaces() { diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java index 5e44fd79e..e02405d3c 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/fragments/NearbyParentFragment.java @@ -27,8 +27,6 @@ import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.location.LocationUpdateListener; import fr.free.nrw.commons.nearby.NearbyController; -import fr.free.nrw.commons.nearby.NearbyListFragment; -import fr.free.nrw.commons.nearby.NearbyMapFragment; import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract; import fr.free.nrw.commons.nearby.mvp.presenter.NearbyParentFragmentPresenter; import fr.free.nrw.commons.utils.NetworkUtils; @@ -68,8 +66,8 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment private NearbyParentFragmentContract.UserActions userActions; - private fr.free.nrw.commons.nearby.NearbyMapFragment nearbyMapFragment; - private fr.free.nrw.commons.nearby.NearbyListFragment nearbyListFragment; + private NearbyMapFragment nearbyMapFragment; + private NearbyListFragment nearbyListFragment; private static final String TAG_RETAINED_MAP_FRAGMENT = NearbyMapFragment.class.getSimpleName(); private static final String TAG_RETAINED_LIST_FRAGMENT = NearbyListFragment.class.getSimpleName(); private NearbyParentFragmentPresenter nearbyParentFragmentPresenter; @@ -78,7 +76,6 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); - nearbyParentFragmentPresenter = new NearbyParentFragmentPresenter(this); } @Nullable @@ -93,6 +90,7 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment public void onResume() { super.onResume(); resumeFragment(); + nearbyParentFragmentPresenter = new NearbyParentFragmentPresenter(this, nearbyMapFragment); } /** diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java index 644012d7a..94f7ade3f 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/mvp/presenter/NearbyParentFragmentPresenter.java @@ -17,7 +17,8 @@ import static fr.free.nrw.commons.location.LocationServiceManager.LocationChange public class NearbyParentFragmentPresenter implements NearbyParentFragmentContract.UserActions, WikidataEditListener.WikidataP18EditListener, - LocationUpdateListener { + LocationUpdateListener, + NearbyParentFragmentContract.ViewsAreReadyCallback{ @Inject LocationServiceManager locationManager; @@ -26,10 +27,14 @@ public class NearbyParentFragmentPresenter private boolean isNearbyLocked; private LatLng curLatLng; + boolean nearbyViewsAreReady; + boolean onTabSelected; + public NearbyParentFragmentPresenter(NearbyParentFragmentContract.View nearbyParentFragmentView, NearbyMapContract.View nearbyMapFragmentView) { this.nearbyParentFragmentView = nearbyParentFragmentView; this.nearbyMapFragmentView = nearbyMapFragmentView; + nearbyMapFragmentView.setViewsAreReady(this); } @Override @@ -37,9 +42,28 @@ public class NearbyParentFragmentPresenter } + /** + * -To initialize nearby operations both views should be ready and tab is selected. + * Initializes nearby operations if nearby views are ready + */ @Override public void onTabSelected() { - initializeNearbyOperations(); + onTabSelected = true; + if (nearbyViewsAreReady) { + initializeNearbyOperations(); + } + } + + /** + * -To initialize nearby operations both views should be ready and tab is selected. + * Initializes nearby operations if tab selected, otherwise just sets nearby views are ready + */ + @Override + public void nearbyFragmentAndMapViewReady() { + nearbyViewsAreReady = true; + if (onTabSelected) { + initializeNearbyOperations(); + } } /** @@ -48,10 +72,8 @@ public class NearbyParentFragmentPresenter */ @Override public void initializeNearbyOperations() { - locationManager.addLocationListener(this); - nearbyParentFragmentView.registerLocationUpdates(locationManager); - - + locationManager.addLocationListener(this); + nearbyParentFragmentView.registerLocationUpdates(locationManager); } /** @@ -102,17 +124,17 @@ public class NearbyParentFragmentPresenter return; } + /** + * Significant changed - Markers and current location will be updated together + * Slightly changed - Only current position marker will be updated + */ if (locationChangeType.equals(LOCATION_SIGNIFICANTLY_CHANGED) || locationChangeType.equals(MAP_UPDATED)) { - + nearbyMapFragmentView.updateMapMarkers(); + nearbyMapFragmentView.updateMapToTrackPosition(); + } else { + nearbyMapFragmentView.updateMapToTrackPosition(); } - - - - - - - } @Override @@ -134,4 +156,5 @@ public class NearbyParentFragmentPresenter public void onLocationChangedMedium(LatLng latLng) { } + }