summaryrefslogtreecommitdiff
path: root/PermissionController/src/com/android/permissioncontroller/safetycenter
diff options
context:
space:
mode:
authorTyler Dewey <deweytyl@google.com>2023-03-09 12:40:39 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2023-03-09 12:40:39 +0000
commit7129a23382213b2b797407c76006a07610d9fab7 (patch)
treef2fe4755c600c97be2833022d068d8f3af52bbbd /PermissionController/src/com/android/permissioncontroller/safetycenter
parent702fcb05940e04297e0937b176fd23c887624382 (diff)
parenteb536c581cb9f9df1554d2bf50063e68d0888cfb (diff)
downloadPermission-7129a23382213b2b797407c76006a07610d9fab7.tar.gz
Merge "Implement "button groups" on issues in U." into udc-dev
Diffstat (limited to 'PermissionController/src/com/android/permissioncontroller/safetycenter')
-rw-r--r--PermissionController/src/com/android/permissioncontroller/safetycenter/ui/IssueCardPreference.java129
1 files changed, 95 insertions, 34 deletions
diff --git a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/IssueCardPreference.java b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/IssueCardPreference.java
index 134b64d7c..0a15ee4bb 100644
--- a/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/IssueCardPreference.java
+++ b/PermissionController/src/com/android/permissioncontroller/safetycenter/ui/IssueCardPreference.java
@@ -56,6 +56,9 @@ import com.android.safetycenter.internaldata.SafetyCenterIssueId;
import com.android.safetycenter.internaldata.SafetyCenterIssueKey;
import com.google.android.material.button.MaterialButton;
+import com.google.android.material.shape.AbsoluteCornerSize;
+import com.google.android.material.shape.CornerSize;
+import com.google.android.material.shape.ShapeAppearanceModel;
import java.util.Objects;
@@ -156,34 +159,30 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
holder.itemView.setContentDescription(contentDescription);
holder.itemView.setClickable(false);
+ configureButtonList(holder);
+ configureSafetyProtectionView(holder);
+ maybeStartResolutionAnimation(holder);
+
+ mSafetyCenterViewModel
+ .getInteractionLogger()
+ .recordForIssue(Action.SAFETY_ISSUE_VIEWED, mIssue, mIsDismissed);
+ }
+
+ private void configureButtonList(PreferenceViewHolder holder) {
LinearLayout buttonList =
((LinearLayout) holder.findViewById(R.id.issue_card_action_button_list));
buttonList.removeAllViews(); // This view may be recycled from another issue
- boolean isFirstButton = true;
- for (SafetyCenterIssue.Action action : mIssue.getActions()) {
+
+ for (int i = 0; i < mIssue.getActions().size(); i++) {
+ SafetyCenterIssue.Action action = mIssue.getActions().get(i);
ActionButtonBuilder builder =
- new ActionButtonBuilder(action, holder.itemView.getContext());
- builder.isLargeScreen(buttonList instanceof EqualWidthContainer);
- if (isFirstButton) {
- builder.setAsPrimaryButton();
- if (!mIsDismissed) {
- builder.setAsFilledButton();
- }
- isFirstButton = false;
- }
+ new ActionButtonBuilder(action, holder.itemView.getContext())
+ .setIndex(i)
+ .setActionButtonListSize(mIssue.getActions().size())
+ .setIsDismissed(mIsDismissed)
+ .setIsLargeScreen(buttonList instanceof EqualWidthContainer);
builder.buildAndAddToView(buttonList);
-
- if (mResolvedIssueActionId != null && mResolvedIssueActionId.equals(action.getId())) {
- mIssueCardAnimator.transitionToIssueResolvedThenMarkComplete(
- getContext(), holder, action);
- }
}
-
- configureSafetyProtectionView(holder);
-
- mSafetyCenterViewModel
- .getInteractionLogger()
- .recordForIssue(Action.SAFETY_ISSUE_VIEWED, mIssue, mIsDismissed);
}
private void configureSafetyProtectionView(PreferenceViewHolder holder) {
@@ -206,6 +205,19 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
}
}
+ private void maybeStartResolutionAnimation(PreferenceViewHolder holder) {
+ if (mResolvedIssueActionId == null) {
+ return;
+ }
+
+ for (SafetyCenterIssue.Action action : mIssue.getActions()) {
+ if (action.getId().equals(mResolvedIssueActionId)) {
+ mIssueCardAnimator.transitionToIssueResolvedThenMarkComplete(
+ getContext(), holder, action);
+ }
+ }
+ }
+
public int getSeverityLevel() {
return mIssue.getSeverityLevel();
}
@@ -394,8 +406,9 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
private final SafetyCenterIssue.Action mAction;
private final Context mContext;
private final ContextThemeWrapper mContextThemeWrapper;
- private boolean mIsPrimaryButton = false;
- private boolean mIsFilled = false;
+ private int mIndex;
+ private int mActionButtonListSize;
+ private boolean mIsDismissed = false;
private boolean mIsLargeScreen = false;
ActionButtonBuilder(SafetyCenterIssue.Action action, Context context) {
@@ -405,23 +418,43 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
new ContextThemeWrapper(context, R.style.Theme_MaterialComponents_DayNight);
}
- public ActionButtonBuilder setAsPrimaryButton() {
- mIsPrimaryButton = true;
+ public ActionButtonBuilder setIndex(int index) {
+ mIndex = index;
return this;
}
- public ActionButtonBuilder setAsFilledButton() {
- mIsFilled = true;
+ public ActionButtonBuilder setActionButtonListSize(int actionButtonListSize) {
+ mActionButtonListSize = actionButtonListSize;
return this;
}
- public ActionButtonBuilder isLargeScreen(boolean isLargeScreen) {
+ public ActionButtonBuilder setIsDismissed(boolean isDismissed) {
+ mIsDismissed = isDismissed;
+ return this;
+ }
+
+ public ActionButtonBuilder setIsLargeScreen(boolean isLargeScreen) {
mIsLargeScreen = isLargeScreen;
return this;
}
+ private boolean isPrimaryButton() {
+ return mIndex == 0;
+ }
+
+ private boolean isLastButton() {
+ return mIndex == (mActionButtonListSize - 1);
+ }
+
+ private boolean isFilled() {
+ return isPrimaryButton() && !mIsDismissed;
+ }
+
public void buildAndAddToView(LinearLayout buttonList) {
MaterialButton button = new MaterialButton(mContextThemeWrapper, null, getStyle());
+ if (SdkLevel.isAtLeastU()) {
+ configureGroupStyleCorners(button);
+ }
setButtonColors(button);
setButtonLayout(button);
button.setText(mAction.getLabel());
@@ -434,7 +467,7 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
mIssue,
mAction,
mTaskId,
- mIsPrimaryButton,
+ isPrimaryButton(),
mIsDismissed)
.showNow(mDialogFragmentManager, /* tag= */ null);
} else {
@@ -452,7 +485,7 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
mSafetyCenterViewModel
.getInteractionLogger()
.recordForIssue(
- mIsPrimaryButton
+ isPrimaryButton()
? Action.ISSUE_PRIMARY_ACTION_CLICKED
: Action.ISSUE_SECONDARY_ACTION_CLICKED,
mIssue,
@@ -464,8 +497,36 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
buttonList.addView(button);
}
+ /**
+ * Configures "group-style" corners for this button, where the first button in the list has
+ * large corners on top and the last button in the list has large corners on bottom.
+ */
+ @RequiresApi(UPSIDE_DOWN_CAKE)
+ private void configureGroupStyleCorners(MaterialButton button) {
+ button.setCornerRadiusResource(R.dimen.sc_button_corner_radius_small);
+ ShapeAppearanceModel.Builder shapeAppearanceModelBuilder =
+ button.getShapeAppearanceModel().toBuilder();
+
+ CornerSize largeCornerSize =
+ new AbsoluteCornerSize(
+ mContext.getResources()
+ .getDimensionPixelSize(R.dimen.sc_button_corner_radius));
+ if (isPrimaryButton()) {
+ shapeAppearanceModelBuilder
+ .setTopLeftCornerSize(largeCornerSize)
+ .setTopRightCornerSize(largeCornerSize);
+ }
+ if (isLastButton()) {
+ shapeAppearanceModelBuilder
+ .setBottomLeftCornerSize(largeCornerSize)
+ .setBottomRightCornerSize(largeCornerSize);
+ }
+
+ button.setShapeAppearanceModel(shapeAppearanceModelBuilder.build());
+ }
+
private void maybeAddSpaceToView(LinearLayout buttonList) {
- if (mIsPrimaryButton) {
+ if (isPrimaryButton()) {
return;
}
@@ -478,11 +539,11 @@ public class IssueCardPreference extends Preference implements ComparablePrefere
}
private int getStyle() {
- return mIsFilled ? R.attr.scActionButtonStyle : R.attr.scSecondaryActionButtonStyle;
+ return isFilled() ? R.attr.scActionButtonStyle : R.attr.scSecondaryActionButtonStyle;
}
private void setButtonColors(MaterialButton button) {
- if (mIsFilled) {
+ if (isFilled()) {
button.setBackgroundTintList(
ContextCompat.getColorStateList(
mContext,