Remove UnknownNullness on Intent and IntentSender params
The framework versions of startActivity,
startActivityForResult, and startIntentSenderForResult
immediately crash if you pass them a null value.
Catching these null values at compile time by properly
adding a NonNull annotation to these places will help
developers avoid runtime issues.
Relnote: "The `Fragment` and `FragmentManager` APIs that
take an `Intent` or `IntentSender` are now properly annotated
with `@NonNull` to prevent passing in a null value as a null
value would always immediately crash the respective Android
framework APIs these methods call into."
Test: ./gradlew checkApi
BUG: 257291822
Change-Id: I06fd4eed31b985d7b9160430efb2f05d1c451dc1
diff --git a/fragment/fragment/api/current.txt b/fragment/fragment/api/current.txt
index 76aeea3..8417281 100644
--- a/fragment/fragment/api/current.txt
+++ b/fragment/fragment/api/current.txt
@@ -145,11 +145,11 @@
method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
method @Deprecated public void setUserVisibleHint(boolean);
method public boolean shouldShowRequestPermissionRationale(String);
- method public void startActivity(android.content.Intent!);
- method public void startActivity(android.content.Intent!, android.os.Bundle?);
- method @Deprecated public void startActivityForResult(android.content.Intent!, int);
- method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void startActivity(android.content.Intent);
+ method public void startActivity(android.content.Intent, android.os.Bundle?);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void startPostponedEnterTransition();
method public void unregisterForContextMenu(android.view.View);
}
@@ -174,9 +174,9 @@
method public void onStateNotSaved();
method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
- method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
- method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int);
+ method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void supportFinishAfterTransition();
method @Deprecated public void supportInvalidateOptionsMenu();
method public void supportPostponeEnterTransition();
@@ -261,9 +261,9 @@
method @Deprecated public void onRequestPermissionsFromFragment(androidx.fragment.app.Fragment, String![], int);
method public boolean onShouldSaveFragmentState(androidx.fragment.app.Fragment);
method public boolean onShouldShowRequestPermissionRationale(String);
- method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
- method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int);
+ method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void onSupportInvalidateOptionsMenu();
}
diff --git a/fragment/fragment/api/public_plus_experimental_current.txt b/fragment/fragment/api/public_plus_experimental_current.txt
index 76aeea3..8417281 100644
--- a/fragment/fragment/api/public_plus_experimental_current.txt
+++ b/fragment/fragment/api/public_plus_experimental_current.txt
@@ -145,11 +145,11 @@
method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
method @Deprecated public void setUserVisibleHint(boolean);
method public boolean shouldShowRequestPermissionRationale(String);
- method public void startActivity(android.content.Intent!);
- method public void startActivity(android.content.Intent!, android.os.Bundle?);
- method @Deprecated public void startActivityForResult(android.content.Intent!, int);
- method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void startActivity(android.content.Intent);
+ method public void startActivity(android.content.Intent, android.os.Bundle?);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void startPostponedEnterTransition();
method public void unregisterForContextMenu(android.view.View);
}
@@ -174,9 +174,9 @@
method public void onStateNotSaved();
method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
- method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
- method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int);
+ method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void supportFinishAfterTransition();
method @Deprecated public void supportInvalidateOptionsMenu();
method public void supportPostponeEnterTransition();
@@ -261,9 +261,9 @@
method @Deprecated public void onRequestPermissionsFromFragment(androidx.fragment.app.Fragment, String![], int);
method public boolean onShouldSaveFragmentState(androidx.fragment.app.Fragment);
method public boolean onShouldShowRequestPermissionRationale(String);
- method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
- method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int);
+ method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void onSupportInvalidateOptionsMenu();
}
diff --git a/fragment/fragment/api/restricted_current.txt b/fragment/fragment/api/restricted_current.txt
index bdcefeb..3671696 100644
--- a/fragment/fragment/api/restricted_current.txt
+++ b/fragment/fragment/api/restricted_current.txt
@@ -149,11 +149,11 @@
method @Deprecated public void setTargetFragment(androidx.fragment.app.Fragment?, int);
method @Deprecated public void setUserVisibleHint(boolean);
method public boolean shouldShowRequestPermissionRationale(String);
- method public void startActivity(android.content.Intent!);
- method public void startActivity(android.content.Intent!, android.os.Bundle?);
- method @Deprecated public void startActivityForResult(android.content.Intent!, int);
- method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void startActivity(android.content.Intent);
+ method public void startActivity(android.content.Intent, android.os.Bundle?);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int);
+ method @Deprecated public void startActivityForResult(android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void startPostponedEnterTransition();
method public void unregisterForContextMenu(android.view.View);
}
@@ -178,9 +178,9 @@
method public void onStateNotSaved();
method public void setEnterSharedElementCallback(androidx.core.app.SharedElementCallback?);
method public void setExitSharedElementCallback(androidx.core.app.SharedElementCallback?);
- method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
- method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int);
+ method public void startActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void supportFinishAfterTransition();
method @Deprecated public void supportInvalidateOptionsMenu();
method public void supportPostponeEnterTransition();
@@ -265,9 +265,9 @@
method @Deprecated public void onRequestPermissionsFromFragment(androidx.fragment.app.Fragment, String![], int);
method public boolean onShouldSaveFragmentState(androidx.fragment.app.Fragment);
method public boolean onShouldShowRequestPermissionRationale(String);
- method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int);
- method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent!, int, android.os.Bundle?);
- method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int);
+ method public void onStartActivityFromFragment(androidx.fragment.app.Fragment, android.content.Intent, int, android.os.Bundle?);
+ method @Deprecated public void onStartIntentSenderFromFragment(androidx.fragment.app.Fragment, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
method public void onSupportInvalidateOptionsMenu();
}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
index cbd53a2..31a1632 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -1431,7 +1431,7 @@
* Call {@link Activity#startActivity(Intent)} from the fragment's
* containing Activity.
*/
- public void startActivity(@SuppressLint("UnknownNullness") Intent intent) {
+ public void startActivity(@NonNull Intent intent) {
startActivity(intent, null);
}
@@ -1439,7 +1439,7 @@
* Call {@link Activity#startActivity(Intent, Bundle)} from the fragment's
* containing Activity.
*/
- public void startActivity(@SuppressLint("UnknownNullness") Intent intent,
+ public void startActivity(@NonNull Intent intent,
@Nullable Bundle options) {
if (mHost == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity");
@@ -1468,7 +1468,7 @@
*/
@SuppressWarnings("deprecation")
@Deprecated
- public void startActivityForResult(@SuppressLint("UnknownNullness") Intent intent,
+ public void startActivityForResult(@NonNull Intent intent,
int requestCode) {
startActivityForResult(intent, requestCode, null);
}
@@ -1496,7 +1496,7 @@
*/
@SuppressWarnings("DeprecatedIsStillUsed")
@Deprecated
- public void startActivityForResult(@SuppressLint("UnknownNullness") Intent intent,
+ public void startActivityForResult(@NonNull Intent intent,
int requestCode, @Nullable Bundle options) {
if (mHost == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity");
@@ -1534,7 +1534,7 @@
* {@link ActivityResultContract}.
*/
@Deprecated
- public void startIntentSenderForResult(@SuppressLint("UnknownNullness") IntentSender intent,
+ public void startIntentSenderForResult(@NonNull IntentSender intent,
int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException {
if (mHost == null) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java
index b48c19c..c373049 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentActivity.java
@@ -18,7 +18,6 @@
import static androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
@@ -501,7 +500,7 @@
* greater than 65535, an IllegalArgumentException would be thrown.
*/
public void startActivityFromFragment(@NonNull Fragment fragment,
- @SuppressLint("UnknownNullness") Intent intent, int requestCode) {
+ @NonNull Intent intent, int requestCode) {
startActivityFromFragment(fragment, intent, requestCode, null);
}
@@ -519,7 +518,7 @@
*/
@SuppressWarnings("deprecation")
public void startActivityFromFragment(@NonNull Fragment fragment,
- @SuppressLint("UnknownNullness") Intent intent, int requestCode,
+ @NonNull Intent intent, int requestCode,
@Nullable Bundle options) {
// request code will be -1 if called from fragment.startActivity
if (requestCode == -1) {
@@ -558,7 +557,7 @@
@SuppressWarnings({"deprecation"})
@Deprecated
public void startIntentSenderFromFragment(@NonNull Fragment fragment,
- @SuppressLint("UnknownNullness") IntentSender intent, int requestCode,
+ @NonNull IntentSender intent, int requestCode,
@Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
@Nullable Bundle options) throws IntentSender.SendIntentException {
if (requestCode == -1) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java
index 21079f0..b9ebe38 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentHostCallback.java
@@ -19,7 +19,6 @@
import static androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions;
import static androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult;
-import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
@@ -149,7 +148,7 @@
* See {@link FragmentActivity#startActivityForResult(Intent, int)}.
*/
public void onStartActivityFromFragment(@NonNull Fragment fragment,
- @SuppressLint("UnknownNullness") Intent intent, int requestCode) {
+ @NonNull Intent intent, int requestCode) {
onStartActivityFromFragment(fragment, intent, requestCode, null);
}
@@ -158,7 +157,7 @@
* See {@link FragmentActivity#startActivityForResult(Intent, int, Bundle)}.
*/
public void onStartActivityFromFragment(
- @NonNull Fragment fragment, @SuppressLint("UnknownNullness") Intent intent,
+ @NonNull Fragment fragment, @NonNull Intent intent,
int requestCode, @Nullable Bundle options) {
if (requestCode != -1) {
throw new IllegalStateException(
@@ -179,7 +178,7 @@
*/
@Deprecated
public void onStartIntentSenderFromFragment(@NonNull Fragment fragment,
- @SuppressLint("UnknownNullness") IntentSender intent, int requestCode,
+ @NonNull IntentSender intent, int requestCode,
@Nullable Intent fillInIntent, int flagsMask, int flagsValues, int extraFlags,
@Nullable Bundle options) throws IntentSender.SendIntentException {
if (requestCode != -1) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
index 1e0f070..af6591c 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/FragmentManager.java
@@ -2815,12 +2815,12 @@
}
void launchStartActivityForResult(@NonNull Fragment f,
- @SuppressLint("UnknownNullness") Intent intent,
+ @NonNull Intent intent,
int requestCode, @Nullable Bundle options) {
if (mStartActivityForResult != null) {
LaunchedFragmentInfo info = new LaunchedFragmentInfo(f.mWho, requestCode);
mLaunchedFragments.addLast(info);
- if (intent != null && options != null) {
+ if (options != null) {
intent.putExtra(EXTRA_ACTIVITY_OPTIONS_BUNDLE, options);
}
mStartActivityForResult.launch(intent);
@@ -2831,7 +2831,7 @@
@SuppressWarnings("deprecation")
void launchStartIntentSenderForResult(@NonNull Fragment f,
- @SuppressLint("UnknownNullness") IntentSender intent,
+ @NonNull IntentSender intent,
int requestCode, @Nullable Intent fillInIntent, int flagsMask, int flagsValues,
int extraFlags, @Nullable Bundle options) throws IntentSender.SendIntentException {
if (mStartIntentSenderForResult != null) {