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 cdfb25e..2df6238 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/FindMyTutor.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/FindMyTutor.java @@ -6,9 +6,9 @@ import android.content.SharedPreferences; import android.content.res.Configuration; import com.uam.wmi.findmytutor.utils.Const; -import com.uam.wmi.findmytutor.utils.LocaleHelper; +import com.uam.wmi.findmytutor.utils.MapUtils; +import com.uam.wmi.findmytutor.utils.PrefUtils; -import static org.acra.ReportField.*; import org.acra.ACRA; import org.acra.annotation.AcraLimiter; import org.acra.annotation.AcraNotification; @@ -17,15 +17,28 @@ import org.acra.config.HttpSenderConfigurationBuilder; import org.acra.config.ToastConfigurationBuilder; import org.acra.data.StringFormat; import org.acra.sender.HttpSender; + import java.util.HashMap; import java.util.Map; +import static org.acra.ReportField.ANDROID_VERSION; +import static org.acra.ReportField.BUILD_CONFIG; +import static org.acra.ReportField.CUSTOM_DATA; +import static org.acra.ReportField.LOGCAT; +import static org.acra.ReportField.PHONE_MODEL; +import static org.acra.ReportField.REPORT_ID; +import static org.acra.ReportField.SHARED_PREFERENCES; +import static org.acra.ReportField.STACK_TRACE; +import static org.acra.ReportField.USER_APP_START_DATE; +import static org.acra.ReportField.USER_CRASH_DATE; + @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) { super.attachBaseContext(base); @@ -45,16 +58,17 @@ public class FindMyTutor extends Application { ToastConfigurationBuilder.class ).setResText(R.string.acra_toast_text); + SharedPreferences sharedPreferences = base.getSharedPreferences("com.uam.wmi.findmytutor_preferences", Context.MODE_PRIVATE); Map header = new HashMap(); String token = sharedPreferences.getString("API_KEY", "KEY_EMPTY"); - header.put("Authorization","Bearer " + token); + header.put("Authorization", "Bearer " + token); // Api POST builder.getPluginConfigurationBuilder( HttpSenderConfigurationBuilder.class // ).setUri("http://192.168.0.15:3000/api/acra") - ).setUri(Const.BASE_URL +"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 3852766..0e54e1e 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 @@ -38,6 +38,7 @@ import com.uam.wmi.findmytutor.utils.ActiveFragment; import com.uam.wmi.findmytutor.utils.FeedbackUtils; import com.uam.wmi.findmytutor.utils.LocaleHelper; import com.uam.wmi.findmytutor.utils.LocaleUtils; +import com.uam.wmi.findmytutor.utils.MapUtils; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.RxSearchObservable; @@ -161,6 +162,7 @@ public abstract class BaseActivity protected void logout(){ storeBackgroundLocationStatus(getApplication(), false); PrefUtils.storeIsLoggedIn(getApplicationContext(), false); + PrefUtils.setBatteryExlusionInfoStatus(getApplicationContext(), true); Intent i = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPackageName()); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java index 97ef399..d49dc60 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/LoginActivity.java @@ -27,6 +27,7 @@ import com.uam.wmi.findmytutor.model.ValidateUser; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.service.LdapService; import com.uam.wmi.findmytutor.service.UserService; +import com.uam.wmi.findmytutor.utils.MapUtils; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.RestApiHelper; @@ -190,6 +191,7 @@ public class LoginActivity extends AppCompatActivity { getUserProfile(userId.asString()); + Intent data = new Intent(); String txt = "Main Activity"; data.setData(Uri.parse(txt)); 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 fa35e4d..855f0cb 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 @@ import android.widget.Toast; import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.utils.LocaleHelper; +import com.uam.wmi.findmytutor.utils.MapUtils; import com.uam.wmi.findmytutor.utils.PrefUtils; import java.util.Locale; @@ -48,8 +49,8 @@ public class StartupActivity extends AppCompatActivity { finish(); } else { Intent loginIntent = new Intent(this, LoginActivity.class); -// Intent loginIntent = new Intent(this, ScrollingActivity.class); startActivityForResult(loginIntent, AUTHENTICATION_REQUEST_CODE); + } super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java index ad6a5f0..21c8bce 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/BackgroundLocalizationService.java @@ -34,9 +34,11 @@ import com.mapbox.mapboxsdk.geometry.LatLng; import com.uam.wmi.findmytutor.model.Coordinate; import com.uam.wmi.findmytutor.network.ApiClient; import com.uam.wmi.findmytutor.utils.ApproximatedLocalization; +import com.uam.wmi.findmytutor.utils.Const; import com.uam.wmi.findmytutor.utils.MapUtils; import com.uam.wmi.findmytutor.utils.PrefUtils; import com.uam.wmi.findmytutor.utils.SharingLevel; +import com.uam.wmi.findmytutor.utils.WifiUtils; import org.apache.commons.collections4.queue.CircularFifoQueue; @@ -140,22 +142,60 @@ public class BackgroundLocalizationService extends Service { startForeground(1001, notification); } - if (!stopService && !PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.MANUAL.toString())) { - createFusedLocationClient(); - } else if (!stopService && - PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.MANUAL.toString())) { - mStatusChecker = () -> { - try { - sendCoordinateToBackend(fakeLoc); - } finally { - mHandler.postDelayed(mStatusChecker, notify_interval); - } - }; + if (!stopService) { + if (PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.PRESENCE.toString())) { + if (WifiUtils.checkIfUserIsInRangeOfWmiWifi(getApplicationContext())) { + Location presenceFakeLoc = new Location(""); - AsyncTask.execute(mStatusChecker); + presenceFakeLoc.setLatitude(Const.presenceLatitude); + presenceFakeLoc.setLongitude(Const.presenceLongitude); + presenceFakeLoc.setAltitude(0); + createPresenceLooper(presenceFakeLoc); + } else { + createFusedLocationClient(); + } + } else if (PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.EXACT.toString()) + || PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.APPROXIMATED.toString()) + ) { + createFusedLocationClient(); + } else if (PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.MANUAL.toString())) { + Location manualFakeLoc = new Location(""); + + manualFakeLoc.setLatitude(0); + manualFakeLoc.setLongitude(0); + manualFakeLoc.setAltitude(0); + createLowBatteryLooper(manualFakeLoc); + } } } + private void createLowBatteryLooper(Location fakeLoc) { + mStatusChecker = () -> { + try { + sendCoordinateToBackend(fakeLoc); + } finally { + mHandler.postDelayed(mStatusChecker, notify_interval); + } + }; + AsyncTask.execute(mStatusChecker); + } + + private void createPresenceLooper(Location fakeLoc) { + mStatusChecker = () -> { + try { + if (WifiUtils.checkIfUserIsInRangeOfWmiWifi(getApplicationContext())) { + sendCoordinateToBackend(fakeLoc); + } else { + restartService(); + } + } finally { + mHandler.postDelayed(mStatusChecker, notify_interval); + } + }; + AsyncTask.execute(mStatusChecker); + } + + private void createFusedLocationClient() { Integer saveMode = Long.valueOf(notify_interval).compareTo(Long.valueOf(offlineBackgroundLocationInterval)); @@ -180,6 +220,12 @@ public class BackgroundLocalizationService extends Service { mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper()); + + //Restart service when a user started using presence in GPS mode and wmi is currently available + if (WifiUtils.checkIfUserIsInRangeOfWmiWifi(getApplicationContext()) + && PrefUtils.getLocationLevel(getApplicationContext()).equals(SharingLevel.PRESENCE.toString())) { + restartService(); + } } } @@ -294,7 +340,7 @@ public class BackgroundLocalizationService extends Service { latitude = location.getLatitude(); longitude = location.getLongitude(); altitude = location.getAltitude(); - Log.e(TAG,"TASK" + latitude + " " + longitude); + Log.e(TAG, "TASK" + latitude + " " + longitude); approximatedLocalization = new ApproximatedLocalization(MapUtils.loadJsonFromAsset(getApplicationContext(), "building.geojson")); approximatedBuildingPart = approximatedLocalization.getNameOfBuildingPart(Point.fromLngLat(longitude, latitude)); } @@ -307,6 +353,7 @@ public class BackgroundLocalizationService extends Service { if (locationLevel.equals(SharingLevel.PRESENCE.toString())) { if (!MapUtils.checkIfCoordinateIsValid(latitude, longitude)) { + coordinatesHistory.add(fakeLoc); return null; } 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 f7aaacf..cf4abe9 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 @@ -20,5 +20,7 @@ public class Const { public final static Range outsideLatitudeRange = Range.create(52.4651, 52.468837); public final static Range outsideLongitudeRange = Range.create(16.9186, 16.936004); public final static List validApproximatedLocations = Arrays.asList("Skrzydło B", "Skrzydło A", "Aule", "Łącznik", "Biblioteka", "Hol", "Unknown"); + public final static String WMI_SSID_NAME = "wmi"; } + diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java index 2cb22f2..0ff9d2b 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/MapUtils.java @@ -3,12 +3,10 @@ package com.uam.wmi.findmytutor.utils; import android.animation.TypeEvaluator; import android.app.AlertDialog; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; import android.location.Location; import android.net.Uri; import android.os.Build; -import android.os.PowerManager; import android.provider.Settings; import com.mapbox.mapboxsdk.camera.CameraPosition; @@ -25,6 +23,7 @@ import java.io.InputStream; import static com.mapbox.mapboxsdk.Mapbox.getApplicationContext; import static com.uam.wmi.findmytutor.utils.Const.outsideLatitudeRange; import static com.uam.wmi.findmytutor.utils.Const.outsideLongitudeRange; +import static com.uam.wmi.findmytutor.utils.PrefUtils.shouldBatteryExclusionBeShown; public class MapUtils { @@ -90,6 +89,27 @@ public class MapUtils { return Const.buildingLatitudeRange.contains(latitude) && Const.buildingLongitudeRange.contains(longitude); } + public static void BatteryOptimizationsExceptionCheck(Context context) { + if (shouldBatteryExclusionBeShown(getApplicationContext())) { + PrefUtils.setBatteryExlusionInfoStatus(getApplicationContext(), false); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.batter_exclusions_title); + builder.setMessage(R.string.batter_exclusions_message) + .setPositiveButton(R.string.ok, (dialog, id) -> { + Intent intent = new Intent(); + intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null); + intent.setData(uri); + context.startActivity(intent); + }) + .setNegativeButton(R.string.cancel, (dialog, id) -> { + + }).show(); + } + } + } + // Function for marker animation public static class LatLngEvaluator implements TypeEvaluator { // Method is used to interpolate the marker animation. @@ -106,19 +126,4 @@ public class MapUtils { } } - public static void BatteryOptimizationsExceptionCheck(Context context) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.batter_exclusions_title); - builder.setMessage(R.string.batter_exclusions_message) - .setPositiveButton(R.string.ok, (dialog, id) -> { - Intent intentBatteryUsage = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY); - context.startActivity(intentBatteryUsage); - }) - .setNegativeButton(R.string.cancel, (dialog, id) -> { - // User cancelled the dialog - }).show(); - } - } - } 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 2ae7c57..131227c 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 @@ -243,4 +243,13 @@ public class PrefUtils { return getSharedPreferences(context).getBoolean("whitelisting", false); } + public static Boolean shouldBatteryExclusionBeShown(Context context) { + return getSharedPreferences(context).getBoolean("show_battery_exclusion", false); + } + + public static void setBatteryExlusionInfoStatus(Context context, Boolean flag) { + SharedPreferences.Editor editor = getSharedPreferences(context).edit(); + editor.putBoolean("show_battery_exclusion", flag); + editor.apply(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/WifiUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/WifiUtils.java new file mode 100644 index 0000000..ae02ba6 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/WifiUtils.java @@ -0,0 +1,30 @@ +package com.uam.wmi.findmytutor.utils; + +import android.content.Context; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.util.Log; + +import java.util.Objects; + +public class WifiUtils { + + public static String getWifiName(Context context) { + WifiManager manager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + if (Objects.requireNonNull(manager).isWifiEnabled()) { + WifiInfo wifiInfo = manager.getConnectionInfo(); + if (wifiInfo != null) { + NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState()); + if (state == NetworkInfo.DetailedState.CONNECTED || state == NetworkInfo.DetailedState.OBTAINING_IPADDR) { + return wifiInfo.getSSID(); + } + } + } + return null; + } + + public static Boolean checkIfUserIsInRangeOfWmiWifi(Context context) { + return Objects.equals(getWifiName(context), Const.WMI_SSID_NAME); + } +} diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index c782b09..75a7739 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -289,7 +289,7 @@ Dostępny teraz Profil użytkownika Uwaga - Aby aplikacja była w pełni funkcjonalna, dodaj FMT do wyjątków w oszczędzaniu baterii. Po wciśnięciu przycisku "ok" zostaniesz przeniesiony do opcji zarządzania baterią. W panelu "optymalizacja użycia baterii" upewnij się, że opcja optymalizacji jest wyłączona. + Aby aplikacja była w pełni funkcjonalna, dodaj FMT do wyjątków w oszczędzaniu baterii. Po wciśnięciu przycisku \"ok\" zostaniesz przeniesiony do opcji zarządzania baterią. W panelu \"Bateria\" upewnij się, że opcja optymalizacji jest wyłączona. Nigdy diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2f7f7c5..a74d7b7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -456,7 +456,7 @@ Status Available now Last seen - To make app fully functional, add FMT to battery saving exclusions. You can change battery options in "Optimise battery usage". Unfortunately, you have to do it manually. Click "ok" to open battery settings and make sure that the application is not optimised. + To make app fully functional add FMT to battery saving exclusions. You can change battery options in \"Optimise battery usage\". Unfortunately, you have to do it manually. Click \"ok\" to open battery settings and make sure that the application is not optimised. Please note Never