Merge "Accept strings for more parameters in Suspend Dialog" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-03-25 04:38:58 +00:00
committed by Android (Google) Code Review
5 changed files with 180 additions and 21 deletions

View File

@@ -2810,7 +2810,9 @@ package android.content.pm {
method @NonNull public android.content.pm.SuspendDialogInfo.Builder setMessage(@StringRes int);
method @NonNull public android.content.pm.SuspendDialogInfo.Builder setNeutralButtonAction(int);
method @NonNull public android.content.pm.SuspendDialogInfo.Builder setNeutralButtonText(@StringRes int);
method @NonNull public android.content.pm.SuspendDialogInfo.Builder setNeutralButtonText(@NonNull String);
method @NonNull public android.content.pm.SuspendDialogInfo.Builder setTitle(@StringRes int);
method @NonNull public android.content.pm.SuspendDialogInfo.Builder setTitle(@NonNull String);
}
}

View File

@@ -65,16 +65,20 @@ public final class SuspendDialogInfo implements Parcelable {
private static final String TAG = SuspendDialogInfo.class.getSimpleName();
private static final String XML_ATTR_ICON_RES_ID = "iconResId";
private static final String XML_ATTR_TITLE_RES_ID = "titleResId";
private static final String XML_ATTR_TITLE = "title";
private static final String XML_ATTR_DIALOG_MESSAGE_RES_ID = "dialogMessageResId";
private static final String XML_ATTR_DIALOG_MESSAGE = "dialogMessage";
private static final String XML_ATTR_BUTTON_TEXT_RES_ID = "buttonTextResId";
private static final String XML_ATTR_BUTTON_TEXT = "buttonText";
private static final String XML_ATTR_BUTTON_ACTION = "buttonAction";
private final int mIconResId;
private final int mTitleResId;
private final String mTitle;
private final int mDialogMessageResId;
private final String mDialogMessage;
private final int mNeutralButtonTextResId;
private final String mNeutralButtonText;
private final int mNeutralButtonAction;
/**
@@ -128,6 +132,16 @@ public final class SuspendDialogInfo implements Parcelable {
return mTitleResId;
}
/**
* @return the title to be shown on the dialog. Returns {@code null} if {@link #getTitleResId()}
* returns a valid resource id
* @hide
*/
@Nullable
public String getTitle() {
return mTitle;
}
/**
* @return the resource id of the text to be shown in the dialog's body
* @hide
@@ -148,7 +162,7 @@ public final class SuspendDialogInfo implements Parcelable {
}
/**
* @return the text to be shown
* @return the text to be shown on the neutral button
* @hide
*/
@StringRes
@@ -156,6 +170,16 @@ public final class SuspendDialogInfo implements Parcelable {
return mNeutralButtonTextResId;
}
/**
* @return the text to be shown on the neutral button. Returns {@code null} if
* {@link #getNeutralButtonTextResId()} returns a valid resource id
* @hide
*/
@Nullable
public String getNeutralButtonText() {
return mNeutralButtonText;
}
/**
* @return The {@link ButtonAction} that happens on tapping this button
* @hide
@@ -174,6 +198,8 @@ public final class SuspendDialogInfo implements Parcelable {
}
if (mTitleResId != ID_NULL) {
out.attributeInt(null, XML_ATTR_TITLE_RES_ID, mTitleResId);
} else {
XmlUtils.writeStringAttribute(out, XML_ATTR_TITLE, mTitle);
}
if (mDialogMessageResId != ID_NULL) {
out.attributeInt(null, XML_ATTR_DIALOG_MESSAGE_RES_ID, mDialogMessageResId);
@@ -182,6 +208,8 @@ public final class SuspendDialogInfo implements Parcelable {
}
if (mNeutralButtonTextResId != ID_NULL) {
out.attributeInt(null, XML_ATTR_BUTTON_TEXT_RES_ID, mNeutralButtonTextResId);
} else {
XmlUtils.writeStringAttribute(out, XML_ATTR_BUTTON_TEXT, mNeutralButtonText);
}
out.attributeInt(null, XML_ATTR_BUTTON_ACTION, mNeutralButtonAction);
}
@@ -194,8 +222,10 @@ public final class SuspendDialogInfo implements Parcelable {
try {
final int iconId = in.getAttributeInt(null, XML_ATTR_ICON_RES_ID, ID_NULL);
final int titleId = in.getAttributeInt(null, XML_ATTR_TITLE_RES_ID, ID_NULL);
final String title = XmlUtils.readStringAttribute(in, XML_ATTR_TITLE);
final int buttonTextId =
in.getAttributeInt(null, XML_ATTR_BUTTON_TEXT_RES_ID, ID_NULL);
final String buttonText = XmlUtils.readStringAttribute(in, XML_ATTR_BUTTON_TEXT);
final int buttonAction =
in.getAttributeInt(null, XML_ATTR_BUTTON_ACTION, BUTTON_ACTION_MORE_DETAILS);
final int dialogMessageResId =
@@ -207,9 +237,13 @@ public final class SuspendDialogInfo implements Parcelable {
}
if (titleId != ID_NULL) {
dialogInfoBuilder.setTitle(titleId);
} else if (title != null) {
dialogInfoBuilder.setTitle(title);
}
if (buttonTextId != ID_NULL) {
dialogInfoBuilder.setNeutralButtonText(buttonTextId);
} else if (buttonText != null) {
dialogInfoBuilder.setNeutralButtonText(buttonText);
}
if (dialogMessageResId != ID_NULL) {
dialogInfoBuilder.setMessage(dialogMessageResId);
@@ -227,7 +261,9 @@ public final class SuspendDialogInfo implements Parcelable {
public int hashCode() {
int hashCode = mIconResId;
hashCode = 31 * hashCode + mTitleResId;
hashCode = 31 * hashCode + Objects.hashCode(mTitle);
hashCode = 31 * hashCode + mNeutralButtonTextResId;
hashCode = 31 * hashCode + Objects.hashCode(mNeutralButtonText);
hashCode = 31 * hashCode + mDialogMessageResId;
hashCode = 31 * hashCode + Objects.hashCode(mDialogMessage);
hashCode = 31 * hashCode + mNeutralButtonAction;
@@ -245,10 +281,12 @@ public final class SuspendDialogInfo implements Parcelable {
final SuspendDialogInfo otherDialogInfo = (SuspendDialogInfo) obj;
return mIconResId == otherDialogInfo.mIconResId
&& mTitleResId == otherDialogInfo.mTitleResId
&& Objects.equals(mTitle, otherDialogInfo.mTitle)
&& mDialogMessageResId == otherDialogInfo.mDialogMessageResId
&& Objects.equals(mDialogMessage, otherDialogInfo.mDialogMessage)
&& mNeutralButtonTextResId == otherDialogInfo.mNeutralButtonTextResId
&& mNeutralButtonAction == otherDialogInfo.mNeutralButtonAction
&& Objects.equals(mDialogMessage, otherDialogInfo.mDialogMessage);
&& Objects.equals(mNeutralButtonText, otherDialogInfo.mNeutralButtonText)
&& mNeutralButtonAction == otherDialogInfo.mNeutralButtonAction;
}
@NonNull
@@ -264,11 +302,19 @@ public final class SuspendDialogInfo implements Parcelable {
builder.append("mTitleResId = 0x");
builder.append(Integer.toHexString(mTitleResId));
builder.append(" ");
} else if (mTitle != null) {
builder.append("mTitle = \"");
builder.append(mTitle);
builder.append("\"");
}
if (mNeutralButtonTextResId != ID_NULL) {
builder.append("mNeutralButtonTextResId = 0x");
builder.append(Integer.toHexString(mNeutralButtonTextResId));
builder.append(" ");
} else if (mNeutralButtonText != null) {
builder.append("mNeutralButtonText = \"");
builder.append(mNeutralButtonText);
builder.append("\"");
}
if (mDialogMessageResId != ID_NULL) {
builder.append("mDialogMessageResId = 0x");
@@ -294,27 +340,33 @@ public final class SuspendDialogInfo implements Parcelable {
public void writeToParcel(Parcel dest, int parcelableFlags) {
dest.writeInt(mIconResId);
dest.writeInt(mTitleResId);
dest.writeString(mTitle);
dest.writeInt(mDialogMessageResId);
dest.writeString(mDialogMessage);
dest.writeInt(mNeutralButtonTextResId);
dest.writeString(mNeutralButtonText);
dest.writeInt(mNeutralButtonAction);
}
private SuspendDialogInfo(Parcel source) {
mIconResId = source.readInt();
mTitleResId = source.readInt();
mTitle = source.readString();
mDialogMessageResId = source.readInt();
mDialogMessage = source.readString();
mNeutralButtonTextResId = source.readInt();
mNeutralButtonText = source.readString();
mNeutralButtonAction = source.readInt();
}
SuspendDialogInfo(Builder b) {
mIconResId = b.mIconResId;
mTitleResId = b.mTitleResId;
mTitle = (mTitleResId == ID_NULL) ? b.mTitle : null;
mDialogMessageResId = b.mDialogMessageResId;
mDialogMessage = (mDialogMessageResId == ID_NULL) ? b.mDialogMessage : null;
mNeutralButtonTextResId = b.mNeutralButtonTextResId;
mNeutralButtonText = (mNeutralButtonTextResId == ID_NULL) ? b.mNeutralButtonText : null;
mNeutralButtonAction = b.mNeutralButtonAction;
}
@@ -338,8 +390,10 @@ public final class SuspendDialogInfo implements Parcelable {
private int mDialogMessageResId = ID_NULL;
private String mDialogMessage;
private int mTitleResId = ID_NULL;
private String mTitle;
private int mIconResId = ID_NULL;
private int mNeutralButtonTextResId = ID_NULL;
private String mNeutralButtonText;
private int mNeutralButtonAction = BUTTON_ACTION_MORE_DETAILS;
/**
@@ -369,6 +423,21 @@ public final class SuspendDialogInfo implements Parcelable {
return this;
}
/**
* Set the title text of the dialog. Ignored if a resource id is set via
* {@link #setTitle(int)}
*
* @param title The title of the dialog.
* @return this builder object.
* @see #setTitle(int)
*/
@NonNull
public Builder setTitle(@NonNull String title) {
Preconditions.checkStringNotEmpty(title, "Title cannot be null or empty");
mTitle = title;
return this;
}
/**
* Set the text to show in the body of the dialog. Ignored if a resource id is set via
* {@link #setMessage(int)}.
@@ -426,6 +495,22 @@ public final class SuspendDialogInfo implements Parcelable {
return this;
}
/**
* Set the text to be shown on the neutral button. Ignored if a resource id is set via
* {@link #setNeutralButtonText(int)}
*
* @param neutralButtonText The title of the dialog.
* @return this builder object.
* @see #setNeutralButtonText(int)
*/
@NonNull
public Builder setNeutralButtonText(@NonNull String neutralButtonText) {
Preconditions.checkStringNotEmpty(neutralButtonText,
"Button text cannot be null or empty");
mNeutralButtonText = neutralButtonText;
return this;
}
/**
* Set the action expected to happen on neutral button tap. Defaults to
* {@link #BUTTON_ACTION_MORE_DETAILS} if this is not provided.

View File

@@ -106,13 +106,17 @@ public class SuspendedAppActivity extends AlertActivity
}
private String resolveTitle() {
final int titleId = (mSuppliedDialogInfo != null) ? mSuppliedDialogInfo.getTitleResId()
: ID_NULL;
if (titleId != ID_NULL && mSuspendingAppResources != null) {
try {
return mSuspendingAppResources.getString(titleId);
} catch (Resources.NotFoundException nfe) {
Slog.e(TAG, "Could not resolve string resource id " + titleId);
if (mSuppliedDialogInfo != null) {
final int titleId = mSuppliedDialogInfo.getTitleResId();
final String title = mSuppliedDialogInfo.getTitle();
if (titleId != ID_NULL && mSuspendingAppResources != null) {
try {
return mSuspendingAppResources.getString(titleId);
} catch (Resources.NotFoundException nfe) {
Slog.e(TAG, "Could not resolve string resource id " + titleId);
}
} else if (title != null) {
return title;
}
}
return getString(R.string.app_suspended_title);
@@ -159,13 +163,17 @@ public class SuspendedAppActivity extends AlertActivity
Slog.w(TAG, "Unknown neutral button action: " + mNeutralButtonAction);
return null;
}
final int buttonTextId = (mSuppliedDialogInfo != null)
? mSuppliedDialogInfo.getNeutralButtonTextResId() : ID_NULL;
if (buttonTextId != ID_NULL && mSuspendingAppResources != null) {
try {
return mSuspendingAppResources.getString(buttonTextId);
} catch (Resources.NotFoundException nfe) {
Slog.e(TAG, "Could not resolve string resource id " + buttonTextId);
if (mSuppliedDialogInfo != null) {
final int buttonTextId = mSuppliedDialogInfo.getNeutralButtonTextResId();
final String buttonText = mSuppliedDialogInfo.getNeutralButtonText();
if (buttonTextId != ID_NULL && mSuspendingAppResources != null) {
try {
return mSuspendingAppResources.getString(buttonTextId);
} catch (Resources.NotFoundException nfe) {
Slog.e(TAG, "Could not resolve string resource id " + buttonTextId);
}
} else if (buttonText != null) {
return buttonText;
}
}
return getString(defaultButtonTextId);

View File

@@ -287,7 +287,7 @@ public class PackageManagerSettingsTests {
final SuspendDialogInfo dialogInfo1 = new SuspendDialogInfo.Builder()
.setIcon(0x11220001)
.setTitle(0x11220002)
.setTitle("String Title")
.setMessage("1st message")
.setNeutralButtonText(0x11220003)
.setNeutralButtonAction(BUTTON_ACTION_MORE_DETAILS)
@@ -296,7 +296,7 @@ public class PackageManagerSettingsTests {
.setIcon(0x22220001)
.setTitle(0x22220002)
.setMessage("2nd message")
.setNeutralButtonText(0x22220003)
.setNeutralButtonText("String button text")
.setNeutralButtonAction(BUTTON_ACTION_UNSUSPEND)
.build();

View File

@@ -57,7 +57,7 @@ public class SuspendDialogInfoTest {
}
@Test
public void equalsComparesTitle() {
public void equalsComparesTitleIds() {
final SuspendDialogInfo.Builder dialogBuilder1 = createDefaultDialogBuilder();
final SuspendDialogInfo.Builder dialogBuilder2 = createDefaultDialogBuilder();
assertEquals(dialogBuilder1.build(), dialogBuilder2.build());
@@ -67,7 +67,39 @@ public class SuspendDialogInfoTest {
}
@Test
public void equalsComparesButtonText() {
public void equalsIgnoresTitleStringsWhenIdsSet() {
final SuspendDialogInfo.Builder dialogBuilder1 = new SuspendDialogInfo.Builder()
.setTitle(VALID_TEST_RES_ID_1)
.setTitle("1st title");
final SuspendDialogInfo.Builder dialogBuilder2 = new SuspendDialogInfo.Builder()
.setTitle(VALID_TEST_RES_ID_1)
.setTitle("2nd title");
// String titles different but should get be ignored when resource ids are set
assertEquals(dialogBuilder1.build(), dialogBuilder2.build());
}
@Test
public void equalsComparesTitleStringsWhenNoIdsSet() {
final SuspendDialogInfo.Builder dialogBuilder1 = new SuspendDialogInfo.Builder()
.setTitle("1st title");
final SuspendDialogInfo.Builder dialogBuilder2 = new SuspendDialogInfo.Builder()
.setTitle("2nd title");
// Both have different titles, which are not ignored as resource ids aren't set
assertNotEquals(dialogBuilder1.build(), dialogBuilder2.build());
}
@Test
public void titleStringClearedWhenResIdSet() {
final SuspendDialogInfo dialogInfo = new SuspendDialogInfo.Builder()
.setTitle(VALID_TEST_RES_ID_2)
.setTitle("Should be cleared on build")
.build();
assertNull(dialogInfo.getTitle());
assertEquals(VALID_TEST_RES_ID_2, dialogInfo.getTitleResId());
}
@Test
public void equalsComparesButtonTextIds() {
final SuspendDialogInfo.Builder dialogBuilder1 = createDefaultDialogBuilder();
final SuspendDialogInfo.Builder dialogBuilder2 = createDefaultDialogBuilder();
assertEquals(dialogBuilder1.build(), dialogBuilder2.build());
@@ -76,6 +108,38 @@ public class SuspendDialogInfoTest {
assertNotEquals(dialogBuilder1.build(), dialogBuilder2.build());
}
@Test
public void equalsIgnoresButtonStringsWhenIdsSet() {
final SuspendDialogInfo.Builder dialogBuilder1 = new SuspendDialogInfo.Builder()
.setNeutralButtonText(VALID_TEST_RES_ID_1)
.setNeutralButtonText("1st button text");
final SuspendDialogInfo.Builder dialogBuilder2 = new SuspendDialogInfo.Builder()
.setNeutralButtonText(VALID_TEST_RES_ID_1)
.setNeutralButtonText("2nd button text");
// Button strings different but should get be ignored when resource ids are set
assertEquals(dialogBuilder1.build(), dialogBuilder2.build());
}
@Test
public void equalsComparesButtonStringsWhenNoIdsSet() {
final SuspendDialogInfo.Builder dialogBuilder1 = new SuspendDialogInfo.Builder()
.setNeutralButtonText("1st button text");
final SuspendDialogInfo.Builder dialogBuilder2 = new SuspendDialogInfo.Builder()
.setNeutralButtonText("2nd button text");
// Both have different button texts, which are not ignored as resource ids aren't set
assertNotEquals(dialogBuilder1.build(), dialogBuilder2.build());
}
@Test
public void buttonStringClearedWhenResIdSet() {
final SuspendDialogInfo dialogInfo = new SuspendDialogInfo.Builder()
.setNeutralButtonText(VALID_TEST_RES_ID_2)
.setNeutralButtonText("Should be cleared on build")
.build();
assertNull(dialogInfo.getNeutralButtonText());
assertEquals(VALID_TEST_RES_ID_2, dialogInfo.getNeutralButtonTextResId());
}
@Test
public void equalsComparesButtonAction() {
final SuspendDialogInfo.Builder dialogBuilder1 = createDefaultDialogBuilder();