Skip to content

Commit c1a7766

Browse files
authored
Merge pull request #162 from ZnDong/master
Support location random offset and long press to modify the history record name
2 parents 4263144 + 39a3828 commit c1a7766

File tree

5 files changed

+158
-89
lines changed

5 files changed

+158
-89
lines changed

app/src/main/java/com/zcshou/database/DataBaseHistoryLocation.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,15 @@ public static void saveHistoryLocation(SQLiteDatabase sqLiteDatabase, ContentVal
5555
XLog.e("DATABASE: insert error");
5656
}
5757
}
58+
59+
// 修改历史记录名称
60+
public static void updateHistoryLocation(SQLiteDatabase sqLiteDatabase, String locID, String location) {
61+
try{
62+
ContentValues contentValues = new ContentValues();
63+
contentValues.put(DB_COLUMN_LOCATION, location);
64+
sqLiteDatabase.update(TABLE_NAME, contentValues, DB_COLUMN_ID + " = ?", new String[]{locID});
65+
} catch (Exception e){
66+
XLog.e("DATABASE: update error");
67+
}
68+
}
5869
}

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: 86 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import androidx.appcompat.app.AlertDialog;
1010
import androidx.preference.PreferenceManager;
1111

12+
import android.text.InputType;
1213
import android.text.TextUtils;
1314
import android.util.Log;
1415
import android.view.Menu;
@@ -19,11 +20,16 @@
1920
import android.widget.SearchView;
2021
import android.widget.SimpleAdapter;
2122
import android.widget.TextView;
23+
import android.widget.EditText;
24+
import android.widget.PopupMenu;
25+
import android.view.Gravity;
2226

2327
import java.math.BigDecimal;
2428
import java.math.RoundingMode;
2529
import java.util.ArrayList;
2630
import java.util.HashMap;
31+
import java.util.Objects;
32+
import java.util.Locale;
2733
import java.util.List;
2834
import java.util.Map;
2935

@@ -255,6 +261,59 @@ public boolean onQueryTextChange(String newText) {// 当搜索内容改变时触
255261
});
256262
}
257263

264+
private void showDeleteDialog(String locID) {
265+
AlertDialog.Builder builder = new AlertDialog.Builder(this);
266+
builder.setTitle("警告");
267+
builder.setMessage("确定要删除该项历史记录吗?");
268+
builder.setPositiveButton("确定", (dialog, whichButton) -> {
269+
boolean deleteRet = deleteRecord(Integer.parseInt(locID));
270+
if (deleteRet) {
271+
GoUtils.DisplayToast(HistoryActivity.this, getResources().getString(R.string.history_delete_ok));
272+
updateRecordList();
273+
}
274+
});
275+
builder.setNegativeButton("取消", null);
276+
277+
builder.show();
278+
}
279+
280+
private void showInputDialog(String locID, String name) {
281+
final EditText input = new EditText(this);
282+
input.setInputType(InputType.TYPE_CLASS_TEXT);
283+
input.setText(name);
284+
285+
AlertDialog.Builder builder = new AlertDialog.Builder(this);
286+
builder.setTitle("名称");
287+
builder.setView(input);
288+
builder.setPositiveButton("确认", (dialog, whichButton) -> {
289+
String userInput = input.getText().toString();
290+
DataBaseHistoryLocation.updateHistoryLocation(mHistoryLocationDB, locID, userInput);
291+
updateRecordList();
292+
});
293+
builder.setNegativeButton("取消", null);
294+
295+
builder.show();
296+
}
297+
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+
258317
private void initRecordListView() {
259318
noRecordText = findViewById(R.id.record_no_textview);
260319
mSearchLayout = findViewById(R.id.search_linear);
@@ -270,30 +329,41 @@ private void initRecordListView() {
270329
bd09Longitude = latLngStr[0].substring(latLngStr[0].indexOf(':') + 1);
271330
bd09Latitude = latLngStr[1].substring(latLngStr[1].indexOf(':') + 1);
272331

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+
273339
if (!MainActivity.showLocation(name, bd09Longitude, bd09Latitude)) {
274340
GoUtils.DisplayToast(this, getResources().getString(R.string.history_error_location));
275341
}
276342
this.finish();
277343
});
278344

279345
mRecordListView.setOnItemLongClickListener((parent, view, position, id) -> {
280-
new AlertDialog.Builder(HistoryActivity.this)
281-
.setTitle("警告")//这里是表头的内容
282-
.setMessage("确定要删除该项历史记录吗?")//这里是中间显示的具体信息
283-
.setPositiveButton("确定",
284-
(dialog, which) -> {
285-
String locID = (String) ((TextView) view.findViewById(R.id.LocationID)).getText();
286-
boolean deleteRet = deleteRecord(Integer.parseInt(locID));
346+
PopupMenu popupMenu = new PopupMenu(HistoryActivity.this, view);
347+
popupMenu.setGravity(Gravity.END | Gravity.BOTTOM);
348+
popupMenu.getMenu().add("编辑");
349+
popupMenu.getMenu().add("删除");
350+
351+
popupMenu.setOnMenuItemClickListener(item -> {
352+
String locID = ((TextView) view.findViewById(R.id.LocationID)).getText().toString();
353+
String name = ((TextView) view.findViewById(R.id.LocationText)).getText().toString();
354+
switch (item.getTitle().toString()) {
355+
case "编辑":
356+
showInputDialog(locID, name);
357+
return true;
358+
case "删除":
359+
showDeleteDialog(locID);
360+
return true;
361+
default:
362+
return false;
363+
}
364+
});
287365

288-
if (deleteRet) {
289-
GoUtils.DisplayToast(this, getResources().getString(R.string.history_delete_ok));
290-
updateRecordList();
291-
}
292-
})
293-
.setNegativeButton("取消",
294-
(dialog, which) -> {
295-
})
296-
.show();
366+
popupMenu.show();
297367
return true;
298368
});
299369

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)