diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java index a411e54..17242f2 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java @@ -38,10 +38,13 @@ import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.model.Coordinate; +import com.uam.wmi.findmytutor.model.PredefinedCoordViewModel; import com.uam.wmi.findmytutor.model.User; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.service.CoordinateService; import com.uam.wmi.findmytutor.service.UserService; +import com.uam.wmi.findmytutor.utils.FeedbackUtils; +import com.uam.wmi.findmytutor.utils.ManualLocationUtils; import com.uam.wmi.findmytutor.utils.MapMarker; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.RestApiHelper; @@ -86,7 +89,7 @@ public class MapActivity extends BaseActivity private HashMap markerHash = new HashMap<>(); private HashMap markerUserHash = new HashMap<>(); private Set previousCoordsIds = new HashSet<>(); - + private ManualLocationUtils manualLocationUtils; // Camera Animation params private int zoomParam = 17; private int bearingParam = 180; @@ -111,6 +114,7 @@ public class MapActivity extends BaseActivity } finally { mHandler.postDelayed(mStatusChecker, mInterval); } + manualLocationUtils = new ManualLocationUtils(MapActivity.this); }; selectLocationButton = findViewById(R.id.select_location_button); @@ -267,28 +271,33 @@ public class MapActivity extends BaseActivity // Toast instructing user to tap on the mapboxMap // TODO PUT MANUAL CORD try { - droppedMarkercoordinate = new Coordinate( - latLng.getLatitude(), - latLng.getLongitude(), - latLng.getAltitude(), - "approx", - PrefUtils.getUserFirstName(getApplicationContext()) + " " + PrefUtils.getUserLastName(getApplicationContext()), - PrefUtils.getUserId(getApplicationContext()), - PrefUtils.getLocationLevel(getApplicationContext()) - ); - PrefUtils.putManualLocation(this, latLng); +// droppedMarkercoordinate = new Coordinate( +// latLng.getLatitude(), +// latLng.getLongitude(), +// latLng.getAltitude(), +// "approx", +// PrefUtils.getUserFirstName(getApplicationContext()) + " " + PrefUtils.getUserLastName(getApplicationContext()), +// PrefUtils.getUserId(getApplicationContext()), +// PrefUtils.getLocationLevel(getApplicationContext()) +// ); + manualLocationUtils.showLocationDialog("Name the location",latLng); handleBackgroundTaskLifeCycle(); } catch (IllegalArgumentException e) { Timber.e(String.valueOf(e)); } - Toast.makeText( - MapActivity.this, - "Manual Locations selected!" + latLng, - Toast.LENGTH_LONG - ).show(); - +// Toast.makeText( +// MapActivity.this, +// "Manual Locations selected!" + latLng, +// Toast.LENGTH_LONG +// ).show(); +// LayoutInflater layoutInflaterAndroid = LayoutInflater.from(MapActivity.this); +// View dialogView = layoutInflaterAndroid.inflate(R.layout.feedback_modal, null); +// AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(MapActivity.this ); +// alertDialogBuilderUserInput.setView(dialogView).setPositiveButton("dupa", null); +// final AlertDialog alertDialog = alertDialogBuilderUserInput.create(); +// alertDialog.show(); selectLocationButton.setVisibility(View.GONE); mapboxMap.removeMarker(tmpLocalMarker); tmpLocalMarker = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java index 18f0109..dcab8ae 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/SharingFragment.java @@ -19,9 +19,14 @@ import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; +import com.annimon.stream.Collector; +import com.annimon.stream.Stream; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; +import com.mapbox.mapboxsdk.geometry.LatLng; import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.model.Feedback; +import com.uam.wmi.findmytutor.model.PredefinedCoordViewModel; +import com.uam.wmi.findmytutor.model.User; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.service.BackgroundLocalizationService; import com.uam.wmi.findmytutor.service.FeedbackService; @@ -32,6 +37,7 @@ import com.uam.wmi.findmytutor.utils.RestApiHelper; import com.uam.wmi.findmytutor.utils.RightButtonPreference; import com.uam.wmi.findmytutor.utils.SharingLevel; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -39,6 +45,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.CompositeDisposable; @@ -62,6 +69,7 @@ public class SharingFragment extends PreferenceFragment { protected RightButtonPreference manualLocationButton; protected Preference manualStatus; protected ListPreference statusList; + protected List predefinedCoordsList= new ArrayList<>(); void getStatuses(CompositeDisposable disposable) { disposable.add(statusesService.getUserPredefinedStatuses(PrefUtils.getUserId(getApplicationContext())) @@ -85,12 +93,40 @@ public class SharingFragment extends PreferenceFragment { })); } + void getLocations(CompositeDisposable disposable) { + disposable.add(statusesService.getUserPredefinedCoords(PrefUtils.getUserId(getApplicationContext())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableSingleObserver>() { + + @Override + public void onSuccess(List coords) { + PredefinedCoordViewModel [] statusesArray = (PredefinedCoordViewModel []) coords.toArray(new PredefinedCoordViewModel[0]); +// setListPreferenceData(statusList.getKey(), statusesArray); + List names = Stream.of(coords).map( p -> p.getName()).collect(com.annimon.stream.Collectors.toList()); + predefinedCoordsList.addAll(coords); + String [] stringnames = names.toArray(new String[0]); + Log.d("GETLOCATIONS", predefinedCoordsList.toString()); + + setListPreferenceData(manualLocationList.getKey(),stringnames); + Log.d("GETLOCATIONS", Arrays.toString(stringnames)); + + } + + @Override + public void onError(Throwable e) { + Toast.makeText(getApplicationContext(), "Error handling status fetch", Toast.LENGTH_SHORT).show(); + + } + + })); + } + @SuppressLint("ResourceType") @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.pref_sharing); - locationSharing = findPreference("key_sharing_enabled"); locationMode = findPreference("key_location_level"); preferenceCategory = (PreferenceCategory) findPreference("category_sharing"); @@ -102,7 +138,10 @@ public class SharingFragment extends PreferenceFragment { statusesService = ApiClient.getClient(getApplicationContext()).create(PredefinedStatusesService.class); disposable = new CompositeDisposable(); getStatuses(disposable); + if (PrefUtils.getLocationLevel(getApplicationContext()).equals("manual") ) { + getLocations(disposable); + } locationLevelMapping = new HashMap(); locationLevelMapping.put(0, SharingLevel.PRESENCE.toString()); locationLevelMapping.put(1, SharingLevel.APPROXIMATED.toString()); @@ -117,7 +156,6 @@ public class SharingFragment extends PreferenceFragment { /** Main sharing switch**/ locationSharing.setOnPreferenceChangeListener((buttonView, newValue) -> { PrefUtils.storeEnableSharingLocalization(getApplicationContext(), (Boolean) newValue); - ((MapActivity) getActivity()).handleBackgroundTaskLifeCycle(); return true; }); @@ -129,7 +167,8 @@ public class SharingFragment extends PreferenceFragment { if (PrefUtils.getLocationLevel(getApplicationContext()).equals("manual") ) { preferenceCategory.addPreference(manualLocationList); - preferenceCategory.addPreference(manualLocationButton); + getLocations(disposable); + preferenceCategory.addPreference(manualLocationButton); } else { preferenceCategory.removePreference(manualLocationList); @@ -146,7 +185,13 @@ public class SharingFragment extends PreferenceFragment { /** Custom manual location list change listener **/ manualLocationList.setOnPreferenceChangeListener((preference, newValue) -> { ListPreference lp = (ListPreference) preference; - //ToDo handle manual location change + Log.d("SELECTEDLOCATION",(lp.getEntries()[Integer.parseInt((String) newValue)].toString())); + + PredefinedCoordViewModel temp = Stream.of(predefinedCoordsList).filter( p -> p.getName().equals(lp.getEntries()[Integer.parseInt((String) newValue)].toString())).single(); + Log.d("SELECTEDLOCATION",temp.toString()); +// LatLng latLng = new LatLng(latitude, longitude, altitude); + PrefUtils.putManualLocation(getApplicationContext(),temp.getGeoData()); +// ((MapActivity) getActivity()).handleBackgroundTaskLifeCycle(); return true; }); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java new file mode 100644 index 0000000..566a4a8 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java @@ -0,0 +1,31 @@ +package com.uam.wmi.findmytutor.activity; + +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.View; + +import com.uam.wmi.findmytutor.R; + +public class TutorTab extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_tutor_tab); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + } + }); + } + +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/PredefinedCoordViewModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/PredefinedCoordViewModel.java index 78b4897..e881da6 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/PredefinedCoordViewModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/PredefinedCoordViewModel.java @@ -2,6 +2,7 @@ package com.uam.wmi.findmytutor.model; import java.util.UUID; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; +import com.mapbox.mapboxsdk.geometry.LatLng; public class PredefinedCoordViewModel { @@ -46,9 +47,9 @@ public class PredefinedCoordViewModel { @SerializedName("displayMode") @Expose private String displayMode = "predefined"; - @SerializedName("label") + @SerializedName("name") @Expose - private String label; + private String name; /** * No args constructor for use in serialization @@ -62,22 +63,21 @@ public class PredefinedCoordViewModel { * @param altitude * @param userId * @param displayMode - * @param label + * @param name * @param longitude * @param latitude * @param approximatedLocation * @param predefinedCoordinateId */ - public PredefinedCoordViewModel(UUID predefinedCoordinateId, Double latitude, Double longitude, Double altitude, String userId, String approximatedLocation, String displayMode, String label) { + public PredefinedCoordViewModel(Double latitude, Double longitude, Double altitude, String userId, String approximatedLocation, String displayMode, String name) { super(); - this.predefinedCoordinateId = predefinedCoordinateId; this.latitude = latitude; this.longitude = longitude; this.altitude = altitude; this.userId = userId; this.approximatedLocation = approximatedLocation; this.displayMode = displayMode; - this.label = label; + this.name = name; } public UUID getPredefinedCoordinateId() { @@ -176,12 +176,29 @@ public class PredefinedCoordViewModel { this.displayMode = displayMode; } - public String getLabel() { - return label; + public String getName() { + return name; } - public void setLabel(String label) { - this.label = label; + public void setName(String name) { + this.name = name; } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class PredefinedCoordinate {\n"); + sb.append(" lat: ").append(latitude).append("\n"); + sb.append(" long: ").append(longitude).append("\n"); + sb.append(" att: ").append(altitude).append("\n"); + sb.append(" userID: ").append(userId).append("\n"); + sb.append(" approx: ").append(approximatedLocation).append("\n"); + sb.append(" dispMode: ").append(displayMode).append("\n"); + sb.append(" name: ").append(name).append("\n"); + sb.append("}"); + return sb.toString(); + } + public LatLng getGeoData(){ + return new LatLng(this.latitude,this.longitude,this.altitude); + } } \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/ManualLocationUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/ManualLocationUtils.java new file mode 100644 index 0000000..b78eaa0 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/ManualLocationUtils.java @@ -0,0 +1,116 @@ +package com.uam.wmi.findmytutor.utils; + +import android.content.Context; +import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.os.Build; +import android.support.v7.app.AlertDialog; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.activity.BaseActivity; +import com.uam.wmi.findmytutor.model.Coordinate; +import com.uam.wmi.findmytutor.model.Feedback; +import com.uam.wmi.findmytutor.model.PredefinedCoordViewModel; +import com.uam.wmi.findmytutor.network.ApiClient; +import com.uam.wmi.findmytutor.service.FeedbackService; +import com.uam.wmi.findmytutor.service.PredefinedStatusesService; + +import java.util.List; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.schedulers.Schedulers; +import okhttp3.ResponseBody; +import retrofit2.Response; + +public class ManualLocationUtils { + private Context activityContext; + + public ManualLocationUtils(Context context) { + activityContext = context; + } + + public void showLocationDialog(String subject, LatLng latLng) { + + LayoutInflater layoutInflaterAndroid = LayoutInflater.from(activityContext); + View view = layoutInflaterAndroid.inflate(R.layout.location_modal, null); + AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(activityContext); + alertDialogBuilderUserInput.setView(view).setPositiveButton(activityContext.getString(R.string.modal_feedback_send), null); + final AlertDialog alertDialog = alertDialogBuilderUserInput.create(); + + EditText modalUserInput = view.findViewById(R.id.feedback_input); + TextView modalTitle = view.findViewById(R.id.feedback_modal_title); + modalTitle.setText(subject); + alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { + @Override + public void onShow(DialogInterface dialogInterface) { + Button sendButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); + sendButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String body = modalUserInput.getText().toString(); + if (TextUtils.isEmpty(body)) { + Toast.makeText(activityContext, activityContext.getString(R.string.modal_feedback_hint), Toast.LENGTH_SHORT).show(); + modalUserInput.requestFocus(); + } else { + PrefUtils.putManualLocation(activityContext, latLng); + sendLocation(body,latLng); + alertDialog.dismiss(); + } + } + }); + } + }); + alertDialog.show(); + } + + private void sendLocation(String body, LatLng latLng) { + PredefinedCoordViewModel droppedMarkercoordinate = new PredefinedCoordViewModel( + latLng.getLatitude(), + latLng.getLongitude(), + latLng.getAltitude(), + PrefUtils.getUserId(activityContext), + "string", + "predefined", + body + ); + PredefinedStatusesService predefinedStatusesService = ApiClient.getClient(activityContext).create(PredefinedStatusesService.class); + CompositeDisposable disposable = new CompositeDisposable(); + disposable.add(predefinedStatusesService.postUserPredefinedCoord(PrefUtils.getUserId(activityContext),droppedMarkercoordinate) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(this::handleResponse, this::handleError)); + } + + private void handleResponse(List resp) { + Toast.makeText(activityContext, "Location saved", Toast.LENGTH_SHORT).show(); + } + + private void handleError(Throwable error) { + if (error instanceof HttpException) { + + ResponseBody responseBody = ((HttpException) error).response().errorBody(); + Toast.makeText(activityContext, + RestApiHelper.getErrorMessage(responseBody), Toast.LENGTH_SHORT).show(); + Log.d("POSTCOORDINATE", error.getMessage()); + + + } else { + Toast.makeText(activityContext, + "Network error " + error.getMessage(), Toast.LENGTH_SHORT).show(); + Log.d("POSTCOORDINATE", error.getMessage()); + } + } +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/PrefUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/PrefUtils.java index 5fb12a2..ba253ce 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/PrefUtils.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/PrefUtils.java @@ -164,6 +164,7 @@ public class PrefUtils { editor.putBoolean("key_sharing_enabled", true); editor.putLong("longitude_manual_location", Double.doubleToRawLongBits(latLng.getLongitude())); editor.putLong("latitude_manual_location", Double.doubleToRawLongBits(latLng.getLatitude())); + Log.d("SAVE_COORD","zapisane"); editor.apply(); } diff --git a/app/src/main/res/layout/activity_tutor_tab.xml b/app/src/main/res/layout/activity_tutor_tab.xml new file mode 100644 index 0000000..72feb63 --- /dev/null +++ b/app/src/main/res/layout/activity_tutor_tab.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_tutor_tab.xml b/app/src/main/res/layout/content_tutor_tab.xml new file mode 100644 index 0000000..e83904e --- /dev/null +++ b/app/src/main/res/layout/content_tutor_tab.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/location_modal.xml b/app/src/main/res/layout/location_modal.xml new file mode 100644 index 0000000..cd566f4 --- /dev/null +++ b/app/src/main/res/layout/location_modal.xml @@ -0,0 +1,41 @@ + + + + + + + + + \ No newline at end of file