diff --git a/src/androidTest/java/com/owncloud/android/ui/activity/FolderPickerActivityIT.java b/src/androidTest/java/com/owncloud/android/ui/activity/FolderPickerActivityIT.java new file mode 100644 index 000000000000..70f29d288465 --- /dev/null +++ b/src/androidTest/java/com/owncloud/android/ui/activity/FolderPickerActivityIT.java @@ -0,0 +1,122 @@ +package com.owncloud.android.ui.activity; + +/* + * Nextcloud Android client application + * + * @author Kilian Périsset + * Copyright (C) 2019 Kilian Périsset (Infomaniak Network SA) + * Copyright (C) 2019 Nextcloud GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import com.owncloud.android.datamodel.OCFile; + +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.LargeTest; +import androidx.test.rule.ActivityTestRule; + +@RunWith(AndroidJUnit4.class) +@LargeTest +public class FolderPickerActivityIT { + @Rule + public ActivityTestRule activityRule = + new ActivityTestRule<>(FolderPickerActivity.class); + + @Test + public void getActivityFile() { + // Arrange + FolderPickerActivity targetActivity = activityRule.getActivity(); + OCFile origin = new OCFile("/test/file.test"); + origin.setRemotePath("/remotePath/test"); + + // Act + targetActivity.setFile(origin); + OCFile target = targetActivity.getFile(); + + // Assert + Assert.assertEquals(origin, target); + } + + @Test + public void getParentFolder_isNotRootFolder() { + // Arrange + FolderPickerActivity targetActivity = activityRule.getActivity(); + OCFile origin = new OCFile("/test/"); + origin.setFileId(1); + origin.setRemotePath("/test/"); + origin.setStoragePath("/test/"); + origin.setFolder(); + + // Act + targetActivity.setFile(origin); + OCFile target = targetActivity.getCurrentFolder(); + + // Assert + Assert.assertEquals(origin, target); + } + + @Test + public void getParentFolder_isRootFolder() { + // Arrange + FolderPickerActivity targetActivity = activityRule.getActivity(); + OCFile origin = new OCFile("/"); + origin.setFileId(1); + origin.setRemotePath("/"); + origin.setStoragePath("/"); + origin.setFolder(); + + // Act + targetActivity.setFile(origin); + OCFile target = targetActivity.getCurrentFolder(); + + // Assert + Assert.assertEquals(origin, target); + } + + @Test + public void nullFile() { + // Arrange + FolderPickerActivity targetActivity = activityRule.getActivity(); + OCFile rootFolder = targetActivity.getStorageManager().getFileByPath(OCFile.ROOT_PATH); + + // Act + targetActivity.setFile(null); + OCFile target = targetActivity.getCurrentFolder(); + + // Assert + Assert.assertEquals(rootFolder, target); + } + + @Test + public void getParentFolder() { + // Arrange + FolderPickerActivity targetActivity = activityRule.getActivity(); + OCFile origin = new OCFile("/test/file.test"); + origin.setRemotePath("/test/file.test"); + + OCFile target = new OCFile("/test/"); + + // Act + targetActivity.setFile(origin); + + // Assert + Assert.assertEquals(origin, target); + } +} diff --git a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java index 72953d250ae2..341231628afb 100644 --- a/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java +++ b/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java @@ -39,10 +39,11 @@ import android.view.View; import android.view.View.OnClickListener; +import com.google.android.material.button.MaterialButton; import com.nextcloud.client.di.Injectable; import com.nextcloud.client.preferences.AppPreferences; -import com.google.android.material.button.MaterialButton; import com.owncloud.android.R; +import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -60,6 +61,7 @@ import com.owncloud.android.utils.ErrorMessageAdapter; import com.owncloud.android.utils.ThemeUtils; +import java.io.File; import java.util.ArrayList; import javax.inject.Inject; @@ -195,8 +197,7 @@ protected void createFragments() { } /** - * Show a text message on screen view for notifying user if content is - * loading or folder is empty + * Show a text message on screen view for notifying user if content is loading or folder is empty */ private void setBackgroundText() { OCFileListFragment listFragment = getListOfFilesFragment(); @@ -249,8 +250,13 @@ public void startSyncFolderOperation(OCFile folder, boolean ignoreETag) { mSyncInProgress = true; // perform folder synchronization - RemoteOperation refreshFolderOperation = new RefreshFolderOperation(folder, currentSyncTime, false, - ignoreETag, getStorageManager(), getAccount(), getApplicationContext()); + RemoteOperation refreshFolderOperation = new RefreshFolderOperation(folder, + currentSyncTime, + false, + ignoreETag, + getStorageManager(), + getAccount(), + getApplicationContext()); refreshFolderOperation.execute(getAccount(), this, null, null); setIndeterminate(true); @@ -333,16 +339,22 @@ public boolean onOptionsItemSelected(MenuItem item) { } protected OCFile getCurrentFolder() { - OCFile file = getFile(); - if (file != null) { - if (file.isFolder()) { - return file; - } else if (getStorageManager() != null) { - String parentPath = file.getRemotePath().substring(0, file.getRemotePath().lastIndexOf(file.getFileName())); - return getStorageManager().getFileByPath(parentPath); + OCFile currentFile = getFile(); + OCFile finalFolder = null; + FileDataStorageManager storageManager = getStorageManager(); + + // If the file is null, take the root folder to avoid any error in functions depending on this one + if (currentFile != null) { + if (currentFile.isFolder()) { + finalFolder = currentFile; + } else if (currentFile.getRemotePath() != null) { + String parentPath = new File(currentFile.getRemotePath()).getParent(); + finalFolder = storageManager.getFileByPath(parentPath); } + } else { + finalFolder = storageManager.getFileByPath(OCFile.ROOT_PATH); } - return null; + return finalFolder; } public void refreshListOfFilesFragment(boolean fromSearch) { @@ -443,8 +455,7 @@ public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationRe /** - * Updates the view associated to the activity after the finish of an operation trying - * to create a new folder. + * Updates the view associated to the activity after the finish of an operation trying to create a new folder. * * @param operation Creation operation performed. * @param result Result of the creation. @@ -495,8 +506,9 @@ public void onReceive(Context context, Intent intent) { if (currentDir == null) { // current folder was removed from the server - DisplayUtils.showSnackMessage(getActivity(), R.string.sync_current_folder_was_removed, - getCurrentFolder().getFileName()); + DisplayUtils.showSnackMessage(getActivity(), + R.string.sync_current_folder_was_removed, + getCurrentFolder().getFileName()); browseToRoot(); } else { if (currentFile == null && !getFile().isFolder()) {