-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ignore image-media folders that have no-images _or_ seem to be music …
…albums (just a single cover art image) block detection notification and hide in lists related to #3239 Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
- Loading branch information
1 parent
501eb7d
commit d4bcba2
Showing
4 changed files
with
260 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/* | ||
* Nextcloud Android client application | ||
* | ||
* @author Andy Scherzinger | ||
* Copyright (C) 2020 Andy Scherzinger | ||
* | ||
* 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 <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
package com.owncloud.android.utils; | ||
|
||
import com.owncloud.android.lib.resources.files.FileUtils; | ||
|
||
import androidx.annotation.NonNull; | ||
import androidx.annotation.Nullable; | ||
|
||
public final class FileUtil { | ||
|
||
private FileUtil() { | ||
// utility class -> private constructor | ||
} | ||
|
||
public static @NonNull String getFilenameFromPathString(@Nullable String filePath) { | ||
if (filePath != null) { | ||
return filePath.substring(filePath.lastIndexOf(FileUtils.PATH_SEPARATOR) + 1); | ||
} else { | ||
return ""; | ||
} | ||
} | ||
} |
202 changes: 202 additions & 0 deletions
202
src/main/java/com/owncloud/android/utils/SyncedFolderUtils.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,202 @@ | ||
/* | ||
* Nextcloud Android client application | ||
* | ||
* @author Andy Scherzinger | ||
* Copyright (C) 2020 Andy Scherzinger | ||
* | ||
* 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 <http://www.gnu.org/licenses/>. | ||
*/ | ||
package com.owncloud.android.utils; | ||
|
||
import com.owncloud.android.datamodel.MediaFolder; | ||
import com.owncloud.android.datamodel.MediaFolderType; | ||
import com.owncloud.android.datamodel.SyncedFolder; | ||
|
||
import java.io.File; | ||
import java.util.Arrays; | ||
import java.util.HashSet; | ||
import java.util.List; | ||
import java.util.Locale; | ||
import java.util.Set; | ||
|
||
import androidx.annotation.Nullable; | ||
|
||
/** | ||
* Utility class with methods for processing synced folders. | ||
*/ | ||
public final class SyncedFolderUtils { | ||
public static final String[] DISQUALIFIED_MEDIA_DETECTION_SOURCE = new String[]{ | ||
"cover.jpg", "cover.jpeg", | ||
"folder.jpg", "folder.jpeg" | ||
}; | ||
public static final Set<String> DISQUALIFIED_MEDIA_DETECTION_SET = | ||
new HashSet<>(Arrays.asList(DISQUALIFIED_MEDIA_DETECTION_SOURCE)); | ||
public static final int SINGLE_FILE = 1; | ||
|
||
private SyncedFolderUtils() { | ||
// utility class -> private constructor | ||
} | ||
|
||
/** | ||
* analyzes a given media folder if its content qualifies for the folder to be handled as a media folder. | ||
* | ||
* @param mediaFolder media folder to analyse | ||
* @return <code>true</code> if it qualifies as a media folder else <code>false</code> | ||
*/ | ||
public static boolean isQualifyingMediaFolder(@Nullable MediaFolder mediaFolder) { | ||
if (mediaFolder == null) { | ||
return false; | ||
} | ||
|
||
// custom folders are always fine | ||
if (MediaFolderType.CUSTOM.equals(mediaFolder.type)) { | ||
return true; | ||
} | ||
|
||
// filter media folders | ||
|
||
// no files | ||
if (mediaFolder.numberOfFiles < SINGLE_FILE) { | ||
return false; | ||
} // music album (just one cover-art image) | ||
else if (MediaFolderType.IMAGE.equals(mediaFolder.type)) { | ||
return containsQualifiedImages(mediaFolder.filePaths); | ||
} | ||
|
||
return true; | ||
} | ||
|
||
/** | ||
* analyzes a given synced folder if its content qualifies for the folder to be handled as a media folder. | ||
* | ||
* @param syncedFolder synced folder to analyse | ||
* @return <code>true</code> if it qualifies as a media folder else <code>false</code> | ||
*/ | ||
public static boolean isQualifyingMediaFolder(@Nullable SyncedFolder syncedFolder) { | ||
if (syncedFolder == null) { | ||
return false; | ||
} | ||
|
||
// custom folders are always fine | ||
if (MediaFolderType.CUSTOM.equals(syncedFolder.getType())) { | ||
return true; | ||
} | ||
|
||
// filter media folders | ||
File[] files = getFileList(new File(syncedFolder.getLocalPath())); | ||
|
||
// no files | ||
if (files.length < SINGLE_FILE) { | ||
return false; | ||
} // music album (just one cover-art image) | ||
else if (MediaFolderType.IMAGE.equals(syncedFolder.getType())) { | ||
return containsQualifiedImages(files); | ||
} | ||
|
||
return true; | ||
} | ||
|
||
/** | ||
* analyzes a given folder based on a path-string and type if its content qualifies for the folder to be handled as | ||
* a media folder. | ||
* | ||
* @param folderPath String representation for a folder | ||
* @param folderType type of the folder | ||
* @return <code>true</code> if it qualifies as a media folder else <code>false</code> | ||
*/ | ||
public static boolean isQualifyingMediaFolder(String folderPath, MediaFolderType folderType) { | ||
// custom folders are always fine | ||
if (MediaFolderType.CUSTOM.equals(folderType)) { | ||
return true; | ||
} | ||
|
||
// filter media folders | ||
File[] files = getFileList(new File(folderPath)); | ||
|
||
// no files | ||
if (files.length < SINGLE_FILE) { | ||
return false; | ||
} // music album (just one cover-art image) | ||
else if (MediaFolderType.IMAGE.equals(folderType)) { | ||
return containsQualifiedImages(files); | ||
} | ||
|
||
return true; | ||
} | ||
|
||
/** | ||
* check if given list contains images that qualify as auto upload relevant files. | ||
* | ||
* @param filePaths list of file paths | ||
* @return <code>true</code> if at least one files qualifies as auto upload relevant else <code>false</code> | ||
*/ | ||
private static boolean containsQualifiedImages(List<String> filePaths) { | ||
for (String filePath : filePaths) { | ||
if (isFileNameQualifiedForMediaDetection(FileUtil.getFilenameFromPathString(filePath)) | ||
&& MimeTypeUtil.isImage(MimeTypeUtil.getMimeTypeFromPath(filePath))) { | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* check if given list of files contains images that qualify as auto upload relevant files. | ||
* | ||
* @param files list of files | ||
* @return <code>true</code> if at least one files qualifies as auto upload relevant else <code>false</code> | ||
*/ | ||
private static boolean containsQualifiedImages(File... files) { | ||
for (File file : files) { | ||
if (isFileNameQualifiedForMediaDetection(file.getName()) && MimeTypeUtil.isImage(file)) { | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* check if given file is auto upload relevant files. | ||
* | ||
* @param fileName file name to be checked | ||
* @return <code>true</code> if the file qualifies as auto upload relevant else <code>false</code> | ||
*/ | ||
public static boolean isFileNameQualifiedForMediaDetection(String fileName) { | ||
if (fileName != null) { | ||
return !DISQUALIFIED_MEDIA_DETECTION_SET.contains(fileName.toLowerCase(Locale.ROOT)); | ||
} else { | ||
return false; | ||
} | ||
} | ||
|
||
/** | ||
* return list of files for given folder. | ||
* | ||
* @param localFolder folder to scan | ||
* @return sorted list of folder of given folder | ||
*/ | ||
public static File[] getFileList(File localFolder) { | ||
File[] files = localFolder.listFiles(pathname -> !pathname.isDirectory()); | ||
|
||
if (files != null) { | ||
Arrays.sort(files, (f1, f2) -> Long.compare(f1.lastModified(), f2.lastModified())); | ||
} else { | ||
files = new File[]{}; | ||
} | ||
|
||
return files; | ||
} | ||
} |