Merge changes Ifcd1f115,I4988c09c into tm-dev

* changes:
  Renaming SplitShadeHeader to LargeScreenShadeHeader
  Showing wider header/status bar in shade on large screen
This commit is contained in:
TreeHugger Robot
2022-03-23 12:39:17 +00:00
committed by Android (Google) Code Review
36 changed files with 276 additions and 257 deletions

View File

@@ -22,7 +22,6 @@
<!-- Overload default clock widget parameters --> <!-- Overload default clock widget parameters -->
<dimen name="widget_big_font_size">88dp</dimen> <dimen name="widget_big_font_size">88dp</dimen>
<dimen name="qs_header_system_icons_area_height">0dp</dimen>
<dimen name="qs_panel_padding_top">@dimen/qqs_layout_margin_top</dimen> <dimen name="qs_panel_padding_top">@dimen/qqs_layout_margin_top</dimen>
</resources> </resources>

View File

@@ -20,7 +20,7 @@
android:id="@+id/split_shade_status_bar" android:id="@+id/split_shade_status_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="@dimen/split_shade_header_min_height" android:minHeight="@dimen/large_screen_shade_header_min_height"
android:clickable="false" android:clickable="false"
android:focusable="true" android:focusable="true"
android:paddingLeft="@dimen/qs_panel_padding" android:paddingLeft="@dimen/qs_panel_padding"
@@ -61,8 +61,8 @@
<include <include
android:id="@+id/carrier_group" android:id="@+id/carrier_group"
layout="@layout/qs_carrier_group" layout="@layout/qs_carrier_group"
app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" app:layout_constraintHeight_min="@dimen/large_screen_shade_header_min_height"
android:minHeight="@dimen/split_shade_header_min_height" android:minHeight="@dimen/large_screen_shade_header_min_height"
app:layout_constraintWidth_min="48dp" app:layout_constraintWidth_min="48dp"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
@@ -78,7 +78,7 @@
<com.android.systemui.statusbar.phone.StatusIconContainer <com.android.systemui.statusbar.phone.StatusIconContainer
android:id="@+id/statusIcons" android:id="@+id/statusIcons"
app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" app:layout_constraintHeight_min="@dimen/large_screen_shade_header_min_height"
android:paddingEnd="@dimen/signal_cluster_battery_padding" android:paddingEnd="@dimen/signal_cluster_battery_padding"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="48dp" android:layout_height="48dp"
@@ -93,7 +93,7 @@
android:id="@+id/batteryRemainingIcon" android:id="@+id/batteryRemainingIcon"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="48dp" android:layout_height="48dp"
app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" app:layout_constraintHeight_min="@dimen/large_screen_shade_header_min_height"
app:textAppearance="@style/TextAppearance.QS.Status" app:textAppearance="@style/TextAppearance.QS.Status"
app:layout_constraintStart_toEndOf="@id/statusIcons" app:layout_constraintStart_toEndOf="@id/statusIcons"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"

View File

@@ -18,8 +18,8 @@
xmlns:systemui="http://schemas.android.com/apk/res-auto" xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/split_shade_status_bar" android:id="@+id/split_shade_status_bar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/split_shade_header_height" android:layout_height="@dimen/large_screen_shade_header_height"
android:minHeight="@dimen/split_shade_header_min_height" android:minHeight="@dimen/large_screen_shade_header_min_height"
android:clickable="false" android:clickable="false"
android:focusable="true" android:focusable="true"
android:paddingLeft="@dimen/qs_panel_padding" android:paddingLeft="@dimen/qs_panel_padding"
@@ -32,7 +32,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="@dimen/split_shade_header_min_height" android:minHeight="@dimen/large_screen_shade_header_min_height"
android:gravity="start|center_vertical" android:gravity="start|center_vertical"
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"
@@ -69,7 +69,7 @@
android:layout_gravity="end|center_vertical" android:layout_gravity="end|center_vertical"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
android:focusable="false" android:focusable="false"
android:minHeight="@dimen/split_shade_header_min_height" android:minHeight="@dimen/large_screen_shade_header_min_height"
android:minWidth="48dp" /> android:minWidth="48dp" />
<com.android.systemui.statusbar.phone.StatusIconContainer <com.android.systemui.statusbar.phone.StatusIconContainer

View File

@@ -36,7 +36,6 @@
<item name="controls_task_view_width_percentage" translatable="false" format="float" type="dimen">0.45</item> <item name="controls_task_view_width_percentage" translatable="false" format="float" type="dimen">0.45</item>
<dimen name="controls_task_view_right_margin">8dp</dimen> <dimen name="controls_task_view_right_margin">8dp</dimen>
<dimen name="split_shade_header_height">42dp</dimen>
<dimen name="status_bar_header_height_keyguard">42dp</dimen> <dimen name="status_bar_header_height_keyguard">42dp</dimen>
<!-- Distance that the full shade transition takes in order to complete by tapping on a button <!-- Distance that the full shade transition takes in order to complete by tapping on a button

View File

@@ -38,4 +38,6 @@
<!-- Determines whether to allow the nav bar handle to be forced to be opaque. --> <!-- Determines whether to allow the nav bar handle to be forced to be opaque. -->
<bool name="allow_force_nav_bar_handle_opaque">false</bool> <bool name="allow_force_nav_bar_handle_opaque">false</bool>
<bool name="config_use_large_screen_shade_header">true</bool>
</resources> </resources>

View File

@@ -67,4 +67,6 @@
<!-- The width of large/content heavy dialogs (e.g. Internet, Media output, etc) --> <!-- The width of large/content heavy dialogs (e.g. Internet, Media output, etc) -->
<dimen name="large_dialog_width">472dp</dimen> <dimen name="large_dialog_width">472dp</dimen>
<dimen name="large_screen_shade_header_height">42dp</dimen>
</resources> </resources>

View File

@@ -23,7 +23,6 @@
<dimen name="keyguard_split_shade_top_margin">72dp</dimen> <dimen name="keyguard_split_shade_top_margin">72dp</dimen>
<dimen name="split_shade_header_height">56dp</dimen>
<dimen name="status_bar_header_height_keyguard">56dp</dimen> <dimen name="status_bar_header_height_keyguard">56dp</dimen>
<dimen name="qs_media_session_height_expanded">184dp</dimen> <dimen name="qs_media_session_height_expanded">184dp</dimen>

View File

@@ -20,5 +20,7 @@
<dimen name="status_bar_icon_padding">1dp</dimen> <dimen name="status_bar_icon_padding">1dp</dimen>
<dimen name="controls_padding_horizontal">75dp</dimen> <dimen name="controls_padding_horizontal">75dp</dimen>
<dimen name="large_screen_shade_header_height">56dp</dimen>
</resources> </resources>

View File

@@ -556,6 +556,9 @@
<!-- Whether to use the split 2-column notification shade --> <!-- Whether to use the split 2-column notification shade -->
<bool name="config_use_split_notification_shade">false</bool> <bool name="config_use_split_notification_shade">false</bool>
<!-- Whether we use large screen shade header which takes only one row compared to QS header -->
<bool name="config_use_large_screen_shade_header">false</bool>
<!-- Whether notification header should never show section headers. --> <!-- Whether notification header should never show section headers. -->
<bool name="config_notification_never_show_section_headers">false</bool> <bool name="config_notification_never_show_section_headers">false</bool>

View File

@@ -368,10 +368,12 @@
<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_header_height">@*android:dimen/quick_qs_offset_height</dimen> <dimen name="large_screen_shade_header_height">@*android:dimen/quick_qs_offset_height</dimen>
<dimen name="split_shade_header_min_height">@dimen/qs_header_row_min_height</dimen> <dimen name="large_screen_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.
On phones it's always 0dp but it's overridden in Car UI
-->
<dimen name="notification_panel_margin_top">0dp</dimen> <dimen name="notification_panel_margin_top">0dp</dimen>
<!-- The minimum content height for the split shade NSSL. <!-- The minimum content height for the split shade NSSL.

View File

@@ -43,9 +43,9 @@
</Transition> </Transition>
<Transition <Transition
android:id="@+id/split_header_transition" android:id="@+id/large_screen_header_transition"
app:constraintSetStart="@id/split_header_constraint" app:constraintSetStart="@id/large_screen_header_constraint"
app:constraintSetEnd="@id/split_header_constraint"/> app:constraintSetEnd="@id/large_screen_header_constraint"/>
<!-- <!--
Placeholder ConstraintSet. They are populated in the controller for this class. Placeholder ConstraintSet. They are populated in the controller for this class.
@@ -56,6 +56,6 @@
<ConstraintSet android:id="@id/qs_header_constraint"/> <ConstraintSet android:id="@id/qs_header_constraint"/>
<ConstraintSet android:id="@id/split_header_constraint" /> <ConstraintSet android:id="@id/large_screen_header_constraint" />
</MotionScene> </MotionScene>

View File

@@ -18,7 +18,7 @@
<ConstraintSet <ConstraintSet
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/split_header_constraint"> android:id="@+id/large_screen_header_constraint">
<Constraint <Constraint
android:id="@+id/clock"> android:id="@+id/clock">
@@ -58,7 +58,7 @@
<Layout <Layout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" app:layout_constraintHeight_min="@dimen/large_screen_shade_header_min_height"
app:layout_constraintStart_toEndOf="@id/statusIcons" app:layout_constraintStart_toEndOf="@id/statusIcons"
app:layout_constraintEnd_toStartOf="@id/privacy_container" app:layout_constraintEnd_toStartOf="@id/privacy_container"
app:layout_constraintTop_toTopOf="@id/clock" app:layout_constraintTop_toTopOf="@id/clock"

