package org.droidplanner.android.utils.prefs; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; import com.o3dr.android.client.Drone; import com.o3dr.services.android.lib.drone.attribute.AttributeType; import com.o3dr.services.android.lib.drone.connection.ConnectionType; import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; import com.o3dr.services.android.lib.drone.mission.item.complex.Survey; import com.o3dr.services.android.lib.drone.mission.item.complex.SurveyDetail; import com.o3dr.services.android.lib.drone.property.CameraProxy; import com.o3dr.services.android.lib.gcs.follow.FollowType; import org.droidplanner.android.fragments.widget.TowerWidgets; import org.droidplanner.android.fragments.widget.video.WidgetVideoPreferences; import org.droidplanner.android.maps.providers.DPMapProvider; import org.droidplanner.android.tlog.TLogActivity; import org.droidplanner.android.utils.Utils; import org.droidplanner.android.utils.unit.systems.UnitSystem; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Provides structured access to Droidplanner preferences * <p/> * Over time it might be good to move the various places that are doing * prefs.getFoo(blah, default) here - to collect prefs in one place and avoid * duplicating string constants (which tend to become stale as code evolves). * This is called the DRY (don't repeat yourself) principle of software * development. */ public class DroidPlannerPrefs { /** * Flag to select the header for the main navigation drawer. */ public static final boolean ENABLE_DRONESHARE_ACCOUNT = false; /* * Default preference value */ public static final String PREF_USAGE_STATISTICS = "pref_usage_statistics"; public static final boolean DEFAULT_USAGE_STATISTICS = true; public static final String PREF_CONNECTION_TYPE = "pref_connection_param_type"; public static final String DEFAULT_CONNECTION_TYPE = String.valueOf(ConnectionType.TYPE_USB); private static final String PREF_KEEP_SCREEN_ON = "pref_keep_screen_bright"; private static final boolean DEFAULT_KEEP_SCREEN_ON = false; public static final String PREF_ENABLE_ZOOM_TO_FIT = "pref_enable_zoom_to_fit"; public static final boolean DEFAULT_ENABLE_ZOOM_TO_FIT = true; public static final String PREF_MAPS_PROVIDERS = "pref_maps_providers_key"; private static final String DEFAULT_MAPS_PROVIDER = DPMapProvider.DEFAULT_MAP_PROVIDER.name(); public static final String PREF_MAPS_PROVIDER_SETTINGS = "pref_map_provider_settings"; private static final AutoPanMode DEFAULT_AUTO_PAN_MODE = AutoPanMode.DISABLED; private static final String PREF_UI_LANGUAGE = "pref_ui_language_english"; public static final boolean DEFAULT_PREF_UI_LANGUAGE = false; private static final String PREF_SPEECH_PERIOD = "tts_periodic_status_period"; public static final String DEFAULT_SPEECH_PERIOD = "0"; public static final String PREF_MAX_ALT_WARNING = "pref_max_alt_warning"; public static final boolean DEFAULT_MAX_ALT_WARNING = false; public static final String PREF_TTS_LOST_SIGNAL = "tts_lost_signal"; public static final boolean DEFAULT_TTS_WARNING_LOST_SIGNAL = true; public static final String PREF_TTS_LOW_SIGNAL = "tts_low_signal"; public static final boolean DEFAULT_TTS_WARNING_LOW_SIGNAL = false; public static final String PREF_TTS_AUTOPILOT_WARNING = "tts_autopilot_warning"; public static final boolean DEFAULT_TTS_WARNING_AUTOPILOT_WARNING = true; public static final String PREF_USB_BAUD_RATE = "pref_baud_type"; private static final String DEFAULT_USB_BAUD_RATE = "57600"; public static final String PREF_TCP_SERVER_IP = "pref_server_ip"; private static final String DEFAULT_TCP_SERVER_IP = "192.168.40.100"; public static final String PREF_TCP_SERVER_PORT = "pref_server_port"; private static final String DEFAULT_TCP_SERVER_PORT = "5763"; public static final String PREF_UDP_PING_RECEIVER_IP = "pref_udp_ping_receiver_ip"; public static final String PREF_UDP_PING_RECEIVER_PORT = "pref_udp_ping_receiver_port"; public static final String PREF_UDP_SERVER_PORT = "pref_udp_server_port"; private static final String DEFAULT_UDP_SERVER_PORT = "14550"; public static final String PREF_UNIT_SYSTEM = "pref_unit_system"; private static final int DEFAULT_UNIT_SYSTEM = UnitSystem.AUTO; public static final String PREF_WARNING_GROUND_COLLISION = "pref_ground_collision_warning"; private static final boolean DEFAULT_WARNING_GROUND_COLLISION = false; public static final String PREF_ENABLE_MAP_ROTATION = "pref_map_enable_rotation"; private static final boolean DEFAULT_ENABLE_MAP_ROTATION = true; public static final String PREF_ENABLE_KILL_SWITCH = "pref_enable_kill_switch"; private static final boolean DEFAULT_ENABLE_KILL_SWITCH = false; public static final String PREF_ENABLE_UDP_PING = "pref_enable_udp_server_ping"; private static final boolean DEFAULT_ENABLE_UDP_PING = false; public static final String PREF_ALT_MAX_VALUE = "pref_alt_max_value"; private static final double DEFAULT_MAX_ALT = 200; //meters public static final String PREF_ALT_MIN_VALUE = "pref_alt_min_value"; private static final double DEFAULT_MIN_ALT = 0; // meter public static final String PREF_ALT_DEFAULT_VALUE = "pref_alt_default_value"; private static final double DEFAULT_ALT = 20; // meters public static final String PREF_APP_VERSION = "pref_version"; private static final String PREF_APP_VERSION_CODE = "pref_app_version_code"; private static final String PREF_IS_TTS_ENABLED = "pref_enable_tts"; private static final boolean DEFAULT_TTS_ENABLED = false; private static final String PREF_BT_DEVICE_NAME = "pref_bluetooth_device_name"; public static final String PREF_BT_DEVICE_ADDRESS = "pref_bluetooth_device_address"; public static final String PREF_FIRMWARE_VERSION = "pref_firmware_version"; public static final String PREF_VEHICLE_TYPE = "pref_vehicle_type"; public static final String PREF_SHOW_GPS_HDOP = "pref_ui_gps_hdop"; public static final boolean DEFAULT_SHOW_GPS_HDOP = false; private static final String PREF_UI_REALTIME_FOOTPRINTS = "pref_ui_realtime_footprints_key"; private static final boolean DEFAULT_UI_REALTIME_FOOTPRINTS = false; private static final String PREF_DSHARE_USERNAME = "dshare_username"; private static final String DEFAULT_DSHARE_USERNAME = ""; private static final String PREF_DSHARE_PASSWORD = "dshare_password"; private static final String DEFAULT_DSHARE_PASSWORD = ""; private static final String PREF_LIVE_UPLOAD_ENABLED = "pref_live_upload_enabled"; private static final boolean DEFAULT_LIVE_UPLOAD_ENABLED = false; public static final String PREF_AUTO_INSERT_MISSION_TAKEOFF_RTL_LAND = "pref_auto_insert_mission_takeoff_rtl_land"; public static final String PREF_WARN_ON_DRONIE_CREATION = "pref_warn_on_dronie_creation"; public static final String PREF_TTS_PERIODIC = "tts_periodic"; public static final String PREF_TTS_PERIODIC_BAT_VOLT = "tts_periodic_bat_volt"; private static final boolean DEFAULT_TTS_PERIODIC_BAT_VOLT = true; public static final String PREF_TTS_PERIODIC_ALT = "tts_periodic_alt"; private static final boolean DEFAULT_TTS_PERIODIC_ALT = true; public static final String PREF_TTS_PERIODIC_RSSI = "tts_periodic_rssi"; private static final boolean DEFAULT_TTS_PERIODIC_RRSI = true; public static final String PREF_TTS_PERIODIC_AIRSPEED = "tts_periodic_airspeed"; private static final boolean DEFAULT_TTS_PERIODIC_AIRSPEED = true; public static final String PREF_TOWER_WIDGETS = "pref_tower_widgets"; public static final String ACTION_PREF_RETURN_TO_ME_UPDATED = Utils.PACKAGE_NAME + ".action.PREF_RETURN_TO_ME_UPDATED"; public static final String PREF_RETURN_TO_ME = "pref_enable_return_to_me"; public static final boolean DEFAULT_RETURN_TO_ME = false; public static final String PREF_VEHICLE_HOME_UPDATE_WARNING = "pref_vehicle_home_update_warning"; public static final boolean DEFAULT_VEHICLE_HOME_UPDATE_WARNING = true; private static final String PREF_WIDGET_VIDEO_TYPE = "pref_widget_video_type"; private static final String PREF_CUSTOM_VIDEO_UDP_PORT = "pref_custom_video_udp_port"; public static final String PREF_UVC_VIDEO_ASPECT_RATIO = "pref_uvc_video_aspect_ratio"; private static final float DEFAULT_UVC_VIDEO_ASPECT_RATIO = 3f / 4f; public static final String PREF_WEATHER_INFO = "pref_weather_info"; public static final String PREF_LAST_KNOWN_FOLLOW_MODE = "pref_last_known_follow_mode"; private static final FollowType DEFAULT_FOLLOW_TYPE = FollowType.LEASH; // Survey user preferences private static final String PREF_SURVEY_CAMERA_NAME = "pref_survey_camera_name"; private static final String PREF_SURVEY_ALTITUDE = "pref_survey_altitude"; private static final String PREF_SURVEY_ANGLE = "pref_survey_angle"; private static final String PREF_SURVEY_OVERLAP = "pref_survey_overlap"; private static final String PREF_SURVEY_SIDELAP = "pref_survey_sidelap"; private static final String PREF_SURVEY_LOCK_ORIENTATION = "pref_survey_lock_orientation"; private static final String PREF_SURVEY_START_CAMERA_BEFORE_FIRST_WAYPOINT = "pref_survey_start_camera_before_first_waypoint"; private static final String PREF_VEHICLE_HISTORY_SESSION_ID = "pref_vehicle_history_session_id"; public static final String PREF_PROJECT_CREATOR = "pref_project_creator"; public static final String PREF_PROJECT_LEAD_MAINTAINER = "pref_project_lead_maintainer"; public static final String PREF_PROJECT_CONTRIBUTORS = "pref_project_contributors"; public static final String PREF_VEHICLE_DEFAULT_SPEED = "pref_vehicle_default_speed"; private static final float DEFAULT_SPEED = 5; //meters per second. // Public for legacy usage public final SharedPreferences prefs; private final LocalBroadcastManager lbm; private static DroidPlannerPrefs instance; public static synchronized DroidPlannerPrefs getInstance(Context context) { if (instance == null) { instance = new DroidPlannerPrefs(context); } return instance; } private DroidPlannerPrefs(Context context) { prefs = PreferenceManager.getDefaultSharedPreferences(context); lbm = LocalBroadcastManager.getInstance(context); } public boolean isLiveUploadEnabled() { // FIXME: Disabling live upload as it often causes the app to freeze on // disconnect. // return // prefs.getBoolean(PREF_LIVE_UPLOAD_ENABLED, DEFAULT_LIVE_UPLOAD_ENABLED); return false; } /** * Return the last saved app version code * @return */ public int getSavedAppVersionCode(){ return prefs.getInt(PREF_APP_VERSION_CODE, 0); } /** * Update the saved app version code. * @param context Application context */ public void updateSavedAppVersionCode(Context context) { int versionCode = Utils.getAppVersionCode(context); if (versionCode != Utils.INVALID_APP_VERSION_CODE) { prefs.edit().putInt(PREF_APP_VERSION_CODE, versionCode).apply(); } } public void setPrefWeatherInfo(String weatherInfo) { prefs.edit().putString(PREF_WEATHER_INFO, weatherInfo).apply(); } public String getPrefWeatherInfo() { return prefs.getString(PREF_WEATHER_INFO, ""); } public String getDroneshareLogin() { return prefs.getString(PREF_DSHARE_USERNAME, DEFAULT_DSHARE_USERNAME).trim(); } public void setDroneshareLogin(String b) { prefs.edit().putString(PREF_DSHARE_USERNAME, b.trim()).apply(); } public String getDroneshareEmail() { return prefs.getString("dshare_email", "").trim(); } public void setDroneshareEmail(String b) { prefs.edit().putString("dshare_email", b.trim()).apply(); } public String getDronesharePassword() { return prefs.getString(PREF_DSHARE_PASSWORD, DEFAULT_DSHARE_PASSWORD).trim(); } public void setDronesharePassword(String b) { prefs.edit().putString(PREF_DSHARE_PASSWORD, b.trim()).apply(); } public boolean isDroneshareEnabled() { return !TextUtils.isEmpty(getDroneshareLogin()) && !TextUtils.isEmpty(getDronesharePassword()); } public String getDroneshareApiKey() { return "2d38fb2e.72afe7b3761d5ee6346c178fdd6b680f"; } /** * How many times has this application been started? (will increment for * each call) */ public int getNumberOfRuns() { int r = prefs.getInt("num_runs", 0) + 1; prefs.edit().putInt("num_runs", r).apply(); return r; } /** * @return true if google analytics reporting is enabled. */ public boolean isUsageStatisticsEnabled() { return prefs.getBoolean(PREF_USAGE_STATISTICS, DEFAULT_USAGE_STATISTICS); } public void setConnectionParameterType(@ConnectionType.Type int connectionType) { prefs.edit().putString(PREF_CONNECTION_TYPE, String.valueOf(connectionType)).apply(); lbm.sendBroadcast(new Intent(PREF_CONNECTION_TYPE)); } /** * @return the selected mavlink connection type. */ public @ConnectionType.Type int getConnectionParameterType() { @ConnectionType.Type int connectionType = Integer.parseInt(prefs.getString(PREF_CONNECTION_TYPE, DEFAULT_CONNECTION_TYPE).trim()); return connectionType; } public int getUnitSystemType() { String unitSystem = prefs.getString(PREF_UNIT_SYSTEM, null); if (unitSystem == null) return DEFAULT_UNIT_SYSTEM; return Integer.parseInt(unitSystem.trim()); } public void setUsbBaudRate(int baudRate) { prefs.edit().putString(PREF_USB_BAUD_RATE, String.valueOf(baudRate)).apply(); } public int getUsbBaudRate() { return Integer.parseInt(prefs.getString(PREF_USB_BAUD_RATE, DEFAULT_USB_BAUD_RATE).trim()); } public void setTcpServerIp(String serverIp) { prefs.edit().putString(PREF_TCP_SERVER_IP, serverIp).apply(); } public String getTcpServerIp() { return prefs.getString(PREF_TCP_SERVER_IP, DEFAULT_TCP_SERVER_IP); } public void setTcpServerPort(int serverPort) { prefs.edit().putString(PREF_TCP_SERVER_PORT, String.valueOf(serverPort)).apply(); } public int getTcpServerPort() { return Integer.parseInt(prefs.getString(PREF_TCP_SERVER_PORT, DEFAULT_TCP_SERVER_PORT).trim()); } public void setUdpServerPort(int serverPort) { prefs.edit().putString(PREF_UDP_SERVER_PORT, String.valueOf(serverPort)).apply(); } public int getUdpServerPort() { return Integer.parseInt(prefs.getString(PREF_UDP_SERVER_PORT, DEFAULT_UDP_SERVER_PORT).trim()); } public boolean isUdpPingEnabled() { return prefs.getBoolean(PREF_ENABLE_UDP_PING, DEFAULT_ENABLE_UDP_PING); } public String getUdpPingReceiverIp() { return prefs.getString(PREF_UDP_PING_RECEIVER_IP, null); } public int getUdpPingReceiverPort() { return Integer.parseInt(prefs.getString(PREF_UDP_PING_RECEIVER_PORT, DEFAULT_UDP_SERVER_PORT).trim()); } public String getBluetoothDeviceName() { return prefs.getString(PREF_BT_DEVICE_NAME, null); } public void setBluetoothDeviceName(String deviceName) { prefs.edit().putString(PREF_BT_DEVICE_NAME, deviceName).apply(); } public String getBluetoothDeviceAddress() { return prefs.getString(PREF_BT_DEVICE_ADDRESS, null); } public void setBluetoothDeviceAddress(String newAddress) { final SharedPreferences.Editor editor = prefs.edit(); editor.putString(PREF_BT_DEVICE_ADDRESS, newAddress) .apply(); lbm.sendBroadcast(new Intent(PREF_BT_DEVICE_ADDRESS)); } /** * @return true if the device screen should stay on. */ public boolean keepScreenOn() { return prefs.getBoolean(PREF_KEEP_SCREEN_ON, DEFAULT_KEEP_SCREEN_ON); } /** * @return true if zoom to fit is enable */ public boolean isZoomToFitEnable(){ return prefs.getBoolean(PREF_ENABLE_ZOOM_TO_FIT, DEFAULT_ENABLE_ZOOM_TO_FIT); } /** * @return the target for the map auto panning. */ public AutoPanMode getAutoPanMode() { final String defaultAutoPanModeName = DEFAULT_AUTO_PAN_MODE.name(); final String autoPanTypeString = prefs.getString(AutoPanMode.PREF_KEY, defaultAutoPanModeName); try { return AutoPanMode.valueOf(autoPanTypeString); } catch (IllegalArgumentException e) { return DEFAULT_AUTO_PAN_MODE; } } /** * Updates the map auto panning target. * * @param target */ public void setAutoPanMode(AutoPanMode target) { prefs.edit().putString(AutoPanMode.PREF_KEY, target.name()).apply(); } /** * Use HDOP instead of satellite count on infobar */ public boolean shouldGpsHdopBeDisplayed() { return prefs.getBoolean(PREF_SHOW_GPS_HDOP, DEFAULT_SHOW_GPS_HDOP); } public boolean isEnglishDefaultLanguage() { return prefs.getBoolean(PREF_UI_LANGUAGE, DEFAULT_PREF_UI_LANGUAGE); } public boolean isRealtimeFootprintsEnabled() { return prefs.getBoolean(PREF_UI_REALTIME_FOOTPRINTS, DEFAULT_UI_REALTIME_FOOTPRINTS); } public String getMapProviderName() { return prefs.getString(PREF_MAPS_PROVIDERS, DEFAULT_MAPS_PROVIDER); } /** * Returns the map provider selected by the user. * * @return selected map provider */ public DPMapProvider getMapProvider() { final String mapProviderName = getMapProviderName(); return mapProviderName == null ? DPMapProvider.DEFAULT_MAP_PROVIDER : DPMapProvider.getMapProvider (mapProviderName); } public Map<String, Boolean> getPeriodicSpeechPrefs() { final Map<String, Boolean> speechPrefs = new HashMap<>(); speechPrefs.put(PREF_TTS_PERIODIC_BAT_VOLT, prefs.getBoolean(PREF_TTS_PERIODIC_BAT_VOLT, DEFAULT_TTS_PERIODIC_BAT_VOLT)); speechPrefs.put(PREF_TTS_PERIODIC_ALT, prefs.getBoolean(PREF_TTS_PERIODIC_ALT, DEFAULT_TTS_PERIODIC_ALT)); speechPrefs.put(PREF_TTS_PERIODIC_AIRSPEED, prefs.getBoolean(PREF_TTS_PERIODIC_AIRSPEED, DEFAULT_TTS_PERIODIC_AIRSPEED)); speechPrefs.put(PREF_TTS_PERIODIC_RSSI, prefs.getBoolean(PREF_TTS_PERIODIC_RSSI, DEFAULT_TTS_PERIODIC_RRSI)); return speechPrefs; } public int getSpokenStatusInterval() { return Integer.parseInt(prefs.getString(PREF_SPEECH_PERIOD, DEFAULT_SPEECH_PERIOD).trim()); } public boolean hasExceededMaxAltitude(double currentAltInMeters) { final boolean isWarningEnabled = prefs.getBoolean(PREF_MAX_ALT_WARNING, DEFAULT_MAX_ALT_WARNING); if (!isWarningEnabled) return false; final double maxAltitude = getMaxAltitude(); return currentAltInMeters > maxAltitude; } public boolean getWarningOnLostOrRestoredSignal() { return prefs.getBoolean(PREF_TTS_LOST_SIGNAL, DEFAULT_TTS_WARNING_LOST_SIGNAL); } public boolean getWarningOnLowSignalStrength() { return prefs.getBoolean(PREF_TTS_LOW_SIGNAL, DEFAULT_TTS_WARNING_LOW_SIGNAL); } public boolean getWarningOnAutopilotWarning() { return prefs.getBoolean(PREF_TTS_AUTOPILOT_WARNING, DEFAULT_TTS_WARNING_AUTOPILOT_WARNING); } public boolean getImminentGroundCollisionWarning() { return prefs.getBoolean(PREF_WARNING_GROUND_COLLISION, DEFAULT_WARNING_GROUND_COLLISION); } public boolean isMapRotationEnabled() { return prefs.getBoolean(PREF_ENABLE_MAP_ROTATION, DEFAULT_ENABLE_MAP_ROTATION); } public boolean isKillSwitchEnabled() { return prefs.getBoolean(PREF_ENABLE_KILL_SWITCH, DEFAULT_ENABLE_KILL_SWITCH); } /** * @return the max altitude in meters */ public double getMaxAltitude() { return getAltitudePreference(PREF_ALT_MAX_VALUE, DEFAULT_MAX_ALT); } /** * @return the min altitude in meters */ public double getMinAltitude() { return getAltitudePreference(PREF_ALT_MIN_VALUE, DEFAULT_MIN_ALT); } /** * @return the default starting altitude in meters */ public double getDefaultAltitude() { return getAltitudePreference(PREF_ALT_DEFAULT_VALUE, DEFAULT_ALT); } public void setAltitudePreference(String prefKey, double altitude) { prefs.edit().putString(prefKey, String.valueOf(altitude)).apply(); } private double getAltitudePreference(String prefKey, double defaultValue) { final String maxAltValue = prefs.getString(prefKey, null); if (TextUtils.isEmpty(maxAltValue)) return defaultValue; try { final double maxAlt = Double.parseDouble(maxAltValue.trim()); return maxAlt; } catch (Exception e) { return defaultValue; } } public boolean isTtsEnabled() { return prefs.getBoolean(PREF_IS_TTS_ENABLED, DEFAULT_TTS_ENABLED); } public void enableWidget(TowerWidgets widget, boolean enable){ prefs.edit().putBoolean(widget.getPrefKey(), enable).apply(); } public boolean isWidgetVisible(TowerWidgets widget) { return prefs.getBoolean(widget.getPrefKey(), widget.isVisibleByDefault()); } public boolean isReturnToMeEnabled() { return prefs.getBoolean(PREF_RETURN_TO_ME, DEFAULT_RETURN_TO_ME); } public void enableReturnToMe(boolean isEnabled) { prefs.edit().putBoolean(PREF_RETURN_TO_ME, isEnabled).apply(); lbm.sendBroadcast(new Intent(ACTION_PREF_RETURN_TO_ME_UPDATED).putExtra(PREF_RETURN_TO_ME, isEnabled)); } public boolean getWarningOnVehicleHomeUpdate(){ return prefs.getBoolean(PREF_VEHICLE_HOME_UPDATE_WARNING, DEFAULT_VEHICLE_HOME_UPDATE_WARNING); } public void setVideoWidgetType(@WidgetVideoPreferences.VideoType int videoType){ prefs.edit().putInt(PREF_WIDGET_VIDEO_TYPE, videoType).apply(); } @WidgetVideoPreferences.VideoType public int getVideoWidgetType(){ @WidgetVideoPreferences.VideoType final int videoType = prefs.getInt(PREF_WIDGET_VIDEO_TYPE, WidgetVideoPreferences.SOLO_VIDEO_TYPE); return videoType; } public void setCustomVideoUdpPort(int udpPort){ prefs.edit().putInt(PREF_CUSTOM_VIDEO_UDP_PORT, udpPort).apply(); } public int getCustomVideoUdpPort(){ return prefs.getInt(PREF_CUSTOM_VIDEO_UDP_PORT, -1); } public void setUVCVideoAspectRatio(Float aspectRatio){ prefs.edit().putFloat(PREF_UVC_VIDEO_ASPECT_RATIO, aspectRatio).apply(); } public Float getUVCVideoAspectRatio(){ return prefs.getFloat(PREF_UVC_VIDEO_ASPECT_RATIO, DEFAULT_UVC_VIDEO_ASPECT_RATIO); } public void persistSurveyPreferences(Survey survey){ if(survey == null || survey.getSurveyDetail() == null) return; SurveyDetail surveyDetail = survey.getSurveyDetail(); SharedPreferences.Editor editor = prefs.edit(); // Persist the camera. editor.putString(PREF_SURVEY_CAMERA_NAME, surveyDetail.getCameraDetail().getName()); // Persist the survey angle. editor.putFloat(PREF_SURVEY_ANGLE, (float) surveyDetail.getAngle()); // Persist the altitude. editor.putFloat(PREF_SURVEY_ALTITUDE, (float) surveyDetail.getAltitude()); // Persist the overlap. editor.putFloat(PREF_SURVEY_OVERLAP, (float) surveyDetail.getOverlap()); // Persist the sidelap. editor.putFloat(PREF_SURVEY_SIDELAP, (float) surveyDetail.getSidelap()); // Persist the check for starting the camera before the first waypoint. editor.putBoolean(PREF_SURVEY_START_CAMERA_BEFORE_FIRST_WAYPOINT, survey.isStartCameraBeforeFirstWaypoint()); // Persist the check for locking the copter orientation. editor.putBoolean(PREF_SURVEY_LOCK_ORIENTATION, surveyDetail.getLockOrientation()); editor.apply(); } public void loadSurveyPreferences(Drone drone, Survey loadTarget) { if(drone == null || loadTarget == null) return; // Load the check for starting the camera before the first waypoint. loadTarget.setStartCameraBeforeFirstWaypoint(prefs.getBoolean(PREF_SURVEY_START_CAMERA_BEFORE_FIRST_WAYPOINT, false)); SurveyDetail surveyDetail = loadTarget.getSurveyDetail(); if(surveyDetail == null){ surveyDetail = new SurveyDetail(); loadTarget.setSurveyDetail(surveyDetail); } // Load the check for locking the copter orientation. surveyDetail.setLockOrientation(prefs.getBoolean(PREF_SURVEY_LOCK_ORIENTATION, false)); // Load the sidelap. surveyDetail.setSidelap(prefs.getFloat(PREF_SURVEY_SIDELAP, 60)); // Load the overlap. surveyDetail.setOverlap(prefs.getFloat(PREF_SURVEY_OVERLAP, 50)); // Load the altitude. surveyDetail.setAltitude(prefs.getFloat(PREF_SURVEY_ALTITUDE, 50)); // Load the survey angle. surveyDetail.setAngle(prefs.getFloat(PREF_SURVEY_ANGLE, 0)); // Load the camera name String cameraName = prefs.getString(PREF_SURVEY_CAMERA_NAME, null); if(!TextUtils.isEmpty(cameraName)){ CameraProxy camera = drone.getAttribute(AttributeType.CAMERA); if(camera != null) { // Load the available cameras List<CameraDetail> cameraDetails = camera.getAvailableCameraInfos(); if(!cameraDetails.isEmpty()){ for(CameraDetail cameraDetail : cameraDetails) { if (cameraName.equalsIgnoreCase(cameraDetail.getName())){ surveyDetail.setCameraDetail(cameraDetail); break; } } } } } } public void saveVehicleHistorySessionId(long sessionId) { prefs.edit().putLong(PREF_VEHICLE_HISTORY_SESSION_ID, sessionId).apply(); } public long getVehicleHistorySessionId(){ return prefs.getLong(PREF_VEHICLE_HISTORY_SESSION_ID, TLogActivity.INVALID_SESSION_ID); } /** * @return Vehicle default speed in meters per second. */ public double getVehicleDefaultSpeed() { return prefs.getFloat(PREF_VEHICLE_DEFAULT_SPEED, DEFAULT_SPEED); } public void setVehicleDefaultSpeed(float speedInMetersPerSecond) { prefs.edit().putFloat(PREF_VEHICLE_DEFAULT_SPEED, speedInMetersPerSecond).apply(); lbm.sendBroadcast(new Intent(PREF_VEHICLE_DEFAULT_SPEED)); } /** default follow mode * @return FollowType */ public FollowType getLastKnownFollowType() { String followTypeString = prefs.getString(PREF_LAST_KNOWN_FOLLOW_MODE, DEFAULT_FOLLOW_TYPE.name()); FollowType followType = FollowType.valueOf(followTypeString); return (followType != null) ? followType : DEFAULT_FOLLOW_TYPE; } public void setLastKnownFollowType(FollowType followType) { String followTypeString = followType.name(); prefs.edit().putString(PREF_LAST_KNOWN_FOLLOW_MODE, followTypeString).apply(); } }