package hu.mrolcsi.android.filebrowser; import android.app.AlertDialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; import android.os.Environment; import android.os.Parcelable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.*; import hu.mrolcsi.android.lyricsplayer.R; import java.io.File; import java.io.FileFilter; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Created with IntelliJ IDEA. * User: Matusinka Roland * Date: 2013.07.30. * Time: 11:34 */ public class BrowserDialog extends DialogFragment { //<editor-fold desc="Publics"> /** * Fájl megnyitása * * @see #OPTION_BROWSE_MODE */ public static final int MODE_OPEN_FILE = 67363453; private int browseMode = MODE_OPEN_FILE; /** * Mappa kiválasztása * * @see #OPTION_BROWSE_MODE */ public static final int MODE_SELECT_DIR = 735328347; /** * Fájl mentése * * @see #OPTION_BROWSE_MODE */ public static final int MODE_SAVE_FILE = 72833453; /** * Lista nézet * * @see #OPTION_LAYOUT */ public static final int LAYOUT_LIST = 5478; private int activeLayout = LAYOUT_LIST; /** * Négyzetrács (grid) nézet * * @see #OPTION_LAYOUT */ public static final int LAYOUT_GRID = 4743; /** * Név szerint rendezés, növekvő * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_NAME_ASC = 1015610500; private int sortMode = SORT_BY_NAME_ASC; /** * Név szerint rendezés,. csökkenő * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_NAME_DESC = 1618270814; /** * Kiterjesztés szerint rendezés, növekvő * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_EXTENSION_ASC = 749124600; /** * Kiterjesztés szerint rendezés, csökkenő * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_EXTENSION_DESC = 1947142506; /** * Módosítás dátuma szerint rendezés, növekvő * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_DATE_ASC = -1712925401; /** * Módosítás dátuma szerint rendezés, csökkenő * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_DATE_DESC = -1361963493; /** * Méret szerint rendezés, növekvő * (Pontatlan, a nem olvasható mappák mérete 0 byte) * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_SIZE_ASC = -343875334; /** * Méret szerint rendezés, csökkenő * (Pontatlan, a nem olvasható mappák mérete 0 byte) * * @see #OPTION_SORT_MODE */ public static final int SORT_BY_SIZE_DESC = -1871084376; private static final int[] SORT_HASHES = new int[]{ SORT_BY_NAME_ASC, SORT_BY_NAME_DESC, SORT_BY_EXTENSION_ASC, SORT_BY_EXTENSION_DESC, SORT_BY_DATE_ASC, SORT_BY_DATE_DESC, SORT_BY_SIZE_ASC, SORT_BY_SIZE_DESC }; /** * Tallózás módja: * <ul> * <li>Fájl megnyitása: {@link #MODE_OPEN_FILE MODE_OPEN_FILE}</li> * <li>Mappa kiválasztása: {@link #MODE_SELECT_DIR MODE_SELECT_DIR}</li> * <li>Fájl mentése: {@link #MODE_SAVE_FILE MODE_SAVE_FILE}</li> * </ul> * (Alapértelmezett: fájl megnyitása) */ public static final String OPTION_BROWSE_MODE; /** * String: Kezdőmappa abszolút elérési útja (Alapértelmezett: SD-kártya gyökere, ha nincs, "/") */ public static final String OPTION_START_PATH; /** * String: Engedélyezett kiterjesztések pontosvesszővel (;) elválasztva (Alapértelmezett: üres) */ public static final String OPTION_EXTENSION_FILTER; /** * Visszatérési érték: a kiválasztott fájl/mappa abszolút elérési útja * onActivityResult metódusban használandó, mint getStringExtra paraméter. */ public static final String RESULT; /** * Rendezés módja (mappák mindig elöl) * <ul> * <li>Név szerint növekvő: {@link #SORT_BY_NAME_ASC SORT_BY_NAME_ASC}</li> * <li>Név szerint csökkenő: {@link #SORT_BY_NAME_DESC SORT_BY_NAME_DESC}</li> * <li>Kiterjesztés szerint növekvő: {@link #SORT_BY_EXTENSION_ASC SORT_BY_EXTENSION_ASC}</li> * <li>Kiterjesztés szerint csökkenő: {@link #SORT_BY_EXTENSION_DESC SORT_BY_EXTENSION_DESC}</li> * <li>Módosítás dátuma szerint növekvő: {@link #SORT_BY_DATE_ASC SORT_BY_DATE_ASC}</li> * <li>Módosítás dátuma szerint csökkenő: {@link #SORT_BY_DATE_DESC SORT_BY_DATE_DESC}</li> * <li>Méret szerint növekvő: {@link #SORT_BY_SIZE_ASC SORT_BY_SIZE_ASC}</li> * <li>Méret szerint növekvő: {@link #SORT_BY_SIZE_DESC SORT_BY_SIZE_DESC}</li> * </ul> * (Alapértelmezett: fájlnév szerint növekvő) */ public static final String OPTION_SORT_MODE; /** * String: Alapértelmezett fájlnév, csak fájlmentéskor van rá szükség. * * @see #OPTION_BROWSE_MODE * @see #MODE_SAVE_FILE */ public static final String OPTION_DEFAULT_FILENAME; /** * Boolean: A kiindulópontként megadott mappát kezelje-e gyökérként? (boolean) * * @see #OPTION_START_PATH */ public static final String OPTION_START_IS_ROOT; /** * Kezdeti elrendezés (futás közben váltogatható) * <ul> * <li>Lista {@link #LAYOUT_LIST LAYOUT_LIST}</li> * <li>Négyzetrácsos(grid) {@link #LAYOUT_GRID LAYOUT_GRID}</li> * </ul> * Alapértelmezett: lista. */ public static final String OPTION_LAYOUT; static { OPTION_START_IS_ROOT = "startIsRoot"; OPTION_DEFAULT_FILENAME = "defaultFileName"; OPTION_SORT_MODE = "sort"; RESULT = "result"; OPTION_EXTENSION_FILTER = "extensionFilter"; OPTION_START_PATH = "startPath"; OPTION_BROWSE_MODE = "browseMode"; OPTION_LAYOUT = "layout"; } public static final String TAG = "hu.mrolcsi.android.filebrowser.browserdialog"; //</editor-fold> //<editor-fold desc="Privates"> private static final int ERROR_FOLDER_NOT_READABLE = -394829994; private static final int ERROR_CANT_CREATE_FOLDER = -227013011; private static final int ERROR_INVALID_FILENAME = -1490604826; private static final int ERROR_INVALID_FOLDERNAME = -1336390888; private AbsListView list; private String[] extensionFilter; private String defaultFileName; private String startPath = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? Environment.getExternalStorageDirectory().getAbsolutePath() : "/"; private String currentPath = startPath; private boolean startIsRoot = true; private TextView tvCurrentPath; private int itemLayoutID = R.layout.browser_listitem_layout; private ImageButton imgbtnSave; private EditText etFilename; private ViewFlipper vf; private View rootView; private OnDialogResultListener onDialogResultListener = new OnDialogResultListener() { @Override public void onPositiveResult(String path) { } @Override public void onNegativeResult() { } }; private Map<String, Parcelable> states = new ConcurrentHashMap<String, Parcelable>(); private ImageButton btnSwitchLayout; private ImageButton btnSortMode; private ImageButton btnNewFolder; private boolean overwrite = false; //</editor-fold> public BrowserDialog() { super(); setStyle(STYLE_NO_TITLE, 0); } @Override public void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { startPath = savedInstanceState.getString(OPTION_START_PATH, "/"); currentPath = savedInstanceState.getString("currentPath", startPath); browseMode = savedInstanceState.getInt(OPTION_BROWSE_MODE, MODE_OPEN_FILE); sortMode = savedInstanceState.getInt(OPTION_SORT_MODE, SORT_BY_NAME_ASC); extensionFilter = savedInstanceState.getStringArray(OPTION_EXTENSION_FILTER); startIsRoot = savedInstanceState.getBoolean(OPTION_START_IS_ROOT, true); activeLayout = savedInstanceState.getInt(OPTION_LAYOUT, LAYOUT_LIST); itemLayoutID = savedInstanceState.getInt("itemLayoutID"); defaultFileName = savedInstanceState.getString(OPTION_DEFAULT_FILENAME); } super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { switch (browseMode) { default: case MODE_OPEN_FILE: case MODE_SELECT_DIR: rootView = inflater.inflate(R.layout.browser_layout_dialog, container, false); break; case MODE_SAVE_FILE: rootView = inflater.inflate(R.layout.browser_layout_dialog_save, container, false); imgbtnSave = (imgbtnSave == null) ? (ImageButton) rootView.findViewById(R.id.browser_imageButtonSave) : imgbtnSave; etFilename = (etFilename == null) ? (EditText) rootView.findViewById(R.id.browser_editTextFileName) : etFilename; if (defaultFileName != null) etFilename.setText(defaultFileName); imgbtnSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String fileName = currentPath + "/" + etFilename.getText(); if (!fileName.isEmpty() && Utils.isFilenameValid(fileName)) { File f = new File(fileName); if (f.exists()) { if (!overwrite) { Toast.makeText(getActivity(), "Press again to overwrite file.", Toast.LENGTH_SHORT).show(); overwrite = true; //TODO: ellenőrizni } else { onDialogResultListener.onPositiveResult(fileName); dismiss(); } } else { onDialogResultListener.onPositiveResult(fileName); dismiss(); } } else { showErrorDialog(ERROR_INVALID_FILENAME); } } }); break; } btnSwitchLayout = (ImageButton) rootView.findViewById(R.id.btnLayout); btnSwitchLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { setLayout(); } }); btnSortMode = (ImageButton) rootView.findViewById(R.id.btnSort); btnSortMode.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showSortDialog(); } }); btnNewFolder = (ImageButton) rootView.findViewById(R.id.btnNewFolder); btnNewFolder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showNewFolderDialog(); } }); tvCurrentPath = (TextView) rootView.findViewById(R.id.browser_textViewCurrentDir); vf = (ViewFlipper) rootView.findViewById(R.id.browser_viewFlipper); switch (activeLayout) { default: case LAYOUT_LIST: toListView(); break; case LAYOUT_GRID: toGridView(); break; } return rootView; } @Override public void onSaveInstanceState(Bundle outState) { outState.putString("currentPath", currentPath); outState.putInt(OPTION_BROWSE_MODE, browseMode); outState.putInt(OPTION_SORT_MODE, sortMode); outState.putStringArray(OPTION_EXTENSION_FILTER, extensionFilter); outState.putString(OPTION_START_PATH, startPath); outState.putBoolean(OPTION_START_IS_ROOT, startIsRoot); outState.putInt(OPTION_LAYOUT, activeLayout); outState.putInt("itemLayoutID", itemLayoutID); outState.putString(OPTION_DEFAULT_FILENAME, defaultFileName); super.onSaveInstanceState(outState); } /** * Váltás Lista és Grid nézet között. */ private void setLayout() { switch (activeLayout) { default: case LAYOUT_LIST: toGridView(); break; case LAYOUT_GRID: toListView(); break; } setListListeners(); states = new ConcurrentHashMap<String, Parcelable>(); loadList(new File(currentPath)); } /** * Lista nézetbe váltás ViewFlipperen keresztül. */ private void toListView() { vf.setDisplayedChild(0); activeLayout = LAYOUT_LIST; btnSwitchLayout.setImageResource(R.drawable.browser_view_as_grid); list = (ListView) rootView.findViewById(R.id.browser_listView); itemLayoutID = R.layout.browser_listitem_layout; setListListeners(); loadList(new File(currentPath)); } /** * Grid nézetbe váltás ViewFlipperen keresztül. */ private void toGridView() { vf.setDisplayedChild(1); activeLayout = LAYOUT_GRID; btnSwitchLayout.setImageResource(R.drawable.browser_view_as_list); list = (GridView) rootView.findViewById(R.id.browser_gridView); itemLayoutID = R.layout.browser_griditem_layout; setListListeners(); loadList(new File(currentPath)); } /** * Dialógus megjelenítése a rendezési mód kiválasztásához. */ private void showSortDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) .setTitle(R.string.browser_menu_sortBy) .setIcon(R.drawable.browser_sort_by) .setItems(R.array.browser_sortOptions, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { sortMode = SORT_HASHES[i]; loadList(new File(currentPath)); } }); AlertDialog ad = builder.create(); ad.show(); } /** * View váltás után listenerek újraregisztrálása. */ private void setListListeners() { switch (browseMode) { default: case MODE_OPEN_FILE: list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { FileHolder holder = (FileHolder) view.getTag(); if (holder.file.getAbsolutePath().equals("/" + getString(R.string.browser_upFolder))) { loadList(new File(currentPath).getParentFile()); } else { if (holder.file.isDirectory()) loadList(holder.file); if (holder.file.isFile()) { onDialogResultListener.onPositiveResult(holder.file.getAbsolutePath()); dismiss(); } } } }); list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { FileHolder holder = (FileHolder) view.getTag(); if (holder.file.isFile()) { onDialogResultListener.onPositiveResult(holder.file.getAbsolutePath()); dismiss(); } return holder.file.isFile(); } }); break; case MODE_SELECT_DIR: list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { FileHolder holder = (FileHolder) view.getTag(); if (holder.file.getAbsolutePath().equals("/" + getString(R.string.browser_upFolder))) { loadList(new File(currentPath).getParentFile()); } else if (holder.file.isDirectory()) loadList(holder.file); } }); list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { FileHolder holder = (FileHolder) view.getTag(); if (holder.file.isDirectory()) { onDialogResultListener.onPositiveResult(holder.file.getAbsolutePath()); dismiss(); } return true; } }); break; case MODE_SAVE_FILE: list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { FileHolder holder = (FileHolder) view.getTag(); if (holder.file.getAbsolutePath().equals("/" + getString(R.string.browser_upFolder))) { loadList(new File(currentPath).getParentFile()); } else { if (holder.file.isFile()) etFilename.setText(holder.file.getName()); if (holder.file.isDirectory()) loadList(holder.file); } } }); list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) { FileHolder holder = (FileHolder) view.getTag(); if (!holder.file.isFile()) return false; else { showOverwriteDialog(holder.file.getAbsolutePath()); Toast.makeText(getActivity(), "Press Save button twice to overwrite file.", Toast.LENGTH_LONG).show(); return true; } } }); } } /** * Fájlok listájának betöltése a ListView/GridView-ba. * * @param directory A betöltendő mappa. */ private void loadList(final File directory) { if (!directory.canRead()) { showErrorDialog(ERROR_FOLDER_NOT_READABLE); return; } states.put(currentPath, list.onSaveInstanceState()); File[] filesToLoad; if (extensionFilter != null) filesToLoad = directory.listFiles(new FileFilter() { @Override public boolean accept(File file) { if (file.isFile()) { String ext = Utils.getExtension(file.getName()); int i = 0; int n = extensionFilter.length; while (i < n && !extensionFilter[i].toLowerCase().equals(ext)) i++; return i < n; } else return file.canRead(); } }); else filesToLoad = directory.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.canRead(); } }); currentPath = directory.getAbsolutePath(); tvCurrentPath.setText(currentPath); FileListAdapter fla; boolean isRoot = startIsRoot ? currentPath.equals(startPath) : currentPath.equals("/"); switch (browseMode) { default: case MODE_SAVE_FILE: case MODE_OPEN_FILE: fla = new FileListAdapter(getActivity(), itemLayoutID, filesToLoad, sortMode, isRoot); break; case MODE_SELECT_DIR: FileFilter filter = new FileFilter() { @Override public boolean accept(File file) { return file.isDirectory(); } }; fla = new FileListAdapter(getActivity(), itemLayoutID, directory.listFiles(filter), sortMode, isRoot); break; } //API Level 11 alatt castolni kell... switch (activeLayout) { case LAYOUT_GRID: //noinspection RedundantCast ((GridView) list).setAdapter(fla); break; case LAYOUT_LIST: //noinspection RedundantCast ((ListView) list).setAdapter(fla); break; } //if (browseMode == MODE_SAVE_FILE) imgbtnSave.setEnabled(directory.canWrite()); Parcelable state = states.get(currentPath); if (state != null) list.onRestoreInstanceState(state); File currentFile = new File(currentPath); btnNewFolder.setVisibility(currentFile.canWrite() ? View.VISIBLE : View.GONE); } /** * Ha a mentéskor megadott névvel már létezik fájl, megerősítést kér a felülírásról. * Tényleges írás NEM történik. * * @param fileName fájlnév */ private void showOverwriteDialog(final String fileName) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(R.string.browser_fileExists_message) .setTitle(R.string.browser_fileExists_title) .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { onDialogResultListener.onPositiveResult(fileName); dismiss(); } }) .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }); AlertDialog ad = builder.create(); ad.show(); } /** * Új mappa létrehozása az aktuális mappában. * WRITE_EXTERNAL_STORAGE szükséges! */ private void showNewFolderDialog() { final View view = getActivity().getLayoutInflater().inflate(R.layout.browser_dialog_newfolder, null); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()) .setTitle(R.string.browser_menu_newFolder) .setIcon(R.drawable.browser_new_folder).setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { EditText etFolderName = (EditText) view.findViewById(R.id.browser_etNewFolder); if (Utils.isFilenameValid(etFolderName.getText().toString())) { File newDir = new File(currentPath + "/" + etFolderName.getText()); if (newDir.mkdir()) { loadList(new File(currentPath)); } else showErrorDialog(ERROR_CANT_CREATE_FOLDER); } else showErrorDialog(ERROR_INVALID_FOLDERNAME); } }) .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }) .setView(view); AlertDialog ad = builder.create(); ad.show(); } /** * Hibaüzenet megjelenítése a felhasználónak. * * @param error a hiba oka */ private void showErrorDialog(int error) { AlertDialog.Builder builder = null; switch (error) { case ERROR_CANT_CREATE_FOLDER: builder = new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(R.string.browser_error_cantCreateFolder_message) .setTitle(R.string.browser_error_cantCreateFolder_title) .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); // Toast.makeText(getActivity(), R.string.browser_error_cantCreateFolder_message, Toast.LENGTH_LONG).show(); break; case ERROR_FOLDER_NOT_READABLE: builder = new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(R.string.browser_error_folderCantBeOpened_message) .setTitle(R.string.browser_error_folderCantBeOpened_title) .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); // Toast.makeText(getActivity(), R.string.browser_error_folderCantBeOpened_message, Toast.LENGTH_LONG).show(); break; case ERROR_INVALID_FILENAME: // builder = new AlertDialog.Builder(getActivity()) // .setIcon(android.R.drawable.ic_dialog_alert) // .setMessage(R.string.browser_error_invalidFilename_message) // .setTitle(R.string.browser_error_invalidFilename_title) // .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { // @Override // public void onClick(DialogInterface dialogInterface, int i) { // } // }); // Toast.makeText(getActivity(), R.string.browser_error_invalidFilename_message, Toast.LENGTH_LONG).show(); break; case ERROR_INVALID_FOLDERNAME: builder = new AlertDialog.Builder(getActivity()) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage(R.string.browser_error_invalidFolderName_message) .setTitle(R.string.browser_error_invalidFolderName_title) .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { } }); // Toast.makeText(getActivity(), R.string.browser_error_invalidFolderName_message, Toast.LENGTH_LONG).show(); break; default: break; } AlertDialog ad = builder != null ? builder.create() : null; if (ad != null) { ad.show(); } } public void setOnDialogResultListener(OnDialogResultListener listener) { this.onDialogResultListener = listener; } @Override public void onCancel(DialogInterface dialog) { super.onCancel(dialog); onDialogResultListener.onNegativeResult(); } //<editor-fold desc="GETTERS & SETTERS"> @SuppressWarnings("UnusedDeclaration") public int getBrowseMode() { return browseMode; } @SuppressWarnings("UnusedDeclaration") public BrowserDialog setBrowseMode(int browseMode) { this.browseMode = browseMode; return this; } @SuppressWarnings("UnusedDeclaration") public int getSortMode() { return sortMode; } @SuppressWarnings("UnusedDeclaration") public BrowserDialog setSortMode(int sortMode) { this.sortMode = sortMode; return this; } @SuppressWarnings("UnusedDeclaration") public String[] getExtensionFilter() { return extensionFilter; } @SuppressWarnings("UnusedDeclaration") public BrowserDialog setExtensionFilter(String extensionFilter) { this.extensionFilter = extensionFilter.split(";"); return this; } @SuppressWarnings("UnusedDeclaration") public String getDefaultFileName() { return defaultFileName; } @SuppressWarnings("UnusedDeclaration") public BrowserDialog setDefaultFileName(String defaultFileName) { this.defaultFileName = defaultFileName; return this; } @SuppressWarnings("UnusedDeclaration") public String getStartPath() { return startPath; } @SuppressWarnings("UnusedDeclaration") public BrowserDialog setStartPath(String startPath) { this.startPath = startPath; return this; } @SuppressWarnings("UnusedDeclaration") public boolean isStartRoot() { return startIsRoot; } @SuppressWarnings("UnusedDeclaration") public BrowserDialog setStartIsRoot(boolean startIsRoot) { this.startIsRoot = startIsRoot; return this; } public String getCurrentPath() { return currentPath; } @SuppressWarnings("UnusedDeclaration") public BrowserDialog setCurrentPath(String currentPath) { this.currentPath = currentPath; return this; } //</editor-fold> public interface OnDialogResultListener { /** * Visszatérés a kiválasztott fájl/mappa teljes elérési útjával. * * @param path A hívó Activityben felhasználható elérési út. */ public abstract void onPositiveResult(String path); /** * Nem lett kiválasztva fájl/mappa. * A dialógus bezárult. */ public abstract void onNegativeResult(); } }