Updater: Add a 3-dot menu for update item

Author: Timi Rautamaki <timi.rautamaki@gmail.com>
Date:   Wed Oct 13 16:06:51 2021 +0000
    Updater: add a 3-dot menu for update item

    A menu opening with only a long press is not intuitive and often not
    found by user.

    Change-Id: I7f819b77e2cbc534cafe488edadc4d3dd9b87d01

Author: Luca Stefani <luca.stefani.ge1@gmail.com>
Date:   Mon Nov 1 21:01:11 2021 +0100
    fixup! Updater: add a 3-dot menu for update item

    Change-Id: I10fe453c5f14d1a0ca49b734df517047cb7ee802

Change-Id: I8abf95327906bd6d3fb98978b931418f15d3dd00
diff --git a/res/layout-large-notouch/update_item_view.xml b/res/layout-large-notouch/update_item_view.xml
index 4e299dd..18973f2 100644
--- a/res/layout-large-notouch/update_item_view.xml
+++ b/res/layout-large-notouch/update_item_view.xml
@@ -80,12 +80,24 @@
             </RelativeLayout>
         </LinearLayout>
 
-        <Button
-            android:id="@id/update_action"
-            style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        <LinearLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:padding="8dp"
-            tools:text="Pause" />
+            android:orientation="vertical">
+            <ImageButton
+                android:id="@+id/update_menu"
+                style="?android:attr/actionOverflowButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="end"
+                android:padding="8dp" />
+            <Button
+                android:id="@id/update_action"
+                style="@style/Widget.AppCompat.Button.Borderless.Colored"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:padding="8dp"
+                tools:text="Pause" />
+        </LinearLayout>
     </LinearLayout>
 </androidx.cardview.widget.CardView>
diff --git a/res/layout/update_item_view.xml b/res/layout/update_item_view.xml
index ade5d6d..83de487 100644
--- a/res/layout/update_item_view.xml
+++ b/res/layout/update_item_view.xml
@@ -79,12 +79,24 @@
             </RelativeLayout>
         </LinearLayout>
 
-        <Button
-            android:id="@id/update_action"
-            style="@style/Widget.AppCompat.Button.Borderless.Colored"
+        <LinearLayout
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:padding="8dp"
-            tools:text="Pause" />
+            android:orientation="vertical">
+            <ImageButton
+                android:id="@+id/update_menu"
+                style="?android:attr/actionOverflowButtonStyle"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="end"
+                android:padding="8dp" />
+            <Button
+                android:id="@id/update_action"
+                style="@style/Widget.AppCompat.Button.Borderless.Colored"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:padding="8dp"
+                tools:text="Pause" />
+        </LinearLayout>
     </LinearLayout>
 </androidx.cardview.widget.CardView>
diff --git a/src/org/lineageos/updater/UpdatesListAdapter.java b/src/org/lineageos/updater/UpdatesListAdapter.java
index 33f4c2d..44474ac 100644
--- a/src/org/lineageos/updater/UpdatesListAdapter.java
+++ b/src/org/lineageos/updater/UpdatesListAdapter.java
@@ -35,6 +35,7 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.CheckBox;
+import android.widget.ImageButton;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
@@ -93,6 +94,7 @@
 
     public static class ViewHolder extends RecyclerView.ViewHolder {
         private Button mAction;
+        private ImageButton mMenu;
 
         private TextView mBuildDate;
         private TextView mBuildVersion;
@@ -104,6 +106,7 @@
         public ViewHolder(final View view) {
             super(view);
             mAction = (Button) view.findViewById(R.id.update_action);
+            mMenu = (ImageButton) view.findViewById(R.id.update_menu);
 
             mBuildDate = (TextView) view.findViewById(R.id.build_date);
             mBuildVersion = (TextView) view.findViewById(R.id.build_version);
@@ -194,8 +197,7 @@
             viewHolder.mProgressBar.setProgress(update.getProgress());
         }
 
-        viewHolder.itemView.setOnLongClickListener(getLongClickListener(update, canDelete,
-                viewHolder.mBuildDate));
+        viewHolder.mMenu.setOnClickListener(getClickListener(update, canDelete, viewHolder.mMenu));
         viewHolder.mProgressBar.setVisibility(View.VISIBLE);
         viewHolder.mProgressText.setVisibility(View.VISIBLE);
         viewHolder.mBuildSize.setVisibility(View.INVISIBLE);
@@ -204,22 +206,18 @@
     private void handleNotActiveStatus(ViewHolder viewHolder, UpdateInfo update) {
         final String downloadId = update.getDownloadId();
         if (mUpdaterController.isWaitingForReboot(downloadId)) {
-            viewHolder.itemView.setOnLongClickListener(
-                    getLongClickListener(update, false, viewHolder.mBuildDate));
+            viewHolder.mMenu.setOnClickListener(getClickListener(update, false, viewHolder.mMenu));
             setButtonAction(viewHolder.mAction, Action.REBOOT, downloadId, true);
         } else if (update.getPersistentStatus() == UpdateStatus.Persistent.VERIFIED) {
-            viewHolder.itemView.setOnLongClickListener(
-                    getLongClickListener(update, true, viewHolder.mBuildDate));
+            viewHolder.mMenu.setOnClickListener(getClickListener(update, true, viewHolder.mMenu));
             setButtonAction(viewHolder.mAction,
                     Utils.canInstall(update) ? Action.INSTALL : Action.DELETE,
                     downloadId, !isBusy());
         } else if (!Utils.canInstall(update)) {
-            viewHolder.itemView.setOnLongClickListener(
-                    getLongClickListener(update, false, viewHolder.mBuildDate));
+            viewHolder.mMenu.setOnClickListener(getClickListener(update, false, viewHolder.mMenu));
             setButtonAction(viewHolder.mAction, Action.INFO, downloadId, !isBusy());
         } else {
-            viewHolder.itemView.setOnLongClickListener(
-                    getLongClickListener(update, false, viewHolder.mBuildDate));
+            viewHolder.mMenu.setOnClickListener(getClickListener(update, false, viewHolder.mMenu));
             setButtonAction(viewHolder.mAction, Action.DOWNLOAD, downloadId, !isBusy());
         }
         String fileSize = Formatter.formatShortFileSize(mActivity, update.getFileSize());
@@ -438,11 +436,10 @@
                 .setNegativeButton(android.R.string.cancel, null);
     }
 
-    private View.OnLongClickListener getLongClickListener(final UpdateInfo update,
+    private View.OnClickListener getClickListener(final UpdateInfo update,
             final boolean canDelete, View anchor) {
         return view -> {
             startActionMode(update, canDelete, anchor);
-            return true;
         };
     }