package io.filepicker;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ListView;
import android.widget.ProgressBar;
import java.util.ArrayList;
import io.filepicker.adapters.NodesAdapter;
import io.filepicker.models.Node;
import io.filepicker.models.PickedFile;
import io.filepicker.utils.Constants;
import io.filepicker.utils.PreferencesUtils;
/**
* Created by maciejwitowski on 10/22/14.
*/
public class NodesFragment 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 PARENT_NODE_STATE = "parent_node_state";
private static final String NODES_STATE = "nodes_state";
private static final String VIEW_TYPE_STATE = "view_type_state";
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 Button mUploadFilesButton;
public static NodesFragment newInstance(Node parentNode, ArrayList<Node> nodes, String viewType) {
NodesFragment frag = new NodesFragment();
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);
if (savedInstanceState != null) {
viewType = savedInstanceState.getString(VIEW_TYPE_STATE);
nodes = savedInstanceState.getParcelableArrayList(NODES_STATE);
parentNode = savedInstanceState.getParcelable(PARENT_NODE_STATE);
} else {
Bundle bundle = getArguments();
if (bundle == null) {
getActivity().finish();
} else {
viewType = bundle.getString(KEY_VIEW_TYPE);
nodes = bundle.getParcelableArrayList(KEY_NODES);
parentNode = bundle.getParcelable(KEY_PARENT_NODE);
}
}
if (nodes == null) {
nodes = new ArrayList<>();
}
if (parentNode == null) {
setHasOptionsMenu(true);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_nodes, container, false);
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBarNode);
mUploadFilesButton = (Button) view.findViewById(R.id.btnUploadFiles);
switch (viewType) {
case Constants.LIST_VIEW:
currentView = (ListView) view.findViewById(R.id.listView);
break;
case Constants.THUMBNAILS_VIEW:
currentView = (GridView) view.findViewById(R.id.gridView);
break;
default:
showEmptyView(view);
break;
}
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(Constants.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) {
openDir(node);
} else {
// Proceed single file
PickedFile pickedFile = new PickedFile(node, position);
if (canPickMultiple()) {
updatePickedList(view, pickedFile);
setUploadButton();
} else {
view.setAlpha(Constants.ALPHA_FADED);
uploadSingleFile(pickedFile);
}
}
}
});
currentView.setVisibility(View.VISIBLE);
mUploadFilesButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!pickedFiles.isEmpty()) {
showProgress();
getContract().pickFiles(PickedFile.getNodes(pickedFiles));
}
}
});
}
private void showProgressBar() {
mProgressBar.setVisibility(View.VISIBLE);
}
private void setUploadButton() {
if (!pickedFiles.isEmpty() && (maxFiles() < 0 || pickedFiles.size() <= maxFiles())) {
mUploadFilesButton.setVisibility(View.VISIBLE);
String btnText = (pickedFiles.size() == 1) ? "Upload 1 file" : "Upload " + pickedFiles.size() + " files";
mUploadFilesButton.setText(btnText);
} else {
mUploadFilesButton.setVisibility(View.GONE);
}
}
@Override
public void onPause() {
pickedFiles.clear();
mUploadFilesButton.setVisibility(View.GONE);
super.onPause();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.filepicker, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_logout) {
getContract().logoutUser();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(VIEW_TYPE_STATE, viewType);
outState.putParcelableArrayList(NODES_STATE, nodes);
outState.putParcelable(PARENT_NODE_STATE, parentNode);
super.onSaveInstanceState(outState);
}
private void showEmptyView(View view) {
view.findViewById(R.id.emptylistView).setVisibility(View.VISIBLE);
}
private void openDir(Node node) {
if (node.isGallery()) {
getContract().openGallery(canPickMultiple());
} else if (node.isCamera()) {
getContract().openCamera();
} else {
getContract().showNextNode(node);
}
}
private void uploadSingleFile(PickedFile pickedFile) {
showProgress();
pickedFiles.add(pickedFile);
getContract().pickFiles(PickedFile.getNodes(pickedFiles));
}
private void showProgress() {
showProgressBar();
currentView.setEnabled(false);
}
private void updatePickedList(View view, PickedFile pickedFile) {
if (PickedFile.containsPosition(pickedFiles, pickedFile.position)) {
PickedFile.removeAtPosition(pickedFiles, pickedFile.position);
view.setAlpha(1);
} else {
pickedFiles.add(pickedFile);
view.setAlpha(Constants.ALPHA_FADED);
}
}
private boolean canPickMultiple() {
return PreferencesUtils.newInstance(getActivity()).getMultiple();
}
private Integer maxFiles() {
return PreferencesUtils.newInstance(getActivity()).getMaxFiles();
}
Contract getContract() {
return (Contract) getActivity();
}
// Activity needs to implement these methods
public interface Contract {
void openCamera();
void openGallery(boolean allowMultiple);
void pickFiles(ArrayList<Node> node);
void showNextNode(Node node);
void logoutUser();
}
}