mirror of
http://gitea.winboll.cc/Studio/WinBoLL.git
synced 2026-06-29 03:59:53 +08:00
OpenCode崩溃现场源码存档
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Thu Jun 04 18:23:05 HKT 2026
|
#Thu Jun 04 19:50:05 HKT 2026
|
||||||
stageCount=27
|
stageCount=27
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.11
|
baseVersion=15.11
|
||||||
publishVersion=15.11.26
|
publishVersion=15.11.26
|
||||||
buildCount=47
|
buildCount=53
|
||||||
baseBetaVersion=15.11.27
|
baseBetaVersion=15.11.27
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
<service android:name=".GpsReceiverChildService3"/>
|
<service android:name=".GpsReceiverChildService3"/>
|
||||||
|
|
||||||
<activity android:name=".AboutActivity"/>
|
<activity android:name=".AboutActivity"/>
|
||||||
|
<activity android:name=".GpsHistoryActivity"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ public class App extends GlobalApplication {
|
|||||||
ToastUtils.init(this);
|
ToastUtils.init(this);
|
||||||
WinBoLLActivityManager.init(this);
|
WinBoLLActivityManager.init(this);
|
||||||
AESThemeUtil.init(null);
|
AESThemeUtil.init(null);
|
||||||
|
GpsHistoryManager.getInstance().init(this);
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
PrintWriter pw = new PrintWriter(sw);
|
PrintWriter pw = new PrintWriter(sw);
|
||||||
|
|||||||
@@ -0,0 +1,151 @@
|
|||||||
|
package cc.winboll.studio.gitsion;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ListView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import cc.winboll.studio.gitsion.db.GpsHistoryDatabaseHelper;
|
||||||
|
import cc.winboll.studio.gitsion.model.GpsHistoryRecord;
|
||||||
|
|
||||||
|
public class GpsHistoryActivity extends Activity {
|
||||||
|
|
||||||
|
private ListView mListView;
|
||||||
|
private TextView mEmptyHint;
|
||||||
|
private TextView mTvSystemCount;
|
||||||
|
private TextView mTvSimCount;
|
||||||
|
private GpsHistoryAdapter mAdapter;
|
||||||
|
private final Runnable mRefreshRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
refreshData();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_gps_history);
|
||||||
|
|
||||||
|
mListView = findViewById(R.id.lv_gps_history);
|
||||||
|
mEmptyHint = findViewById(R.id.tv_empty_hint);
|
||||||
|
mTvSystemCount = findViewById(R.id.tv_system_count);
|
||||||
|
mTvSimCount = findViewById(R.id.tv_sim_count);
|
||||||
|
|
||||||
|
List<GpsHistoryRecord> records = GpsHistoryManager.getInstance().getRecords();
|
||||||
|
mAdapter = new GpsHistoryAdapter(records);
|
||||||
|
mListView.setAdapter(mAdapter);
|
||||||
|
|
||||||
|
updateEmptyHint(records.isEmpty());
|
||||||
|
updateCounts();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
GpsHistoryManager.getInstance().addListener(mRefreshRunnable);
|
||||||
|
refreshData();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
GpsHistoryManager.getInstance().removeListener(mRefreshRunnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshData() {
|
||||||
|
List<GpsHistoryRecord> records = GpsHistoryManager.getInstance().getRecords();
|
||||||
|
mAdapter.setData(records);
|
||||||
|
mAdapter.notifyDataSetChanged();
|
||||||
|
updateEmptyHint(records.isEmpty());
|
||||||
|
updateCounts();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateCounts() {
|
||||||
|
mTvSystemCount.setText(String.valueOf(GpsHistoryManager.getInstance().getSystemCount()));
|
||||||
|
mTvSimCount.setText(String.valueOf(GpsHistoryManager.getInstance().getSimCount()));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateEmptyHint(boolean empty) {
|
||||||
|
mEmptyHint.setVisibility(empty ? View.VISIBLE : View.GONE);
|
||||||
|
mListView.setVisibility(empty ? View.GONE : View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class GpsHistoryAdapter extends BaseAdapter {
|
||||||
|
|
||||||
|
private List<GpsHistoryRecord> mData;
|
||||||
|
private final SimpleDateFormat mTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
|
||||||
|
|
||||||
|
GpsHistoryAdapter(List<GpsHistoryRecord> data) {
|
||||||
|
mData = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setData(List<GpsHistoryRecord> data) {
|
||||||
|
mData = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return mData.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getItem(int position) {
|
||||||
|
return mData.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position) {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View getView(int position, View convertView, ViewGroup parent) {
|
||||||
|
if (convertView == null) {
|
||||||
|
convertView = View.inflate(parent.getContext(), R.layout.list_item_gps_history, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
GpsHistoryRecord item = mData.get(position);
|
||||||
|
|
||||||
|
LinearLayout root = (LinearLayout) convertView.findViewById(R.id.layout_record_root);
|
||||||
|
TextView tvType = (TextView) convertView.findViewById(R.id.tv_record_type);
|
||||||
|
TextView tvTime = (TextView) convertView.findViewById(R.id.tv_record_time);
|
||||||
|
TextView tvCoord = (TextView) convertView.findViewById(R.id.tv_record_coord);
|
||||||
|
|
||||||
|
String timeStr = mTimeFormat.format(new Date(item.getLocationTime()));
|
||||||
|
String coordStr = String.format(Locale.getDefault(),
|
||||||
|
"纬度: %.6f 经度: %.6f SID: %s",
|
||||||
|
item.getLatitude(), item.getLongitude(), item.getSid());
|
||||||
|
|
||||||
|
tvTime.setText(timeStr);
|
||||||
|
tvCoord.setText(coordStr);
|
||||||
|
|
||||||
|
if (item.isSim()) {
|
||||||
|
root.setBackgroundColor(Color.parseColor("#2a3a2a"));
|
||||||
|
tvType.setText("[模拟数据]");
|
||||||
|
tvType.setTextColor(Color.parseColor("#ffb74d"));
|
||||||
|
} else {
|
||||||
|
root.setBackgroundColor(Color.parseColor("#1c1c1c"));
|
||||||
|
tvType.setText("[系统数据]");
|
||||||
|
tvType.setTextColor(Color.parseColor("#4fc3f7"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return convertView;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,150 @@
|
|||||||
|
package cc.winboll.studio.gitsion;
|
||||||
|
|
||||||
|
import android.content.ContentValues;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import cc.winboll.studio.gitsion.db.GpsHistoryDatabaseHelper;
|
||||||
|
import cc.winboll.studio.gitsion.model.GpsHistoryRecord;
|
||||||
|
import cc.winboll.studio.libgitsion.model.GpsSubscribeResult;
|
||||||
|
|
||||||
|
public final class GpsHistoryManager {
|
||||||
|
|
||||||
|
private static final int MAX_RECORDS = 2000;
|
||||||
|
private static final int TRIM_COUNT = 1000;
|
||||||
|
private static final GpsHistoryManager sInstance = new GpsHistoryManager();
|
||||||
|
private final List<Runnable> mListeners = new ArrayList<Runnable>();
|
||||||
|
private GpsHistoryDatabaseHelper mDbHelper;
|
||||||
|
|
||||||
|
private GpsHistoryManager() {}
|
||||||
|
|
||||||
|
public static GpsHistoryManager getInstance() {
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void init(Context context) {
|
||||||
|
mDbHelper = new GpsHistoryDatabaseHelper(context.getApplicationContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addRecord(GpsSubscribeResult result, int type) {
|
||||||
|
if (mDbHelper == null) return;
|
||||||
|
SQLiteDatabase db = mDbHelper.getWritableDatabase();
|
||||||
|
ContentValues cv = new ContentValues();
|
||||||
|
cv.put(GpsHistoryDatabaseHelper.COL_LATITUDE, result.getLatitude());
|
||||||
|
cv.put(GpsHistoryDatabaseHelper.COL_LONGITUDE, result.getLongitude());
|
||||||
|
cv.put(GpsHistoryDatabaseHelper.COL_LOCATION_TIME, result.getLocationTime());
|
||||||
|
cv.put(GpsHistoryDatabaseHelper.COL_RECORD_TIME, System.currentTimeMillis());
|
||||||
|
cv.put(GpsHistoryDatabaseHelper.COL_TYPE, type);
|
||||||
|
cv.put(GpsHistoryDatabaseHelper.COL_SID, result.getSubscribeUniqueId());
|
||||||
|
cv.put(GpsHistoryDatabaseHelper.COL_DESC, result.getResultDesc());
|
||||||
|
db.insert(GpsHistoryDatabaseHelper.TABLE_NAME, null, cv);
|
||||||
|
|
||||||
|
trimIfNeeded(db);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSystemRecord(GpsSubscribeResult result) {
|
||||||
|
addRecord(result, GpsHistoryDatabaseHelper.TYPE_SYSTEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSimRecord(GpsSubscribeResult result) {
|
||||||
|
addRecord(result, GpsHistoryDatabaseHelper.TYPE_SIM);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<GpsHistoryRecord> getRecords() {
|
||||||
|
List<GpsHistoryRecord> list = new ArrayList<GpsHistoryRecord>();
|
||||||
|
if (mDbHelper == null) return list;
|
||||||
|
SQLiteDatabase db = mDbHelper.getReadableDatabase();
|
||||||
|
Cursor c = db.query(GpsHistoryDatabaseHelper.TABLE_NAME, null, null, null,
|
||||||
|
null, null, GpsHistoryDatabaseHelper.COL_ID + " DESC", null);
|
||||||
|
while (c.moveToNext()) {
|
||||||
|
list.add(parseCursor(c));
|
||||||
|
}
|
||||||
|
c.close();
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSystemCount() {
|
||||||
|
return countByType(GpsHistoryDatabaseHelper.TYPE_SYSTEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSimCount() {
|
||||||
|
return countByType(GpsHistoryDatabaseHelper.TYPE_SIM);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear() {
|
||||||
|
if (mDbHelper == null) return;
|
||||||
|
mDbHelper.getWritableDatabase().delete(GpsHistoryDatabaseHelper.TABLE_NAME, null, null);
|
||||||
|
notifyListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addListener(Runnable listener) {
|
||||||
|
synchronized (mListeners) {
|
||||||
|
mListeners.add(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeListener(Runnable listener) {
|
||||||
|
synchronized (mListeners) {
|
||||||
|
mListeners.remove(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void notifyListeners() {
|
||||||
|
synchronized (mListeners) {
|
||||||
|
for (Runnable r : mListeners) {
|
||||||
|
r.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int countByType(int type) {
|
||||||
|
if (mDbHelper == null) return 0;
|
||||||
|
SQLiteDatabase db = mDbHelper.getReadableDatabase();
|
||||||
|
Cursor c = db.rawQuery(
|
||||||
|
"SELECT COUNT(*) FROM " + GpsHistoryDatabaseHelper.TABLE_NAME
|
||||||
|
+ " WHERE " + GpsHistoryDatabaseHelper.COL_TYPE + "=?",
|
||||||
|
new String[]{String.valueOf(type)});
|
||||||
|
int count = 0;
|
||||||
|
if (c.moveToFirst()) {
|
||||||
|
count = c.getInt(0);
|
||||||
|
}
|
||||||
|
c.close();
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void trimIfNeeded(SQLiteDatabase db) {
|
||||||
|
Cursor c = db.rawQuery(
|
||||||
|
"SELECT COUNT(*) FROM " + GpsHistoryDatabaseHelper.TABLE_NAME, null);
|
||||||
|
int total = 0;
|
||||||
|
if (c.moveToFirst()) {
|
||||||
|
total = c.getInt(0);
|
||||||
|
}
|
||||||
|
c.close();
|
||||||
|
if (total > MAX_RECORDS) {
|
||||||
|
db.execSQL("DELETE FROM " + GpsHistoryDatabaseHelper.TABLE_NAME
|
||||||
|
+ " WHERE " + GpsHistoryDatabaseHelper.COL_ID + " IN ("
|
||||||
|
+ " SELECT " + GpsHistoryDatabaseHelper.COL_ID
|
||||||
|
+ " FROM " + GpsHistoryDatabaseHelper.TABLE_NAME
|
||||||
|
+ " ORDER BY " + GpsHistoryDatabaseHelper.COL_ID + " ASC"
|
||||||
|
+ " LIMIT " + TRIM_COUNT + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static GpsHistoryRecord parseCursor(Cursor c) {
|
||||||
|
return new GpsHistoryRecord(
|
||||||
|
c.getLong(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_ID)),
|
||||||
|
c.getDouble(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_LATITUDE)),
|
||||||
|
c.getDouble(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_LONGITUDE)),
|
||||||
|
c.getLong(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_LOCATION_TIME)),
|
||||||
|
c.getLong(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_RECORD_TIME)),
|
||||||
|
c.getInt(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_TYPE)),
|
||||||
|
c.getString(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_SID)),
|
||||||
|
c.getString(c.getColumnIndexOrThrow(GpsHistoryDatabaseHelper.COL_DESC))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -160,6 +160,10 @@ public final class MainActivity extends AppCompatActivity {
|
|||||||
startActivity(new Intent(this, AboutActivity.class));
|
startActivity(new Intent(this, AboutActivity.class));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (item.getItemId() == R.id.action_gps_history) {
|
||||||
|
startActivity(new Intent(this, GpsHistoryActivity.class));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
if (item.getItemId() == R.id.action_app_log) {
|
if (item.getItemId() == R.id.action_app_log) {
|
||||||
LogActivity.startLogActivity(this, false);
|
LogActivity.startLogActivity(this, false);
|
||||||
return true;
|
return true;
|
||||||
@@ -227,6 +231,17 @@ public final class MainActivity extends AppCompatActivity {
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
saveSimGpsData();
|
saveSimGpsData();
|
||||||
|
GpsHistoryManager.getInstance().addSimRecord(new cc.winboll.studio.libgitsion.model.GpsSubscribeResult(
|
||||||
|
"SIM",
|
||||||
|
cc.winboll.studio.libgitsion.model.GpsSubscribeConst.RESULT_SUCCESS,
|
||||||
|
"模拟GPS定位",
|
||||||
|
cc.winboll.studio.libgitsion.model.GpsSubscribeConst.GPS_STATE_LOCATED,
|
||||||
|
0,
|
||||||
|
System.currentTimeMillis(),
|
||||||
|
simLat,
|
||||||
|
simLng,
|
||||||
|
System.currentTimeMillis()
|
||||||
|
));
|
||||||
ToastUtils.show("已设置当前模拟GPS坐标");
|
ToastUtils.show("已设置当前模拟GPS坐标");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -196,6 +196,20 @@ public final class MainService extends Service {
|
|||||||
double currentLng = location.getLongitude();
|
double currentLng = location.getLongitude();
|
||||||
long currentTime = location.getTime();
|
long currentTime = location.getTime();
|
||||||
|
|
||||||
|
//保存每一次系统原始定位数据到历史记录
|
||||||
|
GpsSubscribeResult rawRecord = new GpsSubscribeResult(
|
||||||
|
"",
|
||||||
|
GpsSubscribeConst.RESULT_SUCCESS,
|
||||||
|
"系统GPS定位",
|
||||||
|
GpsSubscribeConst.GPS_STATE_LOCATED,
|
||||||
|
0,
|
||||||
|
System.currentTimeMillis(),
|
||||||
|
currentLat,
|
||||||
|
currentLng,
|
||||||
|
currentTime
|
||||||
|
);
|
||||||
|
GpsHistoryManager.getInstance().addSystemRecord(rawRecord);
|
||||||
|
|
||||||
//遍历全部订阅者进行推送规则判断
|
//遍历全部订阅者进行推送规则判断
|
||||||
Map<String, GpsSubscribeMsg> subscribeAllMap = mSubscribeManager.getSubscribeMap();
|
Map<String, GpsSubscribeMsg> subscribeAllMap = mSubscribeManager.getSubscribeMap();
|
||||||
for (Map.Entry<String, GpsSubscribeMsg> entry : subscribeAllMap.entrySet()) {
|
for (Map.Entry<String, GpsSubscribeMsg> entry : subscribeAllMap.entrySet()) {
|
||||||
@@ -222,6 +236,7 @@ public final class MainService extends Service {
|
|||||||
currentTime
|
currentTime
|
||||||
);
|
);
|
||||||
mSubscribeManager.sendSubscribeResult(result);
|
mSubscribeManager.sendSubscribeResult(result);
|
||||||
|
GpsHistoryManager.getInstance().addSystemRecord(result);
|
||||||
LogUtils.d(TAG, "推送GPS数据至订阅者 SID:" + subscribeSid);
|
LogUtils.d(TAG, "推送GPS数据至订阅者 SID:" + subscribeSid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package cc.winboll.studio.gitsion.db;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
import android.database.sqlite.SQLiteOpenHelper;
|
||||||
|
|
||||||
|
public final class GpsHistoryDatabaseHelper extends SQLiteOpenHelper {
|
||||||
|
|
||||||
|
private static final String DB_NAME = "gps_history.db";
|
||||||
|
private static final int DB_VERSION = 1;
|
||||||
|
|
||||||
|
public static final String TABLE_NAME = "gps_history";
|
||||||
|
public static final String COL_ID = "_id";
|
||||||
|
public static final String COL_LATITUDE = "latitude";
|
||||||
|
public static final String COL_LONGITUDE = "longitude";
|
||||||
|
public static final String COL_LOCATION_TIME = "location_time";
|
||||||
|
public static final String COL_RECORD_TIME = "record_time";
|
||||||
|
public static final String COL_TYPE = "type";
|
||||||
|
public static final String COL_SID = "sid";
|
||||||
|
public static final String COL_DESC = "description";
|
||||||
|
|
||||||
|
public static final int TYPE_SYSTEM = 0;
|
||||||
|
public static final int TYPE_SIM = 1;
|
||||||
|
|
||||||
|
private static final String CREATE_TABLE =
|
||||||
|
"CREATE TABLE " + TABLE_NAME + " ("
|
||||||
|
+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
|
||||||
|
+ COL_LATITUDE + " REAL NOT NULL, "
|
||||||
|
+ COL_LONGITUDE + " REAL NOT NULL, "
|
||||||
|
+ COL_LOCATION_TIME + " INTEGER NOT NULL, "
|
||||||
|
+ COL_RECORD_TIME + " INTEGER NOT NULL, "
|
||||||
|
+ COL_TYPE + " INTEGER NOT NULL DEFAULT " + TYPE_SYSTEM + ", "
|
||||||
|
+ COL_SID + " TEXT, "
|
||||||
|
+ COL_DESC + " TEXT"
|
||||||
|
+ ")";
|
||||||
|
|
||||||
|
public GpsHistoryDatabaseHelper(Context context) {
|
||||||
|
super(context, DB_NAME, null, DB_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(SQLiteDatabase db) {
|
||||||
|
db.execSQL(CREATE_TABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
||||||
|
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
|
||||||
|
onCreate(db);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package cc.winboll.studio.gitsion.model;
|
||||||
|
|
||||||
|
import cc.winboll.studio.gitsion.db.GpsHistoryDatabaseHelper;
|
||||||
|
|
||||||
|
public final class GpsHistoryRecord {
|
||||||
|
|
||||||
|
private final long id;
|
||||||
|
private final double latitude;
|
||||||
|
private final double longitude;
|
||||||
|
private final long locationTime;
|
||||||
|
private final long recordTime;
|
||||||
|
private final int type;
|
||||||
|
private final String sid;
|
||||||
|
private final String description;
|
||||||
|
|
||||||
|
public GpsHistoryRecord(long id, double latitude, double longitude,
|
||||||
|
long locationTime, long recordTime,
|
||||||
|
int type, String sid, String description) {
|
||||||
|
this.id = id;
|
||||||
|
this.latitude = latitude;
|
||||||
|
this.longitude = longitude;
|
||||||
|
this.locationTime = locationTime;
|
||||||
|
this.recordTime = recordTime;
|
||||||
|
this.type = type;
|
||||||
|
this.sid = sid;
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getLatitude() {
|
||||||
|
return latitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getLongitude() {
|
||||||
|
return longitude;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLocationTime() {
|
||||||
|
return locationTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getRecordTime() {
|
||||||
|
return recordTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSim() {
|
||||||
|
return type == GpsHistoryDatabaseHelper.TYPE_SIM;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSid() {
|
||||||
|
return sid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
}
|
||||||
80
gitsion/src/main/res/layout/activity_gps_history.xml
Normal file
80
gitsion/src/main/res/layout/activity_gps_history.xml
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:background="#1c1c1c">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:background="@drawable/border_gray"
|
||||||
|
android:layout_margin="4dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="系统GPS:"
|
||||||
|
android:textColor="#aaaaaa"
|
||||||
|
android:textSize="13sp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_system_count"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="0"
|
||||||
|
android:textColor="#4fc3f7"
|
||||||
|
android:textSize="13sp"
|
||||||
|
android:layout_marginRight="16dp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="模拟GPS:"
|
||||||
|
android:textColor="#aaaaaa"
|
||||||
|
android:textSize="13sp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_sim_count"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="0"
|
||||||
|
android:textColor="#ffb74d"
|
||||||
|
android:textSize="13sp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_empty_hint"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="暂无GPS历史数据"
|
||||||
|
android:textColor="#666666"
|
||||||
|
android:gravity="center"
|
||||||
|
android:padding="24dp"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
<ListView
|
||||||
|
android:id="@+id/lv_gps_history"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
37
gitsion/src/main/res/layout/list_item_gps_history.xml
Normal file
37
gitsion/src/main/res/layout/list_item_gps_history.xml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/layout_record_root"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:background="@drawable/border_gray"
|
||||||
|
android:layout_margin="4dp">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_record_type"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="10sp"
|
||||||
|
android:padding="2dp"
|
||||||
|
android:paddingLeft="4dp"
|
||||||
|
android:paddingRight="4dp"
|
||||||
|
android:layout_marginBottom="2dp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_record_time"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="#aaaaaa"
|
||||||
|
android:textSize="11sp"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_record_coord"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textColor="#888888"
|
||||||
|
android:textSize="12sp"
|
||||||
|
android:layout_marginTop="2dp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
@@ -6,6 +6,11 @@
|
|||||||
android:title="About"
|
android:title="About"
|
||||||
android:icon="@android:drawable/ic_menu_info_details"
|
android:icon="@android:drawable/ic_menu_info_details"
|
||||||
app:showAsAction="ifRoom"/>
|
app:showAsAction="ifRoom"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/action_gps_history"
|
||||||
|
android:title="GPS历史"
|
||||||
|
android:icon="@android:drawable/ic_menu_myplaces"
|
||||||
|
app:showAsAction="ifRoom"/>
|
||||||
<group android:id="@+id/group_debug">
|
<group android:id="@+id/group_debug">
|
||||||
<item
|
<item
|
||||||
android:id="@+id/action_app_log"
|
android:id="@+id/action_app_log"
|
||||||
|
|||||||
Reference in New Issue
Block a user