Skip to content

Commit 85c5255

Browse files
authored
Merge pull request #44 from sh123/aprs
APRS log filtering by callsign
2 parents 50deaf9 + 7342d07 commit 85c5255

File tree

9 files changed

+115
-40
lines changed

9 files changed

+115
-40
lines changed

codec2talkie/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ android {
1010
applicationId "com.radio.codec2talkie"
1111
minSdkVersion 23
1212
targetSdkVersion 30
13-
versionCode 127
14-
versionName "1.27"
13+
versionCode 128
14+
versionName "1.28"
1515

1616
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1717
}

codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,41 @@
1717

1818
public class LogItemActivity extends AppCompatActivity {
1919

20+
private String _groupName;
2021
private LogItemViewModel _logItemViewModel;
2122

2223
@Override
2324
protected void onCreate(Bundle savedInstanceState) {
2425
super.onCreate(savedInstanceState);
2526
setContentView(R.layout.activity_log_view);
26-
setTitle(R.string.aprs_log_view_title);
2727
ActionBar actionBar = getSupportActionBar();
2828
if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true);
2929

3030
RecyclerView recyclerView = findViewById(R.id.log_item_recyclerview);
3131
recyclerView.setHasFixedSize(true);
32+
3233
final LogItemAdapter adapter = new LogItemAdapter(new LogItemAdapter.LogItemDiff());
3334
recyclerView.setAdapter(adapter);
34-
recyclerView.setLayoutManager(new LinearLayoutManager(this));
35+
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
36+
linearLayoutManager.setStackFromEnd(true);
37+
recyclerView.setLayoutManager(linearLayoutManager);
3538
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
3639

3740
_logItemViewModel = new ViewModelProvider(this).get(LogItemViewModel.class);
38-
_logItemViewModel.getAllData().observe(this, adapter::submitList);
41+
42+
// launch with filter if group name is provided
43+
Bundle bundle = getIntent().getExtras();
44+
_groupName = null;
45+
if (bundle != null) {
46+
_groupName = (String)bundle.get("groupName");
47+
}
48+
if (_groupName == null) {
49+
_logItemViewModel.getAllData().observe(this, adapter::submitList);
50+
setTitle(R.string.aprs_log_view_title);
51+
} else {
52+
_logItemViewModel.getData(_groupName).observe(this, adapter::submitList);
53+
setTitle(_groupName);
54+
}
3955
}
4056

4157
@Override
@@ -61,15 +77,23 @@ else if (itemId == R.id.log_view_menu_clear) {
6177
}
6278

6379
private void deleteAll() {
80+
DialogInterface.OnClickListener deleteAllDialogClickListener = (dialog, which) -> {
81+
if (which == DialogInterface.BUTTON_POSITIVE) {
82+
if (_groupName == null) {
83+
_logItemViewModel.deleteAllLogItems();
84+
} else {
85+
_logItemViewModel.deleteLogItems(_groupName);
86+
}
87+
}
88+
};
89+
String alertMessage = getString(R.string.log_item_activity_delete_all_title);
90+
if (_groupName != null) {
91+
alertMessage = getString(R.string.log_item_activity_delete_group_title);
92+
alertMessage = String.format(alertMessage, _groupName);
93+
}
6494
AlertDialog.Builder builder = new AlertDialog.Builder(this);
65-
builder.setMessage(getString(R.string.log_item_activity_delete_all_title))
66-
.setPositiveButton(getString(R.string.yes), _deleteAllDialogClickListener)
67-
.setNegativeButton(getString(R.string.no), _deleteAllDialogClickListener).show();
95+
builder.setMessage(alertMessage)
96+
.setPositiveButton(getString(R.string.yes), deleteAllDialogClickListener)
97+
.setNegativeButton(getString(R.string.no), deleteAllDialogClickListener).show();
6898
}
69-
70-
private final DialogInterface.OnClickListener _deleteAllDialogClickListener = (dialog, which) -> {
71-
if (which == DialogInterface.BUTTON_POSITIVE) {
72-
_logItemViewModel.deleteAllLogItems();
73-
}
74-
};
7599
}

codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import androidx.room.OnConflictStrategy;
77
import androidx.room.Query;
88

9+
import com.radio.codec2talkie.storage.message.MessageItem;
10+
911
import java.util.List;
1012

1113
@Dao
@@ -14,9 +16,18 @@ public interface LogItemDao {
1416
@Insert(onConflict = OnConflictStrategy.IGNORE)
1517
void insertLogItem(LogItem logItem);
1618

17-
@Query("SELECT * FROM LogItem ORDER by timestampEpoch DESC")
19+
@Query("SELECT srcCallsign from LogItem GROUP BY srcCallsign")
20+
LiveData<List<String>> getGroups();
21+
22+
@Query("SELECT * FROM LogItem ORDER by timestampEpoch ASC")
1823
LiveData<List<LogItem>> getAllLogItems();
1924

25+
@Query("SELECT * FROM LogItem WHERE srcCallsign = :srcCallsign ORDER BY timestampEpoch ASC")
26+
LiveData<List<LogItem>> getLogItems(String srcCallsign);
27+
28+
@Query("DELETE FROM LogItem WHERE srcCallsign = :srcCallsign")
29+
void deleteLogItems(String srcCallsign);
30+
2031
@Query("DELETE FROM LogItem")
2132
void deleteAllLogItems();
2233
}
Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.radio.codec2talkie.storage.log;
22

3+
import android.content.Intent;
34
import android.view.LayoutInflater;
45
import android.view.View;
56
import android.view.ViewGroup;
@@ -8,30 +9,42 @@
89
import androidx.recyclerview.widget.RecyclerView;
910

1011
import com.radio.codec2talkie.R;
12+
import com.radio.codec2talkie.storage.message.MessageItemActivity;
1113
import com.radio.codec2talkie.tools.DateTools;
1214
import com.radio.codec2talkie.tools.TextTools;
1315

