package com.openfarmanager.android.filesystem.actions; import android.net.Uri; import android.provider.DocumentsContract; import com.openfarmanager.android.App; import com.openfarmanager.android.model.TaskStatusEnum; import com.openfarmanager.android.model.exeptions.SdcardPermissionException; import com.openfarmanager.android.utils.StorageUtils; import com.openfarmanager.android.utils.SystemUtils; import java.io.File; import static com.openfarmanager.android.model.TaskStatusEnum.*; import static com.openfarmanager.android.utils.StorageUtils.checkForPermissionAndGetBaseUri; import static com.openfarmanager.android.utils.StorageUtils.checkUseStorageApi; public class RenameTask { private String mDestinationFileName; private File mSrcFile; public RenameTask(File srcFile, String destinationFileName) { mSrcFile = srcFile; mDestinationFileName = destinationFileName; } public TaskStatusEnum execute() { if (mDestinationFileName == null || mDestinationFileName.trim().equals("")) { return ERROR_WRONG_DESTINATION_FILE_NAME; } if (mSrcFile == null) { return ERROR_RENAME_FILE; } String sdCardPath = SystemUtils.getExternalStorage(mSrcFile.getAbsolutePath()); Uri uri = null; boolean checkUseStorageApi = checkUseStorageApi(sdCardPath); try { if (checkUseStorageApi) { uri = checkForPermissionAndGetBaseUri(); } } catch (SdcardPermissionException e) { return ERROR_STORAGE_PERMISSION_REQUIRED; } String destinationFilePath = mSrcFile.getParent() + File.separator + mDestinationFileName; if (checkUseStorageApi) { return DocumentsContract.renameDocument(App.sInstance.getContentResolver(), StorageUtils.getDestinationFileUri(uri, sdCardPath, mSrcFile.getAbsolutePath(), true), mDestinationFileName) != null ? OK : ERROR_RENAME_FILE; } else if (mSrcFile.getParentFile().canWrite()) { // due to stupid behaviour of 'renameTo' method we will do some tricks File newFile = new File(destinationFilePath); File tempFile = new File(mSrcFile.getParent() + File.separator + mDestinationFileName + "_____"); // rename temp file to destination file return mSrcFile.renameTo(tempFile) && tempFile.renameTo(newFile) ? OK : ERROR_RENAME_FILE; } else { return RootTask.rename(mSrcFile.getAbsolutePath(), destinationFilePath) ? OK : ERROR_RENAME_FILE; } } }