Skip to content

Commit 39a3828

Browse files
committed
Support location random offset
1 parent 7d543ee commit 39a3828

File tree

4 files changed

+89
-73
lines changed

4 files changed

+89
-73
lines changed

app/src/main/java/com/zcshou/gogogo/FragmentSettings.java

Lines changed: 31 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.os.Bundle;
44
import android.text.InputType;
5-
import android.text.Selection;
65

76
import androidx.preference.EditTextPreference;
87
import androidx.preference.ListPreference;
@@ -17,6 +16,25 @@
1716

1817
public class FragmentSettings extends PreferenceFragmentCompat {
1918

19+
// Set a non-empty decimal EditTextPreference
20+
private void setupDecimalEditTextPreference(EditTextPreference preference) {
21+
if (preference != null) {
22+
preference.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) pref ->
23+
getResources().getString(R.string.setting_current_value) + pref.getText());
24+
preference.setOnBindEditTextListener(editText -> {
25+
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
26+
editText.setSelection(editText.length());
27+
});
28+
preference.setOnPreferenceChangeListener((pref, newValue) -> {
29+
if (newValue.toString().trim().isEmpty()) {
30+
GoUtils.DisplayToast(this.getContext(), getResources().getString(R.string.app_error_input_null));
31+
return false;
32+
}
33+
return true;
34+
});
35+
}
36+
}
37+
2038
@Override
2139
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
2240
// Load the preferences from an XML resource
@@ -38,68 +56,16 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
3856
}
3957

4058
EditTextPreference pfWalk = findPreference("setting_walk");
41-
if (pfWalk != null) {
42-
// 使用自定义 SummaryProvider
43-
pfWalk.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
44-
pfWalk.setOnBindEditTextListener(editText -> {
45-
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
46-
Selection.setSelection(editText.getText(), editText.length());
47-
});
48-
pfWalk.setOnPreferenceChangeListener((preference, newValue) -> {
49-
if (newValue.toString().trim().length() == 0) {
50-
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
51-
return false;
52-
}
53-
return true;
54-
});
55-
}
59+
setupDecimalEditTextPreference(pfWalk);
5660

5761
EditTextPreference pfRun = findPreference("setting_run");
58-
if (pfRun != null) {
59-
pfRun.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
60-
pfRun.setOnBindEditTextListener(editText -> {
61-
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
62-
Selection.setSelection(editText.getText(), editText.length());
63-
});
64-
pfRun.setOnPreferenceChangeListener((preference, newValue) -> {
65-
if (newValue.toString().trim().length() == 0) {
66-
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
67-
return false;
68-
}
69-
return true;
70-
});
71-
}
62+
setupDecimalEditTextPreference(pfRun);
63+
7264
EditTextPreference pfBike = findPreference("setting_bike");
73-
if (pfBike != null) {
74-
pfBike.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
75-
pfBike.setOnBindEditTextListener(editText -> {
76-
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
77-
Selection.setSelection(editText.getText(), editText.length());
78-
});
79-
pfBike.setOnPreferenceChangeListener((preference, newValue) -> {
80-
if (newValue.toString().trim().length() == 0) {
81-
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
82-
return false;
83-
}
84-
return true;
85-
});
86-
}
65+
setupDecimalEditTextPreference(pfBike);
8766

8867
EditTextPreference pfAltitude = findPreference("setting_altitude");
89-
if (pfAltitude != null) {
90-
pfAltitude.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
91-
pfAltitude.setOnBindEditTextListener(editText -> {
92-
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
93-
Selection.setSelection(editText.getText(), editText.length());
94-
});
95-
pfAltitude.setOnPreferenceChangeListener((preference, newValue) -> {
96-
if (newValue.toString().trim().length() == 0) {
97-
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
98-
return false;
99-
}
100-
return true;
101-
});
102-
}
68+
setupDecimalEditTextPreference(pfAltitude);
10369

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

12288
EditTextPreference pfPosHisValid = findPreference("setting_pos_history");
123-
if (pfPosHisValid != null) {
124-
// 使用自定义 SummaryProvider
125-
pfPosHisValid.setSummaryProvider((Preference.SummaryProvider<EditTextPreference>) preference -> getResources().getString(R.string.setting_current_value) + preference.getText());
126-
pfPosHisValid.setOnBindEditTextListener(editText -> {
127-
editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType.TYPE_CLASS_NUMBER);
128-
Selection.setSelection(editText.getText(), editText.length());
129-
});
130-
pfPosHisValid.setOnPreferenceChangeListener((preference, newValue) -> {
131-
if (newValue.toString().trim().length() == 0) {
132-
GoUtils.DisplayToast(this.getContext(),getResources().getString(R.string.app_error_input_null));
133-
return false;
134-
}
135-
return true;
136-
});
137-
}
89+
setupDecimalEditTextPreference(pfPosHisValid);
90+
91+
EditTextPreference pfLatOffset = findPreference("setting_lat_max_offset");
92+
setupDecimalEditTextPreference(pfLatOffset);
93+
94+
EditTextPreference pfLonOffset = findPreference("setting_lon_max_offset");
95+
setupDecimalEditTextPreference(pfLonOffset);
13896
}
13997
}

