diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 4135bbe3e86d8..9f6ef962330e6 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -583,7 +583,7 @@
android:label="@string/people_tile_title"
android:enabled="true"
android:exported="true"
- android:theme="@android:style/Theme.Material.NoActionBar">
+ android:theme="@style/Theme.PeopleTileConfigActivity">
diff --git a/packages/SystemUI/res/drawable/people_space_activity_card.xml b/packages/SystemUI/res/drawable/people_space_activity_card.xml
index 81162d208b282..338bff8e315a2 100644
--- a/packages/SystemUI/res/drawable/people_space_activity_card.xml
+++ b/packages/SystemUI/res/drawable/people_space_activity_card.xml
@@ -14,6 +14,5 @@
~ limitations under the License.
-->
-
-
+
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/rounded_bg_full_large_radius.xml b/packages/SystemUI/res/drawable/rounded_bg_full_large_radius.xml
new file mode 100644
index 0000000000000..aa940bde7e0da
--- /dev/null
+++ b/packages/SystemUI/res/drawable/rounded_bg_full_large_radius.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
diff --git a/packages/SystemUI/res/layout/people_space_activity.xml b/packages/SystemUI/res/layout/people_space_activity.xml
index 1784cae816ce2..fa199439ec691 100644
--- a/packages/SystemUI/res/layout/people_space_activity.xml
+++ b/packages/SystemUI/res/layout/people_space_activity.xml
@@ -13,42 +13,101 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ android:padding="8dp">
+
-
+ android:layout_gravity="center_horizontal"
+ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.ListItem"
+ android:textColor="?android:attr/textColorPrimary"
+ android:textSize="16sp"
+ android:padding="24dp" />
-
+
-
+ android:layout_marginTop="16dp"
+ android:orientation="vertical">
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/people_space_activity_list_divider.xml b/packages/SystemUI/res/layout/people_space_activity_list_divider.xml
new file mode 100644
index 0000000000000..3b9fb3be38147
--- /dev/null
+++ b/packages/SystemUI/res/layout/people_space_activity_list_divider.xml
@@ -0,0 +1,21 @@
+
+
+
diff --git a/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml b/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml
new file mode 100644
index 0000000000000..232cd72361138
--- /dev/null
+++ b/packages/SystemUI/res/layout/people_space_activity_no_conversations.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/people_space_tile_view.xml b/packages/SystemUI/res/layout/people_space_tile_view.xml
index c751e7d08fd10..8f64ddf7011d7 100644
--- a/packages/SystemUI/res/layout/people_space_tile_view.xml
+++ b/packages/SystemUI/res/layout/people_space_tile_view.xml
@@ -24,7 +24,6 @@
android:background="@drawable/people_space_activity_card"
android:padding="12dp"
android:elevation="4dp"
- android:layout_marginBottom="12dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -43,12 +42,14 @@
android:id="@+id/tile_view_package_icon"
android:layout_width="16dp"
android:layout_marginStart="-8dp"
+ android:layout_marginTop="32dp"
android:layout_height="16dp" />
+ android:orientation="horizontal"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical">
-
-
+ android:layout_gravity="center_vertical"/>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index a815318c986f1..f4b50eb71b390 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2848,6 +2848,14 @@
Conversation widgets
Tap a conversation to add it to your Home screen
+
+ Check back here once you get some messages
+
+ Priority conversations
+
+ Recent conversations
+
+ Okay
%1$s ago
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index ecc1a5c831b8b..cb21245fa6397 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -669,6 +669,11 @@
- true
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
index 54d6a2eda82a4..ba41d33bab928 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java
@@ -27,28 +27,33 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.Outline;
+import android.graphics.drawable.GradientDrawable;
import android.os.Bundle;
import android.os.ServiceManager;
import android.util.Log;
+import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewOutlineProvider;
+import android.widget.LinearLayout;
import com.android.systemui.R;
import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
+import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
-/**
- * Shows the user their tiles for their priority People (go/live-status).
- */
+/** People Tile Widget configuration activity that shows the user their conversation tiles. */
public class PeopleSpaceActivity extends Activity {
private static final String TAG = "PeopleSpaceActivity";
private static final boolean DEBUG = PeopleSpaceUtils.DEBUG;
- private ViewGroup mPeopleSpaceLayout;
private IPeopleManager mPeopleManager;
private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
private INotificationManager mNotificationManager;
@@ -70,8 +75,6 @@ public class PeopleSpaceActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- setContentView(R.layout.people_space_activity);
- mPeopleSpaceLayout = findViewById(R.id.people_space_layout);
mContext = getApplicationContext();
mNotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
@@ -79,38 +82,74 @@ public class PeopleSpaceActivity extends Activity {
mPeopleManager = IPeopleManager.Stub.asInterface(
ServiceManager.getService(Context.PEOPLE_SERVICE));
mLauncherApps = mContext.getSystemService(LauncherApps.class);
- setTileViewsWithPriorityConversations();
mAppWidgetId = getIntent().getIntExtra(EXTRA_APPWIDGET_ID,
INVALID_APPWIDGET_ID);
setResult(RESULT_CANCELED);
}
- /**
- * Retrieves all priority conversations and sets a {@link PeopleSpaceTileView}s for each
- * priority conversation.
- */
- private void setTileViewsWithPriorityConversations() {
+ /** Builds the conversation selection activity. */
+ private void buildActivity() {
+ List priorityTiles = new ArrayList<>();
+ List recentTiles = new ArrayList<>();
try {
- List tiles = PeopleSpaceUtils.getTiles(mContext, mNotificationManager,
+ priorityTiles = PeopleSpaceUtils.getPriorityTiles(mContext, mNotificationManager,
+ mPeopleManager, mLauncherApps, mNotificationEntryManager);
+ recentTiles = PeopleSpaceUtils.getRecentTiles(mContext, mNotificationManager,
mPeopleManager, mLauncherApps, mNotificationEntryManager);
- for (PeopleSpaceTile tile : tiles) {
- PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext, mPeopleSpaceLayout,
- tile.getId());
- setTileView(tileView, tile);
- }
} catch (Exception e) {
Log.e(TAG, "Couldn't retrieve conversations", e);
}
+
+ // If no conversations, render activity without conversations
+ if (recentTiles.isEmpty() && priorityTiles.isEmpty()) {
+ setContentView(R.layout.people_space_activity_no_conversations);
+
+ // The Tile preview has colorBackground as its background. Change it so it's different
+ // than the activity's background.
+ LinearLayout item = findViewById(R.id.item);
+ GradientDrawable shape = (GradientDrawable) item.getBackground();
+ final TypedArray ta = mContext.obtainStyledAttributes(
+ new int[] {android.R.attr.colorBackgroundFloating});
+ shape.setColor(ta.getColor(0, Color.WHITE));
+ return;
+ }
+
+ setContentView(R.layout.people_space_activity);
+ setTileViews(R.id.priority, R.id.priority_tiles, priorityTiles);
+ setTileViews(R.id.recent, R.id.recent_tiles, recentTiles);
+ }
+
+ private ViewOutlineProvider mViewOutlineProvider = new ViewOutlineProvider() {
+ @Override
+ public void getOutline(View view, Outline outline) {
+ outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(),
+ mContext.getResources().getDimension(R.dimen.people_space_widget_radius));
+ }
+ };
+
+ /** Sets a {@link PeopleSpaceTileView}s for each conversation. */
+ private void setTileViews(int viewId, int tilesId, List tiles) {
+ if (tiles.isEmpty()) {
+ LinearLayout view = findViewById(viewId);
+ view.setVisibility(View.GONE);
+ return;
+ }
+
+ ViewGroup layout = findViewById(tilesId);
+ layout.setClipToOutline(true);
+ layout.setOutlineProvider(mViewOutlineProvider);
+ for (int i = 0; i < tiles.size(); ++i) {
+ PeopleSpaceTile tile = tiles.get(i);
+ PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext,
+ layout, tile.getId(), i == (tiles.size() - 1));
+ setTileView(tileView, tile);
+ }
}
/** Sets {@code tileView} with the data in {@code conversation}. */
private void setTileView(PeopleSpaceTileView tileView, PeopleSpaceTile tile) {
try {
String pkg = tile.getPackageName();
- String status =
- PeopleSpaceUtils.getLastInteractionString(mContext,
- tile.getLastInteractionTimestamp());
- tileView.setStatus(status);
tileView.setName(tile.getUserName().toString());
tileView.setPackageIcon(mPackageManager.getApplicationIcon(pkg));
@@ -141,6 +180,12 @@ public class PeopleSpaceActivity extends Activity {
finish();
}
+ /** Finish activity without choosing a widget. */
+ public void dismissActivity(View v) {
+ if (DEBUG) Log.d(TAG, "Activity dismissed with no widgets added!");
+ finish();
+ }
+
private void setActivityResult(int result) {
Intent resultValue = new Intent();
resultValue.putExtra(EXTRA_APPWIDGET_ID, mAppWidgetId);
@@ -151,6 +196,12 @@ public class PeopleSpaceActivity extends Activity {
protected void onResume() {
super.onResume();
// Refresh tile views to sync new conversations.
- setTileViewsWithPriorityConversations();
+ buildActivity();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ finish();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java
index 6f89332e66a93..e30ad80be3f6a 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java
@@ -37,11 +37,10 @@ public class PeopleSpaceTileView extends LinearLayout {
private View mTileView;
private TextView mNameView;
- private TextView mStatusView;
private ImageView mPackageIconView;
private ImageView mPersonIconView;
- public PeopleSpaceTileView(Context context, ViewGroup view, String shortcutId) {
+ public PeopleSpaceTileView(Context context, ViewGroup view, String shortcutId, boolean isLast) {
super(context);
mTileView = view.findViewWithTag(shortcutId);
if (mTileView == null) {
@@ -50,9 +49,13 @@ public class PeopleSpaceTileView extends LinearLayout {
view.addView(mTileView, LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
mTileView.setTag(shortcutId);
+
+ // If it's not the last conversation in this section, add a divider.
+ if (!isLast) {
+ inflater.inflate(R.layout.people_space_activity_list_divider, view, true);
+ }
}
mNameView = mTileView.findViewById(R.id.tile_view_name);
- mStatusView = mTileView.findViewById(R.id.tile_view_status);
mPackageIconView = mTileView.findViewById(R.id.tile_view_package_icon);
mPersonIconView = mTileView.findViewById(R.id.tile_view_person_icon);
}
@@ -62,11 +65,6 @@ public class PeopleSpaceTileView extends LinearLayout {
mNameView.setText(name);
}
- /** Sets the status text on the tile. */
- public void setStatus(String status) {
- mStatusView.setText(status);
- }
-
/** Sets the package drawable on the tile. */
public void setPackageIcon(Drawable drawable) {
mPackageIconView.setImageDrawable(drawable);
diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
index 440c5efab0085..5f6d95f4824d4 100644
--- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java
@@ -19,6 +19,7 @@ package com.android.systemui.people;
import static android.app.Notification.CATEGORY_MISSED_CALL;
import static android.app.Notification.EXTRA_MESSAGES;
+import android.annotation.NonNull;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.people.ConversationChannel;
@@ -126,8 +127,9 @@ public class PeopleSpaceUtils {
}
}
- /** Returns a list of map entries corresponding to user's conversations. */
- public static List getTiles(
+ /** Returns a list of map entries corresponding to user's priority conversations. */
+ @NonNull
+ public static List getPriorityTiles(
Context context, INotificationManager notificationManager, IPeopleManager peopleManager,
LauncherApps launcherApps, NotificationEntryManager notificationEntryManager)
throws Exception {
@@ -139,11 +141,23 @@ public class PeopleSpaceUtils {
.filter(c -> c.getNotificationChannel() != null
&& c.getNotificationChannel().isImportantConversation())
.map(c -> c.getShortcutInfo());
- List tiles = getSortedTiles(peopleManager, launcherApps,
+ List priorityTiles = getSortedTiles(peopleManager, launcherApps,
priorityConversations);
+ priorityTiles = augmentTilesFromVisibleNotifications(
+ context, priorityTiles, notificationEntryManager);
+ return priorityTiles;
+ }
- // Sort and then add recent and non priority conversations to tiles list.
+ /** Returns a list of map entries corresponding to user's recent conversations. */
+ @NonNull
+ public static List getRecentTiles(
+ Context context, INotificationManager notificationManager, IPeopleManager peopleManager,
+ LauncherApps launcherApps, NotificationEntryManager notificationEntryManager)
+ throws Exception {
if (DEBUG) Log.d(TAG, "Add recent conversations");
+ List conversations =
+ notificationManager.getConversations(
+ false).getList();
Stream nonPriorityConversations = conversations.stream()
.filter(c -> c.getNotificationChannel() == null
|| !c.getNotificationChannel().isImportantConversation())
@@ -159,10 +173,10 @@ public class PeopleSpaceUtils {
recentConversations);
List recentTiles =
getSortedTiles(peopleManager, launcherApps, mergedStream);
- tiles.addAll(recentTiles);
- tiles = augmentTilesFromVisibleNotifications(context, tiles, notificationEntryManager);
- return tiles;
+ recentTiles = augmentTilesFromVisibleNotifications(
+ context, recentTiles, notificationEntryManager);
+ return recentTiles;
}
/** Returns stored widgets for the conversation specified. */
diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
index 1f4dffa09d861..0ce03ad2ac2b2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java
@@ -239,37 +239,38 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase {
}
@Test
- public void testGetTilesReturnsSortedListWithMultipleRecentConversations() throws Exception {
+ public void testGetRecentTilesReturnsSortedListWithOnlyRecentConversations() throws Exception {
// Ensure the less-recent Important conversation is before more recent conversations.
ConversationChannelWrapper newerNonImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID_1, false, 3);
+ ConversationChannelWrapper newerImportantConversation = getConversationChannelWrapper(
+ SHORTCUT_ID_1 + 1, true, 3);
ConversationChannelWrapper olderImportantConversation = getConversationChannelWrapper(
- SHORTCUT_ID_1 + 1,
+ SHORTCUT_ID_1 + 2,
true, 1);
when(mNotificationManager.getConversations(anyBoolean())).thenReturn(
new ParceledListSlice(Arrays.asList(
- newerNonImportantConversation, olderImportantConversation)));
+ newerNonImportantConversation, newerImportantConversation,
+ olderImportantConversation)));
// Ensure the non-Important conversation is sorted between these recent conversations.
ConversationChannel recentConversationBeforeNonImportantConversation =
getConversationChannel(
- SHORTCUT_ID_1 + 2, 4);
+ SHORTCUT_ID_1 + 3, 4);
ConversationChannel recentConversationAfterNonImportantConversation =
- getConversationChannel(SHORTCUT_ID_1 + 3,
+ getConversationChannel(SHORTCUT_ID_1 + 4,
2);
when(mPeopleManager.getRecentConversations()).thenReturn(
new ParceledListSlice(Arrays.asList(recentConversationAfterNonImportantConversation,
recentConversationBeforeNonImportantConversation)));
- List orderedShortcutIds = PeopleSpaceUtils.getTiles(
+ List orderedShortcutIds = PeopleSpaceUtils.getRecentTiles(
mContext, mNotificationManager, mPeopleManager,
mLauncherApps, mNotificationEntryManager)
.stream().map(tile -> tile.getId()).collect(Collectors.toList());
+ // Check for sorted recent conversations.
assertThat(orderedShortcutIds).containsExactly(
- // Even though the oldest conversation, should be first since "important"
- olderImportantConversation.getShortcutInfo().getId(),
- // Non-priority conversations should be sorted within recent conversations.
recentConversationBeforeNonImportantConversation.getShortcutInfo().getId(),
newerNonImportantConversation.getShortcutInfo().getId(),
recentConversationAfterNonImportantConversation.getShortcutInfo().getId())
@@ -277,7 +278,7 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase {
}
@Test
- public void testGetTilesReturnsSortedListWithMultipleImportantAndRecentConversations()
+ public void testGetPriorityTilesReturnsSortedListWithOnlyImportantConversations()
throws Exception {
// Ensure the less-recent Important conversation is before more recent conversations.
ConversationChannelWrapper newerNonImportantConversation = getConversationChannelWrapper(
@@ -303,19 +304,15 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase {
new ParceledListSlice(Arrays.asList(recentConversationAfterNonImportantConversation,
recentConversationBeforeNonImportantConversation)));
- List orderedShortcutIds = PeopleSpaceUtils.getTiles(
+ List orderedShortcutIds = PeopleSpaceUtils.getPriorityTiles(
mContext, mNotificationManager, mPeopleManager,
mLauncherApps, mNotificationEntryManager)
.stream().map(tile -> tile.getId()).collect(Collectors.toList());
+ // Check for sorted priority conversations.
assertThat(orderedShortcutIds).containsExactly(
- // Important conversations should be sorted at the beginning.
newerImportantConversation.getShortcutInfo().getId(),
- olderImportantConversation.getShortcutInfo().getId(),
- // Non-priority conversations should be sorted within recent conversations.
- recentConversationBeforeNonImportantConversation.getShortcutInfo().getId(),
- newerNonImportantConversation.getShortcutInfo().getId(),
- recentConversationAfterNonImportantConversation.getShortcutInfo().getId())
+ olderImportantConversation.getShortcutInfo().getId())
.inOrder();
}