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
This commit is contained in:
emanuele-f 2022-06-04 11:50:34 +02:00
parent a18d39b78c
commit 25f7193051
3 changed files with 43 additions and 14 deletions

View File

@ -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; }
}

View File

@ -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);

View File

@ -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());