diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java index c2ba6d5e9b062..3295595955eb1 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java @@ -25,20 +25,20 @@ import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.Bundle; import android.os.ServiceManager; -import android.os.UserHandle; import android.util.Log; import android.view.ViewGroup; import com.android.systemui.R; import java.util.List; +import java.util.Map; /** * Shows the user their tiles for their priority People (go/live-status). */ public class PeopleSpaceActivity extends Activity { - private static String sTAG = "PeopleSpaceActivity"; + private static final String TAG = "PeopleSpaceActivity"; private ViewGroup mPeopleSpaceLayout; private IPeopleManager mPeopleManager; @@ -53,9 +53,8 @@ public class PeopleSpaceActivity extends Activity { setContentView(R.layout.people_space_activity); mPeopleSpaceLayout = findViewById(R.id.people_space_layout); mContext = getApplicationContext(); - mNotificationManager = - INotificationManager.Stub.asInterface( - ServiceManager.getService(Context.NOTIFICATION_SERVICE)); + mNotificationManager = INotificationManager.Stub.asInterface( + ServiceManager.getService(Context.NOTIFICATION_SERVICE)); mPackageManager = getPackageManager(); mPeopleManager = IPeopleManager.Stub.asInterface( ServiceManager.getService(Context.PEOPLE_SERVICE)); @@ -69,27 +68,26 @@ public class PeopleSpaceActivity extends Activity { */ private void setTileViewsWithPriorityConversations() { try { - List shortcutInfos = PeopleSpaceUtils.getShortcutInfos(mContext, - mNotificationManager, mPeopleManager); - for (ShortcutInfo conversation : shortcutInfos) { + List> shortcutInfos = PeopleSpaceUtils.getShortcutInfos( + mContext, mNotificationManager, mPeopleManager); + for (Map.Entry entry : shortcutInfos) { + ShortcutInfo shortcutInfo = entry.getValue(); PeopleSpaceTileView tileView = new PeopleSpaceTileView(mContext, mPeopleSpaceLayout, - conversation.getId()); - setTileView(tileView, conversation); + shortcutInfo.getId()); + setTileView(tileView, shortcutInfo, entry.getKey()); } } catch (Exception e) { - Log.e(sTAG, "Couldn't retrieve conversations", e); + Log.e(TAG, "Couldn't retrieve conversations", e); } } /** Sets {@code tileView} with the data in {@code conversation}. */ - private void setTileView(PeopleSpaceTileView tileView, ShortcutInfo shortcutInfo) { + private void setTileView(PeopleSpaceTileView tileView, ShortcutInfo shortcutInfo, + long lastInteraction) { try { - int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); - String pkg = shortcutInfo.getPackage(); - long lastInteraction = mPeopleManager.getLastInteraction(pkg, userId, - shortcutInfo.getId()); - String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); + String status = + PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); tileView.setStatus(status); tileView.setName(shortcutInfo.getLabel().toString()); @@ -97,7 +95,7 @@ public class PeopleSpaceActivity extends Activity { tileView.setPersonIcon(mLauncherApps.getShortcutIconDrawable(shortcutInfo, 0)); tileView.setOnClickListener(mLauncherApps, shortcutInfo); } catch (Exception e) { - Log.e(sTAG, "Couldn't retrieve shortcut information", e); + Log.e(TAG, "Couldn't retrieve shortcut information", e); } } diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java index c983147961bf3..35e445b968bab 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java @@ -28,15 +28,19 @@ import android.graphics.drawable.Drawable; import android.icu.text.MeasureFormat; import android.icu.util.Measure; import android.icu.util.MeasureUnit; +import android.os.UserHandle; import android.provider.Settings; import android.service.notification.ConversationChannelWrapper; +import android.util.Log; import com.android.systemui.R; import java.time.Duration; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; /** Utils class for People Space. */ public class PeopleSpaceUtils { @@ -47,27 +51,50 @@ public class PeopleSpaceUtils { private static final int MIN_HOUR = 1; private static final int ONE_DAY = 1; - /** Returns a list of {@link ShortcutInfo} corresponding to user's conversations. */ - public static List getShortcutInfos(Context context, + + /** Returns a list of map entries corresponding to user's conversations. */ + public static List> getShortcutInfos(Context context, INotificationManager notificationManager, IPeopleManager peopleManager) throws Exception { boolean showAllConversations = Settings.Global.getInt(context.getContentResolver(), Settings.Global.PEOPLE_SPACE_CONVERSATION_TYPE, 0) == 0; List conversations = notificationManager.getConversations( - !showAllConversations /* priority only */).getList(); - List shortcutInfos = conversations.stream().filter( - c -> shouldKeepConversation(c)).map(c -> c.getShortcutInfo()).collect( - Collectors.toList()); + true).getList(); + List> shortcutInfos = getSortedShortcutInfos(peopleManager, + conversations.stream().map(c -> c.getShortcutInfo())); if (showAllConversations) { List recentConversations = peopleManager.getRecentConversations().getList(); - List recentShortcuts = recentConversations.stream().map( - c -> c.getShortcutInfo()).collect(Collectors.toList()); - shortcutInfos.addAll(recentShortcuts); + List> recentShortcutInfos = getSortedShortcutInfos( + peopleManager, recentConversations.stream().map(c -> c.getShortcutInfo())); + shortcutInfos.addAll(recentShortcutInfos); } return shortcutInfos; } + /** Returns a list sorted by ascending last interaction time from {@code stream}. */ + private static List> getSortedShortcutInfos( + IPeopleManager peopleManager, Stream stream) { + return stream + .filter(c -> shouldKeepConversation(c)) + .map(c -> Map.entry(getLastInteraction(peopleManager, c), c)) + .sorted((c1, c2) -> (c2.getKey().compareTo(c1.getKey()))) + .collect(Collectors.toList()); + } + + /** Returns the last interaction time with the user specified by {@code shortcutInfo}. */ + private static Long getLastInteraction(IPeopleManager peopleManager, + ShortcutInfo shortcutInfo) { + try { + int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); + String pkg = shortcutInfo.getPackage(); + return peopleManager.getLastInteraction(pkg, userId, shortcutInfo.getId()); + } catch (Exception e) { + Log.e(TAG, "Couldn't retrieve last interaction time", e); + return 0L; + } + } + /** Converts {@code drawable} to a {@link Bitmap}. */ public static Bitmap convertDrawableToBitmap(Drawable drawable) { if (drawable == null) { @@ -99,6 +126,7 @@ public class PeopleSpaceUtils { /** Returns a readable status describing the {@code lastInteraction}. */ public static String getLastInteractionString(Context context, long lastInteraction) { if (lastInteraction == 0L) { + Log.e(TAG, "Could not get valid last interaction"); return context.getString(R.string.basic_status); } long now = System.currentTimeMillis(); @@ -134,8 +162,7 @@ public class PeopleSpaceUtils { * * */ - public static boolean shouldKeepConversation(ConversationChannelWrapper conversation) { - ShortcutInfo shortcutInfo = conversation.getShortcutInfo(); + public static boolean shouldKeepConversation(ShortcutInfo shortcutInfo) { return shortcutInfo != null && shortcutInfo.getLabel().length() != 0; } diff --git a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java index d869986045598..a4527c3ef86f3 100644 --- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java +++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java @@ -24,7 +24,6 @@ import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.os.ServiceManager; -import android.os.UserHandle; import android.util.Log; import android.widget.RemoteViews; import android.widget.RemoteViewsService; @@ -35,6 +34,7 @@ import com.android.systemui.people.PeopleSpaceUtils; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** People Space Widget RemoteViewsFactory class. */ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory { @@ -45,8 +45,8 @@ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.R private INotificationManager mNotificationManager; private PackageManager mPackageManager; private LauncherApps mLauncherApps; - private List mShortcutInfos = new ArrayList<>(); - private final Context mContext; + private List> mShortcutInfos = new ArrayList<>(); + private Context mContext; public PeopleSpaceWidgetRemoteViewsFactory(Context context, Intent intent) { this.mContext = context; @@ -100,11 +100,9 @@ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.R RemoteViews personView = new RemoteViews(mContext.getPackageName(), R.layout.people_space_widget_item); try { - ShortcutInfo shortcutInfo = mShortcutInfos.get(i); - int userId = UserHandle.getUserHandleForUid(shortcutInfo.getUserId()).getIdentifier(); - String pkg = shortcutInfo.getPackage(); - long lastInteraction = mPeopleManager.getLastInteraction(pkg, userId, - shortcutInfo.getId()); + Map.Entry entry = mShortcutInfos.get(i); + ShortcutInfo shortcutInfo = entry.getValue(); + long lastInteraction = entry.getKey(); String status = PeopleSpaceUtils.getLastInteractionString(mContext, lastInteraction); @@ -114,7 +112,7 @@ public class PeopleSpaceWidgetRemoteViewsFactory implements RemoteViewsService.R personView.setImageViewBitmap( R.id.package_icon, PeopleSpaceUtils.convertDrawableToBitmap( - mPackageManager.getApplicationIcon(pkg) + mPackageManager.getApplicationIcon(shortcutInfo.getPackage()) ) ); personView.setImageViewBitmap(