diff options
3 files changed, 152 insertions, 48 deletions
diff --git a/packages/SystemUI/res/layout/keyguard_status_bar.xml b/packages/SystemUI/res/layout/keyguard_status_bar.xml index cd1be152b8d2..70f1cd81d7b9 100644 --- a/packages/SystemUI/res/layout/keyguard_status_bar.xml +++ b/packages/SystemUI/res/layout/keyguard_status_bar.xml @@ -25,41 +25,48 @@ android:baselineAligned="false" > - <com.android.systemui.statusbar.phone.MultiUserSwitch android:id="@+id/multi_user_switch" - android:layout_width="@dimen/multi_user_switch_width_keyguard" + <LinearLayout + android:id="@+id/status_icon_area" + android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_alignParentEnd="true" - android:background="@drawable/ripple_drawable" - android:layout_marginEnd="@dimen/multi_user_switch_keyguard_margin"> - <ImageView android:id="@+id/multi_user_avatar" - android:layout_width="@dimen/multi_user_avatar_keyguard_size" - android:layout_height="@dimen/multi_user_avatar_keyguard_size" - android:layout_gravity="center" - android:scaleType="centerInside"/> - </com.android.systemui.statusbar.phone.MultiUserSwitch> - - <LinearLayout android:id="@+id/system_icons_super_container" - android:layout_width="wrap_content" - android:layout_height="@*android:dimen/quick_qs_total_height" - android:layout_toStartOf="@id/multi_user_switch" - android:layout_alignWithParentIfMissing="true" - android:layout_marginStart="@dimen/system_icons_super_container_margin_start" - android:paddingEnd="@dimen/system_icons_keyguard_padding_end"> + android:gravity="center_vertical|end" > <FrameLayout android:id="@+id/system_icons_container" - android:layout_width="wrap_content" + android:layout_width="0dp" android:layout_height="@dimen/status_bar_height" - android:layout_gravity="center_vertical" - > + android:layout_weight="1" + android:layout_marginStart="@dimen/system_icons_super_container_margin_start" + android:gravity="center_vertical|end" + android:paddingEnd="@dimen/system_icons_keyguard_padding_end" > <include layout="@layout/system_icons" /> </FrameLayout> + + <com.android.systemui.statusbar.phone.MultiUserSwitch android:id="@+id/multi_user_switch" + android:layout_width="@dimen/multi_user_switch_width_keyguard" + android:layout_height="match_parent" + android:background="@drawable/ripple_drawable" + android:layout_marginEnd="@dimen/multi_user_switch_keyguard_margin"> + <ImageView android:id="@+id/multi_user_avatar" + android:layout_width="@dimen/multi_user_avatar_keyguard_size" + android:layout_height="@dimen/multi_user_avatar_keyguard_size" + android:layout_gravity="center" + android:scaleType="centerInside"/> + </com.android.systemui.statusbar.phone.MultiUserSwitch> </LinearLayout> + <Space + android:id="@+id/cutout_space_view" + android:layout_width="0dp" + android:layout_height="match_parent" + android:gravity="center" + android:visibility="gone" /> + <com.android.keyguard.CarrierText android:id="@+id/keyguard_carrier_text" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginStart="@dimen/keyguard_carrier_text_margin" - android:layout_toStartOf="@id/system_icons_super_container" + android:layout_toStartOf="@id/system_icons_container" android:gravity="center_vertical" android:ellipsize="marquee" android:textAppearance="?android:attr/textAppearanceSmall" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 2375b6a07bf6..c5269ad3d147 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -26,10 +26,13 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.TypedValue; +import android.view.DisplayCutout; import android.view.View; import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; import android.view.ViewTreeObserver; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; @@ -59,6 +62,10 @@ import com.android.systemui.statusbar.policy.UserSwitcherController; public class KeyguardStatusBarView extends RelativeLayout implements BatteryStateChangeCallback, OnUserInfoChangedListener, ConfigurationListener { + private static final int LAYOUT_NONE = 0; + private static final int LAYOUT_CUTOUT = 1; + private static final int LAYOUT_NO_CUTOUT = 2; + private boolean mBatteryCharging; private boolean mKeyguardUserSwitcherShowing; private boolean mBatteryListening; @@ -78,6 +85,10 @@ public class KeyguardStatusBarView extends RelativeLayout private View mSystemIconsContainer; private TintedIconManager mIconManager; + private View mCutoutSpace; + private ViewGroup mStatusIconArea; + private int mLayoutState = LAYOUT_NONE; + public KeyguardStatusBarView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -85,12 +96,13 @@ public class KeyguardStatusBarView extends RelativeLayout @Override protected void onFinishInflate() { super.onFinishInflate(); - mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container); mSystemIconsContainer = findViewById(R.id.system_icons_container); mMultiUserSwitch = findViewById(R.id.multi_user_switch); mMultiUserAvatar = findViewById(R.id.multi_user_avatar); mCarrierLabel = findViewById(R.id.keyguard_carrier_text); mBatteryView = mSystemIconsContainer.findViewById(R.id.battery); + mCutoutSpace = findViewById(R.id.cutout_space_view); + mStatusIconArea = findViewById(R.id.status_icon_area); loadDimens(); updateUserSwitcher(); @@ -106,6 +118,7 @@ public class KeyguardStatusBarView extends RelativeLayout R.dimen.multi_user_avatar_keyguard_size); mMultiUserAvatar.setLayoutParams(lp); + // Multi-user switch lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams(); lp.width = getResources().getDimensionPixelSize( R.dimen.multi_user_switch_width_keyguard); @@ -113,21 +126,21 @@ public class KeyguardStatusBarView extends RelativeLayout R.dimen.multi_user_switch_keyguard_margin)); mMultiUserSwitch.setLayoutParams(lp); - lp = (MarginLayoutParams) mSystemIconsSuperContainer.getLayoutParams(); + // System icons + lp = (MarginLayoutParams) mStatusIconArea.getLayoutParams(); lp.height = getResources().getDimensionPixelSize( - com.android.internal.R.dimen.quick_qs_total_height); - lp.setMarginStart(getResources().getDimensionPixelSize( - R.dimen.system_icons_super_container_margin_start)); - mSystemIconsSuperContainer.setLayoutParams(lp); - mSystemIconsSuperContainer.setPaddingRelative(mSystemIconsSuperContainer.getPaddingStart(), - mSystemIconsSuperContainer.getPaddingTop(), - getResources().getDimensionPixelSize(R.dimen.system_icons_keyguard_padding_end), - mSystemIconsSuperContainer.getPaddingBottom()); + com.android.internal.R.dimen.status_bar_height); lp = (MarginLayoutParams) mSystemIconsContainer.getLayoutParams(); lp.height = getResources().getDimensionPixelSize( R.dimen.status_bar_height); + lp.setMarginStart(getResources().getDimensionPixelSize( + R.dimen.system_icons_super_container_margin_start)); mSystemIconsContainer.setLayoutParams(lp); + mSystemIconsContainer.setPaddingRelative(mSystemIconsContainer.getPaddingStart(), + mSystemIconsContainer.getPaddingTop(), + getResources().getDimensionPixelSize(R.dimen.system_icons_keyguard_padding_end), + mSystemIconsContainer.getPaddingBottom()); // Respect font size setting. mCarrierLabel.setTextSize(TypedValue.COMPLEX_UNIT_PX, @@ -153,13 +166,13 @@ public class KeyguardStatusBarView extends RelativeLayout } private void updateVisibilities() { - if (mMultiUserSwitch.getParent() != this && !mKeyguardUserSwitcherShowing) { + if (mMultiUserSwitch.getParent() != mStatusIconArea && !mKeyguardUserSwitcherShowing) { if (mMultiUserSwitch.getParent() != null) { getOverlay().remove(mMultiUserSwitch); } - addView(mMultiUserSwitch, 0); - } else if (mMultiUserSwitch.getParent() == this && mKeyguardUserSwitcherShowing) { - removeView(mMultiUserSwitch); + mStatusIconArea.addView(mMultiUserSwitch, 0); + } else if (mMultiUserSwitch.getParent() == mStatusIconArea && mKeyguardUserSwitcherShowing) { + mStatusIconArea.removeView(mMultiUserSwitch); } if (mKeyguardUserSwitcher == null) { // If we have no keyguard switcher, the screen width is under 600dp. In this case, @@ -175,8 +188,8 @@ public class KeyguardStatusBarView extends RelativeLayout } private void updateSystemIconsLayoutParams() { - RelativeLayout.LayoutParams lp = - (LayoutParams) mSystemIconsSuperContainer.getLayoutParams(); + LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams(); // If the avatar icon is gone, we need to have some end margin to display the system icons // correctly. int baseMarginEnd = mMultiUserSwitch.getVisibility() == View.GONE @@ -186,8 +199,86 @@ public class KeyguardStatusBarView extends RelativeLayout baseMarginEnd; if (marginEnd != lp.getMarginEnd()) { lp.setMarginEnd(marginEnd); - mSystemIconsSuperContainer.setLayoutParams(lp); + mSystemIconsContainer.setLayoutParams(lp); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + updateLayoutConsideringCutout(); + setSignalClusterLayoutWidth(); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + private void updateLayoutConsideringCutout() { + DisplayCutout dc = getRootWindowInsets().getDisplayCutout(); + if (dc == null) { + updateLayoutParamsNoCutout(); + } else { + updateLayoutParamsForCutout(dc); + } + } + + private void updateLayoutParamsNoCutout() { + if (mLayoutState == LAYOUT_NO_CUTOUT) { + return; + } + mLayoutState = LAYOUT_NO_CUTOUT; + + if (mCutoutSpace != null) { + mCutoutSpace.setVisibility(View.GONE); + } + + RelativeLayout.LayoutParams lp = (LayoutParams) mCarrierLabel.getLayoutParams(); + lp.addRule(RelativeLayout.START_OF, R.id.status_icon_area); + + lp = (LayoutParams) mStatusIconArea.getLayoutParams(); + lp.removeRule(RelativeLayout.RIGHT_OF); + lp.width = LayoutParams.WRAP_CONTENT; + + LinearLayout.LayoutParams llp = + (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams(); + llp.setMarginStart(getResources().getDimensionPixelSize( + R.dimen.system_icons_super_container_margin_start)); + } + + private void updateLayoutParamsForCutout(DisplayCutout dc) { + if (mLayoutState == LAYOUT_CUTOUT) { + return; + } + mLayoutState = LAYOUT_CUTOUT; + + if (mCutoutSpace == null) { + updateLayoutParamsNoCutout(); + } + + mCutoutSpace.setVisibility(View.VISIBLE); + RelativeLayout.LayoutParams lp = (LayoutParams) mCutoutSpace.getLayoutParams(); + lp.width = dc.getBoundingRect().width(); + lp.height = dc.getBoundingRect().height(); + lp.addRule(RelativeLayout.CENTER_IN_PARENT); + + lp = (LayoutParams) mCarrierLabel.getLayoutParams(); + lp.addRule(RelativeLayout.START_OF, R.id.cutout_space_view); + + lp = (LayoutParams) mStatusIconArea.getLayoutParams(); + lp.addRule(RelativeLayout.RIGHT_OF, R.id.cutout_space_view); + lp.width = LayoutParams.MATCH_PARENT; + + LinearLayout.LayoutParams llp = + (LinearLayout.LayoutParams) mSystemIconsContainer.getLayoutParams(); + llp.setMarginStart(0); + } + + //TODO: Something is setting signal_cluster to MATCH_PARENT. Why? + private void setSignalClusterLayoutWidth() { + View signalCluster = findViewById(R.id.signal_cluster); + if (signalCluster == null) { + return; } + + LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) signalCluster.getLayoutParams(); + lp.width = LinearLayout.LayoutParams.WRAP_CONTENT; } public void setListening(boolean listening) { @@ -265,20 +356,21 @@ public class KeyguardStatusBarView extends RelativeLayout animateNextLayoutChange(); } updateVisibilities(); + updateLayoutConsideringCutout(); updateSystemIconsLayoutParams(); } private void animateNextLayoutChange() { - final int systemIconsCurrentX = mSystemIconsSuperContainer.getLeft(); - final boolean userSwitcherVisible = mMultiUserSwitch.getParent() == this; + final int systemIconsCurrentX = mSystemIconsContainer.getLeft(); + final boolean userSwitcherVisible = mMultiUserSwitch.getParent() == mStatusIconArea; getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { getViewTreeObserver().removeOnPreDrawListener(this); boolean userSwitcherHiding = userSwitcherVisible - && mMultiUserSwitch.getParent() != KeyguardStatusBarView.this; - mSystemIconsSuperContainer.setX(systemIconsCurrentX); - mSystemIconsSuperContainer.animate() + && mMultiUserSwitch.getParent() != mStatusIconArea; + mSystemIconsContainer.setX(systemIconsCurrentX); + mSystemIconsContainer.animate() .translationX(0) .setDuration(400) .setStartDelay(userSwitcherHiding ? 300 : 0) @@ -315,8 +407,8 @@ public class KeyguardStatusBarView extends RelativeLayout public void setVisibility(int visibility) { super.setVisibility(visibility); if (visibility != View.VISIBLE) { - mSystemIconsSuperContainer.animate().cancel(); - mSystemIconsSuperContainer.setTranslationX(0); + mSystemIconsContainer.animate().cancel(); + mSystemIconsContainer.setTranslationX(0); mMultiUserSwitch.animate().cancel(); mMultiUserSwitch.setAlpha(1f); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java index dba89479cf98..dab28d65a5a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusIconContainer.java @@ -69,10 +69,14 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int width = MeasureSpec.getSize(widthMeasureSpec); + int widthSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.UNSPECIFIED); + final int count = getChildCount(); // Measure all children so that they report the correct width for (int i = 0; i < count; i++) { - measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec); + measureChild(getChildAt(i), widthSpec, heightMeasureSpec); } } @@ -99,7 +103,8 @@ public class StatusIconContainer extends AlphaOptimizedLinearLayout { int childCount = getChildCount(); // Underflow === don't show content until that index int firstUnderflowIndex = -1; - if (DEBUG) android.util.Log.d(TAG, "calculateIconTransitions: start=" + translationX); + if (DEBUG) android.util.Log.d(TAG, "calculateIconTransitions: start=" + translationX + + " width=" + width); //TODO: Dots for (int i = childCount - 1; i >= 0; i--) { |