diff --git a/app/app.iml b/app/app.iml index 19fd22bb..f9f7358b 100644 --- a/app/app.iml +++ b/app/app.iml @@ -63,13 +63,6 @@ - - - - - - - @@ -80,24 +73,14 @@ - - - - - - - - - - diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 031dcdf6..3e9a2678 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -139,6 +139,23 @@ + + + + + + diff --git a/app/src/main/java/com/murrayc/galaxyzoo/app/ClassifyFragment.java b/app/src/main/java/com/murrayc/galaxyzoo/app/ClassifyFragment.java index 0416f366..a75c77ad 100644 --- a/app/src/main/java/com/murrayc/galaxyzoo/app/ClassifyFragment.java +++ b/app/src/main/java/com/murrayc/galaxyzoo/app/ClassifyFragment.java @@ -24,6 +24,7 @@ import android.database.Cursor; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; diff --git a/app/src/main/java/com/murrayc/galaxyzoo/app/SubjectFragment.java b/app/src/main/java/com/murrayc/galaxyzoo/app/SubjectFragment.java index 2733d689..b36810e9 100644 --- a/app/src/main/java/com/murrayc/galaxyzoo/app/SubjectFragment.java +++ b/app/src/main/java/com/murrayc/galaxyzoo/app/SubjectFragment.java @@ -19,15 +19,23 @@ package com.murrayc.galaxyzoo.app; +import android.*; +import android.Manifest; import android.app.Activity; import android.app.DownloadManager; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.database.Cursor; +import android.graphics.Bitmap; import android.net.Uri; +import android.os.AsyncTask; import android.os.Bundle; +import android.os.Environment; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; +import android.support.v4.content.FileProvider; import android.support.v4.content.Loader; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.ShareActionProvider; @@ -45,6 +53,11 @@ import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; + /** * A fragment representing a single subject. * This fragment is either contained in a {@link ListActivity} @@ -406,6 +419,9 @@ public void onPause() { } private void updateShareActionIntent() { + /** + * Initialization and setup of the share intent is done here so that less work is left after the AsyncTask's execution + */ if (mShareActionProvider == null) { Log.error("updateShareActionIntent(): mShareActionProvider is null."); return; @@ -427,7 +443,75 @@ private void updateShareActionIntent() { //shareIntent.putExtra(Intent.EXTRA_STREAM, mUriImageStandard); //shareIntent.setType("image/*"); + /** + * if the image URI is not null, a GetImageBitmapAsyncTask is executed for it, and the returned URI is set as + * a stream extra on the intent that will be shared, along with an explicit permission for recieving contexts to + * read the content URI, enabling them to access the generated image. + */ + if (mUriStandardRemote!=null) { + GetImageBitmapAsyncTask getImageBitmapAsyncTask = new GetImageBitmapAsyncTask(){ + @Override + protected void onPostExecute(Uri uri) { + shareIntent.setType("image/*"); + shareIntent.putExtra(Intent.EXTRA_STREAM, uri); + shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + mShareActionProvider.setShareIntent(shareIntent); + } + }; + getImageBitmapAsyncTask.execute(mUriStandardRemote); + } + + } + + /** + *These constants and the verifyStoragePermissions method will gain explicit permission from users to read and write + * files on their devices. This will allow us to save an image, that can then be shared to other apps. + */ + private static final int REQUEST_EXTERNAL_STORAGE = 1; + private static String[] PERMISSIONS_STORAGE = { + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE + }; + + public static void verifyStoragePermissions(Activity activity) { + int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); + + if (permission != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions( + activity, + PERMISSIONS_STORAGE, + REQUEST_EXTERNAL_STORAGE + ); + } + } - mShareActionProvider.setShareIntent(shareIntent); + /** + * This AsyncTask, when executed, takes a String that represents a URI, creates the appropriate Bitmap, saves it to + * the external storage area of the app as a jpg, and returns the content Uri of that file as generated by the FileProvider class. + * Keeping a single file name ensures that future tasks will write over images previously generated by this task instead + * of creating new ones. + */ + private class GetImageBitmapAsyncTask extends AsyncTask { + @Override + protected Uri doInBackground(String... params) { + try { + Bitmap image = Picasso.with(getContext()).load(params[0]).get(); + ByteArrayOutputStream bytes = new ByteArrayOutputStream(); + image.compress(Bitmap.CompressFormat.JPEG, 100, bytes); + + String filename = "galaxy_zoo_image.jpg"; + + String pathname = Environment.getExternalStorageDirectory() + File.separator + filename; + File f = new File(pathname); + f.createNewFile(); + FileOutputStream fo = new FileOutputStream(f); + fo.write(bytes.toByteArray()); + return FileProvider.getUriForFile(getActivity(), getString(R.string.authority_fileprovider), f); + } catch (IOException e) { + verifyStoragePermissions(getActivity()); + e.printStackTrace(); + } + return null; + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3eeb687b..a98a69ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -186,6 +186,9 @@ //when specifying a transition when starting an activity that contains this SubjectFragment. transition_subject_image + + com.murrayc.galaxyzoo.app.fileprovider + 5 subjects diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml new file mode 100644 index 00000000..5aafec20 --- /dev/null +++ b/app/src/main/res/xml/provider_paths.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file