Loading core/java/android/app/people/PeopleSpaceTile.java +35 −2 Original line number Diff line number Diff line Loading @@ -18,7 +18,12 @@ package android.app.people; import android.annotation.NonNull; import android.content.Intent; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Parcel; Loading Loading @@ -147,10 +152,10 @@ public class PeopleSpaceTile implements Parcelable { mPackageName = intent == null ? null : intent.getPackage(); } public Builder(ShortcutInfo info) { public Builder(ShortcutInfo info, LauncherApps launcherApps) { mId = info.getId(); mUserName = info.getLabel(); mUserIcon = info.getIcon(); mUserIcon = convertDrawableToIcon(launcherApps.getShortcutIconDrawable(info, 0)); mUid = info.getUserId(); mPackageName = info.getPackage(); } Loading Loading @@ -270,4 +275,32 @@ public class PeopleSpaceTile implements Parcelable { return new PeopleSpaceTile[size]; } }; /** Converts {@code drawable} to a {@link Icon}. */ public static Icon convertDrawableToIcon(Drawable drawable) { if (drawable == null) { return null; } if (drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; if (bitmapDrawable.getBitmap() != null) { return Icon.createWithBitmap(bitmapDrawable.getBitmap()); } } Bitmap bitmap; if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) { bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel } else { bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return Icon.createWithBitmap(bitmap); } } core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java +62 −35 Original line number Diff line number Diff line Loading @@ -21,11 +21,18 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import android.app.Notification; import android.content.Context; import android.content.Intent; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.UserHandle; Loading @@ -38,26 +45,37 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) @SmallTest public class PeopleSpaceTileTest { private Context mContext; private final Drawable mDrawable = new ColorDrawable(Color.BLUE); private final Icon mIcon = PeopleSpaceTile.convertDrawableToIcon(mDrawable); @Mock private LauncherApps mLauncherApps; @Before public void setUp() { mContext = InstrumentationRegistry.getContext(); MockitoAnnotations.initMocks(this); when(mLauncherApps.getShortcutIconDrawable(any(), eq(0))).thenReturn(mDrawable); } @Test public void testId() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getId()).isEqualTo("123"); tile = new PeopleSpaceTile.Builder(new ShortcutInfo.Builder(mContext, "123").build()).setId( "5").build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setId("5") .build(); assertThat(tile.getId()).isEqualTo("5"); tile = new PeopleSpaceTile.Builder("12", null, null, null).build(); Loading @@ -67,11 +85,13 @@ public class PeopleSpaceTileTest { @Test public void testUserName() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getUserName()).isNull(); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setUserName("Name 1").build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setUserName("Name 1") .build(); assertThat(tile.getUserName()).isEqualTo("Name 1"); tile = new PeopleSpaceTile.Builder(null, "Name 2", null, null).build(); Loading @@ -81,21 +101,19 @@ public class PeopleSpaceTileTest { @Test public void testUserIcon() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setUserIcon( Icon.createWithResource(mContext, 1)).build(); assertThat(tile.getUserIcon().toString()).isEqualTo( Icon.createWithResource(mContext, 1).toString()); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setUserIcon( mIcon).build(); assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); tile = new PeopleSpaceTile.Builder("12", null, Icon.createWithResource(mContext, 2), tile = new PeopleSpaceTile.Builder("12", null, mIcon, null).build(); assertThat(tile.getUserIcon().toString()).isEqualTo( Icon.createWithResource(mContext, 2).toString()); assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); } @Test public void testContactUri() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setContactUri( new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setContactUri( Uri.parse("test")).build(); assertThat(tile.getContactUri()).isEqualTo(Uri.parse("test")); Loading @@ -103,8 +121,10 @@ public class PeopleSpaceTileTest { @Test public void testUid() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setUid(42).build(); PeopleSpaceTile tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setUid(42) .build(); assertThat(tile.getUid()).isEqualTo(42); } Loading @@ -112,12 +132,12 @@ public class PeopleSpaceTileTest { @Test public void testPackageName() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); // Automatically added by creating a ShortcutInfo. assertThat(tile.getPackageName()).isEqualTo("com.android.frameworks.coretests"); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setPackageName( new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setPackageName( "package.name").build(); assertThat(tile.getPackageName()).isEqualTo("package.name"); Loading @@ -129,36 +149,39 @@ public class PeopleSpaceTileTest { @Test public void testLastInteractionTimestamp() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getLastInteractionTimestamp()).isEqualTo(0L); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setLastInteractionTimestamp( 7L).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setLastInteractionTimestamp(7L) .build(); assertThat(tile.getLastInteractionTimestamp()).isEqualTo(7L); } @Test public void testImportantConversation() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertFalse(tile.isImportantConversation()); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setIsImportantConversation( true).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setIsImportantConversation(true) .build(); assertTrue(tile.isImportantConversation()); } @Test public void testHiddenConversation() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertFalse(tile.isHiddenConversation()); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setIsHiddenConversation( true).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setIsHiddenConversation(true) .build(); assertTrue(tile.isHiddenConversation()); } Loading @@ -168,8 +191,10 @@ public class PeopleSpaceTileTest { StatusBarNotification sbn = new StatusBarNotification("pkg" /* pkg */, "pkg" /* opPkg */, 1 /* id */, "" /* tag */, 0 /* uid */, 0 /* initialPid */, 0 /* score */, notification, UserHandle.CURRENT, 0 /* postTime */); PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setNotification(sbn).build(); PeopleSpaceTile tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setNotification(sbn) .build(); assertThat(tile.getNotification()).isEqualTo(sbn); } Loading @@ -177,11 +202,13 @@ public class PeopleSpaceTileTest { @Test public void testIntent() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getIntent()).isNull(); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setIntent(new Intent()).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setIntent(new Intent()) .build(); assertThat(tile.getIntent().toString()).isEqualTo(new Intent().toString()); tile = new PeopleSpaceTile.Builder("12", null, null, new Intent()).build(); Loading packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +12 −12 Original line number Diff line number Diff line Loading @@ -19,10 +19,10 @@ package com.android.systemui.people; import android.app.Activity; import android.app.INotificationManager; import android.app.people.IPeopleManager; import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.Bundle; import android.os.ServiceManager; import android.util.Log; Loading Loading @@ -68,13 +68,13 @@ public class PeopleSpaceActivity extends Activity { */ private void setTileViewsWithPriorityConversations() { try { List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = PeopleSpaceUtils.getShortcutInfos( mContext, mNotificationManager, mPeopleManager); for (Map.Entry<Long, ShortcutInfo> entry : shortcutInfos) { ShortcutInfo shortcutInfo = entry.getValue(); List<Map.Entry<Long, PeopleSpaceTile>> tiles = PeopleSpaceUtils.getTiles( mContext, mNotificationManager, mPeopleManager, mLauncherApps); for (Map.Entry<Long, PeopleSpaceTile> entry : tiles) { PeopleSpaceTile tile = entry.getValue(); PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext, mPeopleSpaceLayout, shortcutInfo.getId()); setTileView(tileView, shortcutInfo, entry.getKey()); tile.getId()); setTileView(tileView, tile, entry.getKey()); } } catch (Exception e) { Log.e(TAG, "Couldn't retrieve conversations", e); Loading @@ -82,18 +82,18 @@ public class PeopleSpaceActivity extends Activity { } /** Sets {@code tileView} with the data in {@code conversation}. */ private void setTileView(PeopleSpaceTileView tileView, ShortcutInfo shortcutInfo, private void setTileView(PeopleSpaceTileView tileView, PeopleSpaceTile tile, long lastInteraction) { try { String pkg = shortcutInfo.getPackage(); String pkg = tile.getPackageName(); String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); tileView.setStatus(status); tileView.setName(shortcutInfo.getLabel().toString()); tileView.setName(tile.getUserName().toString()); tileView.setPackageIcon(mPackageManager.getApplicationIcon(pkg)); tileView.setPersonIcon(mLauncherApps.getShortcutIconDrawable(shortcutInfo, 0)); tileView.setOnClickListener(mLauncherApps, shortcutInfo); tileView.setPersonIcon(tile.getUserIcon()); tileView.setOnClickListener(mLauncherApps, tile); } catch (Exception e) { Log.e(TAG, "Couldn't retrieve shortcut information", e); } Loading packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java +10 −6 Original line number Diff line number Diff line Loading @@ -16,10 +16,12 @@ package com.android.systemui.people; import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.UserHandle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; Loading Loading @@ -71,13 +73,15 @@ public class PeopleSpaceTileView extends LinearLayout { mPackageIconView.setImageDrawable(drawable); } /** Sets the person drawable on the tile. */ public void setPersonIcon(Drawable drawable) { mPersonIconView.setImageDrawable(drawable); /** Sets the person bitmap on the tile. */ public void setPersonIcon(Icon icon) { mPersonIconView.setImageIcon(icon); } /** Sets the click listener of the tile. */ public void setOnClickListener(LauncherApps launcherApps, ShortcutInfo shortcutInfo) { mTileView.setOnClickListener(v -> launcherApps.startShortcut(shortcutInfo, null, null)); public void setOnClickListener(LauncherApps launcherApps, PeopleSpaceTile tile) { mTileView.setOnClickListener(v -> launcherApps.startShortcut(tile.getPackageName(), tile.getId(), null, null, UserHandle.getUserHandleForUid(tile.getUid()))); } } packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java +26 −21 Original line number Diff line number Diff line Loading @@ -19,8 +19,9 @@ package com.android.systemui.people; import android.app.INotificationManager; import android.app.people.ConversationChannel; import android.app.people.IPeopleManager; import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.pm.ShortcutInfo; import android.content.pm.LauncherApps; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; Loading Loading @@ -51,30 +52,34 @@ public class PeopleSpaceUtils { private static final int MIN_HOUR = 1; private static final int ONE_DAY = 1; /** Returns a list of map entries corresponding to user's conversations. */ public static List<Map.Entry<Long, ShortcutInfo>> getShortcutInfos(Context context, INotificationManager notificationManager, IPeopleManager peopleManager) public static List<Map.Entry<Long, PeopleSpaceTile>> getTiles( Context context, INotificationManager notificationManager, IPeopleManager peopleManager, LauncherApps launcherApps) throws Exception { boolean showAllConversations = Settings.Global.getInt(context.getContentResolver(), Settings.Global.PEOPLE_SPACE_CONVERSATION_TYPE, 0) == 0; List<ConversationChannelWrapper> conversations = notificationManager.getConversations( true).getList(); List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = getSortedShortcutInfos(peopleManager, conversations.stream().map(c -> c.getShortcutInfo())); List<Map.Entry<Long, PeopleSpaceTile>> tiles = getSortedTiles(peopleManager, conversations.stream().map(c -> new PeopleSpaceTile.Builder(c.getShortcutInfo(), launcherApps).build())); if (showAllConversations) { List<ConversationChannel> recentConversations = peopleManager.getRecentConversations().getList(); List<Map.Entry<Long, ShortcutInfo>> recentShortcutInfos = getSortedShortcutInfos( peopleManager, recentConversations.stream().map(c -> c.getShortcutInfo())); shortcutInfos.addAll(recentShortcutInfos); List<Map.Entry<Long, PeopleSpaceTile>> recentTiles = getSortedTiles(peopleManager, recentConversations.stream().map(c -> new PeopleSpaceTile .Builder(c.getShortcutInfo(), launcherApps) .build())); tiles.addAll(recentTiles); } return shortcutInfos; return tiles; } /** Returns a list sorted by ascending last interaction time from {@code stream}. */ private static List<Map.Entry<Long, ShortcutInfo>> getSortedShortcutInfos( IPeopleManager peopleManager, Stream<ShortcutInfo> stream) { private static List<Map.Entry<Long, PeopleSpaceTile>> getSortedTiles( IPeopleManager peopleManager, Stream<PeopleSpaceTile> stream) { return stream .filter(c -> shouldKeepConversation(c)) .map(c -> Map.entry(getLastInteraction(peopleManager, c), c)) Loading @@ -82,13 +87,13 @@ public class PeopleSpaceUtils { .collect(Collectors.toList()); } /** Returns the last interaction time with the user specified by {@code shortcutInfo}. */ /** Returns the last interaction time with the user specified by {@code PeopleSpaceTile}. */ private static Long getLastInteraction(IPeopleManager peopleManager, ShortcutInfo shortcutInfo) { PeopleSpaceTile tile) { try { int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); String pkg = shortcutInfo.getPackage(); return peopleManager.getLastInteraction(pkg, userId, shortcutInfo.getId()); int userId = UserHandle.getUserHandleForUid(tile.getUid()).getIdentifier(); String pkg = tile.getPackageName(); return peopleManager.getLastInteraction(pkg, userId, tile.getId()); } catch (Exception e) { Log.e(TAG, "Couldn't retrieve last interaction time", e); return 0L; Loading Loading @@ -157,13 +162,13 @@ public class PeopleSpaceUtils { * * <p>A valid {@code conversation} must: * <ul> * <li>Have a non-null {@link ShortcutInfo} * <li>Have an associated label in the {@link ShortcutInfo} * <li>Have a non-null {@link PeopleSpaceTile} * <li>Have an associated label in the {@link PeopleSpaceTile} * </ul> * </li> */ public static boolean shouldKeepConversation(ShortcutInfo shortcutInfo) { return shortcutInfo != null && shortcutInfo.getLabel().length() != 0; public static boolean shouldKeepConversation(PeopleSpaceTile tile) { return tile != null && tile.getUserName().length() != 0; } } Loading
core/java/android/app/people/PeopleSpaceTile.java +35 −2 Original line number Diff line number Diff line Loading @@ -18,7 +18,12 @@ package android.app.people; import android.annotation.NonNull; import android.content.Intent; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.Parcel; Loading Loading @@ -147,10 +152,10 @@ public class PeopleSpaceTile implements Parcelable { mPackageName = intent == null ? null : intent.getPackage(); } public Builder(ShortcutInfo info) { public Builder(ShortcutInfo info, LauncherApps launcherApps) { mId = info.getId(); mUserName = info.getLabel(); mUserIcon = info.getIcon(); mUserIcon = convertDrawableToIcon(launcherApps.getShortcutIconDrawable(info, 0)); mUid = info.getUserId(); mPackageName = info.getPackage(); } Loading Loading @@ -270,4 +275,32 @@ public class PeopleSpaceTile implements Parcelable { return new PeopleSpaceTile[size]; } }; /** Converts {@code drawable} to a {@link Icon}. */ public static Icon convertDrawableToIcon(Drawable drawable) { if (drawable == null) { return null; } if (drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; if (bitmapDrawable.getBitmap() != null) { return Icon.createWithBitmap(bitmapDrawable.getBitmap()); } } Bitmap bitmap; if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) { bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel } else { bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); } Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return Icon.createWithBitmap(bitmap); } }
core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java +62 −35 Original line number Diff line number Diff line Loading @@ -21,11 +21,18 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import android.app.Notification; import android.content.Context; import android.content.Intent; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.UserHandle; Loading @@ -38,26 +45,37 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) @SmallTest public class PeopleSpaceTileTest { private Context mContext; private final Drawable mDrawable = new ColorDrawable(Color.BLUE); private final Icon mIcon = PeopleSpaceTile.convertDrawableToIcon(mDrawable); @Mock private LauncherApps mLauncherApps; @Before public void setUp() { mContext = InstrumentationRegistry.getContext(); MockitoAnnotations.initMocks(this); when(mLauncherApps.getShortcutIconDrawable(any(), eq(0))).thenReturn(mDrawable); } @Test public void testId() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getId()).isEqualTo("123"); tile = new PeopleSpaceTile.Builder(new ShortcutInfo.Builder(mContext, "123").build()).setId( "5").build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setId("5") .build(); assertThat(tile.getId()).isEqualTo("5"); tile = new PeopleSpaceTile.Builder("12", null, null, null).build(); Loading @@ -67,11 +85,13 @@ public class PeopleSpaceTileTest { @Test public void testUserName() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getUserName()).isNull(); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setUserName("Name 1").build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setUserName("Name 1") .build(); assertThat(tile.getUserName()).isEqualTo("Name 1"); tile = new PeopleSpaceTile.Builder(null, "Name 2", null, null).build(); Loading @@ -81,21 +101,19 @@ public class PeopleSpaceTileTest { @Test public void testUserIcon() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setUserIcon( Icon.createWithResource(mContext, 1)).build(); assertThat(tile.getUserIcon().toString()).isEqualTo( Icon.createWithResource(mContext, 1).toString()); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setUserIcon( mIcon).build(); assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); tile = new PeopleSpaceTile.Builder("12", null, Icon.createWithResource(mContext, 2), tile = new PeopleSpaceTile.Builder("12", null, mIcon, null).build(); assertThat(tile.getUserIcon().toString()).isEqualTo( Icon.createWithResource(mContext, 2).toString()); assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); } @Test public void testContactUri() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setContactUri( new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setContactUri( Uri.parse("test")).build(); assertThat(tile.getContactUri()).isEqualTo(Uri.parse("test")); Loading @@ -103,8 +121,10 @@ public class PeopleSpaceTileTest { @Test public void testUid() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setUid(42).build(); PeopleSpaceTile tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setUid(42) .build(); assertThat(tile.getUid()).isEqualTo(42); } Loading @@ -112,12 +132,12 @@ public class PeopleSpaceTileTest { @Test public void testPackageName() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); // Automatically added by creating a ShortcutInfo. assertThat(tile.getPackageName()).isEqualTo("com.android.frameworks.coretests"); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setPackageName( new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setPackageName( "package.name").build(); assertThat(tile.getPackageName()).isEqualTo("package.name"); Loading @@ -129,36 +149,39 @@ public class PeopleSpaceTileTest { @Test public void testLastInteractionTimestamp() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getLastInteractionTimestamp()).isEqualTo(0L); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setLastInteractionTimestamp( 7L).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setLastInteractionTimestamp(7L) .build(); assertThat(tile.getLastInteractionTimestamp()).isEqualTo(7L); } @Test public void testImportantConversation() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertFalse(tile.isImportantConversation()); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setIsImportantConversation( true).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setIsImportantConversation(true) .build(); assertTrue(tile.isImportantConversation()); } @Test public void testHiddenConversation() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertFalse(tile.isHiddenConversation()); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setIsHiddenConversation( true).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setIsHiddenConversation(true) .build(); assertTrue(tile.isHiddenConversation()); } Loading @@ -168,8 +191,10 @@ public class PeopleSpaceTileTest { StatusBarNotification sbn = new StatusBarNotification("pkg" /* pkg */, "pkg" /* opPkg */, 1 /* id */, "" /* tag */, 0 /* uid */, 0 /* initialPid */, 0 /* score */, notification, UserHandle.CURRENT, 0 /* postTime */); PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setNotification(sbn).build(); PeopleSpaceTile tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setNotification(sbn) .build(); assertThat(tile.getNotification()).isEqualTo(sbn); } Loading @@ -177,11 +202,13 @@ public class PeopleSpaceTileTest { @Test public void testIntent() { PeopleSpaceTile tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).build(); new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); assertThat(tile.getIntent()).isNull(); tile = new PeopleSpaceTile.Builder( new ShortcutInfo.Builder(mContext, "123").build()).setIntent(new Intent()).build(); tile = new PeopleSpaceTile .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) .setIntent(new Intent()) .build(); assertThat(tile.getIntent().toString()).isEqualTo(new Intent().toString()); tile = new PeopleSpaceTile.Builder("12", null, null, new Intent()).build(); Loading
packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +12 −12 Original line number Diff line number Diff line Loading @@ -19,10 +19,10 @@ package com.android.systemui.people; import android.app.Activity; import android.app.INotificationManager; import android.app.people.IPeopleManager; import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.Bundle; import android.os.ServiceManager; import android.util.Log; Loading Loading @@ -68,13 +68,13 @@ public class PeopleSpaceActivity extends Activity { */ private void setTileViewsWithPriorityConversations() { try { List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = PeopleSpaceUtils.getShortcutInfos( mContext, mNotificationManager, mPeopleManager); for (Map.Entry<Long, ShortcutInfo> entry : shortcutInfos) { ShortcutInfo shortcutInfo = entry.getValue(); List<Map.Entry<Long, PeopleSpaceTile>> tiles = PeopleSpaceUtils.getTiles( mContext, mNotificationManager, mPeopleManager, mLauncherApps); for (Map.Entry<Long, PeopleSpaceTile> entry : tiles) { PeopleSpaceTile tile = entry.getValue(); PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext, mPeopleSpaceLayout, shortcutInfo.getId()); setTileView(tileView, shortcutInfo, entry.getKey()); tile.getId()); setTileView(tileView, tile, entry.getKey()); } } catch (Exception e) { Log.e(TAG, "Couldn't retrieve conversations", e); Loading @@ -82,18 +82,18 @@ public class PeopleSpaceActivity extends Activity { } /** Sets {@code tileView} with the data in {@code conversation}. */ private void setTileView(PeopleSpaceTileView tileView, ShortcutInfo shortcutInfo, private void setTileView(PeopleSpaceTileView tileView, PeopleSpaceTile tile, long lastInteraction) { try { String pkg = shortcutInfo.getPackage(); String pkg = tile.getPackageName(); String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); tileView.setStatus(status); tileView.setName(shortcutInfo.getLabel().toString()); tileView.setName(tile.getUserName().toString()); tileView.setPackageIcon(mPackageManager.getApplicationIcon(pkg)); tileView.setPersonIcon(mLauncherApps.getShortcutIconDrawable(shortcutInfo, 0)); tileView.setOnClickListener(mLauncherApps, shortcutInfo); tileView.setPersonIcon(tile.getUserIcon()); tileView.setOnClickListener(mLauncherApps, tile); } catch (Exception e) { Log.e(TAG, "Couldn't retrieve shortcut information", e); } Loading
packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java +10 −6 Original line number Diff line number Diff line Loading @@ -16,10 +16,12 @@ package com.android.systemui.people; import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.pm.LauncherApps; import android.content.pm.ShortcutInfo; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.os.UserHandle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; Loading Loading @@ -71,13 +73,15 @@ public class PeopleSpaceTileView extends LinearLayout { mPackageIconView.setImageDrawable(drawable); } /** Sets the person drawable on the tile. */ public void setPersonIcon(Drawable drawable) { mPersonIconView.setImageDrawable(drawable); /** Sets the person bitmap on the tile. */ public void setPersonIcon(Icon icon) { mPersonIconView.setImageIcon(icon); } /** Sets the click listener of the tile. */ public void setOnClickListener(LauncherApps launcherApps, ShortcutInfo shortcutInfo) { mTileView.setOnClickListener(v -> launcherApps.startShortcut(shortcutInfo, null, null)); public void setOnClickListener(LauncherApps launcherApps, PeopleSpaceTile tile) { mTileView.setOnClickListener(v -> launcherApps.startShortcut(tile.getPackageName(), tile.getId(), null, null, UserHandle.getUserHandleForUid(tile.getUid()))); } }
packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java +26 −21 Original line number Diff line number Diff line Loading @@ -19,8 +19,9 @@ package com.android.systemui.people; import android.app.INotificationManager; import android.app.people.ConversationChannel; import android.app.people.IPeopleManager; import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.pm.ShortcutInfo; import android.content.pm.LauncherApps; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; Loading Loading @@ -51,30 +52,34 @@ public class PeopleSpaceUtils { private static final int MIN_HOUR = 1; private static final int ONE_DAY = 1; /** Returns a list of map entries corresponding to user's conversations. */ public static List<Map.Entry<Long, ShortcutInfo>> getShortcutInfos(Context context, INotificationManager notificationManager, IPeopleManager peopleManager) public static List<Map.Entry<Long, PeopleSpaceTile>> getTiles( Context context, INotificationManager notificationManager, IPeopleManager peopleManager, LauncherApps launcherApps) throws Exception { boolean showAllConversations = Settings.Global.getInt(context.getContentResolver(), Settings.Global.PEOPLE_SPACE_CONVERSATION_TYPE, 0) == 0; List<ConversationChannelWrapper> conversations = notificationManager.getConversations( true).getList(); List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = getSortedShortcutInfos(peopleManager, conversations.stream().map(c -> c.getShortcutInfo())); List<Map.Entry<Long, PeopleSpaceTile>> tiles = getSortedTiles(peopleManager, conversations.stream().map(c -> new PeopleSpaceTile.Builder(c.getShortcutInfo(), launcherApps).build())); if (showAllConversations) { List<ConversationChannel> recentConversations = peopleManager.getRecentConversations().getList(); List<Map.Entry<Long, ShortcutInfo>> recentShortcutInfos = getSortedShortcutInfos( peopleManager, recentConversations.stream().map(c -> c.getShortcutInfo())); shortcutInfos.addAll(recentShortcutInfos); List<Map.Entry<Long, PeopleSpaceTile>> recentTiles = getSortedTiles(peopleManager, recentConversations.stream().map(c -> new PeopleSpaceTile .Builder(c.getShortcutInfo(), launcherApps) .build())); tiles.addAll(recentTiles); } return shortcutInfos; return tiles; } /** Returns a list sorted by ascending last interaction time from {@code stream}. */ private static List<Map.Entry<Long, ShortcutInfo>> getSortedShortcutInfos( IPeopleManager peopleManager, Stream<ShortcutInfo> stream) { private static List<Map.Entry<Long, PeopleSpaceTile>> getSortedTiles( IPeopleManager peopleManager, Stream<PeopleSpaceTile> stream) { return stream .filter(c -> shouldKeepConversation(c)) .map(c -> Map.entry(getLastInteraction(peopleManager, c), c)) Loading @@ -82,13 +87,13 @@ public class PeopleSpaceUtils { .collect(Collectors.toList()); } /** Returns the last interaction time with the user specified by {@code shortcutInfo}. */ /** Returns the last interaction time with the user specified by {@code PeopleSpaceTile}. */ private static Long getLastInteraction(IPeopleManager peopleManager, ShortcutInfo shortcutInfo) { PeopleSpaceTile tile) { try { int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); String pkg = shortcutInfo.getPackage(); return peopleManager.getLastInteraction(pkg, userId, shortcutInfo.getId()); int userId = UserHandle.getUserHandleForUid(tile.getUid()).getIdentifier(); String pkg = tile.getPackageName(); return peopleManager.getLastInteraction(pkg, userId, tile.getId()); } catch (Exception e) { Log.e(TAG, "Couldn't retrieve last interaction time", e); return 0L; Loading Loading @@ -157,13 +162,13 @@ public class PeopleSpaceUtils { * * <p>A valid {@code conversation} must: * <ul> * <li>Have a non-null {@link ShortcutInfo} * <li>Have an associated label in the {@link ShortcutInfo} * <li>Have a non-null {@link PeopleSpaceTile} * <li>Have an associated label in the {@link PeopleSpaceTile} * </ul> * </li> */ public static boolean shouldKeepConversation(ShortcutInfo shortcutInfo) { return shortcutInfo != null && shortcutInfo.getLabel().length() != 0; public static boolean shouldKeepConversation(PeopleSpaceTile tile) { return tile != null && tile.getUserName().length() != 0; } }