Skip to content

Commit 539411a

Browse files
authored
Merge pull request #45 from sh123/aprs
Improve stations history
2 parents 85c5255 + 7790ad2 commit 539411a

12 files changed

+200
-24
lines changed

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

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package com.radio.codec2talkie.storage.log;
22

33
import android.content.DialogInterface;
4+
import android.content.Intent;
45
import android.os.Bundle;
56
import android.view.Menu;
67
import android.view.MenuItem;
8+
import android.view.View;
9+
import android.widget.TextView;
710

811
import androidx.appcompat.app.ActionBar;
912
import androidx.appcompat.app.AlertDialog;
@@ -27,17 +30,35 @@ protected void onCreate(Bundle savedInstanceState) {
2730
ActionBar actionBar = getSupportActionBar();
2831
if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true);
2932

30-
RecyclerView recyclerView = findViewById(R.id.log_item_recyclerview);
31-
recyclerView.setHasFixedSize(true);
33+
_logItemViewModel = new ViewModelProvider(this).get(LogItemViewModel.class);
34+
35+
// log items
36+
RecyclerView logItemRecyclerView = findViewById(R.id.log_item_recyclerview);
37+
logItemRecyclerView.setHasFixedSize(true);
3238

3339
final LogItemAdapter adapter = new LogItemAdapter(new LogItemAdapter.LogItemDiff());
34-
recyclerView.setAdapter(adapter);
40+
logItemRecyclerView.setAdapter(adapter);
3541
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
36-
linearLayoutManager.setStackFromEnd(true);
37-
recyclerView.setLayoutManager(linearLayoutManager);
38-
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
42+
logItemRecyclerView.setLayoutManager(linearLayoutManager);
43+
logItemRecyclerView.addItemDecoration(new DividerItemDecoration(logItemRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
3944

40-
_logItemViewModel = new ViewModelProvider(this).get(LogItemViewModel.class);
45+
// log groups
46+
RecyclerView logItemGroupRecyclerView = findViewById(R.id.log_item_group_recyclerview);
47+
logItemGroupRecyclerView.setHasFixedSize(true);
48+
49+
final LogItemGroupAdapter adapterGroup = new LogItemGroupAdapter(new LogItemGroupAdapter.LogItemGroupDiff());
50+
adapterGroup.setClickListener(v -> {
51+
TextView itemView = v.findViewById(R.id.log_view_group_item_title);
52+
_groupName = itemView.getText().toString();
53+
_logItemViewModel.getData(_groupName).observe(this, adapter::submitList);
54+
setTitle(_groupName);
55+
});
56+
logItemGroupRecyclerView.setAdapter(adapterGroup);
57+
LinearLayoutManager linearLayoutManagerGroup = new LinearLayoutManager(this);
58+
logItemGroupRecyclerView.setLayoutManager(linearLayoutManagerGroup);
59+
logItemGroupRecyclerView.addItemDecoration(new DividerItemDecoration(logItemGroupRecyclerView.getContext(), DividerItemDecoration.VERTICAL));
60+
61+
_logItemViewModel.getGroups().observe(this, adapterGroup::submitList);
4162

4263
// launch with filter if group name is provided
4364
Bundle bundle = getIntent().getExtras();
@@ -46,6 +67,9 @@ protected void onCreate(Bundle savedInstanceState) {
4667
_groupName = (String)bundle.get("groupName");
4768
}
4869
if (_groupName == null) {
70+
logItemGroupRecyclerView.setVisibility(View.GONE);
71+
findViewById(R.id.log_item_textview).setVisibility(View.GONE);
72+
findViewById(R.id.log_item_group_textview).setVisibility(View.GONE);
4973
_logItemViewModel.getAllData().observe(this, adapter::submitList);
5074
setTitle(R.string.aprs_log_view_title);
5175
} else {
@@ -60,6 +84,14 @@ public boolean onCreateOptionsMenu(Menu menu) {
6084
return true;
6185
}
6286

87+
@Override
88+
public boolean onPrepareOptionsMenu(Menu menu) {
89+
if (_groupName != null) {
90+
menu.findItem(R.id.log_view_menu_stations).setVisible(false);
91+
}
92+
return super.onPrepareOptionsMenu(menu);
93+
}
94+
6395
@Override
6496
public boolean onOptionsItemSelected(MenuItem item)
6597
{
@@ -72,6 +104,11 @@ public boolean onOptionsItemSelected(MenuItem item)
72104
else if (itemId == R.id.log_view_menu_clear) {
73105
deleteAll();
74106
return true;
107+
} else if (itemId == R.id.log_view_menu_stations) {
108+
Intent logItemIntent = new Intent(this, LogItemActivity.class);
109+
logItemIntent.putExtra("groupName", getString(R.string.log_view_station_history));
110+
startActivity(logItemIntent);
111+
return true;
75112
}
76113
return super.onOptionsItemSelected(item);
77114
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ public interface LogItemDao {
1919
@Query("SELECT srcCallsign from LogItem GROUP BY srcCallsign")
2020
LiveData<List<String>> getGroups();
2121

22-
@Query("SELECT * FROM LogItem ORDER by timestampEpoch ASC")
22+
@Query("SELECT * FROM LogItem ORDER by timestampEpoch DESC")
2323
LiveData<List<LogItem>> getAllLogItems();
2424

25-
@Query("SELECT * FROM LogItem WHERE srcCallsign = :srcCallsign ORDER BY timestampEpoch ASC")
25+
@Query("SELECT * FROM LogItem WHERE srcCallsign = :srcCallsign ORDER BY timestampEpoch DESC")
2626
LiveData<List<LogItem>> getLogItems(String srcCallsign);
2727

2828
@Query("DELETE FROM LogItem WHERE srcCallsign = :srcCallsign")
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.radio.codec2talkie.storage.log;
2+
3+
import android.view.View;
4+
import android.view.ViewGroup;
5+
6+
import androidx.annotation.NonNull;
7+
import androidx.recyclerview.widget.DiffUtil;
8+
import androidx.recyclerview.widget.ListAdapter;
9+
10+
public class LogItemGroupAdapter extends ListAdapter<String, LogItemGroupHolder> {
11+
12+
private View.OnClickListener _clickListener;
13+
14+
public LogItemGroupAdapter(@NonNull DiffUtil.ItemCallback<String> diffCallback) {
15+
super(diffCallback);
16+
}
17+
18+
public void setClickListener(View.OnClickListener clickListener) {
19+
_clickListener = clickListener;
20+
}
21+
22+
@NonNull
23+
@Override
24+
public LogItemGroupHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
25+
return LogItemGroupHolder.create(parent);
26+
}
27+
28+
@Override
29+
public void onBindViewHolder(LogItemGroupHolder holder, int position) {
30+
String current = getItem(position);
31+
holder.itemView.setOnClickListener(_clickListener);
32+
holder.bind(current);
33+
}
34+
35+
static class LogItemGroupDiff extends DiffUtil.ItemCallback<String> {
36+
37+
@Override
38+
public boolean areItemsTheSame(@NonNull String oldItem, @NonNull String newItem) {
39+
return oldItem.equals(newItem);
40+
}
41+
42+
@Override
43+
public boolean areContentsTheSame(@NonNull String oldItem, @NonNull String newItem) {
44+
return oldItem.equals(newItem);
45+
}
46+
}
47+
}
48+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.radio.codec2talkie.storage.log;
2+
3+
import android.content.Intent;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
import android.widget.TextView;
8+
9+
import androidx.recyclerview.widget.RecyclerView;
10+
11+
import com.radio.codec2talkie.R;
12+
13+
public class LogItemGroupHolder extends RecyclerView.ViewHolder {
14+
15+
private final TextView _logItemViewTitle;
16+
private final TextView _logItemViewMessage;
17+
18+
private LogItemGroupHolder(View itemView) {
19+
super(itemView);
20+
_logItemViewTitle = itemView.findViewById(R.id.log_view_group_item_title);
21+
_logItemViewMessage = itemView.findViewById(R.id.log_view_group_item_message);
22+
}
23+
24+
public void bind(String groupName) {
25+
_logItemViewTitle.setText(groupName);
26+
}
27+
28+
static LogItemGroupHolder create(ViewGroup parent) {
29+
View view = LayoutInflater.from(parent.getContext()).inflate(
30+
R.layout.activity_log_view_group_item, parent, false);
31+
return new LogItemGroupHolder(view);
32+
}
33+
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ public LiveData<List<LogItem>> getAllLogItems() {
2929
public LiveData<List<String>> getGroups() { return _logItemGroups; }
3030

3131
public LiveData<List<LogItem>> getLogItems(String groupName) {
32-
if (_logItemGroupLiveData == null) {
33-
_logItemGroupLiveData = _logItemDao.getLogItems(groupName);
34-
}
35-
return _logItemGroupLiveData;
32+
return _logItemDao.getLogItems(groupName);
3633
}
3734

3835
public void insertLogItem(LogItem logItem) {

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,25 @@ public class LogItemViewModel extends AndroidViewModel {
1515
private final LogItemRepository _logItemRepository;
1616
private final LiveData<List<LogItem>> _logItemLiveData;
1717
private LiveData<List<LogItem>> _logItemGroupLiveData;
18+
private final LiveData<List<String>> _logItemGroups;
1819

1920
public LogItemViewModel(@NonNull Application application) {
2021
super(application);
2122
_logItemRepository = new LogItemRepository(application);
2223
_logItemLiveData = _logItemRepository.getAllLogItems();
24+
_logItemGroups = _logItemRepository.getGroups();
2325
}
2426

2527
public LiveData<List<LogItem>> getAllData() {
2628
return _logItemLiveData;
2729
}
2830

2931
public LiveData<List<LogItem>> getData(String groupName) {
30-
if (_logItemGroupLiveData == null)
31-
_logItemGroupLiveData = _logItemRepository.getLogItems(groupName);
32-
return _logItemGroupLiveData;
32+
return _logItemRepository.getLogItems(groupName);
3333
}
3434

35+
public LiveData<List<String>> getGroups() { return _logItemGroups; }
36+
3537
public void deleteAllLogItems() { _logItemRepository.deleteAllLogItems(); }
3638

3739
public void deleteLogItems(String groupName) {

codec2talkie/src/main/res/layout/activity_log_view.xml

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,41 @@
77
android:layout_height="match_parent"
88
tools:context=".storage.log.LogItemActivity">
99

10+
<androidx.appcompat.widget.AppCompatTextView
11+
android:id="@+id/log_item_group_textview"
12+
android:layout_width="match_parent"
13+
android:layout_height="0dp"
14+
android:text="@string/log_item_group_textview_title"
15+
android:padding="4dp"
16+
app:layout_constraintStart_toStartOf="parent"
17+
app:layout_constraintTop_toTopOf="parent" />
18+
19+
<androidx.recyclerview.widget.RecyclerView
20+
android:id="@+id/log_item_group_recyclerview"
21+
android:layout_width="match_parent"
22+
android:layout_height="0dp"
23+
android:padding="4dp"
24+
android:scrollbars="vertical"
25+
app:layout_constraintHeight_percent="0.5"
26+
app:layout_constraintTop_toBottomOf="@+id/log_item_group_textview"
27+
tools:listitem="@layout/activity_log_view_group_item" />
28+
29+
<androidx.appcompat.widget.AppCompatTextView
30+
android:id="@+id/log_item_textview"
31+
android:layout_width="match_parent"
32+
android:layout_height="0dp"
33+
android:padding="4dp"
34+
android:text="@string/log_item_textview_title"
35+
app:layout_constraintTop_toBottomOf="@+id/log_item_group_recyclerview"/>
36+
1037
<androidx.recyclerview.widget.RecyclerView
1138
android:id="@+id/log_item_recyclerview"
12-
android:layout_width="0dp"
39+
android:layout_width="match_parent"
1340
android:layout_height="0dp"
14-
android:padding="5dp"
41+
android:padding="4dp"
1542
android:scrollbars="vertical"
1643
app:layout_constraintBottom_toBottomOf="parent"
17-
app:layout_constraintLeft_toLeftOf="parent"
18-
app:layout_constraintRight_toRightOf="parent"
19-
app:layout_constraintTop_toTopOf="parent"
44+
app:layout_constraintTop_toBottomOf="@+id/log_item_textview"
2045
tools:listitem="@layout/activity_log_view_item" />
2146

2247
</androidx.constraintlayout.widget.ConstraintLayout>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
android:id="@+id/activity_log_view_item"
5+
android:layout_width="match_parent"
6+
android:layout_height="wrap_content"
7+
android:orientation="vertical">
8+
9+
<TextView
10+
android:id="@+id/log_view_group_item_title"
11+
style="@style/log_item_title"
12+
android:layout_width="match_parent"
13+
android:layout_height="wrap_content"
14+
android:lines="1"
15+
app:layout_constraintStart_toStartOf="parent"
16+
app:layout_constraintTop_toTopOf="parent" />
17+
18+
<TextView
19+
android:id="@+id/log_view_group_item_message"
20+
style="@style/log_item_message"
21+
android:layout_width="match_parent"
22+
android:layout_height="wrap_content"
23+
android:lines="1"
24+
app:layout_constraintStart_toStartOf="parent"
25+
app:layout_constraintTop_toBottomOf="@+id/log_view_group_item_title" />
26+
27+
</androidx.constraintlayout.widget.ConstraintLayout>

codec2talkie/src/main/res/layout/activity_message_groups_view.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
android:id="@+id/message_groups_recyclerview"
1212
android:layout_width="0dp"
1313
android:layout_height="0dp"
14-
android:padding="8dp"
14+
android:padding="4dp"
1515
android:scrollbars="vertical"
1616
app:layout_constraintBottom_toTopOf="@+id/messages_send_to"
1717
app:layout_constraintEnd_toEndOf="parent"

codec2talkie/src/main/res/layout/activity_message_view.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
android:id="@+id/message_recyclerview"
1111
android:layout_width="0dp"
1212
android:layout_height="0dp"
13-
android:padding="8dp"
13+
android:padding="4dp"
1414
android:scrollbars="vertical"
1515
app:layout_constraintBottom_toTopOf="@+id/messages_send"
1616
app:layout_constraintEnd_toEndOf="parent"

0 commit comments

Comments
 (0)