package com.mercandalli.android.apps.files.file.local;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.mercandalli.android.apps.files.file.FileModel;
import com.mercandalli.android.apps.files.file.audio.FileAudioModel;
import com.mercandalli.android.library.base.su.SuperUserFile;
import com.mercandalli.android.library.base.su.SuperUserManager;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import static com.mercandalli.android.apps.files.file.FileUtils.isAudioPath;
/**
* An API providing the local {@link FileModel}.
*/
public class FileLocalApi {
@Nullable
private static FileLocalApi sInstance;
@NonNull
public static FileLocalApi getInstance() {
if (sInstance == null) {
sInstance = new FileLocalApi();
}
return sInstance;
}
private FileLocalApi() {
}
@NonNull
public List<FileModel> getFiles(final File directoryFile) {
final List<FileModel> filesList = new ArrayList<>();
final File[] files = directoryFile.listFiles();
final List<File> fs;
if (files == null) {
fs = new ArrayList<>();
} else {
fs = Arrays.asList(files);
}
Collections.sort(fs, new Comparator<File>() {
@Override
public int compare(final File f1, final File f2) {
return String.CASE_INSENSITIVE_ORDER.compare(f1.getName(), f2.getName());
}
});
filesList.clear();
for (final File file : fs) {
if (file.exists()) {
if (!file.isDirectory() && isAudioPath(file.getPath().toLowerCase())) {
filesList.add(new FileAudioModel.FileAudioModelBuilder().file(file).build());
} else {
filesList.add(new FileModel.FileModelBuilder().file(file).build());
}
}
}
return filesList;
}
public void getFilesSuperUser(
final File directoryFile,
final GetFilesSuperUser getFilesSuperUser) {
final WeakReference<GetFilesSuperUser> weakReference = new WeakReference<>(getFilesSuperUser);
SuperUserManager.getInstance().getFolderChildren(
directoryFile.getAbsolutePath(),
new SuperUserManager.FolderChildrenListener() {
@Override
public boolean onGetFolderChildrenSucceeded(@NonNull final String s, @NonNull final List<SuperUserFile> list) {
final GetFilesSuperUser reference = weakReference.get();
if (reference != null) {
List<FileModel> fileModels = new ArrayList<>();
for (final SuperUserFile superUserFile : list) {
fileModels.add(new FileModel.FileModelBuilder()
.isDirectory(superUserFile.isDirectory())
.nameWithExt(superUserFile.getName())
.url(superUserFile.getAbsolutePath())
.build());
}
reference.onGetFilesSuperUser(fileModels);
}
return true;
}
@Override
public boolean onGetFolderChildrenFailed(@NonNull final String s) {
final GetFilesSuperUser reference = weakReference.get();
if (reference != null) {
reference.onGetFilesSuperUser(new ArrayList<FileModel>());
}
return true;
}
});
}
public interface GetFilesSuperUser {
void onGetFilesSuperUser(List<FileModel> files);
}
}