From 25f7193051abe5b251fbf6a2ab1e68c783e29280 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Sat, 4 Jun 2022 11:50:34 +0200 Subject: [PATCH] Fix crash on screen rotation in connection details On screen rotation, the fragments onAttach is called before the activity onCreate, which caused mConn to be null --- .../activities/ConnectionDetailsActivity.java | 11 ++++----- .../fragments/ConnectionOverview.java | 24 +++++++++++++++++-- .../fragments/ConnectionPayload.java | 22 ++++++++++++----- 3 files changed, 43 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java index 0c2e0681..c258c573 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/ConnectionDetailsActivity.java @@ -132,17 +132,18 @@ public class ConnectionDetailsActivity extends BaseActivity implements Connectio public Fragment createFragment(int position) { //Log.d(TAG, "createFragment"); int pos = getVisibleTabsPositions()[position]; + int conn_id = mConn.incr_id; switch (pos) { case POS_WEBSOCKET: - return ConnectionPayload.newInstance(PayloadChunk.ChunkType.WEBSOCKET); + return ConnectionPayload.newInstance(PayloadChunk.ChunkType.WEBSOCKET, conn_id); case POS_HTTP: - return ConnectionPayload.newInstance(PayloadChunk.ChunkType.HTTP); + return ConnectionPayload.newInstance(PayloadChunk.ChunkType.HTTP, conn_id); case POS_RAW_PAYLOAD: - return ConnectionPayload.newInstance(PayloadChunk.ChunkType.RAW); + return ConnectionPayload.newInstance(PayloadChunk.ChunkType.RAW, conn_id); case POS_OVERVIEW: default: - return new ConnectionOverview(); + return ConnectionOverview.newInstance(conn_id); } } @@ -293,6 +294,4 @@ public class ConnectionDetailsActivity extends BaseActivity implements Connectio if(mConn.status >= ConnectionDescriptor.CONN_STATUS_CLOSED) unregisterConnsListener(); } - - public ConnectionDescriptor getConn() { return mConn; } } diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionOverview.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionOverview.java index 238577a7..aaf65928 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionOverview.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionOverview.java @@ -25,6 +25,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -42,15 +43,16 @@ import androidx.fragment.app.Fragment; import com.emanuelef.remote_capture.AppsResolver; import com.emanuelef.remote_capture.CaptureService; +import com.emanuelef.remote_capture.ConnectionsRegister; import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.activities.ConnectionDetailsActivity; import com.emanuelef.remote_capture.model.AppDescriptor; import com.emanuelef.remote_capture.model.ConnectionDescriptor; -import com.emanuelef.remote_capture.model.Prefs; import com.haipq.android.flagkit.FlagImageView; public class ConnectionOverview extends Fragment implements ConnectionDetailsActivity.ConnUpdateListener { + private static final String TAG = "ConnectionOverview"; private ConnectionDetailsActivity mActivity; private ConnectionDescriptor mConn; private TableLayout mTable; @@ -70,11 +72,18 @@ public class ConnectionOverview extends Fragment implements ConnectionDetailsAct private ImageView mBlacklistedIp; private ImageView mBlacklistedHost; + public static ConnectionOverview newInstance(int conn_id) { + ConnectionOverview fragment = new ConnectionOverview(); + Bundle args = new Bundle(); + args.putInt("conn_id", conn_id); + fragment.setArguments(args); + return fragment; + } + @Override public void onAttach(@NonNull Context context) { super.onAttach(context); mActivity = (ConnectionDetailsActivity) context; - mConn = mActivity.getConn(); mActivity.addConnUpdateListener(this); } @@ -123,6 +132,17 @@ public class ConnectionOverview extends Fragment implements ConnectionDetailsAct mBlacklistedIp = view.findViewById(R.id.blacklisted_ip); mBlacklistedHost = view.findViewById(R.id.blacklisted_host); + Bundle args = getArguments(); + assert args != null; + ConnectionsRegister reg = CaptureService.requireConnsRegister(); + + mConn = reg.getConnById(args.getInt("conn_id")); + if(mConn == null) { + Log.e(TAG, "null connection"); + mActivity.finish(); + return; + } + view.findViewById(R.id.whois_ip).setOnClickListener(v -> { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://search.arin.net/rdap/?query=" + mConn.dst_ip)); Utils.startActivity(mActivity, intent); diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java index 612142d9..0cca1903 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionPayload.java @@ -21,6 +21,7 @@ package com.emanuelef.remote_capture.fragments; import android.content.Context; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -33,6 +34,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import com.emanuelef.remote_capture.CaptureService; +import com.emanuelef.remote_capture.ConnectionsRegister; import com.emanuelef.remote_capture.R; import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.activities.ConnectionDetailsActivity; @@ -42,6 +45,7 @@ import com.emanuelef.remote_capture.model.PayloadChunk; import com.emanuelef.remote_capture.views.EmptyRecyclerView; public class ConnectionPayload extends Fragment implements ConnectionDetailsActivity.ConnUpdateListener { + private static final String TAG = "ConnectionPayload"; private ConnectionDetailsActivity mActivity; private ConnectionDescriptor mConn; private PayloadAdapter mAdapter; @@ -51,10 +55,11 @@ public class ConnectionPayload extends Fragment implements ConnectionDetailsActi private boolean mJustCreated; private boolean mShowAsPrintable; - public static ConnectionPayload newInstance(PayloadChunk.ChunkType mode) { + public static ConnectionPayload newInstance(PayloadChunk.ChunkType mode, int conn_id) { ConnectionPayload fragment = new ConnectionPayload(); Bundle args = new Bundle(); args.putSerializable("mode", mode); + args.putInt("conn_id", conn_id); fragment.setArguments(args); return fragment; } @@ -63,7 +68,6 @@ public class ConnectionPayload extends Fragment implements ConnectionDetailsActi public void onAttach(@NonNull Context context) { super.onAttach(context); mActivity = (ConnectionDetailsActivity) context; - mConn = mActivity.getConn(); mActivity.addConnUpdateListener(this); } @@ -85,10 +89,16 @@ public class ConnectionPayload extends Fragment implements ConnectionDetailsActi public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { Bundle args = getArguments(); PayloadChunk.ChunkType mode; - if((args != null) && args.containsKey("mode")) - mode = (PayloadChunk.ChunkType) args.getSerializable("mode"); - else - mode = PayloadChunk.ChunkType.RAW; + assert args != null; + ConnectionsRegister reg = CaptureService.requireConnsRegister(); + mode = (PayloadChunk.ChunkType) args.getSerializable("mode"); + + mConn = reg.getConnById(args.getInt("conn_id")); + if(mConn == null) { + Log.e(TAG, "null connection"); + mActivity.finish(); + return; + } EmptyRecyclerView recyclerView = view.findViewById(R.id.payload); EmptyRecyclerView.MyLinearLayoutManager layoutMan = new EmptyRecyclerView.MyLinearLayoutManager(requireContext());