From 1ba0d8008fee8a583cfaa3d17ac54b22ff3cc692 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Sun, 2 Jan 2022 11:36:34 +0100 Subject: [PATCH] Improve fragments consistency while swiping While swiping in the viewpager, the fragments onResume may haven't been called yet. This commit initializes the status fragment before onResume and also fixes the "No Connections" shown just briefly after the connections fragment is shown --- .../com/emanuelef/remote_capture/Utils.java | 10 ++++++++++ .../fragments/ConnectionsFragment.java | 18 ++++++++++------- .../fragments/StatusFragment.java | 20 +++++++++---------- app/src/main/res/layout/connections.xml | 2 +- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/Utils.java b/app/src/main/java/com/emanuelef/remote_capture/Utils.java index 243cc78d..48ea7ee1 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/Utils.java +++ b/app/src/main/java/com/emanuelef/remote_capture/Utils.java @@ -50,6 +50,8 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Environment; +import android.os.Handler; +import android.os.Looper; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.text.SpannableString; @@ -860,4 +862,12 @@ public class Utils { showToastLong(ctx, R.string.no_intent_handler_found); } } + + // Runs the specified runnable now if on the UI thread, otherwise enqueue it to the Handler + public static void runOnUi(Runnable r, Handler h) { + if(Looper.getMainLooper().getThread() == Thread.currentThread()) + r.run(); + else + h.post(r); + } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java index 654fc20b..7b83c14a 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java @@ -111,7 +111,14 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener public void onResume() { super.onResume(); + if((CaptureService.getConnsRegister() != null) || CaptureService.isServiceActive()) + mEmptyText.setText(R.string.no_connections); + else + mEmptyText.setText(R.string.capture_not_running); + registerConnsListener(); + mRecyclerView.setEmptyView(mEmptyText); // after registerConnsListener, when the adapter is populated + refreshMenuIcons(); } @@ -120,6 +127,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener super.onPause(); unregisterConnsListener(); + mRecyclerView.setEmptyView(null); if(mSearchView != null) mQueryToApply = mSearchView.getQuery().toString(); @@ -174,10 +182,6 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener mApps = new AppsResolver(requireContext()); mEmptyText = view.findViewById(R.id.no_connections); - if((requireActivity() instanceof MainActivity) && - (((MainActivity) requireActivity()).getState() == AppState.running)) - mEmptyText.setText(R.string.no_connections); - mActiveFilter = view.findViewById(R.id.active_filter); mActiveFilter.setOnCheckedChangeListener((group, checkedId) -> { if(mAdapter != null) { @@ -189,7 +193,6 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener mAdapter = new ConnectionsAdapter(requireContext(), mApps); mRecyclerView.setAdapter(mAdapter); listenerSet = false; - mRecyclerView.setEmptyView(mEmptyText); registerForContextMenu(mRecyclerView); DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(mRecyclerView.getContext(), @@ -576,7 +579,8 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener // Important: must use the provided num_connections rather than accessing the register // in order to avoid desyncs - mHandler.post(() -> { + // using runOnUi to populate the adapter as soon as registerConnsListener is called + Utils.runOnUi(() -> { Log.d(TAG, "New connections size: " + num_connections); mAdapter.connectionsChanges(num_connections); @@ -584,7 +588,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener if(autoScroll) scrollToBottom(); - }); + }, mHandler); } @Override diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java index 107b86a0..cd0bf796 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/StatusFragment.java @@ -105,11 +105,7 @@ public class StatusFragment extends Fragment implements AppStateListener, AppsLo @Override public void onResume() { super.onResume(); - - if((mMenu != null) && (mActivity != null)) - appStateChanged(mActivity.getState()); - - recheckFilterWarning(); + refreshStatus(); /* Register for stats update */ mReceiver = new BroadcastReceiver() { @@ -219,9 +215,7 @@ public class StatusFragment extends Fragment implements AppStateListener, AppsLo /* Important: call this after all the fields have been initialized */ mActivity.setAppStateListener(this); - - if((mMenu != null) && (mActivity != null)) - appStateChanged(mActivity.getState()); + refreshStatus(); } @Override @@ -231,9 +225,7 @@ public class StatusFragment extends Fragment implements AppStateListener, AppsLo mMenu = menu; mMenuItemStartBtn = mMenu.findItem(R.id.action_start); mMenuSettings = mMenu.findItem(R.id.action_settings); - - if(mActivity != null) - appStateChanged(mActivity.getState()); + refreshStatus(); } private void recheckFilterWarning() { @@ -395,6 +387,12 @@ private void refreshPcapDumpInfo() { } } + private void refreshStatus() { + if(mActivity != null) + appStateChanged(mActivity.getState()); + recheckFilterWarning(); + } + private void openAppFilterSelector() { Dialog dialog = Utils.getAppSelectionDialog(mActivity, new ArrayList<>(), this::setAppFilter); dialog.setOnCancelListener(dialog1 -> setAppFilter(null)); diff --git a/app/src/main/res/layout/connections.xml b/app/src/main/res/layout/connections.xml index c0ec0e2e..ecfccb2d 100644 --- a/app/src/main/res/layout/connections.xml +++ b/app/src/main/res/layout/connections.xml @@ -36,7 +36,7 @@ android:layout_marginTop="40dp" android:textStyle="italic" android:textSize="15sp" - android:text="@string/capture_not_started"> + tools:text="@string/capture_not_started">