From 9c8de7bdf10081516ab8a2a5bb130173797507f3 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Mon, 3 May 2021 16:12:57 -0400 Subject: [PATCH] Refactor QSTileView hierarchy This CL collapses the hierarchy QSTileBaseView - QSTileView - QSTileViewHorizontal into QSTileViewImpl. This can be done because now there's a single type of view for the tiles. The benefit of this is that we do not have to hack our way to undo things that are done in parent classes. As part of this remove a lot of unnecessary files. As part of this, bring some colors/sizes up to spec and make sure that the sizes are reloaded in config changes. Test: manual Test: atest com.android.systemui.qs Fixes: 187061459 Bug: 186057842 Change-Id: I63dbe8fa2b44833c11a486e84195e33e170c6f58 --- packages/SystemUI/docs/QS-QQS.png | Bin 77843 -> 79618 bytes packages/SystemUI/docs/qs-tiles.md | 14 +- .../SystemUI/res/layout/qs_tile_label.xml | 82 +-- .../quick_status_bar_expanded_header.xml | 1 - packages/SystemUI/res/values/dimens.xml | 5 +- packages/SystemUI/res/values/strings.xml | 3 + .../com/android/systemui/qs/QSFooterView.java | 3 +- .../com/android/systemui/qs/QuickQSPanel.java | 2 - .../qs/customize/CustomizeTileView.java | 58 -- .../qs/customize/CustomizeTileView.kt | 64 +++ .../customize/CustomizeTileViewHorizontal.kt | 45 -- .../systemui/qs/customize/TileAdapter.java | 31 +- .../qs/tileimpl/ButtonRelativeLayout.java | 61 --- .../qs/tileimpl/IgnorableChildLinearLayout.kt | 58 ++ .../systemui/qs/tileimpl/QSFactoryImpl.java | 2 +- .../systemui/qs/tileimpl/QSIconViewImpl.java | 35 +- .../systemui/qs/tileimpl/QSTileBaseView.java | 416 -------------- .../systemui/qs/tileimpl/QSTileImpl.java | 17 - .../systemui/qs/tileimpl/QSTileView.java | 200 ------- .../qs/tileimpl/QSTileViewHorizontal.kt | 215 -------- .../systemui/qs/tileimpl/QSTileViewImpl.kt | 516 ++++++++++++++++++ .../systemui/util/leak/GarbageMonitor.java | 3 +- .../android/systemui/qs/TileLayoutTest.java | 4 +- ...eBaseViewTest.kt => QSTileViewImplTest.kt} | 33 +- 24 files changed, 737 insertions(+), 1131 deletions(-) delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java create mode 100644 packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileViewHorizontal.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java create mode 100644 packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt create mode 100644 packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt rename packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/{QSTileBaseViewTest.kt => QSTileViewImplTest.kt} (84%) diff --git a/packages/SystemUI/docs/QS-QQS.png b/packages/SystemUI/docs/QS-QQS.png index 02de479cb8c02cada57ca992330cbb7457daaf9c..3ed8e24c6a8d3050fb1d6cfcef176e532522769f 100644 GIT binary patch literal 79618 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
!jaYqk@3^C=&8 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ᅿZ1-q3-hFqXGQ0a5%5^2bk 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
    h=-J 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 sgf3Y3ks?}>)|&f&%D-%m2Fm$@Hs0f#&m)gDt> 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�B{f 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 OOgJ5JJzRCjKlQ)Ltg{>d diff --git a/packages/SystemUI/docs/qs-tiles.md b/packages/SystemUI/docs/qs-tiles.md index b48ba6708313e..521620935ddcb 100644 --- a/packages/SystemUI/docs/qs-tiles.md +++ b/packages/SystemUI/docs/qs-tiles.md @@ -8,7 +8,7 @@ This document is a more or less comprehensive summary of the state and infrastru ## What are Quick Settings Tiles? -Quick Settings (from now on, QS) is the expanded panel that contains shortcuts for the user to toggle many settings. This is opened by expanding the notification drawer twice (or once when phone is locked). Quick Quick Settings (QQS) is the smaller panel that appears on top of the notifications before expanding twice and contains some of the toggles with no text. +Quick Settings (from now on, QS) is the expanded panel that contains shortcuts for the user to toggle many settings. This is opened by expanding the notification drawer twice (or once when phone is locked). Quick Quick Settings (QQS) is the smaller panel that appears on top of the notifications before expanding twice and contains some of the toggles with no secondary line. Each of these toggles that appear either in QS or QQS are called Quick Settings Tiles (or tiles for short). They allow the user to enable or disable settings quickly and sometimes provides access to more comprehensive settings pages. @@ -69,13 +69,13 @@ For more information on how to implement a tile in SystemUI, see [Implementing a Each Tile has a couple of associated views for displaying it in QS and QQS. These views are updated after the backend updates the `State` using `QSTileImpl#handleUpdateState`. -* **[`com.android.systemui.plugins.qs.QSTileView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java)**: Abstract class that provides basic Tile functionality. These allows external [Factories](#qsfactory) to create Tiles. -* **[`QSTileBaseView`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java)**: Implementation of `QSTileView` used in QQS that takes care of most of the features of the view: +* **[`QSTileView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java)**: Abstract class that provides basic Tile functionality. These allows external [Factories](#qsfactory) to create Tiles. +* **[`QSTileViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.java)**: Implementation of `QSTileView`. It takes care of the following: * Holding the icon * Background color and shape * Ripple * Click listening -* **[`QSTileView`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java)**: Extends `QSTileBaseView`to add label support. Used in QS. + * Labels * **[`QSIconView`](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSIconView.java)** * **[`QSIconViewImpl`](/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java)** @@ -103,7 +103,7 @@ When a container for tiles (`QuickQSPanel` or `QSPanel`) has to display tiles, t This is a brief run-down of what happens when a user clicks on a tile. Internal changes on the device (for example, changes from Settings) will trigger this process starting in step 3. Throughout this section, we assume that we are dealing with a `QSTileImpl`. 1. User clicks on tile. The following calls happen in sequence: - 1. `QSTileBaseView#onClickListener`. + 1. `QSTileViewImpl#onClickListener`. 2. `QSTile#click`. 3. `QSTileImpl#handleClick`. This last call sets the new state for the device by using the associated controller. 2. State in the device changes. This is normally outside of SystemUI's control. @@ -113,9 +113,9 @@ This is a brief run-down of what happens when a user clicks on a tile. Internal 4. `QSTileImpl#handleUpdateState` is called to update the state with the new information. This information can be obtained both from the `Object` passed to `refreshState` as well as from the controller. 5. If the state has changed (in at least one element), `QSTileImpl#handleStateChanged` is called. This will trigger a call to all the associated `QSTile.Callback#onStateChanged`, passing the new `State`. 6. `QSTileView#onStateChanged` is called and this calls `QSTileView#handleStateChanged`. This method maps the state into the view: - * The tile is rippled and the color changes to match the new state. + * The tile colors change to match the new state. * `QSIconView.setIcon` is called to apply the correct state to the icon and the correct icon to the view. - * If the tile is a `QSTileView` (in expanded QS), the labels are changed. + * The tile labels change to match the new state. ## Third party tiles (TileService) diff --git a/packages/SystemUI/res/layout/qs_tile_label.xml b/packages/SystemUI/res/layout/qs_tile_label.xml index f8812ba894faa..1d93f5d69da83 100644 --- a/packages/SystemUI/res/layout/qs_tile_label.xml +++ b/packages/SystemUI/res/layout/qs_tile_label.xml @@ -1,6 +1,6 @@ - - + + - - - - - - - - + android:gravity="start" + android:textDirection="locale" + android:ellipsize="marquee" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.QS.TileLabel"/> - - - + diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index 5bf691928300e..241f0495c8a4c 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -52,7 +52,6 @@ android:layout_below="@id/quick_qs_status_icons" android:layout_marginTop="8dp" android:accessibilityTraversalAfter="@id/quick_qs_status_icons" - android:accessibilityTraversalBefore="@id/expand_indicator" android:clipChildren="false" android:clipToPadding="false" android:focusable="true" diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index edd8486379a20..78cd22dae2a07 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -555,7 +555,8 @@ 20dp 10dp 60dp - 12dp + 12dp + 16dp 16dp 18dp 16dp @@ -564,8 +565,6 @@ Scaled @dimen/qs_page_indicator-width by .4f. --> 6.4dp - 12dp - 24dp 14sp 1dp 16dp diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index d9cc24fa38ef7..955a9b5224cad 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -2187,6 +2187,9 @@ Unavailable + + Disabled + Navigation bar diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java index 40967ede057e1..01aa996feafd8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterView.java @@ -45,7 +45,6 @@ import com.android.settingslib.Utils; import com.android.settingslib.development.DevelopmentSettingsEnabler; import com.android.settingslib.drawable.UserIconDrawable; import com.android.systemui.R; -import com.android.systemui.R.dimen; import com.android.systemui.qs.TouchAnimator.Builder; import com.android.systemui.statusbar.phone.MultiUserSwitch; import com.android.systemui.statusbar.phone.SettingsButton; @@ -140,7 +139,7 @@ public class QSFooterView extends FrameLayout { void updateAnimator(int width, int numTiles) { int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size) - - mContext.getResources().getDimensionPixelSize(dimen.qs_quick_tile_padding); + - mContext.getResources().getDimensionPixelSize(R.dimen.qs_tile_padding); int remaining = (width - numTiles * size) / (numTiles - 1); int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index 63733b3926318..c3458feb5dfef 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -285,8 +285,6 @@ public class QuickQSPanel extends QSPanel { if (record.tileView.getVisibility() == GONE) continue; previousView = record.tileView.updateAccessibilityOrder(previousView); } - mRecords.get(mRecords.size() - 1).tileView.setAccessibilityTraversalBefore( - R.id.expand_indicator); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java deleted file mode 100644 index ce8f6c1737d7a..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2016 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.qs.customize; - -import android.content.Context; -import android.view.View; - -import com.android.systemui.plugins.qs.QSIconView; -import com.android.systemui.plugins.qs.QSTile; -import com.android.systemui.qs.tileimpl.QSTileView; - -public class CustomizeTileView extends QSTileView implements TileAdapter.CustomizeView { - private boolean mShowAppLabel; - - public CustomizeTileView(Context context, QSIconView icon) { - super(context, icon); - } - - @Override - public void setShowAppLabel(boolean showAppLabel) { - mShowAppLabel = showAppLabel; - mSecondLine.setVisibility(showAppLabel ? View.VISIBLE : View.GONE); - mLabel.setSingleLine(showAppLabel); - } - - @Override - protected void handleStateChanged(QSTile.State state) { - super.handleStateChanged(state); - mSecondLine.setVisibility(mShowAppLabel ? View.VISIBLE : View.GONE); - } - - @Override - protected boolean animationsEnabled() { - return false; - } - - @Override - public boolean isLongClickable() { - return false; - } - - @Override - public void changeState(QSTile.State state) { - handleStateChanged(state); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.kt b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.kt new file mode 100644 index 0000000000000..287d815c2e4ab --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.kt @@ -0,0 +1,64 @@ +/* + * 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.qs.customize + +import android.content.Context +import android.text.TextUtils +import com.android.systemui.plugins.qs.QSIconView +import com.android.systemui.plugins.qs.QSTile +import com.android.systemui.qs.tileimpl.QSTileViewImpl + +/** + * Class for displaying tiles in [QSCustomizer] with the new design (labels on the side). + */ +class CustomizeTileView( + context: Context, + icon: QSIconView +) : QSTileViewImpl(context, icon, collapsed = false) { + + var showAppLabel = false + set(value) { + field = value + secondaryLabel.visibility = getVisibilityState(secondaryLabel.text) + } + + override fun handleStateChanged(state: QSTile.State) { + super.handleStateChanged(state) + showRippleEffect = false + secondaryLabel.visibility = getVisibilityState(state.secondaryLabel) + } + + private fun getVisibilityState(text: CharSequence?): Int { + return if (showAppLabel && !TextUtils.isEmpty(text)) { + VISIBLE + } else { + GONE + } + } + + override fun animationsEnabled(): Boolean { + return false + } + + override fun isLongClickable(): Boolean { + return false + } + + fun changeState(state: QSTile.State) { + handleStateChanged(state) + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileViewHorizontal.kt b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileViewHorizontal.kt deleted file mode 100644 index 7977b4904a7da..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileViewHorizontal.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.android.systemui.qs.customize - -import android.content.Context -import android.view.View -import com.android.systemui.plugins.qs.QSIconView -import com.android.systemui.plugins.qs.QSTile -import com.android.systemui.qs.tileimpl.QSTileViewHorizontal - -/** - * Class for displaying tiles in [QSCustomizer] with the new design (labels on the side). - * - * This is a class parallel to [CustomizeTileView], but inheriting from [QSTileViewHorizontal]. - */ -class CustomizeTileViewHorizontal( - context: Context, - icon: QSIconView -) : QSTileViewHorizontal(context, icon, collapsed = false), - TileAdapter.CustomizeView { - - private var showAppLabel = false - - override fun setShowAppLabel(showAppLabel: Boolean) { - this.showAppLabel = showAppLabel - mSecondLine.visibility = if (showAppLabel) View.VISIBLE else View.GONE - mLabel.isSingleLine = showAppLabel - } - - override fun handleStateChanged(state: QSTile.State) { - super.handleStateChanged(state) - mShowRippleEffect = false - mSecondLine.visibility = if (showAppLabel) View.VISIBLE else View.GONE - } - - override fun animationsEnabled(): Boolean { - return false - } - - override fun isLongClickable(): Boolean { - return false - } - - override fun changeState(state: QSTile.State) { - handleStateChanged(state) - } -} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 50805330cf1f8..505f5866c105e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -43,7 +43,6 @@ import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.android.internal.logging.UiEventLogger; import com.android.systemui.R; -import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSEditEvent; import com.android.systemui.qs.QSTileHost; import com.android.systemui.qs.customize.TileAdapter.Holder; @@ -53,7 +52,7 @@ import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.dagger.QSThemedContext; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.tileimpl.QSIconViewImpl; -import com.android.systemui.qs.tileimpl.QSTileView; +import com.android.systemui.qs.tileimpl.QSTileViewImpl; import java.util.ArrayList; import java.util.List; @@ -280,7 +279,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta } FrameLayout frame = (FrameLayout) inflater.inflate(R.layout.qs_customize_tile_frame, parent, false); - View view = new CustomizeTileViewHorizontal(context, new QSIconViewImpl(context)); + View view = new CustomizeTileView(context, new QSIconViewImpl(context)); frame.addView(view); return new Holder(frame); } @@ -545,15 +544,12 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta } public class Holder extends ViewHolder { - private QSTileView mTileView; + private QSTileViewImpl mTileView; public Holder(View itemView) { super(itemView); if (itemView instanceof FrameLayout) { - mTileView = (QSTileView) ((FrameLayout) itemView).getChildAt(0); - if (mTileView instanceof CustomizeTileView) { - mTileView.setBackground(null); - } + mTileView = (QSTileViewImpl) ((FrameLayout) itemView).getChildAt(0); mTileView.getIcon().disableAnimation(); mTileView.setTag(this); ViewCompat.setAccessibilityDelegate(mTileView, mAccessibilityDelegate); @@ -561,8 +557,8 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta } @Nullable - public CustomizeView getTileAsCustomizeView() { - return (CustomizeView) mTileView; + public CustomizeTileView getTileAsCustomizeView() { + return (CustomizeTileView) mTileView; } public void clearDrag() { @@ -570,8 +566,8 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta if (mTileView instanceof CustomizeTileView) { mTileView.findViewById(R.id.tile_label).clearAnimation(); mTileView.findViewById(R.id.tile_label).setAlpha(1); - mTileView.getAppLabel().clearAnimation(); - mTileView.getAppLabel().setAlpha(.6f); + mTileView.getSecondaryLabel().clearAnimation(); + mTileView.getSecondaryLabel().setAlpha(.6f); } } @@ -584,7 +580,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta mTileView.findViewById(R.id.tile_label).animate() .setDuration(DRAG_LENGTH) .alpha(0); - mTileView.getAppLabel().animate() + mTileView.getSecondaryLabel().animate() .setDuration(DRAG_LENGTH) .alpha(0); } @@ -599,7 +595,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta mTileView.findViewById(R.id.tile_label).animate() .setDuration(DRAG_LENGTH) .alpha(1); - mTileView.getAppLabel().animate() + mTileView.getSecondaryLabel().animate() .setDuration(DRAG_LENGTH) .alpha(.6f); } @@ -765,7 +761,7 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta int position = mCurrentDrag.getAdapterPosition(); if (position == RecyclerView.NO_POSITION) return; TileInfo info = mTiles.get(position); - ((CustomizeView) mCurrentDrag.mTileView).setShowAppLabel( + ((CustomizeTileView) mCurrentDrag.mTileView).setShowAppLabel( position > mEditIndex && !info.isSystem); mCurrentDrag.stopDrag(); mCurrentDrag = null; @@ -825,9 +821,4 @@ public class TileAdapter extends RecyclerView.Adapter implements TileSta public void onSwiped(ViewHolder viewHolder, int direction) { } }; - - interface CustomizeView { - void setShowAppLabel(boolean showAppLabel); - void changeState(@NonNull QSTile.State state); - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java deleted file mode 100644 index 962537a01fe20..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/ButtonRelativeLayout.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2017 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.qs.tileimpl; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; -import android.widget.Button; -import android.widget.RelativeLayout; - -/** - * Used for QS tile labels - */ -public class ButtonRelativeLayout extends RelativeLayout { - - private View mIgnoredView; - - public ButtonRelativeLayout(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - public CharSequence getAccessibilityClassName() { - return Button.class.getName(); - } - - /** - * Set a view to be ignored for measure. - * - * The view will be measured and laid out, but its size will be subtracted from the total size - * of this view. It assumes that this view only contributes vertical height. - */ - public void setIgnoredView(View view) { - if (mIgnoredView == null || mIgnoredView.getParent() == this) { - mIgnoredView = view; - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - if (mIgnoredView != null && mIgnoredView.getVisibility() != GONE) { - int height = mIgnoredView.getMeasuredHeight(); - MarginLayoutParams lp = (MarginLayoutParams) mIgnoredView.getLayoutParams(); - height = height - lp.bottomMargin - lp.topMargin; - setMeasuredDimension(getMeasuredWidth(), getMeasuredHeight() - height); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt new file mode 100644 index 0000000000000..705576059b581 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/IgnorableChildLinearLayout.kt @@ -0,0 +1,58 @@ +/* + * 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.qs.tileimpl + +import android.content.Context +import android.util.AttributeSet +import android.widget.LinearLayout + +/** + * [LinearLayout] that can ignore the last child for measuring. + * + * The view is measured as regularlt, then if [ignoreLastView] is true: + * * In [LinearLayout.VERTICAL] orientation, the height of the last view is subtracted from the + * final measured height. + * * In [LinearLayout.HORIZONTAL] orientation, the width of the last view is subtracted from the + * final measured width. + * + * This allows to measure the view and position it where it should, without it amounting to the + * total size (only in the direction of layout). + */ +class IgnorableChildLinearLayout @JvmOverloads constructor( + context: Context, + attributeSet: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : LinearLayout(context, attributeSet, defStyleAttr, defStyleRes) { + + var ignoreLastView = false + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec) + if (ignoreLastView && childCount > 0) { + val lastView = getChildAt(childCount - 1) + val lp = lastView.layoutParams as MarginLayoutParams + if (orientation == VERTICAL) { + val height = lastView.measuredHeight + lp.bottomMargin + lp.topMargin + setMeasuredDimension(measuredWidth, measuredHeight - height) + } else { + val width = lastView.measuredWidth + lp.leftMargin + lp.rightMargin + setMeasuredDimension(measuredWidth - width, measuredHeight) + } + } + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java index 3437dd595152a..8f7c493417ecd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java @@ -243,6 +243,6 @@ public class QSFactoryImpl implements QSFactory { @Override public QSTileView createTileView(Context context, QSTile tile, boolean collapsedView) { QSIconView icon = tile.createTileView(context); - return new QSTileViewHorizontal(context, icon, collapsedView); + return new QSTileViewImpl(context, icon, collapsedView); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java index 31526bf8f5e12..8280f98114e2b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java @@ -14,22 +14,24 @@ package com.android.systemui.qs.tileimpl; -import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState; - import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.ColorStateList; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.Animatable2; import android.graphics.drawable.Animatable2.AnimationCallback; import android.graphics.drawable.Drawable; +import android.service.quicksettings.Tile; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.ImageView.ScaleType; +import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.plugins.qs.QSIconView; import com.android.systemui.plugins.qs.QSTile; @@ -43,7 +45,7 @@ public class QSIconViewImpl extends QSIconView { public static final long QS_ANIM_LENGTH = 350; protected final View mIcon; - protected final int mIconSizePx; + protected int mIconSizePx; private boolean mAnimationEnabled = true; private int mState = -1; private int mTint; @@ -53,12 +55,18 @@ public class QSIconViewImpl extends QSIconView { super(context); final Resources res = context.getResources(); - mIconSizePx = res.getDimensionPixelSize(R.dimen.qs_tile_icon_size); + mIconSizePx = res.getDimensionPixelSize(R.dimen.qs_icon_size); mIcon = createIcon(); addView(mIcon); } + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mIconSizePx = getContext().getResources().getDimensionPixelSize(R.dimen.qs_icon_size); + } + public void disableAnimation() { mAnimationEnabled = false; } @@ -169,7 +177,7 @@ public class QSIconViewImpl extends QSIconView { } protected int getColor(int state) { - return getColorForState(getContext(), state); + return getIconColorForState(getContext(), state); } private void animateGrayScale(int fromColor, int toColor, ImageView iv, @@ -229,4 +237,21 @@ public class QSIconViewImpl extends QSIconView { protected final void layout(View child, int left, int top) { child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight()); } + + /** + * Color to tint the tile icon based on state + */ + public static int getIconColorForState(Context context, int state) { + switch (state) { + case Tile.STATE_UNAVAILABLE: + return Utils.getColorAttrDefaultColor(context, android.R.attr.textColorTertiary); + case Tile.STATE_INACTIVE: + return Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary); + case Tile.STATE_ACTIVE: + return Utils.getColorAttrDefaultColor(context, android.R.attr.colorPrimary); + default: + Log.e("QSIconView", "Invalid state " + state); + return 0; + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java deleted file mode 100644 index c973e8c6fc2c4..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java +++ /dev/null @@ -1,416 +0,0 @@ -/* - * Copyright (C) 2017 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.qs.tileimpl; - -import static android.view.accessibility.AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION; - -import static com.android.systemui.qs.tileimpl.QSIconViewImpl.QS_ANIM_LENGTH; - -import android.animation.ValueAnimator; -import android.content.Context; -import android.content.res.ColorStateList; -import android.content.res.Resources; -import android.content.res.TypedArray; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Path; -import android.graphics.drawable.AdaptiveIconDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.RippleDrawable; -import android.graphics.drawable.ShapeDrawable; -import android.graphics.drawable.shapes.PathShape; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.service.quicksettings.Tile; -import android.text.TextUtils; -import android.util.Log; -import android.util.PathParser; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityNodeInfo; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.Switch; - -import com.android.settingslib.Utils; -import com.android.systemui.R; -import com.android.systemui.plugins.qs.QSIconView; -import com.android.systemui.plugins.qs.QSTile; -import com.android.systemui.plugins.qs.QSTile.BooleanState; - -public class QSTileBaseView extends com.android.systemui.plugins.qs.QSTileView { - - private static final String TAG = "QSTileBaseView"; - private static final int ICON_MASK_ID = com.android.internal.R.string.config_icon_mask; - protected final Handler mHandler = new H(); - private final int[] mLocInScreen = new int[2]; - protected final FrameLayout mIconFrame; - protected QSIconView mIcon; - protected RippleDrawable mRipple; - protected Drawable mTileBackground; - private String mAccessibilityClass; - private boolean mTileState; - protected boolean mCollapsedView; - protected boolean mShowRippleEffect = true; - private float mStrokeWidthActive; - private float mStrokeWidthInactive; - - protected final ImageView mBg; - private final int mColorActive; - private final int mColorInactive; - private int mCircleColor; - private int mBgSize; - - private static final int INVALID = -1; - private CharSequence mStateDescriptionDeltas = null; - private CharSequence mLastStateDescription; - private int mLastState = INVALID; - - public QSTileBaseView(Context context, QSIconView icon) { - this(context, icon, false); - } - - public QSTileBaseView(Context context, QSIconView icon, boolean collapsedView) { - super(context); - // Default to Quick Tile padding, and QSTileView will specify its own padding. - int padding = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_padding); - mIconFrame = new FrameLayout(context); - mStrokeWidthActive = context.getResources() - .getDimension(com.android.internal.R.dimen.config_qsTileStrokeWidthActive); - mStrokeWidthInactive = context.getResources() - .getDimension(com.android.internal.R.dimen.config_qsTileStrokeWidthInactive); - int size = context.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size); - addView(mIconFrame, new LayoutParams(size, size)); - mBg = new ImageView(getContext()); - Path path = new Path(PathParser.createPathFromPathData( - context.getResources().getString(ICON_MASK_ID))); - float pathSize = AdaptiveIconDrawable.MASK_SIZE; - PathShape p = new PathShape(path, pathSize, pathSize); - ShapeDrawable d = new ShapeDrawable(p); - d.setTintList(ColorStateList.valueOf(Color.TRANSPARENT)); - float backgroundStrokeWidth = context.getResources() - .getDimension(R.dimen.qs_tile_icon_background_stroke_width); - if (backgroundStrokeWidth > 0) { - d.getPaint().setStyle(Paint.Style.STROKE); - d.getPaint().setStrokeWidth(backgroundStrokeWidth); - } - int bgSize = context.getResources().getDimensionPixelSize(R.dimen.qs_tile_background_size); - d.setIntrinsicHeight(bgSize); - d.setIntrinsicWidth(bgSize); - mBg.setImageDrawable(d); - FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(bgSize, bgSize, Gravity.CENTER); - mIconFrame.addView(mBg, lp); - mBg.setLayoutParams(lp); - mIcon = icon; - FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, - Gravity.CENTER); - mIconFrame.addView(mIcon, params); - mIconFrame.setClipChildren(false); - mIconFrame.setClipToPadding(false); - - mTileBackground = newTileBackground(); - if (mTileBackground instanceof RippleDrawable) { - setRipple((RippleDrawable) mTileBackground); - } - setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_YES); - setBackground(mTileBackground); - - mColorActive = Utils.getColorAttrDefaultColor(context, - com.android.internal.R.attr.colorAccentPrimary); - mColorInactive = Utils.getColorAttrDefaultColor(context, R.attr.offStateColor); - - setPadding(0, 0, 0, 0); - setClipChildren(false); - setClipToPadding(false); - mCollapsedView = collapsedView; - setFocusable(true); - } - - public View getBgCircle() { - return mBg; - } - - protected Drawable newTileBackground() { - final int[] attrs = new int[]{android.R.attr.selectableItemBackgroundBorderless}; - final TypedArray ta = getContext().obtainStyledAttributes(attrs); - final Drawable d = ta.getDrawable(0); - ta.recycle(); - return d; - } - - private void setRipple(RippleDrawable tileBackground) { - mRipple = tileBackground; - if (getWidth() != 0) { - updateRippleSize(); - } - } - - protected void updateRippleSize() { - // center the touch feedback on the center of the icon, and dial it down a bit - final int cx = mIconFrame.getMeasuredWidth() / 2 + mIconFrame.getLeft(); - final int cy = mIconFrame.getMeasuredHeight() / 2 + mIconFrame.getTop(); - final int rad = (int) (mIcon.getHeight() * .85f); - mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad); - } - - @Override - public void init(QSTile tile) { - init(v -> tile.click(this), v -> tile.secondaryClick(this), view -> { - tile.longClick(this); - return true; - }); - } - - public void init(OnClickListener click, OnClickListener secondaryClick, - OnLongClickListener longClick) { - setOnClickListener(click); - setOnLongClickListener(longClick); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - super.onLayout(changed, l, t, r, b); - if (mRipple != null) { - updateRippleSize(); - } - } - - @Override - public boolean hasOverlappingRendering() { - // Avoid layers for this layout - we don't need them. - return false; - } - - /** - * Update the accessibility order for this view. - * - * @param previousView the view which should be before this one - * @return the last view in this view which is accessible - */ - public View updateAccessibilityOrder(View previousView) { - setAccessibilityTraversalAfter(previousView.getId()); - return this; - } - - public void onStateChanged(QSTile.State state) { - mHandler.obtainMessage(H.STATE_CHANGED, state).sendToTarget(); - } - - private void updateStrokeShapeWidth(QSTile.State state) { - Resources resources = getContext().getResources(); - if (!(mBg.getDrawable() instanceof ShapeDrawable)) { - return; - } - ShapeDrawable d = (ShapeDrawable) mBg.getDrawable(); - d.getPaint().setStyle(Paint.Style.FILL); - switch (state.state) { - case Tile.STATE_INACTIVE: - if (mStrokeWidthInactive >= 0) { - d.getPaint().setStyle(Paint.Style.STROKE); - d.getPaint().setStrokeWidth(mStrokeWidthInactive); - } - break; - case Tile.STATE_ACTIVE: - if (mStrokeWidthActive >= 0) { - d.getPaint().setStyle(Paint.Style.STROKE); - d.getPaint().setStrokeWidth(mStrokeWidthActive); - } - break; - } - } - - protected void handleStateChanged(QSTile.State state) { - updateStrokeShapeWidth(state); - int circleColor = getCircleColor(state.state); - boolean allowAnimations = animationsEnabled(); - if (circleColor != mCircleColor) { - if (allowAnimations) { - ValueAnimator animator = ValueAnimator.ofArgb(mCircleColor, circleColor) - .setDuration(QS_ANIM_LENGTH); - animator.addUpdateListener(animation -> mBg.setImageTintList(ColorStateList.valueOf( - (Integer) animation.getAnimatedValue()))); - animator.start(); - } else { - QSIconViewImpl.setTint(mBg, circleColor); - } - mCircleColor = circleColor; - } - - mShowRippleEffect = state.showRippleEffect; - setClickable(state.state != Tile.STATE_UNAVAILABLE); - setLongClickable(state.handlesLongClick); - mIcon.setIcon(state, allowAnimations); - setContentDescription(state.contentDescription); - final StringBuilder stateDescription = new StringBuilder(); - String text = ""; - switch (state.state) { - case Tile.STATE_UNAVAILABLE: - text = mContext.getString(R.string.tile_unavailable); - break; - case Tile.STATE_INACTIVE: - if (state instanceof QSTile.BooleanState) { - text = mContext.getString(R.string.switch_bar_off); - } - break; - case Tile.STATE_ACTIVE: - if (state instanceof QSTile.BooleanState) { - text = mContext.getString(R.string.switch_bar_on); - } - break; - default: - break; - } - if (!TextUtils.isEmpty(text)) { - stateDescription.append(text); - if (TextUtils.isEmpty(state.secondaryLabel)) { - state.secondaryLabel = text; - } - } - if (!TextUtils.isEmpty(state.stateDescription)) { - stateDescription.append(", "); - stateDescription.append(state.stateDescription); - if (mLastState != INVALID && state.state == mLastState - && !state.stateDescription.equals(mLastStateDescription)) { - mStateDescriptionDeltas = state.stateDescription; - } - } - setStateDescription(stateDescription.toString()); - mLastState = state.state; - mLastStateDescription = state.stateDescription; - - mAccessibilityClass = - state.state == Tile.STATE_UNAVAILABLE ? null : state.expandedAccessibilityClassName; - if (state instanceof QSTile.BooleanState) { - boolean newState = ((BooleanState) state).value; - if (mTileState != newState) { - mTileState = newState; - } - } - } - - /* The view should not be animated if it's not on screen and no part of it is visible. - */ - protected boolean animationsEnabled() { - if (!isShown()) { - return false; - } - if (getAlpha() != 1f) { - return false; - } - getLocationOnScreen(mLocInScreen); - return mLocInScreen[1] >= -getHeight(); - } - - protected int getCircleColor(int state) { - switch (state) { - case Tile.STATE_ACTIVE: - return mColorActive; - case Tile.STATE_INACTIVE: - case Tile.STATE_UNAVAILABLE: - return mColorInactive; - default: - Log.e(TAG, "Invalid state " + state); - return 0; - } - } - - @Override - public void setClickable(boolean clickable) { - super.setClickable(clickable); - setBackground(clickable && mShowRippleEffect ? mRipple : null); - } - - @Override - public int getDetailY() { - return getTop() + getHeight() / 2; - } - - public QSIconView getIcon() { - return mIcon; - } - - public View getIconWithBackground() { - return mIconFrame; - } - - @Override - public void onInitializeAccessibilityEvent(AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(event); - if (!TextUtils.isEmpty(mAccessibilityClass)) { - event.setClassName(mAccessibilityClass); - } - if (event.getContentChangeTypes() == CONTENT_CHANGE_TYPE_STATE_DESCRIPTION - && mStateDescriptionDeltas != null) { - event.getText().add(mStateDescriptionDeltas); - mStateDescriptionDeltas = null; - } - } - - @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - // Clear selected state so it is not announce by talkback. - info.setSelected(false); - if (!TextUtils.isEmpty(mAccessibilityClass)) { - info.setClassName(mAccessibilityClass); - if (Switch.class.getName().equals(mAccessibilityClass)) { - String label = getResources().getString( - mTileState ? R.string.switch_bar_on : R.string.switch_bar_off); - // Set the text here for tests in - // android.platform.test.scenario.sysui.quicksettings. Can be removed when - // UiObject2 has a new getStateDescription() API and tests are updated. - info.setText(label); - info.setChecked(mTileState); - info.setCheckable(true); - if (isLongClickable()) { - info.addAction( - new AccessibilityNodeInfo.AccessibilityAction( - AccessibilityNodeInfo.AccessibilityAction - .ACTION_LONG_CLICK.getId(), - getResources().getString( - R.string.accessibility_long_click_tile))); - } - } - } - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(getClass().getSimpleName()).append('['); - sb.append("locInScreen=(" + mLocInScreen[0] + ", " + mLocInScreen[1] + ")"); - sb.append(", iconView=" + mIcon.toString()); - sb.append(", tileState=" + mTileState); - sb.append("]"); - return sb.toString(); - } - - private class H extends Handler { - private static final int STATE_CHANGED = 1; - - public H() { - super(Looper.getMainLooper()); - } - - @Override - public void handleMessage(Message msg) { - if (msg.what == STATE_CHANGED) { - handleStateChanged((QSTile.State) msg.obj); - } - } - } -} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 5ff785dc32d97..47d80bb0d16fb 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -38,7 +38,6 @@ import android.metrics.LogMaker; import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.service.quicksettings.Tile; import android.text.format.DateUtils; import android.util.ArraySet; import android.util.Log; @@ -56,7 +55,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.settingslib.Utils; import com.android.systemui.Dumpable; import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.plugins.ActivityStarter; @@ -563,21 +561,6 @@ public abstract class QSTileImpl implements QSTile, Lifecy return mReadyState == READY_STATE_READY; } - public static int getColorForState(Context context, int state) { - switch (state) { - case Tile.STATE_UNAVAILABLE: - return Utils.getDisabled(context, - Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary)); - case Tile.STATE_INACTIVE: - return Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary); - case Tile.STATE_ACTIVE: - return Utils.getColorAttrDefaultColor(context, android.R.attr.colorPrimary); - default: - Log.e("QSTile", "Invalid state " + state); - return 0; - } - } - protected final class H extends Handler { private static final int ADD_CALLBACK = 1; private static final int CLICK = 2; diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java deleted file mode 100644 index 50417e9ab2592..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (C) 2017 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.qs.tileimpl; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.content.res.Configuration; -import android.service.quicksettings.Tile; -import android.text.TextUtils; -import android.view.Gravity; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import androidx.annotation.Nullable; - -import com.android.settingslib.Utils; -import com.android.systemui.FontSizeUtils; -import com.android.systemui.R; -import com.android.systemui.plugins.qs.QSIconView; -import com.android.systemui.plugins.qs.QSTile; - -import java.util.Objects; - -/** View that represents a standard quick settings tile. **/ -public class QSTileView extends QSTileBaseView { - protected int mMaxLabelLines = 2; - private View mDivider; - protected TextView mLabel; - protected TextView mSecondLine; - private ImageView mPadLock; - protected int mState; - protected ButtonRelativeLayout mLabelContainer; - private View mExpandIndicator; - private View mExpandSpace; - protected ColorStateList mColorLabelActive; - protected ColorStateList mColorLabelInactive; - private ColorStateList mColorLabelUnavailable; - protected boolean mDualTargetAllowed = false; - - public QSTileView(Context context, QSIconView icon) { - this(context, icon, false); - } - - public QSTileView(Context context, QSIconView icon, boolean collapsedView) { - super(context, icon, collapsedView); - - setClipChildren(false); - setClipToPadding(false); - - setClickable(true); - setId(View.generateViewId()); - createLabel(); - setOrientation(VERTICAL); - setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP); - mColorLabelActive = Utils.getColorAttr(getContext(), android.R.attr.textColorPrimary); - mColorLabelInactive = mColorLabelActive; - // The text color for unavailable tiles is textColorSecondary, same as secondaryLabel for - // contrast purposes - mColorLabelUnavailable = Utils.getColorAttr(getContext(), - android.R.attr.textColorSecondary); - } - - TextView getLabel() { - return mLabel; - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - FontSizeUtils.updateFontSize(mLabel, R.dimen.qs_tile_text_size); - FontSizeUtils.updateFontSize(mSecondLine, R.dimen.qs_tile_text_size); - } - - @Override - public int getDetailY() { - return getTop() + mLabelContainer.getTop() + mLabelContainer.getHeight() / 2; - } - - protected void createLabel() { - mLabelContainer = (ButtonRelativeLayout) LayoutInflater.from(getContext()) - .inflate(R.layout.qs_tile_label, this, false); - mLabelContainer.setClipChildren(false); - mLabelContainer.setClipToPadding(false); - mLabel = mLabelContainer.findViewById(R.id.tile_label); - mPadLock = mLabelContainer.findViewById(R.id.restricted_padlock); - mDivider = mLabelContainer.findViewById(R.id.underline); - mExpandIndicator = mLabelContainer.findViewById(R.id.expand_indicator); - mExpandSpace = mLabelContainer.findViewById(R.id.expand_space); - mSecondLine = mLabelContainer.findViewById(R.id.app_label); - addView(mLabelContainer); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - mLabel.setSingleLine(false); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - // Remeasure view if the primary label requires more than mMaxLabelLines lines or the - // secondary label text will be cut off. - if (shouldLabelBeSingleLine()) { - mLabel.setSingleLine(); - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - } - } - - protected boolean shouldLabelBeSingleLine() { - if (mCollapsedView) return true; - if (mLabel.getLineCount() > mMaxLabelLines) { - return true; - } else if (!TextUtils.isEmpty(mSecondLine.getText()) - && mLabel.getLineCount() > mMaxLabelLines - 1) { - return true; - } - return false; - } - - @Override - protected void handleStateChanged(QSTile.State state) { - super.handleStateChanged(state); - if (!Objects.equals(mLabel.getText(), state.label) || mState != state.state) { - ColorStateList labelColor = getLabelColor(state.state); - changeLabelColor(labelColor); - mState = state.state; - mLabel.setText(state.label); - } - if (!Objects.equals(mSecondLine.getText(), state.secondaryLabel)) { - mSecondLine.setText(state.secondaryLabel); - mSecondLine.setVisibility(TextUtils.isEmpty(state.secondaryLabel) - ? View.GONE : View.VISIBLE); - } - boolean dualTarget = mDualTargetAllowed && state.dualTarget; - handleExpand(dualTarget); - mLabelContainer.setContentDescription(dualTarget ? state.dualLabelContentDescription - : null); - if (dualTarget != mLabelContainer.isClickable()) { - mLabelContainer.setClickable(dualTarget); - mLabelContainer.setLongClickable(dualTarget); - mLabelContainer.setBackground(dualTarget ? newTileBackground() : null); - } - mLabel.setEnabled(!state.disabledByPolicy); - mPadLock.setVisibility(state.disabledByPolicy ? View.VISIBLE : View.GONE); - } - - protected final ColorStateList getLabelColor(int state) { - if (state == Tile.STATE_ACTIVE) { - return mColorLabelActive; - } else if (state == Tile.STATE_INACTIVE) { - return mColorLabelInactive; - } - return mColorLabelUnavailable; - } - - protected void changeLabelColor(ColorStateList color) { - mLabel.setTextColor(color); - } - - protected void handleExpand(boolean dualTarget) { - mExpandIndicator.setVisibility(dualTarget ? View.VISIBLE : View.GONE); - mExpandSpace.setVisibility(dualTarget ? View.VISIBLE : View.GONE); - } - - @Override - public void init(OnClickListener click, OnClickListener secondaryClick, - OnLongClickListener longClick) { - super.init(click, secondaryClick, longClick); - mLabelContainer.setOnClickListener(secondaryClick); - mLabelContainer.setOnLongClickListener(longClick); - mLabelContainer.setClickable(false); - mLabelContainer.setLongClickable(false); - } - - public TextView getAppLabel() { - return mSecondLine; - } - - @Nullable - @Override - public View getLabelContainer() { - return mLabelContainer; - } - - @Override - public View getSecondaryLabel() { - return mSecondLine; - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt deleted file mode 100644 index 70d51ee1c516b..0000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewHorizontal.kt +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright (C) 2020 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.qs.tileimpl - -import android.animation.ValueAnimator -import android.content.Context -import android.content.res.ColorStateList -import android.graphics.Color -import android.graphics.drawable.Drawable -import android.graphics.drawable.RippleDrawable -import android.service.quicksettings.Tile.STATE_ACTIVE -import android.view.Gravity -import android.view.View -import android.view.ViewGroup.LayoutParams.WRAP_CONTENT -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.RelativeLayout -import com.android.systemui.R -import com.android.systemui.plugins.qs.QSIconView -import com.android.systemui.plugins.qs.QSTile -import com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState - -open class QSTileViewHorizontal( - context: Context, - icon: QSIconView, - collapsed: Boolean -) : QSTileView(context, icon, collapsed), HeightOverrideable { - - protected var colorBackgroundDrawable: Drawable? = null - private var paintColor = Color.WHITE - private var paintAnimator: ValueAnimator? = null - private var labelAnimator: ValueAnimator? = null - private var sideView: ImageView = ImageView(mContext) - override var heightOverride: Int = HeightOverrideable.NO_OVERRIDE - - init { - orientation = HORIZONTAL - gravity = Gravity.CENTER_VERTICAL or Gravity.START - mDualTargetAllowed = false - val padding = context.resources.getDimensionPixelSize(R.dimen.qs_tile_side_label_padding) - setPadding(padding, paddingTop, padding, paddingBottom) - - mBg.setImageDrawable(null) - mIconFrame.removeAllViews() - removeView(mIconFrame) - val iconSize = context.resources.getDimensionPixelSize(R.dimen.qs_icon_size) - addView(mIcon, 0, LayoutParams(iconSize, iconSize)) - - sideView.visibility = View.GONE - val sideViewLayoutParams = LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply { - gravity = Gravity.CENTER_VERTICAL - marginStart = context.resources.getDimensionPixelSize(R.dimen.qs_label_container_margin) - } - addView(sideView, -1, sideViewLayoutParams) - sideView.adjustViewBounds = true - sideView.scaleType = ImageView.ScaleType.FIT_CENTER - - mColorLabelActive = ColorStateList.valueOf(getColorForState(getContext(), STATE_ACTIVE)) - changeLabelColor(getLabelColor(mState)) // Matches the default state of the tile - } - - override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { - super.onLayout(changed, l, t, r, b) - if (heightOverride != HeightOverrideable.NO_OVERRIDE) { - bottom = top + heightOverride - } - } - - override fun createLabel() { - super.createLabel() - findViewById(R.id.label_group)?.apply { - gravity = Gravity.START - (layoutParams as? RelativeLayout.LayoutParams)?.apply { - removeRule(RelativeLayout.ALIGN_PARENT_TOP) - } - } - mLabelContainer.setPadding(0, 0, 0, 0) - (mLabelContainer.layoutParams as MarginLayoutParams).apply { - marginStart = context.resources.getDimensionPixelSize(R.dimen.qs_label_container_margin) - marginEnd = 0 - gravity = Gravity.CENTER_VERTICAL or Gravity.START - } - mLabel.gravity = Gravity.START - mLabel.textDirection = TEXT_DIRECTION_LOCALE - mSecondLine.gravity = Gravity.START - mSecondLine.textDirection = TEXT_DIRECTION_LOCALE - - if (mCollapsedView) { - mSecondLine.alpha = 0f - mLabelContainer.setIgnoredView(mSecondLine) - } - } - - override fun shouldLabelBeSingleLine(): Boolean { - return true - } - - override fun updateRippleSize() { - } - - override fun newTileBackground(): Drawable? { - val ripple = mContext.getDrawable(R.drawable.qs_tile_background) as RippleDrawable - colorBackgroundDrawable = ripple.findDrawableByLayerId(R.id.background) - return ripple - } - - override fun setClickable(clickable: Boolean) { - super.setClickable(clickable) - background = if (clickable && mShowRippleEffect) { - mRipple?.also { - // In case that the colorBackgroundDrawable was used as the background, make sure - // it has the correct callback instead of null - colorBackgroundDrawable?.callback = it - } - } else { - colorBackgroundDrawable - } - } - - override fun handleStateChanged(state: QSTile.State) { - super.handleStateChanged(state) - mLabelContainer.background = null - - val allowAnimations = animationsEnabled() && paintColor != Color.WHITE - val newColor = getCircleColor(state.state) - if (allowAnimations) { - animateBackground(newColor) - } else { - clearBackgroundAnimator() - colorBackgroundDrawable?.setTintList(ColorStateList.valueOf(newColor))?.also { - paintColor = newColor - } - paintColor = newColor - } - loadSideViewDrawableIfNecessary(state) - } - - private fun animateBackground(newBackgroundColor: Int) { - if (newBackgroundColor != paintColor) { - clearBackgroundAnimator() - paintAnimator = ValueAnimator.ofArgb(paintColor, newBackgroundColor) - .setDuration(QSIconViewImpl.QS_ANIM_LENGTH).apply { - addUpdateListener { animation: ValueAnimator -> - val c = animation.animatedValue as Int - colorBackgroundDrawable?.setTintList(ColorStateList.valueOf(c))?.also { - paintColor = c - } - } - start() - } - } - } - - override fun changeLabelColor(color: ColorStateList) { - val allowAnimations = animationsEnabled() - val currentColor = mLabel.textColors.defaultColor - if (currentColor != color.defaultColor) { - clearLabelAnimator() - if (allowAnimations) { - labelAnimator = ValueAnimator.ofArgb(currentColor, color.defaultColor) - .setDuration(QSIconViewImpl.QS_ANIM_LENGTH).apply { - addUpdateListener { - setLabelsColor(ColorStateList.valueOf(it.animatedValue as Int)) - } - start() - } - } else { - setLabelsColor(color) - } - } - } - - private fun setLabelsColor(color: ColorStateList) { - mLabel.setTextColor(color) - mSecondLine.setTextColor(color) - } - - private fun clearBackgroundAnimator() { - paintAnimator?.cancel()?.also { paintAnimator = null } - } - - private fun clearLabelAnimator() { - labelAnimator?.cancel()?.also { labelAnimator = null } - } - - private fun loadSideViewDrawableIfNecessary(state: QSTile.State) { - if (state.sideViewDrawable != null) { - sideView.setImageDrawable(state.sideViewDrawable) - sideView.visibility = View.VISIBLE - } else { - sideView.setImageDrawable(null) - sideView.visibility = GONE - } - } - - override fun handleExpand(dualTarget: Boolean) {} - - override fun getSecondaryIcon(): View { - return sideView - } -} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt new file mode 100644 index 0000000000000..954321e50587c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt @@ -0,0 +1,516 @@ +/* + * 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.qs.tileimpl + +import android.animation.ValueAnimator +import android.content.Context +import android.content.res.ColorStateList +import android.content.res.Configuration +import android.content.res.Resources.ID_NULL +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.graphics.drawable.RippleDrawable +import android.service.quicksettings.Tile +import android.text.TextUtils +import android.util.Log +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityNodeInfo +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.Switch +import android.widget.TextView +import com.android.settingslib.Utils +import com.android.systemui.FontSizeUtils +import com.android.systemui.R +import com.android.systemui.plugins.qs.QSIconView +import com.android.systemui.plugins.qs.QSTile +import com.android.systemui.plugins.qs.QSTile.BooleanState +import com.android.systemui.plugins.qs.QSTileView +import java.util.Objects + +private const val TAG = "QSTileViewImpl" +open class QSTileViewImpl @JvmOverloads constructor( + context: Context, + private val _icon: QSIconView, + private val collapsed: Boolean = false +) : QSTileView(context), HeightOverrideable { + + companion object { + private const val INVALID = -1 + } + + override var heightOverride: Int = HeightOverrideable.NO_OVERRIDE + + private val colorActive = Utils.getColorAttrDefaultColor(context, + com.android.internal.R.attr.colorAccentPrimary) + private val colorInactive = Utils.getColorAttrDefaultColor(context, R.attr.offStateColor) + private val colorUnavailable = + Utils.getColorAttrDefaultColor(context, android.R.attr.colorBackground) + + private val colorLabelActive = + Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimaryInverse) + private val colorLabelInactive = + Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary) + private val colorLabelUnavailable = + Utils.getColorAttrDefaultColor(context, android.R.attr.textColorTertiary) + + private val sideView = ImageView(context) + private lateinit var label: TextView + protected lateinit var secondaryLabel: TextView + private lateinit var labelContainer: IgnorableChildLinearLayout + + protected var showRippleEffect = true + + private lateinit var ripple: RippleDrawable + private lateinit var colorBackgroundDrawable: Drawable + private var paintColor = Color.WHITE + private var paintAnimator: ValueAnimator? = null + private var labelAnimator: ValueAnimator? = null + private var secondaryLabelAnimator: ValueAnimator? = null + + private var accessibilityClass: String? = null + private var stateDescriptionDeltas: CharSequence? = null + private var lastStateDescription: CharSequence? = null + private var tileState = false + private var lastState = INVALID + + private val locInScreen = IntArray(2) + + init { + setId(generateViewId()) + orientation = LinearLayout.HORIZONTAL + gravity = Gravity.CENTER_VERTICAL or Gravity.START + importantForAccessibility = IMPORTANT_FOR_ACCESSIBILITY_YES + clipChildren = false + clipToPadding = false + isFocusable = true + background = createTileBackground() + + val padding = resources.getDimensionPixelSize(R.dimen.qs_tile_padding) + val startPadding = resources.getDimensionPixelSize(R.dimen.qs_tile_start_padding) + setPaddingRelative(startPadding, padding, padding, padding) + + val iconSize = resources.getDimensionPixelSize(R.dimen.qs_icon_size) + addView(_icon, LayoutParams(iconSize, iconSize)) + + createAndAddLabels() + + sideView.visibility = GONE + val sideViewLayoutParams = LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ).apply { + gravity = Gravity.CENTER_VERTICAL + marginStart = resources.getDimensionPixelSize(R.dimen.qs_label_container_margin) + } + addView(sideView, sideViewLayoutParams) + sideView.adjustViewBounds = true + sideView.scaleType = ImageView.ScaleType.FIT_CENTER + } + + override fun onConfigurationChanged(newConfig: Configuration?) { + super.onConfigurationChanged(newConfig) + FontSizeUtils.updateFontSize(label, R.dimen.qs_tile_text_size) + FontSizeUtils.updateFontSize(secondaryLabel, R.dimen.qs_tile_text_size) + + val iconSize = context.resources.getDimensionPixelSize(R.dimen.qs_icon_size) + _icon.layoutParams.apply { + height = iconSize + width = iconSize + } + + val padding = resources.getDimensionPixelSize(R.dimen.qs_tile_padding) + val startPadding = resources.getDimensionPixelSize(R.dimen.qs_tile_start_padding) + setPaddingRelative(startPadding, padding, padding, padding) + + val labelMargin = context.resources.getDimensionPixelSize(R.dimen.qs_label_container_margin) + (labelContainer.layoutParams as MarginLayoutParams).apply { + marginStart = labelMargin + } + (sideView.layoutParams as MarginLayoutParams).apply { + marginStart = labelMargin + } + } + + private fun createAndAddLabels() { + labelContainer = LayoutInflater.from(context) + .inflate(R.layout.qs_tile_label, this, false) as IgnorableChildLinearLayout + label = labelContainer.requireViewById(R.id.tile_label) + secondaryLabel = labelContainer.requireViewById(R.id.app_label) + if (collapsed) { + labelContainer.ignoreLastView = true + secondaryLabel.alpha = 0f + } + label.setTextColor(getLabelColor(0)) // Default state + secondaryLabel.setTextColor(getSecondaryLabelColor(0)) + addView(labelContainer) + } + + fun createTileBackground(): Drawable { + ripple = mContext.getDrawable(R.drawable.qs_tile_background) as RippleDrawable + colorBackgroundDrawable = ripple.findDrawableByLayerId(R.id.background) + return ripple + } + + override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { + super.onLayout(changed, l, t, r, b) + if (heightOverride != HeightOverrideable.NO_OVERRIDE) { + bottom = top + heightOverride + } + } + + override fun updateAccessibilityOrder(previousView: View?): View { + accessibilityTraversalAfter = previousView?.id ?: ID_NULL + return this + } + + override fun getIcon(): QSIconView { + return _icon + } + + override fun getIconWithBackground(): View { + return icon + } + + override fun init(tile: QSTile) { + init( + { v: View? -> tile.click(this) }, + { view: View? -> + tile.longClick(this) + true + } + ) + } + + private fun init( + click: OnClickListener?, + longClick: OnLongClickListener? + ) { + setOnClickListener(click) + onLongClickListener = longClick + } + + override fun onStateChanged(state: QSTile.State) { + post { + handleStateChanged(state) + } + } + + override fun getDetailY(): Int { + return top + height / 2 + } + + override fun hasOverlappingRendering(): Boolean { + // Avoid layers for this layout - we don't need them. + return false + } + + override fun setClickable(clickable: Boolean) { + super.setClickable(clickable) + background = if (clickable && showRippleEffect) { + ripple.also { + // In case that the colorBackgroundDrawable was used as the background, make sure + // it has the correct callback instead of null + colorBackgroundDrawable.callback = it + } + } else { + colorBackgroundDrawable + } + } + + override fun getLabelContainer(): View { + return labelContainer + } + + override fun getSecondaryLabel(): View { + return secondaryLabel + } + + override fun getSecondaryIcon(): View { + return sideView + } + + // Accessibility + + override fun onInitializeAccessibilityEvent(event: AccessibilityEvent) { + super.onInitializeAccessibilityEvent(event) + if (!TextUtils.isEmpty(accessibilityClass)) { + event.className = accessibilityClass + } + if (event.contentChangeTypes == AccessibilityEvent.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION && + stateDescriptionDeltas != null) { + event.text.add(stateDescriptionDeltas) + stateDescriptionDeltas = null + } + } + + override fun onInitializeAccessibilityNodeInfo(info: AccessibilityNodeInfo) { + super.onInitializeAccessibilityNodeInfo(info) + // Clear selected state so it is not announce by talkback. + info.isSelected = false + if (!TextUtils.isEmpty(accessibilityClass)) { + info.className = accessibilityClass + if (Switch::class.java.name == accessibilityClass) { + val label = resources.getString( + if (tileState) R.string.switch_bar_on else R.string.switch_bar_off) + // Set the text here for tests in + // android.platform.test.scenario.sysui.quicksettings. Can be removed when + // UiObject2 has a new getStateDescription() API and tests are updated. + info.text = label + info.isChecked = tileState + info.isCheckable = true + if (isLongClickable) { + info.addAction( + AccessibilityNodeInfo.AccessibilityAction( + AccessibilityNodeInfo.AccessibilityAction.ACTION_LONG_CLICK.id, + resources.getString( + R.string.accessibility_long_click_tile))) + } + } + } + } + + override fun toString(): String { + val sb = StringBuilder(javaClass.simpleName).append('[') + sb.append("locInScreen=(${locInScreen[0]}, ${locInScreen[1]})") + sb.append(", iconView=$_icon") + sb.append(", tileState=$tileState") + sb.append("]") + return sb.toString() + } + + // HANDLE STATE CHANGES RELATED METHODS + + protected open fun handleStateChanged(state: QSTile.State) { + val allowAnimations = animationsEnabled() && paintColor != Color.WHITE + showRippleEffect = state.showRippleEffect + isClickable = state.state != Tile.STATE_UNAVAILABLE + isLongClickable = state.handlesLongClick + icon.setIcon(state, allowAnimations) + contentDescription = state.contentDescription + + // Background color animation + val newColor = getCircleColor(state.state) + if (allowAnimations) { + animateBackground(newColor) + } else { + clearBackgroundAnimator() + colorBackgroundDrawable.setTintList(ColorStateList.valueOf(newColor)).also { + paintColor = newColor + } + paintColor = newColor + } + // + + // State handling and description + val stateDescription = StringBuilder() + val stateText = getStateText(state) + if (!TextUtils.isEmpty(stateText)) { + stateDescription.append(stateText) + if (TextUtils.isEmpty(state.secondaryLabel)) { + state.secondaryLabel = stateText + } + } + if (!TextUtils.isEmpty(state.stateDescription)) { + stateDescription.append(", ") + stateDescription.append(state.stateDescription) + if (lastState != INVALID && state.state == lastState && + state.stateDescription != lastStateDescription) { + stateDescriptionDeltas = state.stateDescription + } + } + + setStateDescription(stateDescription.toString()) + lastStateDescription = state.stateDescription + + accessibilityClass = if (state.state == Tile.STATE_UNAVAILABLE) { + null + } else { + state.expandedAccessibilityClassName + } + + if (state is BooleanState) { + val newState = state.value + if (tileState != newState) { + tileState = newState + } + } + // + + // Labels + if (!Objects.equals(label.text, state.label)) { + label.text = state.label + } + if (!Objects.equals(secondaryLabel.text, state.secondaryLabel)) { + secondaryLabel.text = state.secondaryLabel + secondaryLabel.visibility = if (TextUtils.isEmpty(state.secondaryLabel)) { + GONE + } else { + VISIBLE + } + } + + if (allowAnimations) { + animateLabelColor(getLabelColor(state.state)) + animateSecondaryLabelColor(getSecondaryLabelColor(state.state)) + } else { + label.setTextColor(getLabelColor(state.state)) + secondaryLabel.setTextColor(getSecondaryLabelColor(state.state)) + } + + label.isEnabled = !state.disabledByPolicy + + loadSideViewDrawableIfNecessary(state) + + lastState = state.state + } + + private fun loadSideViewDrawableIfNecessary(state: QSTile.State) { + if (state.sideViewDrawable != null) { + sideView.setImageDrawable(state.sideViewDrawable) + sideView.visibility = View.VISIBLE + } else { + sideView.setImageDrawable(null) + sideView.visibility = GONE + } + } + + private fun getStateText(state: QSTile.State): String { + return if (state.disabledByPolicy) { + context.getString(R.string.tile_disabled) + } else if (state.state == Tile.STATE_UNAVAILABLE) { + context.getString(R.string.tile_unavailable) + } else if (state is BooleanState) { + if (state.state == Tile.STATE_INACTIVE) { + context.getString(R.string.switch_bar_off) + } else { + context.getString(R.string.switch_bar_on) + } + } else { + "" + } + } + + /* + * The view should not be animated if it's not on screen and no part of it is visible. + */ + protected open fun animationsEnabled(): Boolean { + if (!isShown) { + return false + } + if (alpha != 1f) { + return false + } + getLocationOnScreen(locInScreen) + return locInScreen.get(1) >= -height + } + + private fun animateBackground(newBackgroundColor: Int) { + if (newBackgroundColor != paintColor) { + clearBackgroundAnimator() + paintAnimator = ValueAnimator.ofArgb(paintColor, newBackgroundColor) + .setDuration(QSIconViewImpl.QS_ANIM_LENGTH).apply { + addUpdateListener { animation: ValueAnimator -> + val c = animation.animatedValue as Int + colorBackgroundDrawable.setTintList(ColorStateList.valueOf(c)).also { + paintColor = c + } + } + start() + } + } + } + + private fun animateLabelColor(color: Int) { + val currentColor = label.textColors.defaultColor + if (currentColor != color) { + clearLabelAnimator() + labelAnimator = ValueAnimator.ofArgb(currentColor, color) + .setDuration(QSIconViewImpl.QS_ANIM_LENGTH).apply { + addUpdateListener { + label.setTextColor(it.animatedValue as Int) + } + start() + } + } + } + + private fun animateSecondaryLabelColor(color: Int) { + val currentColor = secondaryLabel.textColors.defaultColor + if (currentColor != color) { + clearSecondaryLabelAnimator() + secondaryLabelAnimator = ValueAnimator.ofArgb(currentColor, color) + .setDuration(QSIconViewImpl.QS_ANIM_LENGTH).apply { + addUpdateListener { + secondaryLabel.setTextColor(it.animatedValue as Int) + } + start() + } + } + } + + private fun clearBackgroundAnimator() { + paintAnimator?.cancel()?.also { paintAnimator = null } + } + + private fun clearLabelAnimator() { + labelAnimator?.cancel()?.also { labelAnimator = null } + } + + private fun clearSecondaryLabelAnimator() { + secondaryLabelAnimator?.cancel()?.also { secondaryLabelAnimator = null } + } + + private fun getCircleColor(state: Int): Int { + return when (state) { + Tile.STATE_ACTIVE -> colorActive + Tile.STATE_INACTIVE -> colorInactive + Tile.STATE_UNAVAILABLE -> colorUnavailable + else -> { + Log.e(TAG, "Invalid state $state") + 0 + } + } + } + + private fun getLabelColor(state: Int): Int { + return when (state) { + Tile.STATE_ACTIVE -> colorLabelActive + Tile.STATE_INACTIVE -> colorLabelInactive + Tile.STATE_UNAVAILABLE -> colorLabelUnavailable + else -> { + Log.e(TAG, "Invalid state $state") + 0 + } + } + } + + private fun getSecondaryLabelColor(state: Int): Int { + return when (state) { + Tile.STATE_ACTIVE -> colorLabelActive + Tile.STATE_INACTIVE, Tile.STATE_UNAVAILABLE -> colorLabelUnavailable + else -> { + Log.e(TAG, "Invalid state $state") + 0 + } + } + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java index d2bbcd50d0e20..cfee3d87a6f97 100644 --- a/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java +++ b/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java @@ -59,6 +59,7 @@ import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; +import com.android.systemui.qs.tileimpl.QSIconViewImpl; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; @@ -298,7 +299,7 @@ public class GarbageMonitor implements Dumpable { MemoryIconDrawable(Context context) { baseIcon = context.getDrawable(R.drawable.ic_memory).mutate(); dp = context.getResources().getDisplayMetrics().density; - paint.setColor(QSTileImpl.getColorForState(context, STATE_ACTIVE)); + paint.setColor(QSIconViewImpl.getIconColorForState(context, STATE_ACTIVE)); } public void setRss(long rss) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java index 54cee847b757a..24e47c5159a00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/TileLayoutTest.java @@ -35,7 +35,7 @@ import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.tileimpl.QSIconViewImpl; -import com.android.systemui.qs.tileimpl.QSTileView; +import com.android.systemui.qs.tileimpl.QSTileViewImpl; import org.junit.Before; import org.junit.Test; @@ -60,7 +60,7 @@ public class TileLayoutTest extends SysuiTestCase { private QSPanelControllerBase.TileRecord createTileRecord() { QSPanelControllerBase.TileRecord tileRecord = new QSPanelControllerBase.TileRecord(); tileRecord.tile = mock(QSTile.class); - tileRecord.tileView = spy(new QSTileView(mContext, new QSIconViewImpl(mContext))); + tileRecord.tileView = spy(new QSTileViewImpl(mContext, new QSIconViewImpl(mContext))); return tileRecord; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileBaseViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt similarity index 84% rename from packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileBaseViewTest.kt rename to packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt index 998e070009cc9..42c89f9eb1834 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileBaseViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileViewImplTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.qs.tileimpl +import android.content.Context import android.service.quicksettings.Tile import android.testing.AndroidTestingRunner import android.text.TextUtils @@ -33,18 +34,18 @@ import org.mockito.MockitoAnnotations @RunWith(AndroidTestingRunner::class) @SmallTest -class QSTileBaseViewTest : SysuiTestCase() { +class QSTileViewImplTest : SysuiTestCase() { @Mock private lateinit var iconView: QSIconView - private lateinit var tileView: QSTileBaseView + private lateinit var tileView: FakeTileView @Before fun setUp() { MockitoAnnotations.initMocks(this) - tileView = QSTileBaseView(context, iconView, false) + tileView = FakeTileView(context, iconView, false) } @Test @@ -54,7 +55,7 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_UNAVAILABLE state.secondaryLabel = testString - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(state.secondaryLabel as CharSequence).isEqualTo(testString) } @@ -66,7 +67,7 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_INACTIVE state.secondaryLabel = testString - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(state.secondaryLabel as CharSequence).isEqualTo(testString) } @@ -78,7 +79,7 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_ACTIVE state.secondaryLabel = testString - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(state.secondaryLabel as CharSequence).isEqualTo(testString) } @@ -89,7 +90,7 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_INACTIVE state.secondaryLabel = "" - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(TextUtils.isEmpty(state.secondaryLabel)).isTrue() } @@ -100,7 +101,7 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_ACTIVE state.secondaryLabel = "" - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(TextUtils.isEmpty(state.secondaryLabel)).isTrue() } @@ -111,7 +112,7 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_UNAVAILABLE state.secondaryLabel = "" - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(state.secondaryLabel as CharSequence).isEqualTo( context.getString(R.string.tile_unavailable) @@ -124,7 +125,7 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_INACTIVE state.secondaryLabel = "" - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(state.secondaryLabel as CharSequence).isEqualTo( context.getString(R.string.switch_bar_off) @@ -137,10 +138,20 @@ class QSTileBaseViewTest : SysuiTestCase() { state.state = Tile.STATE_ACTIVE state.secondaryLabel = "" - tileView.handleStateChanged(state) + tileView.changeState(state) assertThat(state.secondaryLabel as CharSequence).isEqualTo( context.getString(R.string.switch_bar_on) ) } + + class FakeTileView( + context: Context, + icon: QSIconView, + collapsed: Boolean + ) : QSTileViewImpl(context, icon, collapsed) { + fun changeState(state: QSTile.State) { + handleStateChanged(state) + } + } } \ No newline at end of file