Change Chip between QS and QQS

Chip animates via fade out and fade in. No redlines for margins and
padding.

Test: manual

Change-Id: I10f024eb06f88b6493687febdbb0d5ccbba450b8
This commit is contained in:
Fabian Kozynski
2019-02-01 13:49:00 -05:00
parent a4d5484868
commit 216812e981
6 changed files with 66 additions and 20 deletions

View File

@@ -17,6 +17,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#4a4a4a" />
<padding android:padding="@dimen/ongoing_appops_chip_bg_padding" />
<padding android:paddingTop="@dimen/ongoing_appops_chip_bg_padding"
android:paddingBottom="@dimen/ongoing_appops_chip_bg_padding"/>
<corners android:radius="@dimen/ongoing_appops_chip_bg_corner_radius" />
</shape>

View File

@@ -29,14 +29,25 @@
android:orientation="horizontal"
android:paddingStart="@dimen/ongoing_appops_chip_side_padding"
android:paddingEnd="@dimen/ongoing_appops_chip_side_padding"
android:background="@drawable/privacy_chip_bg"
android:focusable="true">
<TextView
android:id="@+id/in_use_text"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical|start"
android:layout_marginEnd="@dimen/ongoing_appops_chip_icon_margin_collapsed"
android:gravity="center_vertical"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:textColor="@color/status_bar_clock_color"
android:text="@string/ongoing_privacy_chip_in_use"
/>
<LinearLayout
android:id="@+id/icons_container"
android:layout_height="match_parent"
android:layout_width="wrap_content"
android:layout_gravity="center_vertical|start"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
/>
@@ -51,7 +62,7 @@
android:gravity="center_vertical"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
android:textColor="@color/status_bar_clock_color"
android:layout_marginStart="@dimen/ongoing_appops_chip_icon_margin"
android:layout_marginEnd="@dimen/ongoing_appops_chip_icon_margin"
android:layout_marginStart="@dimen/ongoing_appops_chip_icon_margin_collapsed"
android:layout_marginEnd="@dimen/ongoing_appops_chip_icon_margin_collapsed"
/>
</com.android.systemui.privacy.OngoingPrivacyChip>

View File

@@ -967,7 +967,7 @@
<!-- Height and width of App Opp icons in Ongoing App Ops dialog -->
<dimen name="ongoing_appops_dialog_icon_size">24dp</dimen>
<!-- Left margin of App Opp icons in Ongoing App Ops dialog -->
<dimen name="ongoing_appops_dialog_icon_margin">8dp</dimen>
<dimen name="ongoing_appops_dialog_icon_margin">12dp</dimen>
<!-- Height and width of Application icons in Ongoing App Ops dialog -->
<dimen name="ongoing_appops_dialog_app_icon_size">32dp</dimen>
<!-- Height and width of Plus sign in Ongoing App Ops dialog -->
@@ -988,12 +988,14 @@
<dimen name="ongoing_appops_chip_side_padding">6dp</dimen>
<!-- Padding between background of Ongoing App Ops chip and content -->
<dimen name="ongoing_appops_chip_bg_padding">0dp</dimen>
<!-- Margin between icons of Ongoing App Ops chip -->
<dimen name="ongoing_appops_chip_icon_margin">4dp</dimen>
<!-- Margin between icons of Ongoing App Ops chip when QQS-->
<dimen name="ongoing_appops_chip_icon_margin_collapsed">0dp</dimen>
<!-- Margin between icons of Ongoing App Ops chip when QS-->
<dimen name="ongoing_appops_chip_icon_margin_expanded">8dp</dimen>
<!-- Icon size of Ongoing App Ops chip -->
<dimen name="ongoing_appops_chip_icon_size">18dp</dimen>
<!-- Radius of Ongoing App Ops chip corners -->
<dimen name="ongoing_appops_chip_bg_corner_radius">12dp</dimen>
<dimen name="ongoing_appops_chip_bg_corner_radius">4dp</dimen>
<!-- Text size for Ongoing App Ops dialog title -->
<dimen name="ongoing_appops_dialog_title_size">20sp</dimen>
<!-- Text size for Ongoing App Ops dialog items -->

View File

@@ -2301,6 +2301,9 @@
<!-- Content description for ongoing privacy chip. Use with multiple apps [CHAR LIMIT=NONE]-->
<string name="ongoing_privacy_chip_content_multiple_apps">Applications are using your <xliff:g id="types_list" example="camera, location">%s</xliff:g>.</string>
<!-- Ongoing Privacy "Chip" in use text [CHAR LIMIT=10]-->
<string name="ongoing_privacy_chip_in_use">In use:</string>
<!-- Content description for ongoing privacy chip. Use with multiple apps using same app op[CHAR LIMIT=NONE]-->
<plurals name="ongoing_privacy_chip_content_multiple_apps_single_op">
<item quantity="one"><xliff:g id="num_apps" example="1">%1$d</xliff:g> application is using your <xliff:g id="type" example="camera">%2$s</xliff:g>.</item>

View File

