From f5e4a3ba5d9ed8e5dde86504969d6f092103a555 Mon Sep 17 00:00:00 2001 From: jim-daf Date: Sat, 2 May 2026 22:34:57 +0200 Subject: [PATCH] Guard remaining mListener accesses against null (refs #25) Commit a5ec6be (Aug 2021) wrapped most mListener.hppManagerFailedWithError calls in onError(), which null-checks mListener. Three direct accesses were missed and can still NPE in the same crash family reported in #25 when the fragment is detached or onDestroy fires twice: * onDestroy(): mListener.hppManagerCancelled() * WebView back-key OnKeyListener: mListener.hppManagerCancelled() * postHPPData success callback: mListener.getClass().getDeclaredMethods() Each is now guarded by an explicit null check, mirroring the defensive pattern already used in onSuccess()/onError(). --- .../java/com/realexpayments/hpp/HPPManagerFragment.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rxp-hpp-android/src/main/java/com/realexpayments/hpp/HPPManagerFragment.java b/rxp-hpp-android/src/main/java/com/realexpayments/hpp/HPPManagerFragment.java index c83ce81..47b21f4 100644 --- a/rxp-hpp-android/src/main/java/com/realexpayments/hpp/HPPManagerFragment.java +++ b/rxp-hpp-android/src/main/java/com/realexpayments/hpp/HPPManagerFragment.java @@ -141,7 +141,7 @@ private String getRelativePathEncoded(String urlString) { @Override public void onDestroy() { - if (!isResultReceived) { + if (!isResultReceived && mListener != null) { mListener.hppManagerCancelled(); } mListener = null; @@ -165,7 +165,9 @@ public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { if (!isResultReceived) { webView.goBack(); - mListener.hppManagerCancelled(); + if (mListener != null) { + mListener.hppManagerCancelled(); + } isResultReceived = true; } return false; @@ -322,6 +324,9 @@ public void callbackHandler(String data, String url) { @Override public void success(Response s, Response response) { String msg = new String(((TypedByteArray) response.getBody()).getBytes()); + if (mListener == null) { + return; + } Method[] methods = mListener.getClass().getDeclaredMethods(); for (int i = 0; i < methods.length; i++) { if (methods[i].getName().equals(HPPManagerListener.HPP_MANAGER_COMPLETED_WITH_RESULT)) {