diff options
author | Tyler Dewey <deweytyl@google.com> | 2023-03-09 12:40:39 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2023-03-09 12:40:39 +0000 |
commit | 7129a23382213b2b797407c76006a07610d9fab7 (patch) | |
tree | f2fe4755c600c97be2833022d068d8f3af52bbbd /PermissionController/src/com/android/permissioncontroller/safetycenter | |
parent | 702fcb05940e04297e0937b176fd23c887624382 (diff) | |
parent | eb536c581cb9f9df1554d2bf50063e68d0888cfb (diff) | |
download | Permission-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.java | 129 |
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, |