package com.aero.control.helpers.FileManager;
import android.app.Dialog;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.RelativeLayout;
import com.aero.control.AeroActivity;
import com.aero.control.R;
import com.aero.control.adapter.AeroData;
import com.aero.control.adapter.FileAdapter;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* Created by Alexander Christ on 21.09.14.
*/
public class FileManager extends RelativeLayout implements OnItemClickListener {
Context mContext;
FileManagerListener mFolderListener;
private static final String mRoot = "/";
private ListView mListView;
private List<AeroData> mData = new ArrayList<AeroData>();
private FileAdapter mAdapter;
private String mCurrentPath;
private Dialog mDialog;
private List<FileData> mFileData = null;
/*
* Holds the meta information of the file manager;
*/
private class FileData {
private String item;
private String path;
public FileData(String item, String path) {
this.item = item;
this.path = path;
}
}
public FileManager(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = layoutInflater.inflate(R.layout.file_folder, this);
mListView = (ListView) view.findViewById(R.id.list);
getDir(mRoot, mListView, false);
}
public void setIFolderItemListener(FileManagerListener folderItemListener) {
this.mFolderListener = folderItemListener;
}
public void setDir(String dirPath){
getDir(dirPath, mListView, false);
}
public void setDialog(Dialog d) {
this.mDialog = d;
}
private void setTitle(String dirPath) {
this.mCurrentPath = dirPath;
if (mDialog != null)
mDialog.setTitle(mCurrentPath);
}
private void getDir(String dirPath, ListView v, boolean root) {
setTitle(dirPath);
List<FileData> MetaDirectory = new ArrayList<FileData>();
List<FileData> MetaFiles = new ArrayList<FileData>();
String[] rootList;
File f = new File(dirPath);
File[] files;
if (!root) {
files = f.listFiles();
} else {
/*
* We are going into the root-fallback mode
* which gives us the full control
*/
ArrayList<File> rootFiles = new ArrayList<File>();
rootList = AeroActivity.shell.getRootArray("ls -d " + dirPath + "/*", "\n");
if (rootList != null) {
for (String a : rootList) {
rootFiles.add(new File(a));
}
} else {
rootFiles.add(new File(mContext.getText(R.string.folder_empty).toString()));
}
files = rootFiles.toArray(new File[0]);
}
if (!dirPath.equals(mRoot)) {
MetaDirectory.add(new FileData("../", f.getParent()));
}
for (int i = 0; i < files.length; i++) {
File file = files[i];
if (file.isDirectory()) {
MetaDirectory.add(new FileData(file.getName() + "/", file.getPath()));
} else {
MetaFiles.add(new FileData(file.getName(), file.getPath()));
}
}
mFileData = new ArrayList<FileData>();
// Sort it a little bit;
Collections.sort(MetaDirectory, new Comparator<FileData>() {
@Override
public int compare(FileData fileData, FileData fileData2) {
return fileData.item.compareTo(fileData2.item);
}
});
Collections.sort(MetaFiles, new Comparator<FileData>() {
@Override
public int compare(FileData fileData, FileData fileData2) {
return fileData.item.compareTo(fileData2.item);
}
});
mFileData.addAll(MetaDirectory);
mFileData.addAll(MetaFiles);
setItemList();
}
public void setItemList(){
if (mData != null)
mData.clear();
File checkFile;
for (FileData a : mFileData) {
// Get the full path;
checkFile = new File(mCurrentPath + "/" + a.item);
if (checkFile.isDirectory())
mData.add(new AeroData(R.drawable.file_folder, a.item));
else
mData.add(new AeroData(R.drawable.file_document, a.item));
}
if (mAdapter == null) {
mAdapter = new FileAdapter(mContext, R.layout.file_row, mData);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(this);
} else {
mAdapter.notifyDataSetChanged();
}
}
public void onListItemClick(ListView l, View v, int position, long id) {
File file = new File(mFileData.get(position).path);
if (file.isDirectory()) {
if (file.canRead())
getDir(file.toString(), l, false);
else {
//what to do when folder is unreadable
if (mFolderListener != null) {
mFolderListener.OnCannotFileRead(file);
}
// We are root!
getDir(file.toString(), l, true);
}
} else {
// File is actually clicked;
if (mFolderListener != null) {
mFolderListener.OnFileClicked(file);
}
}
}
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
onListItemClick((ListView) arg0, arg0, arg2, arg3);
}
}