blob: 6e6ca254dee0601dfbfe139c9f3b8455f44aca83 [file] [log] [blame]
/*
* 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 com.android.systemui.people.widget;
import static com.android.systemui.people.PeopleSpaceUtils.EMPTY_STRING;
import static com.android.systemui.people.PeopleSpaceUtils.INVALID_USER_ID;
import android.app.people.PeopleSpaceTile;
import android.text.TextUtils;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** Class that encapsulates fields identifying a Conversation. */
public class PeopleTileKey {
private String mShortcutId;
private int mUserId;
private String mPackageName;
private static final Pattern KEY_PATTERN = Pattern.compile("(.+)/(-?\\d+)/(\\p{L}.*)");
public PeopleTileKey(String shortcutId, int userId, String packageName) {
mShortcutId = shortcutId;
mUserId = userId;
mPackageName = packageName;
}
public PeopleTileKey(PeopleSpaceTile tile) {
mShortcutId = tile.getId();
mUserId = tile.getUserHandle().getIdentifier();
mPackageName = tile.getPackageName();
}
public PeopleTileKey(NotificationEntry entry) {
mShortcutId = entry.getRanking() != null
&& entry.getRanking().getConversationShortcutInfo() != null
? entry.getRanking().getConversationShortcutInfo().getId()
: EMPTY_STRING;
mUserId = entry.getSbn().getUser() != null
? entry.getSbn().getUser().getIdentifier() : INVALID_USER_ID;
mPackageName = entry.getSbn().getPackageName();
}
public String getShortcutId() {
return mShortcutId;
}
public int getUserId() {
return mUserId;
}
public String getPackageName() {
return mPackageName;
}
public void setUserId(int userId) {
mUserId = userId;
}
/** Returns whether PeopleTileKey is valid/well-formed. */
private boolean validate() {
return !TextUtils.isEmpty(mShortcutId) && !TextUtils.isEmpty(mPackageName) && mUserId >= 0;
}
/**
* Returns the uniquely identifying key for the conversation.
*
* <p>{@code userId} will always be a number, so we put user ID as the
* delimiter between the app-provided strings of shortcut ID and package name.
*
* <p>There aren't restrictions on shortcut ID characters, but there are restrictions requiring
* a {@code packageName} to always start with a letter. This restriction means we are
* guaranteed to avoid cases like "a/b/0/0/package.name" having two potential keys, as the first
* case is impossible given the package name restrictions:
* <ul>
* <li>"a/b" + "/" + 0 + "/" + "0/packageName"</li>
* <li>"a/b/0" + "/" + 0 + "/" + "packageName"</li>
* </ul>
*/
@Override
public String toString() {
return mShortcutId + "/" + mUserId + "/" + mPackageName;
}
/** Parses {@code key} into a {@link PeopleTileKey}. */
public static PeopleTileKey fromString(String key) {
if (key == null) {
return null;
}
Matcher m = KEY_PATTERN.matcher(key);
if (m.find()) {
try {
int userId = Integer.parseInt(m.group(2));
return new PeopleTileKey(m.group(1), userId, m.group(3));
} catch (NumberFormatException e) {
return null;
}
}
return null;
}
/** Returns whether {@code key} is a valid {@link PeopleTileKey}. */
public static boolean isValid(PeopleTileKey key) {
return key != null && key.validate();
}
@Override
public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof PeopleTileKey)) {
return false;
}
final PeopleTileKey o = (PeopleTileKey) other;
return Objects.equals(o.toString(), this.toString());
}
@Override
public int hashCode() {
return mPackageName.hashCode() + Integer.valueOf(mUserId).hashCode()
+ mShortcutId.hashCode();
}
}