From 7a06073185576e16a4bc1883ff1f764f464fac18 Mon Sep 17 00:00:00 2001 From: neslihanturan Date: Thu, 5 Sep 2019 18:35:18 +0300 Subject: [PATCH] Add some map elements like FABs and give their actions --- .../nearby/NearbyTestLayersFragment.java | 152 +++++++++++++++++- .../commons/nearby/SupportMapFragment.java | 2 +- .../NearbyParentFragmentContract.java | 9 ++ .../mvp/fragments/NearbyParentFragment.java | 25 +++ .../NearbyParentFragmentPresenter.java | 20 +++ app/src/main/res/layout/fragment_simple.xml | 150 ++++++++++++++++- 6 files changed, 350 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestLayersFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestLayersFragment.java index 1e91d74ce..4d1c042ff 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestLayersFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/NearbyTestLayersFragment.java @@ -1,6 +1,7 @@ package fr.free.nrw.commons.nearby; import android.Manifest; +import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -11,15 +12,21 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.ProgressBar; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.google.android.material.snackbar.Snackbar; import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.camera.CameraPosition; +import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.MapboxMapOptions; @@ -29,17 +36,22 @@ import com.mapbox.mapboxsdk.maps.Style; import javax.inject.Inject; import javax.inject.Named; +import butterknife.BindView; import butterknife.ButterKnife; +import fr.free.nrw.commons.CommonsApplication; import fr.free.nrw.commons.R; import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.nearby.mvp.contract.NearbyParentFragmentContract; +import fr.free.nrw.commons.nearby.mvp.fragments.NearbyParentFragment; import fr.free.nrw.commons.nearby.mvp.presenter.NearbyParentFragmentPresenter; +import fr.free.nrw.commons.theme.NavigationBaseActivity; import fr.free.nrw.commons.utils.FragmentUtils; import fr.free.nrw.commons.utils.NetworkUtils; import fr.free.nrw.commons.utils.PermissionUtils; +import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -52,6 +64,25 @@ import static fr.free.nrw.commons.nearby.NearbyTestFragmentLayersActivity.CONTRI public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment implements NearbyParentFragmentContract.View { + @BindView(R.id.fab_plus) + FloatingActionButton fabPlus; + + @BindView(R.id.fab_camera) + FloatingActionButton fabCamera; + + @BindView(R.id.fab_gallery) + FloatingActionButton fabGallery; + + + @BindView(R.id.fab_recenter) + FloatingActionButton fabRecenter; + + @BindView(R.id.bottom_sheet) + View bottomSheetList; + + @BindView(R.id.bottom_sheet_details) + View bottomSheetDetails; + @Inject LocationServiceManager locationManager; @@ -61,17 +92,32 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple @Inject @Named("default_preferences") JsonKvStore applicationKvStore; + + + private BottomSheetBehavior bottomSheetListBehavior; + private BottomSheetBehavior bottomSheetDetailsBehavior; + private Animation rotate_backward; + private Animation fab_close; + private Animation fab_open; + private Animation rotate_forward; + private static final double ZOOM_LEVEL = 14f; private final String NETWORK_INTENT_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; private BroadcastReceiver broadcastReceiver; private boolean isNetworkErrorOccurred = false; private Snackbar snackbar; + FragmentTransaction transaction; View view; NearbyParentFragmentPresenter nearbyParentFragmentPresenter; SupportMapFragment mapFragment; boolean isDarkTheme; + boolean isFabOpen; + boolean isBottomListSheetExpanded; + + private final double CAMERA_TARGET_SHIFT_FACTOR_PORTRAIT = 0.06; + private final double CAMERA_TARGET_SHIFT_FACTOR_LANDSCAPE = 0.04; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -86,7 +132,24 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setMapFragment(savedInstanceState); + } + public void initViews() { + Timber.d("init views called"); + 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(getActivity(), R.anim.fab_open); + fab_close = AnimationUtils.loadAnimation(getActivity(), R.anim.fab_close); + rotate_forward = AnimationUtils.loadAnimation(getActivity(), R.anim.rotate_forward); + rotate_backward = AnimationUtils.loadAnimation(getActivity(), R.anim.rotate_backward); + } + + public void setMapFragment(Bundle savedInstanceState) { // Mapbox access token is configured here. This needs to be called either in your application // object or in the same activity which contains the mapview. Mapbox.getInstance(getActivity(), getString(R.string.mapbox_commons_app_token)); @@ -95,7 +158,7 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple if (savedInstanceState == null) { // Create fragment - FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); + transaction = getChildFragmentManager().beginTransaction(); // Build mapboxMap isDarkTheme = applicationKvStore.getBoolean("theme", false); @@ -145,12 +208,16 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple * it is attached. */ public void childMapFragmentAttached() { + Log.d("denemeTest","this:"+this+", location manager is:"+locationManager); nearbyParentFragmentPresenter = new NearbyParentFragmentPresenter (this, mapFragment, locationManager); Timber.d("Child fragment attached"); nearbyParentFragmentPresenter.nearbyFragmentsAreReady(); //checkPermissionsAndPerformAction(this::registerLocationUpdates); + initViews(); + nearbyParentFragmentPresenter.setActionListeners(applicationKvStore); + } @Override @@ -292,4 +359,87 @@ public class NearbyTestLayersFragment extends CommonsDaggerSupportFragment imple public void resumeFragment() { } + + /** + * Starts animation of fab plus (turning on opening) and other FABs + * @param isFabOpen state of FAB buttons, open when clicked on fab button, closed on other click + */ + @Override + public void animateFABs() { + this.isFabOpen = !isFabOpen; + if (fabPlus.isShown()){ + if (isFabOpen) { + fabPlus.startAnimation(rotate_backward); + fabCamera.startAnimation(fab_close); + fabGallery.startAnimation(fab_close); + fabCamera.hide(); + fabGallery.hide(); + } else { + fabPlus.startAnimation(rotate_forward); + fabCamera.startAnimation(fab_open); + fabGallery.startAnimation(fab_open); + fabCamera.show(); + fabGallery.show(); + } + this.isFabOpen=!isFabOpen; + } + } + + @Override + public void displayLoginSkippedWarning() { + if (applicationKvStore.getBoolean("login_skipped", false)) { + // prompt the user to login + new AlertDialog.Builder(getContext()) + .setMessage(R.string.login_alert_message) + .setPositiveButton(R.string.login, (dialog, which) -> { + // logout of the app + //TODO: + // ((NavigationBaseActivity)getActivity()).BaseLogoutListener logoutListener = new ((NavigationBaseActivity)getActivity()).BaseLogoutListener(); + // CommonsApplication app = (CommonsApplication) getActivity().getApplication(); + // app.clearApplicationData(getContext(), logoutListener); + + }) + .show(); + } + } + + @Override + public void setFABPlusAction(View.OnClickListener onClickListener) { + fabPlus.setOnClickListener(onClickListener); + } + + @Override + public void setFABRecenterAction(View.OnClickListener onClickListener) { + fabRecenter.setOnClickListener(onClickListener); + } + + @Override + public void recenterMap(fr.free.nrw.commons.location.LatLng curLatLng) { + CameraPosition position; + + if (ViewUtil.isPortrait(getActivity())){ + position = new CameraPosition.Builder() + .target(isBottomListSheetExpanded ? + new LatLng(curLatLng.getLatitude() - CAMERA_TARGET_SHIFT_FACTOR_PORTRAIT, + curLatLng.getLongitude()) + : new LatLng(curLatLng.getLatitude(), curLatLng.getLongitude(), 0)) // Sets the new camera position + .zoom(isBottomListSheetExpanded ? + ZOOM_LEVEL + :mapFragment.getMapboxMap().getCameraPosition().zoom) // Same zoom level + .build(); + }else { + position = new CameraPosition.Builder() + .target(isBottomListSheetExpanded ? + new LatLng(curLatLng.getLatitude() - CAMERA_TARGET_SHIFT_FACTOR_LANDSCAPE, + curLatLng.getLongitude()) + : new LatLng(curLatLng.getLatitude(), curLatLng.getLongitude(), 0)) // Sets the new camera position + .zoom(isBottomListSheetExpanded ? + ZOOM_LEVEL + :mapFragment.getMapboxMap().getCameraPosition().zoom) // Same zoom level + .build(); + } + + mapFragment.getMapboxMap().animateCamera(CameraUpdateFactory.newCameraPosition(position), 1000); + } + } diff --git a/app/src/main/java/fr/free/nrw/commons/nearby/SupportMapFragment.java b/app/src/main/java/fr/free/nrw/commons/nearby/SupportMapFragment.java index f4f968a1e..9ff714052 100644 --- a/app/src/main/java/fr/free/nrw/commons/nearby/SupportMapFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/nearby/SupportMapFragment.java @@ -475,7 +475,7 @@ public class SupportMapFragment extends CommonsDaggerSupportFragment @Override public MapboxMap getMapboxMap() { - return null; + return mapboxMap; } @Override 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 f76cb9585..549d4c0d4 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 @@ -1,7 +1,10 @@ package fr.free.nrw.commons.nearby.mvp.contract; +import android.view.View; + import com.mapbox.mapboxsdk.maps.MapboxMap; +import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; @@ -21,6 +24,11 @@ public interface NearbyParentFragmentContract { void setSearchThisAreaProgressVisibility(boolean isVisible); void checkPermissionsAndPerformAction(Runnable runnable); void resumeFragment(); + void displayLoginSkippedWarning(); + void setFABPlusAction(android.view.View.OnClickListener onClickListener); + void setFABRecenterAction(android.view.View.OnClickListener onClickListener); + void animateFABs(); + void recenterMap(LatLng curLatLng); } interface UserActions { @@ -30,6 +38,7 @@ public interface NearbyParentFragmentContract { void updateMapAndList(LocationServiceManager.LocationChangeType locationChangeType, LatLng cameraTarget); void lockNearby(boolean isNearbyLocked); MapboxMap.OnCameraMoveListener onCameraMove(MapboxMap mapboxMap); + void setActionListeners(JsonKvStore applicationKvStore); } interface ViewsAreReadyCallback { 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 1b4db63f5..77f51b2b4 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 @@ -322,6 +322,31 @@ public class NearbyParentFragment extends CommonsDaggerSupportFragment addNetworkBroadcastReceiver(); + } + + @Override + public void displayLoginSkippedWarning() { + + } + + @Override + public void setFABPlusAction(View.OnClickListener onClickListener) { + + } + + @Override + public void setFABRecenterAction(View.OnClickListener onClickListener) { + + } + + @Override + public void animateFABs() { + + } + + @Override + public void recenterMap(LatLng curLatLng) { + } @Override 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 b3f43570d..86fc7462b 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 @@ -5,6 +5,7 @@ import android.view.View; import com.mapbox.mapboxsdk.maps.MapboxMap; +import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.location.LatLng; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.location.LocationUpdateListener; @@ -153,6 +154,25 @@ public class NearbyParentFragmentPresenter this.nearbyMapFragmentView.addOnCameraMoveListener(onCameraMove(getMapboxMap())); } + /** + * Sets click listeners of FABs, and 2 bottom sheets + */ + @Override + public void setActionListeners(JsonKvStore applicationKvStore) { + nearbyParentFragmentView.setFABPlusAction(v -> { + if (applicationKvStore.getBoolean("login_skipped", false)) { + // prompt the user to login + nearbyParentFragmentView.displayLoginSkippedWarning(); + }else { + nearbyParentFragmentView.animateFABs(); + } + }); + + nearbyParentFragmentView.setFABRecenterAction(v -> { + nearbyParentFragmentView.recenterMap(curLatLng); + }); + } + /** * Nearby updates takes time, since they are network operations. During update time, we don't diff --git a/app/src/main/res/layout/fragment_simple.xml b/app/src/main/res/layout/fragment_simple.xml index 47e87453e..a7e5fdb6f 100644 --- a/app/src/main/res/layout/fragment_simple.xml +++ b/app/src/main/res/layout/fragment_simple.xml @@ -1,11 +1,149 @@ - - + android:layout_height="match_parent" + android:background="@color/status_bar_blue"> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + +