Adding more icons to split shade header

- renaming status bar to header
- creating separate layout for split shade header
- adding date text
- adding system icons (Wi-Fi etc)
- adding carrier info
- adding battery percentage indicator

Bug: 182981830
Test: soon!
Change-Id: Ie995631fbd73477fad0e1273bedd9a4bca506c66
This commit is contained in:
Michal Brzezinski
2021-07-09 14:10:41 +01:00
parent 28110ae6ba
commit c9a98efffb
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:clipChildren="false"
android:clipToPadding="false"
android:minHeight="48dp"
android:minHeight="@dimen/qs_header_row_min_height"
android:clickable="false"
android:focusable="true"
android:theme="@style/Theme.SystemUI.QuickSettings.Header">
@@ -31,7 +31,7 @@
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:minWidth="48dp"
android:minHeight="48dp"
android:minHeight="@dimen/qs_header_row_min_height"
android:gravity="center_vertical|start"
android:paddingStart="@dimen/status_bar_left_clock_starting_padding"
android:paddingEnd="@dimen/status_bar_left_clock_end_padding"
@@ -43,7 +43,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:minHeight="48dp"
android:minHeight="@dimen/qs_header_row_min_height"
android:minWidth="48dp"
android:layout_marginStart="8dp"
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

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

View File

@@ -459,7 +459,8 @@
<dimen name="match_parent">-1px</dimen>
<!-- 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. -->
<dimen name="notification_panel_margin_top">0dp</dimen>
@@ -629,6 +630,7 @@
<dimen name="qs_footer_icon_size">20dp</dimen>
<dimen name="qs_header_top_padding">15dp</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_security_footer_height">88dp</dimen>

View File

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

View File

@@ -334,7 +334,7 @@ public class NotificationPanelViewController extends PanelViewController {
private final int mMaxKeyguardNotifications;
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
private final TapAgainViewController mTapAgainViewController;
private final SplitShadeStatusBarController mSplitShadeStatusBarController;
private final SplitShadeHeaderController mSplitShadeHeaderController;
private boolean mShouldUseSplitNotificationShade;
// Current max allowed keyguard notifications determined by measuring the panel
private int mMaxAllowedKeyguardNotifications;
@@ -723,7 +723,7 @@ public class NotificationPanelViewController extends PanelViewController {
QuickAccessWalletController quickAccessWalletController,
@Main Executor uiExecutor,
SecureSettings secureSettings,
SplitShadeStatusBarController splitShadeStatusBarController,
SplitShadeHeaderController splitShadeHeaderController,
UnlockedScreenOffAnimationController unlockedScreenOffAnimationController,
NotificationRemoteInputManager remoteInputManager) {
super(view, falsingManager, dozeLog, keyguardStateController,
@@ -757,7 +757,7 @@ public class NotificationPanelViewController extends PanelViewController {
mShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(mFeatureFlags, mResources);
mView.setWillNotDraw(!DEBUG);
mSplitShadeStatusBarController = splitShadeStatusBarController;
mSplitShadeHeaderController = splitShadeHeaderController;
mLayoutInflater = layoutInflater;
mFalsingManager = falsingManager;
mFalsingCollector = falsingCollector;
@@ -1027,7 +1027,7 @@ public class NotificationPanelViewController extends PanelViewController {
mQuickQsOffsetHeight = mResources.getDimensionPixelSize(
com.android.internal.R.dimen.quick_qs_offset_height);
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 panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
mShouldUseSplitNotificationShade =
@@ -1039,7 +1039,7 @@ public class NotificationPanelViewController extends PanelViewController {
int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight :
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
ensureAllViewsHaveIds(mNotificationContainerParent);
@@ -4466,7 +4466,7 @@ public class NotificationPanelViewController extends PanelViewController {
maybeAnimateBottomAreaAlpha();
resetHorizontalPanelPosition();
updateQsState();
mSplitShadeStatusBarController.setShadeExpanded(
mSplitShadeHeaderController.setShadeExpanded(
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.NotificationShadeWindowView;
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 java.lang.annotation.Documented;
@@ -92,5 +92,5 @@ public interface StatusBarComponent {
* Creates a SplitShadeStatusBarController.
*/
@StatusBarScope
SplitShadeStatusBarController getSplitShadeStatusBarController();
SplitShadeHeaderController getSplitShadeStatusBarController();
}

View File

@@ -34,7 +34,7 @@ import dagger.Provides;
@Module
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
@@ -63,11 +63,11 @@ public abstract class StatusBarViewModule {
/** */
@Provides
@Named(SPLIT_SHADE_STATUS_BAR)
@Named(SPLIT_SHADE_HEADER)
@StatusBarComponent.StatusBarScope
public static View getSlitShadeStatusBarView(
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
private SecureSettings mSecureSettings;
@Mock
private SplitShadeStatusBarController mSplitShadeStatusBarController;
private SplitShadeHeaderController mSplitShadeHeaderController;
@Mock
private ContentResolver mContentResolver;
@Mock
@@ -440,7 +440,7 @@ public class NotificationPanelViewTest extends SysuiTestCase {
mQuickAccessWalletController,
new FakeExecutor(new FakeSystemClock()),
mSecureSettings,
mSplitShadeStatusBarController,
mSplitShadeHeaderController,
mUnlockedScreenOffAnimationController,
mNotificationRemoteInputManager);
mNotificationPanelViewController.initDependencies(