Merge "DO NOT MERGE Implement privacy chip design" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4b8044cb63
@@ -16,8 +16,6 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
<shape xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<solid android:color="#242424" /> <!-- 14% of white -->
|
<solid android:color="#FFFFFF" />
|
||||||
<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" />
|
<corners android:radius="@dimen/ongoing_appops_chip_bg_corner_radius" />
|
||||||
</shape>
|
</shape>
|
||||||
@@ -22,19 +22,14 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_gravity="center_vertical|end"
|
android:layout_gravity="center_vertical|end"
|
||||||
android:focusable="true" >
|
android:focusable="true"
|
||||||
|
android:minWidth="48dp" >
|
||||||
|
|
||||||
<FrameLayout
|
<LinearLayout
|
||||||
android:id="@+id/background"
|
android:id="@+id/icons_container"
|
||||||
android:layout_height="@dimen/ongoing_appops_chip_height"
|
android:layout_height="@dimen/ongoing_appops_chip_height"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:minWidth="48dp"
|
android:gravity="center_vertical"
|
||||||
android:layout_gravity="center_vertical">
|
android:layout_gravity="center"
|
||||||
<LinearLayout
|
/>
|
||||||
android:id="@+id/icons_container"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
/>
|
|
||||||
</FrameLayout>
|
|
||||||
</com.android.systemui.privacy.OngoingPrivacyChip>
|
</com.android.systemui.privacy.OngoingPrivacyChip>
|
||||||
@@ -1179,17 +1179,13 @@
|
|||||||
<dimen name="display_cutout_margin_consumption">0px</dimen>
|
<dimen name="display_cutout_margin_consumption">0px</dimen>
|
||||||
|
|
||||||
<!-- Height of the Ongoing App Ops chip -->
|
<!-- Height of the Ongoing App Ops chip -->
|
||||||
<dimen name="ongoing_appops_chip_height">32dp</dimen>
|
<dimen name="ongoing_appops_chip_height">24dp</dimen>
|
||||||
<!-- Padding between background of Ongoing App Ops chip and content -->
|
|
||||||
<dimen name="ongoing_appops_chip_bg_padding">8dp</dimen>
|
|
||||||
<!-- Side padding between background of Ongoing App Ops chip and content -->
|
<!-- Side padding between background of Ongoing App Ops chip and content -->
|
||||||
<dimen name="ongoing_appops_chip_side_padding">8dp</dimen>
|
<dimen name="ongoing_appops_chip_side_padding">8dp</dimen>
|
||||||
<!-- Margin between icons of Ongoing App Ops chip when QQS-->
|
<!-- Margin between icons of Ongoing App Ops chip -->
|
||||||
<dimen name="ongoing_appops_chip_icon_margin_collapsed">0dp</dimen>
|
<dimen name="ongoing_appops_chip_icon_margin">4dp</dimen>
|
||||||
<!-- Margin between icons of Ongoing App Ops chip when QS-->
|
|
||||||
<dimen name="ongoing_appops_chip_icon_margin_expanded">2dp</dimen>
|
|
||||||
<!-- Icon size of Ongoing App Ops chip -->
|
<!-- Icon size of Ongoing App Ops chip -->
|
||||||
<dimen name="ongoing_appops_chip_icon_size">@dimen/status_bar_icon_drawing_size</dimen>
|
<dimen name="ongoing_appops_chip_icon_size">16dp</dimen>
|
||||||
<!-- Radius of Ongoing App Ops chip corners -->
|
<!-- Radius of Ongoing App Ops chip corners -->
|
||||||
<dimen name="ongoing_appops_chip_bg_corner_radius">16dp</dimen>
|
<dimen name="ongoing_appops_chip_bg_corner_radius">16dp</dimen>
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ package com.android.systemui.privacy
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.Gravity
|
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.FrameLayout
|
import android.widget.FrameLayout
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import android.widget.LinearLayout
|
import android.widget.LinearLayout
|
||||||
|
import com.android.settingslib.Utils
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
|
|
||||||
class OngoingPrivacyChip @JvmOverloads constructor(
|
class OngoingPrivacyChip @JvmOverloads constructor(
|
||||||
@@ -30,26 +30,13 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
|||||||
defStyleRes: Int = 0
|
defStyleRes: Int = 0
|
||||||
) : FrameLayout(context, attrs, defStyleAttrs, defStyleRes) {
|
) : FrameLayout(context, attrs, defStyleAttrs, defStyleRes) {
|
||||||
|
|
||||||
private val iconMarginExpanded = context.resources.getDimensionPixelSize(
|
private var iconMargin = 0
|
||||||
R.dimen.ongoing_appops_chip_icon_margin_expanded)
|
private var iconSize = 0
|
||||||
private val iconMarginCollapsed = context.resources.getDimensionPixelSize(
|
private var iconColor = 0
|
||||||
R.dimen.ongoing_appops_chip_icon_margin_collapsed)
|
private var defaultBackgroundColor = 0
|
||||||
private val iconSize =
|
private var cameraBackgroundColor = 0
|
||||||
context.resources.getDimensionPixelSize(R.dimen.ongoing_appops_chip_icon_size)
|
|
||||||
private val iconColor = context.resources.getColor(
|
|
||||||
R.color.status_bar_clock_color, context.theme)
|
|
||||||
private val sidePadding =
|
|
||||||
context.resources.getDimensionPixelSize(R.dimen.ongoing_appops_chip_side_padding)
|
|
||||||
private val backgroundDrawable = context.getDrawable(R.drawable.privacy_chip_bg)
|
|
||||||
private lateinit var iconsContainer: LinearLayout
|
private lateinit var iconsContainer: LinearLayout
|
||||||
private lateinit var back: FrameLayout
|
|
||||||
var expanded = false
|
|
||||||
set(value) {
|
|
||||||
if (value != field) {
|
|
||||||
field = value
|
|
||||||
updateView(PrivacyChipBuilder(context, privacyList))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var privacyList = emptyList<PrivacyItem>()
|
var privacyList = emptyList<PrivacyItem>()
|
||||||
set(value) {
|
set(value) {
|
||||||
@@ -60,15 +47,13 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
|||||||
override fun onFinishInflate() {
|
override fun onFinishInflate() {
|
||||||
super.onFinishInflate()
|
super.onFinishInflate()
|
||||||
|
|
||||||
back = requireViewById(R.id.background)
|
|
||||||
iconsContainer = requireViewById(R.id.icons_container)
|
iconsContainer = requireViewById(R.id.icons_container)
|
||||||
|
|
||||||
|
updateResources()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Should only be called if the builder icons or app changed
|
// Should only be called if the builder icons or app changed
|
||||||
private fun updateView(builder: PrivacyChipBuilder) {
|
private fun updateView(builder: PrivacyChipBuilder) {
|
||||||
back.background = if (expanded) backgroundDrawable else null
|
|
||||||
val padding = if (expanded) sidePadding else 0
|
|
||||||
back.setPaddingRelative(padding, 0, padding, 0)
|
|
||||||
fun setIcons(chipBuilder: PrivacyChipBuilder, iconsContainer: ViewGroup) {
|
fun setIcons(chipBuilder: PrivacyChipBuilder, iconsContainer: ViewGroup) {
|
||||||
iconsContainer.removeAllViews()
|
iconsContainer.removeAllViews()
|
||||||
chipBuilder.generateIcons().forEachIndexed { i, it ->
|
chipBuilder.generateIcons().forEachIndexed { i, it ->
|
||||||
@@ -81,7 +66,7 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
|||||||
iconsContainer.addView(image, iconSize, iconSize)
|
iconsContainer.addView(image, iconSize, iconSize)
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
val lp = image.layoutParams as MarginLayoutParams
|
val lp = image.layoutParams as MarginLayoutParams
|
||||||
lp.marginStart = if (expanded) iconMarginExpanded else iconMarginCollapsed
|
lp.marginStart = iconMargin
|
||||||
image.layoutParams = lp
|
image.layoutParams = lp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,10 +75,11 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
|||||||
if (!privacyList.isEmpty()) {
|
if (!privacyList.isEmpty()) {
|
||||||
generateContentDescription(builder)
|
generateContentDescription(builder)
|
||||||
setIcons(builder, iconsContainer)
|
setIcons(builder, iconsContainer)
|
||||||
val lp = iconsContainer.layoutParams as FrameLayout.LayoutParams
|
if (builder.types.contains(PrivacyType.TYPE_CAMERA)) {
|
||||||
lp.gravity = Gravity.CENTER_VERTICAL or
|
iconsContainer.background.setTint(cameraBackgroundColor)
|
||||||
(if (expanded) Gravity.CENTER_HORIZONTAL else Gravity.END)
|
} else {
|
||||||
iconsContainer.layoutParams = lp
|
iconsContainer.background.setTint(defaultBackgroundColor)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
iconsContainer.removeAllViews()
|
iconsContainer.removeAllViews()
|
||||||
}
|
}
|
||||||
@@ -105,4 +91,20 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
|||||||
contentDescription = context.getString(
|
contentDescription = context.getString(
|
||||||
R.string.ongoing_privacy_chip_content_multiple_apps, typesText)
|
R.string.ongoing_privacy_chip_content_multiple_apps, typesText)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateResources() {
|
||||||
|
iconMargin = context.resources
|
||||||
|
.getDimensionPixelSize(R.dimen.ongoing_appops_chip_icon_margin)
|
||||||
|
iconSize = context.resources
|
||||||
|
.getDimensionPixelSize(R.dimen.ongoing_appops_chip_icon_size)
|
||||||
|
iconColor =
|
||||||
|
Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.colorPrimary)
|
||||||
|
defaultBackgroundColor = context.getColor(R.color.privacy_circle_microphone_location)
|
||||||
|
cameraBackgroundColor = context.getColor(R.color.privacy_circle_camera)
|
||||||
|
|
||||||
|
val padding = context.resources
|
||||||
|
.getDimensionPixelSize(R.dimen.ongoing_appops_chip_side_padding)
|
||||||
|
iconsContainer.setPaddingRelative(padding, 0, padding, 0)
|
||||||
|
iconsContainer.background = context.getDrawable(R.drawable.privacy_chip_bg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn
|
|||||||
protected QuickQSPanel mHeaderQsPanel;
|
protected QuickQSPanel mHeaderQsPanel;
|
||||||
private TouchAnimator mStatusIconsAlphaAnimator;
|
private TouchAnimator mStatusIconsAlphaAnimator;
|
||||||
private TouchAnimator mHeaderTextContainerAlphaAnimator;
|
private TouchAnimator mHeaderTextContainerAlphaAnimator;
|
||||||
private TouchAnimator mPrivacyChipAlphaAnimator;
|
|
||||||
private DualToneHandler mDualToneHandler;
|
private DualToneHandler mDualToneHandler;
|
||||||
|
|
||||||
private View mSystemIconsView;
|
private View mSystemIconsView;
|
||||||
@@ -284,7 +283,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn
|
|||||||
|
|
||||||
updateStatusIconAlphaAnimator();
|
updateStatusIconAlphaAnimator();
|
||||||
updateHeaderTextContainerAlphaAnimator();
|
updateHeaderTextContainerAlphaAnimator();
|
||||||
updatePrivacyChipAlphaAnimator();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateStatusIconAlphaAnimator() {
|
private void updateStatusIconAlphaAnimator() {
|
||||||
@@ -299,12 +297,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn
|
|||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updatePrivacyChipAlphaAnimator() {
|
|
||||||
mPrivacyChipAlphaAnimator = new TouchAnimator.Builder()
|
|
||||||
.addFloat(mPrivacyChip, "alpha", 1, 0, 1)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
public void setExpanded(boolean expanded, QuickQSPanelController quickQSPanelController) {
|
public void setExpanded(boolean expanded, QuickQSPanelController quickQSPanelController) {
|
||||||
if (mExpanded == expanded) return;
|
if (mExpanded == expanded) return;
|
||||||
@@ -344,10 +336,6 @@ public class QuickStatusBarHeader extends RelativeLayout implements LifecycleOwn
|
|||||||
mHeaderTextContainerView.setVisibility(INVISIBLE);
|
mHeaderTextContainerView.setVisibility(INVISIBLE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mPrivacyChipAlphaAnimator != null) {
|
|
||||||
mPrivacyChip.setExpanded(expansionFraction > 0.5);
|
|
||||||
mPrivacyChipAlphaAnimator.setPosition(keyguardExpansionFraction);
|
|
||||||
}
|
|
||||||
|
|
||||||
mKeyguardExpansionFraction = keyguardExpansionFraction;
|
mKeyguardExpansionFraction = keyguardExpansionFraction;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user