app/src/main/java/com/zcshou/gogogo/HistoryActivity.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import java.math.RoundingMode;
2929
import java.util.ArrayList;
3030
import java.util.HashMap;
31+
import java.util.Objects;
32+
import java.util.Locale;
3133
import java.util.List;
3234
import java.util.Map;
3335

@@ -293,6 +295,25 @@ private void showInputDialog(String locID, String name) {
293295
builder.show();
294296
}
295297

298+
private String[] randomOffset(String longitude, String latitude) {
299+
String max_offset_default = getResources().getString(R.string.setting_random_offset_default);
300+
double lon_max_offset = Double.parseDouble(Objects.requireNonNull(sharedPreferences.getString("setting_lon_max_offset", max_offset_default)));
301+
double lat_max_offset = Double.parseDouble(Objects.requireNonNull(sharedPreferences.getString("setting_lat_max_offset", max_offset_default)));
302+
double lon = Double.parseDouble(longitude);
303+
double lat = Double.parseDouble(latitude);
304+
305+
double randomLonOffset = (Math.random() * 2 - 1) * lon_max_offset; // Longitude offset (meters)
306+
double randomLatOffset = (Math.random() * 2 - 1) * lat_max_offset; // Latitude offset (meters)
307+
308+
lon += randomLonOffset / 111320; // (meters -> longitude)
309+
lat += randomLatOffset / 110574; // (meters -> latitude)
310+
311+
String offsetMessage = String.format(Locale.US, "经度偏移: %.2f米\n纬度偏移: %.2f米", randomLonOffset, randomLatOffset);
312+
GoUtils.DisplayToast(this, offsetMessage);
313+
314+
return new String[]{String.valueOf(lon), String.valueOf(lat)};
315+
}
316+
296317
private void initRecordListView() {
297318
noRecordText = findViewById(R.id.record_no_textview);
298319
mSearchLayout = findViewById(R.id.search_linear);
@@ -308,6 +329,13 @@ private void initRecordListView() {
308329
bd09Longitude = latLngStr[0].substring(latLngStr[0].indexOf(':') + 1);
309330
bd09Latitude = latLngStr[1].substring(latLngStr[1].indexOf(':') + 1);
310331

332+
// Random offset
333+
if(sharedPreferences.getBoolean("setting_random_offset", false)) {
334+
String[] offsetResult = randomOffset(bd09Longitude, bd09Latitude);
335+
bd09Longitude = offsetResult[0];
336+
bd09Latitude = offsetResult[1];
337+
}
338+
311339
if (!MainActivity.showLocation(name, bd09Longitude, bd09Latitude)) {
312340
GoUtils.DisplayToast(this, getResources().getString(R.string.history_error_location));
313341
}

app/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@
6565
<string name="setting_bike_default">10.0</string>
6666
<string name="setting_altitude">海拔高度(米)</string>
6767
<string name="setting_altitude_default">55.0</string>
68+
<string name="setting_location">位置</string>
69+
<string name="setting_random_offset">随机偏移</string>
70+
<string name="setting_random_offset_summary">仅在使用历史位置时生效</string>
71+
<string name="setting_random_offset_default">10.0</string>
72+
<string name="setting_lat_max_offset">经度最大偏移距离(米)</string>
73+
<string name="setting_lon_max_offset">纬度最大偏移距离(米)</string>
6874
<string name="setting_group_log">记录</string>
6975
<string name="setting_log_off">关闭日志</string>
7076
<string name="setting_pos_history">历史记录有效期(天)</string>

app/src/main/res/xml/preferences_main.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,30 @@
4444

4545
</PreferenceCategory>
4646

47+
<PreferenceCategory
48+
app:title="@string/setting_location"
49+
app:iconSpaceReserved="false">
50+
51+
<SwitchPreferenceCompat
52+
app:key="setting_random_offset"
53+
app:title="@string/setting_random_offset"
54+
app:summary="@string/setting_random_offset_summary"
55+
app:defaultValue="false"
56+
app:iconSpaceReserved="false"/>
57+
<EditTextPreference
58+
app:key="setting_lat_max_offset"
59+
app:title="@string/setting_lat_max_offset"
60+
app:defaultValue="@string/setting_random_offset_default"
61+
app:summary="@string/setting_random_offset_default"
62+
app:iconSpaceReserved="false"/>
63+
<EditTextPreference
64+
app:key="setting_lon_max_offset"
65+
app:title="@string/setting_lon_max_offset"
66+
app:defaultValue="@string/setting_random_offset_default"
67+
app:summary="@string/setting_random_offset_default"
68+
app:iconSpaceReserved="false"/>
69+
</PreferenceCategory>
70+
4771
<PreferenceCategory
4872
app:title="@string/setting_group_log"
4973
app:iconSpaceReserved="false">

0 commit comments

Comments
 (0)