diff --git a/android/app/src/main/java/com/hyzq/boss/MainActivity.java b/android/app/src/main/java/com/hyzq/boss/MainActivity.java
index 9d467a1..5c347f6 100644
--- a/android/app/src/main/java/com/hyzq/boss/MainActivity.java
+++ b/android/app/src/main/java/com/hyzq/boss/MainActivity.java
@@ -68,6 +68,7 @@ public class MainActivity extends AppCompatActivity {
private Button refreshButton;
private View conversationQuickActionsOverlay;
private View conversationQuickActionsScrim;
+ private View conversationQuickActionsMenu;
private View quickActionAddDevice;
private View quickActionScan;
private View quickActionGroupChat;
@@ -204,6 +205,7 @@ public class MainActivity extends AppCompatActivity {
refreshButton = findViewById(R.id.refresh_button);
conversationQuickActionsOverlay = findViewById(R.id.conversation_quick_actions_overlay);
conversationQuickActionsScrim = findViewById(R.id.conversation_quick_actions_scrim);
+ conversationQuickActionsMenu = findViewById(R.id.conversation_quick_actions_menu);
quickActionAddDevice = findViewById(R.id.quick_action_add_device);
quickActionScan = findViewById(R.id.quick_action_scan);
quickActionGroupChat = findViewById(R.id.quick_action_group_chat);
@@ -959,7 +961,7 @@ public class MainActivity extends AppCompatActivity {
}
private void showConversationQuickActions() {
- if (conversationQuickActionsOverlay == null || conversationQuickActionsVisible
+ if (conversationQuickActionsOverlay == null || conversationQuickActionsMenu == null || conversationQuickActionsVisible
|| !"conversations".equals(activeTab) || conversationSelectionMode || conversationSearchMode) {
return;
}
@@ -967,21 +969,22 @@ public class MainActivity extends AppCompatActivity {
conversationQuickActionsOverlay.setVisibility(View.VISIBLE);
conversationQuickActionsOverlay.bringToFront();
conversationQuickActionsScrim.setAlpha(0f);
- prepareConversationQuickAction(quickActionAddDevice);
- prepareConversationQuickAction(quickActionScan);
- prepareConversationQuickAction(quickActionGroupChat);
+ prepareConversationQuickActionMenu();
conversationQuickActionsScrim.animate()
.alpha(1f)
- .setDuration(160L)
+ .setDuration(140L)
+ .setInterpolator(new AccelerateDecelerateInterpolator())
+ .start();
+ conversationQuickActionsMenu.animate()
+ .alpha(1f)
+ .translationY(0f)
+ .setDuration(180L)
.setInterpolator(new AccelerateDecelerateInterpolator())
.start();
- animateConversationQuickAction(quickActionAddDevice, -BossUi.dp(this, 12), BossUi.dp(this, 84), 0L);
- animateConversationQuickAction(quickActionScan, -BossUi.dp(this, 90), BossUi.dp(this, 50), 24L);
- animateConversationQuickAction(quickActionGroupChat, -BossUi.dp(this, 172), BossUi.dp(this, 14), 48L);
}
private void hideConversationQuickActions(boolean animated) {
- if (conversationQuickActionsOverlay == null) {
+ if (conversationQuickActionsOverlay == null || conversationQuickActionsMenu == null) {
return;
}
if (!conversationQuickActionsVisible && conversationQuickActionsOverlay.getVisibility() != View.VISIBLE) {
@@ -991,71 +994,39 @@ public class MainActivity extends AppCompatActivity {
if (!animated) {
conversationQuickActionsOverlay.setVisibility(View.GONE);
conversationQuickActionsScrim.setAlpha(0f);
- resetConversationQuickAction(quickActionAddDevice);
- resetConversationQuickAction(quickActionScan);
- resetConversationQuickAction(quickActionGroupChat);
+ resetConversationQuickActionMenu();
return;
}
conversationQuickActionsScrim.animate()
.alpha(0f)
+ .setDuration(120L)
+ .setInterpolator(new AccelerateDecelerateInterpolator())
+ .start();
+ conversationQuickActionsMenu.animate()
+ .alpha(0f)
+ .translationY(-BossUi.dp(this, 8))
.setDuration(140L)
.setInterpolator(new AccelerateDecelerateInterpolator())
.start();
- collapseConversationQuickAction(quickActionAddDevice, 0L);
- collapseConversationQuickAction(quickActionScan, 20L);
- collapseConversationQuickAction(quickActionGroupChat, 40L);
conversationQuickActionsOverlay.postDelayed(() -> {
if (!conversationQuickActionsVisible) {
conversationQuickActionsOverlay.setVisibility(View.GONE);
- resetConversationQuickAction(quickActionAddDevice);
- resetConversationQuickAction(quickActionScan);
- resetConversationQuickAction(quickActionGroupChat);
+ resetConversationQuickActionMenu();
}
- }, 190L);
+ }, 150L);
}
- private void prepareConversationQuickAction(View actionView) {
- actionView.setVisibility(View.VISIBLE);
- actionView.setAlpha(0f);
- actionView.setScaleX(0.86f);
- actionView.setScaleY(0.86f);
- actionView.setTranslationX(0f);
- actionView.setTranslationY(0f);
+ private void prepareConversationQuickActionMenu() {
+ conversationQuickActionsMenu.setVisibility(View.VISIBLE);
+ conversationQuickActionsMenu.setAlpha(0f);
+ conversationQuickActionsMenu.setTranslationY(-BossUi.dp(this, 8));
}
- private void animateConversationQuickAction(View actionView, float translationX, float translationY, long delayMs) {
- actionView.animate()
- .alpha(1f)
- .scaleX(1f)
- .scaleY(1f)
- .translationX(translationX)
- .translationY(translationY)
- .setStartDelay(delayMs)
- .setDuration(180L)
- .setInterpolator(new AccelerateDecelerateInterpolator())
- .start();
- }
-
- private void collapseConversationQuickAction(View actionView, long delayMs) {
- actionView.animate()
- .alpha(0f)
- .scaleX(0.88f)
- .scaleY(0.88f)
- .translationX(0f)
- .translationY(0f)
- .setStartDelay(delayMs)
- .setDuration(140L)
- .setInterpolator(new AccelerateDecelerateInterpolator())
- .start();
- }
-
- private void resetConversationQuickAction(View actionView) {
- actionView.animate().cancel();
- actionView.setAlpha(0f);
- actionView.setScaleX(0.86f);
- actionView.setScaleY(0.86f);
- actionView.setTranslationX(0f);
- actionView.setTranslationY(0f);
+ private void resetConversationQuickActionMenu() {
+ conversationQuickActionsMenu.animate().cancel();
+ conversationQuickActionsMenu.setAlpha(0f);
+ conversationQuickActionsMenu.setTranslationY(-BossUi.dp(this, 8));
+ conversationQuickActionsMenu.setVisibility(View.GONE);
}
static boolean matchesConversationQuery(JSONObject item, String rawQuery) {
diff --git a/android/app/src/main/res/drawable/bg_conversation_quick_actions_menu.xml b/android/app/src/main/res/drawable/bg_conversation_quick_actions_menu.xml
new file mode 100644
index 0000000..8b95f63
--- /dev/null
+++ b/android/app/src/main/res/drawable/bg_conversation_quick_actions_menu.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml
index e1ba745..db3ac6b 100644
--- a/android/app/src/main/res/layout/activity_main.xml
+++ b/android/app/src/main/res/layout/activity_main.xml
@@ -273,59 +273,62 @@
android:paddingTop="22dp"
android:paddingRight="20dp">
-
+ android:alpha="0"
+ android:background="@drawable/bg_conversation_quick_actions_menu"
+ android:elevation="14dp"
+ android:orientation="vertical"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp"
+ android:translationY="-8dp"
+ android:visibility="gone">
-
+
-
+
+
+
+
diff --git a/android/app/src/test/java/com/hyzq/boss/MainActivityConversationSelectionTest.java b/android/app/src/test/java/com/hyzq/boss/MainActivityConversationSelectionTest.java
index 615ac2e..9573578 100644
--- a/android/app/src/test/java/com/hyzq/boss/MainActivityConversationSelectionTest.java
+++ b/android/app/src/test/java/com/hyzq/boss/MainActivityConversationSelectionTest.java
@@ -86,6 +86,26 @@ public class MainActivityConversationSelectionTest {
assertTrue(recyclerContainsText(list, "Boss 线程修复"));
}
+ @Test
+ public void topPlusAction_opensWechatStyleDropdownMenu() throws Exception {
+ MainActivity activity = Robolectric.buildActivity(MainActivity.class).setup().get();
+ ReflectionHelpers.setField(activity, "conversationsData", buildConversations());
+ ReflectionHelpers.callInstanceMethod(activity, "showContent");
+ Shadows.shadowOf(activity.getMainLooper()).idle();
+
+ Button actionButton = activity.findViewById(R.id.refresh_button);
+ actionButton.performClick();
+ Shadows.shadowOf(activity.getMainLooper()).idle();
+
+ View overlay = activity.findViewById(R.id.conversation_quick_actions_overlay);
+ View menu = activity.findViewById(R.id.conversation_quick_actions_menu);
+ assertEquals(View.VISIBLE, overlay.getVisibility());
+ assertEquals(View.VISIBLE, menu.getVisibility());
+ assertTrue(viewTreeContainsText(menu, "添加设备"));
+ assertTrue(viewTreeContainsText(menu, "扫一扫"));
+ assertTrue(viewTreeContainsText(menu, "发起群聊"));
+ }
+
private static View getRecyclerChild(RecyclerView recyclerView, int position) {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
int viewType = adapter.getItemViewType(position);