Skip to content

Commit

Permalink
Support location random offset
Browse files Browse the repository at this point in the history
  • Loading branch information
ZnDong committed Sep 21, 2024
1 parent 7d543ee commit 39a3828
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 73 deletions.
104 changes: 31 additions & 73 deletions app/src/main/java/com/zcshou/gogogo/FragmentSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import android.os.Bundle;
import android.text.InputType;
import android.text.Selection;

import androidx.preference.EditTextPreference;
import androidx.preference.ListPreference;
Expand All @@ -17,6 +16,25 @@

public class FragmentSettings extends PreferenceFragmentCompat {

// Set a non-empty decimal EditTextPreference
private void setupDecimalEditTextPreference(EditTextPreference preference) {
if (preference != null) {
preference.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) pref ->
getResources().getString(R.string.setting_current_value) + pref.getText());
preference.setOnBindEditTextListener(editText -> {
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
editText.setSelection(editText.length());
});
preference.setOnPreferenceChangeListener((pref, newValue) -> {
if (newValue.toString().trim().isEmpty()) {
GoUtils.DisplayToast(this.getContext(), getResources().getString(R.string.app_error_input_null));
return false;
}
return true;
});
}
}

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
// Load the preferences from an XML resource
Expand All @@ -38,68 +56,16 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
}

EditTextPreference pfWalk = findPreference("setting_walk");
if (pfWalk != null) {
// 使用自定义 SummaryProvider
pfWalk.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
pfWalk.setOnBindEditTextListener(editText -> {
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
Selection.setSelection(editText.getText(), editText.length());
});
pfWalk.setOnPreferenceChangeListener((preference, newValue) -> {
if (newValue.toString().trim().length() == 0) {
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
return false;
}
return true;
});
}
setupDecimalEditTextPreference(pfWalk);

EditTextPreference pfRun = findPreference("setting_run");
if (pfRun != null) {
pfRun.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
pfRun.setOnBindEditTextListener(editText -> {
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
Selection.setSelection(editText.getText(), editText.length());
});
pfRun.setOnPreferenceChangeListener((preference, newValue) -> {
if (newValue.toString().trim().length() == 0) {
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
return false;
}
return true;
});
}
setupDecimalEditTextPreference(pfRun);

EditTextPreference pfBike = findPreference("setting_bike");
if (pfBike != null) {
pfBike.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
pfBike.setOnBindEditTextListener(editText -> {
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
Selection.setSelection(editText.getText(), editText.length());
});
pfBike.setOnPreferenceChangeListener((preference, newValue) -> {
if (newValue.toString().trim().length() == 0) {
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
return false;
}
return true;
});
}
setupDecimalEditTextPreference(pfBike);

EditTextPreference pfAltitude = findPreference("setting_altitude");
if (pfAltitude != null) {
pfAltitude.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
pfAltitude.setOnBindEditTextListener(editText -> {
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
Selection.setSelection(editText.getText(), editText.length());
});
pfAltitude.setOnPreferenceChangeListener((preference, newValue) -> {
if (newValue.toString().trim().length() == 0) {
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
return false;
}
return true;
});
}
setupDecimalEditTextPreference(pfAltitude);

SwitchPreferenceCompat pLog = findPreference("setting_log_off");
if (pLog != null) {
Expand All @@ -120,20 +86,12 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
}

EditTextPreference pfPosHisValid = findPreference("setting_pos_history");
if (pfPosHisValid != null) {
// 使用自定义 SummaryProvider
pfPosHisValid.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
pfPosHisValid.setOnBindEditTextListener(editText -> {
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
Selection.setSelection(editText.getText(), editText.length());
});
pfPosHisValid.setOnPreferenceChangeListener((preference, newValue) -> {
if (newValue.toString().trim().length() == 0) {
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
return false;
}
return true;
});
}
setupDecimalEditTextPreference(pfPosHisValid);

EditTextPreference pfLatOffset = findPreference("setting_lat_max_offset");
setupDecimalEditTextPreference(pfLatOffset);

EditTextPreference pfLonOffset = findPreference("setting_lon_max_offset");
setupDecimalEditTextPreference(pfLonOffset);
}
}
28 changes: 28 additions & 0 deletions app/src/main/java/com/zcshou/gogogo/HistoryActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Objects;
import java.util.Locale;
import java.util.List;
import java.util.Map;

