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