From de37e25defd096b9f31c27177ecbffeb4636da62 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 28 Dec 2015 18:33:23 +0100 Subject: [PATCH] Make long click immediately select a file. --- .../fragments/FileSelectionFragment.java | 353 +++++++++--------- 1 file changed, 184 insertions(+), 169 deletions(-) diff --git a/main/src/main/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java b/main/src/main/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java index 95fa3cb2..3b146828 100644 --- a/main/src/main/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java +++ b/main/src/main/java/de/blinkt/openvpn/fragments/FileSelectionFragment.java @@ -11,6 +11,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.widget.AdapterView; import android.widget.Button; import android.widget.CheckBox; import android.widget.ListView; @@ -30,160 +31,174 @@ import de.blinkt.openvpn.activities.FileSelect; public class FileSelectionFragment extends ListFragment { - private static final String ITEM_KEY = "key"; - private static final String ITEM_IMAGE = "image"; - private static final String ROOT = "/"; + private static final String ITEM_KEY = "key"; + private static final String ITEM_IMAGE = "image"; + private static final String ROOT = "/"; - private List path = null; - private TextView myPath; - private ArrayList> mList; + private List path = null; + private TextView myPath; + private ArrayList> mList; - private Button selectButton; + private Button selectButton; - private String parentPath; - private String currentPath = ROOT; + private String parentPath; + private String currentPath = ROOT; - private String[] formatFilter = null; + private String[] formatFilter = null; - private File selectedFile; - private HashMap lastPositions = new HashMap(); - private String mStartPath; - private CheckBox mInlineImport; - private Button mClearButton; - private boolean mHideImport=false; + private File selectedFile; + private HashMap lastPositions = new HashMap(); + private String mStartPath; + private CheckBox mInlineImport; + private Button mClearButton; + private boolean mHideImport = false; - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View v = inflater.inflate(R.layout.file_dialog_main, container,false); + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.file_dialog_main, container, false); - myPath = (TextView) v.findViewById(R.id.path); + myPath = (TextView) v.findViewById(R.id.path); - mInlineImport = (CheckBox) v.findViewById(R.id.doinline); + mInlineImport = (CheckBox) v.findViewById(R.id.doinline); - if(mHideImport) { - mInlineImport.setVisibility(View.GONE); - mInlineImport.setChecked(false); - } + if (mHideImport) { + mInlineImport.setVisibility(View.GONE); + mInlineImport.setChecked(false); + } + selectButton = (Button) v.findViewById(R.id.fdButtonSelect); + selectButton.setEnabled(false); + selectButton.setOnClickListener(new OnClickListener() { - selectButton = (Button) v.findViewById(R.id.fdButtonSelect); - selectButton.setEnabled(false); - selectButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + onFileSelectionClick(); + } + }); - @Override - public void onClick(View v) { - if (selectedFile != null) { - if(mInlineImport.isChecked()) + mClearButton = (Button) v.findViewById(R.id.fdClear); + mClearButton.setOnClickListener(new OnClickListener() { - ((FileSelect) getActivity()).importFile(selectedFile.getPath()); - else - ((FileSelect) getActivity()).setFile(selectedFile.getPath()); - } - } - }); + @Override + public void onClick(View v) { + ((FileSelect) getActivity()).clearData(); + } + }); + if (!((FileSelect) getActivity()).showClear()) { + mClearButton.setVisibility(View.GONE); + mClearButton.setEnabled(false); + } - mClearButton = (Button) v.findViewById(R.id.fdClear); - mClearButton.setOnClickListener(new OnClickListener() { + getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + onListItemClick(getListView(), view, position, id); + onFileSelectionClick(); + return true; + } + } - @Override - public void onClick(View v) { - ((FileSelect) getActivity()).clearData(); - } - }); - if(!((FileSelect) getActivity()).showClear()) { - mClearButton.setVisibility(View.GONE); - mClearButton.setEnabled(false); - } + ); - return v; - } + return v; + } - @Override - public void onActivityCreated(Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); + private void onFileSelectionClick() { + if (selectedFile != null) { + if (mInlineImport.isChecked()) - mStartPath = ((FileSelect) getActivity()).getSelectPath(); - getDir(mStartPath); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } + ((FileSelect) getActivity()).importFile(selectedFile.getPath()); + else + ((FileSelect) getActivity()).setFile(selectedFile.getPath()); + } + } - private void getDir(String dirPath) { + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); - boolean useAutoSelection = dirPath.length() < currentPath.length(); + mStartPath = ((FileSelect) getActivity()).getSelectPath(); + getDir(mStartPath); + } - Integer position = lastPositions.get(parentPath); + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } - getDirImpl(dirPath); - if (position != null && useAutoSelection) { - getListView().setSelection(position); - } + private void getDir(String dirPath) { - } + boolean useAutoSelection = dirPath.length() < currentPath.length(); - /** - * Monta a estrutura de arquivos e diretorios filhos do diretorio fornecido. - * - * @param dirPath - * Diretorio pai. - */ - private void getDirImpl(final String dirPath) { + Integer position = lastPositions.get(parentPath); - currentPath = dirPath; + getDirImpl(dirPath); - final List item = new ArrayList(); - path = new ArrayList(); - mList = new ArrayList>(); + if (position != null && useAutoSelection) { + getListView().setSelection(position); + } - 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); + /** + * Monta a estrutura de arquivos e diretorios filhos do diretorio fornecido. + * + * @param dirPath Diretorio pai. + */ + private void getDirImpl(final String dirPath) { - if (!currentPath.equals(ROOT)) { + currentPath = dirPath; - item.add(ROOT); - addItem(ROOT, R.drawable.ic_root_folder_am); - path.add(ROOT); + final List item = new ArrayList(); + path = new ArrayList(); + mList = new ArrayList>(); - item.add("../"); - addItem("../", R.drawable.ic_root_folder_am); - path.add(f.getParent()); - parentPath = f.getParent(); + 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); - TreeMap dirsMap = new TreeMap(); - TreeMap dirsPathMap = new TreeMap(); - TreeMap filesMap = new TreeMap(); - TreeMap filesPathMap = new TreeMap(); - for (File file : files) { - if (file.isDirectory()) { - String dirName = file.getName(); - dirsMap.put(dirName, dirName); - dirsPathMap.put(dirName, file.getPath()); - } else { - final String fileName = file.getName(); - final String fileNameLwr = fileName.toLowerCase(Locale.getDefault()); - // se ha um filtro de formatos, utiliza-o - if (formatFilter != null) { - boolean contains = false; + if (!currentPath.equals(ROOT)) { + + item.add(ROOT); + addItem(ROOT, R.drawable.ic_root_folder_am); + path.add(ROOT); + + item.add("../"); + addItem("../", R.drawable.ic_root_folder_am); + path.add(f.getParent()); + parentPath = f.getParent(); + + } + + TreeMap dirsMap = new TreeMap(); + TreeMap dirsPathMap = new TreeMap(); + TreeMap filesMap = new TreeMap(); + TreeMap filesPathMap = new TreeMap(); + for (File file : files) { + if (file.isDirectory()) { + String dirName = file.getName(); + dirsMap.put(dirName, dirName); + dirsPathMap.put(dirName, file.getPath()); + } else { + final String fileName = file.getName(); + final String fileNameLwr = fileName.toLowerCase(Locale.getDefault()); + // se ha um filtro de formatos, utiliza-o + if (formatFilter != null) { + boolean contains = false; for (String aFormatFilter : formatFilter) { final String formatLwr = aFormatFilter.toLowerCase(Locale.getDefault()); if (fileNameLwr.endsWith(formatLwr)) { @@ -191,73 +206,73 @@ public class FileSelectionFragment extends ListFragment { break; } } - if (contains) { - filesMap.put(fileName, fileName); - filesPathMap.put(fileName, file.getPath()); - } - // senao, adiciona todos os arquivos - } else { - filesMap.put(fileName, fileName); - filesPathMap.put(fileName, file.getPath()); - } - } - } - item.addAll(dirsMap.tailMap("").values()); - item.addAll(filesMap.tailMap("").values()); - path.addAll(dirsPathMap.tailMap("").values()); - path.addAll(filesPathMap.tailMap("").values()); + if (contains) { + filesMap.put(fileName, fileName); + filesPathMap.put(fileName, file.getPath()); + } + // senao, adiciona todos os arquivos + } else { + filesMap.put(fileName, fileName); + filesPathMap.put(fileName, 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(getActivity(), mList, R.layout.file_dialog_row, new String[] { - ITEM_KEY, ITEM_IMAGE }, new int[] { R.id.fdrowtext, R.id.fdrowimage }); + SimpleAdapter fileList = new SimpleAdapter(getActivity(), 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.ic_root_folder_am); - } + for (String dir : dirsMap.tailMap("").values()) { + addItem(dir, R.drawable.ic_root_folder_am); + } - for (String file : filesMap.tailMap("").values()) { - addItem(file, R.drawable.ic_doc_generic_am); - } + for (String file : filesMap.tailMap("").values()) { + addItem(file, R.drawable.ic_doc_generic_am); + } - fileList.notifyDataSetChanged(); + fileList.notifyDataSetChanged(); - setListAdapter(fileList); + setListAdapter(fileList); - } + } - private void addItem(String fileName, int imageId) { - HashMap item = new HashMap(); - item.put(ITEM_KEY, fileName); - item.put(ITEM_IMAGE, imageId); - mList.add(item); - } + private void addItem(String fileName, int imageId) { + HashMap item = new HashMap(); + item.put(ITEM_KEY, fileName); + item.put(ITEM_IMAGE, imageId); + mList.add(item); + } - @Override - public void onListItemClick(ListView l, View v, int position, long id) { + @Override + public void onListItemClick(ListView l, View v, int position, long id) { - File file = new File(path.get(position)); + File file = new File(path.get(position)); - if (file.isDirectory()) { - selectButton.setEnabled(false); + if (file.isDirectory()) { + selectButton.setEnabled(false); - if (file.canRead()) { - lastPositions.put(currentPath, position); - getDir(path.get(position)); - } else { - Toast.makeText(getActivity(), - "[" + file.getName() + "] " + getActivity().getText(R.string.cant_read_folder), - Toast.LENGTH_SHORT).show(); - } - } else { - selectedFile = file; - v.setSelected(true); - selectButton.setEnabled(true); - } - } + if (file.canRead()) { + lastPositions.put(currentPath, position); + getDir(path.get(position)); + } else { + Toast.makeText(getActivity(), + "[" + file.getName() + "] " + getActivity().getText(R.string.cant_read_folder), + Toast.LENGTH_SHORT).show(); + } + } else { + selectedFile = file; + v.setSelected(true); + selectButton.setEnabled(true); + } + } - public void setNoInLine() { - mHideImport=true; - - } + public void setNoInLine() { + mHideImport = true; + + } }