kopia lustrzana https://github.com/sh123/codec2_talkie
Refactoring
rodzic
df999f0e58
commit
b5ed6a011f
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,4 +20,6 @@ public class StationItemViewModel extends AndroidViewModel {
|
|||
super(application);
|
||||
_stationItemRepository = new StationItemRepository(application);
|
||||
}
|
||||
|
||||
public LiveData<List<StationItem>> getAllStationItems() { return _stationItemRepository.getAllStationItems(); }
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue