From da2df98f789f2531142835dc43566ccda9583c22 Mon Sep 17 00:00:00 2001 From: Joe Robinson Date: Sat, 2 Feb 2013 22:18:05 +0000 Subject: Updated file browser to show icons, size, and modified time. Also added a button to go up a directory, and go to a specified directory --- src/com/lc8n/blauploader/FileArrayAdapter.java | 165 ++++++++++++++++ src/com/lc8n/blauploader/FileBrowser.java | 257 +++++++++++-------------- 2 files changed, 279 insertions(+), 143 deletions(-) create mode 100644 src/com/lc8n/blauploader/FileArrayAdapter.java (limited to 'src/com/lc8n') diff --git a/src/com/lc8n/blauploader/FileArrayAdapter.java b/src/com/lc8n/blauploader/FileArrayAdapter.java new file mode 100644 index 0000000..f15293f --- /dev/null +++ b/src/com/lc8n/blauploader/FileArrayAdapter.java @@ -0,0 +1,165 @@ +package com.lc8n.blauploader; + +import java.io.File; +import java.util.Calendar; + +import android.app.Activity; +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; + +//This class is used to create a list of files +public class FileArrayAdapter extends ArrayAdapter { + + private Context context; + private int layoutResourceId; + private File[] files = null; + + public FileArrayAdapter(Context context, int layoutResourceId, + File[] files) { + super(context, layoutResourceId, files); + this.context = context; + this.layoutResourceId = layoutResourceId; + this.files = files; + } + + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + View row = convertView; + FileHolder holder = null; + + if(row == null) + { + LayoutInflater inflater = ((Activity)context).getLayoutInflater(); + row = inflater.inflate(layoutResourceId, parent, false); + + //Connect the holder to the GUI objects + holder = new FileHolder(); + holder.fileIcon = (ImageView)row.findViewById(R.id.fileicon); + holder.fileName = (TextView)row.findViewById(R.id.filetext); + holder.fileSize = (TextView)row.findViewById(R.id.filesize); + holder.fileModified = (TextView)row.findViewById(R.id.filemodified); + + row.setTag(holder); + } + else + { + holder = (FileHolder)row.getTag(); + } + + File file = files[position]; + + if (file.isDirectory()) { + holder.fileIcon.setImageResource(R.drawable.folder); + + //If it's a folder, the file size is irrelevant. Get the number of files inside instead + if (file.list()!= null) { + int numFiles = file.list().length; + if (numFiles == 1) { + holder.fileSize.setText("1 File"); + } else if (numFiles == 0) { + holder.fileSize.setText("Empty"); + } else { + holder.fileSize.setText(numFiles+" Files"); + } + } else { + holder.fileSize.setText("Empty"); + } + } else { + + //Check the file extension to set the icon + String[] fileParts = file.getName().split("\\."); + if (fileParts.length != 0) { + String extension = fileParts[fileParts.length-1]; + + if (extension.equalsIgnoreCase("jpg") || extension.equalsIgnoreCase("jpeg") || extension.equalsIgnoreCase("png") || extension.equalsIgnoreCase("gif")) { + holder.fileIcon.setImageResource(R.drawable.image); + } else if (extension.equalsIgnoreCase("mp3") || extension.equalsIgnoreCase("wav") || extension.equalsIgnoreCase("aac") || extension.equalsIgnoreCase("wma")) { + holder.fileIcon.setImageResource(R.drawable.music); + } else if (extension.equalsIgnoreCase("mp4") || extension.equalsIgnoreCase("avi") || extension.equalsIgnoreCase("mkv") || extension.equalsIgnoreCase("3gp")) { + holder.fileIcon.setImageResource(R.drawable.movie); + } else if (extension.equalsIgnoreCase("txt") || extension.equalsIgnoreCase("pdf") || extension.equalsIgnoreCase("rtf") || extension.equalsIgnoreCase("log")) { + holder.fileIcon.setImageResource(R.drawable.text); + } else if (extension.equalsIgnoreCase("zip") || extension.equalsIgnoreCase("gz") || extension.equalsIgnoreCase("rar") || extension.equalsIgnoreCase("bz2")) { + holder.fileIcon.setImageResource(R.drawable.compressed); + } else if (extension.equalsIgnoreCase("exe") || extension.equalsIgnoreCase("apk") ) { + holder.fileIcon.setImageResource(R.drawable.binary); + } else { + holder.fileIcon.setImageResource(R.drawable.unknown); + } + + } else { + //We probably can't get here, but you never know + holder.fileIcon.setImageResource(R.drawable.generic); + } + + long fileSizeBytes = file.length(); + double floatFileSize = 0; + String strFileSize = ""; + + //Round it to the largest unit, and print it with 2 decimal places + if(fileSizeBytes > 1073741824) { + floatFileSize = (double)fileSizeBytes / 1073741824; + strFileSize = String.format("%.2f", floatFileSize) + " GB"; + } else if (fileSizeBytes > 1048576) { + floatFileSize = (double)fileSizeBytes / 1048576; + strFileSize = String.format("%.2f", floatFileSize) + " MB"; + } else if (fileSizeBytes > 1024) { + floatFileSize = (double)fileSizeBytes / 1024; + strFileSize = String.format("%.2f", floatFileSize) + " kB"; + } else { + strFileSize = fileSizeBytes + "B"; + } + + holder.fileSize.setText(strFileSize); + } + + holder.fileName.setText(file.getName()); + + //File modified time is a unix timestamp, turn it into a readable date/time + Calendar fileModTime = Calendar.getInstance(); + fileModTime.setTimeInMillis(file.lastModified()); + + //Add leading 0s + int hour = fileModTime.get(Calendar.HOUR_OF_DAY); + String time; + if (hour < 10) { + time = "0" + hour; + } else { + time = String.valueOf(hour); + } + + int minute = fileModTime.get(Calendar.HOUR); + if (minute < 10) { + time += ":0" + minute; + } else { + time += ":" + String.valueOf(minute); + } + + if (hour < 12) { + time += " AM"; + } else { + time += " PM"; + } + holder.fileModified.setText(fileModTime.get(Calendar.DAY_OF_MONTH)+"/"+(fileModTime.get(Calendar.MONTH)+1)+"/"+fileModTime.get(Calendar.YEAR)+" "+time); + + return row; + } + + static class FileHolder + { + ImageView fileIcon; + TextView fileName; + TextView fileSize; + TextView fileModified; + + } + +} + + diff --git a/src/com/lc8n/blauploader/FileBrowser.java b/src/com/lc8n/blauploader/FileBrowser.java index 890ee28..29f5af5 100644 --- a/src/com/lc8n/blauploader/FileBrowser.java +++ b/src/com/lc8n/blauploader/FileBrowser.java @@ -30,12 +30,16 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.telephony.SmsManager; +import android.util.Log; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; -import android.view.View; +import android.view.View; +import android.view.inputmethod.EditorInfo; import android.widget.AdapterView; -import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.ImageButton; import android.widget.ListView; import android.widget.TextView; @@ -43,11 +47,12 @@ public class FileBrowser extends Activity { /** Called when the activity is first created. */ private List directoryEntries = new ArrayList(); - private File currentDirectory = new File("/"); + private File[] files; + private File currentDirectory = new File("/mnt/sdcard"); private float fileSize = 0; private Handler pbHandle = null; private ProgressDialog progressDialog; - private ListView fileList; + private ListView fileListView; @Override public void onCreate(Bundle savedInstanceState) { @@ -56,54 +61,88 @@ public class FileBrowser extends Activity { setContentView(R.layout.browser); directoryEntries.clear(); + + files = currentDirectory.listFiles(); +// fileList = new ArrayList(files); +// //directoryEntries.add("Directory:"+currentDirectory.getAbsolutePath()); +// directoryEntries.add("Up One Level"); +// if (files != null) +// { +// for (File file: files) +// { +// fileList.add(file); +// directoryEntries.add(file.getAbsolutePath()); +//// System.out.println(file.getPath()); +// } +// } - File[] files = currentDirectory.listFiles(); - //directoryEntries.add("Directory:"+currentDirectory.getAbsolutePath()); - directoryEntries.add("Up One Level"); - if (files != null) - { - for (File file: files) - { - directoryEntries.add(file.getAbsolutePath()); -// System.out.println(file.getPath()); - } - } - - TextView header = (TextView)findViewById(R.id.directoryname); + final EditText header = (EditText)findViewById(R.id.directoryname); header.setText(currentDirectory.getAbsolutePath()); - ArrayAdapter directoryList = new ArrayAdapter(this, R.layout.filerow, this.directoryEntries); - fileList = (ListView)findViewById(R.id.filelist); + + //Listen for events from the file path box + header.setOnEditorActionListener(new TextView.OnEditorActionListener() { + + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + + File checkFile = new File (header.getText().toString()); + + //When enter/confirm/go/done (how many possibilities are there) is hit, try and go to the path entered + if (actionId == EditorInfo.IME_ACTION_GO || actionId == KeyEvent.KEYCODE_ENTER || actionId == EditorInfo.IME_ACTION_NEXT || actionId == EditorInfo.IME_ACTION_DONE) { + if (checkFile.exists() && checkFile.isDirectory()) { + currentDirectory = checkFile; + browseTo(currentDirectory); + } else { + //TODO: Error message if it doesn't exist. Maybe upload if it's a file? + } + } + //I have no idea why I have to return something for this function + return true; + } + }); - fileList.setAdapter(directoryList); + //Go button does the same as hitting enter, try and go to the folder + ImageButton goToDir = (ImageButton) findViewById(R.id.goDirButton); + goToDir.setOnClickListener(new View.OnClickListener() { + + public void onClick(View v) { + File checkFile = new File (header.getText().toString()); + if (checkFile.exists() && checkFile.isDirectory()) { + currentDirectory = checkFile; + browseTo(currentDirectory); + } else { + //TODO: Error message if it doesn't exist. Maybe upload if it's a file? + } + }}); - fileList.setOnItemClickListener(new ListView.OnItemClickListener() { - + //Up button goes to the folder above the current one + ImageButton upDir = (ImageButton) findViewById(R.id.upDirButton); + upDir.setOnClickListener(new View.OnClickListener() { + + public void onClick(View v) { + //Go up unless there is no parent (if the result is null) + if (currentDirectory.getParentFile() != null) { + currentDirectory = currentDirectory.getParentFile(); + browseTo(currentDirectory); + } + }}); + + //ArrayAdapter directoryList = new ArrayAdapter(this, R.layout.filerow, this.directoryEntries); + + //Use the FileArrayAdapter to apply the list of files to the list view + fileListView = (ListView)findViewById(R.id.filelist); + FileArrayAdapter fileAdapter = new FileArrayAdapter(this, R.layout.filerow, files); + fileListView.setAdapter(fileAdapter); + + //Handler for clicks on the list + fileListView.setOnItemClickListener(new ListView.OnItemClickListener() { public void onItemClick(AdapterView l, View v, int position, long id) { - String fileString = directoryEntries.get(position); - - - if(fileString.contains("Directory:")) - { - browseTo(currentDirectory); - } - else if (fileString.equals("Up One Level")) - { - System.out.println(currentDirectory.getParentFile().getPath()); - if (currentDirectory.getParent() != null) - { - currentDirectory = currentDirectory.getParentFile(); - browseTo(currentDirectory); - } - } - else - { - - - File chosenFile = new File(fileString); + File chosenFile = files[position]; + + //If it's a folder, open it, if not, upload the file if (chosenFile.isDirectory()) { currentDirectory = chosenFile; @@ -111,17 +150,12 @@ public class FileBrowser extends Activity { } else { - - //upload it + //Upload it + //TODO: Ask for confirmation before uploading (maybe send them to the fileshare screen? or a popup to let them rename) try { fileSize = chosenFile.length(); - - - - - FileUpload fu = new FileUpload(chosenFile,pbHandle); Thread thread = new Thread(fu); @@ -139,28 +173,21 @@ public class FileBrowser extends Activity { } } - - } } - - + }); + + //Show progress while it's uploading + //TODO: Make it use the filesize, not percent progressDialog = new ProgressDialog(this); - progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setMessage("Blauploading..."); progressDialog.setCancelable(true); progressDialog.setProgress(0); - -// -// - - - pbHandle = new Handler(){ @Override @@ -190,96 +217,40 @@ public class FileBrowser extends Activity { } - public void browseTo(File dir) - { + //Reload the screen with the specified folder + public void browseTo(File dir) { directoryEntries.clear(); - - File[] files = dir.listFiles(); - //directoryEntries.add("Current Directory:"+currentDirectory.getAbsolutePath()); - directoryEntries.add("Up One Level"); + + //Get a list of files + if (dir.listFiles() != null) { + files = dir.listFiles(); + } else { + files = new File[0]; + } + + //Set the text box to the new folder TextView header = (TextView)findViewById(R.id.directoryname); header.setText(currentDirectory.getAbsolutePath()); // System.out.println(files.length); - if(files != null) - { - for (File file: files) - { - directoryEntries.add(file.getAbsolutePath()); - System.out.println(file.getPath()); - } - } - ArrayAdapter directoryList = new ArrayAdapter(this, R.layout.filerow, this.directoryEntries); - - fileList.setAdapter(directoryList); +// if(files != null) +// { +// for (File file: files) +// { +// directoryEntries.add(file.getAbsolutePath()); +// System.out.println(file.getPath()); +// } +// } +// ArrayAdapter directoryList = new ArrayAdapter(this, R.layout.filerow, this.directoryEntries); +// +// fileListView.setAdapter(directoryList); +// + FileArrayAdapter fileAdapter = new FileArrayAdapter(this, R.layout.filerow, files); + fileListView.setAdapter(fileAdapter); } - //Override - protected void onListItemClick(ListView l, View v, int position, long id) { - - String fileString = directoryEntries.get(position); - - - if(fileString.contains("Directory:")) - { - browseTo(currentDirectory); - } - else if (fileString.equals("Up One Level")) - { - System.out.println(currentDirectory.getParentFile().getPath()); - if (currentDirectory.getParent() != null) - { - currentDirectory = currentDirectory.getParentFile(); - browseTo(currentDirectory); - } - } - else - { - - - File chosenFile = new File(fileString); - if (chosenFile.isDirectory()) - { - currentDirectory = chosenFile; - browseTo(currentDirectory); - } - else - { - - //upload it - try { - - fileSize = chosenFile.length(); - - - - - - FileUpload fu = new FileUpload(chosenFile,pbHandle); - Thread thread = new Thread(fu); - - thread.start(); - - SmsManager sms = SmsManager.getDefault(); - sms.sendTextMessage("07927278978", null, "New file blauploaded: http://www.blaupload.co.uk/"+chosenFile.getName(), null, null); - - - - } catch (Exception e) { - // TODO Auto-generated catch block - System.err.println(e.getMessage()); - e.printStackTrace(); - } - - } - - } - - - - } - + //Set up menu options to go to other screens @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); -- cgit v1.2.3