diff --git a/android/app/src/main/java/app/timesafari/MainActivity.java b/android/app/src/main/java/app/timesafari/MainActivity.java index 80bddfcf..387b6ac9 100644 --- a/android/app/src/main/java/app/timesafari/MainActivity.java +++ b/android/app/src/main/java/app/timesafari/MainActivity.java @@ -93,6 +93,8 @@ public class MainActivity extends BridgeActivity { String action = intent.getAction(); String type = intent.getType(); + boolean handled = false; + // Handle single image share if (Intent.ACTION_SEND.equals(action) && type != null && type.startsWith("image/")) { Uri imageUri; @@ -108,6 +110,7 @@ public class MainActivity extends BridgeActivity { if (imageUri != null) { String fileName = intent.getStringExtra(Intent.EXTRA_TEXT); processSharedImage(imageUri, fileName); + handled = true; } } // Handle multiple images share (we'll just process the first one) @@ -124,24 +127,54 @@ public class MainActivity extends BridgeActivity { } if (imageUris != null && !imageUris.isEmpty()) { processSharedImage(imageUris.get(0), null); + handled = true; } } + + // Clear the intent after handling to release URI permissions and prevent + // network issues in WebView. This is critical for preventing the WebView + // from losing network connectivity after processing shared content. + if (handled) { + intent.setAction(null); + intent.setData(null); + intent.removeExtra(Intent.EXTRA_STREAM); + intent.setType(null); + setIntent(new Intent()); + Log.d(TAG, "Cleared share intent after processing"); + } } /** * Process a shared image: read it, convert to base64, and write to temp file + * Uses try-with-resources to ensure proper stream cleanup and prevent network issues */ private void processSharedImage(Uri imageUri, String fileName) { - try { - // Read image data from URI - InputStream inputStream = getContentResolver().openInputStream(imageUri); + // Extract filename from URI or use default (do this before opening streams) + String actualFileName = fileName; + if (actualFileName == null || actualFileName.isEmpty()) { + String path = imageUri.getPath(); + if (path != null) { + int lastSlash = path.lastIndexOf('/'); + if (lastSlash >= 0 && lastSlash < path.length() - 1) { + actualFileName = path.substring(lastSlash + 1); + } + } + if (actualFileName == null || actualFileName.isEmpty()) { + actualFileName = "shared-image.jpg"; + } + } + + // Use try-with-resources to ensure streams are properly closed + // This is critical to prevent resource leaks that can affect WebView networking + try (InputStream inputStream = getContentResolver().openInputStream(imageUri); + ByteArrayOutputStream buffer = new ByteArrayOutputStream()) { + if (inputStream == null) { Log.e(TAG, "Failed to open input stream for shared image"); return; } // Read image bytes - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); byte[] data = new byte[8192]; int nRead; while ((nRead = inputStream.read(data, 0, data.length)) != -1) { @@ -149,26 +182,10 @@ public class MainActivity extends BridgeActivity { } buffer.flush(); byte[] imageBytes = buffer.toByteArray(); - inputStream.close(); // Convert to base64 String base64String = Base64.encodeToString(imageBytes, Base64.NO_WRAP); - // Extract filename from URI or use default - String actualFileName = fileName; - if (actualFileName == null || actualFileName.isEmpty()) { - String path = imageUri.getPath(); - if (path != null) { - int lastSlash = path.lastIndexOf('/'); - if (lastSlash >= 0 && lastSlash < path.length() - 1) { - actualFileName = path.substring(lastSlash + 1); - } - } - if (actualFileName == null || actualFileName.isEmpty()) { - actualFileName = "shared-image.jpg"; - } - } - // Store in SharedPreferences for plugin to read storeSharedImageInPreferences(base64String, actualFileName);