Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24a07883 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Sort conversations in People Space"

parents 4583161d 49080b0a
Loading
Loading
Loading
Loading
+16 −18
Original line number Diff line number Diff line
@@ -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,8 +53,7 @@ public class PeopleSpaceActivity extends Activity {
        setContentView(R.layout.people_space_activity);
        mPeopleSpaceLayout = findViewById(R.id.people_space_layout);
        mContext = getApplicationContext();
        mNotificationManager =
                INotificationManager.Stub.asInterface(
        mNotificationManager = INotificationManager.Stub.asInterface(
                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
        mPackageManager = getPackageManager();
        mPeopleManager = IPeopleManager.Stub.asInterface(
@@ -69,27 +68,26 @@ public class PeopleSpaceActivity extends Activity {
     */
    private void setTileViewsWithPriorityConversations() {
        try {
            List<ShortcutInfo> shortcutInfos = PeopleSpaceUtils.getShortcutInfos(mContext,
                    mNotificationManager, mPeopleManager);
            for (ShortcutInfo conversation : shortcutInfos) {
            List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = PeopleSpaceUtils.getShortcutInfos(
                    mContext, mNotificationManager, mPeopleManager);
            for (Map.Entry<Long, ShortcutInfo> 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);
        }
    }

+38 −11
Original line number Diff line number Diff line
@@ -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<ShortcutInfo> getShortcutInfos(Context context,

    /** 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)
            throws Exception {
        boolean showAllConversations = Settings.Global.getInt(context.getContentResolver(),
                Settings.Global.PEOPLE_SPACE_CONVERSATION_TYPE, 0) == 0;
        List<ConversationChannelWrapper> conversations = notificationManager.getConversations(
                !showAllConversations /* priority only */).getList();
        List<ShortcutInfo> shortcutInfos = conversations.stream().filter(
                c -> shouldKeepConversation(c)).map(c -> c.getShortcutInfo()).collect(
                Collectors.toList());
                true).getList();
        List<Map.Entry<Long, ShortcutInfo>> shortcutInfos = getSortedShortcutInfos(peopleManager,
                conversations.stream().map(c -> c.getShortcutInfo()));
        if (showAllConversations) {
            List<ConversationChannel> recentConversations =
                    peopleManager.getRecentConversations().getList();
            List<ShortcutInfo> recentShortcuts = recentConversations.stream().map(
                    c -> c.getShortcutInfo()).collect(Collectors.toList());
            shortcutInfos.addAll(recentShortcuts);
            List<Map.Entry<Long, ShortcutInfo>> 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<Map.Entry<Long, ShortcutInfo>> getSortedShortcutInfos(
            IPeopleManager peopleManager, Stream<ShortcutInfo> 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 {
     *     </ul>
     * </li>
     */
    public static boolean shouldKeepConversation(ConversationChannelWrapper conversation) {
        ShortcutInfo shortcutInfo = conversation.getShortcutInfo();
    public static boolean shouldKeepConversation(ShortcutInfo shortcutInfo) {
        return shortcutInfo != null && shortcutInfo.getLabel().length() != 0;
    }

+7 −9
Original line number Diff line number Diff line
@@ -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<ShortcutInfo> mShortcutInfos = new ArrayList<>();
    private final Context mContext;
    private List<Map.Entry<Long, ShortcutInfo>> 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<Long, ShortcutInfo> 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(