From e5e3e0ba88715ff19624e6402cea3843bba4e584 Mon Sep 17 00:00:00 2001 From: Anna Zappone Date: Thu, 21 Jan 2021 17:50:51 +0000 Subject: Update PeopleTile & ConversationChannel Test: PeopleSpaceTileTest Bug: 177255255 Change-Id: Idbeed20599f19d922a78a622f85a60c59e33bf59 --- .../android/app/people/ConversationChannel.java | 36 ++ core/java/android/app/people/PeopleSpaceTile.java | 414 +++++++++++++++++++++ .../android/app/people/PeopleSpaceTileTest.java | 308 +++++++++++++++ .../systemui/people/PeopleSpaceActivity.java | 5 +- .../android/systemui/people/PeopleSpaceTile.java | 381 ------------------- .../systemui/people/PeopleSpaceTileView.java | 1 + .../android/systemui/people/PeopleSpaceUtils.java | 22 +- .../PeopleSpaceWidgetRemoteViewsFactory.java | 2 +- .../systemui/people/PeopleSpaceTileTest.java | 233 ------------ .../systemui/people/PeopleSpaceUtilsTest.java | 10 +- .../widget/PeopleSpaceWidgetManagerTest.java | 2 +- 11 files changed, 785 insertions(+), 629 deletions(-) create mode 100644 core/java/android/app/people/PeopleSpaceTile.java create mode 100644 core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java delete mode 100644 packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTile.java delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceTileTest.java diff --git a/core/java/android/app/people/ConversationChannel.java b/core/java/android/app/people/ConversationChannel.java index a648b3bd1e37..332e159679ae 100644 --- a/core/java/android/app/people/ConversationChannel.java +++ b/core/java/android/app/people/ConversationChannel.java @@ -16,12 +16,16 @@ package android.app.people; +import android.annotation.Nullable; import android.app.NotificationChannel; import android.app.NotificationChannelGroup; import android.content.pm.ShortcutInfo; import android.os.Parcel; import android.os.Parcelable; +import java.util.ArrayList; +import java.util.List; + /** * The non-customized notification channel of a conversation. It contains the information to render * the conversation and allows the user to open and customize the conversation setting. @@ -36,6 +40,8 @@ public final class ConversationChannel implements Parcelable { private NotificationChannelGroup mParentNotificationChannelGroup; private long mLastEventTimestamp; private boolean mHasActiveNotifications; + private boolean mHasBirthdayToday; + private List mStatuses; public static final Creator CREATOR = new Creator() { @Override @@ -61,6 +67,21 @@ public final class ConversationChannel implements Parcelable { mHasActiveNotifications = hasActiveNotifications; } + public ConversationChannel(ShortcutInfo shortcutInfo, int uid, + NotificationChannel parentNotificationChannel, + NotificationChannelGroup parentNotificationChannelGroup, long lastEventTimestamp, + boolean hasActiveNotifications, boolean hasBirthdayToday, + List statuses) { + mShortcutInfo = shortcutInfo; + mUid = uid; + mParentNotificationChannel = parentNotificationChannel; + mParentNotificationChannelGroup = parentNotificationChannelGroup; + mLastEventTimestamp = lastEventTimestamp; + mHasActiveNotifications = hasActiveNotifications; + mHasBirthdayToday = hasBirthdayToday; + mStatuses = statuses; + } + public ConversationChannel(Parcel in) { mShortcutInfo = in.readParcelable(ShortcutInfo.class.getClassLoader()); mUid = in.readInt(); @@ -69,6 +90,9 @@ public final class ConversationChannel implements Parcelable { in.readParcelable(NotificationChannelGroup.class.getClassLoader()); mLastEventTimestamp = in.readLong(); mHasActiveNotifications = in.readBoolean(); + mHasBirthdayToday = in.readBoolean(); + mStatuses = new ArrayList<>(); + in.readParcelableList(mStatuses, ConversationStatus.class.getClassLoader()); } @Override @@ -84,6 +108,8 @@ public final class ConversationChannel implements Parcelable { dest.writeParcelable(mParentNotificationChannelGroup, flags); dest.writeLong(mLastEventTimestamp); dest.writeBoolean(mHasActiveNotifications); + dest.writeBoolean(mHasBirthdayToday); + dest.writeParcelableList(mStatuses, flags); } public ShortcutInfo getShortcutInfo() { @@ -113,4 +139,14 @@ public final class ConversationChannel implements Parcelable { public boolean hasActiveNotifications() { return mHasActiveNotifications; } + + /** Whether this conversation has a birthday today, as associated in the Contacts Database. */ + public boolean hasBirthdayToday() { + return mHasBirthdayToday; + } + + /** Returns statuses associated with the conversation. */ + public @Nullable List getStatuses() { + return mStatuses; + } } diff --git a/core/java/android/app/people/PeopleSpaceTile.java b/core/java/android/app/people/PeopleSpaceTile.java new file mode 100644 index 000000000000..9a53b99aaefe --- /dev/null +++ b/core/java/android/app/people/PeopleSpaceTile.java @@ -0,0 +1,414 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.people; + +import android.annotation.NonNull; +import android.app.Person; +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; +import android.os.Parcelable; + +import java.util.ArrayList; +import java.util.List; + +/** + * The People Space tile contains all relevant information to render a tile in People Space: namely + * the data of any visible conversation notification associated, associated statuses, and the last + * interaction time. + * + * @hide + */ +public class PeopleSpaceTile implements Parcelable { + + private String mId; + private CharSequence mUserName; + private Icon mUserIcon; + private int mUid; + private Uri mContactUri; + private String mPackageName; + private String mBirthdayText; + private long mLastInteractionTimestamp; + private boolean mIsImportantConversation; + private String mNotificationKey; + private CharSequence mNotificationContent; + private Uri mNotificationDataUri; + private Intent mIntent; + private long mNotificationTimestamp; + private List mStatuses; + + private PeopleSpaceTile(Builder b) { + mId = b.mId; + mUserName = b.mUserName; + mUserIcon = b.mUserIcon; + mContactUri = b.mContactUri; + mUid = b.mUid; + mPackageName = b.mPackageName; + mBirthdayText = b.mBirthdayText; + mLastInteractionTimestamp = b.mLastInteractionTimestamp; + mIsImportantConversation = b.mIsImportantConversation; + mNotificationKey = b.mNotificationKey; + mNotificationContent = b.mNotificationContent; + mNotificationDataUri = b.mNotificationDataUri; + mIntent = b.mIntent; + mNotificationTimestamp = b.mNotificationTimestamp; + mStatuses = b.mStatuses; + } + + public String getId() { + return mId; + } + + public CharSequence getUserName() { + return mUserName; + } + + public Icon getUserIcon() { + return mUserIcon; + } + + /** Returns the Uri associated with the user in Android Contacts database. */ + public Uri getContactUri() { + return mContactUri; + } + + public int getUid() { + return mUid; + } + + public String getPackageName() { + return mPackageName; + } + + public String getBirthdayText() { + return mBirthdayText; + } + + /** Returns the timestamp of the last interaction. */ + public long getLastInteractionTimestamp() { + return mLastInteractionTimestamp; + } + + /** + * Whether the conversation is important. + */ + public boolean isImportantConversation() { + return mIsImportantConversation; + } + + /** + * If a notification is currently active that maps to the relevant shortcut ID, provides the + * associated notification's key. + */ + public String getNotificationKey() { + return mNotificationKey; + } + + public CharSequence getNotificationContent() { + return mNotificationContent; + } + + public Uri getNotificationDataUri() { + return mNotificationDataUri; + } + + /** + * Provides an intent to launch. If present, we should manually launch the intent on tile + * click, rather than calling {@link android.content.pm.LauncherApps} to launch the shortcut ID. + * + *

This field should only be used if manually constructing a tile without an associated + * shortcut to launch (i.e. birthday tiles). + */ + public Intent getIntent() { + return mIntent; + } + + /** Returns the timestamp of the last notification. */ + public long getNotificationTimestamp() { + return mNotificationTimestamp; + } + + /** Returns the statuses associated with the tile. */ + public List getStatuses() { + return mStatuses; + } + + /** Converts a {@link PeopleSpaceTile} into a {@link PeopleSpaceTile.Builder}. */ + public Builder toBuilder() { + Builder builder = + new Builder(mId, mUserName.toString(), mUserIcon, mIntent); + builder.setContactUri(mContactUri); + builder.setUid(mUid); + builder.setPackageName(mPackageName); + builder.setBirthdayText(mBirthdayText); + builder.setLastInteractionTimestamp(mLastInteractionTimestamp); + builder.setIsImportantConversation(mIsImportantConversation); + builder.setNotificationKey(mNotificationKey); + builder.setNotificationContent(mNotificationContent); + builder.setNotificationDataUri(mNotificationDataUri); + builder.setIntent(mIntent); + builder.setNotificationTimestamp(mNotificationTimestamp); + builder.setStatuses(mStatuses); + return builder; + } + + /** Builder to create a {@link PeopleSpaceTile}. */ + public static class Builder { + private String mId; + private CharSequence mUserName; + private Icon mUserIcon; + private Uri mContactUri; + private int mUid; + private String mPackageName; + private String mBirthdayText; + private long mLastInteractionTimestamp; + private boolean mIsImportantConversation; + private String mNotificationKey; + private CharSequence mNotificationContent; + private Uri mNotificationDataUri; + private Intent mIntent; + private long mNotificationTimestamp; + private List mStatuses; + + /** Builder for use only if a shortcut is not available for the tile. */ + public Builder(String id, String userName, Icon userIcon, Intent intent) { + mId = id; + mUserName = userName; + mUserIcon = userIcon; + mIntent = intent; + mPackageName = intent == null ? null : intent.getPackage(); + } + + public Builder(ShortcutInfo info, LauncherApps launcherApps) { + mId = info.getId(); + mUserName = info.getLabel(); + mUserIcon = convertDrawableToIcon(launcherApps.getShortcutIconDrawable(info, 0)); + mUid = info.getUserId(); + mPackageName = info.getPackage(); + mContactUri = getContactUri(info); + } + + public Builder(ConversationChannel channel, LauncherApps launcherApps) { + ShortcutInfo info = channel.getShortcutInfo(); + mId = info.getId(); + mUserName = info.getLabel(); + mUserIcon = convertDrawableToIcon(launcherApps.getShortcutIconDrawable(info, 0)); + mUid = info.getUserId(); + mPackageName = info.getPackage(); + mContactUri = getContactUri(info); + mStatuses = channel.getStatuses(); + mLastInteractionTimestamp = channel.getLastEventTimestamp(); + mIsImportantConversation = channel.getParentNotificationChannel() != null + && channel.getParentNotificationChannel().isImportantConversation(); + } + + /** Returns the Contact's Uri if present. */ + public Uri getContactUri(ShortcutInfo info) { + if (info.getPersons() == null || info.getPersons().length != 1) { + return null; + } + // TODO(b/175584929): Update to use the Uri from PeopleService directly + Person person = info.getPersons()[0]; + return person.getUri() == null ? null : Uri.parse(person.getUri()); + } + + /** Sets the ID for the tile. */ + public Builder setId(String id) { + mId = id; + return this; + } + + /** Sets the user name. */ + public Builder setUserName(CharSequence userName) { + mUserName = userName; + return this; + } + + /** Sets the icon shown for the user. */ + public Builder setUserIcon(Icon userIcon) { + mUserIcon = userIcon; + return this; + } + + /** Sets the Uri associated with the user in Android Contacts database. */ + public Builder setContactUri(Uri uri) { + mContactUri = uri; + return this; + } + + /** Sets the associated uid. */ + public Builder setUid(int uid) { + mUid = uid; + return this; + } + + /** Sets the package shown that provided the information. */ + public Builder setPackageName(String packageName) { + mPackageName = packageName; + return this; + } + + /** Sets the status text. */ + public Builder setBirthdayText(String birthdayText) { + mBirthdayText = birthdayText; + return this; + } + + /** Sets the last interaction timestamp. */ + public Builder setLastInteractionTimestamp(long lastInteractionTimestamp) { + mLastInteractionTimestamp = lastInteractionTimestamp; + return this; + } + + /** Sets whether the conversation is important. */ + public Builder setIsImportantConversation(boolean isImportantConversation) { + mIsImportantConversation = isImportantConversation; + return this; + } + + /** Sets the associated notification's key. */ + public Builder setNotificationKey(String notificationKey) { + mNotificationKey = notificationKey; + return this; + } + + /** Sets the associated notification's content. */ + public Builder setNotificationContent(CharSequence notificationContent) { + mNotificationContent = notificationContent; + return this; + } + + /** Sets the associated notification's data URI. */ + public Builder setNotificationDataUri(Uri notificationDataUri) { + mNotificationDataUri = notificationDataUri; + return this; + } + + /** Sets an intent to launch on click. */ + public Builder setIntent(Intent intent) { + mIntent = intent; + return this; + } + + /** Sets the notification timestamp. */ + public Builder setNotificationTimestamp(long notificationTimestamp) { + mNotificationTimestamp = notificationTimestamp; + return this; + } + + /** Sets the statuses. */ + public Builder setStatuses(List statuses) { + mStatuses = statuses; + return this; + } + + /** Builds a {@link PeopleSpaceTile}. */ + @NonNull + public PeopleSpaceTile build() { + return new PeopleSpaceTile(this); + } + } + + public PeopleSpaceTile(Parcel in) { + mId = in.readString(); + mUserName = in.readCharSequence(); + mUserIcon = in.readParcelable(Icon.class.getClassLoader()); + mContactUri = in.readParcelable(Uri.class.getClassLoader()); + mUid = in.readInt(); + mPackageName = in.readString(); + mBirthdayText = in.readString(); + mLastInteractionTimestamp = in.readLong(); + mIsImportantConversation = in.readBoolean(); + mNotificationKey = in.readString(); + mNotificationContent = in.readCharSequence(); + mNotificationDataUri = in.readParcelable(Uri.class.getClassLoader()); + mIntent = in.readParcelable(Intent.class.getClassLoader()); + mNotificationTimestamp = in.readLong(); + mStatuses = new ArrayList<>(); + in.readParcelableList(mStatuses, ConversationStatus.class.getClassLoader()); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mId); + dest.writeCharSequence(mUserName); + dest.writeParcelable(mUserIcon, flags); + dest.writeParcelable(mContactUri, flags); + dest.writeInt(mUid); + dest.writeString(mPackageName); + dest.writeString(mBirthdayText); + dest.writeLong(mLastInteractionTimestamp); + dest.writeBoolean(mIsImportantConversation); + dest.writeString(mNotificationKey); + dest.writeCharSequence(mNotificationContent); + dest.writeParcelable(mNotificationDataUri, flags); + dest.writeParcelable(mIntent, flags); + dest.writeLong(mNotificationTimestamp); + dest.writeParcelableList(mStatuses, flags); + } + + public static final @android.annotation.NonNull + Creator CREATOR = new Creator() { + public PeopleSpaceTile createFromParcel(Parcel source) { + return new PeopleSpaceTile(source); + } + + public PeopleSpaceTile[] newArray(int size) { + 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); + } +} diff --git a/core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java b/core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java new file mode 100644 index 000000000000..1573c19b89a3 --- /dev/null +++ b/core/tests/coretests/src/android/app/people/PeopleSpaceTileTest.java @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app.people; + +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.NotificationChannel; +import android.app.NotificationManager; +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.Parcel; + +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.google.common.collect.ImmutableList; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.List; + +@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(), mLauncherApps).build(); + assertThat(tile.getId()).isEqualTo("123"); + + 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(); + assertThat(tile.getId()).isEqualTo("12"); + } + + @Test + public void testUserName() { + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); + assertThat(tile.getUserName()).isNull(); + + 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(); + assertThat(tile.getUserName()).isEqualTo("Name 2"); + } + + @Test + public void testUserIcon() { + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setUserIcon( + mIcon).build(); + assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); + + tile = new PeopleSpaceTile.Builder("12", null, mIcon, + null).build(); + assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); + } + + @Test + public void testContactUri() { + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setContactUri( + Uri.parse("test")).build(); + + assertThat(tile.getContactUri()).isEqualTo(Uri.parse("test")); + } + + @Test + public void testUid() { + PeopleSpaceTile tile = new PeopleSpaceTile + .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) + .setUid(42) + .build(); + + assertThat(tile.getUid()).isEqualTo(42); + } + + @Test + public void testPackageName() { + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + 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(), mLauncherApps).setPackageName( + "package.name").build(); + assertThat(tile.getPackageName()).isEqualTo("package.name"); + + tile = new PeopleSpaceTile.Builder("12", null, null, + new Intent().setPackage("intent.package")).build(); + assertThat(tile.getPackageName()).isEqualTo("intent.package"); + } + + @Test + public void testLastInteractionTimestamp() { + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); + assertThat(tile.getLastInteractionTimestamp()).isEqualTo(0L); + + 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(), mLauncherApps).build(); + assertFalse(tile.isImportantConversation()); + + tile = new PeopleSpaceTile + .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) + .setIsImportantConversation(true) + .build(); + assertTrue(tile.isImportantConversation()); + } + + @Test + public void testStatuses() { + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); + assertThat(tile.getStatuses()).isNull(); + + List statusList = ImmutableList.of( + new ConversationStatus.Builder("id", ConversationStatus.ACTIVITY_BIRTHDAY).build()); + tile = new PeopleSpaceTile + .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) + .setStatuses(statusList) + .build(); + assertThat(tile.getStatuses()).isEqualTo(statusList); + } + + @Test + public void testCreateFromConversationChannel() { + ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext, "123").setLongLabel( + "name").build(); + ConversationChannel convo = new ConversationChannel(shortcutInfo, 0, null, null, + 0L, false, true, null); + PeopleSpaceTile tile = new PeopleSpaceTile.Builder(convo, mLauncherApps).build(); + assertThat(tile.getStatuses()).isNull(); + assertThat(tile.getId()).isEqualTo("123"); + assertThat(tile.getUserName()).isEqualTo("name"); + assertFalse(tile.isImportantConversation()); + assertThat(tile.getLastInteractionTimestamp()).isEqualTo(0L); + + List statuses = ImmutableList.of( + new ConversationStatus.Builder("id", ConversationStatus.ACTIVITY_BIRTHDAY).build()); + NotificationChannel notificationChannel = new NotificationChannel("123", + "channel", + NotificationManager.IMPORTANCE_DEFAULT); + notificationChannel.setImportantConversation(true); + convo = new ConversationChannel(shortcutInfo, 0, notificationChannel, null, + 123L, false, true, statuses); + tile = new PeopleSpaceTile.Builder(convo, mLauncherApps).build(); + assertThat(tile.getStatuses()).isEqualTo(statuses); + assertTrue(tile.isImportantConversation()); + assertThat(tile.getLastInteractionTimestamp()).isEqualTo(123L); + } + + @Test + public void testWriteThenReadFromParcel() { + List statusList = ImmutableList.of( + new ConversationStatus.Builder("id", ConversationStatus.ACTIVITY_BIRTHDAY).build()); + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) + .setUserName("name") + .setUserIcon(mIcon) + .setContactUri(Uri.parse("contact")) + .setUid(42) + .setPackageName("package.name") + .setLastInteractionTimestamp(7L) + .setIsImportantConversation(true) + .setStatuses(statusList).setNotificationKey("key") + .setNotificationContent("content") + .setNotificationDataUri(Uri.parse("data")) + .setIntent(new Intent()) + .build(); + + Parcel parcel = Parcel.obtain(); + tile.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + PeopleSpaceTile readTile = PeopleSpaceTile.CREATOR.createFromParcel(parcel); + + assertThat(readTile.getId()).isEqualTo(tile.getId()); + assertThat(readTile.getUserName()).isEqualTo(tile.getUserName()); + assertThat(readTile.getUserIcon().toString()).isEqualTo(tile.getUserIcon().toString()); + assertThat(readTile.getContactUri()).isEqualTo(tile.getContactUri()); + assertThat(readTile.getUid()).isEqualTo(tile.getUid()); + assertThat(readTile.getPackageName()).isEqualTo(tile.getPackageName()); + assertThat(readTile.getLastInteractionTimestamp()).isEqualTo( + tile.getLastInteractionTimestamp()); + assertThat(readTile.isImportantConversation()).isEqualTo(tile.isImportantConversation()); + assertThat(readTile.getStatuses()).isEqualTo(tile.getStatuses()); + assertThat(readTile.getNotificationKey()).isEqualTo(tile.getNotificationKey()); + assertThat(readTile.getNotificationContent()).isEqualTo(tile.getNotificationContent()); + assertThat(readTile.getNotificationDataUri()).isEqualTo(tile.getNotificationDataUri()); + assertThat(readTile.getIntent().toString()).isEqualTo(tile.getIntent().toString()); + } + + @Test + public void testNotificationKey() { + PeopleSpaceTile tile = new PeopleSpaceTile + .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) + .setNotificationKey("test") + .build(); + + assertThat(tile.getNotificationKey()).isEqualTo("test"); + } + + @Test + public void testNotificationContent() { + PeopleSpaceTile tile = new PeopleSpaceTile + .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) + .setNotificationContent("test") + .build(); + + assertThat(tile.getNotificationContent()).isEqualTo("test"); + } + + @Test + public void testNotificationDataUri() { + PeopleSpaceTile tile = + new PeopleSpaceTile.Builder(new ShortcutInfo.Builder(mContext, "123").build(), + mLauncherApps) + .setNotificationDataUri(Uri.parse("test")) + .build(); + + assertThat(tile.getNotificationDataUri()).isEqualTo(Uri.parse("test")); + } + + @Test + public void testIntent() { + PeopleSpaceTile tile = new PeopleSpaceTile.Builder( + new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); + assertThat(tile.getIntent()).isNull(); + + 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(); + assertThat(tile.getIntent().toString()).isEqualTo(new Intent().toString()); + } + +} diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java index a8761a63f6ad..a4e91896be9e 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.java @@ -22,6 +22,7 @@ import static android.appwidget.AppWidgetManager.INVALID_APPWIDGET_ID; import android.app.Activity; import android.app.INotificationManager; import android.app.people.IPeopleManager; +import android.app.people.PeopleSpaceTile; import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; @@ -134,8 +135,10 @@ public class PeopleSpaceActivity extends Activity { + tile.getId() + " for widget ID: " + mAppWidgetId); } + // Ensure updates to app widget can be retrieved from both appWidget Id and tile ID. editor.putString(String.valueOf(mAppWidgetId), tile.getId()); - editor.commit(); + editor.putInt(tile.getId(), mAppWidgetId); + editor.apply(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext); Bundle options = new Bundle(); options.putParcelable(PeopleSpaceUtils.OPTIONS_PEOPLE_SPACE_TILE, tile); diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTile.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTile.java deleted file mode 100644 index d7ee97bc3bc5..000000000000 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTile.java +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.people; - -import android.annotation.NonNull; -import android.app.Person; -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; -import android.os.Parcelable; - -/** - * The People Space tile contains all relevant information to render a tile in People Space: namely - * the data of any visible conversation notification associated, associated statuses, and the last - * interaction time. - * - * @hide - */ -public class PeopleSpaceTile implements Parcelable { - - private String mId; - private CharSequence mUserName; - private Icon mUserIcon; - private int mUid; - private Uri mContactUri; - private String mPackageName; - private String mStatusText; - private long mLastInteractionTimestamp; - private boolean mIsImportantConversation; - private boolean mIsHiddenConversation; - private String mNotificationKey; - // TODO: add mNotificationTimestamp - private CharSequence mNotificationContent; - private Uri mNotificationDataUri; - private Intent mIntent; - // TODO: add a List of the Status objects once created - - private PeopleSpaceTile(Builder b) { - mId = b.mId; - mUserName = b.mUserName; - mUserIcon = b.mUserIcon; - mContactUri = b.mContactUri; - mUid = b.mUid; - mPackageName = b.mPackageName; - mStatusText = b.mStatusText; - mLastInteractionTimestamp = b.mLastInteractionTimestamp; - mIsImportantConversation = b.mIsImportantConversation; - mIsHiddenConversation = b.mIsHiddenConversation; - mNotificationKey = b.mNotificationKey; - mNotificationContent = b.mNotificationContent; - mNotificationDataUri = b.mNotificationDataUri; - mIntent = b.mIntent; - } - - public String getId() { - return mId; - } - - public CharSequence getUserName() { - return mUserName; - } - - public Icon getUserIcon() { - return mUserIcon; - } - - /** Returns the Uri associated with the user in Android Contacts database. */ - public Uri getContactUri() { - return mContactUri; - } - - public int getUid() { - return mUid; - } - - public String getPackageName() { - return mPackageName; - } - - public String getStatusText() { - return mStatusText; - } - - /** Returns the timestamp of the last interaction. */ - public long getLastInteractionTimestamp() { - return mLastInteractionTimestamp; - } - - /** - * Whether the conversation is important. - */ - public boolean isImportantConversation() { - return mIsImportantConversation; - } - - /** - * Whether the conversation should be hidden. - */ - public boolean isHiddenConversation() { - return mIsHiddenConversation; - } - - /** - * If a notification is currently active that maps to the relevant shortcut ID, provides the - * associated notification's key. - */ - public String getNotificationKey() { - return mNotificationKey; - } - - public CharSequence getNotificationContent() { - return mNotificationContent; - } - - public Uri getNotificationDataUri() { - return mNotificationDataUri; - } - - /** - * Provides an intent to launch. If present, we should manually launch the intent on tile - * click, rather than calling {@link android.content.pm.LauncherApps} to launch the shortcut ID. - * - *

This field should only be used if manually constructing a tile without an associated - * shortcut to launch (i.e. birthday tiles). - */ - public Intent getIntent() { - return mIntent; - } - - /** Converts a {@link PeopleSpaceTile} into a {@link PeopleSpaceTile.Builder}. */ - public PeopleSpaceTile.Builder toBuilder() { - PeopleSpaceTile.Builder builder = - new PeopleSpaceTile.Builder(mId, mUserName.toString(), mUserIcon, mIntent); - builder.setContactUri(mContactUri); - builder.setUid(mUid); - builder.setPackageName(mPackageName); - builder.setStatusText(mStatusText); - builder.setLastInteractionTimestamp(mLastInteractionTimestamp); - builder.setIsImportantConversation(mIsImportantConversation); - builder.setIsHiddenConversation(mIsHiddenConversation); - builder.setNotificationKey(mNotificationKey); - builder.setNotificationContent(mNotificationContent); - builder.setNotificationDataUri(mNotificationDataUri); - return builder; - } - - /** Builder to create a {@link PeopleSpaceTile}. */ - public static class Builder { - private String mId; - private CharSequence mUserName; - private Icon mUserIcon; - private Uri mContactUri; - private int mUid; - private String mPackageName; - private String mStatusText; - private long mLastInteractionTimestamp; - private boolean mIsImportantConversation; - private boolean mIsHiddenConversation; - private String mNotificationKey; - private CharSequence mNotificationContent; - private Uri mNotificationDataUri; - private Intent mIntent; - - /** Builder for use only if a shortcut is not available for the tile. */ - public Builder(String id, String userName, Icon userIcon, Intent intent) { - mId = id; - mUserName = userName; - mUserIcon = userIcon; - mIntent = intent; - mPackageName = intent == null ? null : intent.getPackage(); - } - - public Builder(ShortcutInfo info, LauncherApps launcherApps) { - mId = info.getId(); - mUserName = info.getLabel(); - mUserIcon = convertDrawableToIcon(launcherApps.getShortcutIconDrawable(info, 0)); - mUid = info.getUserId(); - mPackageName = info.getPackage(); - mContactUri = getContactUri(info); - } - - private Uri getContactUri(ShortcutInfo info) { - if (info.getPersons() == null || info.getPersons().length != 1) { - return null; - } - // TODO(b/175584929): Update to use the Uri from PeopleService directly - Person person = info.getPersons()[0]; - return person.getUri() == null ? null : Uri.parse(person.getUri()); - } - - /** Sets the ID for the tile. */ - public Builder setId(String id) { - mId = id; - return this; - } - - /** Sets the user name. */ - public Builder setUserName(CharSequence userName) { - mUserName = userName; - return this; - } - - /** Sets the icon shown for the user. */ - public Builder setUserIcon(Icon userIcon) { - mUserIcon = userIcon; - return this; - } - - /** Sets the Uri associated with the user in Android Contacts database. */ - public Builder setContactUri(Uri uri) { - mContactUri = uri; - return this; - } - - /** Sets the associated uid. */ - public Builder setUid(int uid) { - mUid = uid; - return this; - } - - /** Sets the package shown that provided the information. */ - public Builder setPackageName(String packageName) { - mPackageName = packageName; - return this; - } - - /** Sets the status text. */ - public Builder setStatusText(String statusText) { - mStatusText = statusText; - return this; - } - - /** Sets the last interaction timestamp. */ - public Builder setLastInteractionTimestamp(long lastInteractionTimestamp) { - mLastInteractionTimestamp = lastInteractionTimestamp; - return this; - } - - /** Sets whether the conversation is important. */ - public Builder setIsImportantConversation(boolean isImportantConversation) { - mIsImportantConversation = isImportantConversation; - return this; - } - - /** Sets whether the conversation is hidden. */ - public Builder setIsHiddenConversation(boolean isHiddenConversation) { - mIsHiddenConversation = isHiddenConversation; - return this; - } - - /** Sets the associated notification's key. */ - public Builder setNotificationKey(String notificationKey) { - mNotificationKey = notificationKey; - return this; - } - - /** Sets the associated notification's content. */ - public Builder setNotificationContent(CharSequence notificationContent) { - mNotificationContent = notificationContent; - return this; - } - - /** Sets the associated notification's data URI. */ - public Builder setNotificationDataUri(Uri notificationDataUri) { - mNotificationDataUri = notificationDataUri; - return this; - } - - /** Sets an intent to launch on click. */ - public Builder setIntent(Intent intent) { - mIntent = intent; - return this; - } - - /** Builds a {@link PeopleSpaceTile}. */ - @NonNull - public PeopleSpaceTile build() { - return new PeopleSpaceTile(this); - } - } - - private PeopleSpaceTile(Parcel in) { - mId = in.readString(); - mUserName = in.readCharSequence(); - mUserIcon = in.readParcelable(Icon.class.getClassLoader()); - mContactUri = in.readParcelable(Uri.class.getClassLoader()); - mUid = in.readInt(); - mPackageName = in.readString(); - mStatusText = in.readString(); - mLastInteractionTimestamp = in.readLong(); - mIsImportantConversation = in.readBoolean(); - mIsHiddenConversation = in.readBoolean(); - mNotificationKey = in.readString(); - mNotificationContent = in.readCharSequence(); - mNotificationDataUri = in.readParcelable(Uri.class.getClassLoader()); - mIntent = in.readParcelable(Intent.class.getClassLoader()); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(mId); - dest.writeCharSequence(mUserName); - dest.writeParcelable(mUserIcon, flags); - dest.writeParcelable(mContactUri, flags); - dest.writeInt(mUid); - dest.writeString(mPackageName); - dest.writeString(mStatusText); - dest.writeLong(mLastInteractionTimestamp); - dest.writeBoolean(mIsImportantConversation); - dest.writeBoolean(mIsHiddenConversation); - dest.writeString(mNotificationKey); - dest.writeCharSequence(mNotificationContent); - dest.writeParcelable(mNotificationDataUri, flags); - dest.writeParcelable(mIntent, flags); - } - - public static final @android.annotation.NonNull - Creator CREATOR = new Creator() { - public PeopleSpaceTile createFromParcel(Parcel source) { - return new PeopleSpaceTile(source); - } - - public PeopleSpaceTile[] newArray(int size) { - 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); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java index 25b91da7fadc..9ae7847031aa 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceTileView.java @@ -16,6 +16,7 @@ package com.android.systemui.people; +import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.pm.LauncherApps; import android.graphics.drawable.Drawable; diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java index 8669a817dfc2..91e7968f7546 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceUtils.java @@ -23,6 +23,7 @@ import android.app.Notification; import android.app.PendingIntent; import android.app.people.ConversationChannel; import android.app.people.IPeopleManager; +import android.app.people.PeopleSpaceTile; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; @@ -221,7 +222,7 @@ public class PeopleSpaceUtils { return tile; } return tile.toBuilder() - .setStatusText(storedTile.getStatusText()) + .setBirthdayText(storedTile.getBirthdayText()) .setNotificationKey(storedTile.getNotificationKey()) .setNotificationContent(storedTile.getNotificationContent()) .setNotificationDataUri(storedTile.getNotificationDataUri()) @@ -234,6 +235,10 @@ public class PeopleSpaceUtils { int appWidgetId) { Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); PeopleSpaceTile storedTile = options.getParcelable(OPTIONS_PEOPLE_SPACE_TILE); + if (storedTile == null) { + if (DEBUG) Log.d(TAG, "Could not find stored tile to add notification to"); + return; + } if (notificationAction == PeopleSpaceUtils.NotificationAction.POSTED) { if (DEBUG) Log.i(TAG, "Adding notification to storage, appWidgetId: " + appWidgetId); Notification.MessagingStyle.Message message = getLastMessagingStyleMessage(sbn); @@ -263,6 +268,10 @@ public class PeopleSpaceUtils { private static void updateAppWidgetOptions(AppWidgetManager appWidgetManager, int appWidgetId, PeopleSpaceTile tile) { + if (tile == null) { + if (DEBUG) Log.d(TAG, "Requested to store null tile"); + return; + } Bundle newOptions = new Bundle(); newOptions.putParcelable(OPTIONS_PEOPLE_SPACE_TILE, tile); appWidgetManager.updateAppWidgetOptions(appWidgetId, newOptions); @@ -274,7 +283,7 @@ public class PeopleSpaceUtils { RemoteViews views; if (tile.getNotificationKey() != null) { views = createNotificationRemoteViews(context, tile); - } else if (tile.getStatusText() != null) { + } else if (tile.getBirthdayText() != null) { views = createStatusRemoteViews(context, tile); } else { views = createLastInteractionRemoteViews(context, tile); @@ -344,7 +353,7 @@ public class PeopleSpaceUtils { PeopleSpaceTile tile) { RemoteViews views = new RemoteViews( context.getPackageName(), R.layout.people_space_large_avatar_tile); - views.setTextViewText(R.id.status, tile.getStatusText()); + views.setTextViewText(R.id.status, tile.getBirthdayText()); return views; } @@ -536,11 +545,10 @@ public class PeopleSpaceUtils { } private static boolean hasBirthdayStatus(PeopleSpaceTile tile, Context context) { - return tile.getStatusText() != null && tile.getStatusText().equals( + return tile.getBirthdayText() != null && tile.getBirthdayText().equals( context.getString(R.string.birthday_status)); } - /** Calls to retrieve birthdays on a background thread. */ private static void getBirthdaysOnBackgroundThread(Context context, AppWidgetManager appWidgetManager, @@ -581,7 +589,7 @@ public class PeopleSpaceUtils { if (DEBUG) Log.d(TAG, "Remove " + storedTile.getUserName() + "'s birthday"); updateAppWidgetOptionsAndView(appWidgetManager, context, appWidgetId, storedTile.toBuilder() - .setStatusText(null) + .setBirthdayText(null) .build()); } } @@ -605,7 +613,7 @@ public class PeopleSpaceUtils { if (DEBUG) Log.d(TAG, storedTile.getUserName() + "'s birthday today!"); updateAppWidgetOptionsAndView(appWidgetManager, context, appWidgetId, storedTile.toBuilder() - .setStatusText(context.getString(R.string.birthday_status)) + .setBirthdayText(context.getString(R.string.birthday_status)) .build()); return; } 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 cd0a5df2025a..fb33affcbac5 100644 --- a/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java +++ b/packages/SystemUI/src/com/android/systemui/people/widget/PeopleSpaceWidgetRemoteViewsFactory.java @@ -18,7 +18,7 @@ package com.android.systemui.people.widget; import android.app.INotificationManager; import android.app.people.IPeopleManager; -import com.android.systemui.people.PeopleSpaceTile; +import android.app.people.PeopleSpaceTile; import android.content.Context; import android.content.Intent; import android.content.pm.LauncherApps; diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceTileTest.java deleted file mode 100644 index bd6167b1f781..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceTileTest.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.people; - -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.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 androidx.test.InstrumentationRegistry; -import androidx.test.filters.SmallTest; -import androidx.test.runner.AndroidJUnit4; - -import com.android.systemui.SysuiTestCase; -import com.android.systemui.people.PeopleSpaceTile; - -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 extends SysuiTestCase { - - private final Drawable mDrawable = new ColorDrawable(Color.BLUE); - private final Icon mIcon = PeopleSpaceTile.convertDrawableToIcon(mDrawable); - - @Mock - private LauncherApps mLauncherApps; - - @Before - public void setUp() { - 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(), mLauncherApps).build(); - assertThat(tile.getId()).isEqualTo("123"); - - 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(); - assertThat(tile.getId()).isEqualTo("12"); - } - - @Test - public void testUserName() { - PeopleSpaceTile tile = new PeopleSpaceTile.Builder( - new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); - assertThat(tile.getUserName()).isNull(); - - 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(); - assertThat(tile.getUserName()).isEqualTo("Name 2"); - } - - @Test - public void testUserIcon() { - PeopleSpaceTile tile = new PeopleSpaceTile.Builder( - new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setUserIcon( - mIcon).build(); - assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); - - tile = new PeopleSpaceTile.Builder("12", null, mIcon, - null).build(); - assertThat(tile.getUserIcon().toString()).isEqualTo(mIcon.toString()); - } - - @Test - public void testContactUri() { - PeopleSpaceTile tile = new PeopleSpaceTile.Builder( - new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setContactUri( - Uri.parse("test")).build(); - - assertThat(tile.getContactUri()).isEqualTo(Uri.parse("test")); - } - - @Test - public void testUid() { - PeopleSpaceTile tile = new PeopleSpaceTile - .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) - .setUid(42) - .build(); - - assertThat(tile.getUid()).isEqualTo(42); - } - - @Test - public void testPackageName() { - PeopleSpaceTile tile = new PeopleSpaceTile.Builder( - new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); - // Automatically added by creating a ShortcutInfo. - assertThat(tile.getPackageName()).isEqualTo("com.android.systemui.tests"); - - tile = new PeopleSpaceTile.Builder( - new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).setPackageName( - "package.name").build(); - assertThat(tile.getPackageName()).isEqualTo("package.name"); - - tile = new PeopleSpaceTile.Builder("12", null, null, - new Intent().setPackage("intent.package")).build(); - assertThat(tile.getPackageName()).isEqualTo("intent.package"); - } - - @Test - public void testLastInteractionTimestamp() { - PeopleSpaceTile tile = new PeopleSpaceTile.Builder( - new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); - assertThat(tile.getLastInteractionTimestamp()).isEqualTo(0L); - - 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(), mLauncherApps).build(); - assertFalse(tile.isImportantConversation()); - - 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(), mLauncherApps).build(); - assertFalse(tile.isHiddenConversation()); - - tile = new PeopleSpaceTile - .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) - .setIsHiddenConversation(true) - .build(); - assertTrue(tile.isHiddenConversation()); - } - - @Test - public void testNotificationKey() { - PeopleSpaceTile tile = new PeopleSpaceTile - .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) - .setNotificationKey("test") - .build(); - - assertThat(tile.getNotificationKey()).isEqualTo("test"); - } - - @Test - public void testNotificationContent() { - PeopleSpaceTile tile = new PeopleSpaceTile - .Builder(new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps) - .setNotificationContent("test") - .build(); - - assertThat(tile.getNotificationContent()).isEqualTo("test"); - } - - @Test - public void testNotificationDataUri() { - PeopleSpaceTile tile = - new PeopleSpaceTile.Builder(new ShortcutInfo.Builder(mContext, "123").build(), - mLauncherApps) - .setNotificationDataUri(Uri.parse("test")) - .build(); - - assertThat(tile.getNotificationDataUri()).isEqualTo(Uri.parse("test")); - } - - @Test - public void testIntent() { - PeopleSpaceTile tile = new PeopleSpaceTile.Builder( - new ShortcutInfo.Builder(mContext, "123").build(), mLauncherApps).build(); - assertThat(tile.getIntent()).isNull(); - - 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(); - assertThat(tile.getIntent().toString()).isEqualTo(new Intent().toString()); - } - -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java index 64b96765106a..b7d1bc6c4c63 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/people/PeopleSpaceUtilsTest.java @@ -39,6 +39,7 @@ import android.app.NotificationManager; import android.app.Person; import android.app.people.ConversationChannel; import android.app.people.IPeopleManager; +import android.app.people.PeopleSpaceTile; import android.appwidget.AppWidgetManager; import android.content.ContentResolver; import android.content.Context; @@ -55,10 +56,9 @@ import android.provider.ContactsContract; import android.provider.Settings; import android.service.notification.ConversationChannelWrapper; import android.service.notification.StatusBarNotification; +import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; -import androidx.test.filters.SmallTest; - import com.android.internal.appwidget.IAppWidgetService; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; @@ -419,7 +419,7 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase { // Existing tile has a birthday status. Map widgetIdToTile = Map.of(WIDGET_ID_WITH_SHORTCUT, new PeopleSpaceTile.Builder(mShortcutInfoWithoutPerson, - mContext.getSystemService(LauncherApps.class)).setStatusText( + mContext.getSystemService(LauncherApps.class)).setBirthdayText( mContext.getString(R.string.birthday_status)).build()); PeopleSpaceUtils.getBirthdays(mMockContext, mAppWidgetManager, widgetIdToTile, widgetIdsArray); @@ -454,7 +454,7 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase { // Existing tile has a birthday status. Map widgetIdToTile = Map.of(WIDGET_ID_WITH_SHORTCUT, new PeopleSpaceTile.Builder(mShortcutInfo, - mContext.getSystemService(LauncherApps.class)).setStatusText( + mContext.getSystemService(LauncherApps.class)).setBirthdayText( mContext.getString(R.string.birthday_status)).build()); PeopleSpaceUtils.getBirthdays(mMockContext, mAppWidgetManager, widgetIdToTile, widgetIdsArray); @@ -474,7 +474,7 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase { // Existing tile has a birthday status. Map widgetIdToTile = Map.of(WIDGET_ID_WITH_SHORTCUT, new PeopleSpaceTile.Builder(mShortcutInfo, - mContext.getSystemService(LauncherApps.class)).setStatusText( + mContext.getSystemService(LauncherApps.class)).setBirthdayText( mContext.getString(R.string.birthday_status)).build()); PeopleSpaceUtils.getBirthdays(mMockContext, mAppWidgetManager, widgetIdToTile, widgetIdsArray); diff --git a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java index e7363f3ce4f7..8c0afb89b361 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/people/widget/PeopleSpaceWidgetManagerTest.java @@ -35,6 +35,7 @@ import android.app.INotificationManager; import android.app.Notification; import android.app.NotificationChannel; import android.app.Person; +import android.app.people.PeopleSpaceTile; import android.appwidget.AppWidgetManager; import android.content.Intent; import android.content.SharedPreferences; @@ -57,7 +58,6 @@ import androidx.test.filters.SmallTest; import com.android.internal.appwidget.IAppWidgetService; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; -import com.android.systemui.people.PeopleSpaceTile; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationListener.NotificationHandler; import com.android.systemui.statusbar.SbnBuilder; -- cgit v1.2.3-59-g8ed1b