Browse Source

Notification buttons enhancement (#8932)

* Show buttons:
two or primary and more option menu

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>

* NotificationsActivityIT: fix linting issues

Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>

* Fix kotlin syntax

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>

Co-authored-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>
Tobias Kaminsky 3 năm trước cách đây
mục cha
commit
f6fbfbd4c5

BIN
screenshots/gplay/debug/com.owncloud.android.ui.activity.NotificationsActivityIT_showNotifications.png


+ 32 - 3
src/androidTest/java/com/owncloud/android/ui/activity/NotificationsActivityIT.kt

@@ -87,9 +87,10 @@ class NotificationsActivityIT : AbstractIT() {
             )
         )
 
-        val actions = ArrayList<Action>()
-        actions.add(Action("Send usage", "link", "url", true))
-        actions.add(Action("Not now", "link", "url", false))
+        val actions = ArrayList<Action>().apply {
+            add(Action("Send usage", "link", "url", true))
+            add(Action("Not now", "link", "url", false))
+        }
 
         notifications.add(
             Notification(
@@ -112,6 +113,34 @@ class NotificationsActivityIT : AbstractIT() {
             )
         )
 
+        val moreAction = ArrayList<Action>().apply {
+            add(Action("Send usage", "link", "url", true))
+            add(Action("Not now", "link", "url", false))
+            add(Action("third action", "link", "url", false))
+            add(Action("Delay", "link", "url", false))
+        }
+
+        notifications.add(
+            Notification(
+                2,
+                "files",
+                "user",
+                date.time,
+                "objectType",
+                "objectId",
+                "Help improve Nextcloud",
+                "SubjectRich",
+                HashMap<String, RichObject>(),
+                "Do you want to help us to improve Nextcloud by providing some anonymize data about your setup and " +
+                    "usage?",
+                "MessageRich",
+                HashMap<String, RichObject>(),
+                "link",
+                "icon",
+                moreAction
+            )
+        )
+
         sut.runOnUiThread { sut.populateList(notifications) }
 
         shortSleep()

+ 111 - 23
src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java

@@ -67,6 +67,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import androidx.annotation.NonNull;
+import androidx.appcompat.widget.PopupMenu;
 import androidx.recyclerview.widget.RecyclerView;
 
 /**
@@ -174,46 +175,133 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
             0
                          );
 
-        for (Action action : notification.getActions()) {
-            button = new MaterialButton(notificationsActivity);
-
-            int primaryColor = ThemeColorUtils.primaryColor(notificationsActivity);
-
-            if (action.primary) {
-                ThemeButtonUtils.colorPrimaryButton(button, notificationsActivity);
-            } else {
-                button.setBackgroundColor(resources.getColor(R.color.grey_200));
-                button.setTextColor(primaryColor);
+        int primaryColor = ThemeColorUtils.primaryColor(notificationsActivity);
+        
+        List<Action> overflowActions = new ArrayList<>();
+        
+        if (notification.getActions().size() > 2) {
+            for (Action action: notification.getActions()) {
+                if (action.primary) {
+                    button = new MaterialButton(notificationsActivity);
+                    button.setAllCaps(false);
+
+                    button.setText(action.label);
+                    button.setCornerRadiusResource(R.dimen.button_corner_radius);
+
+                    button.setLayoutParams(params);
+                    button.setGravity(Gravity.CENTER);
+
+                    button.setOnClickListener(v -> {
+                        setButtonEnabled(holder, false);
+
+                        if (ACTION_TYPE_WEB.equals(action.type)) {
+                            Intent intent = new Intent(Intent.ACTION_VIEW);
+                            intent.setData(Uri.parse(action.link));
+
+                            notificationsActivity.startActivity(intent);
+                        } else {
+                            new NotificationExecuteActionTask(client,
+                                                              holder,
+                                                              notification,
+                                                              notificationsActivity)
+                                .execute(action);
+                        }
+                    });
+
+                    ThemeButtonUtils.colorPrimaryButton(button, notificationsActivity);
+                    holder.binding.buttons.addView(button);
+                } else {
+                    overflowActions.add(action);
+                }
             }
+            
+            // further actions
+            button = new MaterialButton(notificationsActivity);
+            button.setBackgroundColor(resources.getColor(R.color.grey_200));
+            button.setTextColor(primaryColor);
 
             button.setAllCaps(false);
 
-            button.setText(action.label);
+            button.setText(R.string.more);
             button.setCornerRadiusResource(R.dimen.button_corner_radius);
 
             button.setLayoutParams(params);
             button.setGravity(Gravity.CENTER);
 
+            MaterialButton finalButton = button;
             button.setOnClickListener(v -> {
-                setButtonEnabled(holder, false);
+                PopupMenu popup = new PopupMenu(notificationsActivity, finalButton);
+
+                for (Action action : overflowActions) {
+                    popup.getMenu().add(action.label).setOnMenuItemClickListener(item -> {
+                        setButtonEnabled(holder, false);
+
+                        if (ACTION_TYPE_WEB.equals(action.type)) {
+                            Intent intent = new Intent(Intent.ACTION_VIEW);
+                            intent.setData(Uri.parse(action.link));
+
+                            notificationsActivity.startActivity(intent);
+                        } else {
+                            new NotificationExecuteActionTask(client,
+                                                              holder,
+                                                              notification,
+                                                              notificationsActivity)
+                                .execute(action);
+                        }
+                        
+                        return true;
+                    });
+                }
+                
+                popup.show();
+            });
 
-                if (ACTION_TYPE_WEB.equals(action.type)) {
-                    Intent intent = new Intent(Intent.ACTION_VIEW);
-                    intent.setData(Uri.parse(action.link));
+            holder.binding.buttons.addView(button);
+        } else {
+            for (Action action : notification.getActions()) {
+                button = new MaterialButton(notificationsActivity);
 
-                    notificationsActivity.startActivity(intent);
+                if (action.primary) {
+                    ThemeButtonUtils.colorPrimaryButton(button, notificationsActivity);
                 } else {
-                    new NotificationExecuteActionTask(client,
-                                                      holder,
-                                                      notification,
-                                                      notificationsActivity)
-                        .execute(action);
+                    button.setBackgroundColor(resources.getColor(R.color.grey_200));
+                    button.setTextColor(primaryColor);
                 }
-            });
 
-            holder.binding.buttons.addView(button);
+                button.setAllCaps(false);
+
+                button.setText(action.label);
+                button.setCornerRadiusResource(R.dimen.button_corner_radius);
+
+                button.setLayoutParams(params);
+                button.setGravity(Gravity.CENTER);
+
+                button.setOnClickListener(v -> {
+                    setButtonEnabled(holder, false);
+
+                    if (ACTION_TYPE_WEB.equals(action.type)) {
+                        Intent intent = new Intent(Intent.ACTION_VIEW);
+                        intent.setData(Uri.parse(action.link));
+
+                        notificationsActivity.startActivity(intent);
+                    } else {
+                        new NotificationExecuteActionTask(client,
+                                                          holder,
+                                                          notification,
+                                                          notificationsActivity)
+                            .execute(action);
+                    }
+                });
+
+                holder.binding.buttons.addView(button);
+            }
         }
     }
+    
+    private void handleItemClick() {
+        
+    }
+    
 
     private SpannableStringBuilder makeSpecialPartsBold(Notification notification) {
         String text = notification.getSubjectRich();

+ 1 - 0
src/main/res/values/strings.xml

@@ -963,4 +963,5 @@
     <string name="choose_template_helper_text">Please choose a template and enter a file name.</string>
     <string name="strict_mode">Strict mode: no HTTP connection allowed!</string>
     <string name="fullscreen">Fullscreen</string>
+    <string name="more">more</string>
 </resources>