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:
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user