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

Commit c36d7b0f authored by Flavio Fiszman's avatar Flavio Fiszman Committed by Android (Google) Code Review
Browse files

Merge "Substitute ShortcutInfo for PeopleSpaceTile."

parents 15a68dc8 e3d7a74d
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