14-
public class LogItemHolder extends RecyclerView.ViewHolder {
15-
private final TextView logItemViewTitle;
16-
private final TextView logItemViewMessage;
16+
public class LogItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
17+
18+
private final TextView _logItemViewTitle;
19+
private final TextView _logItemViewMessage;
20+
private String _srcCallsign;
1721

1822
private LogItemHolder(View itemView) {
1923
super(itemView);
20-
logItemViewTitle = itemView.findViewById(R.id.log_view_item_title);
21-
logItemViewMessage = itemView.findViewById(R.id.log_view_item_message);
24+
_logItemViewTitle = itemView.findViewById(R.id.log_view_item_title);
25+
_logItemViewMessage = itemView.findViewById(R.id.log_view_item_message);
26+
itemView.setOnClickListener(this);
2227
}
2328

2429
public void bind(long timestamp, String srcCallsign, String text, boolean isTransmitting) {
25-
logItemViewTitle.setText(String.format("%s %s %s",
30+
_srcCallsign = srcCallsign;
31+
_logItemViewTitle.setText(String.format("%s %s %s",
2632
DateTools.epochToIso8601(timestamp),
2733
isTransmitting ? "→" : "←",
2834
srcCallsign));
29-
logItemViewMessage.setText(TextTools.addZeroWidthSpaces(text));
35+
_logItemViewMessage.setText(TextTools.addZeroWidthSpaces(text));
3036
}
3137

3238
static LogItemHolder create(ViewGroup parent) {
3339
View view = LayoutInflater.from(parent.getContext()).inflate(
3440
R.layout.activity_log_view_item, parent, false);
3541
return new LogItemHolder(view);
3642
}
43+
44+
@Override
45+
public void onClick(View v) {
46+
Intent logItemIntent = new Intent(v.getContext(), LogItemActivity.class);
47+
logItemIntent.putExtra("groupName", _srcCallsign);
48+
v.getContext().startActivity(logItemIntent);
49+
}
3750
}

codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemRepository.java

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,38 @@ public class LogItemRepository {
1212

1313
private final LogItemDao _logItemDao;
1414
private final LiveData<List<LogItem>> _logItemLiveData;
15+
private LiveData<List<LogItem>> _logItemGroupLiveData;
16+
private final LiveData<List<String>> _logItemGroups;
1517

1618
public LogItemRepository(Application application) {
1719
AppDatabase appDatabase = AppDatabase.getDatabase(application);
1820
_logItemDao = appDatabase.logItemDao();
1921
_logItemLiveData = _logItemDao.getAllLogItems();
22+
_logItemGroups = _logItemDao.getGroups();
2023
}
2124

22-
LiveData<List<LogItem>> getAllLogItems() {
25+
public LiveData<List<LogItem>> getAllLogItems() {
2326
return _logItemLiveData;
2427
}
2528

29+
public LiveData<List<String>> getGroups() { return _logItemGroups; }
30+
31+
public LiveData<List<LogItem>> getLogItems(String groupName) {
32+
if (_logItemGroupLiveData == null) {
33+
_logItemGroupLiveData = _logItemDao.getLogItems(groupName);
34+
}
35+
return _logItemGroupLiveData;
36+
}
37+
2638
public void insertLogItem(LogItem logItem) {
27-
AppDatabase.getDatabaseExecutor().execute(() -> {
28-
_logItemDao.insertLogItem(logItem);
29-
});
39+
AppDatabase.getDatabaseExecutor().execute(() -> _logItemDao.insertLogItem(logItem));
3040
}
3141

3242
public void deleteAllLogItems() {
3343
AppDatabase.getDatabaseExecutor().execute(_logItemDao::deleteAllLogItems);
3444
}
45+
46+
public void deleteLogItems(String groupName) {
47+
AppDatabase.getDatabaseExecutor().execute(() -> _logItemDao.deleteLogItems(groupName));
48+
}
3549
}

codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemViewModel.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66
import androidx.lifecycle.AndroidViewModel;
77
import androidx.lifecycle.LiveData;
88

9+
import com.radio.codec2talkie.storage.message.MessageItem;
10+
911
import java.util.List;
1012

1113
public class LogItemViewModel extends AndroidViewModel {
1214

1315
private final LogItemRepository _logItemRepository;
1416
private final LiveData<List<LogItem>> _logItemLiveData;
17+
private LiveData<List<LogItem>> _logItemGroupLiveData;
1518

1619
public LogItemViewModel(@NonNull Application application) {
1720
super(application);
@@ -23,5 +26,15 @@ public LiveData<List<LogItem>> getAllData() {
2326
return _logItemLiveData;
2427
}
2528

29+
public LiveData<List<LogItem>> getData(String groupName) {
30+
if (_logItemGroupLiveData == null)
31+
_logItemGroupLiveData = _logItemRepository.getLogItems(groupName);
32+
return _logItemGroupLiveData;
33+
}
34+
2635
public void deleteAllLogItems() { _logItemRepository.deleteAllLogItems(); }
36+
37+
public void deleteLogItems(String groupName) {
38+
_logItemRepository.deleteLogItems(groupName);
39+
}
2740
}

codec2talkie/src/main/java/com/radio/codec2talkie/storage/message/MessageItemHolder.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,24 @@
99

1010
import com.radio.codec2talkie.R;
1111
import com.radio.codec2talkie.tools.DateTools;
12-
import com.radio.codec2talkie.tools.TextTools;
1312

1413
public class MessageItemHolder extends RecyclerView.ViewHolder {
1514

16-
private final TextView messageItemViewTitle;
17-
private final TextView messageItemViewMessage;
15+
private final TextView _messageItemViewTitle;
16+
private final TextView _messageItemViewMessage;
1817

1918
private MessageItemHolder(View itemView) {
2019
super(itemView);
21-
messageItemViewTitle = itemView.findViewById(R.id.message_view_item_name);
22-
messageItemViewMessage = itemView.findViewById(R.id.message_item_message);
20+
_messageItemViewTitle = itemView.findViewById(R.id.message_view_item_name);
21+
_messageItemViewMessage = itemView.findViewById(R.id.message_item_message);
2322
}
2423

2524
public void bind(long timestamp, String srcCallsign, String text, boolean isTransmitting) {
26-
messageItemViewTitle.setText(String.format("%s %s %s",
25+
_messageItemViewTitle.setText(String.format("%s %s %s",
2726
DateTools.epochToIso8601(timestamp),
2827
isTransmitting ? "→" : "←",
2928
srcCallsign));
30-
messageItemViewMessage.setText(text);
29+
_messageItemViewMessage.setText(text);
3130
}
3231

3332
static MessageItemHolder create(ViewGroup parent) {

codec2talkie/src/main/java/com/radio/codec2talkie/storage/message/group/MessageGroupHolder.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,18 +13,18 @@
1313

1414
public class MessageGroupHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
1515

16-
private final TextView messageGroupsViewItemName;
17-
private final TextView messageGroupsViewItemMessage;
16+
private final TextView _messageGroupsViewItemName;
17+
private final TextView _messageGroupsViewItemMessage;
1818

1919
private MessageGroupHolder(View itemView) {
2020
super(itemView);
21-
messageGroupsViewItemName = itemView.findViewById(R.id.message_groups_view_item_name);
22-
messageGroupsViewItemMessage = itemView.findViewById(R.id.message_groups_item_message);
21+
_messageGroupsViewItemName = itemView.findViewById(R.id.message_groups_view_item_name);
22+
_messageGroupsViewItemMessage = itemView.findViewById(R.id.message_groups_item_message);
2323
itemView.setOnClickListener(this);
2424
}
2525

2626
public void bind(String text) {
27-
messageGroupsViewItemName.setText(text);
27+
_messageGroupsViewItemName.setText(text);
2828
}
2929

3030
static MessageGroupHolder create(ViewGroup parent) {
@@ -35,7 +35,7 @@ static MessageGroupHolder create(ViewGroup parent) {
3535

3636
@Override
3737
public void onClick(View v) {
38-
String groupName = messageGroupsViewItemName.getText().toString();
38+
String groupName = _messageGroupsViewItemName.getText().toString();
3939
Intent messagesIntent = new Intent(v.getContext(), MessageItemActivity.class);
4040
messagesIntent.putExtra("groupName", groupName);
4141
v.getContext().startActivity(messagesIntent);

codec2talkie/src/main/res/values/strings.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@
228228
<string name="menu_stop_tracking">Stop tracking</string>
229229
<string name="menu_send_position">Send position</string>
230230
<string name="voax25_label">&#9742;</string>
231-
<string name="menu_aprs_log">View raw log</string>
231+
<string name="menu_aprs_log">View log</string>
232232
<string name="aprs_location_emic_digipath_title">Mic-E digipath</string>
233233
<string name="aprs_location_source_smart_title">Smartbeaconing&#8482; position</string>
234234
<string name="aprs_location_source_smart_fast_speed_summary">Minimum speed for fast position updates</string>
@@ -282,5 +282,6 @@
282282
<string name="yes">Yes</string>
283283
<string name="no">No</string>
284284
<string name="log_item_activity_delete_all_title">This will remove everything from the log. Are you sure?</string>
285+
<string name="log_item_activity_delete_group_title">This will remove log for %s. Are you sure?</string>
285286
<string name="messages_group_activity_delete_group_confirmation_title">This will remove all messages from %s. Are you sure?</string>
286287
</resources>

0 commit comments

Comments
 (0)