kopia lustrzana https://github.com/sh123/codec2_talkie
Merge branch 'master' into legacy
commit
e7c7b26d3b
|
@ -10,8 +10,8 @@ android {
|
|||
applicationId "com.radio.codec2talkie"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 30
|
||||
versionCode 127
|
||||
versionName "1.27"
|
||||
versionCode 128
|
||||
versionName "1.28"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
|
|
@ -17,25 +17,41 @@ import com.radio.codec2talkie.R;
|
|||
|
||||
public class LogItemActivity extends AppCompatActivity {
|
||||
|
||||
private String _groupName;
|
||||
private LogItemViewModel _logItemViewModel;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_log_view);
|
||||
setTitle(R.string.aprs_log_view_title);
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
RecyclerView recyclerView = findViewById(R.id.log_item_recyclerview);
|
||||
recyclerView.setHasFixedSize(true);
|
||||
|
||||
final LogItemAdapter adapter = new LogItemAdapter(new LogItemAdapter.LogItemDiff());
|
||||
recyclerView.setAdapter(adapter);
|
||||
recyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||||
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
|
||||
linearLayoutManager.setStackFromEnd(true);
|
||||
recyclerView.setLayoutManager(linearLayoutManager);
|
||||
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
|
||||
|
||||
_logItemViewModel = new ViewModelProvider(this).get(LogItemViewModel.class);
|
||||
_logItemViewModel.getAllData().observe(this, adapter::submitList);
|
||||
|
||||
// launch with filter if group name is provided
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
_groupName = null;
|
||||
if (bundle != null) {
|
||||
_groupName = (String)bundle.get("groupName");
|
||||
}
|
||||
if (_groupName == null) {
|
||||
_logItemViewModel.getAllData().observe(this, adapter::submitList);
|
||||
setTitle(R.string.aprs_log_view_title);
|
||||
} else {
|
||||
_logItemViewModel.getData(_groupName).observe(this, adapter::submitList);
|
||||
setTitle(_groupName);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -61,15 +77,23 @@ public class LogItemActivity extends AppCompatActivity {
|
|||
}
|
||||
|
||||
private void deleteAll() {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setMessage(getString(R.string.log_item_activity_delete_all_title))
|
||||
.setPositiveButton(getString(R.string.yes), _deleteAllDialogClickListener)
|
||||
.setNegativeButton(getString(R.string.no), _deleteAllDialogClickListener).show();
|
||||
}
|
||||
|
||||
private final DialogInterface.OnClickListener _deleteAllDialogClickListener = (dialog, which) -> {
|
||||
if (which == DialogInterface.BUTTON_POSITIVE) {
|
||||
_logItemViewModel.deleteAllLogItems();
|
||||
DialogInterface.OnClickListener deleteAllDialogClickListener = (dialog, which) -> {
|
||||
if (which == DialogInterface.BUTTON_POSITIVE) {
|
||||
if (_groupName == null) {
|
||||
_logItemViewModel.deleteAllLogItems();
|
||||
} else {
|
||||
_logItemViewModel.deleteLogItems(_groupName);
|
||||
}
|
||||
}
|
||||
};
|
||||
String alertMessage = getString(R.string.log_item_activity_delete_all_title);
|
||||
if (_groupName != null) {
|
||||
alertMessage = getString(R.string.log_item_activity_delete_group_title);
|
||||
alertMessage = String.format(alertMessage, _groupName);
|
||||
}
|
||||
};
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||
builder.setMessage(alertMessage)
|
||||
.setPositiveButton(getString(R.string.yes), deleteAllDialogClickListener)
|
||||
.setNegativeButton(getString(R.string.no), deleteAllDialogClickListener).show();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,8 @@ import androidx.room.Insert;
|
|||
import androidx.room.OnConflictStrategy;
|
||||
import androidx.room.Query;
|
||||
|
||||
import com.radio.codec2talkie.storage.message.MessageItem;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Dao
|
||||
|
@ -14,9 +16,18 @@ public interface LogItemDao {
|
|||
@Insert(onConflict = OnConflictStrategy.IGNORE)
|
||||
void insertLogItem(LogItem logItem);
|
||||
|
||||
@Query("SELECT * FROM LogItem ORDER by timestampEpoch DESC")
|
||||
@Query("SELECT srcCallsign from LogItem GROUP BY srcCallsign")
|
||||
LiveData<List<String>> getGroups();
|
||||
|
||||
@Query("SELECT * FROM LogItem ORDER by timestampEpoch ASC")
|
||||
LiveData<List<LogItem>> getAllLogItems();
|
||||
|
||||
@Query("SELECT * FROM LogItem WHERE srcCallsign = :srcCallsign ORDER BY timestampEpoch ASC")
|
||||
LiveData<List<LogItem>> getLogItems(String srcCallsign);
|
||||
|
||||
@Query("DELETE FROM LogItem WHERE srcCallsign = :srcCallsign")
|
||||
void deleteLogItems(String srcCallsign);
|
||||
|
||||
@Query("DELETE FROM LogItem")
|
||||
void deleteAllLogItems();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package com.radio.codec2talkie.storage.log;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
|
@ -8,25 +9,30 @@ import android.widget.TextView;
|
|||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.radio.codec2talkie.R;
|
||||
import com.radio.codec2talkie.storage.message.MessageItemActivity;
|
||||
import com.radio.codec2talkie.tools.DateTools;
|
||||
import com.radio.codec2talkie.tools.TextTools;
|
||||
|
||||
public class LogItemHolder extends RecyclerView.ViewHolder {
|
||||
private final TextView logItemViewTitle;
|
||||
private final TextView logItemViewMessage;
|
||||
public class LogItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
|
||||
|
||||
private final TextView _logItemViewTitle;
|
||||
private final TextView _logItemViewMessage;
|
||||
private String _srcCallsign;
|
||||
|
||||
private LogItemHolder(View itemView) {
|
||||
super(itemView);
|
||||
logItemViewTitle = itemView.findViewById(R.id.log_view_item_title);
|
||||
logItemViewMessage = itemView.findViewById(R.id.log_view_item_message);
|
||||
_logItemViewTitle = itemView.findViewById(R.id.log_view_item_title);
|
||||
_logItemViewMessage = itemView.findViewById(R.id.log_view_item_message);
|
||||
itemView.setOnClickListener(this);
|
||||
}
|
||||
|
||||
public void bind(long timestamp, String srcCallsign, String text, boolean isTransmitting) {
|
||||
logItemViewTitle.setText(String.format("%s %s %s",
|
||||
_srcCallsign = srcCallsign;
|
||||
_logItemViewTitle.setText(String.format("%s %s %s",
|
||||
DateTools.epochToIso8601(timestamp),
|
||||
isTransmitting ? "→" : "←",
|
||||
srcCallsign));
|
||||
logItemViewMessage.setText(TextTools.addZeroWidthSpaces(text));
|
||||
_logItemViewMessage.setText(TextTools.addZeroWidthSpaces(text));
|
||||
}
|
||||
|
||||
static LogItemHolder create(ViewGroup parent) {
|
||||
|
@ -34,4 +40,11 @@ public class LogItemHolder extends RecyclerView.ViewHolder {
|
|||
R.layout.activity_log_view_item, parent, false);
|
||||
return new LogItemHolder(view);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
Intent logItemIntent = new Intent(v.getContext(), LogItemActivity.class);
|
||||
logItemIntent.putExtra("groupName", _srcCallsign);
|
||||
v.getContext().startActivity(logItemIntent);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,24 +12,38 @@ public class LogItemRepository {
|
|||
|
||||
private final LogItemDao _logItemDao;
|
||||
private final LiveData<List<LogItem>> _logItemLiveData;
|
||||
private LiveData<List<LogItem>> _logItemGroupLiveData;
|
||||
private final LiveData<List<String>> _logItemGroups;
|
||||
|
||||
public LogItemRepository(Application application) {
|
||||
AppDatabase appDatabase = AppDatabase.getDatabase(application);
|
||||
_logItemDao = appDatabase.logItemDao();
|
||||
_logItemLiveData = _logItemDao.getAllLogItems();
|
||||
_logItemGroups = _logItemDao.getGroups();
|
||||
}
|
||||
|
||||
LiveData<List<LogItem>> getAllLogItems() {
|
||||
public LiveData<List<LogItem>> getAllLogItems() {
|
||||
return _logItemLiveData;
|
||||
}
|
||||
|
||||
public LiveData<List<String>> getGroups() { return _logItemGroups; }
|
||||
|
||||
public LiveData<List<LogItem>> getLogItems(String groupName) {
|
||||
if (_logItemGroupLiveData == null) {
|
||||
_logItemGroupLiveData = _logItemDao.getLogItems(groupName);
|
||||
}
|
||||
return _logItemGroupLiveData;
|
||||
}
|
||||
|
||||
public void insertLogItem(LogItem logItem) {
|
||||
AppDatabase.getDatabaseExecutor().execute(() -> {
|
||||
_logItemDao.insertLogItem(logItem);
|
||||
});
|
||||
AppDatabase.getDatabaseExecutor().execute(() -> _logItemDao.insertLogItem(logItem));
|
||||
}
|
||||
|
||||
public void deleteAllLogItems() {
|
||||
AppDatabase.getDatabaseExecutor().execute(_logItemDao::deleteAllLogItems);
|
||||
}
|
||||
|
||||
public void deleteLogItems(String groupName) {
|
||||
AppDatabase.getDatabaseExecutor().execute(() -> _logItemDao.deleteLogItems(groupName));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,12 +6,15 @@ import androidx.annotation.NonNull;
|
|||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
|
||||
import com.radio.codec2talkie.storage.message.MessageItem;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class LogItemViewModel extends AndroidViewModel {
|
||||
|
||||
private final LogItemRepository _logItemRepository;
|
||||
private final LiveData<List<LogItem>> _logItemLiveData;
|
||||
private LiveData<List<LogItem>> _logItemGroupLiveData;
|
||||
|
||||
public LogItemViewModel(@NonNull Application application) {
|
||||
super(application);
|
||||
|
@ -23,5 +26,15 @@ public class LogItemViewModel extends AndroidViewModel {
|
|||
return _logItemLiveData;
|
||||
}
|
||||
|
||||
public LiveData<List<LogItem>> getData(String groupName) {
|
||||
if (_logItemGroupLiveData == null)
|
||||
_logItemGroupLiveData = _logItemRepository.getLogItems(groupName);
|
||||
return _logItemGroupLiveData;
|
||||
}
|
||||
|
||||
public void deleteAllLogItems() { _logItemRepository.deleteAllLogItems(); }
|
||||
|
||||
public void deleteLogItems(String groupName) {
|
||||
_logItemRepository.deleteLogItems(groupName);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,25 +9,24 @@ import androidx.recyclerview.widget.RecyclerView;
|
|||
|
||||
import com.radio.codec2talkie.R;
|
||||
import com.radio.codec2talkie.tools.DateTools;
|
||||
import com.radio.codec2talkie.tools.TextTools;
|
||||
|
||||
public class MessageItemHolder extends RecyclerView.ViewHolder {
|
||||
|
||||
private final TextView messageItemViewTitle;
|
||||
private final TextView messageItemViewMessage;
|
||||
private final TextView _messageItemViewTitle;
|
||||
private final TextView _messageItemViewMessage;
|
||||
|
||||
private MessageItemHolder(View itemView) {
|
||||
super(itemView);
|
||||
messageItemViewTitle = itemView.findViewById(R.id.message_view_item_name);
|
||||
messageItemViewMessage = itemView.findViewById(R.id.message_item_message);
|
||||
_messageItemViewTitle = itemView.findViewById(R.id.message_view_item_name);
|
||||
_messageItemViewMessage = itemView.findViewById(R.id.message_item_message);
|
||||
}
|
||||
|
||||
public void bind(long timestamp, String srcCallsign, String text, boolean isTransmitting) {
|
||||
messageItemViewTitle.setText(String.format("%s %s %s",
|
||||
_messageItemViewTitle.setText(String.format("%s %s %s",
|
||||
DateTools.epochToIso8601(timestamp),
|
||||
isTransmitting ? "→" : "←",
|
||||
srcCallsign));
|
||||
messageItemViewMessage.setText(text);
|
||||
_messageItemViewMessage.setText(text);
|
||||
}
|
||||
|
||||
static MessageItemHolder create(ViewGroup parent) {
|
||||
|
|
|
@ -13,18 +13,18 @@ import com.radio.codec2talkie.storage.message.MessageItemActivity;
|
|||
|
||||
public class MessageGroupHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
|
||||
|
||||
private final TextView messageGroupsViewItemName;
|
||||
private final TextView messageGroupsViewItemMessage;
|
||||
private final TextView _messageGroupsViewItemName;
|
||||
private final TextView _messageGroupsViewItemMessage;
|
||||
|
||||
private MessageGroupHolder(View itemView) {
|
||||
super(itemView);
|
||||
messageGroupsViewItemName = itemView.findViewById(R.id.message_groups_view_item_name);
|
||||
messageGroupsViewItemMessage = itemView.findViewById(R.id.message_groups_item_message);
|
||||
_messageGroupsViewItemName = itemView.findViewById(R.id.message_groups_view_item_name);
|
||||
_messageGroupsViewItemMessage = itemView.findViewById(R.id.message_groups_item_message);
|
||||
itemView.setOnClickListener(this);
|
||||
}
|
||||
|
||||
public void bind(String text) {
|
||||
messageGroupsViewItemName.setText(text);
|
||||
_messageGroupsViewItemName.setText(text);
|
||||
}
|
||||
|
||||
static MessageGroupHolder create(ViewGroup parent) {
|
||||
|
@ -35,7 +35,7 @@ public class MessageGroupHolder extends RecyclerView.ViewHolder implements View.
|
|||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
String groupName = messageGroupsViewItemName.getText().toString();
|
||||
String groupName = _messageGroupsViewItemName.getText().toString();
|
||||
Intent messagesIntent = new Intent(v.getContext(), MessageItemActivity.class);
|
||||
messagesIntent.putExtra("groupName", groupName);
|
||||
v.getContext().startActivity(messagesIntent);
|
||||
|
|
|
@ -228,7 +228,7 @@
|
|||
<string name="menu_stop_tracking">Stop tracking</string>
|
||||
<string name="menu_send_position">Send position</string>
|
||||
<string name="voax25_label">☎</string>
|
||||
<string name="menu_aprs_log">View raw log</string>
|
||||
<string name="menu_aprs_log">View log</string>
|
||||
<string name="aprs_location_emic_digipath_title">Mic-E digipath</string>
|
||||
<string name="aprs_location_source_smart_title">Smartbeaconing™ position</string>
|
||||
<string name="aprs_location_source_smart_fast_speed_summary">Minimum speed for fast position updates</string>
|
||||
|
@ -282,5 +282,6 @@
|
|||
<string name="yes">Yes</string>
|
||||
<string name="no">No</string>
|
||||
<string name="log_item_activity_delete_all_title">This will remove everything from the log. Are you sure?</string>
|
||||
<string name="log_item_activity_delete_group_title">This will remove log for %s. Are you sure?</string>
|
||||
<string name="messages_group_activity_delete_group_confirmation_title">This will remove all messages from %s. Are you sure?</string>
|
||||
</resources>
|
Ładowanie…
Reference in New Issue