diff options
12 files changed, 281 insertions, 16 deletions
diff --git a/packages/SystemUI/res/drawable/qs_footer_action_chip_background.xml b/packages/SystemUI/res/drawable/qs_footer_action_chip_background.xml new file mode 100644 index 000000000000..34675ab891c1 --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_footer_action_chip_background.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 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. + --> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:insetTop="@dimen/qs_footer_action_inset" + android:insetBottom="@dimen/qs_footer_action_inset"> + <ripple + android:color="?android:attr/colorControlHighlight" + android:height="44dp"> + <item android:id="@android:id/mask"> + <shape android:shape="rectangle"> + <solid android:color="@android:color/white"/> + <corners android:radius="@dimen/screenshot_button_corner_radius"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <stroke android:width="1dp" android:color="@color/qs_footer_action_border"/> + <solid android:color="@android:color/transparent"/> + <corners android:radius="@dimen/screenshot_button_corner_radius"/> + </shape> + </item> + </ripple> +</inset>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/qs_footer_action_chip_background_borderless.xml b/packages/SystemUI/res/drawable/qs_footer_action_chip_background_borderless.xml new file mode 100644 index 000000000000..596ed711dd43 --- /dev/null +++ b/packages/SystemUI/res/drawable/qs_footer_action_chip_background_borderless.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2021 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. + --> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:insetTop="@dimen/qs_footer_action_inset" + android:insetBottom="@dimen/qs_footer_action_inset"> + <ripple + android:color="?android:attr/colorControlHighlight"> + <item android:id="@android:id/mask"> + <shape android:shape="rectangle"> + <solid android:color="@android:color/white"/> + <corners android:radius="@dimen/screenshot_button_corner_radius"/> + </shape> + </item> + <item> + <shape android:shape="rectangle"> + <solid android:color="@android:color/transparent"/> + <corners android:radius="@dimen/screenshot_button_corner_radius"/> + </shape> + </item> + </ripple> +</inset>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml index 93dd1a12f147..02179722b35c 100644 --- a/packages/SystemUI/res/layout/qs_footer_impl.xml +++ b/packages/SystemUI/res/layout/qs_footer_impl.xml @@ -89,7 +89,7 @@ android:background="?android:attr/selectableItemBackgroundBorderless" android:clickable="true" android:clipToPadding="false" - android:contentDescription="@string/accessibility_quick_settings_edit" + android:contentDescription="@string/accessibility_quick_settings_power_menu" android:focusable="true" android:padding="@dimen/qs_footer_icon_padding" android:src="@*android:drawable/ic_lock_power_off" diff --git a/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml b/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml new file mode 100644 index 000000000000..726e69f6e50c --- /dev/null +++ b/packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml @@ -0,0 +1,159 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** Copyright 2021, 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. +--> + +<!-- Extends FrameLayout --> +<com.android.systemui.qs.QSFooterView xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/qs_footer" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_footer_height" + android:layout_marginStart="@dimen/qs_footer_margin" + android:layout_marginEnd="@dimen/qs_footer_margin" + android:background="@android:color/transparent" + android:baselineAligned="false" + android:clickable="false" + android:clipChildren="false" + android:clipToPadding="false"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="48dp" + android:layout_gravity="center_vertical"> + + <TextView + android:id="@+id/build" + android:layout_width="0dp" + android:layout_height="match_parent" + android:paddingStart="@dimen/qs_tile_margin_horizontal" + android:paddingEnd="4dp" + android:layout_weight="1" + android:clickable="true" + android:ellipsize="marquee" + android:focusable="true" + android:gravity="center_vertical" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.QS.Status" + android:visibility="gone" /> + + <com.android.systemui.qs.PageIndicator + android:id="@+id/footer_page_indicator" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="center_vertical" + android:visibility="gone" /> + + <View + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" /> + + </LinearLayout> + + <LinearLayout + android:id="@+id/qs_footer_actions_container" + android:layout_width="match_parent" + android:layout_height="48dp" + android:gravity="center_vertical"> + + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:id="@android:id/edit" + android:layout_width="0dp" + android:layout_height="@dimen/qs_footer_action_button_size" + android:layout_marginEnd="@dimen/qs_tile_margin_horizontal" + android:layout_weight="1" + android:background="@drawable/qs_footer_action_chip_background" + android:clickable="true" + android:clipToPadding="false" + android:contentDescription="@string/accessibility_quick_settings_edit" + android:focusable="true" + android:padding="@dimen/qs_footer_icon_padding" + android:src="@*android:drawable/ic_mode_edit" + android:tint="?android:attr/colorForeground" /> + + <com.android.systemui.statusbar.phone.MultiUserSwitch + android:id="@+id/multi_user_switch" + android:layout_width="0dp" + android:layout_height="@dimen/qs_footer_action_button_size" + android:layout_marginEnd="@dimen/qs_tile_margin_horizontal" + android:layout_weight="1" + android:background="@drawable/qs_footer_action_chip_background" + android:focusable="true"> + + <ImageView + android:id="@+id/multi_user_avatar" + android:layout_width="@dimen/multi_user_avatar_expanded_size" + android:layout_height="@dimen/multi_user_avatar_expanded_size" + android:layout_gravity="center" + android:scaleType="centerInside" /> + </com.android.systemui.statusbar.phone.MultiUserSwitch> + + <com.android.systemui.statusbar.AlphaOptimizedFrameLayout + android:id="@+id/settings_button_container" + android:layout_width="0dp" + android:layout_height="@dimen/qs_footer_action_button_size" + android:layout_marginEnd="@dimen/qs_tile_margin_horizontal" + android:background="@drawable/qs_footer_action_chip_background" + android:layout_weight="1" + android:clipChildren="false" + android:clipToPadding="false"> + + <com.android.systemui.statusbar.phone.SettingsButton + android:id="@+id/settings_button" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_footer_action_button_size" + android:layout_gravity="center" + android:contentDescription="@string/accessibility_quick_settings_settings" + android:background="@drawable/qs_footer_action_chip_background_borderless" + android:padding="@dimen/qs_footer_icon_padding" + android:scaleType="centerInside" + android:src="@drawable/ic_settings" + android:tint="?android:attr/colorForeground" /> + + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:id="@+id/tuner_icon" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:paddingStart="36dp" + android:paddingEnd="4dp" + android:src="@drawable/tuner" + android:tint="?android:attr/textColorTertiary" + android:visibility="invisible" /> + + </com.android.systemui.statusbar.AlphaOptimizedFrameLayout> + + <com.android.systemui.statusbar.AlphaOptimizedImageView + android:id="@+id/pm_lite" + android:layout_width="0dp" + android:layout_height="@dimen/qs_footer_action_button_size" + android:layout_weight="1" + android:background="@drawable/qs_footer_action_chip_background" + android:clickable="true" + android:clipToPadding="false" + android:focusable="true" + android:padding="@dimen/qs_footer_icon_padding" + android:src="@*android:drawable/ic_lock_power_off" + android:contentDescription="@string/accessibility_quick_settings_power_menu" + android:tint="?android:attr/colorForeground" /> + + </LinearLayout> + </LinearLayout> + +</com.android.systemui.qs.QSFooterView> diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml index 77f17439c487..d29cf872fd26 100644 --- a/packages/SystemUI/res/layout/qs_panel.xml +++ b/packages/SystemUI/res/layout/qs_panel.xml @@ -42,7 +42,10 @@ android:background="@android:color/transparent" android:focusable="true" android:accessibilityTraversalBefore="@android:id/edit"> - <include layout="@layout/qs_footer_impl" /> + <ViewStub + android:id="@+id/qs_footer_stub" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> <include layout="@layout/qs_media_divider" android:id="@+id/divider"/> </com.android.systemui.qs.QSPanel> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index c36f7cd630a9..424172458b80 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -36,6 +36,7 @@ <color name="qs_user_detail_icon_muted">#FFFFFFFF</color> <!-- not so muted after all --> <color name="qs_tile_disabled_color">#9E9E9E</color> <!-- 38% black --> <color name="qs_customize_decoration">@color/GM2_grey_300</color> + <color name="qs_footer_action_border">#2E312C</color> <!-- The color of the background in the separated list of the Global Actions menu --> <color name="global_actions_separated_background">#F5F5F5</color> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 392eb496031a..94214d503004 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -415,6 +415,9 @@ <!-- The size of each of the icon buttons in the QS footer --> <dimen name="qs_footer_action_button_size">@dimen/qs_footer_height</dimen> + <!-- (48dp - 44dp) / 2 --> + <dimen name="qs_footer_action_inset">2dp</dimen> + <!-- Margins on each side of QS Footer --> <dimen name="qs_footer_margin">2dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 783f80c2ee02..cc5b44b680bf 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2312,6 +2312,9 @@ <!-- accessibility label for button to edit quick settings [CHAR LIMIT=NONE] --> <string name="accessibility_quick_settings_edit">Edit order of settings.</string> + <!-- accessibility label for button to open power menu [CHAR LIMIT=NONE] --> + <string name="accessibility_quick_settings_power_menu">Power menu</string> + <!-- accessibility label for paging indicator in quick settings [CHAR LIMITi=NONE] --> <string name="accessibility_quick_settings_page">Page <xliff:g name="current_page" example="1">%1$d</xliff:g> of <xliff:g name="num_pages" example="2">%2$d</xliff:g></string> diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java index 7e20be6826dc..3d8784b29e4c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java @@ -94,7 +94,7 @@ public class QSFooterView extends FrameLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mEdit = findViewById(android.R.id.edit); + mEdit = requireViewById(android.R.id.edit); mPageIndicator = findViewById(R.id.footer_page_indicator); @@ -104,14 +104,15 @@ public class QSFooterView extends FrameLayout { mMultiUserSwitch = findViewById(R.id.multi_user_switch); mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); - mActionsContainer = findViewById(R.id.qs_footer_actions_container); + mActionsContainer = requireViewById(R.id.qs_footer_actions_container); mEditContainer = findViewById(R.id.qs_footer_actions_edit_container); mBuildText = findViewById(R.id.build); // RenderThread is doing more harm than good when touching the header (to expand quick // settings), so disable it for this view - ((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true); - + if (mSettingsButton.getBackground() instanceof RippleDrawable) { + ((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true); + } updateResources(); setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); @@ -143,7 +144,7 @@ public class QSFooterView extends FrameLayout { int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space); mSettingsCogAnimator = new Builder() - .addFloat(mSettingsContainer, "translationX", + .addFloat(mSettingsButton, "translationX", isLayoutRtl() ? (remaining - defSpace) : -(remaining - defSpace), 0) .addFloat(mSettingsButton, "rotation", -120, 0) .build(); @@ -173,12 +174,15 @@ public class QSFooterView extends FrameLayout { @Nullable private TouchAnimator createFooterAnimator() { - return new TouchAnimator.Builder() + TouchAnimator.Builder builder = new TouchAnimator.Builder() .addFloat(mActionsContainer, "alpha", 0, 1) - .addFloat(mEditContainer, "alpha", 0, 1) .addFloat(mPageIndicator, "alpha", 0, 1) - .setStartDelay(0.9f) - .build(); + .addFloat(mBuildText, "alpha", 0, 1) + .setStartDelay(0.9f); + if (mEditContainer != null) { + builder.addFloat(mEditContainer, "alpha", 0, 1); + } + return builder.build(); } /** */ @@ -273,8 +277,10 @@ public class QSFooterView extends FrameLayout { mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility( isTunerEnabled ? View.VISIBLE : View.INVISIBLE); final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); - mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.INVISIBLE); - mEditContainer.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); + mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.GONE); + if (mEditContainer != null) { + mEditContainer.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); + } mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); mBuildText.setVisibility(mExpanded && mShouldShowBuildText ? View.VISIBLE : View.GONE); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java index 2bea72cc0c7e..f1f4e16206a1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterViewController.java @@ -153,8 +153,8 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme @Override protected void onViewAttached() { - if (mShowPMLiteButton) { - mPowerMenuLite.setVisibility(View.VISIBLE); + if (!mShowPMLiteButton) { + mPowerMenuLite.setVisibility(View.GONE); } mView.addOnLayoutChangeListener( (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 7657dcead583..ff9b9120c6e1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -32,6 +32,7 @@ import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewStub; import android.widget.LinearLayout; import com.android.internal.logging.UiEventLogger; @@ -127,8 +128,21 @@ public class QSPanel extends LinearLayout implements Tunable { } + protected void inflateQSFooter(boolean newFooter) { + ViewStub stub = findViewById(R.id.qs_footer_stub); + if (stub != null) { + stub.setLayoutResource( + newFooter ? R.layout.qs_footer_impl_two_lines : R.layout.qs_footer_impl); + stub.inflate(); + mFooter = findViewById(R.id.qs_footer); + } + } + void initialize(boolean sideLabels) { mSideLabels = sideLabels; + + inflateQSFooter(sideLabels); + mRegularTileLayout = createRegularTileLayout(); mTileLayout = mRegularTileLayout; @@ -344,7 +358,6 @@ public class QSPanel extends LinearLayout implements Tunable { @Override protected void onFinishInflate() { super.onFinishInflate(); - mFooter = findViewById(R.id.qs_footer); mDivider = findViewById(R.id.divider); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 9b66b59c06df..f51d7ef381ee 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -55,6 +55,11 @@ public class QuickQSPanel extends QSPanel { applyBottomMargin((View) mRegularTileLayout); } + @Override + protected void inflateQSFooter(boolean newFooter) { + // No footer + } + private void applyBottomMargin(View view) { int margin = getResources().getDimensionPixelSize(R.dimen.qs_header_tile_margin_bottom); MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams(); |