View File

@@ -47,6 +47,7 @@ import android.widget.TextView;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.util.LargeScreenUtils;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@@ -814,7 +815,7 @@ public class AuthBiometricView extends LinearLayout {
} }
private boolean isLargeDisplay() { private boolean isLargeDisplay() {
return com.android.systemui.util.Utils.shouldUseSplitNotificationShade(getResources()); return LargeScreenUtils.shouldUseSplitNotificationShade(getResources());
} }
@Override @Override

View File

@@ -30,7 +30,7 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController
import com.android.systemui.statusbar.notification.stack.MediaContainerView import com.android.systemui.statusbar.notification.stack.MediaContainerView
import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.Utils import com.android.systemui.util.LargeScreenUtils
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
@@ -71,7 +71,7 @@ class KeyguardMediaController @Inject constructor(
} }
private fun updateResources() { private fun updateResources() {
useSplitShade = Utils.shouldUseSplitNotificationShade(context.resources) useSplitShade = LargeScreenUtils.shouldUseSplitNotificationShade(context.resources)
} }
@VisibleForTesting @VisibleForTesting

View File

@@ -104,6 +104,17 @@ fun isMediaNotification(sbn: StatusBarNotification): Boolean {
return sbn.notification.isMediaNotification() return sbn.notification.isMediaNotification()
} }
/**
* Allow recommendations from smartspace to show in media controls.
* Requires [Utils.useQsMediaPlayer] to be enabled.
* On by default, but can be disabled by setting to 0
*/
private fun allowMediaRecommendations(context: Context): Boolean {
val flag = Settings.Secure.getInt(context.contentResolver,
Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 1)
return Utils.useQsMediaPlayer(context) && flag > 0
}
/** /**
* A class that facilitates management and loading of Media Data, ready for binding. * A class that facilitates management and loading of Media Data, ready for binding.
*/ */
@@ -164,7 +175,7 @@ class MediaDataManager(
// There should ONLY be at most one Smartspace media recommendation. // There should ONLY be at most one Smartspace media recommendation.
var smartspaceMediaData: SmartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA var smartspaceMediaData: SmartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA
private var smartspaceSession: SmartspaceSession? = null private var smartspaceSession: SmartspaceSession? = null
private var allowMediaRecommendations = Utils.allowMediaRecommendations(context) private var allowMediaRecommendations = allowMediaRecommendations(context)
/** /**
* Check whether this notification is an RCN * Check whether this notification is an RCN
@@ -272,7 +283,7 @@ class MediaDataManager(
smartspaceSession?.let { it.requestSmartspaceUpdate() } smartspaceSession?.let { it.requestSmartspaceUpdate() }
tunerService.addTunable(object : TunerService.Tunable { tunerService.addTunable(object : TunerService.Tunable {
override fun onTuningChanged(key: String?, newValue: String?) { override fun onTuningChanged(key: String?, newValue: String?) {
allowMediaRecommendations = Utils.allowMediaRecommendations(context) allowMediaRecommendations = allowMediaRecommendations(context)
if (!allowMediaRecommendations) { if (!allowMediaRecommendations) {
dismissSmartspaceRecommendation(key = smartspaceMediaData.targetId, delay = 0L) dismissSmartspaceRecommendation(key = smartspaceMediaData.targetId, delay = 0L)
} }

View File

@@ -43,7 +43,7 @@ import com.android.systemui.statusbar.notification.stack.StackStateAnimator
import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.KeyguardBypassController
import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.Utils import com.android.systemui.util.LargeScreenUtils
import com.android.systemui.util.animation.UniqueObjectHostView import com.android.systemui.util.animation.UniqueObjectHostView
import javax.inject.Inject import javax.inject.Inject
@@ -514,7 +514,7 @@ class MediaHierarchyManager @Inject constructor(
private fun updateConfiguration() { private fun updateConfiguration() {
distanceForFullShadeTransition = context.resources.getDimensionPixelSize( distanceForFullShadeTransition = context.resources.getDimensionPixelSize(
R.dimen.lockscreen_shade_media_transition_distance) R.dimen.lockscreen_shade_media_transition_distance)
inSplitShade = Utils.shouldUseSplitNotificationShade(context.resources) inSplitShade = LargeScreenUtils.shouldUseSplitNotificationShade(context.resources)
} }
/** /**

View File

@@ -29,7 +29,6 @@ import android.widget.FrameLayout;
import com.android.systemui.Dumpable; import com.android.systemui.Dumpable;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.qs.customize.QSCustomizer; import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.util.Utils;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -147,7 +146,7 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
} }
mQSPanelContainer.setPaddingRelative( mQSPanelContainer.setPaddingRelative(
mQSPanelContainer.getPaddingStart(), mQSPanelContainer.getPaddingStart(),
Utils.getQsHeaderSystemIconsAreaHeight(mContext), QSUtils.getQsHeaderSystemIconsAreaHeight(mContext),
mQSPanelContainer.getPaddingEnd(), mQSPanelContainer.getPaddingEnd(),
bottomPadding); bottomPadding);
@@ -175,7 +174,6 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
public void updateExpansion() { public void updateExpansion() {
int height = calculateContainerHeight(); int height = calculateContainerHeight();
int scrollBottom = calculateContainerBottom();
setBottom(getTop() + height); setBottom(getTop() + height);
} }
@@ -187,15 +185,6 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
+ mHeader.getHeight(); + mHeader.getHeight();
} }
int calculateContainerBottom() {
int heightOverride = mHeightOverride != -1 ? mHeightOverride : getMeasuredHeight();
return mQSCustomizer.isCustomizing() ? mQSCustomizer.getHeight()
: Math.round(mQsExpansion
* (heightOverride + mQSPanelContainer.getScrollRange()
- mQSPanelContainer.getScrollY() - mHeader.getHeight()))
+ mHeader.getHeight();
}
public void setExpansion(float expansion) { public void setExpansion(float expansion) {
mQsExpansion = expansion; mQsExpansion = expansion;
mQSPanelContainer.setScrollingEnabled(expansion > 0f); mQSPanelContainer.setScrollingEnabled(expansion > 0f);

View File

@@ -37,7 +37,7 @@ import com.android.systemui.plugins.qs.QSTileView;
import com.android.systemui.qs.customize.QSCustomizerController; import com.android.systemui.qs.customize.QSCustomizerController;
import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.external.CustomTile;
import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.util.Utils; import com.android.systemui.util.LargeScreenUtils;
import com.android.systemui.util.ViewController; import com.android.systemui.util.ViewController;
import com.android.systemui.util.animation.DisappearParameters; import com.android.systemui.util.animation.DisappearParameters;
@@ -88,7 +88,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
@Override @Override
public void onConfigurationChange(Configuration newConfig) { public void onConfigurationChange(Configuration newConfig) {
mShouldUseSplitNotificationShade = mShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(getResources()); LargeScreenUtils.shouldUseSplitNotificationShade(getResources());
onConfigurationChanged(); onConfigurationChanged();
if (newConfig.orientation != mLastOrientation) { if (newConfig.orientation != mLastOrientation) {
mLastOrientation = newConfig.orientation; mLastOrientation = newConfig.orientation;
@@ -133,7 +133,7 @@ public abstract class QSPanelControllerBase<T extends QSPanel> extends ViewContr
mQSLogger = qsLogger; mQSLogger = qsLogger;
mDumpManager = dumpManager; mDumpManager = dumpManager;
mShouldUseSplitNotificationShade = mShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(getResources()); LargeScreenUtils.shouldUseSplitNotificationShade(getResources());
} }
@Override @Override

View File

@@ -0,0 +1,24 @@
package com.android.systemui.qs
import android.content.Context
import com.android.internal.policy.SystemBarUtils
import com.android.systemui.util.LargeScreenUtils.shouldUseLargeScreenShadeHeader
object QSUtils {
/**
* Gets the [R.dimen.qs_header_system_icons_area_height] unless we use large screen header.
*
* It's the same as [com.android.internal.R.dimen.quick_qs_offset_height] except for
* sw600dp-land.
*/
@JvmStatic
fun getQsHeaderSystemIconsAreaHeight(context: Context): Int {
return if (shouldUseLargeScreenShadeHeader(context.resources)) {
// value should be 0 when using large screen shade header because it's not expandable
0
} else {
SystemBarUtils.getQuickQsOffsetHeight(context)
}
}
}

View File

