+++ /dev/null
-package org.openintents.filemanager;\r
-\r
-import java.io.BufferedInputStream;\r
-import java.io.BufferedOutputStream;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.FileNotFoundException;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.io.InputStream;\r
-import java.io.OutputStream;\r
-\r
-import org.openintents.intents.FileManagerIntents;\r
-\r
-import android.app.Activity;\r
-import android.content.ActivityNotFoundException;\r
-import android.content.Intent;\r
-import android.database.Cursor;\r
-import android.net.Uri;\r
-import android.os.Bundle;\r
-import android.os.Environment;\r
-import android.widget.RelativeLayout;\r
-import android.widget.Toast;\r
-\r
-public class SaveAsActivity extends Activity {\r
- protected static final int REQUEST_CODE_PICK_FILE_OR_DIRECTORY = 1;\r
- private Uri source;\r
- //Whether the scheme is file: (otherwise it's content:)\r
- private boolean fileScheme = false;\r
- \r
- \r
- @Override\r
- public void onCreate(Bundle savedInstanceState) {\r
- super.onCreate(savedInstanceState);\r
- //This activity is never shown to the user.\r
- setContentView(new RelativeLayout(this));\r
- Intent receivedIntent = getIntent();\r
- if(receivedIntent != null){\r
- Uri uri = receivedIntent.getData();\r
- source = uri;\r
- if(uri.getScheme().equals("file"))\r
- processFile(uri);\r
- else if(uri.getScheme().equals("content"))\r
- processContent(uri);\r
- }\r
- else{\r
- Toast.makeText(this, R.string.saveas_no_file_picked, Toast.LENGTH_SHORT).show();\r
- }\r
- }\r
- \r
- private void startPickActivity(Intent intent){\r
- try {\r
- startActivityForResult(intent, REQUEST_CODE_PICK_FILE_OR_DIRECTORY);\r
- } catch (ActivityNotFoundException e) {\r
- //Should never happen, but Java requires this catch\r
- Toast.makeText(this, R.string.saveas_error, Toast.LENGTH_SHORT).show();\r
- }\r
- }\r
- \r
- private Intent createPickIntent(){\r
- return new Intent(FileManagerIntents.ACTION_PICK_FILE);\r
- }\r
- \r
- private void processFile(Uri uri){\r
- fileScheme = true;\r
- Intent intent = createPickIntent();\r
- intent.setData(uri);\r
- startPickActivity(intent);\r
- }\r
- \r
- private void processContent(Uri uri){\r
- fileScheme = false;\r
- String name = getPath(uri);\r
- Intent intent = createPickIntent();\r
- intent.setData(Uri.parse(name));\r
- startPickActivity(intent);\r
- }\r
- \r
- /*\r
- * Get the default path and filename for the saved file from content: scheme.\r
- * As the directory is always used the SD storage.\r
- * For GMail, the filename is the _display_name in its ContentProvider. Otherwise the file has\r
- * no name.\r
- * !IMPORTANT! When you add another "special" intent-filter like the one for GMail, consider,\r
- * if you could add also the code for finding out the filename.\r
- */\r
- private String getPath(Uri uri){\r
- Uri sd = Uri.fromFile(Environment.getExternalStorageDirectory());\r
- if(uri.getHost().equals("gmail-ls")){\r
- Cursor cur = managedQuery(uri, new String[]{"_display_name"}, null, null, null);\r
- int nameColumn = cur.getColumnIndex("_display_name"); \r
- if(cur.moveToFirst()){\r
- return sd.buildUpon().appendPath(cur.getString(nameColumn)).toString();\r
- }\r
- }\r
- return sd.getPath();\r
- }\r
- \r
- @Override\r
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r
- super.onActivityResult(requestCode, resultCode, data);\r
- \r
- switch (requestCode) {\r
- case REQUEST_CODE_PICK_FILE_OR_DIRECTORY:\r
- if (resultCode == RESULT_OK && data != null) {\r
- Uri destinationUri = data.getData();\r
- if (destinationUri != null && source != null) {\r
- String destinationPath = destinationUri.getPath();\r
- saveFile(new File(destinationPath));\r
- }\r
- }\r
- break;\r
- }\r
- finish(); //End the activity\r
- }\r
- \r
- private void saveFile(File destination){\r
- InputStream in = null;\r
- OutputStream out = null;\r
- try {\r
- if(fileScheme)\r
- in = new BufferedInputStream(new FileInputStream(source.getPath()));\r
- else\r
- in = new BufferedInputStream(getContentResolver().openInputStream(source));\r
- \r
- out = new BufferedOutputStream(new FileOutputStream(destination));\r
- byte[] buffer = new byte[1024];\r
- \r
- while(in.read(buffer) != -1)\r
- out.write(buffer);\r
- Toast.makeText(this, R.string.saveas_file_saved, Toast.LENGTH_SHORT).show();\r
- } catch(FileNotFoundException e){\r
- //Should never get here\r
- Toast.makeText(this, R.string.saveas_error, Toast.LENGTH_SHORT).show();\r
- } catch(IOException e){\r
- Toast.makeText(this, R.string.saveas_error, Toast.LENGTH_SHORT).show();\r
- }\r
- finally{\r
- if (in != null) {\r
- try {\r
- in.close();\r
- } catch (IOException e) {}\r
- }\r
- if (out != null) {\r
- try {\r
- out.close();\r
- } catch (IOException e) {}\r
- }\r
- \r
- }\r
- }\r
-}\r