Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5181)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java

Issue 2338203002: Added end-to-end tests for navigator.share. (Closed)
Patch Set: Rebase. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/android/BUILD.gn ('k') | chrome/android/java_sources.gni » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
index 9dd90b7329e5838a6ddabac7b42e421877dac7ea..b34b6ec6c09736007cac405cced2b28138e7c7d6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -61,6 +61,22 @@ import java.util.concurrent.TimeoutException;
* A helper class that helps to start an intent to share titles and URLs.
*/
public class ShareHelper {
+ /** Interface that receives intents for testing (to fake out actually sending them). */
+ public static interface FakeIntentReceiver {
+ /** Sets the intent to send back in the broadcast. */
+ public void setIntentToSendBack(Intent intent);
+
+ /** Called when a custom chooser dialog is shown. */
+ public void onCustomChooserShown(AlertDialog dialog);
+
+ /**
+ * Simulates firing the given intent, without actually doing so.
+ *
+ * @param context The context that will receive broadcasts from the simulated activity.
+ * @param intent The intent to send to the system.
+ */
+ public void fireIntent(Context context, Intent intent);
+ }
private static final String TAG = "share";
@@ -80,8 +96,23 @@ public class ShareHelper {
*/
private static final String SHARE_IMAGES_DIRECTORY_NAME = "screenshot";
+ /** Force the use of a Chrome-specific intent chooser, not the system chooser. */
+ private static boolean sForceCustomChooserForTesting = false;
+
+ /** If non-null, will be used instead of the real activity. */
+ private static FakeIntentReceiver sFakeIntentReceiverForTesting;
+
private ShareHelper() {}
+ private static void fireIntent(Activity activity, Intent intent) {
+ if (sFakeIntentReceiverForTesting != null) {
+ Context context = activity.getApplicationContext();
+ sFakeIntentReceiverForTesting.fireIntent(context, intent);
+ } else {
+ activity.startActivity(intent);
+ }
+ }
+
@SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE")
private static void deleteShareImageFiles(File file) {
if (!file.exists()) return;
@@ -94,6 +125,26 @@ public class ShareHelper {
}
/**
+ * Force the use of a Chrome-specific intent chooser, not the system chooser.
+ *
+ * This emulates the behavior on pre Lollipop-MR1 systems, where the system chooser is not
+ * available.
+ */
+ public static void setForceCustomChooserForTesting(boolean enabled) {
+ sForceCustomChooserForTesting = enabled;
+ }
+
+ /**
+ * Uses a FakeIntentReceiver instead of actually sending intents to the system.
+ *
+ * @param receiver The object to send intents to. If null, resets back to the default behavior
+ * (really send intents).
+ */
+ public static void setFakeIntentReceiverForTesting(FakeIntentReceiver receiver) {
+ sFakeIntentReceiverForTesting = receiver;
+ }
+
+ /**
* Callback interface for when a target is chosen.
*/
public static interface TargetChosenCallback {
@@ -132,7 +183,8 @@ public class ShareHelper {
}
static boolean isSupported() {
- return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1;
+ return !sForceCustomChooserForTesting
+ && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1;
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
@@ -166,7 +218,10 @@ public class ShareHelper {
Intent chooserIntent = Intent.createChooser(sharingIntent,
activity.getString(R.string.share_link_chooser_title),
pendingIntent.getIntentSender());
- activity.startActivity(chooserIntent);
+ if (sFakeIntentReceiverForTesting != null) {
+ sFakeIntentReceiverForTesting.setIntentToSendBack(intent);
+ }
+ fireIntent(activity, chooserIntent);
}
@Override
@@ -306,7 +361,7 @@ public class ShareHelper {
Intent chooserIntent = Intent.createChooser(getShareImageIntent(imageUri),
activity.getString(R.string.share_link_chooser_title));
- activity.startActivity(chooserIntent);
+ fireIntent(activity, chooserIntent);
}
}
}.execute();
@@ -426,17 +481,21 @@ public class ShareHelper {
}
});
- if (callback == null) return;
-
- dialog.setOnDismissListener(new OnDismissListener() {
- @Override
- public void onDismiss(DialogInterface dialog) {
- if (!callbackCalled[0]) {
- callback.onCancel();
- callbackCalled[0] = true;
+ if (callback != null) {
+ dialog.setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ if (!callbackCalled[0]) {
+ callback.onCancel();
+ callbackCalled[0] = true;
+ }
}
- }
- });
+ });
+ }
+
+ if (sFakeIntentReceiverForTesting != null) {
+ sFakeIntentReceiverForTesting.onCustomChooserShown(dialog);
+ }
}
/**
@@ -463,7 +522,7 @@ public class ShareHelper {
if (sharingIntent.getComponent() != null) {
// If a component was specified, there should not also be a callback.
assert callback == null;
- activity.startActivity(sharingIntent);
+ fireIntent(activity, sharingIntent);
} else {
assert TargetChosenReceiver.isSupported();
TargetChosenReceiver.sendChooserIntent(saveLastUsed, activity, sharingIntent, callback);
« no previous file with comments | « chrome/android/BUILD.gn ('k') | chrome/android/java_sources.gni » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698