Merge pull request #9920 from nextcloud/fix/autoupload-select-folder

Fix folder selection in custom autoupload folders
This commit is contained in:
Álvaro Brey 2022-03-11 15:11:24 +01:00 committed by GitHub
commit d4d18307b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 114 additions and 23 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -21,20 +21,83 @@
*/
package com.owncloud.android.ui.activity
import android.content.Intent
import androidx.test.espresso.intent.rule.IntentsTestRule
import com.nextcloud.client.GrantStoragePermissionRule
import com.owncloud.android.AbstractIT
import com.owncloud.android.utils.FileStorageUtils
import com.owncloud.android.utils.ScreenshotTest
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import java.io.File
class UploadFilesActivityIT : AbstractIT() {
@get:Rule
var activityRule = IntentsTestRule(UploadFilesActivity::class.java, true, false)
@get:Rule
var permissionRule = GrantStoragePermissionRule.grant()
private val directories = listOf("A", "B", "C", "D")
.map { File("${FileStorageUtils.getTemporalPath(account.name)}${File.separator}$it") }
@Before
fun setUp() {
directories.forEach { it.mkdirs() }
}
@After
fun tearDown() {
directories.forEach { it.deleteRecursively() }
}
@Test
// @ScreenshotTest // TODO re-enable and make sure that folder content on emulator is the same on all devices
@ScreenshotTest
fun noneSelected() {
val sut: UploadFilesActivity = activityRule.launchActivity(null)
sut.runOnUiThread {
sut.fileListFragment.setFiles(
directories +
listOf(
File("1.txt"),
File("2.pdf"),
File("3.mp3")
)
)
}
waitForIdleSync()
screenshot(sut)
}
@Test
@ScreenshotTest
fun localFolderPickerMode() {
val sut: UploadFilesActivity = activityRule.launchActivity(
Intent().apply {
putExtra(
UploadFilesActivity.KEY_LOCAL_FOLDER_PICKER_MODE,
true
)
putExtra(
UploadFilesActivity.REQUEST_CODE_KEY,
FileDisplayActivity.REQUEST_CODE__SELECT_FILES_FROM_FILE_SYSTEM
)
}
)
sut.runOnUiThread {
sut.fileListFragment.setFiles(
directories
)
}
waitForIdleSync()
screenshot(sut)
}

View file

@ -70,6 +70,7 @@ import java.util.List;
import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.SearchView;
import androidx.core.view.MenuItemCompat;
@ -117,6 +118,12 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
private Spinner mBehaviourSpinner;
private MaterialButton uploadButton;
@VisibleForTesting
public LocalFileListFragment getFileListFragment() {
return mFileListFragment;
}
/**
* Helper to launch the UploadFilesActivity for which you would like a result when it finished. Your
* onActivityResult() method will be called with the given requestCode.
@ -189,7 +196,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
uploadButton = findViewById(R.id.upload_files_btn_upload);
ThemeButtonUtils.colorPrimaryButton(uploadButton, this);
uploadButton.setOnClickListener(this);
uploadButton.setEnabled(false);
uploadButton.setEnabled(mLocalFolderPickerMode);
int localBehaviour = preferences.getUploaderBehaviour();
@ -458,7 +465,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
private void updateUploadButtonActive() {
final boolean anySelected = mFileListFragment.getCheckedFilesCount() > 0;
uploadButton.setEnabled(anySelected);
uploadButton.setEnabled(anySelected || mLocalFolderPickerMode);
}
private void setSelectAllMenuItem(MenuItem selectAll, boolean checked) {
@ -600,7 +607,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
*/
@Override
public void onFileClick(File file) {
uploadButton.setEnabled(mFileListFragment.getCheckedFilesCount() > 0);
updateUploadButtonActive();
boolean selectAll = mFileListFragment.getCheckedFilesCount() == mFileListFragment.getFilesCount();
setSelectAllMenuItem(mOptionsMenu.findItem(R.id.action_select_all), selectAll);

View file

@ -54,6 +54,7 @@ import java.util.Set;
import java.util.concurrent.Executors;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.recyclerview.widget.RecyclerView;
/**
@ -159,31 +160,34 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
}
if (file != null) {
File finalFile = file;
LocalFileListGridImageViewHolder gridViewHolder = (LocalFileListGridImageViewHolder) holder;
// checkbox
if (isCheckedFile(file)) {
gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources()
.getColor(R.color.selected_item_background));
gridViewHolder.checkbox.setImageDrawable(
ThemeDrawableUtils.tintDrawable(R.drawable.ic_checkbox_marked,
ThemeColorUtils.primaryColor(mContext)));
} else {
if (mLocalFolderPicker) {
gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources().getColor(R.color.bg_default));
gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_blank_outline);
gridViewHolder.checkbox.setVisibility(View.GONE);
} else {
gridViewHolder.checkbox.setVisibility(View.VISIBLE);
if (isCheckedFile(file)) {
gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources()
.getColor(R.color.selected_item_background));
gridViewHolder.checkbox.setImageDrawable(
ThemeDrawableUtils.tintDrawable(R.drawable.ic_checkbox_marked,
ThemeColorUtils.primaryColor(mContext)));
} else {
gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources().getColor(R.color.bg_default));
gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_blank_outline);
}
gridViewHolder.checkbox.setOnClickListener(v -> localFileListFragmentInterface
.onItemCheckboxClicked(finalFile));
}
gridViewHolder.thumbnail.setTag(file.hashCode());
setThumbnail(file, gridViewHolder.thumbnail, mContext);
gridViewHolder.checkbox.setVisibility(View.VISIBLE);
File finalFile = file;
gridViewHolder.itemLayout.setOnClickListener(v -> localFileListFragmentInterface
.onItemClicked(finalFile));
gridViewHolder.checkbox.setOnClickListener(v -> localFileListFragmentInterface
.onItemCheckboxClicked(finalFile));
.onItemClicked(finalFile));
if (holder instanceof LocalFileListItemViewHolder) {
LocalFileListItemViewHolder itemViewHolder = (LocalFileListItemViewHolder) holder;
@ -521,4 +525,14 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
footerText = itemView.findViewById(R.id.footerText);
}
}
@VisibleForTesting
public void setFiles(List<File> newFiles) {
mFiles = newFiles;
mFilesAll = new ArrayList<>();
mFilesAll.addAll(mFiles);
notifyDataSetChanged();
localFileListFragmentInterface.setLoading(false);
}
}

View file

@ -41,10 +41,12 @@ import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileSortOrder;
import java.io.File;
import java.util.List;
import javax.inject.Inject;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
@ -377,13 +379,18 @@ public class LocalFileListFragment extends ExtendedListFragment implements
// ugly hack because setEmptyListLoadingMessage also uses a handler and there's a race condition otherwise
new Handler().post(() -> {
mAdapter.notifyDataSetChanged();
if(mAdapter.getFilesCount() == 0){
if (mAdapter.getFilesCount() == 0) {
setEmptyListMessage(SearchType.NO_SEARCH);
}
});
}
}
@VisibleForTesting
public void setFiles(List<File> newFiles) {
mAdapter.setFiles(newFiles);
}
/**
* Interface to implement by any Activity that includes some instance of LocalFileListFragment
*/

View file

@ -1 +1 @@
626
627

View file

@ -1,2 +1,2 @@
DO NOT TOUCH; GENERATED BY DRONE
<span class="mdl-layout-title">Lint Report: 92 warnings</span>
<span class="mdl-layout-title">Lint Report: 93 warnings</span>