diff app/src/main/java/com/lamerman/FileDialog.java @ 438:d29cce60f393

migrate from Eclipse to Android Studio
author Carl Byington <carl@five-ten-sg.com>
date Thu, 03 Dec 2015 11:23:55 -0800
parents src/com/lamerman/FileDialog.java@0ce5cc452d02
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/src/main/java/com/lamerman/FileDialog.java	Thu Dec 03 11:23:55 2015 -0800
@@ -0,0 +1,292 @@
+package com.lamerman;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.TreeMap;
+
+import com.five_ten_sg.connectbot.R;
+import android.app.AlertDialog;
+import android.app.ListActivity;
+import android.content.DialogInterface;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+import android.widget.TextView;
+
+public class FileDialog extends ListActivity {
+
+    private static final String ITEM_KEY = "key";
+    private static final String ITEM_IMAGE = "image";
+    private static final String ROOT = "/";
+
+    public static final String START_PATH = "START_PATH";
+    public static final String RESULT_PATH = "RESULT_PATH";
+    public static final String SELECTION_MODE = "SELECTION_MODE";
+    public static final String TITLE = "TITLE";
+
+    private List<String> path = null;
+    private TextView myPath;
+    private EditText mFileName;
+    private ArrayList<HashMap<String, Object>> mList;
+
+    private Button selectButton;
+
+    private LinearLayout layoutSelect;
+    private LinearLayout layoutCreate;
+    private InputMethodManager inputManager;
+    private String parentPath;
+    private String currentPath = ROOT;
+
+    private int selectionMode = SelectionMode.MODE_CREATE;
+
+    private File selectedFile;
+    private HashMap<String, Integer> lastPositions = new HashMap<String, Integer>();
+
+    /** Called when the activity is first created. */
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setResult(RESULT_CANCELED, getIntent());
+        setContentView(R.layout.file_dialog_main);
+        this.setTitle(String.format("%s: %s",
+                                    getResources().getText(R.string.app_name),
+                                    getIntent().getStringExtra(TITLE)));
+        myPath = (TextView) findViewById(R.id.path);
+        mFileName = (EditText) findViewById(R.id.fdEditTextFile);
+        inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
+        selectButton = (Button) findViewById(R.id.fdButtonSelect);
+        selectButton.setEnabled(false);
+        selectButton.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                if (selectedFile != null) {
+                    getIntent().setData(Uri.fromFile(selectedFile));
+                    setResult(RESULT_OK, getIntent());
+                    finish();
+                }
+            }
+        });
+        final Button newButton = (Button) findViewById(R.id.fdButtonNew);
+        newButton.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                setCreateVisible(v);
+                mFileName.setText("");
+                mFileName.requestFocus();
+            }
+        });
+        final Button cancelButton = (Button) findViewById(R.id.fdButtonCancel);
+        cancelButton.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                setResult(RESULT_CANCELED, getIntent());
+                finish();
+            }
+        });
+        selectionMode = getIntent().getIntExtra(SELECTION_MODE,
+                                                SelectionMode.MODE_CREATE);
+
+        if (selectionMode == SelectionMode.MODE_OPEN) {
+            newButton.setEnabled(false);
+        }
+
+        layoutSelect = (LinearLayout) findViewById(R.id.fdLinearLayoutSelect);
+        layoutCreate = (LinearLayout) findViewById(R.id.fdLinearLayoutCreate);
+        layoutCreate.setVisibility(View.GONE);
+        final Button cancelCreateButton = (Button) findViewById(R.id.fdButtonCancelCreate);
+        cancelCreateButton.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                setSelectVisible(v);
+            }
+        });
+        final Button createButton = (Button) findViewById(R.id.fdButtonCreate);
+        createButton.setOnClickListener(new OnClickListener() {
+            public void onClick(View v) {
+                if (mFileName.getText().length() > 0) {
+                    getIntent().putExtra(RESULT_PATH,
+                                         currentPath + "/" + mFileName.getText());
+                    setResult(RESULT_OK, getIntent());
+                    finish();
+                }
+            }
+        });
+        String startPath = getIntent().getStringExtra(START_PATH);
+
+        if (startPath != null) {
+            getDir(startPath);
+        }
+        else {
+            getDir(ROOT);
+        }
+    }
+
+    @Override
+    protected void onPause() {
+        String myPathStr = myPath.getText().toString();
+        int idx = myPathStr.lastIndexOf(':');
+        String currPath = myPathStr.substring(idx + 2);
+        getIntent().putExtra(START_PATH, currPath);
+        super.onPause();
+    }
+
+    private void getDir(String dirPath) {
+        boolean useAutoSelection = dirPath.length() < currentPath.length();
+        Integer position = lastPositions.get(parentPath);
+        getDirImpl(dirPath);
+
+        if (position != null && useAutoSelection) {
+            getListView().setSelection(position);
+        }
+    }
+
+    private void getDirImpl(final String dirPath) {
+        currentPath = dirPath;
+        final List<String> item = new ArrayList<String>();
+        path = new ArrayList<String>();
+        mList = new ArrayList<HashMap<String, Object>>();
+        File f = new File(currentPath);
+        File[] files = f.listFiles();
+
+        if (files == null) {
+            currentPath = ROOT;
+            f = new File(currentPath);
+            files = f.listFiles();
+        }
+
+        myPath.setText(getText(R.string.location) + ": " + currentPath);
+
+        if (!currentPath.equals(ROOT)) {
+            item.add(ROOT);
+            addItem(ROOT, R.drawable.folder);
+            path.add(ROOT);
+            item.add("../");
+            addItem("../", R.drawable.folder);
+            path.add(f.getParent());
+            parentPath = f.getParent();
+        }
+
+        TreeMap<String, String> dirsMap = new TreeMap<String, String>();
+        TreeMap<String, String> dirsPathMap = new TreeMap<String, String>();
+        TreeMap<String, String> filesMap = new TreeMap<String, String>();
+        TreeMap<String, String> filesPathMap = new TreeMap<String, String>();
+
+        for (File file : files) {
+            if (file.isDirectory()) {
+                String dirName = file.getName();
+                dirsMap.put(dirName, dirName);
+                dirsPathMap.put(dirName, file.getPath());
+            }
+            else {
+                filesMap.put(file.getName(), file.getName());
+                filesPathMap.put(file.getName(), file.getPath());
+            }
+        }
+
+        item.addAll(dirsMap.tailMap("").values());
+        item.addAll(filesMap.tailMap("").values());
+        path.addAll(dirsPathMap.tailMap("").values());
+        path.addAll(filesPathMap.tailMap("").values());
+        SimpleAdapter fileList = new SimpleAdapter(this, mList,
+                R.layout.file_dialog_row,
+                new String[] { ITEM_KEY, ITEM_IMAGE }, new int[] {
+                    R.id.fdrowtext, R.id.fdrowimage
+                });
+
+        for (String dir : dirsMap.tailMap("").values()) {
+            addItem(dir, R.drawable.folder);
+        }
+
+        for (String file : filesMap.tailMap("").values()) {
+            addItem(file, R.drawable.file);
+        }
+
+        fileList.notifyDataSetChanged();
+        setListAdapter(fileList);
+    }
+
+    private void addItem(String fileName, int imageId) {
+        HashMap<String, Object> item = new HashMap<String, Object>();
+        item.put(ITEM_KEY, fileName);
+        item.put(ITEM_IMAGE, imageId);
+        mList.add(item);
+    }
+
+    @Override
+    protected void onListItemClick(ListView l, View v, int position, long id) {
+        File file = new File(path.get(position));
+        setSelectVisible(v);
+
+        if (file.isDirectory()) {
+            selectButton.setEnabled(false);
+
+            if (file.canRead()) {
+                lastPositions.put(currentPath, position);
+                getDir(path.get(position));
+            }
+            else {
+                new AlertDialog.Builder(this)
+                .setIcon(R.drawable.icon)
+                .setTitle(
+                    "[" + file.getName() + "] "
+                    + getText(R.string.cant_read_folder))
+                .setPositiveButton("OK",
+                new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog,
+                                        int which) {
+                    }
+                }).show();
+            }
+        }
+        else {
+            selectedFile = file;
+            v.setSelected(true);
+            selectButton.setEnabled(true);
+        }
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
+            selectButton.setEnabled(false);
+
+            if (layoutCreate.getVisibility() == View.VISIBLE) {
+                layoutCreate.setVisibility(View.GONE);
+                layoutSelect.setVisibility(View.VISIBLE);
+            }
+            else {
+                if (!currentPath.equals(ROOT)) {
+                    getDir(parentPath);
+                }
+                else {
+                    return super.onKeyDown(keyCode, event);
+                }
+            }
+
+            return true;
+        }
+        else {
+            return super.onKeyDown(keyCode, event);
+        }
+    }
+
+    private void setCreateVisible(View v) {
+        layoutCreate.setVisibility(View.VISIBLE);
+        layoutSelect.setVisibility(View.GONE);
+        inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
+        selectButton.setEnabled(false);
+    }
+
+    private void setSelectVisible(View v) {
+        layoutCreate.setVisibility(View.GONE);
+        layoutSelect.setVisibility(View.VISIBLE);
+        inputManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
+        selectButton.setEnabled(false);
+    }
+}
\ No newline at end of file