Merge branch 'master' into legacy

legacy
sh123 2022-07-20 12:43:52 +03:00
commit e7c7b26d3b
9 zmienionych plików z 116 dodań i 41 usunięć

Wyświetl plik

@ -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"
}

Wyświetl plik

@ -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();
}
}

Wyświetl plik

@ -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();
}

Wyświetl plik

@ -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);
}
}

Wyświetl plik

@ -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));
}
}

Wyświetl plik

@ -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);
}
}

Wyświetl plik

@ -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) {

Wyświetl plik

@ -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);

Wyświetl plik

@ -228,7 +228,7 @@
<string name="menu_stop_tracking">Stop tracking</string>
<string name="menu_send_position">Send position</string>
<string name="voax25_label">&#9742;</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&#8482; 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>