Merge pull request #3295 from zhanghai/patch-1

Truncate existing text files when writing.
This commit is contained in:
Vishal Nehra
2022-05-06 20:28:16 +05:30
committed by GitHub
3 changed files with 55 additions and 26 deletions
@@ -84,13 +84,13 @@ public class WriteTextFileCallable implements Callable<Unit> {
DocumentFile documentFile =
DocumentFile.fromSingleUri(AppConfig.getInstance(), fileAbstraction.uri);
if (documentFile != null && documentFile.exists() && documentFile.canWrite()) {
outputStream = contentResolver.openOutputStream(fileAbstraction.uri);
outputStream = contentResolver.openOutputStream(fileAbstraction.uri, "wt");
} else {
destFile = FileUtils.fromContentUri(fileAbstraction.uri);
outputStream = openFile(destFile, context.get());
}
} else {
outputStream = contentResolver.openOutputStream(fileAbstraction.uri);
outputStream = contentResolver.openOutputStream(fileAbstraction.uri, "wt");
}
break;
case FILE:
@@ -27,6 +27,30 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.robolectric.Shadows.shadowOf;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.amaze.filemanager.file_operations.exceptions.ShellNotRunningException;
import com.amaze.filemanager.file_operations.exceptions.StreamNotFoundException;
import com.amaze.filemanager.filesystem.EditableFileAbstraction;
import com.amaze.filemanager.filesystem.FileUtil;
import com.amaze.filemanager.filesystem.root.ConcatenateFileCommand;
import com.amaze.filemanager.shadows.ShadowContentResolver;
import com.amaze.filemanager.shadows.ShadowMultiDex;
import org.apache.ftpserver.util.IoUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadow.api.Shadow;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -38,31 +62,9 @@ import java.io.OutputStream;
import java.io.StringReader;
import java.nio.charset.StandardCharsets;
import org.apache.ftpserver.util.IoUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import com.amaze.filemanager.file_operations.exceptions.ShellNotRunningException;
import com.amaze.filemanager.file_operations.exceptions.StreamNotFoundException;
import com.amaze.filemanager.filesystem.EditableFileAbstraction;
import com.amaze.filemanager.filesystem.FileUtil;
import com.amaze.filemanager.filesystem.root.ConcatenateFileCommand;
import com.amaze.filemanager.shadows.ShadowMultiDex;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@RunWith(AndroidJUnit4.class)
@Config(
shadows = {ShadowMultiDex.class},
shadows = {ShadowMultiDex.class, ShadowContentResolver.class},
sdk = {JELLY_BEAN, KITKAT, P})
public class WriteTextFileCallableTest {
@@ -75,7 +77,8 @@ public class WriteTextFileCallableTest {
Context ctx = ApplicationProvider.getApplicationContext();
ContentResolver cr = ctx.getContentResolver();
ByteArrayOutputStream bout = new ByteArrayOutputStream();
shadowOf(cr).registerOutputStream(uri, bout);
ShadowContentResolver scr = Shadow.extract(cr);
scr.registerOutputStream(uri, bout);
WriteTextFileCallable task =
new WriteTextFileCallable(
@@ -0,0 +1,26 @@
package com.amaze.filemanager.shadows
import android.content.ContentResolver
import android.net.Uri
import org.robolectric.annotation.Implementation
import org.robolectric.annotation.Implements
import org.robolectric.shadows.ShadowContentResolver
import java.io.OutputStream
/**
* [ShadowContentResolver] implementation to include
* [ContentResolver.openOutputStream] with Uri and open mode arguments.
*
* @see ContentResolver.openOutputStream(uri, String)
*/
@Implements(ContentResolver::class)
class ShadowContentResolver : ShadowContentResolver() {
/**
* Implements [ContentResolver.openOutputStream] with open mode parameter.
*
* Simply delegate to one without open mode.
*/
@Implementation
fun openOutputStream(uri: Uri, mode: String): OutputStream? = super.openOutputStream(uri)
}