diff options
| author | Joe Robinson <joe@lc8n.com> | 2015-12-15 20:43:45 +0000 | 
|---|---|---|
| committer | Joe Robinson <joe@lc8n.com> | 2015-12-15 20:43:45 +0000 | 
| commit | 30d164851ac3d4e7397e010baa24a8e5cb0dc090 (patch) | |
| tree | fcb45696618d4588fb4fcd052db2c217e587d82e /app/src/main/java/com | |
| parent | eb7c5e7d7b332fb488658bb84066b0b3c516896e (diff) | |
Diffstat (limited to 'app/src/main/java/com')
10 files changed, 1803 insertions, 0 deletions
diff --git a/app/src/main/java/com/lc8n/blauploader/FileArrayAdapter.java b/app/src/main/java/com/lc8n/blauploader/FileArrayAdapter.java new file mode 100644 index 0000000..4c4f7fe --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/FileArrayAdapter.java @@ -0,0 +1,165 @@ +package com.lc8n.blauploader; + +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; + +import java.io.File; +import java.util.Calendar; + +//This class is used to create a list of files +public class FileArrayAdapter extends ArrayAdapter<File> { + +	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/app/src/main/java/com/lc8n/blauploader/FileBrowser.java b/app/src/main/java/com/lc8n/blauploader/FileBrowser.java new file mode 100644 index 0000000..2d0b025 --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/FileBrowser.java @@ -0,0 +1,289 @@ +/*
 +    This program is free software: you can redistribute it and/or modify
 +    it under the terms of the GNU General Public License as published by
 +    the Free Software Foundation, either version 3 of the License, or
 +    (at your option) any later version.
 +
 +    This program is distributed in the hope that it will be useful,
 +    but WITHOUT ANY WARRANTY; without even the implied warranty of
 +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +    GNU General Public License for more details.
 +
 +    You should have received a copy of the GNU General Public License
 +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 +*/
 +
 +/*
 +    Copyright 2010 Joe Robinson <joe@lc8n.com>
 +*/
 +
 +package com.lc8n.blauploader;
 +
 +import android.app.Activity;
 +import android.app.ProgressDialog;
 +import android.content.Intent;
 +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.inputmethod.EditorInfo;
 +import android.widget.AdapterView;
 +import android.widget.EditText;
 +import android.widget.ImageButton;
 +import android.widget.ListView;
 +import android.widget.TextView;
 +
 +import java.io.File;
 +import java.util.ArrayList;
 +import java.util.List;
 +
 +public class FileBrowser extends Activity {
 +    /** Called when the activity is first created. */
 +	
 +	private List<String> directoryEntries = new ArrayList<String>();
 +	private File[] files;
 +    private File currentDirectory = new File("/mnt/sdcard");
 +    private float fileSize = 0;
 +    private Handler pbHandle = null;
 +    private ProgressDialog progressDialog;
 +    private ListView fileListView;
 +    
 +    @Override
 +    public void onCreate(Bundle savedInstanceState) {
 +        super.onCreate(savedInstanceState);
 +		
 +        setContentView(R.layout.browser);
 +        
 +        directoryEntries.clear();
 +
 +        files = currentDirectory.listFiles();
 +//        fileList = new ArrayList<File>(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());
 +//        }
 +//        }
 +        
 +        final EditText header = (EditText)findViewById(R.id.directoryname);
 +        header.setText(currentDirectory.getAbsolutePath());
 +
 +        //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;
 +			}
 +		});
 +        
 +        //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?
 +				}
 +			}});
 +        
 +        //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<String> directoryList = new ArrayAdapter<String>(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) {
 +
 +			    	File chosenFile = files[position];
 +			    	
 +			    	//If it's a folder, open it, if not, upload the file
 +			    	if (chosenFile.isDirectory())
 +			    	{
 +			    		currentDirectory = chosenFile;
 +			    		browseTo(currentDirectory);
 +			    	}
 +			    	else
 +			    	{
 +		    			//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);
 +							
 +							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
 +							Log.e("Error sending SMS", e.getMessage());
 +							e.printStackTrace();
 +						}
 +			    		
 +			    	}
 +				
 +			}
 + 
 +        	
 +        });
 +        
 +        //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					
 +		public void handleMessage(Message msg) {
 +		
 +			/* get the value from the Message */
 +			
 +			long progress = msg.getData().getLong("progress_update");
 +			if(progress>(fileSize-10240))
 +			{
 +				progressDialog.dismiss();
 +			}
 +			float percent = (progress/fileSize)*100;
 +			Integer intProgress = Math.round(percent);
 +			if(intProgress==100)
 +			{
 +				progressDialog.dismiss();
 +			}
 +			else
 +			{
 +				progressDialog.show();
 +				progressDialog.setProgress(intProgress);
 +			}
 +		}
 +		};
 +        
 +    }
 +    
 +    //Reload the screen with the specified folder
 +    public void browseTo(File dir) {
 +        directoryEntries.clear();
 +
 +        //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<String> directoryList = new ArrayAdapter<String>(this, R.layout.filerow, this.directoryEntries);
 +//        
 +//        fileListView.setAdapter(directoryList);
 +//        
 +        FileArrayAdapter fileAdapter = new FileArrayAdapter(this, R.layout.filerow, files); 
 +        fileListView.setAdapter(fileAdapter);
 +    }
 +    
 +    
 +
 +    //Set up menu options to go to other screens
 +	@Override
 +	public boolean onCreateOptionsMenu(Menu menu) {
 +	    MenuInflater inflater = getMenuInflater();
 +	    inflater.inflate(R.menu.menu, menu);
 +	    return true;
 +	}
 +	
 +	@Override
 +	public boolean onOptionsItemSelected(MenuItem item) {
 +	    // Handle item selection
 +	    switch (item.getItemId()) {
 +	    case R.id.menuBrowse:
 +//	    	Intent browse = new Intent(this, FileBrowser.class);
 +//            startActivityForResult(browse, 0);;
 +	        return true;
 +	    case R.id.menuRecord:
 +	    	Intent record = new Intent(this, SoundRecorder.class);
 +            startActivityForResult(record, 0);
 +	        return true;
 +	    case R.id.menuLocate:
 +	    	Intent locate = new Intent(this, UploadLocation.class);
 +            startActivityForResult(locate, 0);;
 +	        return true;    
 +	    case R.id.menuExit:
 +	    	this.finish();
 +	    	break; 
 +	    default:
 +	        return super.onOptionsItemSelected(item);
 +	        
 +	    }
 +	    return true;
 +
 +	}
 +    
 +
 + 
 +}
