diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java index 901fb39..a382af0 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemActivity.java @@ -3,6 +3,7 @@ package com.radio.codec2talkie.storage.log; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -16,11 +17,13 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.radio.codec2talkie.MainActivity; import com.radio.codec2talkie.R; import com.radio.codec2talkie.storage.log.group.LogItemGroupAdapter; import com.radio.codec2talkie.storage.position.PositionItemViewModel; public class LogItemActivity extends AppCompatActivity { + private static final String TAG = LogItemActivity.class.getSimpleName(); private String _groupName; private LogItemViewModel _logItemViewModel; @@ -52,6 +55,7 @@ public class LogItemActivity extends AppCompatActivity { final LogItemAdapter adapter = new LogItemAdapter(new LogItemAdapter.LogItemDiff(), _groupName == null); logItemRecyclerView.setAdapter(adapter); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); + linearLayoutManager.setReverseLayout(true); logItemRecyclerView.setLayoutManager(linearLayoutManager); logItemRecyclerView.addItemDecoration(new DividerItemDecoration(logItemRecyclerView.getContext(), DividerItemDecoration.VERTICAL)); @@ -85,6 +89,19 @@ public class LogItemActivity extends AppCompatActivity { _logItemViewModel.getData(_groupName).observe(this, adapter::submitList); setTitle(_groupName); } + + // register live scroll + adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + @Override + public void onItemRangeInserted(int positionStart, int itemCount) { + int msgCount = adapter.getItemCount(); + int lastVisiblePosition = linearLayoutManager.findLastCompletelyVisibleItemPosition(); + Log.i(TAG, "" + msgCount + " " + lastVisiblePosition + " " + positionStart); + if (lastVisiblePosition == RecyclerView.NO_POSITION || positionStart == msgCount - 1 && lastVisiblePosition == positionStart - 1) { + logItemRecyclerView.scrollToPosition(positionStart); + } + } + }); } @Override diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemAdapter.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemAdapter.java index a7d40aa..05b425a 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemAdapter.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemAdapter.java @@ -31,12 +31,12 @@ public class LogItemAdapter extends ListAdapter { @Override public boolean areItemsTheSame(@NonNull LogItem oldItem, @NonNull LogItem newItem) { - return oldItem == newItem; + return oldItem.getTimestampEpoch() == newItem.getTimestampEpoch(); } @Override public boolean areContentsTheSame(@NonNull LogItem oldItem, @NonNull LogItem newItem) { - return oldItem.getLogLine().equals(newItem.getLogLine()); + return oldItem.getTimestampEpoch() == newItem.getTimestampEpoch(); } } } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java index fed141b..b8d8ea8 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/LogItemDao.java @@ -35,10 +35,10 @@ public interface LogItemDao { "GROUP BY log.srcCallsign") LiveData> getGroups(); - @Query("SELECT * FROM LogItem ORDER by timestampEpoch DESC") + @Query("SELECT * FROM LogItem ORDER by timestampEpoch ASC") LiveData> getAllLogItems(); - @Query("SELECT * FROM LogItem WHERE srcCallsign = :srcCallsign ORDER BY timestampEpoch DESC") + @Query("SELECT * FROM LogItem WHERE srcCallsign = :srcCallsign ORDER BY timestampEpoch ASC") LiveData> getLogItems(String srcCallsign); @Query("DELETE FROM LogItem WHERE srcCallsign = :srcCallsign") diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/group/LogItemGroupAdapter.java b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/group/LogItemGroupAdapter.java index bac9513..f220684 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/group/LogItemGroupAdapter.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/storage/log/group/LogItemGroupAdapter.java @@ -36,7 +36,7 @@ public class LogItemGroupAdapter extends ListAdapter