@@ -44,6 +44,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconMa
import com.android.systemui.statusbar.phone.StatusIconContainer; import com.android.systemui.statusbar.phone.StatusIconContainer;
import com.android.systemui.statusbar.policy.Clock; import com.android.systemui.statusbar.policy.Clock;
import com.android.systemui.statusbar.policy.VariableDateView; import com.android.systemui.statusbar.policy.VariableDateView;
import com.android.systemui.util.LargeScreenUtils;
import java.util.List; import java.util.List;
@@ -242,11 +243,10 @@ public class QuickStatusBarHeader extends FrameLayout {
void updateResources() { void updateResources() {
Resources resources = mContext.getResources(); Resources resources = mContext.getResources();
// status bar is already displayed out of QS in split shade boolean largeScreenHeaderActive =
boolean shouldUseSplitShade = LargeScreenUtils.shouldUseLargeScreenShadeHeader(resources);
resources.getBoolean(R.bool.config_use_split_notification_shade);
boolean gone = shouldUseSplitShade || mUseCombinedQSHeader || mQsDisabled; boolean gone = largeScreenHeaderActive || mUseCombinedQSHeader || mQsDisabled;
mStatusIconsView.setVisibility(gone ? View.GONE : View.VISIBLE); mStatusIconsView.setVisibility(gone ? View.GONE : View.VISIBLE);
mDatePrivacyView.setVisibility(gone ? View.GONE : View.VISIBLE); mDatePrivacyView.setVisibility(gone ? View.GONE : View.VISIBLE);
@@ -287,7 +287,7 @@ public class QuickStatusBarHeader extends FrameLayout {
} }
MarginLayoutParams qqsLP = (MarginLayoutParams) mHeaderQsPanel.getLayoutParams(); MarginLayoutParams qqsLP = (MarginLayoutParams) mHeaderQsPanel.getLayoutParams();
qqsLP.topMargin = shouldUseSplitShade || !mUseCombinedQSHeader ? mContext.getResources() qqsLP.topMargin = largeScreenHeaderActive || !mUseCombinedQSHeader ? mContext.getResources()
.getDimensionPixelSize(R.dimen.qqs_layout_margin_top) : qsOffsetHeight; .getDimensionPixelSize(R.dimen.qqs_layout_margin_top) : qsOffsetHeight;
mHeaderQsPanel.setLayoutParams(qqsLP); mHeaderQsPanel.setLayoutParams(qqsLP);

View File

@@ -36,8 +36,8 @@ import com.android.systemui.R;
import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.qs.QSContainerController; import com.android.systemui.plugins.qs.QSContainerController;
import com.android.systemui.qs.QSDetailClipper; import com.android.systemui.qs.QSDetailClipper;
import com.android.systemui.qs.QSUtils;
import com.android.systemui.statusbar.phone.LightBarController; import com.android.systemui.statusbar.phone.LightBarController;
import com.android.systemui.util.Utils;
/** /**
* Allows full-screen customization of QS, through show() and hide(). * Allows full-screen customization of QS, through show() and hide().
@@ -86,7 +86,7 @@ public class QSCustomizer extends LinearLayout {
void updateResources() { void updateResources() {
LayoutParams lp = (LayoutParams) mTransparentView.getLayoutParams(); LayoutParams lp = (LayoutParams) mTransparentView.getLayoutParams();
lp.height = Utils.getQsHeaderSystemIconsAreaHeight(mContext); lp.height = QSUtils.getQsHeaderSystemIconsAreaHeight(mContext);
mTransparentView.setLayoutParams(lp); mTransparentView.setLayoutParams(lp);
} }

View File

@@ -40,7 +40,7 @@ import com.android.systemui.statusbar.phone.LSShadeTransitionLogger
import com.android.systemui.statusbar.phone.NotificationPanelViewController import com.android.systemui.statusbar.phone.NotificationPanelViewController
import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.ScrimController
import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.Utils import com.android.systemui.util.LargeScreenUtils
import java.io.FileDescriptor import java.io.FileDescriptor
import java.io.PrintWriter import java.io.PrintWriter
import javax.inject.Inject import javax.inject.Inject
@@ -251,7 +251,7 @@ class LockscreenShadeTransitionController @Inject constructor(
R.dimen.lockscreen_shade_udfps_keyguard_transition_distance) R.dimen.lockscreen_shade_udfps_keyguard_transition_distance)
statusBarTransitionDistance = context.resources.getDimensionPixelSize( statusBarTransitionDistance = context.resources.getDimensionPixelSize(
R.dimen.lockscreen_shade_status_bar_transition_distance) R.dimen.lockscreen_shade_status_bar_transition_distance)
useSplitShade = Utils.shouldUseSplitNotificationShade(context.resources) useSplitShade = LargeScreenUtils.shouldUseSplitNotificationShade(context.resources)
} }
fun setStackScroller(nsslController: NotificationStackScrollLayoutController) { fun setStackScroller(nsslController: NotificationStackScrollLayoutController) {

View File

@@ -19,7 +19,6 @@ package com.android.systemui.statusbar.notification.stack;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING; import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_SCROLL_FLING;
import static com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt.BUCKET_SILENT; import static com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt.BUCKET_SILENT;
import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE; import static com.android.systemui.statusbar.notification.stack.StackStateAnimator.ANIMATION_DURATION_SWIPE;
import static com.android.systemui.util.Utils.shouldUseSplitNotificationShade;
import static java.lang.annotation.RetentionPolicy.SOURCE; import static java.lang.annotation.RetentionPolicy.SOURCE;
@@ -110,6 +109,7 @@ import com.android.systemui.statusbar.policy.HeadsUpUtil;
import com.android.systemui.statusbar.policy.ScrollAdapter; import com.android.systemui.statusbar.policy.ScrollAdapter;
import com.android.systemui.util.Assert; import com.android.systemui.util.Assert;
import com.android.systemui.util.DumpUtilsKt; import com.android.systemui.util.DumpUtilsKt;
import com.android.systemui.util.LargeScreenUtils;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -5540,7 +5540,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
} }
private void updateSplitNotificationShade() { private void updateSplitNotificationShade() {
boolean split = shouldUseSplitNotificationShade(getResources()); boolean split = LargeScreenUtils.shouldUseSplitNotificationShade(getResources());
if (split != mShouldUseSplitNotificationShade) { if (split != mShouldUseSplitNotificationShade) {
mShouldUseSplitNotificationShade = split; mShouldUseSplitNotificationShade = split;
updateDismissBehavior(); updateDismissBehavior();

View File

@@ -148,7 +148,7 @@ public class KeyguardClockPositionAlgorithm {
mStatusViewBottomMargin = res.getDimensionPixelSize( mStatusViewBottomMargin = res.getDimensionPixelSize(
R.dimen.keyguard_status_view_bottom_margin); R.dimen.keyguard_status_view_bottom_margin);
mSplitShadeTopNotificationsMargin = mSplitShadeTopNotificationsMargin =
res.getDimensionPixelSize(R.dimen.split_shade_header_height); res.getDimensionPixelSize(R.dimen.large_screen_shade_header_height);
mSplitShadeTargetTopMargin = mSplitShadeTargetTopMargin =
res.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin); res.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin);

View File

@@ -31,35 +31,35 @@ import com.android.systemui.qs.ChipVisibilityListener
import com.android.systemui.qs.HeaderPrivacyIconsController import com.android.systemui.qs.HeaderPrivacyIconsController
import com.android.systemui.qs.carrier.QSCarrierGroupController import com.android.systemui.qs.carrier.QSCarrierGroupController
import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent.CentralSurfacesScope
import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_BATTERY_CONTROLLER import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_BATTERY_CONTROLLER
import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.SPLIT_SHADE_HEADER import com.android.systemui.statusbar.phone.dagger.StatusBarViewModule.LARGE_SCREEN_SHADE_HEADER
import java.io.FileDescriptor import java.io.FileDescriptor
import java.io.PrintWriter import java.io.PrintWriter
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Named import javax.inject.Named
@CentralSurfacesScope @CentralSurfacesScope
class SplitShadeHeaderController @Inject constructor( class LargeScreenShadeHeaderController @Inject constructor(
@Named(SPLIT_SHADE_HEADER) private val statusBar: View, @Named(LARGE_SCREEN_SHADE_HEADER) private val header: View,
private val statusBarIconController: StatusBarIconController, private val statusBarIconController: StatusBarIconController,
private val privacyIconsController: HeaderPrivacyIconsController, private val privacyIconsController: HeaderPrivacyIconsController,
qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder, qsCarrierGroupControllerBuilder: QSCarrierGroupController.Builder,
featureFlags: FeatureFlags, featureFlags: FeatureFlags,
@Named(SPLIT_SHADE_BATTERY_CONTROLLER) batteryMeterViewController: BatteryMeterViewController, @Named(LARGE_SCREEN_BATTERY_CONTROLLER) batteryMeterViewController: BatteryMeterViewController,
dumpManager: DumpManager dumpManager: DumpManager
) : Dumpable { ) : Dumpable {
companion object { companion object {
private val HEADER_TRANSITION_ID = R.id.header_transition private val HEADER_TRANSITION_ID = R.id.header_transition
private val SPLIT_HEADER_TRANSITION_ID = R.id.split_header_transition private val LARGE_SCREEN_HEADER_TRANSITION_ID = R.id.large_screen_header_transition
private val QQS_HEADER_CONSTRAINT = R.id.qqs_header_constraint private val QQS_HEADER_CONSTRAINT = R.id.qqs_header_constraint
private val QS_HEADER_CONSTRAINT = R.id.qs_header_constraint private val QS_HEADER_CONSTRAINT = R.id.qs_header_constraint
private val SPLIT_HEADER_CONSTRAINT = R.id.split_header_constraint private val LARGE_SCREEN_HEADER_CONSTRAINT = R.id.large_screen_header_constraint
private fun Int.stateToString() = when (this) { private fun Int.stateToString() = when (this) {
QQS_HEADER_CONSTRAINT -> "QQS Header" QQS_HEADER_CONSTRAINT -> "QQS Header"
QS_HEADER_CONSTRAINT -> "QS Header" QS_HEADER_CONSTRAINT -> "QS Header"
SPLIT_HEADER_CONSTRAINT -> "Split Header" LARGE_SCREEN_HEADER_CONSTRAINT -> "Large Screen Header"
else -> "Unknown state" else -> "Unknown state"
} }
} }
@@ -87,19 +87,19 @@ class SplitShadeHeaderController @Inject constructor(
onShadeExpandedChanged() onShadeExpandedChanged()
} }
var splitShadeMode = false var active = false
set(value) { set(value) {
if (field == value) { if (field == value) {
return return
} }
field = value field = value
onSplitShadeModeChanged() onHeaderStateChanged()
} }
var shadeExpandedFraction = -1f var shadeExpandedFraction = -1f
set(value) { set(value) {
if (visible && field != value) { if (visible && field != value) {
statusBar.alpha = ShadeInterpolation.getContentAlpha(value) header.alpha = ShadeInterpolation.getContentAlpha(value)
field = value field = value
} }
} }
@@ -123,53 +123,53 @@ class SplitShadeHeaderController @Inject constructor(
private val chipVisibilityListener: ChipVisibilityListener = object : ChipVisibilityListener { private val chipVisibilityListener: ChipVisibilityListener = object : ChipVisibilityListener {
override fun onChipVisibilityRefreshed(visible: Boolean) { override fun onChipVisibilityRefreshed(visible: Boolean) {
if (statusBar is MotionLayout) { if (header is MotionLayout) {
val state = statusBar.getConstraintSet(QQS_HEADER_CONSTRAINT).apply { val state = header.getConstraintSet(QQS_HEADER_CONSTRAINT).apply {
setAlpha(R.id.statusIcons, if (visible) 0f else 1f) setAlpha(R.id.statusIcons, if (visible) 0f else 1f)
setAlpha(R.id.batteryRemainingIcon, if (visible) 0f else 1f) setAlpha(R.id.batteryRemainingIcon, if (visible) 0f else 1f)
} }
statusBar.updateState(QQS_HEADER_CONSTRAINT, state) header.updateState(QQS_HEADER_CONSTRAINT, state)
} }
} }
} }
init { init {
if (statusBar is MotionLayout) { if (header is MotionLayout) {
val context = statusBar.context val context = header.context
val resources = statusBar.resources val resources = header.resources
statusBar.getConstraintSet(QQS_HEADER_CONSTRAINT) header.getConstraintSet(QQS_HEADER_CONSTRAINT)
.load(context, resources.getXml(R.xml.qqs_header)) .load(context, resources.getXml(R.xml.qqs_header))
statusBar.getConstraintSet(QS_HEADER_CONSTRAINT) header.getConstraintSet(QS_HEADER_CONSTRAINT)
.load(context, resources.getXml(R.xml.qs_header)) .load(context, resources.getXml(R.xml.qs_header))
statusBar.getConstraintSet(SPLIT_HEADER_CONSTRAINT) header.getConstraintSet(LARGE_SCREEN_HEADER_CONSTRAINT)
.load(context, resources.getXml(R.xml.split_header)) .load(context, resources.getXml(R.xml.large_screen_shade_header))
privacyIconsController.chipVisibilityListener = chipVisibilityListener privacyIconsController.chipVisibilityListener = chipVisibilityListener
} }
} }
init { init {
batteryMeterViewController.init() batteryMeterViewController.init()
val batteryIcon: BatteryMeterView = statusBar.findViewById(R.id.batteryRemainingIcon) val batteryIcon: BatteryMeterView = header.findViewById(R.id.batteryRemainingIcon)
// battery settings same as in QS icons // battery settings same as in QS icons
batteryMeterViewController.ignoreTunerUpdates() batteryMeterViewController.ignoreTunerUpdates()
batteryIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE) batteryIcon.setPercentShowMode(BatteryMeterView.MODE_ESTIMATE)
iconContainer = statusBar.findViewById(R.id.statusIcons) iconContainer = header.findViewById(R.id.statusIcons)
iconManager = StatusBarIconController.TintedIconManager(iconContainer, featureFlags) iconManager = StatusBarIconController.TintedIconManager(iconContainer, featureFlags)
iconManager.setTint(Utils.getColorAttrDefaultColor(statusBar.context, iconManager.setTint(Utils.getColorAttrDefaultColor(header.context,
android.R.attr.textColorPrimary)) android.R.attr.textColorPrimary))
carrierIconSlots = if (featureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)) { carrierIconSlots = if (featureFlags.isEnabled(Flags.COMBINED_STATUS_BAR_SIGNAL_ICONS)) {
listOf( listOf(
statusBar.context.getString(com.android.internal.R.string.status_bar_no_calling), header.context.getString(com.android.internal.R.string.status_bar_no_calling),
statusBar.context.getString(com.android.internal.R.string.status_bar_call_strength) header.context.getString(com.android.internal.R.string.status_bar_call_strength)
) )
} else { } else {
listOf(statusBar.context.getString(com.android.internal.R.string.status_bar_mobile)) listOf(header.context.getString(com.android.internal.R.string.status_bar_mobile))
} }
qsCarrierGroupController = qsCarrierGroupControllerBuilder qsCarrierGroupController = qsCarrierGroupControllerBuilder
.setQSCarrierGroup(statusBar.findViewById(R.id.carrier_group)) .setQSCarrierGroup(header.findViewById(R.id.carrier_group))
.build() .build()
dumpManager.registerDumpable(this) dumpManager.registerDumpable(this)
@@ -179,8 +179,8 @@ class SplitShadeHeaderController @Inject constructor(
} }
private fun updateScrollY() { private fun updateScrollY() {
if (!splitShadeMode && combinedHeaders) { if (!active && combinedHeaders) {
statusBar.scrollY = qsScrollY header.scrollY = qsScrollY
} }
} }
@@ -194,8 +194,8 @@ class SplitShadeHeaderController @Inject constructor(
updatePosition() updatePosition()
} }
private fun onSplitShadeModeChanged() { private fun onHeaderStateChanged() {
if (splitShadeMode || combinedHeaders) { if (active || combinedHeaders) {
privacyIconsController.onParentVisible() privacyIconsController.onParentVisible()
} else { } else {
privacyIconsController.onParentInvisible() privacyIconsController.onParentInvisible()
@@ -205,15 +205,15 @@ class SplitShadeHeaderController @Inject constructor(
} }
private fun updateVisibility() { private fun updateVisibility() {
val visibility = if (!splitShadeMode && !combinedHeaders) { val visibility = if (!active && !combinedHeaders) {
View.GONE View.GONE
} else if (shadeExpanded) { } else if (shadeExpanded) {
View.VISIBLE View.VISIBLE
} else { } else {
View.INVISIBLE View.INVISIBLE
} }
if (statusBar.visibility != visibility) { if (header.visibility != visibility) {
statusBar.visibility = visibility header.visibility = visibility
visible = visibility == View.VISIBLE visible = visibility == View.VISIBLE
} }
} }
@@ -222,20 +222,20 @@ class SplitShadeHeaderController @Inject constructor(
if (!combinedHeaders) { if (!combinedHeaders) {
return return
} }
statusBar as MotionLayout header as MotionLayout
if (splitShadeMode) { if (active) {
statusBar.setTransition(SPLIT_HEADER_TRANSITION_ID) header.setTransition(LARGE_SCREEN_HEADER_TRANSITION_ID)
} else { } else {
statusBar.setTransition(HEADER_TRANSITION_ID) header.setTransition(HEADER_TRANSITION_ID)
statusBar.transitionToStart() header.transitionToStart()
updatePosition() updatePosition()
updateScrollY() updateScrollY()
} }
} }
private fun updatePosition() { private fun updatePosition() {
if (statusBar is MotionLayout && !splitShadeMode && visible) { if (header is MotionLayout && !active && visible) {
statusBar.setProgress(qsExpandedFraction) header.setProgress(qsExpandedFraction)
} }
} }
@@ -263,12 +263,12 @@ class SplitShadeHeaderController @Inject constructor(
pw.println("visible: $visible") pw.println("visible: $visible")
pw.println("shadeExpanded: $shadeExpanded") pw.println("shadeExpanded: $shadeExpanded")
pw.println("shadeExpandedFraction: $shadeExpandedFraction") pw.println("shadeExpandedFraction: $shadeExpandedFraction")
pw.println("splitShadeMode: $splitShadeMode") pw.println("active: $active")
pw.println("qsExpandedFraction: $qsExpandedFraction") pw.println("qsExpandedFraction: $qsExpandedFraction")
pw.println("qsScrollY: $qsScrollY") pw.println("qsScrollY: $qsScrollY")
if (combinedHeaders) { if (combinedHeaders) {
statusBar as MotionLayout header as MotionLayout
pw.println("currentState: ${statusBar.currentState.stateToString()}") pw.println("currentState: ${header.currentState.stateToString()}")
} }
} }
} }

View File

@@ -187,6 +187,7 @@ import com.android.systemui.statusbar.policy.KeyguardUserSwitcherView;
import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener;
import com.android.systemui.statusbar.window.StatusBarWindowStateController; import com.android.systemui.statusbar.window.StatusBarWindowStateController;
import com.android.systemui.unfold.SysUIUnfoldComponent; import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.util.LargeScreenUtils;
import com.android.systemui.util.ListenerSet; import com.android.systemui.util.ListenerSet;
import com.android.systemui.util.Utils; import com.android.systemui.util.Utils;
import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.settings.SecureSettings;
@@ -311,7 +312,7 @@ public class NotificationPanelViewController extends PanelViewController {
private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; private final LockscreenShadeTransitionController mLockscreenShadeTransitionController;
private final TapAgainViewController mTapAgainViewController; private final TapAgainViewController mTapAgainViewController;
private final SplitShadeHeaderController mSplitShadeHeaderController; private final LargeScreenShadeHeaderController mLargeScreenShadeHeaderController;
private final RecordingController mRecordingController; private final RecordingController mRecordingController;
private final PanelEventsEmitter mPanelEventsEmitter; private final PanelEventsEmitter mPanelEventsEmitter;
private boolean mShouldUseSplitNotificationShade; private boolean mShouldUseSplitNotificationShade;
@@ -336,7 +337,7 @@ public class NotificationPanelViewController extends PanelViewController {
private NotificationsQuickSettingsContainer mNotificationContainerParent; private NotificationsQuickSettingsContainer mNotificationContainerParent;
private NotificationsQSContainerController mNotificationsQSContainerController; private NotificationsQSContainerController mNotificationsQSContainerController;
private boolean mAnimateNextPositionUpdate; private boolean mAnimateNextPositionUpdate;
private float mQuickQsOffsetHeight; private float mQuickQsHeaderHeight;
private ScreenOffAnimationController mScreenOffAnimationController; private ScreenOffAnimationController mScreenOffAnimationController;
private int mTrackingPointer; private int mTrackingPointer;
@@ -387,7 +388,7 @@ public class NotificationPanelViewController extends PanelViewController {
private float mDownY; private float mDownY;
private int mDisplayTopInset = 0; // in pixels private int mDisplayTopInset = 0; // in pixels
private int mDisplayRightInset = 0; // in pixels private int mDisplayRightInset = 0; // in pixels
private int mSplitShadeStatusBarHeight; private int mLargeScreenShadeHeaderHeight;
private int mSplitShadeNotificationsScrimMarginBottom; private int mSplitShadeNotificationsScrimMarginBottom;
private final KeyguardClockPositionAlgorithm private final KeyguardClockPositionAlgorithm
@@ -733,7 +734,7 @@ public class NotificationPanelViewController extends PanelViewController {
RecordingController recordingController, RecordingController recordingController,
@Main Executor uiExecutor, @Main Executor uiExecutor,
SecureSettings secureSettings, SecureSettings secureSettings,
SplitShadeHeaderController splitShadeHeaderController, LargeScreenShadeHeaderController largeScreenShadeHeaderController,
ScreenOffAnimationController screenOffAnimationController, ScreenOffAnimationController screenOffAnimationController,
LockscreenGestureLogger lockscreenGestureLogger, LockscreenGestureLogger lockscreenGestureLogger,
PanelExpansionStateManager panelExpansionStateManager, PanelExpansionStateManager panelExpansionStateManager,
@@ -791,9 +792,9 @@ public class NotificationPanelViewController extends PanelViewController {
mFragmentService = fragmentService; mFragmentService = fragmentService;
mSettingsChangeObserver = new SettingsChangeObserver(handler); mSettingsChangeObserver = new SettingsChangeObserver(handler);
mShouldUseSplitNotificationShade = mShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(mResources); LargeScreenUtils.shouldUseSplitNotificationShade(mResources);
mView.setWillNotDraw(!DEBUG); mView.setWillNotDraw(!DEBUG);
mSplitShadeHeaderController = splitShadeHeaderController; mLargeScreenShadeHeaderController = largeScreenShadeHeaderController;
mLayoutInflater = layoutInflater; mLayoutInflater = layoutInflater;
mFeatureFlags = featureFlags; mFeatureFlags = featureFlags;
mFalsingManager = falsingManager; mFalsingManager = falsingManager;
@@ -1071,24 +1072,28 @@ public class NotificationPanelViewController extends PanelViewController {
} }
public void updateResources() { public void updateResources() {
mQuickQsOffsetHeight = SystemBarUtils.getQuickQsOffsetHeight(mView.getContext());
mSplitShadeNotificationsScrimMarginBottom = mSplitShadeNotificationsScrimMarginBottom =
mResources.getDimensionPixelSize( mResources.getDimensionPixelSize(
R.dimen.split_shade_notifications_scrim_margin_bottom); R.dimen.split_shade_notifications_scrim_margin_bottom);
final boolean newShouldUseSplitNotificationShade = final boolean newShouldUseSplitNotificationShade =
Utils.shouldUseSplitNotificationShade(mResources); LargeScreenUtils.shouldUseSplitNotificationShade(mResources);
final boolean splitNotificationShadeChanged = final boolean splitNotificationShadeChanged =
mShouldUseSplitNotificationShade != newShouldUseSplitNotificationShade; mShouldUseSplitNotificationShade != newShouldUseSplitNotificationShade;
mShouldUseSplitNotificationShade = newShouldUseSplitNotificationShade; mShouldUseSplitNotificationShade = newShouldUseSplitNotificationShade;
boolean useLargeScreenShadeHeader =
LargeScreenUtils.shouldUseLargeScreenShadeHeader(mView.getResources());
if (mQs != null) { if (mQs != null) {
mQs.setInSplitShade(mShouldUseSplitNotificationShade); mQs.setInSplitShade(mShouldUseSplitNotificationShade);
} }
mSplitShadeStatusBarHeight = Utils.getSplitShadeStatusBarHeight(mView.getContext()); mLargeScreenShadeHeaderHeight =
int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight : mResources.getDimensionPixelSize(R.dimen.large_screen_shade_header_height);
mQuickQsHeaderHeight = useLargeScreenShadeHeader ? mLargeScreenShadeHeaderHeight :
SystemBarUtils.getQuickQsOffsetHeight(mView.getContext());
int topMargin = useLargeScreenShadeHeader ? mLargeScreenShadeHeaderHeight :
mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top); mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top);
mSplitShadeHeaderController.setSplitShadeMode(mShouldUseSplitNotificationShade); mLargeScreenShadeHeaderController.setActive(useLargeScreenShadeHeader);
mAmbientState.setStackTopMargin(topMargin); mAmbientState.setStackTopMargin(topMargin);
mNotificationsQSContainerController.updateResources(); mNotificationsQSContainerController.updateResources();
@@ -2268,9 +2273,9 @@ public class NotificationPanelViewController extends PanelViewController {
float shadeExpandedFraction = mTransitioningToFullShadeProgress > 0 float shadeExpandedFraction = mTransitioningToFullShadeProgress > 0
? mLockscreenShadeTransitionController.getQSDragProgress() ? mLockscreenShadeTransitionController.getQSDragProgress()
: getExpandedFraction(); : getExpandedFraction();
mSplitShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction); mLargeScreenShadeHeaderController.setShadeExpandedFraction(shadeExpandedFraction);
mSplitShadeHeaderController.setQsExpandedFraction(qsExpansionFraction); mLargeScreenShadeHeaderController.setQsExpandedFraction(qsExpansionFraction);
mSplitShadeHeaderController.setShadeExpanded(mQsVisible); mLargeScreenShadeHeaderController.setShadeExpanded(mQsVisible);
} }
private void onStackYChanged(boolean shouldAnimate) { private void onStackYChanged(boolean shouldAnimate) {
@@ -2289,7 +2294,7 @@ public class NotificationPanelViewController extends PanelViewController {
} }
private void updateQSExpansionEnabledAmbient() { private void updateQSExpansionEnabledAmbient() {
final float scrollRangeToTop = mAmbientState.getTopPadding() - mQuickQsOffsetHeight; final float scrollRangeToTop = mAmbientState.getTopPadding() - mQuickQsHeaderHeight;
mQsExpansionEnabledAmbient = mShouldUseSplitNotificationShade mQsExpansionEnabledAmbient = mShouldUseSplitNotificationShade
|| (mAmbientState.getScrollY() <= scrollRangeToTop); || (mAmbientState.getScrollY() <= scrollRangeToTop);
setQsExpansionEnabled(); setQsExpansionEnabled();
@@ -2315,7 +2320,7 @@ public class NotificationPanelViewController extends PanelViewController {
private int calculateTopQsClippingBound(int qsPanelBottomY) { private int calculateTopQsClippingBound(int qsPanelBottomY) {
int top; int top;
if (mShouldUseSplitNotificationShade) { if (mShouldUseSplitNotificationShade) {
top = Math.min(qsPanelBottomY, mSplitShadeStatusBarHeight); top = Math.min(qsPanelBottomY, mLargeScreenShadeHeaderHeight);
} else { } else {
if (mTransitioningToFullShadeProgress > 0.0f) { if (mTransitioningToFullShadeProgress > 0.0f) {
// If we're transitioning, let's use the actual value. The else case // If we're transitioning, let's use the actual value. The else case
@@ -2452,8 +2457,8 @@ public class NotificationPanelViewController extends PanelViewController {
mQsTranslationForFullShadeTransition = qsTranslation; mQsTranslationForFullShadeTransition = qsTranslation;
updateQsFrameTranslation(); updateQsFrameTranslation();
float currentTranslation = mQsFrame.getTranslationY(); float currentTranslation = mQsFrame.getTranslationY();
mQsClipTop = (int) (top - currentTranslation); mQsClipTop = (int) (top - currentTranslation - mQsFrame.getTop());
mQsClipBottom = (int) (bottom - currentTranslation); mQsClipBottom = (int) (bottom - currentTranslation - mQsFrame.getTop());
mQsVisible = qsVisible; mQsVisible = qsVisible;
mQs.setFancyClipping( mQs.setFancyClipping(
mQsClipTop, mQsClipTop,
@@ -2497,8 +2502,11 @@ public class NotificationPanelViewController extends PanelViewController {
private float getQSEdgePosition() { private float getQSEdgePosition() {
// TODO: replace StackY with unified calculation // TODO: replace StackY with unified calculation
return Math.max(mQuickQsOffsetHeight * mAmbientState.getExpansionFraction(), return Math.max(mQuickQsHeaderHeight * mAmbientState.getExpansionFraction(),
mAmbientState.getStackY() - mAmbientState.getScrollY()); mAmbientState.getStackY()
// need to adjust for extra margin introduced by large screen shade header
+ mAmbientState.getStackTopMargin() * mAmbientState.getExpansionFraction()
- mAmbientState.getScrollY());
} }
private int calculateQsBottomPosition(float qsExpansionFraction) { private int calculateQsBottomPosition(float qsExpansionFraction) {
@@ -3530,7 +3538,7 @@ public class NotificationPanelViewController extends PanelViewController {
public final QS.ScrollListener mScrollListener = new QS.ScrollListener() { public final QS.ScrollListener mScrollListener = new QS.ScrollListener() {
@Override @Override
public void onQsPanelScrollChanged(int scrollY) { public void onQsPanelScrollChanged(int scrollY) {
mSplitShadeHeaderController.setQsScrollY(scrollY); mLargeScreenShadeHeaderController.setQsScrollY(scrollY);
if (scrollY > 0 && !mQsFullyExpanded) { if (scrollY > 0 && !mQsFullyExpanded) {
if (DEBUG) Log.d(TAG, "Scrolling while not expanded. Forcing expand"); if (DEBUG) Log.d(TAG, "Scrolling while not expanded. Forcing expand");
// If we are scrolling QS, we should be fully expanded. // If we are scrolling QS, we should be fully expanded.

View File

@@ -21,7 +21,7 @@ import com.android.systemui.plugins.qs.QSContainerController
import com.android.systemui.recents.OverviewProxyService import com.android.systemui.recents.OverviewProxyService
import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener
import com.android.systemui.shared.system.QuickStepContract import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.util.Utils import com.android.systemui.util.LargeScreenUtils
import com.android.systemui.util.ViewController import com.android.systemui.util.ViewController
import com.android.systemui.util.concurrency.DelayableExecutor import com.android.systemui.util.concurrency.DelayableExecutor
import java.util.function.Consumer import java.util.function.Consumer
@@ -50,7 +50,8 @@ class NotificationsQSContainerController @Inject constructor(
private var isQSCustomizing = false private var isQSCustomizing = false
private var isQSCustomizerAnimating = false private var isQSCustomizerAnimating = false
private var splitShadeStatusBarHeight = 0 private var largeScreenShadeHeaderHeight = 0
private var largeScreenShadeHeaderActive = false
private var notificationsBottomMargin = 0 private var notificationsBottomMargin = 0
private var scrimShadeBottomMargin = 0 private var scrimShadeBottomMargin = 0
private var bottomStableInsets = 0 private var bottomStableInsets = 0
@@ -115,16 +116,18 @@ class NotificationsQSContainerController @Inject constructor(
} }
fun updateResources() { fun updateResources() {
val newSplitShadeEnabled = Utils.shouldUseSplitNotificationShade(resources) val newSplitShadeEnabled = LargeScreenUtils.shouldUseSplitNotificationShade(resources)
val splitShadeEnabledChanged = newSplitShadeEnabled != splitShadeEnabled val splitShadeEnabledChanged = newSplitShadeEnabled != splitShadeEnabled
splitShadeEnabled = newSplitShadeEnabled splitShadeEnabled = newSplitShadeEnabled
largeScreenShadeHeaderActive = LargeScreenUtils.shouldUseLargeScreenShadeHeader(resources)
notificationsBottomMargin = resources.getDimensionPixelSize( notificationsBottomMargin = resources.getDimensionPixelSize(
R.dimen.notification_panel_margin_bottom) R.dimen.notification_panel_margin_bottom)
splitShadeStatusBarHeight = Utils.getSplitShadeStatusBarHeight(context) largeScreenShadeHeaderHeight =
resources.getDimensionPixelSize(R.dimen.large_screen_shade_header_height)
panelMarginHorizontal = resources.getDimensionPixelSize( panelMarginHorizontal = resources.getDimensionPixelSize(
R.dimen.notification_panel_margin_horizontal) R.dimen.notification_panel_margin_horizontal)
topMargin = if (splitShadeEnabled) { topMargin = if (largeScreenShadeHeaderActive) {
splitShadeStatusBarHeight largeScreenShadeHeaderHeight
} else { } else {
resources.getDimensionPixelSize(R.dimen.notification_panel_margin_top) resources.getDimensionPixelSize(R.dimen.notification_panel_margin_top)
} }
@@ -229,13 +232,13 @@ class NotificationsQSContainerController @Inject constructor(
setKeyguardStatusViewConstraints(constraintSet) setKeyguardStatusViewConstraints(constraintSet)
setQsConstraints(constraintSet) setQsConstraints(constraintSet)
setNotificationsConstraints(constraintSet) setNotificationsConstraints(constraintSet)
setSplitShadeStatusBarConstraints(constraintSet) setLargeScreenShadeHeaderConstraints(constraintSet)
mView.applyConstraints(constraintSet) mView.applyConstraints(constraintSet)
} }
private fun setSplitShadeStatusBarConstraints(constraintSet: ConstraintSet) { private fun setLargeScreenShadeHeaderConstraints(constraintSet: ConstraintSet) {
if (splitShadeEnabled) { if (largeScreenShadeHeaderActive) {
constraintSet.constrainHeight(R.id.split_shade_status_bar, splitShadeStatusBarHeight) constraintSet.constrainHeight(R.id.split_shade_status_bar, largeScreenShadeHeaderHeight)
} else { } else {
if (useCombinedQSHeaders) { if (useCombinedQSHeaders) {
constraintSet.constrainHeight(R.id.split_shade_status_bar, WRAP_CONTENT) constraintSet.constrainHeight(R.id.split_shade_status_bar, WRAP_CONTENT)

View File

@@ -31,10 +31,10 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutListContainerModule; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutListContainerModule;
import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks; import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks;
import com.android.systemui.statusbar.phone.LargeScreenShadeHeaderController;
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.SplitShadeHeaderController;
import com.android.systemui.statusbar.phone.StatusBarHeadsUpChangeListener; import com.android.systemui.statusbar.phone.StatusBarHeadsUpChangeListener;
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarterModule; import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarterModule;
import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule; import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule;
@@ -133,9 +133,9 @@ public interface CentralSurfacesComponent {
CentralSurfacesCommandQueueCallbacks getCentralSurfacesCommandQueueCallbacks(); CentralSurfacesCommandQueueCallbacks getCentralSurfacesCommandQueueCallbacks();
/** /**
* Creates a SplitShadeHeaderController. * Creates a {@link LargeScreenShadeHeaderController}.
*/ */
SplitShadeHeaderController getSplitShadeHeaderController(); LargeScreenShadeHeaderController getLargeScreenShadeHeaderController();
/** /**
* Creates a new {@link CollapsedStatusBarFragment} each time it's called. See * Creates a new {@link CollapsedStatusBarFragment} each time it's called. See

View File

@@ -73,9 +73,9 @@ import dagger.Provides;
@Module(subcomponents = StatusBarFragmentComponent.class) @Module(subcomponents = StatusBarFragmentComponent.class)
public abstract class StatusBarViewModule { public abstract class StatusBarViewModule {
public static final String SPLIT_SHADE_HEADER = "split_shade_header"; public static final String LARGE_SCREEN_SHADE_HEADER = "large_screen_shade_header";
private static final String SPLIT_SHADE_BATTERY_VIEW = "split_shade_battery_view"; private static final String SPLIT_SHADE_BATTERY_VIEW = "split_shade_battery_view";
public static final String SPLIT_SHADE_BATTERY_CONTROLLER = "split_shade_battery_controller"; public static final String LARGE_SCREEN_BATTERY_CONTROLLER = "split_shade_battery_controller";
public static final String STATUS_BAR_FRAGMENT = "status_bar_fragment"; public static final String STATUS_BAR_FRAGMENT = "status_bar_fragment";
/** */ /** */
@@ -159,15 +159,15 @@ public abstract class StatusBarViewModule {
/** */ /** */
@Provides @Provides
@Named(SPLIT_SHADE_HEADER) @Named(LARGE_SCREEN_SHADE_HEADER)
@CentralSurfacesComponent.CentralSurfacesScope @CentralSurfacesComponent.CentralSurfacesScope
public static View getSplitShadeStatusBarView( public static View getLargeScreenShadeHeaderBarView(
NotificationShadeWindowView notificationShadeWindowView, NotificationShadeWindowView notificationShadeWindowView,
FeatureFlags featureFlags) { FeatureFlags featureFlags) {
ViewStub stub = notificationShadeWindowView.findViewById(R.id.qs_header_stub); ViewStub stub = notificationShadeWindowView.findViewById(R.id.qs_header_stub);
int layoutId = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS) int layoutId = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)
? R.layout.combined_qs_header ? R.layout.combined_qs_header
: R.layout.split_shade_header; : R.layout.large_screen_shade_header;
stub.setLayoutResource(layoutId); stub.setLayoutResource(layoutId);
View v = stub.inflate(); View v = stub.inflate();
return v; return v;
@@ -177,14 +177,15 @@ public abstract class StatusBarViewModule {
@Provides @Provides
@CentralSurfacesComponent.CentralSurfacesScope @CentralSurfacesComponent.CentralSurfacesScope
public static OngoingPrivacyChip getSplitShadeOngoingPrivacyChip( public static OngoingPrivacyChip getSplitShadeOngoingPrivacyChip(
@Named(SPLIT_SHADE_HEADER) View header) { @Named(LARGE_SCREEN_SHADE_HEADER) View header) {
return header.findViewById(R.id.privacy_chip); return header.findViewById(R.id.privacy_chip);
} }
/** */ /** */
@Provides @Provides
@CentralSurfacesComponent.CentralSurfacesScope @CentralSurfacesComponent.CentralSurfacesScope
static StatusIconContainer providesStatusIconContainer(@Named(SPLIT_SHADE_HEADER) View header) { static StatusIconContainer providesStatusIconContainer(
@Named(LARGE_SCREEN_SHADE_HEADER) View header) {
return header.findViewById(R.id.statusIcons); return header.findViewById(R.id.statusIcons);
} }
@@ -192,13 +193,13 @@ public abstract class StatusBarViewModule {
@Provides @Provides
@CentralSurfacesComponent.CentralSurfacesScope @CentralSurfacesComponent.CentralSurfacesScope
@Named(SPLIT_SHADE_BATTERY_VIEW) @Named(SPLIT_SHADE_BATTERY_VIEW)
static BatteryMeterView getBatteryMeterView(@Named(SPLIT_SHADE_HEADER) View view) { static BatteryMeterView getBatteryMeterView(@Named(LARGE_SCREEN_SHADE_HEADER) View view) {
return view.findViewById(R.id.batteryRemainingIcon); return view.findViewById(R.id.batteryRemainingIcon);
} }
@Provides @Provides
@CentralSurfacesComponent.CentralSurfacesScope @CentralSurfacesComponent.CentralSurfacesScope
@Named(SPLIT_SHADE_BATTERY_CONTROLLER) @Named(LARGE_SCREEN_BATTERY_CONTROLLER)
static BatteryMeterViewController getBatteryMeterViewController( static BatteryMeterViewController getBatteryMeterViewController(
@Named(SPLIT_SHADE_BATTERY_VIEW) BatteryMeterView batteryMeterView, @Named(SPLIT_SHADE_BATTERY_VIEW) BatteryMeterView batteryMeterView,
ConfigurationController configurationController, ConfigurationController configurationController,

View File

@@ -20,7 +20,7 @@ import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.CommandQueue
import com.android.systemui.util.Utils import com.android.systemui.util.LargeScreenUtils
import javax.inject.Inject import javax.inject.Inject
/** /**
@@ -42,7 +42,8 @@ class RemoteInputQuickSettingsDisabler @Inject constructor(
init { init {
isLandscape = isLandscape =
context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE context.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
shouldUseSplitNotificationShade = Utils.shouldUseSplitNotificationShade(context.resources) shouldUseSplitNotificationShade =
LargeScreenUtils.shouldUseSplitNotificationShade(context.resources)
configController.addCallback(this) configController.addCallback(this)
} }
@@ -73,7 +74,7 @@ class RemoteInputQuickSettingsDisabler @Inject constructor(
needToRecompute = true needToRecompute = true
} }
val newSplitShadeFlag = Utils.shouldUseSplitNotificationShade(context.resources) val newSplitShadeFlag = LargeScreenUtils.shouldUseSplitNotificationShade(context.resources)
if (newSplitShadeFlag != shouldUseSplitNotificationShade) { if (newSplitShadeFlag != shouldUseSplitNotificationShade) {
shouldUseSplitNotificationShade = newSplitShadeFlag shouldUseSplitNotificationShade = newSplitShadeFlag
needToRecompute = true needToRecompute = true

View File

@@ -0,0 +1,26 @@
package com.android.systemui.util
import android.content.res.Resources
import com.android.systemui.R
object LargeScreenUtils {
/**
* Returns true if the device should use the split notification shade, based on orientation and
* screen width.
*/
@JvmStatic
fun shouldUseSplitNotificationShade(resources: Resources): Boolean {
return resources.getBoolean(R.bool.config_use_split_notification_shade)
}
/**
* Returns true if we should use large screen shade header:
* [com.android.systemui.statusbar.phone.LargeScreenShadeHeaderController]
* That should be true when we have enough horizontal space to show all info in one row.
*/
@JvmStatic
fun shouldUseLargeScreenShadeHeader(resources: Resources): Boolean {
return resources.getBoolean(R.bool.config_use_large_screen_shade_header)
}
}

View File

@@ -25,12 +25,10 @@ import android.content.res.TypedArray;
import android.provider.Settings; import android.provider.Settings;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.DisplayCutout; import android.view.DisplayCutout;
import android.view.View;
import com.android.internal.policy.SystemBarUtils; import com.android.internal.policy.SystemBarUtils;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.CommandQueue;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -50,58 +48,6 @@ public class Utils {
} }
} }
/**
* Sets the visibility of an UI element according to the DISABLE_* flags in
* {@link android.app.StatusBarManager}.
*/
public static class DisableStateTracker implements CommandQueue.Callbacks,
View.OnAttachStateChangeListener {
private final int mMask1;
private final int mMask2;
private final CommandQueue mCommandQueue;
private View mView;
private boolean mDisabled;
public DisableStateTracker(int disableMask, int disable2Mask, CommandQueue commandQueue) {
mMask1 = disableMask;
mMask2 = disable2Mask;
mCommandQueue = commandQueue;
}
@Override
public void onViewAttachedToWindow(View v) {
mView = v;
mCommandQueue.addCallback(this);
}
@Override
public void onViewDetachedFromWindow(View v) {
mCommandQueue.removeCallback(this);
mView = null;
}
/**
* Sets visibility of this {@link View} given the states passed from
* {@link com.android.systemui.statusbar.CommandQueue.Callbacks#disable(int, int, int)}.
*/
@Override
public void disable(int displayId, int state1, int state2, boolean animate) {
if (displayId != mView.getDisplay().getDisplayId()) {
return;
}
final boolean disabled = ((state1 & mMask1) != 0) || ((state2 & mMask2) != 0);
if (disabled == mDisabled) return;
mDisabled = disabled;
mView.setVisibility(disabled ? View.GONE : View.VISIBLE);
}
/** @return {@code true} if and only if this {@link View} is currently disabled */
public boolean isDisabled() {
return mDisabled;
}
}
/** /**
* Returns {@code true} iff the package {@code packageName} is a headless remote display * Returns {@code true} iff the package {@code packageName} is a headless remote display
* provider, i.e, that the package holds the privileged {@code REMOTE_DISPLAY_PROVIDER} * provider, i.e, that the package holds the privileged {@code REMOTE_DISPLAY_PROVIDER}
@@ -150,17 +96,6 @@ public class Utils {
return useQsMediaPlayer(context) && flag > 0; return useQsMediaPlayer(context) && flag > 0;
} }
/**
* Allow recommendations from smartspace to show in media controls.
* Requires {@link #useQsMediaPlayer(Context)} to be enabled.
* On by default, but can be disabled by setting to 0
*/
public static boolean allowMediaRecommendations(Context context) {
int flag = Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.MEDIA_CONTROLS_RECOMMENDATION, 1);
return useQsMediaPlayer(context) && flag > 0;
}
/** /**
* Returns true if the device should use the collapsed layout for the media player when in * Returns true if the device should use the collapsed layout for the media player when in
* landscape (or seascape) orientation * landscape (or seascape) orientation
@@ -169,14 +104,6 @@ public class Utils {
return resources.getBoolean(R.bool.config_quickSettingsMediaLandscapeCollapsed); return resources.getBoolean(R.bool.config_quickSettingsMediaLandscapeCollapsed);
} }
/**
* Returns true if the device should use the split notification shade, based on orientation and
* screen width.
*/
public static boolean shouldUseSplitNotificationShade(Resources resources) {
return resources.getBoolean(R.bool.config_use_split_notification_shade);
}
/** /**
* Returns the color provided at the specified {@param attrIndex} in {@param a} if it exists, * Returns the color provided at the specified {@param attrIndex} in {@param a} if it exists,
* otherwise, returns the color from the private attribute {@param privAttrId}. * otherwise, returns the color from the private attribute {@param privAttrId}.
@@ -196,33 +123,6 @@ public class Utils {
return color; return color;
} }
/**
* Gets the {@link R.dimen#split_shade_header_height}.
*
* It should be fine to not ignore cutouts as split shade might not want to react to them:
* for split shade header, which is only on bigger screens, either cutout won't be a problem
* (it's usually centered and in split shade that's likely empty area) or we probably want to
* handle it differently.
*/
public static int getSplitShadeStatusBarHeight(Context context) {
return context.getResources().getDimensionPixelSize(R.dimen.split_shade_header_height);
}
/**
* Gets the {@link R.dimen#qs_header_system_icons_area_height}.
*
* It's the same as {@link com.android.internal.R.dimen#quick_qs_offset_height} except for
* sw600dp-land.
*/
public static int getQsHeaderSystemIconsAreaHeight(Context context) {
final Resources res = context.getResources();
if (Utils.shouldUseSplitNotificationShade(res)) {
return res.getDimensionPixelSize(R.dimen.qs_header_system_icons_area_height);
} else {
return SystemBarUtils.getQuickQsOffsetHeight(context);
}
}
/** /**
* Gets the {@link R.dimen#status_bar_header_height_keyguard}. * Gets the {@link R.dimen#status_bar_header_height_keyguard}.
*/ */

View File

@@ -279,7 +279,7 @@ public class KeyguardClockPositionAlgorithmTest extends SysuiTestCase {
public void notifPaddingMakesUpToFullMarginInSplitShade() { public void notifPaddingMakesUpToFullMarginInSplitShade() {
when(mResources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin)) when(mResources.getDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin))
.thenReturn(100); .thenReturn(100);
when(mResources.getDimensionPixelSize(R.dimen.split_shade_header_height)) when(mResources.getDimensionPixelSize(R.dimen.large_screen_shade_header_height))
.thenReturn(70); .thenReturn(70);
mClockPositionAlgorithm.loadDimens(mResources); mClockPositionAlgorithm.loadDimens(mResources);
givenLockScreen(); givenLockScreen();

View File

@@ -27,7 +27,7 @@ import org.mockito.Mockito.`when` as whenever
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner::class) @RunWith(AndroidTestingRunner::class)
class SplitShadeHeaderControllerTest : SysuiTestCase() { class LargeScreenShadeHeaderControllerTest : SysuiTestCase() {
@Mock private lateinit var view: View @Mock private lateinit var view: View
@Mock private lateinit var statusIcons: StatusIconContainer @Mock private lateinit var statusIcons: StatusIconContainer
@@ -43,7 +43,7 @@ class SplitShadeHeaderControllerTest : SysuiTestCase() {
@JvmField @Rule val mockitoRule = MockitoJUnit.rule() @JvmField @Rule val mockitoRule = MockitoJUnit.rule()
var viewVisibility = View.GONE var viewVisibility = View.GONE
private lateinit var splitShadeHeaderController: SplitShadeHeaderController private lateinit var mLargeScreenShadeHeaderController: LargeScreenShadeHeaderController
private lateinit var carrierIconSlots: List<String> private lateinit var carrierIconSlots: List<String>
@Before @Before
@@ -62,7 +62,7 @@ class SplitShadeHeaderControllerTest : SysuiTestCase() {
} }
whenever(view.visibility).thenAnswer { _ -> viewVisibility } whenever(view.visibility).thenAnswer { _ -> viewVisibility }
whenever(featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)).thenReturn(false) whenever(featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)).thenReturn(false)
splitShadeHeaderController = SplitShadeHeaderController( mLargeScreenShadeHeaderController = LargeScreenShadeHeaderController(
view, view,
statusBarIconController, statusBarIconController,
privacyIconsController, privacyIconsController,
@@ -76,11 +76,11 @@ class SplitShadeHeaderControllerTest : SysuiTestCase() {
} }
@Test @Test
fun setVisible_onlyInSplitShade() { fun setVisible_onlyWhenActive() {
makeShadeVisible() makeShadeVisible()
assertThat(viewVisibility).isEqualTo(View.VISIBLE) assertThat(viewVisibility).isEqualTo(View.VISIBLE)
splitShadeHeaderController.splitShadeMode = false mLargeScreenShadeHeaderController.active = false
assertThat(viewVisibility).isEqualTo(View.GONE) assertThat(viewVisibility).isEqualTo(View.GONE)
} }
@@ -94,7 +94,7 @@ class SplitShadeHeaderControllerTest : SysuiTestCase() {
@Test @Test
fun shadeExpandedFraction_updatesAlpha() { fun shadeExpandedFraction_updatesAlpha() {
makeShadeVisible() makeShadeVisible()
splitShadeHeaderController.shadeExpandedFraction = 0.5f mLargeScreenShadeHeaderController.shadeExpandedFraction = 0.5f
verify(view).setAlpha(ShadeInterpolation.getContentAlpha(0.5f)) verify(view).setAlpha(ShadeInterpolation.getContentAlpha(0.5f))
} }
@@ -117,7 +117,7 @@ class SplitShadeHeaderControllerTest : SysuiTestCase() {
} }
private fun makeShadeVisible() { private fun makeShadeVisible() {
splitShadeHeaderController.splitShadeMode = true mLargeScreenShadeHeaderController.active = true
splitShadeHeaderController.shadeExpanded = true mLargeScreenShadeHeaderController.shadeExpanded = true
} }
} }

View File

@@ -288,7 +288,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
@Mock @Mock
private SecureSettings mSecureSettings; private SecureSettings mSecureSettings;
@Mock @Mock
private SplitShadeHeaderController mSplitShadeHeaderController; private LargeScreenShadeHeaderController mLargeScreenShadeHeaderController;
@Mock @Mock
private ContentResolver mContentResolver; private ContentResolver mContentResolver;
@Mock @Mock
@@ -498,7 +498,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
mRecordingController, mRecordingController,
mExecutor, mExecutor,
mSecureSettings, mSecureSettings,
mSplitShadeHeaderController, mLargeScreenShadeHeaderController,
mScreenOffAnimationController, mScreenOffAnimationController,
mLockscreenGestureLogger, mLockscreenGestureLogger,
new PanelExpansionStateManager(), new PanelExpansionStateManager(),
@@ -918,6 +918,18 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
verify(mKeyguardStatusViewController, never()).displayClock(LARGE, /* animate */ true); verify(mKeyguardStatusViewController, never()).displayClock(LARGE, /* animate */ true);
} }
@Test
public void testLargeScreenHeaderMadeActiveForLargeScreen() {
mStatusBarStateController.setState(SHADE);
when(mResources.getBoolean(R.bool.config_use_large_screen_shade_header)).thenReturn(true);
mNotificationPanelViewController.updateResources();
verify(mLargeScreenShadeHeaderController).setActive(true);
when(mResources.getBoolean(R.bool.config_use_large_screen_shade_header)).thenReturn(false);
mNotificationPanelViewController.updateResources();
verify(mLargeScreenShadeHeaderController).setActive(false);
}
private void triggerPositionClockAndNotifications() { private void triggerPositionClockAndNotifications() {
mNotificationPanelViewController.closeQs(); mNotificationPanelViewController.closeQs();
} }

