package io.filepicker;
import android.app.Fragment;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.ArrayList;
import io.filepicker.adapters.NodesAdapter;
import io.filepicker.models.FPFile;
import io.filepicker.models.Node;
import io.filepicker.models.PickedFile;
import io.filepicker.utils.Constants;
import io.filepicker.utils.FilesUtils;
import io.filepicker.utils.Utils;
import io.filepicker.utils.ViewUtils;
/**
* Created by maciejwitowski on 11/7/14.
*/
public class ExportFragment extends Fragment {
private static final String KEY_NODES = "nodes";
private static final String KEY_PARENT_NODE = "parent_node";
private static final String KEY_VIEW_TYPE = "viewType";
private static final String LIST_VIEW = "list";
private static final String THUMBNAILS_VIEW = "thumbnails";
private String viewType;
private ArrayList<Node> nodes;
private Node parentNode;
// Used when user can pick many files at once
private final ArrayList<PickedFile> pickedFiles = new ArrayList<>();
private AbsListView currentView;
private ProgressBar mProgressBar;
private TextView mFileType;
private EditText etFilename;
private Button mBtnSave;
public static ExportFragment newInstance(Node parentNode, ArrayList<Node> nodes, String viewType) {
ExportFragment frag = new ExportFragment();
Bundle args = new Bundle();
args.putParcelable(KEY_PARENT_NODE, parentNode);
args.putParcelableArrayList(KEY_NODES, nodes);
args.putString(KEY_VIEW_TYPE, viewType);
frag.setArguments(args);
return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
if (bundle == null) {
getActivity().finish();
return;
}
viewType = bundle.getString(KEY_VIEW_TYPE);
nodes = bundle.getParcelableArrayList(KEY_NODES);
if (nodes == null) {
nodes = new ArrayList<>();
}
parentNode = bundle.getParcelable(KEY_PARENT_NODE);
// If we're in provider root folder (first folder in given provider)
if (parentNode != null && Utils.isProvider(parentNode)) {
setHasOptionsMenu(true);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_export, container, false);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
mFileType = (TextView) view.findViewById(R.id.fileType);
etFilename = (EditText) view.findViewById(R.id.etFilename);
mBtnSave = (Button) view.findViewById(R.id.btnSave);
switch (viewType) {
case LIST_VIEW:
currentView = (ListView) view.findViewById(R.id.listView);
break;
case THUMBNAILS_VIEW:
currentView = (GridView) view.findViewById(R.id.gridView);
break;
default:
showEmptyView(view);
}
// Show edit text for filename and save button if we're in content (not in providers list)
if (parentNode != null) {
LinearLayout exportForm = (LinearLayout) view.findViewById(R.id.exportForm);
ViewUtils.show(exportForm);
}
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (currentView == null) {
return;
}
NodesAdapter nodesAdapter = new NodesAdapter(getActivity(), nodes, pickedFiles);
if (viewType.equals(THUMBNAILS_VIEW)) {
nodesAdapter.setThumbnail(true);
}
currentView.setAdapter(nodesAdapter);
currentView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Clicked node object
Node node = (Node) parent.getAdapter().getItem(position);
// If node is dir then open it
if (node.isDir) {
getContract().showNextNode(node);
}
}
});
currentView.setVisibility(View.VISIBLE);
// Form consists of input for name, text with extension and save button
initForm();
}
private void initForm() {
if (parentNode != null) {
Uri fileUri = getContract().getFileToExport();
mFileType.setText("." + FilesUtils.getFileExtension(getActivity(),fileUri));
String filename = FPFile.contentUriToFilename(fileUri);
etFilename.setText(Utils.filenameWithoutExtension(filename));
showSaveButton(filename);
}
etFilename.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable text) {
showSaveButton(text.toString() + "." + typeOfExportFile());
}
// Not used
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
// Not used
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
});
mBtnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (etFilename.getText().length() > 0) {
currentView.setEnabled(false);
currentView.setAlpha(Constants.ALPHA_FADED);
etFilename.setEnabled(false);
mBtnSave.setEnabled(false);
mBtnSave.setText("Saving file...");
mProgressBar.setVisibility(View.VISIBLE);
String filename = etFilename.getText().toString();
getContract().exportFile(filename);
}
}
});
}
private void showSaveButton(String value) {
int textRes;
int backgroundColor;
if (Node.nameExists(nodes, value)) {
textRes = R.string.override;
backgroundColor = R.color.yellow;
} else {
textRes = R.string.save;
backgroundColor = R.color.blue;
}
Resources res = getResources();
mBtnSave.setText(res.getText(textRes));
mBtnSave.setBackgroundColor(res.getColor(backgroundColor));
}
private void showEmptyView(View view) {
ViewUtils.show(view.findViewById(R.id.emptylistView));
}
Contract getContract() {
return (Contract) getActivity();
}
private String typeOfExportFile() {
return FilesUtils.getFileExtension(getActivity(), getContract().getFileToExport());
}
// Activity needs to implement these methods
public interface Contract {
void showNextNode(Node node);
void exportFile(String fileName);
Uri getFileToExport();
}
}