Commit 213ef4b1 authored by Mei Liang's avatar Mei Liang Committed by Commit Bot

Extend MessageCardProvider component to support grouping suggestion

This CL modifies the TabSuggestionMessageCardViewModel to build a
PropertyModel based on the TabSuggestionAction.

In addition, this CL updates the relationship between the shown Message
and the available Message in MessageCardProviderMediator. Prior to this
change, each MessageType is allowed to live in either the shown Message
queue or the available Message queue, not both. After this CL, each
MessageType can live in both. The available Message for the same
MessageType can be queued up, and each MessageType will have one Shown
Message.

Change-Id: Icb57147823bbcf81679d38c600d894ed6e47317c
Bug: 1076538
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2196845
Commit-Queue: Mei Liang <meiliang@chromium.org>
Reviewed-by: default avatarYue Zhang <yuezhanggg@chromium.org>
Reviewed-by: default avatarWei-Yin Chen (陳威尹) <wychen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#770370}
parent 77a8b729
......@@ -14,7 +14,9 @@ import androidx.annotation.VisibleForTesting;
import org.chromium.ui.modelutil.PropertyModel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
......@@ -37,8 +39,8 @@ public class MessageCardProviderMediator implements MessageService.MessageObserv
}
private final Context mContext;
private Map<Integer, Message> mMessageItems = new HashMap<>();
private Map<Integer, Message> mShownMessageItems = new HashMap<>();
private Map<Integer, List<Message>> mMessageItems = new LinkedHashMap<>();
private Map<Integer, Message> mShownMessageItems = new LinkedHashMap<>();
private MessageCardView.DismissActionProvider mUiDismissActionProvider;
public MessageCardProviderMediator(
......@@ -50,8 +52,18 @@ public class MessageCardProviderMediator implements MessageService.MessageObserv
* @return A list of {@link Message} that can be shown.
*/
public List<Message> getMessageItems() {
mShownMessageItems.putAll(mMessageItems);
mMessageItems.clear();
for (Iterator<Integer> it = mMessageItems.keySet().iterator(); it.hasNext();) {
int key = it.next();
if (mShownMessageItems.containsKey(key)) continue;
List<Message> messages = mMessageItems.get(key);
assert messages.size() > 0;
mShownMessageItems.put(key, messages.remove(0));
if (messages.size() == 0) it.remove();
}
return new ArrayList<>(mShownMessageItems.values());
}
......@@ -59,12 +71,13 @@ public class MessageCardProviderMediator implements MessageService.MessageObserv
switch (messageType) {
case TAB_SUGGESTION:
assert data instanceof TabSuggestionMessageService.TabSuggestionMessageData;
return TabSuggestionMessageCardViewModel.create(mContext, this::messageInvalidate,
return TabSuggestionMessageCardViewModel.create(mContext,
this::invalidateShownMessage,
(TabSuggestionMessageService.TabSuggestionMessageData) data);
case IPH:
assert data instanceof IphMessageService.IphMessageData;
return IphMessageCardViewModel.create(
mContext, this::messageInvalidate, (IphMessageService.IphMessageData) data);
return IphMessageCardViewModel.create(mContext, this::invalidateShownMessage,
(IphMessageService.IphMessageData) data);
default:
return new PropertyModel();
}
......@@ -76,23 +89,32 @@ public class MessageCardProviderMediator implements MessageService.MessageObserv
@MessageService.MessageType int type, MessageService.MessageData data) {
assert !mShownMessageItems.containsKey(type);
PropertyModel model = buildModel(type, data);
mMessageItems.put(type, new Message(type, model));
Message message = new Message(type, buildModel(type, data));
if (mMessageItems.containsKey(type)) {
mMessageItems.get(type).add(message);
} else {
mMessageItems.put(type, new ArrayList<>(Arrays.asList(message)));
}
}
@Override
public void messageInvalidate(@MessageService.MessageType int type) {
if (mMessageItems.containsKey(type)) {
mMessageItems.remove(type);
} else if (mShownMessageItems.containsKey(type)) {
// run ui dismiss handler;
mUiDismissActionProvider.dismiss(type);
mShownMessageItems.remove(type);
}
if (mShownMessageItems.containsKey(type)) {
invalidateShownMessage(type);
}
}
@VisibleForTesting
void invalidateShownMessage(@MessageService.MessageType int type) {
mUiDismissActionProvider.dismiss(type);
mShownMessageItems.remove(type);
}
@VisibleForTesting
Map<Integer, Message> getReadyMessageItemsForTesting() {
Map<Integer, List<Message>> getReadyMessageItemsForTesting() {
return mMessageItems;
}
......
......@@ -11,6 +11,7 @@ import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.Card
import android.content.Context;
import android.graphics.drawable.Drawable;
import org.chromium.chrome.browser.tasks.tab_management.suggestions.TabSuggestion;
import org.chromium.ui.modelutil.PropertyModel;
import java.util.Locale;
......@@ -29,8 +30,7 @@ public class TabSuggestionMessageCardViewModel {
public static PropertyModel create(Context context,
MessageCardView.DismissActionProvider uiDismissActionProvider,
TabSuggestionMessageService.TabSuggestionMessageData data) {
String descriptionTextTemplate = context.getString(
org.chromium.chrome.tab_ui.R.string.tab_suggestion_close_stale_message);
String descriptionTextTemplate = getDescriptionTextTemplate(context, data.getActionType());
String descriptionText = String.format(Locale.getDefault(), "%d", data.getSize());
String actionText =
context.getString(org.chromium.chrome.tab_ui.R.string.tab_suggestion_review_button);
......@@ -58,6 +58,21 @@ public class TabSuggestionMessageCardViewModel {
.build();
}
private static String getDescriptionTextTemplate(
Context context, @TabSuggestion.TabSuggestionAction int suggestionActionType) {
switch (suggestionActionType) {
case TabSuggestion.TabSuggestionAction.GROUP:
return context.getString(
org.chromium.chrome.tab_ui.R.string.tab_suggestion_group_tabs_message);
case TabSuggestion.TabSuggestionAction.CLOSE:
return context.getString(
org.chromium.chrome.tab_ui.R.string.tab_suggestion_close_stale_message);
default:
assert false : "Invalid TabSuggestionAction";
return "";
}
}
private static Drawable getIconDrawable() {
// TODO(meiliang): returns a drawable with first tab suggested tab's favicon.
return null;
......
......@@ -58,6 +58,14 @@ public class TabSuggestionMessageService extends MessageService implements TabSu
return mTabSuggestion.getTabsInfo().size();
}
/**
* @return The suggested action type.
*/
@TabSuggestion.TabSuggestionAction
public int getActionType() {
return mTabSuggestion.getAction();
}
/**
* @return The {@link MessageCardView.ReviewActionProvider} for the associated
* {@link TabSuggestion}.
......
......@@ -28,6 +28,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.tasks.tab_management.suggestions.TabSuggestion;
import org.chromium.chrome.tab_ui.R;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
......@@ -41,7 +42,7 @@ import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* Integration tests for TabGridMessageCardProvider component.
* Integration tests for MessageCardProvider component.
*/
@Features.DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION)
public class MessageCardProviderTest extends DummyUiActivityTestCase {
......@@ -135,6 +136,9 @@ public class MessageCardProviderTest extends DummyUiActivityTestCase {
mCoordinator = new MessageCardProviderCoordinator(getActivity(), mUiDismissActionProvider);
mCoordinator.subscribeMessageService(mTestingService);
mCoordinator.subscribeMessageService(mSuggestionService);
when(mTabSuggestionMessageData.getActionType())
.thenReturn(TabSuggestion.TabSuggestionAction.CLOSE);
}
@Test
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment