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" /> + + - +