Merge "Visual changes in OngoingPrivacyChip"

This commit is contained in:
TreeHugger Robot
2019-03-14 13:18:17 +00:00
committed by Android (Google) Code Review
5 changed files with 12 additions and 83 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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)
}
}

View File

@@ -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())
}
}
}