From a0c2dc3cf56bf9c90af517f4cd12ef80d375a85a Mon Sep 17 00:00:00 2001 From: Clara Bayarri Date: Tue, 12 Apr 2016 12:00:15 +0100 Subject: [PATCH] Provide startIntentSenderForResult for fragments Bug: 27700608 Change-Id: Ibb7689ba0527048dd5944c4315b986f16030081d --- api/current.txt | 2 + api/system-current.txt | 2 + api/test-current.txt | 2 + core/java/android/app/Activity.java | 42 +++++++++++++++---- core/java/android/app/Fragment.java | 15 +++++++ .../android/app/FragmentHostCallback.java | 16 +++++++ 6 files changed, 72 insertions(+), 7 deletions(-) diff --git a/api/current.txt b/api/current.txt index eb129dadbeed7..fbb26091f8401 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4480,6 +4480,7 @@ package android.app { method public void startActivity(android.content.Intent, android.os.Bundle); method public void startActivityForResult(android.content.Intent, int); method public void startActivityForResult(android.content.Intent, int, android.os.Bundle); + method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException; method public void unregisterForContextMenu(android.view.View); } @@ -4571,6 +4572,7 @@ package android.app { method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int); method public boolean onShouldSaveFragmentState(android.app.Fragment); method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle); + method public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException; method public boolean onUseFragmentManagerInflaterFactory(); } diff --git a/api/system-current.txt b/api/system-current.txt index 5bfbc16041225..587b79f039690 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4613,6 +4613,7 @@ package android.app { method public void startActivity(android.content.Intent, android.os.Bundle); method public void startActivityForResult(android.content.Intent, int); method public void startActivityForResult(android.content.Intent, int, android.os.Bundle); + method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException; method public void unregisterForContextMenu(android.view.View); } @@ -4704,6 +4705,7 @@ package android.app { method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int); method public boolean onShouldSaveFragmentState(android.app.Fragment); method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle); + method public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException; method public boolean onUseFragmentManagerInflaterFactory(); } diff --git a/api/test-current.txt b/api/test-current.txt index 04fedb170337c..9417bee67df32 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -4480,6 +4480,7 @@ package android.app { method public void startActivity(android.content.Intent, android.os.Bundle); method public void startActivityForResult(android.content.Intent, int); method public void startActivityForResult(android.content.Intent, int, android.os.Bundle); + method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException; method public void unregisterForContextMenu(android.view.View); } @@ -4571,6 +4572,7 @@ package android.app { method public void onRequestPermissionsFromFragment(android.app.Fragment, java.lang.String[], int); method public boolean onShouldSaveFragmentState(android.app.Fragment); method public void onStartActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle); + method public void onStartIntentSenderFromFragment(android.app.Fragment, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException; method public boolean onUseFragmentManagerInflaterFactory(); } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 76527667c62ed..f7884a742b038 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -4405,8 +4405,8 @@ public class Activity extends ContextThemeWrapper @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, Bundle options) throws IntentSender.SendIntentException { if (mParent == null) { - startIntentSenderForResultInner(intent, requestCode, fillInIntent, - flagsMask, flagsValues, this, options); + startIntentSenderForResultInner(intent, mEmbeddedID, requestCode, fillInIntent, + flagsMask, flagsValues, options); } else if (options != null) { mParent.startIntentSenderFromChild(this, intent, requestCode, fillInIntent, flagsMask, flagsValues, extraFlags, options); @@ -4418,8 +4418,8 @@ public class Activity extends ContextThemeWrapper } } - private void startIntentSenderForResultInner(IntentSender intent, int requestCode, - Intent fillInIntent, int flagsMask, int flagsValues, Activity activity, + private void startIntentSenderForResultInner(IntentSender intent, String who, int requestCode, + Intent fillInIntent, int flagsMask, int flagsValues, Bundle options) throws IntentSender.SendIntentException { try { @@ -4431,7 +4431,7 @@ public class Activity extends ContextThemeWrapper } int result = ActivityManagerNative.getDefault() .startActivityIntentSender(mMainThread.getApplicationThread(), intent, - fillInIntent, resolvedType, mToken, activity.mEmbeddedID, + fillInIntent, resolvedType, mToken, who, requestCode, flagsMask, flagsValues, options); if (result == ActivityManager.START_CANCELED) { throw new IntentSender.SendIntentException(); @@ -4888,8 +4888,23 @@ public class Activity extends ContextThemeWrapper int requestCode, Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException { - startIntentSenderForResultInner(intent, requestCode, fillInIntent, - flagsMask, flagsValues, child, options); + startIntentSenderForResultInner(intent, child.mEmbeddedID, requestCode, fillInIntent, + flagsMask, flagsValues, options); + } + + /** + * Like {@link #startIntentSenderFromChild}, but taking a Fragment; see + * {@link #startIntentSenderForResult(IntentSender, int, Intent, int, int, int)} + * for more information. + * + * @hide + */ + public void startIntentSenderFromChildFragment(Fragment child, IntentSender intent, + int requestCode, Intent fillInIntent, int flagsMask, int flagsValues, + int extraFlags, @Nullable Bundle options) + throws IntentSender.SendIntentException { + startIntentSenderForResultInner(intent, child.mWho, requestCode, fillInIntent, + flagsMask, flagsValues, options); } /** @@ -7034,6 +7049,19 @@ public class Activity extends ContextThemeWrapper Activity.this.startActivityFromFragment(fragment, intent, requestCode, options); } + @Override + public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intent, + int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues, + int extraFlags, Bundle options) throws IntentSender.SendIntentException { + if (mParent == null) { + startIntentSenderForResultInner(intent, fragment.mWho, requestCode, fillInIntent, + flagsMask, flagsValues, options); + } else if (options != null) { + mParent.startIntentSenderFromChildFragment(fragment, intent, requestCode, + fillInIntent, flagsMask, flagsValues, extraFlags, options); + } + } + @Override public void onRequestPermissionsFromFragment(Fragment fragment, String[] permissions, int requestCode) { diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 2a04c39f2c5a6..29f594f74885d 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -23,6 +23,7 @@ import android.annotation.StringRes; import android.content.ComponentCallbacks2; import android.content.Context; import android.content.Intent; +import android.content.IntentSender; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; @@ -1115,6 +1116,20 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene mHost.onStartActivityFromFragment(this, intent, requestCode, options); } + /** + * Call {@link Activity#startIntentSenderForResult(IntentSender, int, Intent, int, int, int, + * Bundle)} from the fragment's containing Activity. + */ + public void startIntentSenderForResult(IntentSender intent, int requestCode, + @Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags, + Bundle options) throws IntentSender.SendIntentException { + if (mHost == null) { + throw new IllegalStateException("Fragment " + this + " not attached to Activity"); + } + mHost.onStartIntentSenderFromFragment(this, intent, requestCode, fillInIntent, flagsMask, + flagsValues, extraFlags, options); + } + /** * Receive the result from a previous call to * {@link #startActivityForResult(Intent, int)}. This follows the diff --git a/core/java/android/app/FragmentHostCallback.java b/core/java/android/app/FragmentHostCallback.java index 13517e600b0e6..cf6b1147aba04 100644 --- a/core/java/android/app/FragmentHostCallback.java +++ b/core/java/android/app/FragmentHostCallback.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.content.Intent; +import android.content.IntentSender; import android.os.Bundle; import android.os.Handler; import android.util.ArrayMap; @@ -130,6 +131,21 @@ public abstract class FragmentHostCallback extends FragmentContainer { mContext.startActivity(intent); } + /** + * Starts a new {@link IntentSender} from the given fragment. + * See {@link Activity#startIntentSender(IntentSender, Intent, int, int, int, Bundle)}. + */ + public void onStartIntentSenderFromFragment(Fragment fragment, IntentSender intent, + int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues, + int extraFlags, Bundle options) throws IntentSender.SendIntentException { + if (requestCode != -1) { + throw new IllegalStateException( + "Starting intent sender with a requestCode requires a FragmentActivity host"); + } + mContext.startIntentSender(intent, fillInIntent, flagsMask, flagsValues, extraFlags, + options); + } + /** * Requests permissions from the given fragment. * See {@link Activity#requestPermissions(String[], int)}