Merge "Visual changes in OngoingPrivacyChip"
This commit is contained in:
committed by
Android (Google) Code Review
commit
40033338a9
@@ -28,7 +28,7 @@
|
||||
android:orientation="horizontal"
|
||||
android:focusable="true">
|
||||
|
||||
<LinearLayout
|
||||
<FrameLayout
|
||||
android:id="@+id/background"
|
||||
android:layout_height="@dimen/ongoing_appops_chip_height"
|
||||
android:layout_width="wrap_content"
|
||||
@@ -37,25 +37,8 @@
|
||||
android:id="@+id/icons_container"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_marginStart="@dimen/ongoing_appops_chip_items_margin"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_gravity="center"
|
||||
android:gravity="center_vertical"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_container"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:paddingStart="@dimen/ongoing_appops_chip_text_padding"
|
||||
android:paddingEnd="@dimen/ongoing_appops_chip_text_padding"
|
||||
android:gravity="center_vertical"
|
||||
android:singleLine="true"
|
||||
android:ellipsize="end"
|
||||
android:lines="1"
|
||||
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
|
||||
android:textSize="@dimen/ongoing_appops_chip_text_size"
|
||||
android:textColor="@color/status_bar_clock_color"
|
||||
/>
|
||||
</LinearLayout>
|
||||
</FrameLayout>
|
||||
</com.android.systemui.privacy.OngoingPrivacyChip>
|
||||
@@ -1003,10 +1003,8 @@
|
||||
<dimen name="ongoing_appops_chip_margin">0dp</dimen>
|
||||
<!-- Height of the Ongoing App Ops chip -->
|
||||
<dimen name="ongoing_appops_chip_height">32dp</dimen>
|
||||
<!-- Start and End padding for Ongoing App Ops chip -->
|
||||
<dimen name="ongoing_appops_chip_text_padding">8dp</dimen>
|
||||
<!-- Padding between background of Ongoing App Ops chip and content -->
|
||||
<dimen name="ongoing_appops_chip_bg_padding">0dp</dimen>
|
||||
<dimen name="ongoing_appops_chip_bg_padding">8dp</dimen>
|
||||
<!-- Side padding between background of Ongoing App Ops chip and content -->
|
||||
<dimen name="ongoing_appops_chip_side_padding">8dp</dimen>
|
||||
<!-- Margin between icons of Ongoing App Ops chip when QQS-->
|
||||
@@ -1017,10 +1015,7 @@
|
||||
<dimen name="ongoing_appops_chip_icon_size">@*android:dimen/status_bar_icon_size</dimen>
|
||||
<!-- Radius of Ongoing App Ops chip corners -->
|
||||
<dimen name="ongoing_appops_chip_bg_corner_radius">16dp</dimen>
|
||||
<!-- Size of text of Ongoing App Ops chip -->
|
||||
<dimen name="ongoing_appops_chip_text_size">12sp</dimen>
|
||||
<!-- Margin between items in Ongoing App Ops chip -->
|
||||
<dimen name="ongoing_appops_chip_items_margin">8dp</dimen>
|
||||
|
||||
|
||||
<!-- How much a bubble is elevated -->
|
||||
<dimen name="bubble_elevation">8dp</dimen>
|
||||
|
||||
@@ -2320,26 +2320,12 @@
|
||||
app for debugging. Will not be seen by users. [CHAR LIMIT=20] -->
|
||||
<string name="heap_dump_tile_name">Dump SysUI Heap</string>
|
||||
|
||||
<!-- Text on chip for multiple apps using a single app op [CHAR LIMIT=12] -->
|
||||
<plurals name="ongoing_privacy_chip_multiple_apps">
|
||||
<item quantity="one"><xliff:g id="num_apps" example="1">%d</xliff:g> app</item>
|
||||
<item quantity="few"><xliff:g id="num_apps" example="3">%d</xliff:g> apps</item>
|
||||
<item quantity="other"><xliff:g id="num_apps" example="3">%d</xliff:g> apps</item>
|
||||
</plurals>
|
||||
|
||||
<!-- Content description for ongoing privacy chip. Use with a single app [CHAR LIMIT=NONE]-->
|
||||
<string name="ongoing_privacy_chip_content_single_app"><xliff:g id="app" example="Example App">%1$s</xliff:g> is using your <xliff:g id="types_list" example="camera, location">%2$s</xliff:g>.</string>
|
||||
|
||||
<!-- 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>
|
||||
|
||||
<!-- 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>
|
||||
<item quantity="few"><xliff:g id="num_apps" example="3">%1$d</xliff:g> applications are using your <xliff:g id="type" example="camera">%2$s</xliff:g>.</item>
|
||||
<item quantity="other"><xliff:g id="num_apps" example="3">%1$d</xliff:g> applications are using your <xliff:g id="type" example="camera">%2$s</xliff:g>.</item>
|
||||
</plurals>
|
||||
|
||||
<!-- Action for accepting the Ongoing privacy dialog [CHAR LIMIT=10]-->
|
||||
<string name="ongoing_privacy_dialog_ok">Got it</string>
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@ package com.android.systemui.privacy
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import android.view.ViewGroup
|
||||
import android.widget.FrameLayout
|
||||
import android.widget.ImageView
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.TextView
|
||||
import com.android.systemui.Dependency
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.statusbar.policy.KeyguardMonitor
|
||||
@@ -42,9 +42,8 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
||||
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 text: TextView
|
||||
private lateinit var iconsContainer: LinearLayout
|
||||
private lateinit var back: LinearLayout
|
||||
private lateinit var back: FrameLayout
|
||||
var expanded = false
|
||||
set(value) {
|
||||
if (value != field) {
|
||||
@@ -66,14 +65,14 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
||||
super.onFinishInflate()
|
||||
|
||||
back = findViewById(R.id.background)
|
||||
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() {
|
||||
back.background = if (expanded) backgroundDrawable else null
|
||||
back.setPaddingRelative(0, 0, if (expanded) sidePadding else 0, 0)
|
||||
val padding = if (expanded) sidePadding else 0
|
||||
back.setPaddingRelative(padding, 0, padding, 0)
|
||||
fun setIcons(dialogBuilder: PrivacyDialogBuilder, iconsContainer: ViewGroup) {
|
||||
iconsContainer.removeAllViews()
|
||||
dialogBuilder.generateIcons().forEachIndexed { i, it ->
|
||||
@@ -95,44 +94,17 @@ class OngoingPrivacyChip @JvmOverloads constructor(
|
||||
if (!privacyList.isEmpty()) {
|
||||
generateContentDescription()
|
||||
setIcons(builder, iconsContainer)
|
||||
setApplicationText()
|
||||
} else {
|
||||
text.visibility = GONE
|
||||
iconsContainer.removeAllViews()
|
||||
}
|
||||
requestLayout()
|
||||
}
|
||||
|
||||
private fun setApplicationText() {
|
||||
text.visibility = if (builder.types.size == 1 && expanded) VISIBLE else GONE
|
||||
if (builder.types.size == 1 && expanded) {
|
||||
if (builder.app != null && !amISecure()) {
|
||||
text.setText(builder.app?.applicationName)
|
||||
} else {
|
||||
text.text = context.resources.getQuantityString(
|
||||
R.plurals.ongoing_privacy_chip_multiple_apps,
|
||||
builder.appsAndTypes.size, builder.appsAndTypes.size)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun amISecure() = keyguardMonitor.isShowing && keyguardMonitor.isSecure
|
||||
|
||||
private fun generateContentDescription() {
|
||||
val typesText = builder.joinTypes()
|
||||
if (builder.types.size > 1) {
|
||||
contentDescription = context.getString(
|
||||
R.string.ongoing_privacy_chip_content_multiple_apps, typesText)
|
||||
} else {
|
||||
if (builder.app != null && !amISecure()) {
|
||||
contentDescription =
|
||||
context.getString(R.string.ongoing_privacy_chip_content_single_app,
|
||||
builder.app?.applicationName, typesText)
|
||||
} else {
|
||||
contentDescription = context.resources.getQuantityString(
|
||||
R.plurals.ongoing_privacy_chip_content_multiple_apps_single_op,
|
||||
builder.appsAndTypes.size, builder.appsAndTypes.size, typesText)
|
||||
}
|
||||
}
|
||||
contentDescription = context.getString(
|
||||
R.string.ongoing_privacy_chip_content_multiple_apps, typesText)
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,6 @@ class PrivacyDialogBuilder(private val context: Context, itemsList: List<Privacy
|
||||
|
||||
val appsAndTypes: List<Pair<PrivacyApplication, List<PrivacyType>>>
|
||||
val types: List<PrivacyType>
|
||||
val app: PrivacyApplication?
|
||||
private val separator = context.getString(R.string.ongoing_privacy_dialog_separator)
|
||||
private val lastSeparator = context.getString(R.string.ongoing_privacy_dialog_last_separator)
|
||||
|
||||
@@ -32,8 +31,6 @@ class PrivacyDialogBuilder(private val context: Context, itemsList: List<Privacy
|
||||
.sortedWith(compareBy({ -it.second.size }, // Sort by number of AppOps
|
||||
{ it.second.min() })) // Sort by "smallest" AppOpp (Location is largest)
|
||||
types = itemsList.map { it.privacyType }.distinct().sorted()
|
||||
val singleApp = appsAndTypes.size == 1
|
||||
app = if (singleApp) appsAndTypes[0].first else null
|
||||
}
|
||||
|
||||
fun generateIconsForApp(types: List<PrivacyType>): List<Drawable> {
|
||||
@@ -58,11 +55,7 @@ class PrivacyDialogBuilder(private val context: Context, itemsList: List<Privacy
|
||||
}
|
||||
|
||||
fun getDialogTitle(): String {
|
||||
if (app != null) {
|
||||
return context.getString(R.string.ongoing_privacy_dialog_single_app_title, joinTypes())
|
||||
} else {
|
||||
return context.getString(R.string.ongoing_privacy_dialog_multiple_apps_title,
|
||||
return context.getString(R.string.ongoing_privacy_dialog_multiple_apps_title,
|
||||
joinTypes())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user