feat: move conversation search into header mode
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
package com.hyzq.boss;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.EditText;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import android.widget.LinearLayout;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONObject;
|
||||
@@ -46,34 +46,63 @@ public class MainActivityConversationSearchTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void renderConversationsRootShowsSearchInputInsteadOfHintPill() throws Exception {
|
||||
public void conversationsHeader_usesSearchIconAndPlusButton() throws Exception {
|
||||
MainActivity activity = Robolectric.buildActivity(MainActivity.class).setup().get();
|
||||
ReflectionHelpers.setField(activity, "conversationsData", new JSONArray()
|
||||
.put(new JSONObject()
|
||||
.put("projectId", "p1")
|
||||
.put("projectTitle", "500Gcode")
|
||||
.put("folderLabel", "Mac Studio")
|
||||
.put("lastMessagePreview", "线程链路正常")
|
||||
.put("latestReplyLabel", "09:40")));
|
||||
|
||||
ReflectionHelpers.setField(activity, "conversationsData", buildConversations());
|
||||
ReflectionHelpers.callInstanceMethod(activity, "showContent");
|
||||
Shadows.shadowOf(activity.getMainLooper()).idle();
|
||||
ReflectionHelpers.callInstanceMethod(activity, "renderConversationsRoot");
|
||||
ReflectionHelpers.callInstanceMethod(activity, "renderCurrentTab");
|
||||
|
||||
Button searchButton = activity.findViewById(R.id.search_button);
|
||||
Button actionButton = activity.findViewById(R.id.refresh_button);
|
||||
LinearLayout titleGroup = activity.findViewById(R.id.top_title_group);
|
||||
EditText searchInput = activity.findViewById(R.id.top_search_input);
|
||||
|
||||
assertEquals("⌕", String.valueOf(searchButton.getText()));
|
||||
assertEquals("+", String.valueOf(actionButton.getText()));
|
||||
assertEquals(LinearLayout.VISIBLE, titleGroup.getVisibility());
|
||||
assertEquals(EditText.GONE, searchInput.getVisibility());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void searchMode_keepsSameInputViewAndRetainsFocusWhileFiltering() throws Exception {
|
||||
MainActivity activity = Robolectric.buildActivity(MainActivity.class).setup().get();
|
||||
ReflectionHelpers.setField(activity, "conversationsData", buildConversations());
|
||||
ReflectionHelpers.callInstanceMethod(activity, "showContent");
|
||||
Shadows.shadowOf(activity.getMainLooper()).idle();
|
||||
|
||||
RecyclerView list = ReflectionHelpers.getField(activity, "screenList");
|
||||
View firstItem = buildRecyclerItem(list, 0);
|
||||
assertTrue(firstItem instanceof EditText);
|
||||
EditText input = (EditText) firstItem;
|
||||
assertEquals("搜索项目或线程", String.valueOf(input.getHint()));
|
||||
Button searchButton = activity.findViewById(R.id.search_button);
|
||||
searchButton.performClick();
|
||||
Shadows.shadowOf(activity.getMainLooper()).idle();
|
||||
|
||||
EditText searchInput = activity.findViewById(R.id.top_search_input);
|
||||
assertTrue(ReflectionHelpers.getField(activity, "conversationSearchMode"));
|
||||
assertTrue(searchInput.isShown());
|
||||
searchInput.requestFocus();
|
||||
assertTrue(searchInput.isFocused());
|
||||
|
||||
searchInput.setText("树莓派");
|
||||
Shadows.shadowOf(activity.getMainLooper()).idle();
|
||||
|
||||
EditText searchInputAfter = activity.findViewById(R.id.top_search_input);
|
||||
assertSame(searchInput, searchInputAfter);
|
||||
assertEquals("树莓派", searchInputAfter.getText().toString());
|
||||
assertTrue(searchInputAfter.isFocused());
|
||||
|
||||
Button actionButton = activity.findViewById(R.id.refresh_button);
|
||||
assertEquals(Button.GONE, actionButton.getVisibility());
|
||||
assertFalse(activity.findViewById(R.id.search_button).isShown());
|
||||
}
|
||||
|
||||
private static View buildRecyclerItem(RecyclerView recyclerView, int position) {
|
||||
RecyclerView.Adapter adapter = recyclerView.getAdapter();
|
||||
int viewType = adapter.getItemViewType(position);
|
||||
RecyclerView.ViewHolder holder = adapter.createViewHolder(recyclerView, viewType);
|
||||
adapter.bindViewHolder(holder, position);
|
||||
FrameLayout container = (FrameLayout) holder.itemView;
|
||||
return container.getChildAt(0);
|
||||
private static JSONArray buildConversations() throws Exception {
|
||||
return new JSONArray()
|
||||
.put(new JSONObject()
|
||||
.put("projectId", "p1")
|
||||
.put("projectTitle", "查询树莓派二代")
|
||||
.put("threadTitle", "查询树莓派二代")
|
||||
.put("folderLabel", "Mac Studio")
|
||||
.put("lastMessagePreview", "线程链路正常")
|
||||
.put("latestReplyLabel", "09:40")
|
||||
.put("conversationType", "single_device"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public class MainActivityConversationSelectionTest {
|
||||
ReflectionHelpers.callInstanceMethod(activity, "enterConversationSelectionMode");
|
||||
|
||||
RecyclerView list = ReflectionHelpers.getField(activity, "screenList");
|
||||
View row = getRecyclerChild(list, 3);
|
||||
View row = getRecyclerChild(list, 2);
|
||||
assertTrue("多选模式应显示单选圆点", viewTreeContainsContentDescription(row, "未选中会话"));
|
||||
}
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@ public class WechatSurfaceMapperTopActionTest {
|
||||
public void rootTopAction_usesSelectionForConversations() {
|
||||
WechatSurfaceMapper.RootTopAction action = WechatSurfaceMapper.rootTopAction("conversations", false, false);
|
||||
|
||||
assertEquals("选择", action.label);
|
||||
assertEquals("+", action.label);
|
||||
assertFalse(action.primaryStyle);
|
||||
assertFalse(action.compactStyle);
|
||||
assertTrue(action.compactStyle);
|
||||
assertEquals("select_conversations", action.actionKey);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user