\ No newline at end of file diff --git a/app/src/main/java/com/lc8n/blauploader/FileShare.java b/app/src/main/java/com/lc8n/blauploader/FileShare.java new file mode 100644 index 0000000..9640e61 --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/FileShare.java @@ -0,0 +1,513 @@ +package com.lc8n.blauploader;
 +
 +import android.app.Activity;
 +import android.app.AlertDialog;
 +import android.content.ContentResolver;
 +import android.content.Context;
 +import android.content.DialogInterface;
 +import android.content.Intent;
 +import android.database.Cursor;
 +import android.graphics.Bitmap;
 +import android.graphics.Bitmap.CompressFormat;
 +import android.graphics.BitmapFactory;
 +import android.graphics.Matrix;
 +import android.graphics.Point;
 +import android.media.ThumbnailUtils;
 +import android.net.Uri;
 +import android.os.Bundle;
 +import android.os.Handler;
 +import android.provider.MediaStore;
 +import android.util.Log;
 +import android.view.Display;
 +import android.view.View;
 +import android.view.animation.Animation;
 +import android.view.animation.LinearInterpolator;
 +import android.view.animation.RotateAnimation;
 +import android.view.inputmethod.InputMethodManager;
 +import android.widget.Button;
 +import android.widget.CheckBox;
 +import android.widget.EditText;
 +import android.widget.ImageView;
 +
 +import com.lc8n.util.FileUploader;
 +
 +import java.io.File;
 +import java.io.FileInputStream;
 +import java.io.FileNotFoundException;
 +import java.io.FileOutputStream;
 +import java.io.IOException;
 +import java.io.OutputStream;
 +
 +public class FileShare extends Activity {
 +	private EditText text;
 +	private long fileSize;
 +	private Handler pbHandle = null;
 +	//private ProgressDialog progressDialog;
 +	//private ProgressDialog preparing;
 +	private String fileName; 
 +	private Thread thread;
 +	private AlertDialog alert;
 +	private File file;
 +	private File blaFile;
 +	private ImageView thumbView;
 +	private int imgRotate = 0;
 +	private Context context = this;
 +	public void onCreate(Bundle savedInstanceState)
 +	{
 +		
 +        super.onCreate(savedInstanceState);
 +        setContentView(R.layout.share);
 +        
 +        //Temp files are stored in this folder
 +        final File blaDirectory = new File("/sdcard/blaupload");
 +        blaDirectory.mkdirs();
 +        
 +        Intent intent = getIntent();
 +        Bundle extras = intent.getExtras();
 +        String action = intent.getAction();
 +        
 +        //Set up filename input text box
 +        text = (EditText) findViewById(R.id.filename);
 +        text.requestFocus();
 +        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))  
 +        .showSoftInput(text, 0);  
 +
 +        //Set up alert box for any FTP error messages
 +        alert = new AlertDialog.Builder(this).create();
 +        alert.setTitle("FTP Response");
 +        alert.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
 +				
 +				public void onClick(DialogInterface dialog, int which) {
 +					alert.dismiss();
 +					
 +				}
 +			});
 + 
 +        //Set up progress dialog which will show upload progress
 +//        progressDialog = new ProgressDialog(this);
 +//		
 +//		progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 +//		progressDialog.setMessage("Blauploading...");
 +//		progressDialog.setCancelable(true);
 +//		progressDialog.setProgress(0);
 +//		
 +//		
 +//		progressDialog.setButton(AlertDialog.BUTTON_NEGATIVE, getText(R.string.cancel), new DialogInterface.OnClickListener() {
 +//			
 +//			public void onClick(DialogInterface dialog, int which) {
 +//				// Cancel the upload!
 +//				progressDialog.dismiss();
 +//				thread.interrupt();
 +//				
 +//				
 +//			}
 +//		});
 +
 +		//Set up preparing dialog which will be shown when connecting to FTP
 +//		preparing = new ProgressDialog(this);
 +//		preparing.setProgressStyle(maxProgressDialog.STYLE_SPINNER);
 +//		preparing.setMessage("Preparing to Blaupload...");
 +//		preparing.setCancelable(true);
 +//		preparing.setButton(AlertDialog.BUTTON_NEGATIVE, getText(R.string.cancel), new DialogInterface.OnClickListener() {
 +//			
 +//			public void onClick(DialogInterface dialog, int which) {
 +//				// Cancel the upload!
 +//				progressDialog.dismiss();
 +//				thread.interrupt();
 +//
 +//			}
 +//		});
 +//		
 +
 +		//Handles responses from the FTP thread
 +//		pbHandle = new Handler(){
 +//		
 +//        @Override					
 +//		public void handleMessage(Message msg) {
 +//		
 +//        	//Get the current progress (file size completed in bytes)
 +//			long progress = msg.getData().getLong("progress_update");
 +//			float percent = (progress/fileSize)*100.0f;
 +//			Integer intProgress = Math.round(percent);
 +//			
 +//			int kB = Math.round(progress / 1024);
 +//			
 +//			//TODO: Make this not terrible
 +//			//Checks for filesize - 10kB because that's the last guaranteed response
 +//			//But there might be more, which would result in multiple SMSs
 +//			//Need a nicer way of cleaning up when it's done
 +//			if(intProgress==100 || progress>(fileSize-10240)) {
 +//				SmsManager sms = SmsManager.getDefault();
 +//				sms.sendTextMessage("07927278978", null, "New image blauploaded: http://www.blaupload.co.uk/"+fileName,null, null);
 +//				blaFile.delete();
 +//				progressDialog.dismiss();
 +//			}
 +//			else {
 +//				//Really not sure why this is in an else
 +//				//Close the prepare dialog and start the progress dialog 
 +//				preparing.dismiss();
 +//				progressDialog.show();
 +//				progressDialog.setProgress(kB);
 +//			}
 +//			
 +//			int code = msg.getData().getInt("response");
 +//			
 +//			//Handle FTP response codes
 +//			switch (code) {
 +//			case 0:
 +//			break;
 +//			case 600:
 +//				alert.setMessage("File Already Exists! Please Rename");
 +//				alert.show();
 +//				progressDialog.dismiss();
 +//				thread.interrupt();
 +//				break;
 +//			case 226:
 +//				//This is the response code for complete,  but we usually don't receive it
 +//				//TODO: Make sure we receive it
 +//				//SmsManager sms = SmsManager.getDefault();
 +//				//sms.sendTextMessage("07927278978", null, "New image blauploaded: http://www.blaupload.co.uk/"+fileName,null, null);
 +//				progressDialog.dismiss();
 +//				break;
 +//			case 800:
 +//				alert.setMessage("Unable To Connect To Server!");
 +//				alert.show();
 +//				progressDialog.dismiss();
 +//				break;
 +//			case 801:
 +//				alert.setMessage("Unable To Log In!");
 +//				alert.show();
 +//				progressDialog.dismiss();
 +//				break;
 +//			case 804:
 +//				alert.setMessage("Unable To Get File List!");
 +//				alert.show();
 +//				progressDialog.dismiss();
 +//				break;
 +//			case 805:
 +//				alert.setMessage("Unable To Get Upload File!");
 +//				alert.show();
 +//				progressDialog.dismiss();
 +//				break;
 +//			case 806:
 +//				alert.setMessage("FTP Server Did Not Respond!");
 +//				alert.show();
 +//				progressDialog.dismissmax();
 +//				break;
 +//			case 807:
 +//				alert.setMessage("Unable To Log Out!");
 +//				alert.show();
 +//				progressDialog.dismiss();
 +//				break;
 +//			default:
 +//				alert.setMessage("Response Code: "+code);
 +//				alert.show();
 +//				progressDialog.dismiss();
 +//				break;
 +//				
 +//			}
 +//		}
 +//		};
 +        
 +		//Handler for "Upload" button
 +		//This is where the magic happens
 +        final Button button = (Button) findViewById(R.id.uploadfile);
 +        button.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +
 +				//Show the preparing dialog while this is all happening
 +				//TODO: There is lag between pressing upload and this happening. Why?
 +        		//preparing.show();
 +				
 +        		//Check box for resizing/reducing quality of image
 +        		CheckBox checkBox = (CheckBox)findViewById(R.id.resize);
 +
 +        		boolean resizeImage = checkBox.isChecked();
 +				fileName = text.getText().toString();
 +				
 +				blaFile = new File(blaDirectory+"/"+fileName);
 +				
 +				//Perform any image manipulation now (currently rotate and quality)
 +	        	if (imgRotate != 0 || resizeImage) {
 +
 +	        		try {
 +						rotateBitmap(file, blaFile, imgRotate, 80);
 +
 +					} catch (FileNotFoundException e) {
 +						Log.e("blauploader", "File not found when rotating");
 +						e.printStackTrace();
 +					} catch (IOException e) {
 +						Log.e("blauploader", "IOException when rotating");
 +						e.printStackTrace();
 +					}
 +	        	} else {
 +	        		try {
 +	        			//Copy the file to our temp dir so we don't break the gallery by renaming
 +	        			//Only do this if we're not using the rotate function, as that does it anyway
 +	        			//TODO: Find a better way to handle this, allow renaming of existing file
 +						copyFile(file, blaFile);
 +					} catch (IOException e) {
 +						Log.e("blauploader", "IOException when copying");
 +						e.printStackTrace();
 +					}
 +	        	}
 +				
 +	        	//Set the filesize again in case it was changed above
 +				fileSize = blaFile.length();
 +				
 +				//Start the upload
 +//                FileUpload uploader = new FileUpload(blaFile, pbHandle);
 +                FileUploader uploader2 = new FileUploader(context);
 +                uploader2.prepare((int)fileSize/1024);
 +                uploader2.execute(blaFile);
 +                
 +//        		thread = new Thread(uploader);
 +//        		thread.start();
 +//        		progressDialog.setMax(Math.round(fileSize/1024));
 +
 +
 +			}
 +		});
 +        
 +        //Rotate button handlers
 +        final Button rLeft = (Button) findViewById(R.id.rotateleft);
 +        rLeft.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +				
 +				//Rotate the thumbnail on the screen
 +				RotateAnimation rotateAnimation = new RotateAnimation(imgRotate, imgRotate-90,
 +						Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 +				rotateAnimation.setInterpolator(new LinearInterpolator());
 +				rotateAnimation.setDuration(100);
 +				rotateAnimation.setFillAfter(true);
 +				thumbView.startAnimation(rotateAnimation);
 +				
 +				//Just keep track of the total rotate, we'll do the rotating of the actual image later
 +				if(imgRotate == -270) {
 +					imgRotate = 0;
 +				} else {
 +					imgRotate -= 90;
 +				}
 +
 +			}
 +        });
 +        
 +        final Button rRight = (Button) findViewById(R.id.rotateright);
 +        rRight.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +
 +				//Rotate the thumbnail on the screen
 +				RotateAnimation rotateAnimation = new RotateAnimation(imgRotate, imgRotate + 90,
 +						Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
 +				rotateAnimation.setInterpolator(new LinearInterpolator());
 +				rotateAnimation.setDuration(100);
 +				rotateAnimation.setFillAfter(true);
 +				thumbView.startAnimation(rotateAnimation);
 +				
 +				//Just keep track of the total rotate, we'll do the rotating of the actual image later
 +				if (imgRotate == 270) {
 +					imgRotate = 0;
 +				} else {
 +					imgRotate += 90;
 +				}
 +
 +			}});
 +        
 +        // if this is from the share menu
 +        //TODO: Actually we want to do this for any image regardless of where it came from
 +        if (Intent.ACTION_SEND.equals(action))
 +        {
 +            if (extras.containsKey(Intent.EXTRA_STREAM))
 +            {
 +                try
 +                {
 +                    // Get resource path from intent callee
 +                    Uri uri = (Uri) extras.getParcelable(Intent.EXTRA_STREAM);
 +                    // Query gallery for camera picture via
 +                    // Android ContentResolver interface
 +                    ContentResolver cr = getContentResolver();
 +                    
 +                    String[] projection = { MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.MIME_TYPE, MediaStore.MediaColumns.SIZE, MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.WIDTH, MediaStore.MediaColumns.HEIGHT};
 +                    Cursor cur = cr.query(uri, projection, null, null, null);
 +                    cur.moveToFirst();
 +                    
 +                	fileName = cur.getString(3);
 +                	fileSize = cur.getLong(2);
 +                	int srcWidth = cur.getInt(4);
 +                	int srcHeight = cur.getInt(5);
 +
 +                    cur.close();
 +                    String[] fileParts = fileName.split("/");
 +                    for (int i = 0; i < fileParts.length; i++) {
 +                    	Log.d("fileparts", fileParts[i]);
 +                    }
 +                    text.setText(fileParts[fileParts.length-1]);
 +                    text.setSelection(0,fileParts[fileParts.length-1].indexOf("."));
 +                    file = new File(fileName);
 +                    
 +                    //Get the screen size, so we can scale the thumbnail
 +                    Display display = getWindowManager().getDefaultDisplay();
 +                    int dspWidth = 0;
 +                    int dspHeight = 0;
 +                    
 +                    //getWidth/Height are deprecated in 13, getSize is not supported pre-13
 +                    if(android.os.Build.VERSION.SDK_INT >= 13) {
 +                    	Point size = new Point();
 +                    	display.getSize(size);
 +                    	dspWidth = size.x - 20;
 +                    	dspHeight = size.y - 20;
 +                    } else {
 +                    	dspWidth = display.getWidth();
 +                    	dspHeight = display.getHeight();
 +                    }
 +                    
 +                    float ratio = 0;
 +                    
 +                    //Scale the thumbnail so neither dimension is bigger than the screen width
 +                    if(srcWidth > srcHeight) {
 +                    	ratio =  (float)dspWidth / (float)srcWidth;
 +                    	dspHeight = Math.round(srcHeight * ratio);
 +                    } else {
 +                    	ratio = (float)dspWidth / (float)srcHeight;
 +                    	dspHeight = dspWidth;
 +                    	dspWidth = Math.round(srcWidth * ratio);
 +                    }
 +                    
 +                    //Get the thumbnail from the ether
 +                    Bitmap sourceImage= BitmapFactory.decodeFile(fileName);
 +                    Bitmap thumbnail = ThumbnailUtils.extractThumbnail(sourceImage, dspWidth, dspHeight);
 +
 +                    thumbView = (ImageView)findViewById(R.id.thumbnail);
 +                    thumbView.setImageBitmap(thumbnail);
 +
 +                    return;
 +                } catch (Exception e)
 +                {
 +                        Log.e(this.getClass().getName(), e.toString());
 +                }
 +
 +            //TODO: I guess this was supposed to be some way to handle sharing text
 +            //That should probably be in the texting screen which I lost
 +            } else if (extras.containsKey(Intent.EXTRA_TEXT))
 +            {
 +                    return;
 +            }
 +        }
 +	}
 +	
 +	//Code from http://bricolsoftconsulting.com/2012/12/07/handling-large-images-on-android
 +	private boolean rotateBitmap(File inFile, File outFile, int angle, int quality)
 +			throws FileNotFoundException, IOException
 +	{
 +		
 +
 +	    //TODO: Faster way for ICS+, uses OpenGL
 +		//See package com.android.gallery3d.photoeditor.RendererUtils from AOSP/CM gallery to create a GL texture
 +		/*if(android.os.Build.VERSION.SDK_INT >= 14) {
 +			Bitmap bitmap = BitmapFactory.decodeFile(inFile.getAbsolutePath());
 +
 +			Texture texture = RendererUtils.
 +		    EffectContext context = EffectContext.createWithCurrentGlContext();
 +			Effect rotate = context.getFactory().createEffect(EffectFactory.EFFECT_ROTATE);
 +	        rotate.setParameter("angle", (int) imgRotate);
 +		}*/
 +		
 +	    // Declare
 +	    FileInputStream inStream = null;
 +	    FileOutputStream outStream = null;
 +
 +	    // Create options
 +	    BitmapFactory.Options options = new BitmapFactory.Options();
 +
 +	    // Create transform matrix
 +	    Matrix matrix = new Matrix();
 +	    matrix.postRotate(angle);
 +
 +	    // Increment inSampleSize progressively to reduce image resolution and size. If
 +	    // the program is properly managing memory, and you don't have other large images
 +	    // loaded in memory, this loop will generally not need to go through more than 3
 +	    // iterations. To be safe though, we stop looping after a certain amount of tries
 +	    // to avoid infinite loops
 +	    for (options.inSampleSize = 1; options.inSampleSize <= 32; options.inSampleSize++)
 +	    {
 +	        try
 +	        {
 +	            // Load the bitmap from file
 +	            inStream = new FileInputStream(inFile);
 +	            Bitmap originalBitmap = BitmapFactory.decodeStream(inStream, null, options);
 +
 +	            // Rotate the bitmap
 +	            Bitmap rotatedBitmap = Bitmap.createBitmap(originalBitmap, 0, 0, originalBitmap.getWidth(), originalBitmap.getHeight(), matrix, true);
 +
 +	            // Save the rotated bitmap
 +	            outStream = new FileOutputStream(outFile);
 +
 +	            rotatedBitmap.compress(CompressFormat.JPEG, quality, outStream);
 +	            outStream.close();
 +
 +	            // Recycle the bitmaps to immediately free memory
 +	            originalBitmap.recycle();
 +	            originalBitmap = null;
 +	            rotatedBitmap.recycle();
 +	            rotatedBitmap = null;
 +
 +	            // Return
 +	            return true;
 +	        }
 +	        catch (OutOfMemoryError e)
 +	        {
 +	            // If an OutOfMemoryError occurred, we continue with for loop and next inSampleSize value
 +	        }
 +	        finally
 +	        {
 +	            // Clean-up if we failed on save
 +	            if (outStream != null)
 +	            {
 +	                try
 +	                {
 +	                    outStream.close();
 +	                }
 +	                catch (IOException e)
 +	                {
 +	                }
 +	            }
 +	        }
 +	    }
 +	    
 +	    
 +
 +	    // Failed
 +	    return false;
 +	}
 +	
 +	//Copies a file from the source to dhe destination
 +	//Currently used to create a temporary copy to upload
 +    public static void copyFile(File source, File destination) throws IOException {
 +    	FileInputStream input = new FileInputStream(source);
 +        OutputStream output = null;
 +        
 +        //Read the input file into a buffer, and write it out to the new file
 +        try {
 +            output = new FileOutputStream(destination);
 +            byte[] buffer = new byte[1024];
 +            int bytesRead = input.read(buffer);
 +            while (bytesRead >= 0) {
 +                output.write(buffer, 0, bytesRead);
 +                bytesRead = input.read(buffer);
 +            }
 +        } catch (Exception e) {
 +            Log.e("blauploader", "Exception in copyFile");
 +            e.printStackTrace();
 +        } finally {
 +            input.close();
 +            output.close();
 +        }
 +        input = null;
 +        output = null;
 +    }
 +	
 +
 +}
 diff --git a/app/src/main/java/com/lc8n/blauploader/FileUpload.java b/app/src/main/java/com/lc8n/blauploader/FileUpload.java new file mode 100644 index 0000000..78bb69d --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/FileUpload.java @@ -0,0 +1,214 @@ +/*
 +    This program is free software: you can redistribute it and/or modify
 +    it under the terms of the GNU General Public License as published by
 +    the Free Software Foundation, either version 3 of the License, or
 +    (at your option) any later version.
 +
 +    This program is distributed in the hope that it will be useful,
 +    but WITHOUT ANY WARRANTY; without even the implied warranty of
 +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +    GNU General Public License for more details.
 +
 +    You should have received a copy of the GNU General Public License
 +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 +*/
 +
 +/*
 +    Copyright 2010 Joe Robinson <joe@lc8n.com>
 +*/
 +
 +package com.lc8n.blauploader;
 +
 +import android.os.Bundle;
 +import android.os.Handler;
 +import android.os.Message;
 +
 +import org.apache.commons.net.ftp.FTP;
 +import org.apache.commons.net.ftp.FTPClient;
 +
 +import java.io.BufferedInputStream;
 +import java.io.File;
 +import java.io.FileInputStream;
 +import java.io.FileNotFoundException;
 +import java.io.IOException;
 +import java.io.InputStream;
 +import java.net.HttpURLConnection;
 +import java.net.MalformedURLException;
 +import java.net.URL;
 +
 +public class FileUpload implements Runnable{
 +	
 +	private File file = null;
 +	private Handler pbHandle;
 +	private InputStream is;
 +	private String fileName;
 +	private FTPClient ftpClient;
 +	
 +	public FileUpload(File file, Handler pbHandle)
 +	{
 +		this.file = file;
 +		this.pbHandle = pbHandle;
 +	}
 +	
 +	public FileUpload(InputStream is, Handler pbHandle, String fileName)
 +	{
 +		this.is = is;
 +		this.pbHandle = pbHandle;
 +		this.fileName = fileName;
 +		
 +		
 +	}
 +
 +	public void httpUpload (File file, Handler pbHandle) {
 +		
 +	}
 +	
 +    public void uploadFile(File file, Handler pbHandle)
 +    {
 +    	
 +    	int code = 0;
 +		FileInputStream fis = null;
 +		try {
 +			fis = new FileInputStream(file);
 +		} catch (FileNotFoundException e) {
 +			code = 700;
 +		}
 +		BufferedInputStream bis = new BufferedInputStream(fis);
 +		ProgressInputStream pis = new ProgressInputStream(bis,pbHandle);
 +		String fileName = file.getName();
 +		ftpClient = new FTPClient();
 +		
 +		try {
 +			ftpClient.connect("tghost.co.uk");
 +		} catch (Exception e) {
 +			code = 800;
 +			e.printStackTrace();
 +		}
 +		try {
 +			ftpClient.login("blaupload", "lemons");
 +		} catch (IOException e) {
 +			code = 801;
 +			e.printStackTrace();
 +		}
 +		try {
 +			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
 +		} catch (IOException e) {
 +			code = 802;
 +		}
 +		ftpClient.enterLocalPassiveMode();
 +		try {
 +			ftpClient.changeWorkingDirectory("blaupload");
 +		} catch (IOException e) {
 +			code = 803;
 +		}
 +		String[] curFiles = null;
 +		try {
 +			curFiles = ftpClient.listNames();
 +		} catch (IOException e) {
 +			code = 804;
 +		}
 +		boolean exists = false;
 +		
 +		//Add http file check
 +		try {
 +			if(fileExists(fileName)) {
 +				exists = true;
 +				code = 600;
 +			}
 +		} catch (MalformedURLException e1) {
 +			// TODO Auto-generated catch block
 +			e1.printStackTrace();
 +		} catch (IOException e1) {
 +			// TODO Auto-generated catch block
 +			e1.printStackTrace();
 +		}
 +		
 +		//FTP file check no longer works on blaupload
 +		for (int i = 0; i < curFiles.length; i++) {
 +			if (curFiles[i].equals(fileName))
 +			{
 +				exists = true;
 +				code = 600;
 +			}
 +		}
 +		if (!exists) {
 +			try {
 +				ftpClient.storeFile(fileName, pis);
 +			} catch (IOException e) {
 +				code = 805;
 +			}
 +			try {
 +				code = ftpClient.getReply();
 +			} catch (IOException e) {
 +				code = 806;
 +			}
 +    	}
 +		try {
 +			bis.close();
 +			pis.close();
 +		} catch (IOException e) {
 +			code = 999;
 +		}
 +
 +        try {
 +			ftpClient.logout();
 +			ftpClient.disconnect();
 +		} catch (IOException e) {
 +			code = 807;
 +		}
 +        
 +        
 +        Bundle data = new Bundle();
 +        data.putInt("response", code);
 +        Message message = Message.obtain();
 +        message.setData(data);
 +        pbHandle.sendMessage(message);
 +
 +    }
 +    
 +
 +	public void run() {
 +		try {
 +			
 +//			if(file == null && is != null) {
 +//				file = new File("/sdcard/blaupload/"+fileName);
 +//		        OutputStream out = new FileOutputStream(file);
 +//		        
 +//				int read=0;
 +//				byte[] bytes = new byte[1024];
 +//		 
 +//				while((read = is.read(bytes))!= -1){
 +//					out.write(bytes, 0, read);
 +//				}
 +//		 
 +//				is.close();
 +//				out.flush();
 +//				out.close();
 +//			}
 +			
 +			uploadFile(file, pbHandle);
 +		} catch (Exception e) {
 +
 +			// TODO Auto-generated catch block
 +			e.printStackTrace();
 +		}
 +		
 +	}
 +	public void interrupt() throws IOException {
 +		ftpClient.abort();
 +		file = null;
 +	}
 +	
 +	public boolean fileExists(String fileName) throws MalformedURLException, IOException {
 +		URL blaURL = new URL("http://www.blaupload.co.uk/" + fileName);
 +		HttpURLConnection connection = (HttpURLConnection) blaURL.openConnection();
 +		connection.setRequestMethod("HEAD");
 +		connection.connect();
 +		if (connection.getResponseCode() == 404) {
 +			return false;
 +		} else {
 +			return true;
 +		}
 +	}
 +
 +}
 diff --git a/app/src/main/java/com/lc8n/blauploader/HomeScreen.java b/app/src/main/java/com/lc8n/blauploader/HomeScreen.java new file mode 100644 index 0000000..5f41df3 --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/HomeScreen.java @@ -0,0 +1,57 @@ +package com.lc8n.blauploader;
 +
 +import android.app.Activity;
 +import android.content.Intent;
 +import android.os.Bundle;
 +import android.view.View;
 +import android.widget.Button;
 +
 +import java.io.File;
 +
 +public class HomeScreen extends Activity{
 +	
 +
 +	public void onCreate(Bundle savedInstanceState) {
 +        super.onCreate(savedInstanceState);
 +        setContentView(R.layout.home);
 +
 +        File blaDirectory = new File("/sdcard/blaupload/");
 +        blaDirectory.mkdirs();
 +
 +        
 +
 +        
 +        final Button browse = (Button) findViewById(R.id.browse);
 +        browse.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +				Intent myIntent = new Intent(v.getContext(), FileBrowser.class);
 +                startActivityForResult(myIntent, 0);
 +                
 +				
 +			}
 +		});
 +        
 +        final Button audio = (Button) findViewById(R.id.audio);
 +        audio.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +				Intent myIntent = new Intent(v.getContext(), SoundRecorder.class);
 +                startActivityForResult(myIntent, 0);
 +				
 +			}
 +		});
 +        
 +        final Button locate = (Button) findViewById(R.id.locate);
 +        locate	 .setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +				Intent myIntent = new Intent(v.getContext(), UploadLocation.class);
 +                startActivityForResult(myIntent, 0);
 +				
 +			}
 +		});
 +        
 +        
 +	}
 +}
 diff --git a/app/src/main/java/com/lc8n/blauploader/ProgressInputStream.java b/app/src/main/java/com/lc8n/blauploader/ProgressInputStream.java new file mode 100644 index 0000000..e206276 --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/ProgressInputStream.java @@ -0,0 +1,97 @@ +/*
 +    This program is free software: you can redistribute it and/or modify
 +    it under the terms of the GNU General Public License as published by
 +    the Free Software Foundation, either version 3 of the License, or
 +    (at your option) any later version.
 +
 +    This program is distributed in the hope that it will be useful,
 +    but WITHOUT ANY WARRANTY; without even the implied warranty of
 +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 +    GNU General Public License for more details.
 +
 +    You should have received a copy of the GNU General Public License
 +    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 +*/
 +
 +/*
 +    Copyright 2010 Joe Robinson <joe@lc8n.com>
 +*/
 +
 +package com.lc8n.blauploader;
 +
 +import android.os.Bundle;
 +import android.os.Handler;
 +import android.os.Message;
 +
 +import java.io.IOException;
 +import java.io.InputStream;
 + 
 +public class ProgressInputStream extends InputStream {
 + 
 +    /* Key to retrieve progress value from message bundle passed to handler */
 +    public static final String PROGRESS_UPDATE = "progress_update";
 + 
 +    private static final int TEN_KILOBYTES = 1024 * 10;
 + 
 +    private InputStream inputStream;
 +    private Handler handler;
 + 
 +    private long progress;
 +    private long lastUpdate;
 + 
 +    private boolean closed;
 + 
 +    public ProgressInputStream(InputStream inputStream, Handler handler) {
 +        this.inputStream = inputStream;
 +        this.handler = handler;
 + 
 +        this.progress = 0;
 +        this.lastUpdate = 0;
 + 
 +        this.closed = false;
 +    }
 + 
 +    @Override
 +        public int read() throws IOException {
 +            int count = inputStream.read();
 +            return incrementCounterAndUpdateDisplay(count);
 +        }
 + 
 +    @Override
 +        public int read(byte[] b, int off, int len) throws IOException {
 +            int count = inputStream.read(b, off, len);
 +            return incrementCounterAndUpdateDisplay(count);
 +        }
 + 
 +    @Override
 +        public void close() throws IOException {
 +            super.close();
 +            if (closed)
 +                throw new IOException("already closed");
 +            closed = true;
 +        }
 + 
 +    private int incrementCounterAndUpdateDisplay(int count) {
 +        if (count > 0)
 +            progress += count;
 +        lastUpdate = maybeUpdateDisplay(progress, lastUpdate);
 +        return count;
 +    }
 + 
 +    private long maybeUpdateDisplay(long progress, long lastUpdate) {
 +        if (progress - lastUpdate > TEN_KILOBYTES) {
 +            lastUpdate = progress;
 +            sendLong(PROGRESS_UPDATE, progress);
 +        }
 +        return lastUpdate;
 +    }
 + 
 +    public void sendLong(String key, long value) {
 +        Bundle data = new Bundle();
 +        data.putLong(key, value);
 +     
 +        Message message = Message.obtain();
 +        message.setData(data);
 +        handler.sendMessage(message);
 +    }
 +}
