/* * Copyright (c) 2011 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html */ package ru.orangesoftware.financisto2.dialog; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import ru.orangesoftware.financisto2.R; import static ru.orangesoftware.financisto2.utils.Utils.text; /** * Created by IntelliJ IDEA. * User: denis.solonenko * Date: 12/23/11 12:53 AM * */ public class FolderBrowser extends ListActivity { public static final String PATH = "PATH"; private final List<FileItem> files = new ArrayList<FileItem>(); private Button selectButton; private Button createButton; private File selectedFolder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.folder_browser); selectButton = (Button)findViewById(R.id.selectButton); selectButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent result = new Intent(); result.putExtra(PATH, selectedFolder.getAbsolutePath()); setResult(RESULT_OK, result); finish(); } }); createButton = (Button)findViewById(R.id.createButton); createButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { createNewFolder(); } }); if (!browseToCurrentFolder()) { browseToRoot(); } } private boolean browseToCurrentFolder() { Intent intent = getIntent(); if (intent != null) { String path = intent.getStringExtra(PATH); if (path != null) { browseTo(new File(path)); return true; } } return false; } private void createNewFolder() { final EditText editText = new EditText(this); Dialog d = new AlertDialog.Builder(this) .setTitle(R.string.create_new_folder_title) .setView(editText) .setPositiveButton(R.string.create, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { createNewFolder(text(editText)); dialogInterface.dismiss(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { dialogInterface.dismiss(); } }) .create(); d.show(); } private void createNewFolder(String name) { boolean result = false; try { result = new File(selectedFolder, name).mkdirs(); } catch (Exception e) { result = false; } finally { if (!result) { Toast.makeText(this, R.string.create_new_folder_fail, Toast.LENGTH_LONG).show(); } browseTo(selectedFolder); } } private void browseToRoot() { browseTo(new File("/")); } private void browseTo(File current) { files.clear(); upOneLevel(current); browse(current); setAdapter(); selectCurrentFolder(current); } private void selectCurrentFolder(File current) { boolean isWritable = current.canWrite(); selectButton.setEnabled(isWritable); createButton.setEnabled(isWritable); selectedFolder = isWritable ? current : null; setTitle(current.getAbsolutePath()); } private void upOneLevel(File current) { File parent = current.getParentFile(); if (parent != null) { files.add(new OnLevelUp(parent)); } } private void browse(File current) { File[] files = current.listFiles(); if (files != null) { Arrays.sort(files); for (File file : files) { if (isWritableDirectory(file)) { this.files.add(new FileItem(file)); } } } } private boolean isWritableDirectory(File file) { return file.isDirectory() && file.canRead() && file.canWrite(); } private void setAdapter() { ListAdapter adapter = new ArrayAdapter<FileItem>(this, android.R.layout.simple_list_item_1, files); setListAdapter(adapter); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); FileItem selected = files.get(position); browseTo(selected.file); } private static class FileItem { private final File file; private FileItem(File file) { this.file = file; } @Override public String toString() { return file.getName(); } } private static class OnLevelUp extends FileItem { private OnLevelUp(File file) { super(file); } @Override public String toString() { return ".."; } } }