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

Commit e3d7a74d authored by Flavio Fiszman's avatar Flavio Fiszman
Browse files

Substitute ShortcutInfo for PeopleSpaceTile.

Change-Id: I35570d8ef47822598450e958c1bcbd0d298a1371
Test: Build and run.
parent b4e1f173
Loading
Loading
Loading
Loading
+35 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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();
        }
@@ -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);
    }
}
+62 −35
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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();
@@ -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"));
@@ -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);
    }
@@ -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");

@@ -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());
    }

@@ -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);
    }
@@ -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();
+12 −12
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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);
        }
+10 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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())));
    }
}
+26 −21
Original line number Diff line number Diff line
@@ -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;
@@ -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))
@@ -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;
@@ -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