Merge "Adding more icons to split shade header" into sc-v2-dev

This commit is contained in:
Michał Brzeziński
2021-07-14 14:30:47 +00:00
committed by Android (Google) Code Review
11 changed files with 193 additions and 47 deletions

View File

@@ -21,7 +21,7 @@
android:layout_height="@*android:dimen/quick_qs_offset_height" android:layout_height="@*android:dimen/quick_qs_offset_height"
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false" android:clipToPadding="false"
android:minHeight="48dp" android:minHeight="@dimen/qs_header_row_min_height"
android:clickable="false" android:clickable="false"
android:focusable="true" android:focusable="true"
android:theme="@style/Theme.SystemUI.QuickSettings.Header"> android:theme="@style/Theme.SystemUI.QuickSettings.Header">
@@ -31,7 +31,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:minWidth="48dp" android:minWidth="48dp"
android:minHeight="48dp" android:minHeight="@dimen/qs_header_row_min_height"
android:gravity="center_vertical|start" android:gravity="center_vertical|start"
android:paddingStart="@dimen/status_bar_left_clock_starting_padding" android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
android:paddingEnd="@dimen/status_bar_left_clock_end_padding" android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
@@ -43,7 +43,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:minHeight="48dp" android:minHeight="@dimen/qs_header_row_min_height"
android:minWidth="48dp" android:minWidth="48dp"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"

View File

@@ -0,0 +1,89 @@
<?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.
-->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/split_shade_status_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/split_shade_header_height"
android:minHeight="@dimen/split_shade_header_min_height"
android:clickable="false"
android:focusable="true"
android:paddingLeft="@dimen/qs_panel_padding"
android:paddingRight="@dimen/qs_panel_padding"
android:visibility="gone"
android:theme="@style/Theme.SystemUI.QuickSettings.Header">
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="48dp"
android:minHeight="@dimen/split_shade_header_min_height"
android:gravity="start|center_vertical"
android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.QS.Status" />
<com.android.systemui.statusbar.policy.DateView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:gravity="center_vertical"
android:singleLine="true"
android:textAppearance="@style/TextAppearance.QS.Status"
systemui:datePattern="@string/abbrev_wday_month_day_no_year_alarm" />
<FrameLayout
android:id="@+id/rightLayout"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="end">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end|center_vertical">
<include
android:id="@+id/carrier_group"
layout="@layout/qs_carrier_group"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="end|center_vertical"
android:layout_marginStart="8dp"
android:focusable="false"
android:minHeight="@dimen/split_shade_header_min_height"
android:minWidth="48dp" />
<com.android.systemui.statusbar.phone.StatusIconContainer
android:id="@+id/statusIcons"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:paddingEnd="@dimen/signal_cluster_battery_padding" />
<com.android.systemui.BatteryMeterView
android:id="@+id/batteryRemainingIcon"
android:layout_width="wrap_content"
android:layout_height="match_parent"
systemui:textAppearance="@style/TextAppearance.QS.Status" />
</LinearLayout>
</FrameLayout>
</LinearLayout>

View File

@@ -67,7 +67,7 @@
android:clipToPadding="false" android:clipToPadding="false"
android:clipChildren="false"> android:clipChildren="false">
<include layout="@layout/quick_qs_status_icons"/> <include layout="@layout/split_shade_header"/>
<include <include
layout="@layout/keyguard_status_view" layout="@layout/keyguard_status_view"

View File

@@ -461,7 +461,8 @@
<dimen name="match_parent">-1px</dimen> <dimen name="match_parent">-1px</dimen>
<!-- Height of status bar in split shade mode - visible only on large screens --> <!-- Height of status bar in split shade mode - visible only on large screens -->
<dimen name="split_shade_status_bar_height">@*android:dimen/quick_qs_offset_height</dimen> <dimen name="split_shade_header_height">@*android:dimen/quick_qs_offset_height</dimen>
<dimen name="split_shade_header_min_height">@dimen/qs_header_row_min_height</dimen>
<!-- The top margin of the panel that holds the list of notifications. --> <!-- The top margin of the panel that holds the list of notifications. -->
<dimen name="notification_panel_margin_top">0dp</dimen> <dimen name="notification_panel_margin_top">0dp</dimen>
@@ -631,6 +632,7 @@
<dimen name="qs_footer_icon_size">20dp</dimen> <dimen name="qs_footer_icon_size">20dp</dimen>
<dimen name="qs_header_top_padding">15dp</dimen> <dimen name="qs_header_top_padding">15dp</dimen>
<dimen name="qs_header_bottom_padding">14dp</dimen> <dimen name="qs_header_bottom_padding">14dp</dimen>
<dimen name="qs_header_row_min_height">48dp</dimen>
<dimen name="qs_footer_padding">20dp</dimen> <dimen name="qs_footer_padding">20dp</dimen>
<dimen name="qs_security_footer_height">88dp</dimen> <dimen name="qs_security_footer_height">88dp</dimen>

View File

