package com.marverenic.music.dialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.widget.TextView;
import com.marverenic.music.R;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class DirectoryDialogFragment extends DialogFragment {
private static final String KEY_DIRECTORY = "Directory";
private File mDirectory;
private List<File> mSubDirectories;
private String[] mSubDirectoryNames;
private OnDirectoryPickListener mCallback;
public DirectoryDialogFragment setDirectory(File directory) {
mDirectory = directory;
return this;
}
public DirectoryDialogFragment setDirectoryPickListener(OnDirectoryPickListener callback) {
mCallback = callback;
return this;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String path = savedInstanceState.getString(KEY_DIRECTORY);
if (path != null) {
mDirectory = new File(path);
}
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mDirectory != null) {
outState.putString(KEY_DIRECTORY, mDirectory.getAbsolutePath());
}
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
if (mDirectory == null) {
setDirectory(Environment.getExternalStorageDirectory());
}
scanSubDirs();
AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
.setTitle(mDirectory.getAbsolutePath())
.setNegativeButton(R.string.action_cancel, null)
.setPositiveButton(R.string.action_select, (dialogInterface, i) -> {
if (mCallback != null) {
mCallback.onDirectoryChosen(mDirectory);
}
})
.setNeutralButton(R.string.action_navigate_up, (dialogInterface, i) -> {
new DirectoryDialogFragment()
.setDirectory(mDirectory.getParentFile())
.setDirectoryPickListener(mCallback)
.show(getFragmentManager(), getTag());
});
if (mSubDirectories.isEmpty()) {
builder.setMessage(R.string.empty_directory);
} else {
builder.setItems(mSubDirectoryNames, (dialog, which) -> {
File directory = mSubDirectories.get(which);
new DirectoryDialogFragment()
.setDirectory(directory)
.setDirectoryPickListener(mCallback)
.show(getFragmentManager(), getTag());
});
}
AlertDialog dialog = builder.show();
File parent = mDirectory.getParentFile();
if (parent == null || !parent.canRead()) {
dialog.getButton(DialogInterface.BUTTON_NEUTRAL).setEnabled(false);
}
// Ellipsize the header at the beginning to show a more informative file path
TextView header = (TextView) dialog.findViewById(R.id.alertTitle);
if (header != null) {
header.setEllipsize(TextUtils.TruncateAt.START);
}
return dialog;
}
private void scanSubDirs() {
mSubDirectories = new ArrayList<>();
for (File f : mDirectory.listFiles()) {
if (f.isDirectory() && f.canRead()) {
mSubDirectories.add(f);
}
}
Collections.sort(mSubDirectories,
(f1, f2) -> f1.getAbsolutePath().compareToIgnoreCase(f2.getAbsolutePath()));
mSubDirectoryNames = new String[mSubDirectories.size()];
for (int i = 0; i < mSubDirectoryNames.length; i++) {
mSubDirectoryNames[i] = mSubDirectories.get(i).getName();
}
}
public interface OnDirectoryPickListener {
void onDirectoryChosen(File directory);
}
}