aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefanos Togkoulidis <stefanostogoulidis@gmail.com>2016-10-03 16:57:28 +0300
committerStefanos Togkoulidis <stefanostogoulidis@gmail.com>2016-10-03 17:24:46 +0300
commite11761bf5c489338b5d392534bc28e2d89364cb3 (patch)
treeb887be91ef08be4140db7b52205e678deb07782c
parente9306cab166f265a6f527b31e7ac267598dc3973 (diff)
downloadgradle-perf-android-medium-e11761bf5c489338b5d392534bc28e2d89364cb3.tar.gz
Use FileProvider to request a camera capture
Since Android 7, the `file://` URI scheme for asking the camera to capture to specific file raises an exception. Need to switch to `content://` based schemes.
-rw-r--r--WordPress/src/main/AndroidManifest.xml11
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.java16
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java3
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java14
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java30
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java15
6 files changed, 55 insertions, 34 deletions
diff --git a/WordPress/src/main/AndroidManifest.xml b/WordPress/src/main/AndroidManifest.xml
index 35d2bd005..1c0c1fb85 100644
--- a/WordPress/src/main/AndroidManifest.xml
+++ b/WordPress/src/main/AndroidManifest.xml
@@ -512,5 +512,16 @@
<!-- Smart Lock for Passwords -->
<meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
+
+ <!-- Provider for exposing file URIs on Android 7+ -->
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="${applicationId}.provider"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/provider_paths"/>
+ </provider>
</application>
</manifest>
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.java
index 316cf2a3c..7873492d3 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/main/MeFragment.java
@@ -37,6 +37,7 @@ import android.view.ViewOutlineProvider;
import android.widget.TextView;
import android.widget.Toast;
+import org.wordpress.android.BuildConfig;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
@@ -504,13 +505,14 @@ public class MeFragment extends Fragment {
}
private void askForCameraOrGallery() {
- WordPressMediaUtils.launchPictureLibraryOrCapture(MeFragment.this, new WordPressMediaUtils
- .LaunchCameraCallback() {
- @Override
- public void onMediaCapturePathReady(String mediaCapturePath) {
- mMediaCapturePath = mediaCapturePath;
- }
- });
+ WordPressMediaUtils
+ .launchPictureLibraryOrCapture(MeFragment.this, BuildConfig.APPLICATION_ID,
+ new WordPressMediaUtils.LaunchCameraCallback() {
+ @Override
+ public void onMediaCapturePathReady(String mediaCapturePath) {
+ mMediaCapturePath = mediaCapturePath;
+ }
+ });
}
private void startCropActivity(Uri uri) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java
index 81d84e77a..ea8d06f47 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java
@@ -20,6 +20,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
+import org.wordpress.android.BuildConfig;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
@@ -231,7 +232,7 @@ public class MediaAddFragment extends Fragment implements LaunchCameraCallback {
}
public void launchCamera() {
- WordPressMediaUtils.launchCamera(this, this);
+ WordPressMediaUtils.launchCamera(this, BuildConfig.APPLICATION_ID, this);
}
public void launchVideoCamera() {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java
index 0faf227e2..ea4664f67 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java
@@ -23,6 +23,7 @@ import android.widget.LinearLayout;
import com.android.volley.toolbox.ImageLoader;
+import org.wordpress.android.BuildConfig;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.ui.RequestCodes;
@@ -134,12 +135,13 @@ public class MediaPickerActivity extends AppCompatActivity
if (item.getItemId() == android.R.id.home) {
finish();
} else if (item.getItemId() == R.id.capture_image) {
- WordPressMediaUtils.launchCamera(this, new WordPressMediaUtils.LaunchCameraCallback() {
- @Override
- public void onMediaCapturePathReady(String mediaCapturePath) {
- mCapturePath = mediaCapturePath;
- }
- });
+ WordPressMediaUtils.launchCamera(this, BuildConfig.APPLICATION_ID,
+ new WordPressMediaUtils.LaunchCameraCallback() {
+ @Override
+ public void onMediaCapturePathReady(String mediaCapturePath) {
+ mCapturePath = mediaCapturePath;
+ }
+ });
return true;
} else if (item.getItemId() == R.id.capture_video) {
WordPressMediaUtils.launchVideoCamera(this);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java
index 749666846..16c2c5ccc 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java
@@ -13,6 +13,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.provider.MediaStore;
+import android.support.v4.content.FileProvider;
import android.widget.ImageView;
import com.android.volley.toolbox.ImageLoader;
@@ -121,41 +122,43 @@ public class WordPressMediaUtils {
return Intent.createChooser(intent, title);
}
- public static void launchCamera(Activity activity, LaunchCameraCallback callback) {
- Intent intent = preparelaunchCamera(activity, callback);
+ public static void launchCamera(Activity activity, String applicationId, LaunchCameraCallback callback) {
+ Intent intent = preparelaunchCamera(activity, applicationId, callback);
if (intent != null) {
AppLockManager.getInstance().setExtendedTimeout();
activity.startActivityForResult(intent, RequestCodes.TAKE_PHOTO);
}
}
- public static void launchCamera(Fragment fragment, LaunchCameraCallback callback) {
+ public static void launchCamera(Fragment fragment, String applicationId, LaunchCameraCallback callback) {
if (!fragment.isAdded()) {
return;
}
- Intent intent = preparelaunchCamera(fragment.getActivity(), callback);
+ Intent intent = preparelaunchCamera(fragment.getActivity(), applicationId, callback);
if (intent != null) {
AppLockManager.getInstance().setExtendedTimeout();
fragment.startActivityForResult(intent, RequestCodes.TAKE_PHOTO);
}
}
- private static Intent preparelaunchCamera(Context context, LaunchCameraCallback callback) {
+ private static Intent preparelaunchCamera(Context context, String applicationId, LaunchCameraCallback callback) {
String state = android.os.Environment.getExternalStorageState();
if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
showSDCardRequiredDialog(context);
return null;
} else {
- return getLaunchCameraIntent(callback);
+ return getLaunchCameraIntent(context, applicationId, callback);
}
}
- private static Intent getLaunchCameraIntent(LaunchCameraCallback callback) {
+ private static Intent getLaunchCameraIntent(Context context, String applicationId, LaunchCameraCallback callback) {
File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
- String mediaCapturePath = path + File.separator + "Camera" + File.separator + "wp-" + System.currentTimeMillis() + ".jpg";
+ String mediaCapturePath = path + File.separator + "Camera" + File.separator + "wp-" + System
+ .currentTimeMillis() + ".jpg";
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mediaCapturePath)));
+ intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(context,
+ applicationId + ".provider", new File(mediaCapturePath)));
if (callback != null) {
callback.onMediaCapturePathReady(mediaCapturePath);
@@ -173,20 +176,21 @@ public class WordPressMediaUtils {
return intent;
}
- public static void launchPictureLibraryOrCapture(Fragment fragment, LaunchCameraCallback callback) {
+ public static void launchPictureLibraryOrCapture(Fragment fragment, String applicationId, LaunchCameraCallback
+ callback) {
if (!fragment.isAdded()) {
return;
}
AppLockManager.getInstance().setExtendedTimeout();
- fragment.startActivityForResult(makePickOrCaptureIntent(fragment.getActivity(), callback),
+ fragment.startActivityForResult(makePickOrCaptureIntent(fragment.getActivity(), applicationId, callback),
RequestCodes.PICTURE_LIBRARY_OR_CAPTURE);
}
- private static Intent makePickOrCaptureIntent(Context context, LaunchCameraCallback callback) {
+ private static Intent makePickOrCaptureIntent(Context context, String applicationId, LaunchCameraCallback callback) {
Intent pickPhotoIntent = prepareGalleryIntent(context.getString(R.string.capture_or_pick_photo));
if (DeviceUtils.getInstance().hasCamera(context)) {
- Intent cameraIntent = getLaunchCameraIntent(callback);
+ Intent cameraIntent = getLaunchCameraIntent(context, applicationId, callback);
pickPhotoIntent.putExtra(
Intent.EXTRA_INITIAL_INTENTS,
new Intent[]{ cameraIntent });
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
index e670d7cd7..dc8761fcc 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
@@ -1226,13 +1226,14 @@ public class EditPostActivity extends AppCompatActivity implements EditorFragmen
}
private void launchCamera() {
- WordPressMediaUtils.launchCamera(this, new WordPressMediaUtils.LaunchCameraCallback() {
- @Override
- public void onMediaCapturePathReady(String mediaCapturePath) {
- mMediaCapturePath = mediaCapturePath;
- AppLockManager.getInstance().setExtendedTimeout();
- }
- });
+ WordPressMediaUtils.launchCamera(this, BuildConfig.APPLICATION_ID,
+ new WordPressMediaUtils.LaunchCameraCallback() {
+ @Override
+ public void onMediaCapturePathReady(String mediaCapturePath) {
+ mMediaCapturePath = mediaCapturePath;
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+ });
}
protected void setPostContentFromShareAction() {