diff --git a/.idea/misc.xml b/.idea/misc.xml index b0c7b20..dc44dda 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -29,7 +29,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 06927b9..565bfdc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.uam.wmi.findmytutor" minSdkVersion 22 targetSdkVersion 27 - versionCode 17 - versionName "0.9.2-alpha" + versionCode 19 + versionName "0.9.5-beta" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true } @@ -34,6 +34,8 @@ dependencies { implementation "ch.acra:acra-http:$acraVersion" implementation "ch.acra:acra-toast:$acraVersion" implementation "ch.acra:acra-notification:$acraVersion" + implementation "ch.acra:acra-limiter:$acraVersion" + implementation fileTree(include: ['*.jar'], dir: 'libs') diff --git a/app/release/release/app.aab b/app/release/release/app.aab index aa09d96..fb0edf9 100644 Binary files a/app/release/release/app.aab and b/app/release/release/app.aab differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 80031db..5ccbfb9 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,7 +28,9 @@ + android:theme="@style/AppTheme.NoActionBar" + android:screenOrientation="portrait" + android:configChanges="keyboardHidden|orientation|screenSize"> @@ -37,14 +39,20 @@ + android:launchMode="singleTop" + android:screenOrientation="portrait" + android:configChanges="keyboardHidden|orientation|screenSize"/> + android:noHistory="true" + android:screenOrientation="portrait" + android:configChanges="keyboardHidden|orientation|screenSize"/> + android:name=".activity.SettingsActivity" + android:screenOrientation="portrait" + android:configChanges="keyboardHidden|orientation|screenSize"/> + android:theme="@style/AppTheme" + android:screenOrientation="portrait" + android:configChanges="keyboardHidden|orientation|screenSize"/> \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/FindMyTutor.java b/app/src/main/java/com/uam/wmi/findmytutor/FindMyTutor.java index 763c4b5..3c2eabf 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/FindMyTutor.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/FindMyTutor.java @@ -5,8 +5,11 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.res.Configuration; +import com.uam.wmi.findmytutor.utils.Const; + import static org.acra.ReportField.*; import org.acra.ACRA; +import org.acra.annotation.AcraLimiter; import org.acra.annotation.AcraNotification; import org.acra.config.CoreConfigurationBuilder; import org.acra.config.HttpSenderConfigurationBuilder; @@ -20,6 +23,7 @@ import java.util.Map; @AcraNotification(resText = R.string.notification_text, resTitle = R.string.notification_title, resChannelName = R.string.notification_channel) +@AcraLimiter(failedReportLimit = 2) public class FindMyTutor extends Application { @Override protected void attachBaseContext(Context base) { @@ -48,7 +52,7 @@ public class FindMyTutor extends Application { builder.getPluginConfigurationBuilder( HttpSenderConfigurationBuilder.class // ).setUri("http://192.168.0.15:3000/api/acra") - ).setUri("https://s416084.projektstudencki.pl/develop/api/Feedback/autoFeedback") + ).setUri(Const.BASE_URL +"api/Feedback/autoFeedback") .setHttpMethod(HttpSender.Method.POST) .setHttpHeaders(header) .setEnabled(true); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java index 5be8ec4..3a5956e 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java @@ -7,6 +7,7 @@ import android.app.FragmentTransaction; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; @@ -20,10 +21,14 @@ import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; +import android.util.Log; +import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.PopupWindow; import android.widget.Toast; import com.uam.wmi.findmytutor.R; @@ -46,6 +51,7 @@ import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; +import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; import static com.uam.wmi.findmytutor.utils.Const.defaultMapZoom; import static com.uam.wmi.findmytutor.utils.Const.searchMapZoom; import static com.uam.wmi.findmytutor.utils.PrefUtils.storeBackgroundLocationStatus; @@ -76,15 +82,18 @@ public abstract class BaseActivity private ActiveFragment activeFragment = ActiveFragment.NONE; private Fragment activeBottomMenu = null; private SearchView searchView; + public MenuItem infoMenuItem; @SuppressLint("CheckResult") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getContentViewId()); + drawerNavigationView = findViewById(R.id.nav_view); sideDrawer = findViewById(R.id.activity_container); feedbackUtils = new FeedbackUtils(BaseActivity.this); + drawerNavigationView.setNavigationItemSelectedListener( item -> { String itemName = (String) item.getTitle(); @@ -191,7 +200,10 @@ public abstract class BaseActivity public void stopBackgroundLocalizationTask() { Intent stopIntent = new Intent(getApplicationContext(), BackgroundLocalizationService.class); stopIntent.putExtra("request_stop", true); - startService(stopIntent); + Log.e("Localization", "JEstem w stop BG"); + + stopService(stopIntent); + } public void startBackgroundLocalizationTask() { @@ -207,12 +219,17 @@ public abstract class BaseActivity } public void handleBackgroundTaskLifeCycle() { + Log.e("Localization", String.valueOf(PrefUtils.isEnableSharingLocalization(getApplicationContext()))); Boolean shouldServiceRun = PrefUtils.isEnableSharingLocalization(getApplicationContext()) && isTutor; + Log.e("Localization", String.valueOf(shouldServiceRun)); if (shouldServiceRun) { startBackgroundLocalizationTask(); + Log.e("Localization", "JEstem i odpalam"); + } else { stopBackgroundLocalizationTask(); + Log.e("Localization", "JEstem i nie odpalam"); } } @@ -266,6 +283,8 @@ public abstract class BaseActivity @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); + infoMenuItem = menu.findItem(R.id.action_info); + MenuItem myActionMenuItem = menu.findItem(R.id.action_search); searchView = (SearchView) myActionMenuItem.getActionView(); @@ -313,6 +332,33 @@ public abstract class BaseActivity if (actionBarDrawerToggle.onOptionsItemSelected(item)) { return true; } + + if (item.getItemId()==R.id.action_info){ + int layoutID; + switch (activeFragment){ + case SHARED_PREFERENCES: + layoutID = R.layout.info_popup_sharing_tab; + break; + case USER_LIST: + layoutID = R.layout.info_popup_userlist; + break; + default: + layoutID = R.layout.info_popup_map; + } + + View popupView = getLayoutInflater().inflate(layoutID,null); + + PopupWindow popupWindow = new PopupWindow(popupView, + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + // If the PopupWindow should be focusable + popupWindow.setFocusable(true); + // If you need the PopupWindow to dismiss when when touched outside + popupWindow.setBackgroundDrawable(new ColorDrawable()); + // Get the View's(the one that was clicked in the Fragment) location + View anchorView= getWindow().getDecorView().findViewById(android.R.id.content); + popupWindow.showAtLocation(anchorView,Gravity.TOP|Gravity.END, 0, 0); + } + return super.onOptionsItemSelected(item); } @@ -343,7 +389,7 @@ public abstract class BaseActivity if (itemId == R.id.nav_map) { removeFragment(sharingFragment); removeFragment(userListFragment); - activeFragment = ActiveFragment.NONE; + activeFragment = ActiveFragment.NONE; } else if (itemId == R.id.nav_profile) { loadUserSettingsFragment(); } else if (itemId == R.id.nav_user_list) { 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 0d8b299..b1e9a32 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 @@ -47,6 +47,9 @@ import com.uam.wmi.findmytutor.service.CoordinateService; import com.uam.wmi.findmytutor.service.PredefinedStatusesService; import com.uam.wmi.findmytutor.service.UserService; import com.uam.wmi.findmytutor.utils.ApproximatedLocalization; + +import com.uam.wmi.findmytutor.utils.EnableSharingDialog; + import com.uam.wmi.findmytutor.utils.ManualLocationUtils; import com.uam.wmi.findmytutor.utils.MapMarker; import com.uam.wmi.findmytutor.utils.MapUtils; @@ -103,6 +106,7 @@ public class MapActivity extends BaseActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + isTutor = PrefUtils.getIsTutor(this); myId = PrefUtils.getUserId(getApplicationContext()); @@ -146,7 +150,7 @@ public class MapActivity extends BaseActivity String id = markerUserHash.get(marker.getId()); String locationLevel = PrefUtils.getLocationLevel(getApplicationContext()); - if (id.equals(myId) && (locationLevel.equals(SharingLevel.MANUAL.toString()) || locationLevel.equals(SharingLevel.PREDEFINED.toString()))) { + /* if (id.equals(myId) && (locationLevel.equals(SharingLevel.MANUAL.toString()) || locationLevel.equals(SharingLevel.PREDEFINED.toString()))) { selectLocationButton.setVisibility(View.GONE); removeLocationButton.setVisibility(View.VISIBLE); @@ -157,9 +161,9 @@ public class MapActivity extends BaseActivity Toast.makeText(MapActivity.this, R.string.manual_marker_info, Toast.LENGTH_SHORT).show(); }); - } else { + } else {*/ createMarkerModal(id); - } + /* }*/ return true; }); @@ -211,14 +215,19 @@ public class MapActivity extends BaseActivity TextView sharingLevelView = view.findViewById(R.id.sharing_level); userName.setText(String.format("%s %s", user.getFirstName(), user.getLastName())); - status.setText(String.format("%s: %s", getResources().getString(R.string.status_switch_title), cordStatus)); + + if(cordStatus.equals("")){ + status.setText(String.format("%s: %s", getResources().getString(R.string.status_switch_title), getString(R.string.lack_of_status))); + }else{ + status.setText(String.format("%s: %s", getResources().getString(R.string.status_switch_title), cordStatus)); + } + sharingLevelView.setText(String.format("%s: %s", getResources().getString(R.string.settings_location_level), sharingLevel)); final AlertDialog alertDialog = alertDialogBuilderUserInput.create(); alertDialog.show(); } - private void handleError(Throwable error) { showError(error); } @@ -226,8 +235,6 @@ public class MapActivity extends BaseActivity private void showError(Throwable e) { String message; - Log.e("ERR", e.toString()); - if (e instanceof HttpException) { ResponseBody responseBody = ((HttpException) e).response().errorBody(); message = RestApiHelper.getErrorMessage(responseBody); @@ -282,6 +289,11 @@ public class MapActivity extends BaseActivity PrefUtils.getLocationLevel(getApplicationContext()) ); + if (!PrefUtils.isEnableSharingLocalization(getApplicationContext())) { + EnableSharingDialog sharingDialog = new EnableSharingDialog(); + sharingDialog.show(getFragmentManager(), "Sharing"); + } + PrefUtils.putManualLocation(this, latLng, approximatedLocation); handleBackgroundTaskLifeCycle(); @@ -325,10 +337,14 @@ public class MapActivity extends BaseActivity alertDialog.setOnShowListener(dialogInterface -> { Button sendButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - Button dismissButton = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); - dismissButton.setOnClickListener(view1 -> alertDialog.dismiss()); + dismissButton.setOnClickListener(view1 -> { + PrefUtils.putCurrentManualLocationName(getApplicationContext(), "Inne"); + PrefUtils.putCurrentManualLocation(getApplicationContext(), "-1"); + + alertDialog.dismiss(); + }); sendButton.setOnClickListener(view1 -> { String body = modalUserInput.getText().toString(); @@ -338,7 +354,7 @@ public class MapActivity extends BaseActivity modalUserInput.requestFocus(); } else { sendLocation(body, latLng); - PrefUtils.putCurrentManualLocationName(getApplicationContext(),body); + PrefUtils.putCurrentManualLocationName(getApplicationContext(), body); alertDialog.dismiss(); } }); @@ -727,4 +743,5 @@ public class MapActivity extends BaseActivity public void adjustMapToSearch(Integer zoom) { MapUtils.setZoom(mapboxMap, zoom); } -} + +} \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java index 1b7a63d..fa54e0f 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java @@ -11,6 +11,7 @@ import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceManager; import android.util.DisplayMetrics; +import android.util.Log; import android.view.MenuItem; import com.uam.wmi.findmytutor.R; @@ -54,7 +55,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { Preference languagesList = findPreference(getResources().getString(R.string.key_language)); languagesList.setDefaultValue(0); - if(PrefUtils.getLocale(getActivity()).equals("pl")){ + if(PrefUtils.getLocale(getActivity()).equals("1")){ languagesList.setDefaultValue(1); } 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 494581f..1eee441 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 @@ -2,11 +2,13 @@ package com.uam.wmi.findmytutor.activity; import android.annotation.SuppressLint; import android.app.FragmentTransaction; +import android.content.SharedPreferences; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; +import android.preference.SwitchPreference; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -20,6 +22,8 @@ import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.model.PredefinedCoordViewModel; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.service.PredefinedStatusesService; +import com.uam.wmi.findmytutor.utils.Const; +import com.uam.wmi.findmytutor.utils.EnableSharingDialog; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.RestApiHelper; import com.uam.wmi.findmytutor.utils.RightButtonPreference; @@ -39,10 +43,10 @@ import okhttp3.ResponseBody; import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; -public class SharingFragment extends PreferenceFragment { - protected Preference locationSharing; +public class SharingFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { + protected SwitchPreference locationSharing; protected Preference locationMode; - protected Preference manualLocationList; + protected ListPreference manualLocationList; protected PreferenceCategory preferenceCategory; protected RightButtonPreference manualLocationButton; protected Preference manualStatus; @@ -66,7 +70,7 @@ public class SharingFragment extends PreferenceFragment { @Override public void onSuccess(List strings) { String[] statusesArray = strings.toArray(new String[strings.size()]); - setListPreferenceData(statusList.getKey(), statusesArray,null); + setListPreferenceData(statusList, statusesArray, null); } @Override @@ -85,26 +89,27 @@ public class SharingFragment extends PreferenceFragment { @Override public void onSuccess(List coords) { - List names = Stream.of(coords).map(PredefinedCoordViewModel::getName).collect(com.annimon.stream.Collectors.toList()); - predefinedCoordsList.addAll(coords); - String[] stringnames = names.toArray(new String[0]); String currentCoordId = PrefUtils.getCurrentManualLocation(getApplicationContext()); - List activeId = Stream.of(coords).indexed() + List predefinedLocationsNames = Stream.of(coords).map(PredefinedCoordViewModel::getName).toList(); + predefinedCoordsList.addAll(coords); + + String[] stringnames = predefinedLocationsNames.toArray(new String[0]); + + List activesId = Stream.of(coords).indexed() .filter(v -> v.getSecond().getPredefinedCoordinateId().equals(currentCoordId)).map(IntPair::getFirst).toList(); - if(activeId.size() > 0) - setListPreferenceData(manualLocationList.getKey(), stringnames, activeId.get(0)); - else{ - setListPreferenceData(manualLocationList.getKey(), stringnames,null); + if( activesId.size() == 0){ + setListPreferenceData(manualLocationList, stringnames, null); + } + else { + setListPreferenceData(manualLocationList, stringnames, activesId.get(0)); } - Log.d("sharingpref", names.toString()); } @Override public void onError(Throwable e) { Toast.makeText(getApplicationContext(), R.string.error_location_fetch, Toast.LENGTH_SHORT).show(); - } })); } @@ -114,18 +119,17 @@ public class SharingFragment extends PreferenceFragment { public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.layout.pref_sharing); - locationSharing = findPreference("key_sharing_enabled"); + locationSharing = (SwitchPreference) findPreference("key_sharing_enabled"); locationMode = findPreference("key_location_level"); preferenceCategory = (PreferenceCategory) findPreference("category_sharing"); - manualLocationList = findPreference("key_manual_location_value"); + manualLocationList = (ListPreference) findPreference("key_manual_location_value"); manualLocationButton = (RightButtonPreference) findPreference("manual_location_button"); manualStatus = findPreference("key_manual_status"); statusList = (ListPreference) findPreference("key_status_value"); statusesService = ApiClient.getClient(getApplicationContext()).create(PredefinedStatusesService.class); disposable = new CompositeDisposable(); getStatuses(disposable); - getLocations(disposable); - + getLocations(disposable); locationLevelMapping = new HashMap(); locationLevelMapping.put(0, SharingLevel.PRESENCE.toString()); locationLevelMapping.put(1, SharingLevel.APPROXIMATED.toString()); @@ -139,7 +143,7 @@ public class SharingFragment extends PreferenceFragment { statusList.setSummary(PrefUtils.getUserStatus(getApplicationContext())); manualLocationList.setSummary(PrefUtils.getCurrentManualLocationName(getApplicationContext())); -// manualLocationList.setSummary(PrefUtils.getManualLocation(getApplicationContext())); + /** Main sharing switch**/ locationSharing.setOnPreferenceChangeListener((buttonView, newValue) -> { PrefUtils.storeEnableSharingLocalization(getApplicationContext(), (Boolean) newValue); @@ -151,10 +155,11 @@ public class SharingFragment extends PreferenceFragment { locationMode.setOnPreferenceChangeListener((preference, newValue) -> { PrefUtils.storeLocationMode(getApplicationContext(), locationLevelMapping.get(Integer.parseInt((String) newValue))); - if (PrefUtils.getLocationLevel(getApplicationContext()).equals("manual")) { - if(!predefinedCoordsList.isEmpty()){ - preferenceCategory.addPreference(manualLocationList); - } + + if (PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.MANUAL.toString())) { + if (!predefinedCoordsList.isEmpty()) { + preferenceCategory.addPreference(manualLocationList); + } preferenceCategory.addPreference(manualLocationButton); @@ -169,12 +174,6 @@ public class SharingFragment extends PreferenceFragment { if (!PrefUtils.getLocationLevel(getApplicationContext()).equals("manual")) { preferenceCategory.removePreference(manualLocationList); preferenceCategory.removePreference(manualLocationButton); - }else{ -// if(predefinedCoordsList.isEmpty()){ -//// preferenceCategory.removePreference(manualLocationList); -// -// -// } } /** Custom manual location list change listener **/ @@ -182,14 +181,24 @@ public class SharingFragment extends PreferenceFragment { ListPreference lp = (ListPreference) preference; CharSequence[] entries = lp.getEntries(); PredefinedCoordViewModel temp = Stream.of(predefinedCoordsList).filter(p -> p.getName().equals(lp.getEntries()[Integer.parseInt((String) newValue)].toString())).toList().get(0); - PrefUtils.putManualLocation(getApplicationContext(), temp.getGeoData(), temp.getApproximatedLocation() ); - PrefUtils.putCurrentManualLocation(getApplicationContext(),temp.getPredefinedCoordinateId()); - PrefUtils.putCurrentManualLocationName(getApplicationContext(), (String )lp.getEntries()[Integer.parseInt((String) newValue)]); + + //sharing dialog -> ask for start BG + if (!PrefUtils.isEnableSharingLocalization(getApplicationContext())) { + EnableSharingDialog sharingDialog = new EnableSharingDialog(); + sharingDialog.show(getFragmentManager(), "Sharing"); + } + + PrefUtils.putManualLocation(getApplicationContext(), temp.getGeoData(), temp.getApproximatedLocation()); + PrefUtils.putCurrentManualLocation(getApplicationContext(), temp.getPredefinedCoordinateId()); + PrefUtils.putCurrentManualLocationName(getApplicationContext(), (String) lp.getEntries()[Integer.parseInt((String) newValue)]); lp.setSummary(lp.getEntries()[Integer.parseInt((String) newValue)]); + ((MapActivity) getActivity()).handleBackgroundTaskLifeCycle(); return true; }); + + /** Button 'choose from map' button listener **/ manualLocationButton.setOnPreferenceChangeListener((preference, o) -> { FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); @@ -206,6 +215,7 @@ public class SharingFragment extends PreferenceFragment { lp.setSummary(entries[Integer.parseInt((String) newValue)]); return true; }); + /** Custom status list change listener **/ manualStatus.setOnPreferenceChangeListener((preference, newValue) -> { @@ -214,11 +224,8 @@ public class SharingFragment extends PreferenceFragment { .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::handleResponse, this::handleError)); - return true; }); - - } @Override @@ -229,38 +236,38 @@ public class SharingFragment extends PreferenceFragment { return view; } - protected void setListPreferenceData(String lp_name, String[] entries, Integer activeId) { - try { - ListPreference lp = (ListPreference) findPreference(lp_name); - lp.setEntries(entries); - CharSequence[] entryValues = new CharSequence[entries.length]; + protected void setListPreferenceData(ListPreference lp, String[] entries, Integer activeId) { - for (int i = 0; i < entries.length; i++) { - entryValues[i] = Integer.toString(i); - } + try { + lp.setEntries(entries); + CharSequence[] entryValues = new CharSequence[entries.length]; - lp.setDefaultValue(0); - lp.setEntryValues(entryValues); + for (int i = 0; i < entries.length; i++) { + entryValues[i] = Integer.toString(i); + } - if(entries.length > 0 && activeId != null) - lp.setValueIndex(activeId); - }catch (Exception e){ -// Toast.makeText(getApplicationContext(), -// "duupa", Toast.LENGTH_SHORT).show(); - } + lp.setDefaultValue(0); + lp.setEntryValues(entryValues); - }; + if (entries.length > 0 && activeId != null) + lp.setValueIndex(activeId); + + } catch (Exception e) { + Log.e("Failed to set listPref", e.getMessage()); + } + + } + + ; private void handleResponse(List resp) { String[] statusesArray = resp.toArray(new String[resp.size()]); - setListPreferenceData(statusList.getKey(), statusesArray,resp.size() - 1); + setListPreferenceData(statusList, statusesArray, resp.size() - 1); statusList.setValueIndex(resp.size() - 1); PrefUtils.storeStatus(getApplicationContext(), resp.get(resp.size() - 1)); - statusList.setSummary(PrefUtils.getUserStatus(getApplicationContext())); - - + statusList.setSummary(PrefUtils.getUserStatus(getApplicationContext())); } private void handleError(Throwable error) { @@ -275,4 +282,22 @@ public class SharingFragment extends PreferenceFragment { } } + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + locationSharing.setChecked(PrefUtils.isEnableSharingLocalization(getApplicationContext())); + + } + + @Override + public void onResume() { + super.onResume(); + getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); + + } + + @Override + public void onPause() { + getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); + super.onPause(); + } } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java index d0fd9dc..9f6e086 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java @@ -23,6 +23,7 @@ public class StartupActivity extends AppCompatActivity { if (PrefUtils.isLoggedIn(getApplicationContext())){ Intent startupIntent = new Intent(this, MapActivity.class); + PrefUtils.storeLocale(getApplicationContext(),PrefUtils.getLocale(getApplicationContext())); startupIntent.putExtra(currentLang, PrefUtils.getLocale(getApplicationContext())); startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(startupIntent); 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 index d98a4f5..288f269 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/TutorTab.java @@ -1,26 +1,36 @@ package com.uam.wmi.findmytutor.activity; import android.os.Bundle; +import android.support.design.widget.TextInputEditText; +import android.support.design.widget.TextInputLayout; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; +import android.widget.Adapter; import android.widget.Button; import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.annimon.stream.Stream; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.adapters.DutyHoursAdapter; +import com.uam.wmi.findmytutor.model.DutyHour; import com.uam.wmi.findmytutor.model.DutyHourViewModel; import com.uam.wmi.findmytutor.model.TutorTabViewModel; import com.uam.wmi.findmytutor.model.User; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.service.TutorTabApi; import com.uam.wmi.findmytutor.service.UserService; +import com.uam.wmi.findmytutor.utils.InfoHelperUtils; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.RestApiHelper; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -37,31 +47,41 @@ public class TutorTab extends AppCompatActivity { private CompositeDisposable disposable = new CompositeDisposable(); private TextView userName; private TextView userDutyHours; - private EditText userNote; + private TextInputEditText userNote; private TextView userRoom; private TextView userEmail; private TextView department; + private Button addDutyButton; private Button saveButon; + private Boolean ifTutorTabExists = true; + private List dutyHourList; + private RecyclerView dutyHoursRecycller; + private DutyHoursAdapter dutyHoursAdapter; + private RecyclerView.LayoutManager dutyHoursLayoutManager; private TutorTabViewModel newTab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.content_tutor_tab); + + userName = findViewById(R.id.userName); + userNote = (TextInputEditText) findViewById(R.id.userNote); + userRoom = findViewById(R.id.userRoom); + userEmail = findViewById(R.id.userEmail); + department = findViewById(R.id.userDepartment); + saveButon = findViewById(R.id.saveButon); + addDutyButton = findViewById(R.id.addDuty); + dutyHoursRecycller = (RecyclerView) findViewById(R.id.dutyHourView); + dutyHoursLayoutManager = new LinearLayoutManager(this); + dutyHoursRecycller.setLayoutManager(dutyHoursLayoutManager); + + tutorTabService = ApiClient.getClient(getApplicationContext()) .create(TutorTabApi.class); userService = ApiClient.getClient(getApplicationContext()) .create(UserService.class); - setContentView(R.layout.content_tutor_tab); - TextView userName = findViewById(R.id.userName); - TextView userDutyHours = findViewById(R.id.userDutyHours); - EditText userNote = findViewById(R.id.userNote); - TextView userRoom = findViewById(R.id.userRoom); - TextView userEmail = findViewById(R.id.userEmail); - TextView department = findViewById(R.id.userDepartment); - Button saveButon = findViewById(R.id.saveButon); - - userName.setText(String.format("%s %s", PrefUtils.getUserFirstName(getApplicationContext()), PrefUtils.getUserLastName(getApplicationContext()))); disposable.add( tutorTabService.apiUsersTutorTabByTutorIdGet(PrefUtils.getUserId(getApplicationContext())) .subscribeOn(Schedulers.io()) @@ -70,26 +90,52 @@ public class TutorTab extends AppCompatActivity { @Override public void onSuccess(TutorTabViewModel tutorTabViewModel) { - List dutyHoursList = Stream.of(tutorTabViewModel.getDutyHours()) - .map(DutyHourViewModel::getSummary).toList(); - - userRoom.setText(String.format("%s: %s", getString(R.string.userRoom), tutorTabViewModel.getRoom())); - userEmail.setText(String.format("%s: %s", getString(R.string.userEmail), tutorTabViewModel.getEmailTutorTab())); + dutyHourList = tutorTabViewModel.getDutyHours(); + if(dutyHourList == null){ + }else{ + dutyHoursAdapter = new DutyHoursAdapter(getApplicationContext(),dutyHourList); + dutyHoursRecycller.setAdapter(dutyHoursAdapter); + addDutyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addEmptyDuty(dutyHoursAdapter); + } + }); + } + userRoom.setText(String.format("%s", tutorTabViewModel.getRoom())); + userEmail.setText(String.format("%s", tutorTabViewModel.getEmailTutorTab())); if (!tutorTabViewModel.getNote().equals("")) { userNote.setText(String.format("%s", tutorTabViewModel.getNote())); } - userDutyHours.setText(String.format("%s: %s", getString(R.string.userDutyHoursHeader), Arrays.toString(dutyHoursList.toArray()))); - } @Override public void onError(Throwable e) { + int code = ((HttpException) e).response().code(); + if( code == 404){ + ifTutorTabExists = false; + dutyHoursAdapter = new DutyHoursAdapter(getApplicationContext(),new ArrayList()); + dutyHoursRecycller.setAdapter(dutyHoursAdapter); + addDutyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + addEmptyDuty(dutyHoursAdapter); + } + }); + } showError(e); } })); + + + + findViewById(R.id.contentTutorTabInfoImageButton).setOnClickListener(v-> InfoHelperUtils.infoPopUp(v,R.layout.info_popup_tutor_tab)); + + userName.setText(String.format("%s %s", PrefUtils.getUserFirstName(getApplicationContext()), PrefUtils.getUserLastName(getApplicationContext()))); + disposable.add( - userService.getUserById(PrefUtils.getUserId(getApplicationContext())) + userService.getUserById(PrefUtils.getUserId(getApplicationContext())) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new DisposableSingleObserver() { @@ -102,31 +148,56 @@ public class TutorTab extends AppCompatActivity { @Override public void onError(Throwable e) { + showError(e); } })); - setUpSaveListener(saveButon, userNote); + setUpSaveListener(saveButon); + } + private void addEmptyDuty(DutyHoursAdapter adapter){ + adapter.addDuty(new DutyHourViewModel()); + adapter.notifyItemInserted(adapter.getItemCount()); + dutyHoursRecycller.scrollToPosition(adapter.getItemCount()-1); } - private void setUpSaveListener(Button button, EditText note) { + private void setUpSaveListener(Button button) { button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - newTab = new TutorTabViewModel(PrefUtils.getUserId(getApplicationContext()),note.getText().toString()); - putUserTab(newTab); + newTab = new TutorTabViewModel(PrefUtils.getUserId(getApplicationContext()), + userRoom.getText().toString(), + userEmail.getText().toString(), + userNote.getText().toString(), + dutyHoursAdapter.getDutyList()); + if(ifTutorTabExists){ + putUserTab(newTab); + }else{ + postUserTab(newTab); + ifTutorTabExists=true; + } } }); } - + private void putUserTab(TutorTabViewModel tutorTabViewModel) { disposable.add(tutorTabService.apiUsersTutorTabByTutorIdPut(PrefUtils.getUserId(getApplicationContext()), tutorTabViewModel) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(this::handleResponse, this::handleError)); + .subscribe(this::handleResponsePut, this::handleError)); + } + private void postUserTab(TutorTabViewModel tutorTabViewModel) { + disposable.add(tutorTabService.apiUsersTutorTabByTutorIdPost(PrefUtils.getUserId(getApplicationContext()), tutorTabViewModel) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(this::handleResponsePost, this::handleError)); } - private void handleResponse(TutorTabViewModel tutorTabViewModel) { - Toast.makeText(getApplicationContext(), getApplicationContext().getString(R.string.modal_feedback_thankyou), Toast.LENGTH_SHORT).show(); + private void handleResponsePut(Response resp) { + Toast.makeText(getApplicationContext(), getApplicationContext().getString(R.string.updateToast), Toast.LENGTH_SHORT).show(); + + } + private void handleResponsePost(TutorTabViewModel tutorTabViewModel ) { + Toast.makeText(getApplicationContext(), getApplicationContext().getString(R.string.updateToast), Toast.LENGTH_SHORT).show(); } @@ -153,9 +224,6 @@ public class TutorTab extends AppCompatActivity { } else { message = "Network Error!"; } - -// Snackbar.make(coordinatorLayout, message, Snackbar.LENGTH_LONG) -// .show(); Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java index c6e68fd..0ed27fc 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/UsersListFragment.java @@ -15,6 +15,7 @@ import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; +import android.widget.Toast; import com.annimon.stream.Stream; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; @@ -27,6 +28,7 @@ import com.uam.wmi.findmytutor.model.User; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.service.TutorTabApi; import com.uam.wmi.findmytutor.service.UserService; +import com.uam.wmi.findmytutor.utils.InfoHelperUtils; import com.uam.wmi.findmytutor.utils.MyDividerItemDecoration; import com.uam.wmi.findmytutor.utils.RecyclerTouchListener; import com.uam.wmi.findmytutor.utils.RestApiHelper; @@ -76,6 +78,7 @@ public class UsersListFragment extends Fragment { mAdapter = new TutorsListAdapter(getActivity().getApplicationContext(), tutorsFiltered); View view = inflater.inflate(R.layout.users_list, container, false); view.setBackgroundColor(getResources().getColor(android.R.color.white)); + return view; } @@ -151,11 +154,11 @@ public class UsersListFragment extends Fragment { List dutyHoursList = Stream.of(tutorTabViewModel.getDutyHours()) .map(DutyHourViewModel::getSummary).toList(); - if(dutyHoursList.isEmpty()){ + if (dutyHoursList.isEmpty()) { dutyHoursList.add(getString(R.string.lack_duty_hours)); } - if(tutorTabViewModel.getNote().isEmpty()){ + if (tutorTabViewModel.getNote().isEmpty()) { userNoteText = getString(R.string.lack_note); } @@ -226,7 +229,7 @@ public class UsersListFragment extends Fragment { private int sortByUserName(User t1, User t2) { - return plCollator.compare(t1.getLastName(),t2.getLastName()); + return plCollator.compare(t1.getLastName(), t2.getLastName()); } private void showError(Throwable e) { @@ -235,7 +238,7 @@ public class UsersListFragment extends Fragment { if (e instanceof HttpException) { ResponseBody responseBody = ((HttpException) e).response().errorBody(); message = RestApiHelper.getErrorMessage(responseBody); - }else{ + } else { message = "Network Error !"; } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/adapters/DutyHoursAdapter.java b/app/src/main/java/com/uam/wmi/findmytutor/adapters/DutyHoursAdapter.java new file mode 100644 index 0000000..ae2d465 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/adapters/DutyHoursAdapter.java @@ -0,0 +1,163 @@ +package com.uam.wmi.findmytutor.adapters; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.text.Editable; +import android.text.TextWatcher; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.TextView; + +import com.annimon.stream.Collectors; +import com.annimon.stream.Stream; +import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.model.DutyHourViewModel; + +import java.util.ArrayList; +import java.util.List; +import butterknife.BindView; +import butterknife.ButterKnife; + + +public class DutyHoursAdapter extends RecyclerView.Adapter { + private Context context; + private List hours; + + public DutyHoursAdapter(Context context, List hours) { + this.context = context; + this.hours = new ArrayList(hours); + } + + + public List getDutyList(){ + ArrayList notEmpty = Stream.of(hours).filter(DutyHourViewModel::isValid).collect(Collectors.toCollection(ArrayList::new)); + return notEmpty; + } + public void addDuty(DutyHourViewModel duty){ + hours.add(duty); + } + private void removeDuty(int pos){ + hours.remove(pos); + this.notifyItemRemoved(pos); + Log.d("DutyIndex af rm size",Integer.toString(getItemCount())); + + } + + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.duty_hour_row, parent, false); + + return new MyViewHolder(itemView); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + DutyHourViewModel duty = hours.get(position); + holder.dutyDay.setText(duty.getDay()); + holder.dutyDay.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + duty.setDay(holder.dutyDay.getText().toString()); + } + }); + holder.dutyStart.setText(duty.getStart()); + holder.dutyStart.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + duty.setStart(holder.dutyStart.getText().toString()); + } + }); + holder.dutyStop.setText(duty.getEnd()); + holder.dutyStop.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + duty.setEnd(holder.dutyStop.getText().toString()); + } + }); + holder.deleteRow.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + try{ + Log.d("DutyIndex bf rm size",Integer.toString(getItemCount())); + Log.d("DutyIndex bf rm pos",Integer.toString(holder.getLayoutPosition())); + removeDuty(holder.getLayoutPosition()); + Log.d("DutyIndex af rm pos",Integer.toString(holder.getLayoutPosition())); + + + }catch(Error e){ + Log.e("DutyIndex error",e.getMessage()); + Log.e("DutyIndex size",Integer.toString(getItemCount())); + Log.e("DutyIndex pos",Integer.toString(holder.getAdapterPosition())); + + + } + + } + }); + + } + + @Override + public int getItemCount() { + return hours.size(); + } + + class MyViewHolder extends RecyclerView.ViewHolder { + + @BindView(R.id.duty_day_value) + TextView dutyDay; + + @BindView(R.id.duty_start_value) + TextView dutyStart; + + @BindView(R.id.duty_stop_value) + TextView dutyStop; + + @BindView(R.id.deleteRow) + ImageButton deleteRow; + + MyViewHolder(View view) { + super(view); + ButterKnife.bind(this, view); + } + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java index d3bcbe2..0e0245e 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHourViewModel.java @@ -24,6 +24,20 @@ public class DutyHourViewModel { this.day = day; return this; } + public Boolean isValid(){ + if(this.day.isEmpty()){ + return false; + }else if( !this.start.isEmpty() && this.end.isEmpty() ){ + return false; + }else{ + return true; + } + } + public DutyHourViewModel(){ + day=""; + start=""; + end=""; + } /** * Get day @@ -94,12 +108,11 @@ public class DutyHourViewModel { return Objects.hash(day, start, end); } + public String getSummary() { - return this.getDay() + " " + this.getStart() + " " + this.getEnd(); + return this.getDay() + ": " + this.getStart() + " - " + this.getEnd(); } - - @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java index e726ce9..73ed9d8 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTabViewModel.java @@ -33,11 +33,12 @@ public class TutorTabViewModel { @SerializedName("dutyHours") private List dutyHours = null; - public TutorTabViewModel(String userId, String note){ + public TutorTabViewModel(String userId, String room, String email, String note, List dutyHours){ this.userId=userId; -// this.room=room; -// this.emailTutorTab=emailTutorTab; + this.room=room; + this.emailTutorTab=email; this.note=note; + this.dutyHours = new ArrayList(dutyHours); } public TutorTabViewModel tutorTabId(UUID tutorTabId) { diff --git a/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java b/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java index 1835496..71c1e1b 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java @@ -4,6 +4,7 @@ import android.content.Context; import android.text.TextUtils; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import com.uam.wmi.findmytutor.utils.Const; import com.uam.wmi.findmytutor.utils.PrefUtils; import java.io.IOException; @@ -26,7 +27,6 @@ public class ApiClient { private static Retrofit retrofit = null; private static int REQUEST_TIMEOUT = 60; private static OkHttpClient okHttpClient; - private static final String BASE_URL = "https://s416084.projektstudencki.pl/master/"; public static Retrofit getClient(Context context) { @@ -35,7 +35,7 @@ public class ApiClient { if (retrofit == null) { retrofit = new Retrofit.Builder() - .baseUrl(BASE_URL) + .baseUrl(Const.BASE_URL) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java b/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java index e5ba6b1..837e356 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/TutorTabApi.java @@ -5,6 +5,7 @@ import com.uam.wmi.findmytutor.model.TutorTabViewModel; import io.reactivex.Observable; import io.reactivex.Single; +import retrofit2.Response; import retrofit2.http.*; @@ -40,6 +41,10 @@ public interface TutorTabApi { @retrofit2.http.Path("tutorId") String tutorId ); + @POST("api/users/tutorTab/{tutorId}") + Single apiUsersTutorTabByTutorIdPost( + @retrofit2.http.Path("tutorId") String tutorId, @retrofit2.http.Body TutorTabViewModel tutorTab + ); /** * * @@ -51,7 +56,7 @@ public interface TutorTabApi { "Content-Type:application/json" }) @PUT("api/users/tutorTab/{tutorId}") - Observable apiUsersTutorTabByTutorIdPut( + Observable> apiUsersTutorTabByTutorIdPut( @retrofit2.http.Path("tutorId") String tutorId, @retrofit2.http.Body TutorTabViewModel tutorTab ); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/ApproximatedLocalization.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/ApproximatedLocalization.java index 83f26fc..9cd78d7 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/ApproximatedLocalization.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/ApproximatedLocalization.java @@ -1,25 +1,18 @@ package com.uam.wmi.findmytutor.utils; -import android.support.annotation.NonNull; - -import com.google.gson.GsonBuilder; -import com.mapbox.geojson.BoundingBox; import com.mapbox.geojson.Feature; import com.mapbox.geojson.FeatureCollection; -import com.mapbox.geojson.Geometry; import com.mapbox.geojson.Point; import com.mapbox.geojson.Polygon; -import com.mapbox.geojson.gson.BoundingBoxDeserializer; -import com.mapbox.geojson.gson.GeoJsonAdapterFactory; -import com.mapbox.geojson.gson.GeometryDeserializer; -import com.mapbox.geojson.gson.PointDeserializer; +import com.mapbox.turf.TurfClassification; import com.mapbox.turf.TurfJoins; +import com.mapbox.turf.TurfMeasurement; import java.util.Arrays; import java.util.List; import java.util.Objects; -; +;import static com.mapbox.geojson.FeatureCollection.fromJson; public class ApproximatedLocalization { private FeatureCollection buildingSchema = null; @@ -28,17 +21,6 @@ public class ApproximatedLocalization { buildingSchema = fromJson(buildingObject); } - private FeatureCollection fromJson(@NonNull String json) { - GsonBuilder gson = new GsonBuilder(); - - gson.registerTypeAdapterFactory(GeoJsonAdapterFactory.create()); - gson.registerTypeAdapter(Point.class, new PointDeserializer()); - gson.registerTypeAdapter(Geometry.class, new GeometryDeserializer()); - gson.registerTypeAdapter(BoundingBox.class, new BoundingBoxDeserializer()); - - return gson.create().fromJson(json, FeatureCollection.class); - } - public String getNameOfBuildingPart(Point point) { for (Feature feature : Objects.requireNonNull(buildingSchema.features())) { @@ -56,7 +38,9 @@ public class ApproximatedLocalization { for (Feature feature : Objects.requireNonNull(buildingSchema.features())) { String partName = feature.getStringProperty("name"); + if (buildingPart != null && buildingPart.equals(partName)) { + Double longitude = feature.getNumberProperty("longitude").doubleValue(); Double latitude = feature.getNumberProperty("latitude").doubleValue(); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java index 6a4282a..48fd35f 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/Const.java @@ -6,7 +6,8 @@ import java.util.Arrays; import java.util.List; public class Const { - public final static Integer onlineBackgroundLocationInterval = 15000; + public final static String BASE_URL = "https://s416084.projektstudencki.pl/master/"; + public final static Integer onlineBackgroundLocationInterval = 7000; public final static Integer offlineBackgroundLocationInterval = 36000; public final static Integer defaultMapZoom = 17; public final static Integer searchMapZoom = 13; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/EnableSharingDialog.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/EnableSharingDialog.java new file mode 100644 index 0000000..eafb29e --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/EnableSharingDialog.java @@ -0,0 +1,31 @@ +package com.uam.wmi.findmytutor.utils; + +import android.app.Dialog; +import android.app.DialogFragment; +import android.content.Context; +import android.os.Bundle; +import android.support.v7.app.AlertDialog; +import android.widget.Toast; + +import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.activity.MapActivity; + +public class EnableSharingDialog extends DialogFragment { + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new AlertDialog.Builder(getActivity()) + .setTitle(R.string.sharing_modal_title) + .setMessage(R.string.enable_sharing_question) + .setPositiveButton(R.string.possitive_dialog_button, (dialog, which) -> + dialogPositiveAnswer(getActivity()) + ) + .setNegativeButton(R.string.negative_dialog_button, (dialog, which) -> dialog.cancel()).create(); + } + + private void dialogPositiveAnswer(Context context) { + PrefUtils.storeEnableSharingLocalization(context, true); + ((MapActivity) getActivity()).handleBackgroundTaskLifeCycle(); + + } +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/InfoHelperUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/InfoHelperUtils.java new file mode 100644 index 0000000..1bde7f4 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/InfoHelperUtils.java @@ -0,0 +1,35 @@ +package com.uam.wmi.findmytutor.utils; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.PopupWindow; + + +import java.util.Objects; + +import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; + +public class InfoHelperUtils { + + public static void infoPopUp(View anchorView, int layoutId) { + LayoutInflater layoutInflater = (LayoutInflater)getApplicationContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE ); + View popupView = Objects.requireNonNull(layoutInflater).inflate(layoutId, null); + + PopupWindow popupWindow = new PopupWindow(popupView, + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); + // If the PopupWindow should be focusable + popupWindow.setFocusable(true); + // If you need the PopupWindow to dismiss when when touched outside + popupWindow.setBackgroundDrawable(new ColorDrawable()); + int location[] = new int[2]; + // Get the View's(the one that was clicked in the Fragment) location + anchorView.getLocationOnScreen(location); + // Using location, the PopupWindow will be displayed right under anchorView + popupWindow.showAtLocation(anchorView, Gravity.NO_GRAVITY, + location[0] + anchorView.getWidth() / 2, location[1] + anchorView.getHeight()); + } +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/LocaleUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/LocaleUtils.java index f4c15fb..7046b83 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/LocaleUtils.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/LocaleUtils.java @@ -1,15 +1,10 @@ package com.uam.wmi.findmytutor.utils; -import android.content.Context; -import android.os.Build; +import android.content.res.Resources; +import android.support.v4.os.ConfigurationCompat; public class LocaleUtils { - public static String getCurrentLocale(Context context){ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){ - return String.valueOf(context.getResources().getConfiguration().getLocales().get(0)); - } else{ - //noinspection deprecation - return String.valueOf(context.getResources().getConfiguration().locale); - } + public static String getCurrentLocale(){ + return String.valueOf(ConfigurationCompat.getLocales(Resources.getSystem().getConfiguration())); } } 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 3a12597..5d45d85 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 @@ -144,7 +144,7 @@ public class PrefUtils { } public static String getLocale(Context context) { - return getSharedPreferences(context).getString("LOCALE", LocaleUtils.getCurrentLocale(context)); + return getSharedPreferences(context).getString("LOCALE", LocaleUtils.getCurrentLocale()); } public static Boolean isBackgroundLocationServiceRunning(Context context) { @@ -162,7 +162,7 @@ public class PrefUtils { editor.putString("key_location_level","3"); editor.putString("location_mode", "manual"); editor.putString("approx_manual_loc", approximatedLocation); - editor.putBoolean("key_sharing_enabled", true); + /*editor.putBoolean("key_sharing_enabled", true);*/ editor.putLong("longitude_manual_location", Double.doubleToRawLongBits(latLng.getLongitude())); editor.putLong("latitude_manual_location", Double.doubleToRawLongBits(latLng.getLatitude())); editor.apply(); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/SharingInfoPopupButtonPreference.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/SharingInfoPopupButtonPreference.java new file mode 100644 index 0000000..88aad9d --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/SharingInfoPopupButtonPreference.java @@ -0,0 +1,44 @@ +package com.uam.wmi.findmytutor.utils; + +import android.content.Context; +import android.graphics.drawable.ColorDrawable; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.PopupWindow; +import android.widget.Toast; + +import com.uam.wmi.findmytutor.R; + +import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; + +public class SharingInfoPopupButtonPreference extends Preference { + + public SharingInfoPopupButtonPreference(Context context, AttributeSet attrs) { + super(context, attrs); + setWidgetLayoutResource(R.layout.preference_popup_info_button_widget); + } + @Override + protected View onCreateView(ViewGroup parent) { + View view = super.onCreateView(parent); +// LayoutInflater li = (LayoutInflater)getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE ); +// View temp =li.inflate( R.layout.preference_button_widget, parent, false); + return view; + } + @Override + protected void onBindView(View view) + { + super.onBindView(view); + ImageButton button = view.findViewById(R.id.sharingTabInfoImageButton); + button.setOnClickListener(v-> { + InfoHelperUtils.infoPopUp(v,R.layout.info_popup_sharing_tab); + }); + } + +} diff --git a/app/src/main/res/drawable-hdpi/outline_info_white_18.png b/app/src/main/res/drawable-hdpi/outline_info_white_18.png new file mode 100644 index 0000000..0f0e6e3 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/outline_info_white_18.png differ diff --git a/app/src/main/res/drawable-hdpi/outline_info_white_24.png b/app/src/main/res/drawable-hdpi/outline_info_white_24.png new file mode 100644 index 0000000..e84735d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/outline_info_white_24.png differ diff --git a/app/src/main/res/drawable-hdpi/outline_info_white_36.png b/app/src/main/res/drawable-hdpi/outline_info_white_36.png new file mode 100644 index 0000000..51bee06 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/outline_info_white_36.png differ diff --git a/app/src/main/res/drawable-hdpi/outline_info_white_48.png b/app/src/main/res/drawable-hdpi/outline_info_white_48.png new file mode 100644 index 0000000..a726e63 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/outline_info_white_48.png differ diff --git a/app/src/main/res/drawable-mdpi/outline_info_white_18.png b/app/src/main/res/drawable-mdpi/outline_info_white_18.png new file mode 100644 index 0000000..b642d34 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/outline_info_white_18.png differ diff --git a/app/src/main/res/drawable-mdpi/outline_info_white_24.png b/app/src/main/res/drawable-mdpi/outline_info_white_24.png new file mode 100644 index 0000000..3cd3871 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/outline_info_white_24.png differ diff --git a/app/src/main/res/drawable-mdpi/outline_info_white_36.png b/app/src/main/res/drawable-mdpi/outline_info_white_36.png new file mode 100644 index 0000000..e84735d Binary files /dev/null and b/app/src/main/res/drawable-mdpi/outline_info_white_36.png differ diff --git a/app/src/main/res/drawable-mdpi/outline_info_white_48.png b/app/src/main/res/drawable-mdpi/outline_info_white_48.png new file mode 100644 index 0000000..dbbbea8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/outline_info_white_48.png differ diff --git a/app/src/main/res/drawable-xhdpi/outline_info_white_18.png b/app/src/main/res/drawable-xhdpi/outline_info_white_18.png new file mode 100644 index 0000000..e84735d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/outline_info_white_18.png differ diff --git a/app/src/main/res/drawable-xhdpi/outline_info_white_24.png b/app/src/main/res/drawable-xhdpi/outline_info_white_24.png new file mode 100644 index 0000000..dbbbea8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/outline_info_white_24.png differ diff --git a/app/src/main/res/drawable-xhdpi/outline_info_white_36.png b/app/src/main/res/drawable-xhdpi/outline_info_white_36.png new file mode 100644 index 0000000..a726e63 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/outline_info_white_36.png differ diff --git a/app/src/main/res/drawable-xhdpi/outline_info_white_48.png b/app/src/main/res/drawable-xhdpi/outline_info_white_48.png new file mode 100644 index 0000000..9baf6dc Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/outline_info_white_48.png differ diff --git a/app/src/main/res/drawable-xxhdpi/outline_info_white_18.png b/app/src/main/res/drawable-xxhdpi/outline_info_white_18.png new file mode 100644 index 0000000..51bee06 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/outline_info_white_18.png differ diff --git a/app/src/main/res/drawable-xxhdpi/outline_info_white_24.png b/app/src/main/res/drawable-xxhdpi/outline_info_white_24.png new file mode 100644 index 0000000..a726e63 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/outline_info_white_24.png differ diff --git a/app/src/main/res/drawable-xxhdpi/outline_info_white_36.png b/app/src/main/res/drawable-xxhdpi/outline_info_white_36.png new file mode 100644 index 0000000..3c7c30c Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/outline_info_white_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/outline_info_white_48.png b/app/src/main/res/drawable-xxhdpi/outline_info_white_48.png new file mode 100644 index 0000000..192361b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/outline_info_white_48.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/outline_info_white_18.png b/app/src/main/res/drawable-xxxhdpi/outline_info_white_18.png new file mode 100644 index 0000000..a726e63 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/outline_info_white_18.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/outline_info_white_24.png b/app/src/main/res/drawable-xxxhdpi/outline_info_white_24.png new file mode 100644 index 0000000..9baf6dc Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/outline_info_white_24.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/outline_info_white_36.png b/app/src/main/res/drawable-xxxhdpi/outline_info_white_36.png new file mode 100644 index 0000000..192361b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/outline_info_white_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/outline_info_white_48.png b/app/src/main/res/drawable-xxxhdpi/outline_info_white_48.png new file mode 100644 index 0000000..d3213de Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/outline_info_white_48.png differ diff --git a/app/src/main/res/drawable/ic_info_black_24dp.xml b/app/src/main/res/drawable/ic_info_black_24dp.xml index 34b8202..d63bdac 100644 --- a/app/src/main/res/drawable/ic_info_black_24dp.xml +++ b/app/src/main/res/drawable/ic_info_black_24dp.xml @@ -1,9 +1,9 @@ - +android:width="24dp" +android:height="24dp" +android:viewportHeight="24.0" +android:viewportWidth="24.0"> + diff --git a/app/src/main/res/drawable/layout_bg.xml b/app/src/main/res/drawable/layout_bg.xml new file mode 100644 index 0000000..051dd17 --- /dev/null +++ b/app/src/main/res/drawable/layout_bg.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/outline_info_24.xml b/app/src/main/res/drawable/outline_info_24.xml new file mode 100644 index 0000000..b23561d --- /dev/null +++ b/app/src/main/res/drawable/outline_info_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml index bdf45f3..fa650bb 100644 --- a/app/src/main/res/layout/activity_map.xml +++ b/app/src/main/res/layout/activity_map.xml @@ -2,7 +2,6 @@ + tools:layout_editor_absoluteY="0dp"> diff --git a/app/src/main/res/layout/content_tutor_tab.xml b/app/src/main/res/layout/content_tutor_tab.xml index 8bc6144..ef92cd3 100644 --- a/app/src/main/res/layout/content_tutor_tab.xml +++ b/app/src/main/res/layout/content_tutor_tab.xml @@ -1,85 +1,171 @@ - + android:layout_height="match_parent"> - - - + android:layout_height="match_parent" + android:orientation="vertical" + android:fontFamily="@font/lato_regular" + android:paddingLeft="@dimen/activity_margin" + android:paddingRight="@dimen/activity_margin" + android:paddingTop="@dimen/activity_margin"> + - - + - + + + + - - + + + -