package hu.mrolcsi.android.filebrowser;
import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcelable;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
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;
import static android.widget.AdapterView.OnItemClickListener;
import static android.widget.AdapterView.OnItemLongClickListener;
/**
* Created with IntelliJ IDEA.
* User: Matusinka Roland
* Date: 2013.03.13.
* Time: 16:49
*/
public class BrowserActivity extends Activity {
//<editor-fold desc="Publics">
/**
* Fájl megnyitása
*
* @see #OPTION_BROWSE_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int MODE_OPEN_FILE = 67363453;
/**
* Mappa kiválasztása
*
* @see #OPTION_BROWSE_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int MODE_SELECT_DIR = 735328347;
/**
* Fájl mentése
*
* @see #OPTION_BROWSE_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int MODE_SAVE_FILE = 72833453;
/**
* Lista nézet
*
* @see #OPTION_LAYOUT
*/
@SuppressWarnings("WeakerAccess")
public static final int LAYOUT_LIST = 5478;
/**
* Négyzetrács (grid) nézet
*
* @see #OPTION_LAYOUT
*/
@SuppressWarnings("WeakerAccess")
public static final int LAYOUT_GRID = 4743;
/**
* Név szerint rendezés, növekvő
*
* @see #OPTION_SORT_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int SORT_BY_NAME_ASC = 1015610500;
/**
* Név szerint rendezés,. csökkenő
*
* @see #OPTION_SORT_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int SORT_BY_NAME_DESC = 1618270814;
/**
* Kiterjesztés szerint rendezés, növekvő
*
* @see #OPTION_SORT_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int SORT_BY_EXTENSION_ASC = 749124600;
/**
* Kiterjesztés szerint rendezés, csökkenő
*
* @see #OPTION_SORT_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int SORT_BY_EXTENSION_DESC = 1947142506;
/**
* Módosítás dátuma szerint rendezés, növekvő
*
* @see #OPTION_SORT_MODE
*/
@SuppressWarnings("WeakerAccess")
public static final int SORT_BY_DATE_ASC = -1712925401;
/**
* Módosítás dátuma szerint rendezés, csökkenő
*
* @see #OPTION_SORT_MODE
*/
@SuppressWarnings("WeakerAccess")
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
*/
@SuppressWarnings("WeakerAccess")
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
*/
@SuppressWarnings("WeakerAccess")
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)
*/
@SuppressWarnings("WeakerAccess")
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, "/")
*/
@SuppressWarnings("WeakerAccess")
public static final String OPTION_START_PATH;
/**
* String: Engedélyezett kiterjesztések pontosvesszővel (;) elválasztva (Alapértelmezett: üres)
*/
@SuppressWarnings("WeakerAccess")
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.
*/
@SuppressWarnings("WeakerAccess")
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ő)
*/
@SuppressWarnings("WeakerAccess")
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
*/
@SuppressWarnings("WeakerAccess")
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
*/
@SuppressWarnings("WeakerAccess")
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.
*/
@SuppressWarnings("WeakerAccess")
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";
}
//</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 String currentPath;
private AbsListView list;
private Intent resultIntent;
private int browseMode;
private int sortMode;
private String[] extensionFilter;
private String defaultFileName;
private String startPath;
private boolean startIsRoot;
private int activeLayout;
private TextView tvCurrentPath;
private boolean shortPress;
private int itemLayoutID;
private MenuItem menuViewAs;
private EditText etFilename;
private ViewFlipper vf;
private Map<String, Parcelable> states = new ConcurrentHashMap<String, Parcelable>();
private boolean cancelIsFirstPress = true;
//</editor-fold>
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//<editor-fold desc="Változók inicializálása az Intentből">
if (savedInstanceState == null) {
final Intent inputIntent = getIntent();
browseMode = inputIntent.getIntExtra(OPTION_BROWSE_MODE, MODE_OPEN_FILE);
startPath = inputIntent.getStringExtra(OPTION_START_PATH) != null ? inputIntent.getStringExtra(OPTION_START_PATH) : Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ? Environment.getExternalStorageDirectory().getAbsolutePath() : "/";
currentPath = startPath;
if (inputIntent.getStringExtra(OPTION_EXTENSION_FILTER) != null)
extensionFilter = inputIntent.getStringExtra(OPTION_EXTENSION_FILTER).split(";");
sortMode = inputIntent.getIntExtra(OPTION_SORT_MODE, SORT_BY_NAME_ASC);
defaultFileName = inputIntent.getStringExtra(OPTION_DEFAULT_FILENAME);
startIsRoot = inputIntent.getBooleanExtra(OPTION_START_IS_ROOT, true);
activeLayout = inputIntent.getIntExtra(OPTION_LAYOUT, LAYOUT_LIST);
switch (activeLayout) {
default:
case LAYOUT_LIST:
itemLayoutID = R.layout.browser_listitem_layout;
break;
case LAYOUT_GRID:
itemLayoutID = R.layout.browser_griditem_layout;
break;
}
} else onRestoreInstanceState(savedInstanceState);
//</editor-fold>
switch (browseMode) {
default:
case MODE_OPEN_FILE:
setContentView(R.layout.browser_layout);
setTitle(R.string.browser_titleOpenFile);
break;
case MODE_SELECT_DIR:
setContentView(R.layout.browser_layout);
setTitle(R.string.browser_titleSelectDir);
break;
case MODE_SAVE_FILE:
setContentView(R.layout.browser_layout_save);
setTitle(R.string.browser_titleSaveFile);
ImageButton imgbtnSave = (ImageButton) findViewById(R.id.browser_imageButtonSave);
etFilename = (EditText) findViewById(R.id.browser_editTextFilename);
if (defaultFileName != null) etFilename.setText(defaultFileName);
imgbtnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String fileName = currentPath + "/" + etFilename.getText();
if (!fileName.equals("") && Utils.isFilenameValid(fileName)) {
File f = new File(fileName);
if (f.exists()) {
showOverwriteDialog(fileName);
} else {
ok(fileName);
}
} else {
showErrorDialog(ERROR_INVALID_FILENAME);
}
}
});
break;
}
tvCurrentPath = (TextView) findViewById(R.id.browser_textViewCurrentDir);
vf = (ViewFlipper) findViewById(R.id.browser_viewFlipper);
switch (activeLayout) {
default:
case LAYOUT_LIST:
toListView();
break;
case LAYOUT_GRID:
toGridView();
break;
}
/**
* API level 11 és fölötte menü helyett ActionBar.
*/
if (Build.VERSION.SDK_INT >= 11) {
ActionBar actionBar = getActionBar();
switch (browseMode) {
default:
case MODE_OPEN_FILE:
actionBar.setTitle(R.string.browser_titleOpenFile);
actionBar.setIcon(R.drawable.browser_folder_open);
break;
case MODE_SELECT_DIR:
actionBar.setTitle(R.string.browser_titleSelectDir);
actionBar.setIcon(R.drawable.browser_folder_open);
break;
case MODE_SAVE_FILE:
actionBar.setTitle(R.string.browser_titleSaveFile);
actionBar.setIcon(R.drawable.browser_save_title);
break;
}
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
/**
* Változók aktuális állapotának mentése.
*
* @param outState Állapotot tároló Bundle.
*/
@Override
protected 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);
}
/**
* Mentett állapot visszatöltése változókba.
*
* @param savedInstanceState Állapotot tároló Bundle
*/
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
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.onRestoreInstanceState(savedInstanceState);
}
/**
* View váltás után listenerek újraregisztrálása.
*/
private void setListListeners() {
switch (browseMode) {
default:
case MODE_OPEN_FILE:
list.setOnItemClickListener(new 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()) {
ok(holder.file.getAbsolutePath());
}
}
}
});
list.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
FileHolder holder = (FileHolder) view.getTag();
if (holder.file.isFile()) {
ok(holder.file.getAbsolutePath());
}
return holder.file.isFile();
}
});
break;
case MODE_SELECT_DIR:
list.setOnItemClickListener(new 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 OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
FileHolder holder = (FileHolder) view.getTag();
if (holder.file.isDirectory())
ok(holder.file.getAbsolutePath());
return true;
}
});
break;
case MODE_SAVE_FILE:
list.setOnItemClickListener(new 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 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());
return true;
}
}
});
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.browser_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
menuViewAs = menu.findItem(R.id.browser_menu_viewAs);
switch (activeLayout) {
default:
case LAYOUT_LIST:
menuViewAs.setIcon(R.drawable.browser_view_as_grid);
menuViewAs.setTitle(R.string.browser_menu_viewAsGrid);
break;
case LAYOUT_GRID:
menuViewAs.setIcon(R.drawable.browser_view_as_list);
menuViewAs.setTitle(R.string.browser_menu_viewAsList);
break;
}
File currentDir = new File(currentPath);
MenuItem menuNewFolder = menu.findItem(R.id.browser_menu_newFolder);
menuNewFolder.setVisible(currentDir.canWrite());
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int i = item.getItemId();
if (i == android.R.id.home) {
cancel();
} else if (i == R.id.browser_menu_viewAs) {
setLayout();
} else if (i == R.id.browser_menu_newFolder) {
createNewFolder();
} else if (i == R.id.browser_menu_sortBy) {
showSortDialog();
}
return super.onOptionsItemSelected(item);
}
/**
* Dialógus megjelenítése a rendezési mód kiválasztásához.
*/
private void showSortDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(BrowserActivity.this)
.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();
}
/**
* Új mappa létrehozása az aktuális mappában.
* WRITE_EXTERNAL_STORAGE szükséges!
*/
private void createNewFolder() {
final View view = getLayoutInflater().inflate(R.layout.browser_dialog_newfolder, null);
AlertDialog.Builder builder = new AlertDialog.Builder(BrowserActivity.this)
.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();
}
/**
* Váltás Lista és Grid nézet között.
*/
private void setLayout() {
switch (activeLayout) {
default:
case LAYOUT_LIST:
toGridView();
menuViewAs.setIcon(R.drawable.browser_view_as_list);
menuViewAs.setTitle(R.string.browser_menu_viewAsList);
break;
case LAYOUT_GRID:
toListView();
menuViewAs.setIcon(R.drawable.browser_view_as_grid);
menuViewAs.setTitle(R.string.browser_menu_viewAsGrid);
break;
}
setListListeners();
states = new ConcurrentHashMap<String, Parcelable>();
loadList(new File(currentPath));
}
/**
* Lista nézetbe váltás ViewFlipper segítségével.
*/
private void toListView() {
vf.setDisplayedChild(0);
activeLayout = LAYOUT_LIST;
list = (ListView) 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;
list = (GridView) findViewById(R.id.browser_gridView);
itemLayoutID = R.layout.browser_griditem_layout;
setListListeners();
loadList(new File(currentPath));
}
//<editor-fold desc="Vissza gomb lekezelése: rövid nyomás: egy mappával feljebb | hoszú nyomás: kilépés tallózásból">
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
if (event.getRepeatCount() == 0) {
shortPress = true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
shortPress = false;
cancel();
return true;
}
return false;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (shortPress) {
if (!currentPath.equals((startIsRoot) ? startPath : "/")) {
loadList(new File(currentPath).getParentFile());
cancelIsFirstPress = true;
} else {
//Toast.makeText(this, getString(R.string.browser_toast_noParentDir), Toast.LENGTH_SHORT).show();
if (cancelIsFirstPress) {
Toast.makeText(this, getString(R.string.browser_pressAgainToCancel), Toast.LENGTH_SHORT).show();
cancelIsFirstPress = false;
} else cancel();
}
}
shortPress = false;
return true;
}
return super.onKeyUp(keyCode, event);
}
//</editor-fold>
/**
* Visszatérés a kiválasztott fájl/mappa teljes elérési útjával.
*
* @param path A fő Activityben ezt az elérési utat kell felhasználni.
*/
private void ok(String path) {
resultIntent = new Intent();
resultIntent.putExtra(BrowserActivity.RESULT, path);
setResult(RESULT_OK, resultIntent);
finish();
}
/**
* Fájlok listájának betöltése a ListView/GridView-ba.
*
* @param directory A betöltendő mappa.
*/
@SuppressWarnings("ConstantConditions")
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(this, 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(this, 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 (Build.VERSION.SDK_INT >= 11) {
this.invalidateOptionsMenu();
}
//if (browseMode == MODE_SAVE_FILE) imgbtnSave.setEnabled(directory.canWrite());
Parcelable state = states.get(currentPath);
if (state != null)
list.onRestoreInstanceState(state);
}
/**
* 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(BrowserActivity.this)
.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) {
ok(fileName);
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
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(BrowserActivity.this)
.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) {
}
});
break;
case ERROR_FOLDER_NOT_READABLE:
builder = new AlertDialog.Builder(BrowserActivity.this)
.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) {
}
});
break;
case ERROR_INVALID_FILENAME:
builder = new AlertDialog.Builder(BrowserActivity.this)
.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) {
}
});
break;
case ERROR_INVALID_FOLDERNAME:
builder = new AlertDialog.Builder(BrowserActivity.this)
.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) {
}
});
break;
default:
break;
}
AlertDialog ad = builder != null ? builder.create() : null;
if (ad != null) {
ad.show();
}
}
/**
* Tallózás mégsézése, visszatérés RESULT_CANCELED üzenettel.
*/
private void cancel() {
setResult(RESULT_CANCELED, resultIntent);
finish();
}
}