Fix Marquees in QSHeader animating when invisible

When QS is collapsed, QuickStatusBarHeader is set to GONE/INVISIBLE. In
that case, all it's children should NOT marquee. As they are still
visible, they need to override onVisibilityAggregated, which gets called
when any view in it's hierarchy changes its visibility.

This is still not perfect, as the switch between QQS and QS is changed
by just modifying the alpha of high level container views and we have no
way of tracking this without dispatching everything down the line. But
it's enough for now to significantly improve performance.

Test: systrace, systemui is not constantly drawing frames when on AoD
Test: inferno.py, in 10s reduces Binder calls from ~600 to ~20 when on
AoD
Test: Layout inspector with QS collapsed, views have ellipsize END
Fixes: 133229320
Fixes: 131427575

Change-Id: I0d742cef3716dce9f32133b2510aeffb7082ae47
This commit is contained in:
Fabian Kozynski
2019-05-21 15:30:52 -04:00
parent 738c98232c
commit 956b597a4e
4 changed files with 79 additions and 43 deletions

View File

@@ -35,7 +35,7 @@
android:layout_marginEnd="@dimen/qs_carrier_margin_width"
android:visibility="gone" />
<view class="com.android.systemui.qs.QSCarrier$QSCarrierText"
<com.android.systemui.util.AutoMarqueeTextView
android:id="@+id/qs_carrier_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@@ -47,7 +47,7 @@
android:contentDescription="@string/accessibility_quick_settings_alarm_set"
android:visibility="gone"/>
<TextView
<com.android.systemui.util.AutoMarqueeTextView
android:id="@+id/next_alarm_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -80,7 +80,7 @@
android:layout_height="@dimen/qs_header_alarm_icon_size"
android:visibility="gone"/>
<TextView
<com.android.systemui.util.AutoMarqueeTextView
android:id="@+id/ringer_mode_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

View File

@@ -33,7 +33,7 @@ import com.android.systemui.R;
public class QSCarrier extends LinearLayout {
private View mMobileGroup;
private QSCarrierText mCarrierText;
private TextView mCarrierText;
private ImageView mMobileSignal;
private ImageView mMobileRoaming;
private DualToneHandler mDualToneHandler;
@@ -111,43 +111,4 @@ public class QSCarrier extends LinearLayout {
public void setCarrierText(CharSequence text) {
mCarrierText.setText(text);
}
/**
* TextView that changes its ellipsize value with its visibility.
*/
public static class QSCarrierText extends TextView {
public QSCarrierText(Context context) {
super(context);
}
public QSCarrierText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public QSCarrierText(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onFinishInflate() {
setSelected(true);
}
@Override
protected void onVisibilityChanged(View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
// Only show marquee when visible
if (visibility == VISIBLE) {
setEllipsize(TextUtils.TruncateAt.MARQUEE);
} else {
setEllipsize(TextUtils.TruncateAt.END);
}
}
}
}

View File

@@ -0,0 +1,75 @@
/*
* Copyright (C) 2019 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.util;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* TextView that changes its ellipsize value with its visibility.
*
* The View responds to changes in user-visibility to change its ellipsize from MARQUEE to END
* and back. Useful for TextView that need to marquee forever.
*/
public class AutoMarqueeTextView extends TextView {
private boolean mAggregatedVisible = false;
public AutoMarqueeTextView(Context context) {
super(context);
}
public AutoMarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public AutoMarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public AutoMarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
setSelected(true);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
setSelected(false);
}
@Override
public void onVisibilityAggregated(boolean isVisible) {
super.onVisibilityAggregated(isVisible);
if (isVisible == mAggregatedVisible) return;
mAggregatedVisible = isVisible;
if (mAggregatedVisible) {
setEllipsize(TextUtils.TruncateAt.MARQUEE);
} else {
setEllipsize(TextUtils.TruncateAt.END);
}
}
}