Skip to content

Commit 7552955

Browse files
committed
Scrolling works in a large directory
1 parent b618aba commit 7552955

7 files changed

Lines changed: 253 additions & 203 deletions

File tree

AndroidFilePickerLightLibrary/src/main/java/com/maxieds/androidfilepickerlightlibrary/BasicFileProvider.java

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,18 @@ public int setFilesListLength(int nextLength) {
8585
return activeFilesListLength;
8686
}
8787

88+
private boolean updateDocsQueryFilesList;
89+
public void updateQueryFilesList() { updateDocsQueryFilesList = true; }
90+
public void noUpdateQueryFilesList() { updateDocsQueryFilesList = false; }
91+
92+
private FileFilter.FileFilterBase customFileFilter;
93+
public void setCustomFileFilter(FileFilter.FileFilterBase filterObj) { customFileFilter = filterObj; }
94+
95+
private FileFilter.FileItemsSortFunc customFolderSort;
96+
public void setCustomFolderSort(FileFilter.FileItemsSortFunc sortComparisonObj) { customFolderSort = sortComparisonObj; }
97+
8898
private File baseDirPath;
99+
private File[] docsQueryFilesList;
89100

90101
/*
91102
* Other storage related calls in the Context class still supported to look at later:
@@ -104,8 +115,7 @@ public int setFilesListLength(int nextLength) {
104115
*/
105116
private boolean setLegacyBaseFolderByName(String namedSubFolder) {
106117
String userPathSep = FileUtils.FILE_PATH_SEPARATOR;
107-
int pathSepCharCount = userPathSep.length();
108-
String storageRelPath = "/storage/self/primary" + userPathSep;
118+
String storageRelPath = "/storage/self/primary" + (namedSubFolder.length() > 0 ? userPathSep : "");
109119
//String storageRelPath = Environment.getExternalStorageDirectory() + userPathSep;
110120
String absFullFolderPath = String.format(Locale.getDefault(), "%s%s", storageRelPath, namedSubFolder);
111121
File nextFileByPath = new File(absFullFolderPath);
@@ -119,15 +129,13 @@ private boolean setLegacyBaseFolderByName(String namedSubFolder) {
119129

120130
public void selectBaseDirectoryByType(FileChooserBuilder.BaseFolderPathType baseFolderType) {
121131
Context appCtx = FileChooserActivity.getInstance();
122-
File nextFileByPath = null;
123132
switch(baseFolderType) {
124133
case BASE_PATH_TYPE_FILES_DIR:
125-
case BASE_PATH_DEFAULT:
126-
case BASE_PATH_SECONDARY_STORAGE:
127134
baseDirPath = appCtx.getFilesDir();
128135
break;
129-
case BASE_PATH_TYPE_CACHE_DIR:
130-
baseDirPath = appCtx.getCacheDir();
136+
case BASE_PATH_DEFAULT:
137+
case BASE_PATH_SECONDARY_STORAGE:
138+
setLegacyBaseFolderByName("");
131139
break;
132140
case BASE_PATH_TYPE_EXTERNAL_FILES_DOWNLOADS:
133141
baseDirPath = appCtx.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
@@ -157,10 +165,6 @@ public void selectBaseDirectoryByType(FileChooserBuilder.BaseFolderPathType base
157165
baseDirPath = appCtx.getExternalFilesDir(Environment.DIRECTORY_SCREENSHOTS);
158166
setLegacyBaseFolderByName("Pictures/Screenshots");
159167
break;
160-
case BASE_PATH_TYPE_EXTERNAL_CACHE_DIR:
161-
case BASE_PATH_TYPE_SDCARD:
162-
baseDirPath = appCtx.getExternalCacheDir();
163-
break;
164168
case BASE_PATH_TYPE_USER_DATA_DIR:
165169
baseDirPath = appCtx.getDataDir();
166170
break;
@@ -175,6 +179,8 @@ public void selectBaseDirectoryByType(FileChooserBuilder.BaseFolderPathType base
175179
public boolean onCreate() {
176180
if(fileProviderStaticInst == null) {
177181
fileProviderStaticInst = this;
182+
updateDocsQueryFilesList = false;
183+
docsQueryFilesList = null;
178184
}
179185
if(FileChooserActivity.getInstance() != null) {
180186
selectBaseDirectoryByType(FileChooserBuilder.BaseFolderPathType.BASE_PATH_DEFAULT);
@@ -326,20 +332,30 @@ public Cursor queryDocument(String documentId, String[] projection) throws FileN
326332
@Override
327333
public Cursor queryChildDocuments(String parentDocumentId, String[] projection,
328334
String sortOrder) throws FileNotFoundException {
329-
final MatrixCursor mcResult = new MatrixCursor(resolveDocumentProjection(projection));
330-
final File parent = getFileForDocId(parentDocumentId);
331-
File[] filesList = parent.listFiles(); // ??? TODO : Can set a Java FilenameFilter here ... ???
332-
if(filesList.length == 0) {
333-
return mcResult;
335+
MatrixCursor mcResult = new MatrixCursor(resolveDocumentProjection(projection)); // ??? TODO: was previously marked as final ???
336+
if(updateDocsQueryFilesList || docsQueryFilesList == null) {
337+
final File parent = getFileForDocId(parentDocumentId);
338+
if(customFileFilter != null) {
339+
docsQueryFilesList = parent.listFiles(customFileFilter);
340+
}
341+
else {
342+
docsQueryFilesList = parent.listFiles();
343+
}
344+
if (docsQueryFilesList.length == 0) {
345+
return mcResult;
346+
}
347+
if(customFolderSort != null) {
348+
docsQueryFilesList = customFolderSort.sortFileItemsList(docsQueryFilesList);
349+
}
334350
}
335351
int startFileIndex = getFilesStartIndex();
336352
int lastFileIndex = startFileIndex + getFilesListLength();
337-
if(lastFileIndex >= filesList.length) {
338-
lastFileIndex = filesList.length - 1;
353+
if(lastFileIndex >= docsQueryFilesList.length) {
354+
lastFileIndex = docsQueryFilesList.length - 1;
339355
startFileIndex = Math.max(0, lastFileIndex - getFilesListLength());
340356
}
341357
int curFileIndex = 0;
342-
for(File file : filesList) {
358+
for(File file : docsQueryFilesList) {
343359
if(curFileIndex++ < startFileIndex) {
344360
continue;
345361
}

AndroidFilePickerLightLibrary/src/main/java/com/maxieds/androidfilepickerlightlibrary/DisplayAdapters.java

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,15 @@ public FileListAdapter(List<String> nextFileListData, List<DisplayTypes.FileType
4747
this.fileListData.addAll(nextFileListData);
4848
this.fileItemsData = new ArrayList<DisplayTypes.FileType>();
4949
this.fileItemsData.addAll(nextFileItemsData);
50-
//this.setHasStableIds(true);
50+
this.setHasStableIds(false); // TODO ???
51+
notifyDataSetChanged();
52+
}
53+
54+
public void reloadDataSets(List<String> nextDataSet, List<DisplayTypes.FileType> nextFileItemsData) {
55+
fileListData.clear();
56+
fileListData.addAll(nextDataSet);
57+
fileItemsData.clear();
58+
fileItemsData.addAll(nextFileItemsData);
5159
notifyDataSetChanged();
5260
}
5361

@@ -65,7 +73,7 @@ public void onBindViewHolder(BaseViewHolder bvHolder, int posIndex) {
6573
//Log.i(LOGTAG, String.format(Locale.getDefault(), "onBindViewHolder @ %d -- %s", posIndex, bvHolder.getDisplayText().getText()));
6674
if(!fileItemsData.isEmpty()) {
6775
DisplayTypes.FileType fileItem = fileItemsData.get(posIndex);
68-
bvHolder.setFileItemData(fileItem);
76+
fileItem.setLayoutContainer(bvHolder.getMainViewLayoutContainer());
6977
View viewItemContainer = bvHolder.getMainViewLayoutContainer();
7078
DisplayFragments.FileListItemFragment.resetLayout(viewItemContainer, fileItem, posIndex);
7179
}
@@ -96,9 +104,7 @@ public int getItemCount() {
96104
public static class BaseViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener, RecyclerView.OnItemTouchListener {
97105

98106
private View fileItemContainerView;
99-
public View iconView;
100107
public TextView displayText;
101-
public DisplayTypes.FileType fileItem;
102108

103109
private GestureDetector gestureDetector = new GestureDetector(FileChooserActivity.getInstance(), new GestureDetector.SimpleOnGestureListener() {
104110
@Override
@@ -121,62 +127,56 @@ public BaseViewHolder(View v) {
121127
fileItemContainerView = v;
122128
v.setOnClickListener(this);
123129
v.setOnLongClickListener(this);
124-
//iconView = v.findViewById(R.id.fileTypeIcon);
125130
displayText = (TextView) v.findViewById(R.id.fileEntryBaseName);
126131
}
127132

128-
public void setFileItemData(DisplayTypes.FileType storedFileItem) {
129-
fileItem = storedFileItem;
130-
}
131-
132-
public DisplayTypes.FileType getFileItemReference() {
133-
return fileItem;
134-
}
135-
136133
public TextView getDisplayText() { return displayText; }
137134

138135
public View getMainViewLayoutContainer() { return fileItemContainerView; }
139136

140137
public boolean performNewFileItemClick(DisplayTypes.FileType fileItem) {
141-
if(fileItem.getLayoutContainer() != null) {
138+
if(fileItem != null && fileItem.getLayoutContainer() != null) {
142139
return performNewFileItemClick(fileItem.getLayoutContainer().findViewById(R.id.fileSelectCheckBox), fileItem);
143140
}
144141
return false;
145142
}
146143

147144
public static boolean performNewFileItemClick(CheckBox cbView, DisplayTypes.FileType fileItem) {
148-
if(fileItem == null) {
145+
if(cbView == null || fileItem == null) {
149146
return false;
150147
}
151148
boolean isDir = fileItem.isDirectory();
152149
if(!isDir && !DisplayFragments.getInstance().allowSelectFiles) {
153150
Log.i(LOGTAG, "Blocking file item selection I");
151+
cbView.setChecked(false);
154152
return false;
155153
}
156154
else if(isDir && !DisplayFragments.getInstance().allowSelectFolders) {
157155
Log.i(LOGTAG, "Blocking file item selection II");
156+
cbView.setChecked(false);
158157
return false;
159158
}
160-
CheckBox selectionMarker = cbView;
161159
if(!cbView.isEnabled()) {
160+
cbView.setChecked(false);
162161
return false;
163162
}
164163
if(fileItem.isChecked()) {
165164
// Deselect: uncheck GUI widget item and remove the fileItem from the active selections list:
166165
fileItem.setChecked(false);
167-
selectionMarker.setChecked(false);
168-
selectionMarker.setEnabled(true);
166+
cbView.setChecked(false);
167+
cbView.setEnabled(true);
169168
DisplayFragments.getInstance().activeSelectionsList.remove(fileItem);
170169
DisplayFragments.getInstance().curSelectionCount--;
171170
Log.i(LOGTAG, "DE-Selected next checkbox (file item)");
172171
return true;
173172
}
174173
else if(DisplayFragments.getInstance().curSelectionCount >= DisplayFragments.getInstance().maxAllowedSelections) {
174+
cbView.setChecked(false);
175175
return false;
176176
}
177177
fileItem.setChecked(true);
178-
selectionMarker.setChecked(true);
179-
selectionMarker.setEnabled(true);
178+
cbView.setChecked(true);
179+
cbView.setEnabled(true);
180180
DisplayFragments.getInstance().activeSelectionsList.add(fileItem);
181181
DisplayFragments.getInstance().curSelectionCount++;
182182
Log.i(LOGTAG, "Selected next checkbox (file item)");
@@ -186,6 +186,11 @@ else if(DisplayFragments.getInstance().curSelectionCount >= DisplayFragments.get
186186
@Override
187187
public void onClick(View v) {
188188
Log.i(LOGTAG, "onClick");
189+
int fileItemPosIndex = DisplayFragments.getInstance().findFileItemIndexByLayout(v);
190+
if(fileItemPosIndex < 0) {
191+
return;
192+
}
193+
DisplayTypes.FileType fileItem = DisplayFragments.getInstance().activeFileItemsDataList.get(fileItemPosIndex);
189194
if(fileItem != null && (!fileItem.isDirectory() || DisplayFragments.getInstance().allowSelectFolders)) {
190195
if(performNewFileItemClick(fileItem)) {
191196
String filePathType = fileItem.isDirectory() ? "DIR" : "FILE";
@@ -198,7 +203,12 @@ public void onClick(View v) {
198203
@Override
199204
public boolean onLongClick(View v) {
200205
Log.i(LOGTAG, "onLongClick");
201-
if(fileItem != null && !fileItem.isDirectory()) {
206+
int fileItemPosIndex = DisplayFragments.getInstance().findFileItemIndexByLayout(v);
207+
if(fileItemPosIndex < 0) {
208+
return false;
209+
}
210+
DisplayTypes.FileType fileItem = DisplayFragments.getInstance().activeFileItemsDataList.get(fileItemPosIndex);
211+
if(fileItem == null || !fileItem.isDirectory()) {
202212
if(performNewFileItemClick(fileItem)) {
203213
String displaySelectMsg = String.format(Locale.getDefault(), "Selected FILE \"%s\".", fileItem.getBaseName());
204214
DisplayUtils.displayToastMessageShort(displaySelectMsg);
@@ -214,7 +224,6 @@ public boolean onLongClick(View v) {
214224
}
215225
DisplayTypes.DirectoryResultContext workingFolder = DisplayFragments.getInstance().pathHistoryStack.peek();
216226
DisplayFragments.getInstance().pathHistoryStack.push(nextFolder);
217-
int fileItemPosIndex = DisplayFragments.getInstance().activeFileItemsDataList.lastIndexOf(fileItem);
218227
if(workingFolder == null) {
219228
nextFolder.loadNextFolderAtIndex(fileItemPosIndex, true);
220229
DisplayFragments.getInstance().descendIntoNextDirectory(true);

0 commit comments

Comments
 (0)