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:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user