View File

@@ -467,6 +467,29 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
assertThat(getConstraintSetLayout(R.id.qs_frame).startMargin).isEqualTo(0) assertThat(getConstraintSetLayout(R.id.qs_frame).startMargin).isEqualTo(0)
} }
@Test
fun testLargeScreenLayout_qsAndNotifsTopMarginIsOfHeaderHeight() {
setLargeScreen()
val largeScreenHeaderHeight = 100
overrideResource(R.dimen.large_screen_shade_header_height, largeScreenHeaderHeight)
controller.updateResources()
assertThat(getConstraintSetLayout(R.id.qs_frame).topMargin)
.isEqualTo(largeScreenHeaderHeight)
assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).topMargin)
.isEqualTo(largeScreenHeaderHeight)
}
@Test
fun testSmallScreenLayout_qsAndNotifsTopMarginIsZero() {
setSmallScreen()
controller.updateResources()
assertThat(getConstraintSetLayout(R.id.qs_frame).topMargin).isEqualTo(0)
assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).topMargin)
.isEqualTo(0)
}
@Test @Test
fun testSinglePaneShadeLayout_qsFrameHasHorizontalMarginsSetToCorrectValue() { fun testSinglePaneShadeLayout_qsFrameHasHorizontalMarginsSetToCorrectValue() {
disableSplitShade() disableSplitShade()
@@ -537,6 +560,18 @@ class NotificationQSContainerControllerTest : SysuiTestCase() {
controller.updateResources() controller.updateResources()
} }
private fun setSmallScreen() {
setLargeScreenEnabled(false)
}
private fun setLargeScreen() {
setLargeScreenEnabled(true)
}
private fun setLargeScreenEnabled(enabled: Boolean) {
overrideResource(R.bool.config_use_large_screen_shade_header, enabled)
}
private fun given( private fun given(
taskbarVisible: Boolean, taskbarVisible: Boolean,
navigationMode: Int, navigationMode: Int,