Implement new footer
The new footer is behind the same flag as the new tiles Fixes: 181981409 Test: manual Change-Id: I688c9c1fa83ad6ba931a661bd718fcc2e3c4fd43
This commit is contained in:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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"
|
||||
|
||||
159
packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml
Normal file
159
packages/SystemUI/res/layout/qs_footer_impl_two_lines.xml
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -2315,6 +2315,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>
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) ->
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user