diff --git a/packages/SystemUI/res/layout/bubbles_manage_button_education.xml b/packages/SystemUI/res/layout/bubbles_manage_button_education.xml index 87dd58e4f0eda..213bb923db651 100644 --- a/packages/SystemUI/res/layout/bubbles_manage_button_education.xml +++ b/packages/SystemUI/res/layout/bubbles_manage_button_education.xml @@ -14,7 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - - + diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleManageEducationView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleManageEducationView.java deleted file mode 100644 index 86244ba5248ab..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleManageEducationView.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.bubbles; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Color; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.android.internal.util.ContrastColorUtil; -import com.android.systemui.R; - -/** - * Educational view to highlight the manage button that allows a user to configure the settings - * for the bubble. Shown only the first time a user expands a bubble. - */ -public class BubbleManageEducationView extends LinearLayout { - - private View mManageView; - private TextView mTitleTextView; - private TextView mDescTextView; - - public BubbleManageEducationView(Context context) { - this(context, null); - } - - public BubbleManageEducationView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public BubbleManageEducationView(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public BubbleManageEducationView(Context context, AttributeSet attrs, int defStyleAttr, - int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - mManageView = findViewById(R.id.manage_education_view); - mTitleTextView = findViewById(R.id.user_education_title); - mDescTextView = findViewById(R.id.user_education_description); - - final TypedArray ta = mContext.obtainStyledAttributes( - new int[] {android.R.attr.colorAccent, - android.R.attr.textColorPrimaryInverse}); - final int bgColor = ta.getColor(0, Color.BLACK); - int textColor = ta.getColor(1, Color.WHITE); - ta.recycle(); - - textColor = ContrastColorUtil.ensureTextContrast(textColor, bgColor, true); - mTitleTextView.setTextColor(textColor); - mDescTextView.setTextColor(textColor); - } - - /** - * Specifies the position for the manage view. - */ - public void setManageViewPosition(int x, int y) { - mManageView.setTranslationX(x); - mManageView.setTranslationY(y); - } - - /** - * @return the height of the view that shows the educational text and pointer. - */ - public int getManageViewHeight() { - return mManageView.getHeight(); - } - - @Override - public void setLayoutDirection(int direction) { - super.setLayoutDirection(direction); - if (getResources().getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) { - mManageView.setBackgroundResource(R.drawable.bubble_stack_user_education_bg_rtl); - mTitleTextView.setGravity(Gravity.RIGHT); - mDescTextView.setGravity(Gravity.RIGHT); - } else { - mManageView.setBackgroundResource(R.drawable.bubble_stack_user_education_bg); - mTitleTextView.setGravity(Gravity.LEFT); - mDescTextView.setGravity(Gravity.LEFT); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java index b5ad5e6fffec0..ea12c9598b91f 100644 --- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java +++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleStackView.java @@ -116,7 +116,7 @@ public class BubbleStackView extends FrameLayout private static final String TAG = TAG_WITH_CLASS_NAME ? "BubbleStackView" : TAG_BUBBLES; /** Animation durations for bubble stack user education views. **/ - private static final int ANIMATE_STACK_USER_EDUCATION_DURATION = 200; + static final int ANIMATE_STACK_USER_EDUCATION_DURATION = 200; private static final int ANIMATE_STACK_USER_EDUCATION_DURATION_SHORT = 40; /** How far the flyout needs to be dragged before it's dismissed regardless of velocity. */ @@ -748,7 +748,7 @@ public class BubbleStackView extends FrameLayout private View mUserEducationView; private boolean mShouldShowManageEducation; - private BubbleManageEducationView mManageEducationView; + private ManageEducationView mManageEducationView; private boolean mAnimatingManageEducationAway; private ViewGroup mManageMenu; @@ -1135,12 +1135,9 @@ public class BubbleStackView extends FrameLayout Log.d(TAG, "shouldShowManageEducation: " + mShouldShowManageEducation); } if (mShouldShowManageEducation) { - mManageEducationView = (BubbleManageEducationView) - mInflater.inflate(R.layout.bubbles_manage_button_education, this, + mManageEducationView = (ManageEducationView) + mInflater.inflate(R.layout.bubbles_manage_button_education, this /* root */, false /* attachToRoot */); - mManageEducationView.setVisibility(GONE); - mManageEducationView.setElevation(mBubbleElevation); - mManageEducationView.setLayoutDirection(View.LAYOUT_DIRECTION_LOCALE); addView(mManageEducationView); } } @@ -1753,28 +1750,8 @@ public class BubbleStackView extends FrameLayout && mManageEducationView.getVisibility() != VISIBLE && mIsExpanded && mExpandedBubble.getExpandedView() != null) { - mManageEducationView.setAlpha(0); - mManageEducationView.setVisibility(VISIBLE); - mManageEducationView.post(() -> { - mExpandedBubble.getExpandedView().getManageButtonBoundsOnScreen(mTempRect); - final int viewHeight = mManageEducationView.getManageViewHeight(); - final int inset = getResources().getDimensionPixelSize( - R.dimen.bubbles_manage_education_top_inset); - mManageEducationView.bringToFront(); - mManageEducationView.setManageViewPosition(0, mTempRect.top - viewHeight + inset); - mManageEducationView.animate() - .setDuration(ANIMATE_STACK_USER_EDUCATION_DURATION) - .setInterpolator(FAST_OUT_SLOW_IN).alpha(1); - mManageEducationView.findViewById(R.id.manage).setOnClickListener(view -> { - mExpandedBubble.getExpandedView().findViewById(R.id.settings_button) - .performClick(); - maybeShowManageEducation(false); - }); - mManageEducationView.findViewById(R.id.got_it).setOnClickListener(view -> - maybeShowManageEducation(false)); - mManageEducationView.setOnClickListener(view -> - maybeShowManageEducation(false)); - }); + mManageEducationView.show(mExpandedBubble.getExpandedView(), mTempRect, + () -> maybeShowManageEducation(false) /* run on click */); Prefs.putBoolean(getContext(), HAS_SEEN_BUBBLES_MANAGE_EDUCATION, true); } else if (!show && mManageEducationView.getVisibility() == VISIBLE diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/ManageEducationView.kt b/packages/SystemUI/src/com/android/systemui/bubbles/ManageEducationView.kt new file mode 100644 index 0000000000000..c58ab31c45613 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bubbles/ManageEducationView.kt @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.bubbles + +import android.content.Context +import android.graphics.Color +import android.graphics.Rect +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import android.widget.Button +import android.widget.LinearLayout +import android.widget.TextView +import com.android.internal.util.ContrastColorUtil +import com.android.systemui.Interpolators +import com.android.systemui.R + +/** + * Educational view to highlight the manage button that allows a user to configure the settings + * for the bubble. Shown only the first time a user expands a bubble. + */ +class ManageEducationView @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr, defStyleRes) { + + private val manageView by lazy { findViewById(R.id.manage_education_view) } + private val manageButton by lazy { findViewById