diff options
8 files changed, 114 insertions, 155 deletions
diff --git a/packages/SystemUI/res/layout/keyguard_status_bar.xml b/packages/SystemUI/res/layout/keyguard_status_bar.xml index d27fa192e741..e47eed9ea04a 100644 --- a/packages/SystemUI/res/layout/keyguard_status_bar.xml +++ b/packages/SystemUI/res/layout/keyguard_status_bar.xml @@ -60,8 +60,9 @@ </com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer> <FrameLayout android:id="@+id/system_icons_container" - android:layout_width="wrap_content" + android:layout_width="0dp" android:layout_height="match_parent" + android:layout_weight="1" android:layout_marginEnd="@dimen/status_bar_padding_end" android:gravity="center_vertical|end"> <include layout="@layout/system_icons" /> diff --git a/packages/SystemUI/res/layout/notification_icon_area.xml b/packages/SystemUI/res/layout/notification_icon_area.xml index aadfae8c5aed..fa696cc1f54c 100644 --- a/packages/SystemUI/res/layout/notification_icon_area.xml +++ b/packages/SystemUI/res/layout/notification_icon_area.xml @@ -14,9 +14,18 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<com.android.systemui.statusbar.phone.NotificationIconContainer +<com.android.keyguard.AlphaOptimizedLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/notificationIcons" - android:layout_width="wrap_content" + android:id="@+id/notification_icon_area_inner" + android:layout_width="match_parent" android:layout_height="match_parent" - android:clipChildren="false"/>
\ No newline at end of file + android:clipChildren="false"> + <com.android.systemui.statusbar.phone.NotificationIconContainer + android:id="@+id/notificationIcons" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_alignParentStart="true" + android:gravity="center_vertical" + android:orientation="horizontal" + android:clipChildren="false"/> +</com.android.keyguard.AlphaOptimizedLinearLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index 80e65a3b3295..f560e6107fb7 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -47,63 +47,52 @@ android:paddingStart="@dimen/status_bar_padding_start" android:paddingEnd="@dimen/status_bar_padding_end" android:paddingTop="@dimen/status_bar_padding_top" - android:orientation="horizontal"> - - <!-- Container for the entire start half of the status bar. It will always use the same - width, independent of the number of visible children and sub-children. --> + android:orientation="horizontal" + > <FrameLayout - android:id="@+id/status_bar_start_side_container" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="1"> - <!-- Container that is wrapped around the views on the start half of the status bar. - Its width will change with the number of visible children and sub-children. - It is useful when we want to know the visible bounds of the content. --> - <FrameLayout - android:id="@+id/status_bar_start_side_content" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:clipChildren="false"> - - <include layout="@layout/heads_up_status_bar_layout" /> - - <!-- The alpha of the start side is controlled by PhoneStatusBarTransitions, and the - individual views are controlled by StatusBarManager disable flags DISABLE_CLOCK - and DISABLE_NOTIFICATION_ICONS, respectively --> - <LinearLayout - android:id="@+id/status_bar_start_side_except_heads_up" - android:layout_height="wrap_content" - android:layout_width="match_parent" - android:clipChildren="false"> - <ViewStub - android:id="@+id/operator_name" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout="@layout/operator_name" /> - - <com.android.systemui.statusbar.policy.Clock - android:id="@+id/clock" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:textAppearance="@style/TextAppearance.StatusBar.Clock" - android:singleLine="true" - android:paddingStart="@dimen/status_bar_left_clock_starting_padding" - android:paddingEnd="@dimen/status_bar_left_clock_end_padding" - android:gravity="center_vertical|start" - /> + <include layout="@layout/heads_up_status_bar_layout" /> - <include layout="@layout/ongoing_call_chip" /> + <!-- The alpha of the left side is controlled by PhoneStatusBarTransitions, and the + individual views are controlled by StatusBarManager disable flags DISABLE_CLOCK and + DISABLE_NOTIFICATION_ICONS, respectively --> + <LinearLayout + android:id="@+id/status_bar_left_side" + android:layout_height="match_parent" + android:layout_width="match_parent" + android:clipChildren="false" + > + <ViewStub + android:id="@+id/operator_name" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout="@layout/operator_name" /> - <com.android.systemui.statusbar.AlphaOptimizedFrameLayout - android:id="@+id/notification_icon_area" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:orientation="horizontal" - android:clipChildren="false"/> + <com.android.systemui.statusbar.policy.Clock + android:id="@+id/clock" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:textAppearance="@style/TextAppearance.StatusBar.Clock" + android:singleLine="true" + android:paddingStart="@dimen/status_bar_left_clock_starting_padding" + android:paddingEnd="@dimen/status_bar_left_clock_end_padding" + android:gravity="center_vertical|start" + /> + + <include layout="@layout/ongoing_call_chip" /> + + <com.android.systemui.statusbar.AlphaOptimizedFrameLayout + android:id="@+id/notification_icon_area" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:orientation="horizontal" + android:clipChildren="false"/> - </LinearLayout> - </FrameLayout> + </LinearLayout> </FrameLayout> <!-- Space should cover the notch (if it exists) and let other views lay out around it --> @@ -114,57 +103,42 @@ android:gravity="center_horizontal|center_vertical" /> - <!-- Container for the entire end half of the status bar. It will always use the same - width, independent of the number of visible children and sub-children. --> - <FrameLayout - android:id="@+id/status_bar_end_side_container" + <com.android.keyguard.AlphaOptimizedLinearLayout android:id="@+id/system_icon_area" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - android:clipChildren="false"> + android:orientation="horizontal" + android:gravity="center_vertical|end" + > - <!-- Container that is wrapped around the views on the end half of the - status bar. Its width will change with the number of visible children and - sub-children. - It is useful when we want know the visible bounds of the content.--> - <com.android.keyguard.AlphaOptimizedLinearLayout - android:id="@+id/status_bar_end_side_content" + <com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer + android:id="@+id/user_switcher_container" android:layout_width="wrap_content" - android:layout_height="match_parent" - android:layout_gravity="end" + android:layout_height="wrap_content" + android:gravity="center" android:orientation="horizontal" - android:gravity="center_vertical|end" - android:clipChildren="false"> - - <com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer - android:id="@+id/user_switcher_container" + android:paddingTop="4dp" + android:paddingBottom="4dp" + android:paddingStart="8dp" + android:paddingEnd="8dp" + android:layout_marginEnd="16dp" + android:background="@drawable/status_bar_user_chip_bg" + android:visibility="visible" > + <ImageView android:id="@+id/current_user_avatar" + android:layout_width="@dimen/multi_user_avatar_keyguard_size" + android:layout_height="@dimen/multi_user_avatar_keyguard_size" + android:scaleType="centerInside" + android:paddingEnd="4dp" /> + + <TextView android:id="@+id/current_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="center" - android:orientation="horizontal" - android:paddingTop="4dp" - android:paddingBottom="4dp" - android:paddingStart="8dp" - android:paddingEnd="8dp" - android:layout_marginEnd="16dp" - android:background="@drawable/status_bar_user_chip_bg" - android:visibility="visible" > - <ImageView android:id="@+id/current_user_avatar" - android:layout_width="@dimen/multi_user_avatar_keyguard_size" - android:layout_height="@dimen/multi_user_avatar_keyguard_size" - android:scaleType="centerInside" - android:paddingEnd="4dp" /> - - <TextView android:id="@+id/current_user_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.StatusBar.Clock" - /> - </com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer> + android:textAppearance="@style/TextAppearance.StatusBar.Clock" + /> + </com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherContainer> - <include layout="@layout/system_icons" /> - </com.android.keyguard.AlphaOptimizedLinearLayout> - </FrameLayout> + <include layout="@layout/system_icons" /> + </com.android.keyguard.AlphaOptimizedLinearLayout> </LinearLayout> </com.android.systemui.statusbar.phone.PhoneStatusBarView> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index a2140c6ab6b7..2dc3261eb886 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License */ + package com.android.systemui.statusbar.phone; import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DELAY; @@ -30,7 +31,6 @@ import android.util.MathUtils; import android.util.Property; import android.view.ContextThemeWrapper; import android.view.View; -import android.view.ViewGroup; import android.view.animation.Interpolator; import androidx.annotation.VisibleForTesting; @@ -40,6 +40,7 @@ import com.android.internal.statusbar.StatusBarIcon; import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.animation.Interpolators; +import com.android.systemui.statusbar.AlphaOptimizedFrameLayout; import com.android.systemui.statusbar.StatusBarIconView; import com.android.systemui.statusbar.notification.stack.AnimationFilter; import com.android.systemui.statusbar.notification.stack.AnimationProperties; @@ -53,7 +54,7 @@ import java.util.function.Consumer; * A container for notification icons. It handles overflowing icons properly and positions them * correctly on the screen. */ -public class NotificationIconContainer extends ViewGroup { +public class NotificationIconContainer extends AlphaOptimizedFrameLayout { /** * A float value indicating how much before the overflow start the icons should transform into * a dot. A value of 0 means that they are exactly at the end and a value of 1 means it starts @@ -231,31 +232,6 @@ public class NotificationIconContainer extends ViewGroup { } @Override - public boolean hasOverlappingRendering() { - // Does the same as "AlphaOptimizedFrameLayout". - return false; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int childCount = getChildCount(); - final int maxVisibleIcons = getMaxVisibleIcons(childCount); - final int width = MeasureSpec.getSize(widthMeasureSpec); - final int childWidthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.UNSPECIFIED); - int totalWidth = (int) (getActualPaddingStart() + getActualPaddingEnd()); - for (int i = 0; i < childCount; i++) { - View child = getChildAt(i); - measureChild(child, childWidthSpec, heightMeasureSpec); - if (i <= maxVisibleIcons) { - totalWidth += child.getMeasuredWidth(); - } - } - final int measuredWidth = resolveSize(totalWidth, widthMeasureSpec); - final int measuredHeight = MeasureSpec.getSize(heightMeasureSpec); - setMeasuredDimension(measuredWidth, measuredHeight); - } - - @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { float centerY = getHeight() / 2.0f; // we layout all our children on the left at the top @@ -432,7 +408,8 @@ public class NotificationIconContainer extends ViewGroup { float translationX = getActualPaddingStart(); int firstOverflowIndex = -1; int childCount = getChildCount(); - int maxVisibleIcons = getMaxVisibleIcons(childCount); + int maxVisibleIcons = mOnLockScreen ? MAX_ICONS_ON_AOD : + mIsStaticLayout ? MAX_STATIC_ICONS : childCount; float layoutEnd = getLayoutEnd(); mVisualOverflowStart = 0; mFirstVisibleIconState = null; @@ -516,11 +493,6 @@ public class NotificationIconContainer extends ViewGroup { } } - private int getMaxVisibleIcons(int childCount) { - return mOnLockScreen ? MAX_ICONS_ON_AOD : - mIsStaticLayout ? MAX_STATIC_ICONS : childCount; - } - private float getLayoutEnd() { return getActualWidth() - getActualPaddingEnd(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java index 15c6dcfd7889..2052ee6cdac5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarTransitions.java @@ -31,7 +31,7 @@ public final class PhoneStatusBarTransitions extends BarTransitions { private final float mIconAlphaWhenOpaque; - private View mStartSide, mStatusIcons, mBattery; + private View mLeftSide, mStatusIcons, mBattery; private Animator mCurrentAnimation; /** @@ -41,7 +41,7 @@ public final class PhoneStatusBarTransitions extends BarTransitions { super(backgroundView, R.drawable.status_background); final Resources res = statusBarView.getContext().getResources(); mIconAlphaWhenOpaque = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1); - mStartSide = statusBarView.findViewById(R.id.status_bar_start_side_except_heads_up); + mLeftSide = statusBarView.findViewById(R.id.status_bar_left_side); mStatusIcons = statusBarView.findViewById(R.id.statusIcons); mBattery = statusBarView.findViewById(R.id.battery); applyModeBackground(-1, getMode(), false /*animate*/); @@ -75,7 +75,7 @@ public final class PhoneStatusBarTransitions extends BarTransitions { } private void applyMode(int mode, boolean animate) { - if (mStartSide == null) return; // pre-init + if (mLeftSide == null) return; // pre-init float newAlpha = getNonBatteryClockAlphaFor(mode); float newAlphaBC = getBatteryClockAlpha(mode); if (mCurrentAnimation != null) { @@ -84,7 +84,7 @@ public final class PhoneStatusBarTransitions extends BarTransitions { if (animate) { AnimatorSet anims = new AnimatorSet(); anims.playTogether( - animateTransitionTo(mStartSide, newAlpha), + animateTransitionTo(mLeftSide, newAlpha), animateTransitionTo(mStatusIcons, newAlpha), animateTransitionTo(mBattery, newAlphaBC) ); @@ -94,7 +94,7 @@ public final class PhoneStatusBarTransitions extends BarTransitions { anims.start(); mCurrentAnimation = anims; } else { - mStartSide.setAlpha(newAlpha); + mLeftSide.setAlpha(newAlpha); mStatusIcons.setAlpha(newAlpha); mBattery.setAlpha(newAlphaBC); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt index f9c4c8f3b4fe..9da2ef734be8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewController.kt @@ -21,6 +21,7 @@ import android.view.MotionEvent import android.view.View import android.view.ViewGroup import android.view.ViewTreeObserver + import com.android.systemui.R import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherController @@ -31,7 +32,9 @@ import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider import com.android.systemui.util.ViewController import com.android.systemui.util.kotlin.getOrNull import com.android.systemui.util.view.ViewUtil + import java.util.Optional + import javax.inject.Inject import javax.inject.Named @@ -55,8 +58,8 @@ class PhoneStatusBarViewController private constructor( override fun onViewAttached() { if (moveFromCenterAnimationController == null) return - val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_start_side_except_heads_up) - val systemIconArea: ViewGroup = mView.findViewById(R.id.status_bar_end_side_content) + val statusBarLeftSide: View = mView.findViewById(R.id.status_bar_left_side) + val systemIconArea: ViewGroup = mView.findViewById(R.id.system_icon_area) val viewsToAnimate = arrayOf( statusBarLeftSide, @@ -123,11 +126,11 @@ class PhoneStatusBarViewController private constructor( class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider { override fun getViewCenter(view: View, outPoint: Point) = when (view.id) { - R.id.status_bar_start_side_except_heads_up -> { + R.id.status_bar_left_side -> { // items aligned to the start, return start center point getViewEdgeCenter(view, outPoint, isStart = true) } - R.id.status_bar_end_side_content -> { + R.id.system_icon_area -> { // items aligned to the end, return end center point getViewEdgeCenter(view, outPoint, isStart = false) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index a7ede87b3f21..25892d9db080 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -96,7 +96,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue private final StatusBarStateController mStatusBarStateController; private final KeyguardStateController mKeyguardStateController; private final NotificationPanelViewController mNotificationPanelViewController; - private LinearLayout mEndSideContent; + private LinearLayout mSystemIconArea; private View mClockView; private View mOngoingCallChip; private View mNotificationIconAreaInner; @@ -217,15 +217,15 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue mDarkIconManager.setShouldLog(true); updateBlockedIcons(); mStatusBarIconController.addIconGroup(mDarkIconManager); - mEndSideContent = mStatusBar.findViewById(R.id.status_bar_end_side_content); + mSystemIconArea = mStatusBar.findViewById(R.id.system_icon_area); mClockView = mStatusBar.findViewById(R.id.clock); mOngoingCallChip = mStatusBar.findViewById(R.id.ongoing_call_chip); - showEndSideContent(false); + showSystemIconArea(false); showClock(false); initOperatorName(); initNotificationIconArea(); mSystemEventAnimator = - new StatusBarSystemEventAnimator(mEndSideContent, getResources()); + new StatusBarSystemEventAnimator(mSystemIconArea, getResources()); mCarrierConfigTracker.addCallback(mCarrierConfigCallback); mCarrierConfigTracker.addDefaultDataSubscriptionChangedListener(mDefaultDataListener); } @@ -351,10 +351,10 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue mDisabled2 = state2; if ((diff1 & DISABLE_SYSTEM_INFO) != 0 || ((diff2 & DISABLE2_SYSTEM_ICONS) != 0)) { if ((state1 & DISABLE_SYSTEM_INFO) != 0 || ((state2 & DISABLE2_SYSTEM_ICONS) != 0)) { - hideEndSideContent(animate); + hideSystemIconArea(animate); hideOperatorName(animate); } else { - showEndSideContent(animate); + showSystemIconArea(animate); showOperatorName(animate); } } @@ -438,15 +438,15 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue return mStatusBarHideIconsForBouncerManager.getShouldHideStatusBarIconsForBouncer(); } - private void hideEndSideContent(boolean animate) { - animateHide(mEndSideContent, animate); + private void hideSystemIconArea(boolean animate) { + animateHide(mSystemIconArea, animate); } - private void showEndSideContent(boolean animate) { + private void showSystemIconArea(boolean animate) { // Only show the system icon area if we are not currently animating int state = mAnimationScheduler.getAnimationState(); if (state == IDLE || state == SHOWING_PERSISTENT_DOT) { - animateShow(mEndSideContent, animate); + animateShow(mSystemIconArea, animate); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 81dc6205bf03..6f9e60fc5d69 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -122,7 +122,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { fragment.disable(DEFAULT_DISPLAY, 0, 0, false); - assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); + assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); assertEquals(View.VISIBLE, getClockView().getVisibility()); } @@ -132,11 +132,11 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { fragment.disable(DEFAULT_DISPLAY, StatusBarManager.DISABLE_SYSTEM_INFO, 0, false); - assertEquals(View.INVISIBLE, getEndSideContentView().getVisibility()); + assertEquals(View.INVISIBLE, getSystemIconAreaView().getVisibility()); fragment.disable(DEFAULT_DISPLAY, 0, 0, false); - assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); + assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); } @Test @@ -231,7 +231,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { fragment.disable(DEFAULT_DISPLAY, 0, 0, false); - assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); + assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); assertEquals(View.VISIBLE, getClockView().getVisibility()); } @@ -242,7 +242,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { fragment.disable(DEFAULT_DISPLAY, 0, 0, false); - assertEquals(View.VISIBLE, getEndSideContentView().getVisibility()); + assertEquals(View.VISIBLE, getSystemIconAreaView().getVisibility()); assertEquals(View.VISIBLE, getClockView().getVisibility()); } @@ -379,7 +379,7 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { return mFragment.getView().findViewById(R.id.clock); } - private View getEndSideContentView() { - return mFragment.getView().findViewById(R.id.status_bar_end_side_content); + private View getSystemIconAreaView() { + return mFragment.getView().findViewById(R.id.system_icon_area); } } |