master
sh123 2022-09-03 14:11:29 +03:00
rodzic df999f0e58
commit b5ed6a011f
11 zmienionych plików z 129 dodań i 48 usunięć

Wyświetl plik

@ -32,6 +32,7 @@ import com.radio.codec2talkie.protocol.position.Position;
import com.radio.codec2talkie.settings.PreferenceKeys;
import com.radio.codec2talkie.storage.message.MessageItemRepository;
import com.radio.codec2talkie.storage.position.PositionItemRepository;
import com.radio.codec2talkie.storage.station.StationItemRepository;
import com.radio.codec2talkie.tools.AudioTools;
import com.radio.codec2talkie.transport.Transport;
import com.radio.codec2talkie.transport.TransportFactory;
@ -74,6 +75,7 @@ public class AppWorker extends Thread {
private final LogItemRepository _logItemRepository;
private final MessageItemRepository _messageItemRepository;
private final PositionItemRepository _positionItemRepository;
private final StationItemRepository _stationItemRepository;
private final Context _context;
private final SharedPreferences _sharedPreferences;
@ -91,6 +93,7 @@ public class AppWorker extends Thread {
_logItemRepository = new LogItemRepository((Application)context);
_messageItemRepository = new MessageItemRepository((Application)context);
_positionItemRepository = new PositionItemRepository((Application)context);
_stationItemRepository = new StationItemRepository((Application)context);
_transport = TransportFactory.create(transportType, context);
_protocol = ProtocolFactory.create(_codec2Mode, context);
@ -261,6 +264,7 @@ public class AppWorker extends Thread {
position.bearingDegrees, position.speedMetersPerSecond, position.altitudeMeters,
position.symbolCode, position.rangeMiles, position.status, position.comment));
_positionItemRepository.upsertPositionItem(position.toPositionItem(false));
_stationItemRepository.upsertStationItem(position.toStationItem());
String note = (position.srcCallsign == null ? "UNK" : position.srcCallsign) + "→" +
(position.dstCallsign == null ? "UNK" : position.dstCallsign);
@ -332,6 +336,7 @@ public class AppWorker extends Thread {
@Override
protected void onTransmitPosition(Position position) {
_positionItemRepository.upsertPositionItem(position.toPositionItem(true));
_stationItemRepository.upsertStationItem(position.toStationItem());
}
@Override
@ -369,6 +374,7 @@ public class AppWorker extends Thread {
logItem.setLogLine(logData);
logItem.setIsTransmit(isTransmit);
_logItemRepository.insertLogItem(logItem);
_stationItemRepository.upsertStationItem(logItem.toStationItem());
}
}

Wyświetl plik

@ -3,6 +3,7 @@ package com.radio.codec2talkie.protocol.position;
import android.location.Location;
import com.radio.codec2talkie.storage.position.PositionItem;
import com.radio.codec2talkie.storage.station.StationItem;
import com.radio.codec2talkie.tools.UnitTools;
public class Position {
@ -113,4 +114,24 @@ public class Position {
positionItem.setRangeMiles(rangeMiles);
return positionItem;
}
public StationItem toStationItem() {
StationItem stationItem = new StationItem();
stationItem.setTimestampEpoch(System.currentTimeMillis());
stationItem.setSrcCallsign(srcCallsign);
stationItem.setDstCallsign(dstCallsign);
stationItem.setLatitude(latitude);
stationItem.setLongitude(longitude);
stationItem.setMaidenHead(maidenHead);
stationItem.setAltitudeMeters(altitudeMeters);
stationItem.setBearingDegrees(bearingDegrees);
stationItem.setSpeedMetersPerSecond(speedMetersPerSecond);
stationItem.setStatus(status);
stationItem.setComment(comment);
stationItem.setSymbolCode(symbolCode);
stationItem.setPrivacyLevel(privacyLevel);
stationItem.setDirectivityDeg(directivityDeg);
stationItem.setRangeMiles(rangeMiles);
return stationItem;
}
}

Wyświetl plik

@ -4,6 +4,8 @@ import androidx.room.Entity;
import androidx.room.Index;
import androidx.room.PrimaryKey;
import com.radio.codec2talkie.storage.station.StationItem;
@Entity
public class LogItem {
@ -45,4 +47,13 @@ public class LogItem {
public void setLogLine(String logLine) { this.logLine = logLine; }
public void setIsTransmit(boolean isTransmit) { this.isTransmit = isTransmit; }
public StationItem toStationItem() {
StationItem stationItem = new StationItem();
stationItem.setTimestampEpoch(System.currentTimeMillis());
stationItem.setSrcCallsign(srcCallsign);
stationItem.setDstCallsign(stationItem.dstCallsign);
stationItem.setLogLine(logLine);
return stationItem;
}
}

Wyświetl plik

@ -20,15 +20,17 @@ import androidx.recyclerview.widget.RecyclerView;
import com.radio.codec2talkie.R;
import com.radio.codec2talkie.storage.station.StationItemAdapter;
import com.radio.codec2talkie.storage.position.PositionItemViewModel;
import com.radio.codec2talkie.storage.station.StationItemViewModel;
import java.util.List;
public class LogItemActivity extends AppCompatActivity {
private static final String TAG = LogItemActivity.class.getSimpleName();
private String _groupName;
private String _stationName;
private LogItemViewModel _logItemViewModel;
private PositionItemViewModel _positionItemViewModel;
private StationItemViewModel _stationItemViewModel;
private LiveData<List<LogItem>> _logItemLiveData;
@ -40,62 +42,63 @@ public class LogItemActivity extends AppCompatActivity {
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true);
// get group name to decide if filtering should be enabled
// get station name to decide if filtering should be enabled
Bundle bundle = getIntent().getExtras();
_groupName = null;
_stationName = null;
if (bundle != null) {
_groupName = (String)bundle.get("groupName");
_stationName = (String)bundle.get("stationName");
}
// view models
_logItemViewModel = new ViewModelProvider(this).get(LogItemViewModel.class);
_positionItemViewModel = new ViewModelProvider(this).get(PositionItemViewModel.class);
_stationItemViewModel = new ViewModelProvider(this).get(StationItemViewModel.class);
// log items
RecyclerView logItemRecyclerView = findViewById(R.id.log_item_recyclerview);
logItemRecyclerView.setHasFixedSize(true);
// log lines list adapter
final LogItemAdapter adapter = new LogItemAdapter(new LogItemAdapter.LogItemDiff(), _groupName == null);
final LogItemAdapter adapter = new LogItemAdapter(new LogItemAdapter.LogItemDiff(), _stationName == null);
logItemRecyclerView.setAdapter(adapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
logItemRecyclerView.setLayoutManager(linearLayoutManager);
logItemRecyclerView.addItemDecoration(new DividerItemDecoration(logItemRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
// log groups
RecyclerView logItemGroupRecyclerView = findViewById(R.id.log_item_group_recyclerview);
logItemGroupRecyclerView.setHasFixedSize(true);
// stations
RecyclerView stationsRecyclerView = findViewById(R.id.log_item_group_recyclerview);
stationsRecyclerView.setHasFixedSize(true);
// groups adapter
final StationItemAdapter adapterGroup = new StationItemAdapter(new StationItemAdapter.LogItemGroupDiff());
adapterGroup.setClickListener(v -> {
// stations adapter
final StationItemAdapter stationsAdapter = new StationItemAdapter(new StationItemAdapter.LogItemGroupDiff());
stationsAdapter.setClickListener(v -> {
TextView itemView = v.findViewById(R.id.log_view_group_item_title);
_logItemLiveData.removeObservers(this);
_groupName = itemView.getText().toString();
_logItemLiveData = _logItemViewModel.getData(_groupName);
_stationName = itemView.getText().toString();
_logItemLiveData = _logItemViewModel.getData(_stationName);
_logItemLiveData.observe(this, adapter::submitList);
setTitle(_groupName);
setTitle(_stationName);
});
logItemGroupRecyclerView.setAdapter(adapterGroup);
LinearLayoutManager linearLayoutManagerGroup = new LinearLayoutManager(this);
logItemGroupRecyclerView.setLayoutManager(linearLayoutManagerGroup);
logItemGroupRecyclerView.addItemDecoration(new DividerItemDecoration(logItemGroupRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
stationsRecyclerView.setAdapter(stationsAdapter);
LinearLayoutManager linearLayoutManagerStations = new LinearLayoutManager(this);
stationsRecyclerView.setLayoutManager(linearLayoutManagerStations);
stationsRecyclerView.addItemDecoration(new DividerItemDecoration(stationsRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
_logItemViewModel.getLastPositions().observe(this, adapterGroup::submitList);
_stationItemViewModel.getAllStationItems().observe(this, stationsAdapter::submitList);
// launch with filter if group name is provided
if (_groupName == null) {
logItemGroupRecyclerView.setVisibility(View.GONE);
// launch with filter if station name is provided
if (_stationName == null) {
stationsRecyclerView.setVisibility(View.GONE);
findViewById(R.id.log_item_textview).setVisibility(View.GONE);
findViewById(R.id.log_item_group_textview).setVisibility(View.GONE);
_logItemLiveData = _logItemViewModel.getAllData();
_logItemLiveData.observe(this, adapter::submitList);
setTitle(R.string.aprs_log_view_title);
} else {
_logItemLiveData = _logItemViewModel.getData(_groupName);
_logItemLiveData = _logItemViewModel.getData(_stationName);
_logItemLiveData.observe(this, adapter::submitList);
setTitle(_groupName);
setTitle(_stationName);
}
// register live scroll
@ -120,7 +123,7 @@ public class LogItemActivity extends AppCompatActivity {
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
if (_groupName != null) {
if (_stationName != null) {
menu.findItem(R.id.log_view_menu_stations).setVisible(false);
}
return super.onPrepareOptionsMenu(menu);
@ -151,7 +154,7 @@ public class LogItemActivity extends AppCompatActivity {
return true;
} else if (itemId == R.id.log_view_menu_stations) {
Intent logItemIntent = new Intent(this, LogItemActivity.class);
logItemIntent.putExtra("groupName", getString(R.string.log_view_station_history));
logItemIntent.putExtra("stationName", getString(R.string.log_view_station_history));
startActivity(logItemIntent);
return true;
}
@ -161,17 +164,23 @@ public class LogItemActivity extends AppCompatActivity {
private void deleteLogItems(int hours) {
DialogInterface.OnClickListener deleteAllDialogClickListener = (dialog, which) -> {
if (which == DialogInterface.BUTTON_POSITIVE) {
if (_groupName == null) {
if (_stationName == null) {
if (hours == -1) {
_logItemViewModel.deleteAllLogItems();
_positionItemViewModel.deleteAllPositionItems();
// TODO delete stations
// _stationItemViewModel.deleteAllStationItems()
} else {
_logItemViewModel.deleteLogItemsOlderThanHours(hours);
_positionItemViewModel.deletePositionItemsOlderThanHours(hours);
// TODO delete stations
// _stationItemViewModel.deleteAllStationItemsOlderThanHours(hours)
}
} else {
_logItemViewModel.deleteLogItems(_groupName);
_positionItemViewModel.deletePositionItems(_groupName);
_logItemViewModel.deleteLogItems(_stationName);
_positionItemViewModel.deletePositionItems(_stationName);
// TODO delete stations
// _stationItemViewModel.deleteStationItem(_stationName)
}
}
};
@ -179,9 +188,9 @@ public class LogItemActivity extends AppCompatActivity {
if (hours != -1) {
alertMessage = String.format(getString(R.string.log_item_activity_delete_hours_title), hours);
}
if (_groupName != null) {
if (_stationName != null) {
alertMessage = getString(R.string.log_item_activity_delete_group_title);
alertMessage = String.format(alertMessage, _groupName);
alertMessage = String.format(alertMessage, _stationName);
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(alertMessage)

Wyświetl plik

@ -14,7 +14,6 @@ public class LogItemViewModel extends AndroidViewModel {
private final LogItemRepository _logItemRepository;
private final LiveData<List<LogItem>> _logItemLiveData;
private LiveData<List<LogItem>> _logItemGroupLiveData;
private final LiveData<List<StationItem>> _lastPositions;
public LogItemViewModel(@NonNull Application application) {

Wyświetl plik

@ -21,10 +21,6 @@ public class PositionItemRepository {
_positionItemDao = appDatabase.positionItemDao();
}
public void insertPositionItem(PositionItem positionItem) {
AppDatabase.getDatabaseExecutor().execute(() -> _positionItemDao.insertPositionItem(positionItem));
}
public void upsertPositionItem(PositionItem positionItem) {
AppDatabase.getDatabaseExecutor().execute(() -> {
PositionItem oldPosition = _positionItemDao.getLastPositionItem(positionItem.getSrcCallsign());
@ -46,7 +42,7 @@ public class PositionItemRepository {
AppDatabase.getDatabaseExecutor().execute(_positionItemDao::deleteAllPositionItems);
}
public void deletePositionItems(String srcCallsign) {
public void deletePositionItemsFromCallsign(String srcCallsign) {
AppDatabase.getDatabaseExecutor().execute(() -> _positionItemDao.deletePositionItems(srcCallsign));
}

Wyświetl plik

@ -1,16 +1,12 @@
package com.radio.codec2talkie.storage.position;
import android.app.Application;
import android.text.format.DateUtils;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import com.radio.codec2talkie.tools.DateTools;
import java.util.List;
public class PositionItemViewModel extends AndroidViewModel {
private final PositionItemRepository _positionItemRepository;
@ -23,7 +19,7 @@ public class PositionItemViewModel extends AndroidViewModel {
public void deleteAllPositionItems() { _positionItemRepository.deleteAllPositionItems(); }
public void deletePositionItems(String srcCallsign) {
_positionItemRepository.deletePositionItems(srcCallsign);
_positionItemRepository.deletePositionItemsFromCallsign(srcCallsign);
}
public void deletePositionItemsOlderThanHours(int hours) {

Wyświetl plik

@ -96,4 +96,29 @@ public class StationItem {
public void setRangeMiles(double rangeMiles) { this.rangeMiles = rangeMiles; }
public void setDirectivityDeg(int directivityDeg) { this.directivityDeg = directivityDeg; }
public void updateFrom(StationItem stationItem) {
setTimestampEpoch(stationItem.getTimestampEpoch());
setDstCallsign(stationItem.getDstCallsign());
// position item has maidenhead
if (stationItem.getMaidenHead() != null) {
setMaidenHead(stationItem.getMaidenHead());
setLatitude(stationItem.getLatitude());
setLongitude(stationItem.getLongitude());
setAltitudeMeters(stationItem.getAltitudeMeters());
setBearingDegrees(stationItem.getBearingDegrees());
setSpeedMetersPerSecond(stationItem.getSpeedMetersPerSecond());
setPrivacyLevel(stationItem.getPrivacyLevel());
setRangeMiles(stationItem.getRangeMiles());
setDirectivityDeg(stationItem.getDirectivityDeg());
}
if (stationItem.getStatus() != null)
setStatus(stationItem.getStatus());
if (stationItem.getComment() != null)
setComment(stationItem.getComment());
if (stationItem.getSymbolCode() != null)
setSymbolCode(stationItem.getSymbolCode());
if (stationItem.getLogLine() != null)
setLogLine(stationItem.getLogLine());
}
}

Wyświetl plik

@ -1,10 +1,16 @@
package com.radio.codec2talkie.storage.station;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;
import com.radio.codec2talkie.storage.position.PositionItem;
import java.util.List;
@Dao
public interface StationItemDao {
@ -13,4 +19,10 @@ public interface StationItemDao {
@Update(onConflict = OnConflictStrategy.IGNORE)
void updateStationItem(StationItem stationItem);
@Query("SELECT * FROM StationItem WHERE srcCallsign = :srcCallsign")
StationItem getStationItem(String srcCallsign);
@Query("SELECT * FROM StationItem ORDER BY srcCallsign ASC")
LiveData<List<StationItem>> getAllStationItems();
}

Wyświetl plik

@ -1,13 +1,10 @@
package com.radio.codec2talkie.storage.station;
import android.app.Application;
import android.util.Log;
import androidx.lifecycle.LiveData;
import com.radio.codec2talkie.maps.MapActivity;
import com.radio.codec2talkie.storage.AppDatabase;
import com.radio.codec2talkie.tools.DateTools;
import java.util.List;
@ -15,18 +12,25 @@ public class StationItemRepository {
private static final String TAG = StationItemRepository.class.getSimpleName();
private final StationItemDao _stationItemDao;
private final LiveData<List<StationItem>> _stationItems;
public StationItemRepository(Application application) {
AppDatabase appDatabase = AppDatabase.getDatabase(application);
_stationItemDao = appDatabase.stationitemDao();
_stationItems = _stationItemDao.getAllStationItems();
}
public void insertStationItem(StationItem stationItem) {
AppDatabase.getDatabaseExecutor().execute(() -> _stationItemDao.insertStationItem(stationItem));
}
public LiveData<List<StationItem>> getAllStationItems() { return _stationItems; }
public void upsertStationItem(StationItem stationItem) {
AppDatabase.getDatabaseExecutor().execute(() -> {
StationItem oldStationItem = _stationItemDao.getStationItem(stationItem.getSrcCallsign());
if (oldStationItem != null) {
oldStationItem.updateFrom(stationItem);
_stationItemDao.updateStationItem(oldStationItem);
} else {
_stationItemDao.insertStationItem(stationItem);
}
});
}
}

Wyświetl plik

@ -20,4 +20,6 @@ public class StationItemViewModel extends AndroidViewModel {
super(application);
_stationItemRepository = new StationItemRepository(application);
}
public LiveData<List<StationItem>> getAllStationItems() { return _stationItemRepository.getAllStationItems(); }
}