Commit d514a4a1 authored by Kristin Muterspaw's avatar Kristin Muterspaw
Browse files

NotePad opens the 'My Documents' activity. Again, these icons will change,...

NotePad opens the 'My Documents' activity. Again, these icons will change, currently just adding the functionality. On My Documents activity, there's a button to download files and asks the user to input the url and base directory path. These directories must be publicly accessible and have indexing enabled. Field Day retrieves a list of files in the base directory path and displays them to the user in an AlertDialog as a multi-check list. If the user clicks on an item that is also a directory, then that task of looking for files is basically executed again using that different path. Once the user has selected all of the file to download, Field Day downloads them one by one, creating local filesystem to match the remote one, all under 'myDocuments' in the external storage directory for Field Day. After downloading, the list of files is displayed to the user -- if it's a folder, a folder icon is shown next to the name, if it's a file, a file icon is shown next to the name. Testing and working with https://cluster.earlham.edu/~buzzlightyear/pdfs/. Opened the downloaded files in the an external file application on the Nexus to check and the Pdfs were downloaded.
parent 95c2520c
......@@ -136,7 +136,6 @@ public class BuiltInSensorsFragment extends ListFragment implements SensorEventL
break;
case Sensor.TYPE_MAGNETIC_FIELD:
sens.setLastValue(values, 3);
sens.setID("and11");
break;
case Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED:
......
......@@ -3,31 +3,51 @@ package fieldscience.cs.earlham.edu.fieldday;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MyDocumentsActivity extends Activity {
public static final String directory = Environment.getExternalStorageDirectory().toString() +
File.separator + "FieldDay";
File.separator + "FieldDay" + File.separator + "myDocuments";
Button downloadFiles;
private static final String TAG = "MyDocumentsActivity";
public static List<String> fileList;
public static List<String> downloadList, dirList;
public static ArrayList<File> localDirList;
private Boolean firstPage = true, insideDirectory = false;
private String baseURL = "", currentPath = "", currentDir = "", initialDir = "";
private ListView filesListView;
private MyDocumentsAdapter myDocumentsAdapter;
SharedPreferences settings;
SharedPreferences.Editor editor;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState){
......@@ -43,11 +63,19 @@ public class MyDocumentsActivity extends Activity {
}
});
fileList = new ArrayList<String>();
downloadList = new ArrayList<String>();
dirList = new ArrayList<String>();
localDirList = new ArrayList<File>();
firstPage = true;
context = this;
// Create the directory to store the files that are downloaded/to be downloaded.
createDirectory();
filesListView = (ListView) findViewById(R.id.listFileResults);
myDocumentsAdapter = new MyDocumentsAdapter(context, localDirList);
filesListView.setAdapter(myDocumentsAdapter);
settings= PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
editor = settings.edit();
}
......@@ -56,7 +84,9 @@ public class MyDocumentsActivity extends Activity {
LayoutInflater layoutInflater = this.getLayoutInflater();
final View dialog = layoutInflater.inflate(R.layout.alert_dialog_sigin, null);
final EditText host = (EditText) dialog.findViewById(R.id.fileHost);
host.setText(settings.getString("docURL", ""));
final EditText path = (EditText) dialog.findViewById(R.id.directoryPath);
path.setText(settings.getString("docPath", ""));
builder.setView(dialog);
builder.setNegativeButton("Cancel", null);
builder.setTitle("File Host Details");
......@@ -65,33 +95,39 @@ public class MyDocumentsActivity extends Activity {
@Override
public void onClick(DialogInterface dialog, int which) {
String[] info = {host.getText().toString(), path.getText().toString()};
editor.putString("docURL", host.getText().toString());
editor.putString("docPath", path.getText().toString());
editor.apply();
new GetListOfFiles().execute(info);
}
});
builder.create().show();
}
public void createDirectory() {
public File createDirectory(String dirName) {
try {
File sd = Environment.getExternalStorageDirectory();
if (sd.canWrite()) {
File baseDir = new File(directory);
if (!baseDir.exists()){
baseDir.mkdir();
Log.d( TAG, "Created directory: " + directory);
}
File documentsDir = new File(directory + "/myDocuments");
File documentsDir = new File(directory + File.separator + dirName);
if (!documentsDir.exists()){
documentsDir.mkdir();
Log.d(TAG, "Created directory: " + dirName);
}
return documentsDir;
}
} catch (Exception e) {
e.printStackTrace();
Log.e("My Documents Activity", "Could not created directories in external storage");
}
return null;
}
private class GetListOfFiles extends AsyncTask<String, Void, List<String>> {
private class GetListOfFiles extends AsyncTask<String, Void, Boolean> {
@Override
protected void onPreExecute() {
......@@ -99,85 +135,182 @@ public class MyDocumentsActivity extends Activity {
}
@Override
protected List<String> doInBackground(String... url){
protected Boolean doInBackground(String... url){
try {
// We use JSoup to do the HTML parsing of the files available
Document doc = Jsoup.connect(url[0] + '/' + url[1]).get();
List<String> files = new ArrayList<String>();
currentDir = url[1];
if (firstPage){
baseURL = url[0];
currentPath = '/' + currentDir;
initialDir = currentDir;
} else {
currentPath = '/' + initialDir + currentDir;
}
Document doc = Jsoup.connect(baseURL + currentPath).get();
for (Element file : doc.select("tr td a")) {
// This checks if it's a directory.
// Makes sure the element selected is not the parent directory. We don't need to list that.
if (!file.text().equals("Parent Directory")) {
files.add(file.attr("href"));
dirList.add(file.attr("href"));
}
}
return files;
// Now we display a list of files that we found to the user. The user will select which
// files they want to download.
MyDocumentsActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(MyDocumentsActivity.this, AlertDialog.THEME_HOLO_LIGHT);
final String[] fileArray = dirList.toArray(new String[dirList.size()]);
builder.setTitle("Select files to download");
// Check if this time is the first page or if the user selected a directory
// before and now we are showing a new directory listing. If it's not the
// first page, then we have to change the negative button to back where we
// will show the directory before that.
if (firstPage) {
builder.setNegativeButton("Cancel", null);
builder.setPositiveButton("Download", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new downloadListOfFiles().execute();
dirList.clear();
}
});
} else {
builder.setNegativeButton("Back", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which){
dialog.dismiss();
currentPath = currentPath.substring(0, currentPath.length() - currentDir.length());
Log.d("Current Path", currentPath);
}
});
}
final boolean[] checked = new boolean[fileArray.length];
for (int i=0; i<fileArray.length; i++){
if (downloadList.contains(fileArray[i])){
checked[i] = true;
} else {
checked[i] = false;
}
}
builder.setMultiChoiceItems(fileArray, checked, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
String file = fileArray[which];
if (isChecked) {
// This checks if it's a directory. If it is, then we have to
// open a new dialog that has asks for which files in that
// directory to download.
if (file.matches("^(\\w+)(/)$")){
firstPage = false;
dirList.clear();
File dir = createDirectory(fileArray[which]);
if (!localDirList.contains(dir)){
localDirList.add(dir);
}
new GetListOfFiles().execute(new String[] {currentPath, file});
} else {
Log.d("On click", currentPath);
if (currentPath.endsWith(currentDir)) {
downloadList.add(currentDir + fileArray[which]);
} else {
downloadList.add(fileArray[which]);
}
}
} else if (downloadList.contains(file)) {
// The user has decided they don't want to download that
// item anymore.
// Check if the item clicked is a directory.
if (file.matches("^(\\w+)(/)$")){
// Delete any files in that subdirectory from the list.
for (String item : fileArray){
if (item.contains(file)){
downloadList.remove(downloadList.indexOf(item));
}
}
}
File dir = createDirectory(fileArray[which]);
localDirList.remove(localDirList.indexOf(dir));
downloadList.remove(fileArray[which]);
}
}
});
builder.create().show();
}
});
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
return null;
}
@Override
protected void onPostExecute(List<String> listOfFiles) {
AlertDialog.Builder builder = new AlertDialog.Builder(MyDocumentsActivity.this, AlertDialog.THEME_HOLO_LIGHT);
String[] fileArray = listOfFiles.toArray(new String[listOfFiles.size()]);
builder.setTitle("Select files to download");
builder.setNegativeButton("Cancel", null);
builder.setPositiveButton("Download", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
builder.setMultiChoiceItems(fileArray, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
}
});
builder.create().show();
protected void onPostExecute(Boolean result) {
}
}
private class downloadListOfFiles extends AsyncTask<List<String>, Void, Void> {
private class downloadListOfFiles extends AsyncTask<Void, Void, Boolean> {
@Override
protected Void doInBackground(List<String>... list){
// String path = url[1];
// URL fileHost = new URL(url[0] + '/' + path);
// HttpURLConnection conn = (HttpURLConnection) fileHost.openConnection();
// conn.setRequestMethod("GET");
// conn.connect();
// Log.d(TAG, fileHost.toString());
//InputStream in = conn.getInputStream();
/* if (in != null) {
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String inputString;
while ((inputString = br.readLine()) != null) {
sb.append(inputString);
sb.append("\n");
protected Boolean doInBackground(Void... params){
URL fileHost = null;
for (String file : downloadList) {
if (file.matches("^(\\w+)(/)$")) {
File dir = createDirectory(file);
Log.i(TAG, "Creating directory:" + file);
localDirList.add(dir);
} else {
String fileName = "";
File writeFile = null;
if (file.contains("/")) {
String[] tokens = file.split("/");
fileName = tokens[tokens.length-1];
String path = file.substring(0, file.length() - fileName.length());
createDirectory(path);
Log.d("FileName", fileName);
Log.d("Path", path);
writeFile = new File(directory + '/' + path, fileName);
} else {
writeFile = new File(directory, file);
localDirList.add(writeFile);
}
try {
fileHost = new URL(baseURL + '/' + initialDir + file);
Log.d(TAG, "Made URL for: " + baseURL + '/' + initialDir + file);
HttpURLConnection conn = (HttpURLConnection) fileHost.openConnection();
conn.setRequestMethod("GET");
conn.connect();
InputStream is = conn.getInputStream();
if (is != null) {
BufferedInputStream inputStream = new BufferedInputStream(is);
FileOutputStream fileOutputStream = new FileOutputStream(writeFile);
int totalSize = conn.getContentLength();
byte[] buffer = new byte[1024 * 1024];
int bufferLength = 0;
while ((bufferLength = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, bufferLength);
}
fileOutputStream.close();
}
} catch(MalformedURLException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}
br.close();
response = sb.toString();
Log.d(TAG, Html.fromHtml(response).toString());
in.close();
}*/
/* if (!file.attr("href").matches("^(\\w+)(/)$")){
fileList.add(file.attr("href"));
Log.d(TAG, file.text());
}
}
return true;
}
// Checks if it's their home directory
if (file.attr("href").matches("^(/~?)(\\w?/+)")) {
Log.d(TAG, "home dir");
}*/
return null;
@Override
protected void onPostExecute(Boolean result){
myDocumentsAdapter.notifyDataSetChanged();
}
}
}
package fieldscience.cs.earlham.edu.fieldday;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.File;
import java.util.ArrayList;
public class MyDocumentsAdapter extends ArrayAdapter<File> {
private Context context;
public MyDocumentsAdapter(Context c, ArrayList<File> files) {
super(c, R.layout.file_list, files);
context = c;
}
public View getView(int position, View convertView, ViewGroup parent){
File file = getItem(position);
if (convertView == null){
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.file_list, parent, false);
}
TextView fName = (TextView) convertView.findViewById(R.id.objectName);
ImageView fType = (ImageView) convertView.findViewById(R.id.objectType);
fName.setText(file.getName());
if (file.isDirectory()){
fType.setImageDrawable(context.getResources().getDrawable(R.drawable.folder_black_icon, null));
} else {
fType.setImageDrawable(context.getResources().getDrawable(R.drawable.file_white_icon, null));
}
return convertView;
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment