diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4e93301..5ce53eb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,6 +23,10 @@ + + + = Build.VERSION_CODES.Q) { + // For Android 10 and above, access the 'Downloads' folder or create 'SysLogs' folder there + saveDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "SysLogs"); + } else { + // For Android 9 and below, you can use external storage directories directly + saveDirectory = new File(Environment.getExternalStorageDirectory(), "SysLogs"); + } + + // Create the directory if it doesn't exist + if (!saveDirectory.exists()) { + saveDirectory.mkdirs(); + } + + // Create a new file in the save directory + File savedLogFile = new File(saveDirectory, zipFile.getName()); + + // Copy the zipFile to the save directory + FileUtils.copyFile(zipFile, savedLogFile); + + // Notify the user with the correct path + Toast.makeText(getActivity(), "Logs saved to: " + savedLogFile.getAbsolutePath(), Toast.LENGTH_LONG).show(); + } catch (Exception e) { + Toast.makeText(getActivity(), "Failed to save logs: " + e.getMessage(), Toast.LENGTH_LONG).show(); + e.printStackTrace(); + } + } + /** * Called when the background log grabbing thread has a progress update * @param update diff --git a/app/src/main/java/com/tortel/syslog/utils/FileUtils.java b/app/src/main/java/com/tortel/syslog/utils/FileUtils.java index 841afca..c9153d2 100644 --- a/app/src/main/java/com/tortel/syslog/utils/FileUtils.java +++ b/app/src/main/java/com/tortel/syslog/utils/FileUtils.java @@ -18,6 +18,8 @@ package com.tortel.syslog.utils; import android.content.Context; +import android.os.Environment; +import android.os.Build; import android.os.Handler; import android.os.StatFs; import android.widget.Toast; @@ -26,6 +28,9 @@ import com.tortel.syslog.R; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.File; import eu.chainfire.libsuperuser.Shell; @@ -48,19 +53,51 @@ public static void cleanAllLogs(@NonNull final Context context) { @Override public void run() { final double startingSpace = getStorageFreeSpace(context); - String path = getStorageDir(context).getPath(); + String path = getRootLogDir(context).getAbsolutePath(); // Use getRootLogDir instead of getStorageDir path += "/*"; Shell.SH.run("rm -rf " + path); final double endingSpace = getStorageFreeSpace(context); Handler mainHandler = new Handler(context.getMainLooper()); + String finalPath = path; mainHandler.post(() -> { - Toast.makeText(context, context.getResources().getString(R.string.space_freed, - endingSpace - startingSpace), Toast.LENGTH_SHORT).show(); + // Calculate the space freed + double spaceFreed = endingSpace - startingSpace; + // Format the message for space freed + String formattedMessage = String.format(context.getResources().getString(R.string.space_freed), spaceFreed); + // Combine the space freed message with the storage path + String message = formattedMessage + ", logs stored at: " + finalPath; + // Display the Toast message + Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); }); } }).start(); } + /** + * Copy a file from source to destination + * + * @param sourceFile the source file + * @param destFile the destination file + * @throws IOException if an error occurs during copying + */ + public static void copyFile(File sourceFile, File destFile) throws IOException { + if (!destFile.exists()) { + destFile.createNewFile(); // Create destination file if it doesn't exist + } + + try (FileInputStream fis = new FileInputStream(sourceFile); + FileOutputStream fos = new FileOutputStream(destFile)) { + + byte[] buffer = new byte[1024]; + int length; + + // Read from source and write to destination + while ((length = fis.read(buffer)) > 0) { + fos.write(buffer, 0, length); + } + } + } + /** * Clean all uncompressed log files */ @@ -98,11 +135,22 @@ private static File getStorageDir(Context context) { * @return the working directory. This is a directory that will always exist */ public static @NonNull File getRootLogDir(Context context) { - File logDir = new File(getStorageDir(context).getAbsolutePath() + LOG_DIR); - if (!logDir.isDirectory()) { - logDir.mkdir(); + // For Android 11 and above, use public directory in scoped storage + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + // Define the path inside Downloads directory + File publicDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "Syslogs/Logs"); + if (!publicDir.exists()) { + publicDir.mkdirs(); // Create the directory if it doesn't exist + } + return publicDir; + } else { + // For Android 10 and below, use traditional external storage access + File publicDir = new File(Environment.getExternalStorageDirectory(), "Syslogs/Logs"); + if (!publicDir.exists()) { + publicDir.mkdirs(); // Create the directory if it doesn't exist + } + return publicDir; } - return logDir; } /** diff --git a/app/src/main/res/values/exception-details.xml b/app/src/main/res/values/exception-details.xml index 52a22f4..8804613 100644 --- a/app/src/main/res/values/exception-details.xml +++ b/app/src/main/res/values/exception-details.xml @@ -40,8 +40,8 @@ There was an unknown exception while running. Please submit a bug report, and include the SU implementation you use. - There was no application available to send a zip file. The logs have been saved, but please install or enable - an email application or cloud storage application to easily send the file. + There was no application available to send a zip file. The logs have been saved at Downloads Folder, + but please install or enable an email application or cloud storage application to easily send the file. Your primary storage does not have enough free space. You currently have %.1f MB free. SysLog can try to free space by cleaning old log files.