diff --git a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsFragment.java
index f8339d0b..a8ffe664 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsFragment.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsFragment.java
@@ -23,6 +23,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
+import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -32,12 +33,16 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
public class ConnectionsFragment extends Fragment implements AppStateListener, ConnectionsListener {
private static final String TAG = "ConnectionsFragment";
private MainActivity mActivity;
private Handler mHandler;
private ConnectionsAdapter mAdapter;
+ private View mFabDown;
+ private EmptyRecyclerView mRecyclerView;
+ private boolean autoScroll;
@Override
public void onAttach(@NonNull Context context) {
@@ -66,17 +71,18 @@ public class ConnectionsFragment extends Fragment implements AppStateListener, C
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
- EmptyRecyclerView connList = view.findViewById(R.id.connections_view);
- connList.setLayoutManager(new LinearLayoutManager(mActivity));
+ mRecyclerView = view.findViewById(R.id.connections_view);
+ LinearLayoutManager layoutMan = new LinearLayoutManager(mActivity);
+ mRecyclerView.setLayoutManager(layoutMan);
TextView emptyText = view.findViewById(R.id.no_connections);
- connList.setEmptyView(emptyText);
+ mRecyclerView.setEmptyView(emptyText);
mAdapter = new ConnectionsAdapter(mActivity);
- connList.setAdapter(mAdapter);
+ mRecyclerView.setAdapter(mAdapter);
mAdapter.setClickListener(v -> {
- int pos = connList.getChildLayoutPosition(v);
+ int pos = mRecyclerView.getChildLayoutPosition(v);
ConnDescriptor item = mAdapter.getItem(pos);
if(item != null) {
@@ -100,6 +106,34 @@ public class ConnectionsFragment extends Fragment implements AppStateListener, C
}
});
+ mFabDown = view.findViewById(R.id.fabDown);
+ autoScroll = true;
+ showFabDown(false);
+
+ mFabDown.setOnClickListener(v -> scrollToBottom());
+
+ mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
+ @Override
+ //public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
+ public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int state) {
+ int first_visibile_pos = layoutMan.findFirstCompletelyVisibleItemPosition();
+ int last_visible_pos = layoutMan.findLastCompletelyVisibleItemPosition();
+ int last_pos = mAdapter.getItemCount() - 1;
+ boolean reached_bottom = (last_visible_pos >= last_pos);
+ boolean is_scrolling = (first_visibile_pos != 0) || (!reached_bottom);
+
+ if(is_scrolling) {
+ if(reached_bottom) {
+ autoScroll = true;
+ showFabDown(false);
+ } else {
+ autoScroll = false;
+ showFabDown(true);
+ }
+ }
+ }
+ });
+
mHandler = new Handler();
ConnectionsRegister reg = CaptureService.getConnsRegister();
if(reg != null)
@@ -108,6 +142,20 @@ public class ConnectionsFragment extends Fragment implements AppStateListener, C
mActivity.addAppStateListener(this);
}
+ private void showFabDown(boolean visible) {
+ if(visible)
+ mFabDown.setVisibility(View.VISIBLE);
+ else
+ mFabDown.setVisibility(View.INVISIBLE);
+ }
+
+ private void scrollToBottom() {
+ int last_pos = mAdapter.getItemCount() - 1;
+ mRecyclerView.scrollToPosition(last_pos);
+
+ showFabDown(false);
+ }
+
@Override
public void onResume() {
super.onResume();
@@ -122,6 +170,10 @@ public class ConnectionsFragment extends Fragment implements AppStateListener, C
if(reg != null)
reg.setListener(this);
+
+ autoScroll = true;
+ showFabDown(false);
+ mAdapter.notifyDataSetChanged();
}
}
@@ -133,6 +185,12 @@ public class ConnectionsFragment extends Fragment implements AppStateListener, C
@Override
public void connectionsChanges() {
- mHandler.post(() -> mAdapter.notifyDataSetChanged());
+ mHandler.post(() -> {
+ mAdapter.notifyDataSetChanged();
+
+ if(autoScroll)
+ scrollToBottom();
+ });
+
}
}
diff --git a/app/src/main/java/com/emanuelef/remote_capture/StatusFragment.java b/app/src/main/java/com/emanuelef/remote_capture/StatusFragment.java
index 7771ff6e..c709b160 100644
--- a/app/src/main/java/com/emanuelef/remote_capture/StatusFragment.java
+++ b/app/src/main/java/com/emanuelef/remote_capture/StatusFragment.java
@@ -33,7 +33,6 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.NonNull;
diff --git a/app/src/main/res/drawable/ic_arrow_drop_down.xml b/app/src/main/res/drawable/ic_arrow_drop_down.xml
new file mode 100644
index 00000000..3dbfedba
--- /dev/null
+++ b/app/src/main/res/drawable/ic_arrow_drop_down.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/connections.xml b/app/src/main/res/layout/connections.xml
index cf03eb9f..a8ec8e3a 100644
--- a/app/src/main/res/layout/connections.xml
+++ b/app/src/main/res/layout/connections.xml
@@ -1,14 +1,25 @@
-
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+ android:scrollbars="vertical"
+ android:scrollbarStyle="outsideOverlay"
+ android:id="@+id/connections_view" />
+
+
-
+