summaryrefslogtreecommitdiff
path: root/android/source/src/java/org/libreoffice/storage/external/DirectoryBrowserFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'android/source/src/java/org/libreoffice/storage/external/DirectoryBrowserFragment.java')
-rw-r--r--android/source/src/java/org/libreoffice/storage/external/DirectoryBrowserFragment.java199
1 files changed, 199 insertions, 0 deletions
diff --git a/android/source/src/java/org/libreoffice/storage/external/DirectoryBrowserFragment.java b/android/source/src/java/org/libreoffice/storage/external/DirectoryBrowserFragment.java
new file mode 100644
index 000000000000..27cbfbce14be
--- /dev/null
+++ b/android/source/src/java/org/libreoffice/storage/external/DirectoryBrowserFragment.java
@@ -0,0 +1,199 @@
+package org.libreoffice.storage.external;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Environment;
+import android.support.annotation.Nullable;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.libreoffice.R;
+import org.libreoffice.storage.IOUtils;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Comparator;
+
+/**
+ * A simple directory browser.
+ */
+public class DirectoryBrowserFragment extends Fragment {
+ private static final String LOGTAG = DirectoryBrowserFragment.class.getSimpleName();
+ private static final String INITIAL_PATH_URI_KEY = "initial_path";
+ private File currentDirectory;
+ private FileArrayAdapter directoryAdapter;
+
+ public static DirectoryBrowserFragment newInstance(String initialPathURI) {
+ Bundle args = new Bundle();
+ args.putString(INITIAL_PATH_URI_KEY, initialPathURI);
+ DirectoryBrowserFragment fragment = new DirectoryBrowserFragment();
+ fragment.setArguments(args);
+ Log.d(LOGTAG, "Saved path: " + initialPathURI);
+
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ String initialPathURI = getArguments().getString(INITIAL_PATH_URI_KEY);
+ setupCurrentDirectory(initialPathURI);
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View v = inflater.inflate(R.layout.fragment_directory_browser, container, false);
+
+ final EditText directoryHeader = (EditText)v.findViewById(R.id.directory_header);
+ Button directorySearchButton = (Button)v.findViewById(R.id.directory_search_button);
+ Button positiveButton = (Button)v.findViewById(R.id.confirm_button);
+ Button negativeButton = (Button)v.findViewById(R.id.cancel_button);
+ ImageView upImage = (ImageView)v.findViewById(R.id.up_image);
+ ListView directoryListView = (ListView) v.findViewById(R.id.directory_list);
+
+ directoryHeader.setText(currentDirectory.getPath());
+ directorySearchButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String currentPath = currentDirectory.getAbsolutePath();
+ String enteredPath = directoryHeader.getText().toString();
+ File testDirectory = new File(enteredPath);
+ if(enteredPath.equals(currentPath)) ;
+ else if (isInvalidFileDirectory(testDirectory)) {
+ Toast.makeText(getActivity(), R.string.bad_directory, Toast.LENGTH_SHORT)
+ .show();
+ }
+ else {
+ changeDirectory(testDirectory);
+ }
+ }
+ });
+
+ positiveButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent data = new Intent();
+ data.setData(Uri.fromFile(currentDirectory));
+ getActivity().setResult(Activity.RESULT_OK, data);
+ getActivity().finish();
+ }
+ });
+
+ negativeButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ getActivity().setResult(Activity.RESULT_CANCELED, null);
+ getActivity().finish();
+ }
+ });
+
+ upImage.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ changeDirectory(currentDirectory.getParentFile());
+ }
+ });
+
+ directoryAdapter = new FileArrayAdapter(getActivity(), new ArrayList<File>());
+ directoryAdapter.populateFileList(currentDirectory);
+ directoryListView.setAdapter(directoryAdapter);
+ directoryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ changeDirectory(directoryAdapter.getItem(position));
+ }
+ });
+
+ return v;
+ }
+
+ private void changeDirectory(File destination) {
+ if(destination == null) {
+ Toast.makeText(getActivity(), "Unable to go further.", Toast.LENGTH_SHORT)
+ .show();
+ } else {
+ Fragment fragment = DirectoryBrowserFragment.newInstance(destination.toURI().toString());
+ getActivity().getFragmentManager().beginTransaction()
+ .replace(R.id.fragment_container, fragment)
+ .addToBackStack(null)
+ .commit();
+ }
+ }
+
+ private void setupCurrentDirectory(String initialPathURI) {
+ File initialDirectory = null;
+ if(initialPathURI != null && !initialPathURI.isEmpty()) {
+ initialDirectory = IOUtils.getFileFromURIString(initialPathURI);
+ }
+
+ if(isInvalidFileDirectory(initialDirectory)) {
+ initialDirectory = Environment.getExternalStorageDirectory();
+ }
+ currentDirectory = initialDirectory;
+ }
+
+ private boolean isInvalidFileDirectory(File f) {
+ return f == null || !f.exists() || !f.isDirectory() ||!f.canRead();
+ }
+
+ private class FileArrayAdapter extends ArrayAdapter<File> {
+ private Comparator<File> caseInsensitiveNaturalOrderComparator;
+
+ public FileArrayAdapter(Context context, ArrayList<File> files) {
+ super(context, 0, files);
+ caseInsensitiveNaturalOrderComparator = new AlphabeticalFileComparator();
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null) {
+ convertView = getActivity().getLayoutInflater()
+ .inflate(android.R.layout.simple_list_item_1, null);
+ }
+
+ File f = this.getItem(position);
+ TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
+ tv.setText(f.getName());
+
+ return convertView;
+ }
+
+ public void sortAlphabetically() {
+ this.sort(caseInsensitiveNaturalOrderComparator);
+ }
+
+ public void populateFileList(File directory) {
+ for(File f : directory.listFiles()){
+ if(f.isDirectory()){
+ directoryAdapter.add(f);
+ }
+ }
+ directoryAdapter.sortAlphabetically();
+ }
+ }
+
+ private class AlphabeticalFileComparator implements Comparator<File> {
+ @Override
+ public int compare(File lhs, File rhs) {
+ String lhsName = lhs.getName();
+ String rhsName = rhs.getName();
+
+ return lhsName.compareToIgnoreCase(rhsName);
+ }
+ }
+}