Decorating People Tile background
Change-Id: Ie88ad8482e0dcd6b5f1640827fe71b9d9137cf0c
Test: manual and PeopleTileViewHelperTest
Bug: 184741504
diff --git a/packages/SystemUI/res/layout/people_tile_emoji_background_large.xml b/packages/SystemUI/res/layout/people_tile_emoji_background_large.xml
new file mode 100644
index 0000000..61d3ea5
--- /dev/null
+++ b/packages/SystemUI/res/layout/people_tile_emoji_background_large.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/emojis"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingTop="10dp">
+ <TextView
+ android:id="@+id/emoji1"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:paddingStart="40dp"
+ android:maxLines="1"
+ android:alpha="0.2"/>
+ <TextView
+ android:id="@+id/emoji2"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_alignParentStart="true"
+ android:paddingTop="5dp"
+ android:paddingStart="27dp"
+ android:maxLines="1"
+ android:alpha="0.2"/>
+ <TextView
+ android:id="@+id/emoji3"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentEnd="true"
+ android:paddingEnd="25dp"
+ android:maxLines="1"
+ android:alpha="0.2"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/people_tile_emoji_background_medium.xml b/packages/SystemUI/res/layout/people_tile_emoji_background_medium.xml
new file mode 100644
index 0000000..a5f300f
--- /dev/null
+++ b/packages/SystemUI/res/layout/people_tile_emoji_background_medium.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/emojis"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal"
+ android:gravity="center_vertical">
+ <TextView
+ android:id="@+id/emoji1"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:paddingTop="-2dp"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="2"
+ android:gravity="end"
+ android:maxLines="1"
+ android:alpha="0.2"/>
+ <TextView
+ android:id="@+id/emoji2"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:gravity="end"
+ android:paddingTop="20dp"
+ android:maxLines="1"
+ android:alpha="0.2"/>
+ <TextView
+ android:id="@+id/emoji3"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_gravity="top"
+ android:paddingTop="10dp"
+ android:maxLines="1"
+ android:alpha="0.2"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/people_tile_large_with_content.xml b/packages/SystemUI/res/layout/people_tile_large_with_content.xml
index af2c5de..6f8de3b 100644
--- a/packages/SystemUI/res/layout/people_tile_large_with_content.xml
+++ b/packages/SystemUI/res/layout/people_tile_large_with_content.xml
@@ -67,68 +67,79 @@
android:visibility="gone"
/>
</RelativeLayout>
-
- <TextView
- android:layout_gravity="center"
- android:id="@+id/name"
+ <RelativeLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingBottom="12dp"
- android:gravity="start"
- android:singleLine="true"
- android:ellipsize="end"
- android:text="@string/empty_user_name"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
- android:textColor="?android:attr/textColorPrimary"
- android:textSize="14sp" />
+ android:layout_height="match_parent">
+ <include layout="@layout/people_tile_punctuation_background_large" />
+ <include layout="@layout/people_tile_emoji_background_large" />
- <LinearLayout
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingBottom="4dp"
- android:gravity="center_vertical"
- android:orientation="horizontal">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+ <TextView
+ android:layout_gravity="center"
+ android:id="@+id/name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingBottom="12dp"
+ android:gravity="start"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:text="@string/empty_user_name"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="14sp" />
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingBottom="4dp"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/predefined_icon"
+ android:tint="?android:attr/colorAccent"
+ android:gravity="start|center_vertical"
+ android:paddingEnd="6dp"
+ android:layout_width="24dp"
+ android:layout_height="18dp" />
+
+ <TextView
+ android:layout_gravity="center"
+ android:id="@+id/subtext"
+ android:gravity="center_vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ellipsize="end"
+ android:singleLine="true"
+ android:text="@string/empty_user_name"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textColor="?android:attr/textColorSecondary"
+ android:textSize="12sp" />
+ </LinearLayout>
<ImageView
- android:id="@+id/predefined_icon"
- android:tint="?android:attr/colorAccent"
- android:gravity="start|center_vertical"
- android:paddingEnd="6dp"
- android:layout_width="24dp"
- android:layout_height="18dp" />
+ android:id="@+id/image"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@drawable/people_space_content_background"
+ android:gravity="center"
+ android:scaleType="centerCrop" />
<TextView
android:layout_gravity="center"
- android:id="@+id/subtext"
- android:gravity="center_vertical"
+ android:id="@+id/text_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
- android:singleLine="true"
- android:text="@string/empty_user_name"
+ android:maxLines="2"
+ android:singleLine="false"
+ android:text="@string/empty_status"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
- android:textColor="?android:attr/textColorSecondary"
+ android:textColor="?android:attr/textColorPrimary"
android:textSize="12sp" />
- </LinearLayout>
-
- <ImageView
- android:id="@+id/image"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@drawable/people_space_content_background"
- android:gravity="center"
- android:scaleType="centerCrop" />
-
- <TextView
- android:layout_gravity="center"
- android:id="@+id/text_content"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:maxLines="2"
- android:singleLine="false"
- android:text="@string/empty_status"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
- android:textColor="?android:attr/textColorPrimary"
- android:textSize="12sp" />
+ </LinearLayout>
+ </RelativeLayout>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/people_tile_medium_with_content.xml b/packages/SystemUI/res/layout/people_tile_medium_with_content.xml
index 7070660..a8c15ab 100644
--- a/packages/SystemUI/res/layout/people_tile_medium_with_content.xml
+++ b/packages/SystemUI/res/layout/people_tile_medium_with_content.xml
@@ -21,121 +21,127 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
- <LinearLayout
+ <RelativeLayout
android:background="@drawable/people_space_tile_view_card"
- android:id="@+id/item"
- android:orientation="vertical"
- android:layout_gravity="center"
- android:padding="8dp"
android:layout_width="match_parent"
android:layout_height="match_parent">
-
+ <include layout="@layout/people_tile_punctuation_background_medium" />
+ <include layout="@layout/people_tile_emoji_background_medium" />
<LinearLayout
- android:orientation="horizontal"
- android:gravity="top"
- android:layout_weight="1"
+ android:id="@+id/item"
+ android:orientation="vertical"
+ android:layout_gravity="center"
+ android:padding="8dp"
android:layout_width="match_parent"
- android:layout_height="0dp">
-
- <ImageView
- android:gravity="start"
- android:id="@+id/person_icon"
- android:layout_marginStart="-2dp"
- android:layout_marginTop="-2dp"
- android:layout_width="52dp"
- android:layout_height="52dp" />
-
- <ImageView
- android:id="@+id/availability"
- android:layout_marginStart="-2dp"
- android:layout_width="10dp"
- android:layout_height="10dp"
- android:background="@drawable/circle_green_10dp" />
+ android:layout_height="match_parent">
<LinearLayout
- android:orientation="vertical"
- android:gravity="top|start"
- android:paddingStart="12dp"
+ android:orientation="horizontal"
+ android:gravity="top"
+ android:layout_weight="1"
android:layout_width="match_parent"
- android:layout_height="wrap_content">
-
- <TextView
- android:id="@+id/subtext"
- android:text="@string/empty_user_name"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
- android:textColor="?android:attr/textColorSecondary"
- android:textSize="12sp"
- android:paddingBottom="4dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="end" />
+ android:layout_height="0dp">
<ImageView
- android:id="@+id/image"
- android:gravity="center"
- android:background="@drawable/people_space_content_background"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="centerCrop" />
+ android:gravity="start"
+ android:id="@+id/person_icon"
+ android:layout_marginStart="-2dp"
+ android:layout_marginTop="-2dp"
+ android:layout_width="52dp"
+ android:layout_height="52dp" />
+ <ImageView
+ android:id="@+id/availability"
+ android:layout_marginStart="-2dp"
+ android:layout_width="10dp"
+ android:layout_height="10dp"
+ android:background="@drawable/circle_green_10dp" />
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:gravity="top|start"
+ android:paddingStart="12dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+
+ <TextView
+ android:id="@+id/subtext"
+ android:text="@string/empty_user_name"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textColor="?android:attr/textColorSecondary"
+ android:textSize="12sp"
+ android:paddingBottom="4dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end" />
+
+ <ImageView
+ android:id="@+id/image"
+ android:gravity="center"
+ android:background="@drawable/people_space_content_background"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:scaleType="centerCrop" />
+
+ <TextView
+ android:id="@+id/text_content"
+ android:text="@string/empty_status"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="12sp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:maxLines="2"
+ android:singleLine="false"
+ android:ellipsize="end" />
+ </LinearLayout>
+ </LinearLayout>
+
+ <LinearLayout
+ android:gravity="bottom"
+ android:layout_gravity="center_vertical"
+ android:orientation="horizontal"
+ android:paddingTop="2dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clipToOutline="true">
<TextView
- android:id="@+id/text_content"
- android:text="@string/empty_status"
+ android:id="@+id/name"
+ android:gravity="center_vertical"
+ android:layout_weight="1"
+ android:text="@string/empty_user_name"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
android:textColor="?android:attr/textColorPrimary"
- android:textSize="12sp"
- android:layout_width="match_parent"
+ android:textSize="14sp"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:id="@+id/messages_count"
+ android:gravity="end"
+ android:paddingStart="8dp"
+ android:paddingEnd="8dp"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textColor="?android:attr/textColorPrimary"
+ android:background="@drawable/people_space_messages_count_background"
+ android:textSize="14sp"
+ android:maxLines="1"
+ android:ellipsize="end"
+ android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:maxLines="2"
- android:singleLine="false"
- android:ellipsize="end" />
+ android:visibility="gone"
+ />
+ <ImageView
+ android:id="@+id/predefined_icon"
+ android:tint="?android:attr/colorAccent"
+ android:gravity="end|center_vertical"
+ android:paddingStart="6dp"
+ android:layout_width="24dp"
+ android:layout_height="18dp" />
</LinearLayout>
</LinearLayout>
-
- <LinearLayout
- android:gravity="bottom"
- android:layout_gravity="center_vertical"
- android:orientation="horizontal"
- android:paddingTop="2dp"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:clipToOutline="true">
- <TextView
- android:id="@+id/name"
- android:gravity="center_vertical"
- android:layout_weight="1"
- android:text="@string/empty_user_name"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
- android:textColor="?android:attr/textColorPrimary"
- android:textSize="14sp"
- android:singleLine="true"
- android:ellipsize="end"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:id="@+id/messages_count"
- android:gravity="end"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
- android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
- android:textColor="?android:attr/textColorPrimary"
- android:background="@drawable/people_space_messages_count_background"
- android:textSize="14sp"
- android:maxLines="1"
- android:ellipsize="end"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:visibility="gone"
- />
- <ImageView
- android:id="@+id/predefined_icon"
- android:tint="?android:attr/colorAccent"
- android:gravity="end|center_vertical"
- android:paddingStart="6dp"
- android:layout_width="24dp"
- android:layout_height="18dp" />
- </LinearLayout>
- </LinearLayout>
+ </RelativeLayout>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml b/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml
new file mode 100644
index 0000000..2ffe59a
--- /dev/null
+++ b/packages/SystemUI/res/layout/people_tile_punctuation_background_large.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<RelativeLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
+ android:id="@+id/punctuations"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingTop="10dp">
+ <TextView
+ android:id="@+id/punctuation1"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:textStyle="bold"
+ android:paddingTop="-2dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_centerHorizontal="true"
+ android:maxLines="1"
+ android:rotation="5"/>
+ <TextView
+ android:id="@+id/punctuation2"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:textStyle="bold"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_alignParentStart="true"
+ android:paddingTop="5dp"
+ android:paddingStart="27dp"
+ android:includeFontPadding="false"
+ android:maxLines="1"
+ android:rotation="350"/>
+ <TextView
+ android:id="@+id/punctuation3"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:textStyle="bold"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentEnd="true"
+ android:paddingEnd="25dp"
+ android:includeFontPadding="false"
+ android:maxLines="1"
+ android:rotation="350"/>
+ <TextView
+ android:id="@+id/punctuation4"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:textStyle="bold"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_alignParentStart="true"
+ android:paddingStart="15dp"
+ android:includeFontPadding="false"
+ android:maxLines="1"
+ android:rotation="10"/>
+ <TextView
+ android:id="@+id/punctuation5"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:textStyle="bold"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentTop="true"
+ android:layout_alignParentEnd="true"
+ android:paddingTop="15dp"
+ android:includeFontPadding="false"
+ android:maxLines="1"
+ android:rotation="5"/>
+ <TextView
+ android:id="@+id/punctuation6"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="34sp"
+ android:textStyle="bold"
+ android:paddingStart="20dp"
+ android:paddingTop="30dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_centerHorizontal="true"
+ android:maxLines="1"
+ android:rotation="350"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml b/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml
new file mode 100644
index 0000000..75cdde0
--- /dev/null
+++ b/packages/SystemUI/res/layout/people_tile_punctuation_background_medium.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:theme="@android:style/Theme.DeviceDefault.DayNight"
+ android:id="@+id/punctuations"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+ <TextView
+ android:id="@+id/punctuation1"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:textStyle="bold"
+ android:paddingTop="-2dp"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="4"
+ android:gravity="center_vertical|end"
+ android:maxLines="1"
+ android:rotation="5"/>
+ <TextView
+ android:id="@+id/punctuation2"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:textStyle="bold"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:layout_gravity="top"
+ android:gravity="top|end"
+ android:includeFontPadding="false"
+ android:paddingTop="25dp"
+ android:maxLines="1"
+ android:rotation="350"/>
+ <TextView
+ android:id="@+id/punctuation3"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:textStyle="bold"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:gravity="center|end"
+ android:includeFontPadding="false"
+ android:paddingTop="10dp"
+ android:maxLines="1"
+ android:rotation="350"/>
+ <TextView
+ android:id="@+id/punctuation4"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:textStyle="bold"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:paddingTop="10dp"
+ android:gravity="start|top"
+ android:includeFontPadding="false"
+ android:maxLines="1"
+ android:rotation="10"/>
+ <TextView
+ android:id="@+id/punctuation5"
+ android:textColor="?androidprv:attr/colorSurfaceVariant"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textSize="27sp"
+ android:textStyle="bold"
+ android:layout_width="0dp"
+ android:layout_height="match_parent"
+ android:layout_weight="1"
+ android:paddingTop="15dp"
+ android:gravity="start|center_vertical"
+ android:includeFontPadding="false"
+ android:maxLines="1"
+ android:rotation="350"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
index d4ddc65..a23db63 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleTileViewHelper.java
@@ -51,6 +51,7 @@
import android.text.TextUtils;
import android.util.IconDrawableFactory;
import android.util.Log;
+import android.util.Pair;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.TextView;
@@ -63,6 +64,7 @@
import java.text.NumberFormat;
import java.time.Duration;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
@@ -102,6 +104,39 @@
private static final Pattern ANY_DOUBLE_MARK_PATTERN = Pattern.compile("[!?][!?]+");
private static final Pattern MIXED_MARK_PATTERN = Pattern.compile("![?].*|.*[?]!");
+ // This regex can be used to match Unicode emoji characters and character sequences. It's from
+ // the official Unicode site (https://unicode.org/reports/tr51/#EBNF_and_Regex) with minor
+ // changes to fit our needs. It should be updated once new emoji categories are added.
+ //
+ // Emoji categories that can be matched by this regex:
+ // - Country flags. "\p{RI}\p{RI}" matches country flags since they always consist of 2 Unicode
+ // scalars.
+ // - Single-Character Emoji. "\p{Emoji}" matches Single-Character Emojis.
+ // - Emoji with modifiers. E.g. Emojis with different skin tones. "\p{Emoji}\p{EMod}" matches
+ // them.
+ // - Emoji Presentation. Those are characters which can normally be drawn as either text or as
+ // Emoji. "\p{Emoji}\x{FE0F}" matches them.
+ // - Emoji Keycap. E.g. Emojis for number 0 to 9. "\p{Emoji}\x{FE0F}\x{20E3}" matches them.
+ // - Emoji tag sequence. "\p{Emoji}[\x{E0020}-\x{E007E}]+\x{E007F}" matches them.
+ // - Emoji Zero-Width Joiner (ZWJ) Sequence. A ZWJ emoji is actually multiple emojis joined by
+ // the jointer "0x200D".
+ //
+ // Note: since "\p{Emoji}" also matches some ASCII characters like digits 0-9, we use
+ // "\p{Emoji}&&\p{So}" to exclude them. This is the change we made from the official emoji
+ // regex.
+ private static final String UNICODE_EMOJI_REGEX =
+ "\\p{RI}\\p{RI}|"
+ + "("
+ + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})"
+ + "|[\\p{Emoji}&&\\p{So}]"
+ + ")"
+ + "("
+ + "\\x{200D}"
+ + "\\p{Emoji}(\\p{EMod}|\\x{FE0F}\\x{20E3}?|[\\x{E0020}-\\x{E007E}]+\\x{E007F})"
+ + "?)*";
+
+ private static final Pattern EMOJI_PATTERN = Pattern.compile(UNICODE_EMOJI_REGEX);
+
public static final String EMPTY_STRING = "";
private int mMediumVerticalPadding;
@@ -375,7 +410,7 @@
} else {
setMaxLines(views, !TextUtils.isEmpty(sender));
CharSequence content = mTile.getNotificationContent();
- views = setPunctuationRemoteViewsFields(views, content);
+ views = decorateBackground(views, content);
views.setColorAttr(R.id.text_content, "setTextColor", android.R.attr.textColorPrimary);
views.setTextViewText(R.id.text_content, mTile.getNotificationContent());
views.setViewVisibility(R.id.image, View.GONE);
@@ -506,33 +541,53 @@
}
}
- private RemoteViews setPunctuationRemoteViewsFields(
- RemoteViews views, CharSequence content) {
- String punctuation = getBackgroundTextFromMessage(content.toString());
+ private RemoteViews decorateBackground(RemoteViews views, CharSequence content) {
int visibility = View.GONE;
- if (punctuation != null) {
- visibility = View.VISIBLE;
+ CharSequence emoji = getDoubleEmoji(content);
+ if (!TextUtils.isEmpty(emoji)) {
+ setEmojiBackground(views, emoji);
+ setPunctuationBackground(views, null);
+ return views;
}
- views.setTextViewText(R.id.punctuation1, punctuation);
- views.setTextViewText(R.id.punctuation2, punctuation);
- views.setTextViewText(R.id.punctuation3, punctuation);
- views.setTextViewText(R.id.punctuation4, punctuation);
- views.setTextViewText(R.id.punctuation5, punctuation);
- views.setTextViewText(R.id.punctuation6, punctuation);
- views.setViewVisibility(R.id.punctuation1, visibility);
- views.setViewVisibility(R.id.punctuation2, visibility);
- views.setViewVisibility(R.id.punctuation3, visibility);
- views.setViewVisibility(R.id.punctuation4, visibility);
- views.setViewVisibility(R.id.punctuation5, visibility);
- views.setViewVisibility(R.id.punctuation6, visibility);
-
+ CharSequence punctuation = getDoublePunctuation(content);
+ setEmojiBackground(views, null);
+ setPunctuationBackground(views, punctuation);
return views;
}
- /** Gets character for mTile background decoration based on notification content. */
+ private RemoteViews setEmojiBackground(RemoteViews views, CharSequence content) {
+ if (TextUtils.isEmpty(content)) {
+ views.setViewVisibility(R.id.emojis, View.GONE);
+ return views;
+ }
+ views.setTextViewText(R.id.emoji1, content);
+ views.setTextViewText(R.id.emoji2, content);
+ views.setTextViewText(R.id.emoji3, content);
+
+ views.setViewVisibility(R.id.emojis, View.VISIBLE);
+ return views;
+ }
+
+ private RemoteViews setPunctuationBackground(RemoteViews views, CharSequence content) {
+ if (TextUtils.isEmpty(content)) {
+ views.setViewVisibility(R.id.punctuations, View.GONE);
+ return views;
+ }
+ views.setTextViewText(R.id.punctuation1, content);
+ views.setTextViewText(R.id.punctuation2, content);
+ views.setTextViewText(R.id.punctuation3, content);
+ views.setTextViewText(R.id.punctuation4, content);
+ views.setTextViewText(R.id.punctuation5, content);
+ views.setTextViewText(R.id.punctuation6, content);
+
+ views.setViewVisibility(R.id.punctuations, View.VISIBLE);
+ return views;
+ }
+
+ /** Returns punctuation character(s) if {@code message} has double punctuation ("!" or "?"). */
@VisibleForTesting
- String getBackgroundTextFromMessage(String message) {
+ CharSequence getDoublePunctuation(CharSequence message) {
if (!ANY_DOUBLE_MARK_PATTERN.matcher(message).find()) {
return null;
}
@@ -554,6 +609,48 @@
return "!";
}
+ /** Returns emoji if {@code message} has two of the same emoji in sequence. */
+ @VisibleForTesting
+ CharSequence getDoubleEmoji(CharSequence message) {
+ Matcher unicodeEmojiMatcher = EMOJI_PATTERN.matcher(message);
+ // Stores the start and end indices of each matched emoji.
+ List<Pair<Integer, Integer>> emojiIndices = new ArrayList<>();
+ // Stores each emoji text.
+ List<CharSequence> emojiTexts = new ArrayList<>();
+
+ // Scan message for emojis
+ while (unicodeEmojiMatcher.find()) {
+ int start = unicodeEmojiMatcher.start();
+ int end = unicodeEmojiMatcher.end();
+ emojiIndices.add(new Pair(start, end));
+ emojiTexts.add(message.subSequence(start, end));
+ }
+
+ if (DEBUG) Log.d(TAG, "Number of emojis in the message: " + emojiIndices.size());
+ if (emojiIndices.size() < 2) {
+ return null;
+ }
+
+ for (int i = 1; i < emojiIndices.size(); ++i) {
+ Pair<Integer, Integer> second = emojiIndices.get(i);
+ Pair<Integer, Integer> first = emojiIndices.get(i - 1);
+
+ // Check if second emoji starts right after first starts
+ if (second.first == first.second) {
+ // Check if emojis in sequence are the same
+ if (Objects.equals(emojiTexts.get(i), emojiTexts.get(i - 1))) {
+ if (DEBUG) {
+ Log.d(TAG, "Two of the same emojis in sequence: " + emojiTexts.get(i));
+ }
+ return emojiTexts.get(i);
+ }
+ }
+ }
+
+ // No equal emojis in sequence.
+ return null;
+ }
+
private RemoteViews getViewForContentLayout() {
RemoteViews views = new RemoteViews(mContext.getPackageName(),
getLayoutForContent());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java
index d353d52..764cdee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleTileViewHelperTest.java
@@ -76,6 +76,14 @@
private static final String NAME = "username";
private static final UserHandle USER = new UserHandle(0);
private static final String SENDER = "sender";
+
+ private static final CharSequence EMOJI_BR_FLAG = "\ud83c\udde7\ud83c\uddf7";
+ private static final CharSequence EMOJI_BEAR = "\ud83d\udc3b";
+ private static final CharSequence EMOJI_THUMBS_UP_BROWN_SKIN = "\uD83D\uDC4D\uD83C\uDFFD";
+ private static final CharSequence EMOJI_JOY = "\uD83D\uDE02";
+ private static final CharSequence EMOJI_FAMILY =
+ "\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc67";
+
private static final PeopleSpaceTile PERSON_TILE_WITHOUT_NOTIFICATION =
new PeopleSpaceTile
.Builder(SHORTCUT_ID_1, NAME, ICON, new Intent())
@@ -701,94 +709,151 @@
@Test
- public void testGetBackgroundTextFromMessageNoPunctuation() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage("test");
+ public void testGetDoublePunctuationNoPunctuation() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation("test");
assertThat(backgroundText).isNull();
}
@Test
- public void testGetBackgroundTextFromMessageSingleExclamation() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage("test!");
+ public void testGetDoublePunctuationSingleExclamation() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation("test!");
assertThat(backgroundText).isNull();
}
@Test
- public void testGetBackgroundTextFromMessageSingleQuestion() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage("?test");
+ public void testGetDoublePunctuationSingleQuestion() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation("?test");
assertThat(backgroundText).isNull();
}
@Test
- public void testGetBackgroundTextFromMessageSeparatedMarks() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage("test! right!");
+ public void testGetDoublePunctuationSeparatedMarks() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation("test! right!");
assertThat(backgroundText).isNull();
}
@Test
- public void testGetBackgroundTextFromMessageDoubleExclamation() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage("!!test");
+ public void testGetDoublePunctuationDoubleExclamation() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation("!!test");
assertThat(backgroundText).isEqualTo("!");
}
@Test
- public void testGetBackgroundTextFromMessageDoubleQuestion() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage("test??");
+ public void testGetDoublePunctuationDoubleQuestion() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation("test??");
assertThat(backgroundText).isEqualTo("?");
}
@Test
- public void testGetBackgroundTextFromMessageMixed() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage("test?!");
+ public void testGetDoublePunctuationMixed() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation("test?!");
assertThat(backgroundText).isEqualTo("!?");
}
@Test
- public void testGetBackgroundTextFromMessageMixedInTheMiddle() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage(
+ public void testGetDoublePunctuationMixedInTheMiddle() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation(
"test!? in the middle");
assertThat(backgroundText).isEqualTo("!?");
}
@Test
- public void testGetBackgroundTextFromMessageMixedDifferentOrder() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage(
+ public void testGetDoublePunctuationMixedDifferentOrder() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation(
"test!? in the middle");
assertThat(backgroundText).isEqualTo("!?");
}
@Test
- public void testGetBackgroundTextFromMessageMultiple() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage(
+ public void testGetDoublePunctuationMultiple() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation(
"test!?!!? in the middle");
assertThat(backgroundText).isEqualTo("!?");
}
@Test
- public void testGetBackgroundTextFromMessageQuestionFirst() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage(
+ public void testGetDoublePunctuationQuestionFirst() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation(
"test?? in the middle!!");
assertThat(backgroundText).isEqualTo("?");
}
@Test
- public void testGetBackgroundTextFromMessageExclamationFirst() {
- String backgroundText = mPeopleTileViewHelper.getBackgroundTextFromMessage(
+ public void testGetDoublePunctuationExclamationFirst() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoublePunctuation(
"test!! in the middle??");
assertThat(backgroundText).isEqualTo("!");
}
+ @Test
+ public void testGetDoubleEmojisNoEmojis() {
+ CharSequence backgroundText = mPeopleTileViewHelper
+ .getDoubleEmoji("This string has no emojis.");
+ assertThat(backgroundText).isNull();
+ }
+
+ @Test
+ public void testGetDoubleEmojisSingleEmoji() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoubleEmoji(
+ "This string has one emoji " + EMOJI_JOY + " in the middle.");
+ assertThat(backgroundText).isNull();
+ }
+
+ @Test
+ public void testGetDoubleEmojisSingleEmojiThenTwoEmojis() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoubleEmoji(
+ "This string has one emoji " + EMOJI_JOY + " in the middle, then two "
+ + EMOJI_BEAR + EMOJI_BEAR);
+ assertEquals(backgroundText, EMOJI_BEAR);
+ }
+
+ @Test
+ public void testGetDoubleEmojisTwoEmojisWithModifier() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoubleEmoji(
+ "Yes! " + EMOJI_THUMBS_UP_BROWN_SKIN + EMOJI_THUMBS_UP_BROWN_SKIN + " Sure.");
+ assertEquals(backgroundText, EMOJI_THUMBS_UP_BROWN_SKIN);
+ }
+
+ @Test
+ public void testGetDoubleEmojisTwoFlagEmojis() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoubleEmoji(
+ "Let's travel to " + EMOJI_BR_FLAG + EMOJI_BR_FLAG + " next year.");
+ assertEquals(backgroundText, EMOJI_BR_FLAG);
+ }
+
+ @Test
+ public void testGetDoubleEmojiTwoBears() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoubleEmoji(
+ EMOJI_BEAR.toString() + EMOJI_BEAR.toString() + "bears!");
+ assertEquals(backgroundText, EMOJI_BEAR);
+ }
+
+ @Test
+ public void testGetDoubleEmojiTwoEmojisTwice() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoubleEmoji(
+ "Two sets of two emojis: " + EMOJI_FAMILY + EMOJI_FAMILY + EMOJI_BEAR + EMOJI_BEAR);
+ assertEquals(backgroundText, EMOJI_FAMILY);
+ }
+
+ @Test
+ public void testGetDoubleEmojiTwoEmojisSeparated() {
+ CharSequence backgroundText = mPeopleTileViewHelper.getDoubleEmoji(
+ "Two emojis " + EMOJI_BEAR + " separated " + EMOJI_BEAR + ".");
+ assertThat(backgroundText).isNull();
+ }
+
private int getSizeInDp(int dimenResourceId) {
return (int) (mContext.getResources().getDimension(dimenResourceId)
/ mContext.getResources().getDisplayMetrics().density);