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