Merge "Implement new footer" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-03-10 15:27:56 +00:00
committed by Android (Google) Code Review
12 changed files with 281 additions and 16 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -89,7 +89,7 @@
android:background="?android:attr/selectableItemBackgroundBorderless" android:background="?android:attr/selectableItemBackgroundBorderless"
android:clickable="true" android:clickable="true"
android:clipToPadding="false" android:clipToPadding="false"
android:contentDescription="@string/accessibility_quick_settings_edit" android:contentDescription="@string/accessibility_quick_settings_power_menu"
android:focusable="true" android:focusable="true"
android:padding="@dimen/qs_footer_icon_padding" android:padding="@dimen/qs_footer_icon_padding"
android:src="@*android:drawable/ic_lock_power_off" android:src="@*android:drawable/ic_lock_power_off"

View File

@@ -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>

View File

@@ -42,7 +42,10 @@
android:background="@android:color/transparent" android:background="@android:color/transparent"
android:focusable="true" android:focusable="true"
android:accessibilityTraversalBefore="@android:id/edit"> 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" <include layout="@layout/qs_media_divider"
android:id="@+id/divider"/> android:id="@+id/divider"/>
</com.android.systemui.qs.QSPanel> </com.android.systemui.qs.QSPanel>

View File

@@ -36,6 +36,7 @@
<color name="qs_user_detail_icon_muted">#FFFFFFFF</color> <!-- not so muted after all --> <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_tile_disabled_color">#9E9E9E</color> <!-- 38% black -->
<color name="qs_customize_decoration">@color/GM2_grey_300</color> <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 --> <!-- The color of the background in the separated list of the Global Actions menu -->
<color name="global_actions_separated_background">#F5F5F5</color> <color name="global_actions_separated_background">#F5F5F5</color>

View File

@@ -415,6 +415,9 @@
<!-- The size of each of the icon buttons in the QS footer --> <!-- The size of each of the icon buttons in the QS footer -->
<dimen name="qs_footer_action_button_size">@dimen/qs_footer_height</dimen> <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 --> <!-- Margins on each side of QS Footer -->
<dimen name="qs_footer_margin">2dp</dimen> <dimen name="qs_footer_margin">2dp</dimen>

View File

@@ -2312,6 +2312,9 @@
<!-- accessibility label for button to edit quick settings [CHAR LIMIT=NONE] --> <!-- accessibility label for button to edit quick settings [CHAR LIMIT=NONE] -->
<string name="accessibility_quick_settings_edit">Edit order of settings.</string> <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] --> <!-- 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> <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>

View File

@@ -94,7 +94,7 @@ public class QSFooterView extends FrameLayout {
@Override @Override
protected void onFinishInflate() { protected void onFinishInflate() {
super.onFinishInflate(); super.onFinishInflate();
mEdit = findViewById(android.R.id.edit); mEdit = requireViewById(android.R.id.edit);
mPageIndicator = findViewById(R.id.footer_page_indicator); mPageIndicator = findViewById(R.id.footer_page_indicator);
@@ -104,14 +104,15 @@ public class QSFooterView extends FrameLayout {
mMultiUserSwitch = findViewById(R.id.multi_user_switch); mMultiUserSwitch = findViewById(R.id.multi_user_switch);
mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); 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); mEditContainer = findViewById(R.id.qs_footer_actions_edit_container);
mBuildText = findViewById(R.id.build); mBuildText = findViewById(R.id.build);
// RenderThread is doing more harm than good when touching the header (to expand quick // RenderThread is doing more harm than good when touching the header (to expand quick
// settings), so disable it for this view // settings), so disable it for this view
((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true); if (mSettingsButton.getBackground() instanceof RippleDrawable) {
((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true);
}
updateResources(); updateResources();
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
@@ -143,7 +144,7 @@ public class QSFooterView extends FrameLayout {
int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space); int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space);
mSettingsCogAnimator = new Builder() mSettingsCogAnimator = new Builder()
.addFloat(mSettingsContainer, "translationX", .addFloat(mSettingsButton, "translationX",
isLayoutRtl() ? (remaining - defSpace) : -(remaining - defSpace), 0) isLayoutRtl() ? (remaining - defSpace) : -(remaining - defSpace), 0)
.addFloat(mSettingsButton, "rotation", -120, 0) .addFloat(mSettingsButton, "rotation", -120, 0)
.build(); .build();
@@ -173,12 +174,15 @@ public class QSFooterView extends FrameLayout {
@Nullable @Nullable
private TouchAnimator createFooterAnimator() { private TouchAnimator createFooterAnimator() {
return new TouchAnimator.Builder() TouchAnimator.Builder builder = new TouchAnimator.Builder()
.addFloat(mActionsContainer, "alpha", 0, 1) .addFloat(mActionsContainer, "alpha", 0, 1)
.addFloat(mEditContainer, "alpha", 0, 1)
.addFloat(mPageIndicator, "alpha", 0, 1) .addFloat(mPageIndicator, "alpha", 0, 1)
.setStartDelay(0.9f) .addFloat(mBuildText, "alpha", 0, 1)
.build(); .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( mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility(
isTunerEnabled ? View.VISIBLE : View.INVISIBLE); isTunerEnabled ? View.VISIBLE : View.INVISIBLE);
final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); final boolean isDemo = UserManager.isDeviceInDemoMode(mContext);
mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.INVISIBLE); mMultiUserSwitch.setVisibility(showUserSwitcher() ? View.VISIBLE : View.GONE);
mEditContainer.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); if (mEditContainer != null) {
mEditContainer.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
}
mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); mSettingsButton.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE);
mBuildText.setVisibility(mExpanded && mShouldShowBuildText ? View.VISIBLE : View.GONE); mBuildText.setVisibility(mExpanded && mShouldShowBuildText ? View.VISIBLE : View.GONE);

View File

@@ -153,8 +153,8 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
@Override @Override
protected void onViewAttached() { protected void onViewAttached() {
if (mShowPMLiteButton) { if (!mShowPMLiteButton) {
mPowerMenuLite.setVisibility(View.VISIBLE); mPowerMenuLite.setVisibility(View.GONE);
} }
mView.addOnLayoutChangeListener( mView.addOnLayoutChangeListener(
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) ->

View File

@@ -32,6 +32,7 @@ import android.view.Gravity;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.android.internal.logging.UiEventLogger; 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) { void initialize(boolean sideLabels) {
mSideLabels = sideLabels; mSideLabels = sideLabels;
inflateQSFooter(sideLabels);
mRegularTileLayout = createRegularTileLayout(); mRegularTileLayout = createRegularTileLayout();
mTileLayout = mRegularTileLayout; mTileLayout = mRegularTileLayout;
@@ -344,7 +358,6 @@ public class QSPanel extends LinearLayout implements Tunable {
@Override @Override
protected void onFinishInflate() { protected void onFinishInflate() {
super.onFinishInflate(); super.onFinishInflate();
mFooter = findViewById(R.id.qs_footer);
mDivider = findViewById(R.id.divider); mDivider = findViewById(R.id.divider);
} }

View File

@@ -55,6 +55,11 @@ public class QuickQSPanel extends QSPanel {
applyBottomMargin((View) mRegularTileLayout); applyBottomMargin((View) mRegularTileLayout);
} }
@Override
protected void inflateQSFooter(boolean newFooter) {
// No footer
}
private void applyBottomMargin(View view) { private void applyBottomMargin(View view) {
int margin = getResources().getDimensionPixelSize(R.dimen.qs_header_tile_margin_bottom); int margin = getResources().getDimensionPixelSize(R.dimen.qs_header_tile_margin_bottom);
MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams(); MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();