Expand Down Expand Up @@ -293,6 +295,25 @@ private void showInputDialog(String locID, String name) {
builder.show();
}

private String[] randomOffset(String longitude, String latitude) {
String max_offset_default = getResources().getString(R.string.setting_random_offset_default);
double lon_max_offset = Double.parseDouble(Objects.requireNonNull(sharedPreferences.getString("setting_lon_max_offset", max_offset_default)));
double lat_max_offset = Double.parseDouble(Objects.requireNonNull(sharedPreferences.getString("setting_lat_max_offset", max_offset_default)));
double lon = Double.parseDouble(longitude);
double lat = Double.parseDouble(latitude);

double randomLonOffset = (Math.random() * 2 - 1) * lon_max_offset; // Longitude offset (meters)
double randomLatOffset = (Math.random() * 2 - 1) * lat_max_offset; // Latitude offset (meters)

lon += randomLonOffset / 111320; // (meters -> longitude)
lat += randomLatOffset / 110574; // (meters -> latitude)

String offsetMessage = String.format(Locale.US, "经度偏移: %.2f米\n纬度偏移: %.2f米", randomLonOffset, randomLatOffset);
GoUtils.DisplayToast(this, offsetMessage);

return new String[]{String.valueOf(lon), String.valueOf(lat)};
}

private void initRecordListView() {
noRecordText = findViewById(R.id.record_no_textview);
mSearchLayout = findViewById(R.id.search_linear);
Expand All @@ -308,6 +329,13 @@ private void initRecordListView() {
bd09Longitude = latLngStr[0].substring(latLngStr[0].indexOf(':') + 1);
bd09Latitude = latLngStr[1].substring(latLngStr[1].indexOf(':') + 1);

// Random offset
if(sharedPreferences.getBoolean("setting_random_offset", false)) {
String[] offsetResult = randomOffset(bd09Longitude, bd09Latitude);
bd09Longitude = offsetResult[0];
bd09Latitude = offsetResult[1];
}

if (!MainActivity.showLocation(name, bd09Longitude, bd09Latitude)) {
GoUtils.DisplayToast(this, getResources().getString(R.string.history_error_location));
}
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@
<string name="setting_bike_default">10.0</string>
<string name="setting_altitude">海拔高度(米)</string>
<string name="setting_altitude_default">55.0</string>
<string name="setting_location">位置</string>
<string name="setting_random_offset">随机偏移</string>
<string name="setting_random_offset_summary">仅在使用历史位置时生效</string>
<string name="setting_random_offset_default">10.0</string>
<string name="setting_lat_max_offset">经度最大偏移距离(米)</string>
<string name="setting_lon_max_offset">纬度最大偏移距离(米)</string>
<string name="setting_group_log">记录</string>
<string name="setting_log_off">关闭日志</string>
<string name="setting_pos_history">历史记录有效期(天)</string>
Expand Down
24 changes: 24 additions & 0 deletions app/src/main/res/xml/preferences_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,30 @@

</PreferenceCategory>

<PreferenceCategory
app:title="@string/setting_location"
app:iconSpaceReserved="false">

<SwitchPreferenceCompat
app:key="setting_random_offset"
app:title="@string/setting_random_offset"
app:summary="@string/setting_random_offset_summary"
app:defaultValue="false"
app:iconSpaceReserved="false"/>
<EditTextPreference
app:key="setting_lat_max_offset"
app:title="@string/setting_lat_max_offset"
app:defaultValue="@string/setting_random_offset_default"
app:summary="@string/setting_random_offset_default"
app:iconSpaceReserved="false"/>
<EditTextPreference
app:key="setting_lon_max_offset"
app:title="@string/setting_lon_max_offset"
app:defaultValue="@string/setting_random_offset_default"
app:summary="@string/setting_random_offset_default"
app:iconSpaceReserved="false"/>
</PreferenceCategory>

<PreferenceCategory
app:title="@string/setting_group_log"
app:iconSpaceReserved="false">
Expand Down

0 comments on commit 39a3828

Please sign in to comment.