@@ -16,6 +16,7 @@ package com.android.systemui.privacy
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
@@ -29,14 +30,25 @@ class OngoingPrivacyChip @JvmOverloads constructor(
defStyleRes: Int = 0
) : LinearLayout(context, attrs, defStyleAttrs, defStyleRes) {
private val iconMargin =
context.resources.getDimensionPixelSize(R.dimen.ongoing_appops_chip_icon_margin)
private val iconMarginExpanded = context.resources.getDimensionPixelSize(
R.dimen.ongoing_appops_chip_icon_margin_expanded)
private val iconMarginCollapsed = context.resources.getDimensionPixelSize(
R.dimen.ongoing_appops_chip_icon_margin_collapsed)
private val iconSize =
context.resources.getDimensionPixelSize(R.dimen.ongoing_appops_chip_icon_size)
val iconColor = context.resources.getColor(
private val iconColor = context.resources.getColor(
R.color.status_bar_clock_color, context.theme)
private val backgroundDrawable = context.getDrawable(R.drawable.privacy_chip_bg)
private lateinit var text: TextView
private lateinit var iconsContainer: LinearLayout
private lateinit var inUseText: TextView
var expanded = false
set(value) {
if (value != field) {
field = value
updateView()
}
}
var builder = PrivacyDialogBuilder(context, emptyList<PrivacyItem>())
var privacyList = emptyList<PrivacyItem>()
set(value) {
@@ -48,15 +60,18 @@ class OngoingPrivacyChip @JvmOverloads constructor(
override fun onFinishInflate() {
super.onFinishInflate()
inUseText = findViewById(R.id.in_use_text)
text = findViewById(R.id.text_container)
iconsContainer = findViewById(R.id.icons_container)
}
// Should only be called if the builder icons or app changed
private fun updateView() {
inUseText.visibility = if (expanded) View.GONE else View.VISIBLE
background = if (expanded) backgroundDrawable else null
fun setIcons(dialogBuilder: PrivacyDialogBuilder, iconsContainer: ViewGroup) {
iconsContainer.removeAllViews()
dialogBuilder.generateIcons().forEach {
dialogBuilder.generateIcons().forEachIndexed { i, it ->
it.mutate()
it.setTint(iconColor)
val image = ImageView(context).apply {
@@ -64,17 +79,19 @@ class OngoingPrivacyChip @JvmOverloads constructor(
scaleType = ImageView.ScaleType.CENTER_INSIDE
}
iconsContainer.addView(image, iconSize, iconSize)
val lp = image.layoutParams as MarginLayoutParams
lp.marginStart = iconMargin
image.layoutParams = lp
if (i != 0) {
val lp = image.layoutParams as MarginLayoutParams
lp.marginStart = if (expanded) iconMarginExpanded else iconMarginCollapsed
image.layoutParams = lp
}
}
}
if (!privacyList.isEmpty()) {
generateContentDescription()
setIcons(builder, iconsContainer)
text.visibility = if (builder.types.size == 1) VISIBLE else GONE
if (builder.types.size == 1) {
text.visibility = if (builder.types.size == 1 && expanded) VISIBLE else GONE
if (builder.types.size == 1 && expanded) {
if (builder.app != null) {
text.setText(builder.app?.applicationName)
} else {

View File

@@ -124,6 +124,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
private TintedIconManager mIconManager;
private TouchAnimator mStatusIconsAlphaAnimator;
private TouchAnimator mHeaderTextContainerAlphaAnimator;
private TouchAnimator mPrivacyChipAlphaAnimator;
private View mSystemIconsView;
private View mQuickQsStatusIcons;
@@ -212,6 +213,8 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mNextAlarmTextView = findViewById(R.id.next_alarm_text);
mRingerModeIcon = findViewById(R.id.ringer_mode_icon);
mRingerModeTextView = findViewById(R.id.ringer_mode_text);
mPrivacyChip = findViewById(R.id.privacy_chip);
mPrivacyChip.setOnClickListener(this);
updateResources();
@@ -230,8 +233,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements
mClockView = findViewById(R.id.clock);
mClockView.setOnClickListener(this);
mDateView = findViewById(R.id.date);
mPrivacyChip = findViewById(R.id.privacy_chip);
mPrivacyChip.setOnClickListener(this);
mSpace = findViewById(R.id.space);
// Tint for the battery icons are handled in setupHost()
@@ -383,6 +384,7 @@ public class QuickStatusBarHeader extends RelativeLayout implements
updateStatusIconAlphaAnimator();
updateHeaderTextContainerAlphaAnimator();
updatePrivacyChipAlphaAnimator();
}
private void updateStatusIconAlphaAnimator() {
@@ -398,6 +400,12 @@ public class QuickStatusBarHeader extends RelativeLayout implements
.build();
}
private void updatePrivacyChipAlphaAnimator() {
mPrivacyChipAlphaAnimator = new TouchAnimator.Builder()
.addFloat(mPrivacyChip, "alpha", 1, 0, 1)
.build();
}
public void setExpanded(boolean expanded) {
if (mExpanded == expanded) return;
mExpanded = expanded;
@@ -431,6 +439,10 @@ public class QuickStatusBarHeader extends RelativeLayout implements
if (mHeaderTextContainerAlphaAnimator != null) {
mHeaderTextContainerAlphaAnimator.setPosition(keyguardExpansionFraction);
}
if (mPrivacyChipAlphaAnimator != null) {
mPrivacyChip.setExpanded(expansionFraction > 0.5);
mPrivacyChipAlphaAnimator.setPosition(keyguardExpansionFraction);
}
// Check the original expansion fraction - we don't want to show the tooltip until the
// panel is pulled all the way out.