@@ -192,6 +192,7 @@ public class BatteryMeterView extends LinearLayout implements
* 0 - No preference * 0 - No preference
* 1 - Force on * 1 - Force on
* 2 - Force off * 2 - Force off
* 3 - Estimate
* @param mode desired mode (none, on, off) * @param mode desired mode (none, on, off)
*/ */
public void setPercentShowMode(@BatteryPercentMode int mode) { public void setPercentShowMode(@BatteryPercentMode int mode) {

View File

@@ -334,7 +334,7 @@ public class NotificationPanelViewController extends PanelViewController {
private final int mMaxKeyguardNotifications; private final int mMaxKeyguardNotifications;
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
private final TapAgainViewController mTapAgainViewController; private final TapAgainViewController mTapAgainViewController;
private final SplitShadeStatusBarController mSplitShadeStatusBarController; private final SplitShadeHeaderController mSplitShadeHeaderController;
private boolean mShouldUseSplitNotificationShade; private boolean mShouldUseSplitNotificationShade;
// Current max allowed keyguard notifications determined by measuring the panel // Current max allowed keyguard notifications determined by measuring the panel
private int mMaxAllowedKeyguardNotifications; private int mMaxAllowedKeyguardNotifications;
@@ -723,7 +723,7 @@ public class NotificationPanelViewController extends PanelViewController {
QuickAccessWalletController quickAccessWalletController, QuickAccessWalletController quickAccessWalletController,
@Main Executor uiExecutor, @Main Executor uiExecutor,
SecureSettings secureSettings, SecureSettings secureSettings,
SplitShadeStatusBarController splitShadeStatusBarController, SplitShadeHeaderController splitShadeHeaderController,
UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
NotificationRemoteInputManager remoteInputManager) { NotificationRemoteInputManager remoteInputManager) {
super(view, falsingManager, dozeLog, keyguardStateController, super(view, falsingManager, dozeLog, keyguardStateController,
@@ -757,7 +757,7 @@ public class NotificationPanelViewController extends PanelViewController {
mShouldUseSplitNotificationShade = mShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(mFeatureFlags, mResources); Utils.shouldUseSplitNotificationShade(mFeatureFlags, mResources);
mView.setWillNotDraw(!DEBUG); mView.setWillNotDraw(!DEBUG);
mSplitShadeStatusBarController = splitShadeStatusBarController; mSplitShadeHeaderController = splitShadeHeaderController;
mLayoutInflater = layoutInflater; mLayoutInflater = layoutInflater;
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
mFalsingCollector = falsingCollector; mFalsingCollector = falsingCollector;
@@ -1027,7 +1027,7 @@ public class NotificationPanelViewController extends PanelViewController {
mQuickQsOffsetHeight = mResources.getDimensionPixelSize( mQuickQsOffsetHeight = mResources.getDimensionPixelSize(
com.android.internal.R.dimen.quick_qs_offset_height); com.android.internal.R.dimen.quick_qs_offset_height);
mSplitShadeStatusBarHeight = mSplitShadeStatusBarHeight =
mResources.getDimensionPixelSize(R.dimen.split_shade_status_bar_height); mResources.getDimensionPixelSize(R.dimen.split_shade_header_height);
int qsWidth = mResources.getDimensionPixelSize(R.dimen.qs_panel_width); int qsWidth = mResources.getDimensionPixelSize(R.dimen.qs_panel_width);
int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width); int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
mShouldUseSplitNotificationShade = mShouldUseSplitNotificationShade =
@@ -1039,7 +1039,7 @@ public class NotificationPanelViewController extends PanelViewController {
int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight : int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight :
mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top); mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top);
mSplitShadeStatusBarController.setSplitShadeMode(mShouldUseSplitNotificationShade); mSplitShadeHeaderController.setSplitShadeMode(mShouldUseSplitNotificationShade);
// To change the constraints at runtime, all children of the ConstraintLayout must have ids // To change the constraints at runtime, all children of the ConstraintLayout must have ids
ensureAllViewsHaveIds(mNotificationContainerParent); ensureAllViewsHaveIds(mNotificationContainerParent);
@@ -4468,7 +4468,7 @@ public class NotificationPanelViewController extends PanelViewController {
maybeAnimateBottomAreaAlpha(); maybeAnimateBottomAreaAlpha();
resetHorizontalPanelPosition(); resetHorizontalPanelPosition();
updateQsState(); updateQsState();
mSplitShadeStatusBarController.setShadeExpanded( mSplitShadeHeaderController.setShadeExpanded(
mBarState == SHADE || mBarState == SHADE_LOCKED); mBarState == SHADE || mBarState == SHADE_LOCKED);
} }

View File

@@ -0,0 +1,83 @@
/*
* 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.
*/
package com.android.systemui.statusbar.phone
import android.view.View
import com.android.systemui.BatteryMeterView
import com.android.systemui.R
import com.android.systemui.qs.carrier.QSCarrierGroupController
import com.android.systemui.statusbar.FeatureFlags
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope
import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_HEADER
import javax.inject.Inject
import javax.inject.Named
@StatusBarScope
class SplitShadeHeaderController @Inject constructor(
@Named(SPLIT_SHADE_HEADER) private val statusBar: View,
private val statusBarIconController: StatusBarIconController,
qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder,
featureFlags: FeatureFlags
) {
private val iconManager: StatusBarIconController.IconManager
private val qsCarrierGroupController: QSCarrierGroupController
private var visible = false
var shadeExpanded = false
set(value) {
field = value
updateVisibility()
}
var splitShadeMode = false
set(value) {
field = value
updateVisibility()
}
init {
val batteryIcon: BatteryMeterView = statusBar.findViewById(R.id.batteryRemainingIcon)
// battery settings same as in QS icons
batteryIcon.setIgnoreTunerUpdates(true)
batteryIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
val iconContainer: StatusIconContainer = statusBar.findViewById(R.id.statusIcons)
iconManager = StatusBarIconController.IconManager(iconContainer, featureFlags)
qsCarrierGroupController = qsCarrierGroupControllerBuilder
.setQSCarrierGroup(statusBar.findViewById(R.id.carrier_group))
.build()
}
private fun updateVisibility() {
val shouldBeVisible = shadeExpanded && splitShadeMode
if (visible != shouldBeVisible) {
visible = shouldBeVisible
statusBar.visibility = if (shouldBeVisible) View.VISIBLE else View.GONE
updateListeners(shouldBeVisible)
}
}
private fun updateListeners(visible: Boolean) {
qsCarrierGroupController.setListening(visible)
if (visible) {
statusBarIconController.addIconGroup(iconManager)
} else {
statusBarIconController.removeIconGroup(iconManager)
}
}
}

View File

@@ -1,29 +0,0 @@
package com.android.systemui.statusbar.phone
import android.view.View
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope
import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_STATUS_BAR
import javax.inject.Inject
import javax.inject.Named
@StatusBarScope
class SplitShadeStatusBarController @Inject constructor(
@Named(SPLIT_SHADE_STATUS_BAR) val view: View
) {
var shadeExpanded = false
set(value) {
field = value
updateVisibility()
}
var splitShadeMode = false
set(value) {
field = value
updateVisibility()
}
private fun updateVisibility() {
view.visibility = if (shadeExpanded && splitShadeMode) View.VISIBLE else View.GONE
}
}

View File

@@ -23,7 +23,7 @@ import com.android.systemui.biometrics.AuthRippleController;
import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.NotificationPanelViewController;
import com.android.systemui.statusbar.phone.NotificationShadeWindowView; import com.android.systemui.statusbar.phone.NotificationShadeWindowView;
import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController; import com.android.systemui.statusbar.phone.NotificationShadeWindowViewController;
import com.android.systemui.statusbar.phone.SplitShadeStatusBarController; import com.android.systemui.statusbar.phone.SplitShadeHeaderController;
import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.statusbar.phone.StatusBarWindowController;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
@@ -92,5 +92,5 @@ public interface StatusBarComponent {
* Creates a SplitShadeStatusBarController. * Creates a SplitShadeStatusBarController.
*/ */
@StatusBarScope @StatusBarScope
SplitShadeStatusBarController getSplitShadeStatusBarController(); SplitShadeHeaderController getSplitShadeStatusBarController();
} }

View File

@@ -34,7 +34,7 @@ import dagger.Provides;
@Module @Module
public abstract class StatusBarViewModule { public abstract class StatusBarViewModule {
public static final String SPLIT_SHADE_STATUS_BAR = "split_shade_status_bar"; public static final String SPLIT_SHADE_HEADER = "split_shade_header";
/** */ /** */
@Provides @Provides
@@ -63,11 +63,11 @@ public abstract class StatusBarViewModule {
/** */ /** */
@Provides @Provides
@Named(SPLIT_SHADE_STATUS_BAR) @Named(SPLIT_SHADE_HEADER)
@StatusBarComponent.StatusBarScope @StatusBarComponent.StatusBarScope
public static View getSlitShadeStatusBarView( public static View getSlitShadeStatusBarView(
NotificationShadeWindowView notificationShadeWindowView) { NotificationShadeWindowView notificationShadeWindowView) {
return notificationShadeWindowView.findViewById(R.id.quick_qs_status_icons); return notificationShadeWindowView.findViewById(R.id.split_shade_status_bar);
} }
/** */ /** */

View File

@@ -283,7 +283,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
@Mock @Mock
private SecureSettings mSecureSettings; private SecureSettings mSecureSettings;
@Mock @Mock
private SplitShadeStatusBarController mSplitShadeStatusBarController; private SplitShadeHeaderController mSplitShadeHeaderController;
@Mock @Mock
private ContentResolver mContentResolver; private ContentResolver mContentResolver;
@Mock @Mock
@@ -440,7 +440,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
mQuickAccessWalletController, mQuickAccessWalletController,
new FakeExecutor(new FakeSystemClock()), new FakeExecutor(new FakeSystemClock()),
mSecureSettings, mSecureSettings,
mSplitShadeStatusBarController, mSplitShadeHeaderController,
mUnlockedScreenOffAnimationController, mUnlockedScreenOffAnimationController,
mNotificationRemoteInputManager); mNotificationRemoteInputManager);
mNotificationPanelViewController.initDependencies( mNotificationPanelViewController.initDependencies(