\ No newline at end of file diff --git a/app/src/main/java/com/lc8n/blauploader/SoundRecorder.java b/app/src/main/java/com/lc8n/blauploader/SoundRecorder.java new file mode 100644 index 0000000..fb32993 --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/SoundRecorder.java @@ -0,0 +1,162 @@ +package com.lc8n.blauploader;
 +
 +import android.app.Activity;
 +import android.app.ProgressDialog;
 +import android.content.ContentValues;
 +import android.content.Intent;
 +import android.media.MediaRecorder;
 +import android.os.Bundle;
 +import android.os.Handler;
 +import android.os.Message;
 +import android.provider.MediaStore;
 +import android.telephony.SmsManager;
 +import android.view.Menu;
 +import android.view.MenuInflater;
 +import android.view.MenuItem;
 +import android.view.View;
 +import android.widget.Button;
 +import android.widget.Toast;
 +
 +import java.io.File;
 +
 +public class SoundRecorder extends Activity{
 +
 +	private MediaRecorder mediaRecorder; 
 +	private String fileName;
 +	private ProgressDialog progressDialog;
 +	private long fileSize;
 +	private Handler pbHandle = null;
 +	public void onCreate(Bundle savedInstanceState) {
 +        super.onCreate(savedInstanceState);
 +        setContentView(R.layout.soundrecorder);
 +
 +        final Button recordButton = (Button) findViewById(R.id.Record);
 +        recordButton.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +				Toast toast = Toast.makeText(getApplicationContext(), "Recording!", 10);
 +				toast.show();
 +				recordAudio();
 +			}
 +		});
 +        
 +        final Button stopButton = (Button) findViewById(R.id.Stop);
 +        stopButton.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +				Toast toast = Toast.makeText(getApplicationContext(), "Stopping!", 10);
 +				toast.show();
 +				stopAudio();
 +			}
 +		});
 +        
 +        progressDialog = new ProgressDialog(this);
 +		
 +		
 +		progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 +		progressDialog.setMessage("Blauploading...");
 +		progressDialog.setCancelable(true);
 +		progressDialog.setProgress(0);
 +		
 +		pbHandle = new Handler(){
 +			
 +	        @Override					
 +			public void handleMessage(Message msg) {
 +			
 +				/* get the value from the Message */
 +				
 +				long progress = msg.getData().getLong("progress_update");
 +				if(progress>(fileSize-10240))
 +				{
 +					progressDialog.dismiss();
 +				}
 +				float percent = (progress/fileSize)*100;
 +				Integer intProgress = Math.round(percent);
 +				if(intProgress==100)
 +				{
 +					progressDialog.dismiss();
 +				}
 +				else
 +				{
 +					progressDialog.show();
 +					progressDialog.setProgress(intProgress);
 +				}
 +			}
 +			};
 +        
 +	}
 +	
 +	public void recordAudio()
 +	{
 +		mediaRecorder = new MediaRecorder();
 +		mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 +		mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
 +		mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
 +		ContentValues contentValues = new ContentValues(3);
 +		contentValues.put(MediaStore.MediaColumns.TITLE, "Blauploaded from Android");
 +		contentValues.put(MediaStore.MediaColumns.DATE_ADDED, System.currentTimeMillis());
 +//		contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mediaRecorder.)
 +		
 +		fileName = "/sdcard/blasound"+System.currentTimeMillis()+".mp4";
 +		mediaRecorder.setOutputFile(fileName);
 +		try {
 +			mediaRecorder.prepare();
 +		} catch (Exception e) {
 +			// TODO Auto-generated catch block
 +			e.printStackTrace();
 +		}
 +		mediaRecorder.start();
 +	}
 +	
 +	public void stopAudio()
 +	{
 +		mediaRecorder.stop();
 +		mediaRecorder.release();
 +		File recordedSound = new File(fileName);
 +		fileSize = recordedSound.length();
 +
 +		
 +		FileUpload fu = new FileUpload(recordedSound,pbHandle);
 +		Thread thread = new Thread(fu);
 +		
 +		thread.start();
 +		
 +		SmsManager sms = SmsManager.getDefault();
 +		sms.sendTextMessage("07927278978", null, "New sound recording blauploaded: http://www.blaupload.co.uk/"+recordedSound.getName(), null, null);
 +	}
 +	
 +	@Override
 +	public boolean onCreateOptionsMenu(Menu menu) {
 +	    MenuInflater inflater = getMenuInflater();
 +	    inflater.inflate(R.menu.menu, menu);
 +	    return true;
 +	}
 +	
 +	@Override
 +	public boolean onOptionsItemSelected(MenuItem item) {
 +	    // Handle item selection
 +	    switch (item.getItemId()) {
 +	    case R.id.menuBrowse:
 +	    	Intent browse = new Intent(this, FileBrowser.class);
 +            startActivityForResult(browse, 0);
 +	        return true;
 +	    case R.id.menuRecord:
 +//	    	Intent record = new Intent(this, SoundRecorder.class);
 +//            startActivityForResult(record, 0);
 +	        return true;
 +	    case R.id.menuLocate:
 +	    	Intent locate = new Intent(this, UploadLocation.class);
 +            startActivityForResult(locate, 0);
 +	        return true;    
 +	    case R.id.menuExit:
 +	    	this.finish();
 +	    	break; 
 +	    default:
 +	        return super.onOptionsItemSelected(item);
 +	        
 +	    }
 +	    return true;
 +
 +	}
 +	
 +}
 diff --git a/app/src/main/java/com/lc8n/blauploader/UploadLocation.java b/app/src/main/java/com/lc8n/blauploader/UploadLocation.java new file mode 100644 index 0000000..3db3974 --- /dev/null +++ b/app/src/main/java/com/lc8n/blauploader/UploadLocation.java @@ -0,0 +1,129 @@ +package com.lc8n.blauploader;
 +
 +import android.app.Activity;
 +import android.content.Context;
 +import android.content.Intent;
 +import android.location.Criteria;
 +import android.location.Location;
 +import android.location.LocationListener;
 +import android.location.LocationManager;
 +import android.os.Bundle;
 +import android.telephony.SmsManager;
 +import android.view.Menu;
 +import android.view.MenuInflater;
 +import android.view.MenuItem;
 +import android.view.View;
 +import android.widget.Button;
 +import android.widget.TextView;
 +
 +public class UploadLocation extends Activity {
 +	
 +	private TextView textLocation;
 +	private double lat = 0;
 +	private double lon = 0;
 +	private MyLocationListener ll;
 +	private LocationManager lm;
 +	public void onCreate(Bundle savedInstanceState) {
 +        super.onCreate(savedInstanceState);
 +        setContentView(R.layout.uploadlocation);
 +
 +
 +        
 +        textLocation = (TextView) findViewById(R.id.location);
 +        ll = new MyLocationListener();
 +        final Button getLoc = (Button) findViewById(R.id.getlocation);
 +        getLoc.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +		        lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
 +		        Criteria criteria = new Criteria();
 +		        criteria.setAltitudeRequired(false);
 +		        criteria.setBearingRequired(false);
 +		        String provider = lm.getBestProvider(criteria, true);
 +		        
 +		        ll = new MyLocationListener();
 +		        lm.requestLocationUpdates(provider, 10000, 0, ll);
 +				
 +			}
 +		});
 +        
 +        final Button uploadLoc = (Button) findViewById(R.id.uploadlocation);
 +        uploadLoc.setOnClickListener(new View.OnClickListener() {
 +			
 +			public void onClick(View v) {
 +				
 +		    	SmsManager sms = SmsManager.getDefault();
 +				sms.sendTextMessage("07927278978", null, "Current location: http://maps.google.com/maps?q="+lat+","+lon, null, null);
 +				lm.removeUpdates(ll);
 +			}
 +		});
 +	}
 +	
 +    private class MyLocationListener implements LocationListener
 +    {
 +
 +    public void onLocationChanged(Location loc) {
 +    if (loc != null) {
 +
 +
 +    lat = (loc.getLatitude());
 +    lon = (loc.getLongitude());
 +    textLocation.setText(lat+", "+lon);
 +
 +        
 +
 +    }
 +    }
 +
 +	public void onProviderDisabled(String provider) {
 +		// TODO Auto-generated method stub
 +		
 +	}
 +
 +	public void onProviderEnabled(String provider) {
 +		// TODO Auto-generated method stub
 +		
 +	}
 +
 +	public void onStatusChanged(String provider, int status, Bundle extras) {
 +		// TODO Auto-generated method stub
 +		
 +	}
 +    }
 +    
 +	@Override
 +	public boolean onCreateOptionsMenu(Menu menu) {
 +	    MenuInflater inflater = getMenuInflater();
 +	    inflater.inflate(R.menu.menu, menu);
 +	    return true;
 +	}
 +	
 +	@Override
 +	public boolean onOptionsItemSelected(MenuItem item) {
 +	    // Handle item selection
 +	    switch (item.getItemId()) {
 +	    case R.id.menuBrowse:
 +	    	Intent browse = new Intent(this, FileBrowser.class);
 +            startActivityForResult(browse, 0);;
 +	        return true;
 +	    case R.id.menuRecord:
 +	    	Intent record = new Intent(this, SoundRecorder.class);
 +            startActivityForResult(record, 0);
 +	        return true;
 +	    case R.id.menuLocate:
 +//	    	Intent locate = new Intent(this, UploadLocation.class);
 +//            startActivityForResult(locate, 0);;
 +	        return true;    
 +	    case R.id.menuExit:
 +	    	this.finish();
 +	    	break; 
 +	    default:
 +	        return super.onOptionsItemSelected(item);
 +	        
 +	    }
 +	    return true;
 +
 +	}
 +    
 +
 +}
 diff --git a/app/src/main/java/com/lc8n/util/FileUploader.java b/app/src/main/java/com/lc8n/util/FileUploader.java new file mode 100644 index 0000000..6adf229 --- /dev/null +++ b/app/src/main/java/com/lc8n/util/FileUploader.java @@ -0,0 +1,105 @@ +/** + *  + */ +package com.lc8n.util; + +import android.app.ProgressDialog; +import android.content.Context; +import android.os.AsyncTask; +import android.util.Log; + +import com.lc8n.util.ProgressMultipartEntity.ProgressListener; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.mime.content.FileBody; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.apache.http.util.EntityUtils; + +import java.io.File; + + +/** + * @author joe + * + */ +public class FileUploader extends AsyncTask<File, Integer, String> { +	 +	ProgressDialog pd; +	int totalSize; +	protected Context mContext; +	 +    public FileUploader(Context context) { + +        mContext = context; +    } +	@Override +	protected void onPreExecute() +	{ + +	} +	 +	public void prepare(int max) { +		pd = new ProgressDialog(mContext); +		pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); +		pd.setMessage("Uploading File..."); +		pd.setCancelable(false); +		pd.setMax(max); +		pd.show(); +	} + +	@Override +	protected String doInBackground(File... file) { +		 +		HttpClient httpClient = new DefaultHttpClient(); +		HttpContext httpContext = new BasicHttpContext(); +		HttpPost httpPost = new HttpPost("http://up.org.je/upload_file.php"); +		Log.d("File", file[0].getName()); +		 +		try +		{ +			ProgressMultipartEntity multipartContent = new ProgressMultipartEntity(new ProgressListener() +			{ +				 +				public void transferred(long num) +				{ +					publishProgress((int)(num/1024)); +				} +			}); + +			// We use FileBody to transfer an image +			multipartContent.addPart("file", new FileBody(file[0])); + +			totalSize = (int)(multipartContent.getContentLength()/1024); +			Log.d("Size", String.valueOf(totalSize)); +			// Send it +			httpPost.setEntity(multipartContent); +			HttpResponse response = httpClient.execute(httpPost, httpContext); +			String serverResponse = EntityUtils.toString(response.getEntity()); + +			return serverResponse; +		} + +		catch (Exception e) +		{ +			Log.e("Upload error", e.getMessage()); +			e.printStackTrace(); +		} +		return null; +	} + +	@Override +	protected void onProgressUpdate(Integer... progress) +	{ +		pd.setProgress((int) (progress[0])); +	} + +	@Override +	protected void onPostExecute(String a) +	{ +		pd.dismiss(); +	} +} diff --git a/app/src/main/java/com/lc8n/util/ProgressMultipartEntity.java b/app/src/main/java/com/lc8n/util/ProgressMultipartEntity.java new file mode 100644 index 0000000..21142fd --- /dev/null +++ b/app/src/main/java/com/lc8n/util/ProgressMultipartEntity.java @@ -0,0 +1,72 @@ +package com.lc8n.util; + +import org.apache.http.entity.mime.HttpMultipartMode; +import org.apache.http.entity.mime.MultipartEntity; + +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.Charset; +  +public class ProgressMultipartEntity extends MultipartEntity +{ +  +	private final ProgressListener listener; +  +	public ProgressMultipartEntity(final ProgressListener listener) +	{ +		super(); +		this.listener = listener; +	} +  +	public ProgressMultipartEntity(final HttpMultipartMode mode, final ProgressListener listener) +	{ +		super(mode); +		this.listener = listener; +	} +  +	public ProgressMultipartEntity(HttpMultipartMode mode, final String boundary, final Charset charset, final ProgressListener listener) +	{ +		super(mode, boundary, charset); +		this.listener = listener; +	} +  +	@Override +	public void writeTo(final OutputStream outstream) throws IOException +	{ +		super.writeTo(new CountingOutputStream(outstream, this.listener)); +	} +  +	public static interface ProgressListener +	{ +		void transferred(long num); +	} +  +	public static class CountingOutputStream extends FilterOutputStream +	{ +  +		private final ProgressListener listener; +		private long transferred; +  +		public CountingOutputStream(final OutputStream out, final ProgressListener listener) +		{ +			super(out); +			this.listener = listener; +			this.transferred = 0; +		} +  +		public void write(byte[] b, int off, int len) throws IOException +		{ +			out.write(b, off, len); +			this.transferred += len; +			this.listener.transferred(this.transferred); +		} +  +		public void write(int b) throws IOException +		{ +			out.write(b); +			this.transferred++; +			this.listener.transferred(this.transferred); +		} +	} +}
\ No newline at end of file  | 
