-
Notifications
You must be signed in to change notification settings - Fork 50
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Remove-External-File-Directory Permission #554
base: development
Are you sure you want to change the base?
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -159,23 +159,23 @@ public static Bitmap getBitMapFromLocalPath(String imageLocalPath) { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
public static String saveImageToInternalStorage(File file, Bitmap bitmapImage) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
FileOutputStream fos = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fos = new FileOutputStream(file); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Use the compress method on the BitMap object to write image to the OutputStream | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (Exception e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e.printStackTrace(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} finally { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (fos != null) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fos.close(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} catch (IOException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
e.printStackTrace(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return file.getAbsolutePath(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// FileOutputStream fos = null; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// fos = new FileOutputStream(file); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// // Use the compress method on the BitMap object to write image to the OutputStream | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// } catch (Exception e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// e.printStackTrace(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// } finally { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// if (fos != null) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// try { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// fos.close(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// } catch (IOException e) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// e.printStackTrace(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return ""; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Improve error handling and logging. Simply returning an empty string silently fails without any indication of what went wrong. Consider adding proper error handling: public static String saveImageToInternalStorage(File file, Bitmap bitmapImage) {
- return "";
+ Log.w(TAG, "Image storage operation skipped - functionality deprecated");
+ throw new UnsupportedOperationException(
+ "Image storage to external directory is no longer supported. " +
+ "Please use MediaStore API for Android 10+ or context.getFilesDir() for internal storage."
+ );
} 📝 Committable suggestion
Suggested change
💡 Codebase verification Returning empty string breaks image storage functionality across multiple components The verification reveals that returning an empty string from
Recommendation: public static String saveImageToInternalStorage(File file, Bitmap bitmapImage) {
if (file == null || bitmapImage == null) {
return null;
}
try (FileOutputStream fos = new FileOutputStream(file)) {
bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
return file.getAbsolutePath();
} catch (IOException e) {
Log.e(TAG, "Failed to save image", e);
return null;
}
} 🔗 Analysis chainCritical: Method contract violation introduces potential runtime errors. The changes to
Consider these alternatives: public static String saveImageToInternalStorage(File file, Bitmap bitmapImage) {
- return "";
+ if (file == null || bitmapImage == null) {
+ return null;
+ }
+ // If external storage is deprecated, use app-specific internal storage
+ File internalDir = context.getFilesDir();
+ File imageFile = new File(internalDir, file.getName());
+
+ try (FileOutputStream fos = new FileOutputStream(imageFile)) {
+ bitmapImage.compress(Bitmap.CompressFormat.PNG, 100, fos);
+ return imageFile.getAbsolutePath();
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to save image", e);
+ return null;
+ }
} Let's verify the usage of this method across the codebase: The results show that
Let's verify if these callers have any error handling for empty strings: 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Find all calls to saveImageToInternalStorage to assess impact
rg -l "saveImageToInternalStorage" | while read -r file; do
echo "=== $file ==="
rg -A 3 "saveImageToInternalStorage" "$file"
done
Length of output: 2092 Script: #!/bin/bash
# Check error handling in caller methods
echo "=== AppContactService.java ==="
rg -B 3 -A 5 "saveImageToInternalStorage.*\{" kommunicate/src/main/java/com/applozic/mobicomkit/contact/AppContactService.java
echo -e "\n=== FileClientService.java ==="
rg -B 3 -A 5 "saveImageToInternalStorage.*\{" kommunicate/src/main/java/com/applozic/mobicomkit/api/attachment/FileClientService.java
# Also check if there are any TextUtils.isEmpty checks right after the calls
echo -e "\n=== Empty string checks ==="
rg -B 2 "TextUtils\.isEmpty.*getLocalImageUrl|TextUtils\.isEmpty.*getLocalImageUri|TextUtils\.isEmpty.*getTopicLocalImageUri" kommunicate/src/main/java/com/applozic/mobicomkit/
Length of output: 3061 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Critical: Handle null return value from getFilePath.
The method now returns
null
without providing an alternative implementation. This could lead to NullPointerException in calling methods likeloadContactsvCard
andloadThumbnailImage
.Consider implementing proper error handling:
📝 Committable suggestion