Просмотр исходного кода

Fix lock info in actionMode menu when selecting a single, locked, file

Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>
Álvaro Brey Vilas 3 лет назад
Родитель
Сommit
db30142ad3

+ 22 - 38
app/src/main/java/com/nextcloud/android/files/FileActionsPopupMenu.kt → app/src/main/java/com/nextcloud/android/files/FileLockingMenuCustomization.kt

@@ -25,51 +25,29 @@ import android.content.Context
 import android.graphics.Typeface
 import android.os.Build
 import android.text.style.StyleSpan
-import android.view.ContextThemeWrapper
+import android.view.Menu
 import android.view.MenuItem
-import android.view.View
-import androidx.appcompat.widget.PopupMenu
 import com.nextcloud.utils.TimeConstants
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.OCFile
-import com.owncloud.android.files.FileMenuFilter
 import com.owncloud.android.lib.resources.files.model.FileLockType
 import com.owncloud.android.utils.DisplayUtils
 
 /**
- * Wrapper around PopupMenu with file locking info
+ * Customizes a Menu to show locking information
  */
-class FileActionsPopupMenu(
-    private val context: Context,
-    anchor: View,
-    private val file: OCFile,
-    fileMenuFilter: FileMenuFilter
-) : PopupMenu(wrapContext(context), anchor) {
-
-    init {
-        this.inflate(R.menu.item_file)
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            menu.setGroupDividerEnabled(true)
-        }
-        fileMenuFilter.filter(menu, true)
-
+class FileLockingMenuCustomization(val context: Context) {
+    fun customizeMenu(menu: Menu, file: OCFile) {
         if (file.isLocked) {
-            menu.findItem(R.id.action_locked_by).title = getLockedByText()
-            showLockedUntil()
-        }
-    }
-
-    private fun showLockedUntil() {
-        val lockedUntil: MenuItem = menu.findItem(R.id.action_locked_until)
-        if (file.lockTimestamp == 0L || file.lockTimeout == 0L) {
-            lockedUntil.isVisible = false
-        } else {
-            lockedUntil.title = context.getString(R.string.lock_expiration_info, getExpirationRelativeText())
-            lockedUntil.isVisible = true
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+                menu.setGroupDividerEnabled(true)
+            }
+            menu.findItem(R.id.action_locked_by).title = getLockedByText(file)
+            showLockedUntil(menu, file)
         }
     }
 
-    private fun getLockedByText(): CharSequence {
+    private fun getLockedByText(file: OCFile): CharSequence {
         val username = file.lockOwnerDisplayName ?: file.lockOwnerId
         val resource = when (file.lockType) {
             FileLockType.COLLABORATIVE -> R.string.locked_by_app
@@ -82,13 +60,19 @@ class FileActionsPopupMenu(
         )
     }
 
-    private fun getExpirationRelativeText(): CharSequence? {
-        val expirationTimestamp = (file.lockTimestamp + file.lockTimeout) * TimeConstants.MILLIS_PER_SECOND
-        return DisplayUtils.getRelativeTimestamp(context, expirationTimestamp, true)
+    private fun showLockedUntil(menu: Menu, file: OCFile) {
+        val lockedUntil: MenuItem = menu.findItem(R.id.action_locked_until)
+        if (file.lockTimestamp == 0L || file.lockTimeout == 0L) {
+            lockedUntil.isVisible = false
+        } else {
+            lockedUntil.title =
+                context.getString(R.string.lock_expiration_info, getExpirationRelativeText(file))
+            lockedUntil.isVisible = true
+        }
     }
 
-    companion object {
-        private fun wrapContext(context: Context): Context =
-            ContextThemeWrapper(context, R.style.Nextcloud_Widget_PopupMenu)
+    private fun getExpirationRelativeText(file: OCFile): CharSequence? {
+        val expirationTimestamp = (file.lockTimestamp + file.lockTimeout) * TimeConstants.MILLIS_PER_SECOND
+        return DisplayUtils.getRelativeTimestamp(context, expirationTimestamp, true)
     }
 }

+ 42 - 0
app/src/main/java/com/nextcloud/android/files/ThemedPopupMenu.kt

@@ -0,0 +1,42 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Álvaro Brey Vilas
+ * Copyright (C) 2022 Álvaro Brey Vilas
+ * Copyright (C) 2022 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.android.files
+
+import android.content.Context
+import android.view.ContextThemeWrapper
+import android.view.View
+import androidx.appcompat.widget.PopupMenu
+import com.owncloud.android.R
+
+/**
+ * This is a [PopupMenu] with grayed out disabled elements
+ */
+class ThemedPopupMenu(
+    context: Context,
+    anchor: View
+) : PopupMenu(wrapContext(context), anchor) {
+
+    companion object {
+        private fun wrapContext(context: Context): Context =
+            ContextThemeWrapper(context, R.style.Nextcloud_Widget_PopupMenu)
+    }
+}

+ 9 - 4
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -47,7 +47,8 @@ import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.behavior.HideBottomViewOnScrollBehavior;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.google.android.material.snackbar.Snackbar;
-import com.nextcloud.android.files.FileActionsPopupMenu;
+import com.nextcloud.android.files.FileLockingMenuCustomization;
+import com.nextcloud.android.files.ThemedPopupMenu;
 import com.nextcloud.android.lib.resources.files.ToggleFileLockRemoteOperation;
 import com.nextcloud.android.lib.richWorkspace.RichWorkspaceDirectEditingRemoteOperation;
 import com.nextcloud.client.account.User;
@@ -572,14 +573,15 @@ public class OCFileListFragment extends ExtendedListFragment implements
     @Override
     public void onOverflowIconClicked(OCFile file, View view) {
         throttler.run("overflowClick", () -> {
+            final ThemedPopupMenu popup = new ThemedPopupMenu(requireContext(), view);
+            popup.inflate(R.menu.item_file);
             FileMenuFilter mf = new FileMenuFilter(mAdapter.getFiles().size(),
                                                    Collections.singleton(file),
                                                    mContainerActivity, getActivity(),
                                                    true,
                                                    accountManager.getUser());
-
-            final FileActionsPopupMenu popup = new FileActionsPopupMenu(requireContext(), view, file, mf);
-
+            mf.filter(popup.getMenu(), true);
+            new FileLockingMenuCustomization(requireContext()).customizeMenu(popup.getMenu(), file);
             popup.setOnMenuItemClickListener(item -> {
                 Set<OCFile> checkedFiles = new HashSet<>();
                 checkedFiles.add(file);
@@ -746,6 +748,9 @@ public class OCFileListFragment extends ExtendedListFragment implements
             // Determine if we need to finish the action mode because there are no items selected
             if (checkedCount == 0 && !mIsActionModeNew) {
                 exitSelectionMode();
+            } else if (checkedCount == 1) {
+                // customize for locking if file is locked
+                new FileLockingMenuCustomization(requireContext()).customizeMenu(menu, checkedFiles.iterator().next());
             }
 
             return true;

+ 0 - 0
app/src/main/res/color/popup_item_text_color.xml → app/src/main/res/color/menu_item_text_color.xml


+ 1 - 1
app/src/main/res/layout/toolbar_standard.xml

@@ -111,7 +111,7 @@
                 android:layout_width="match_parent"
                 android:layout_height="?attr/actionBarSize"
                 android:background="@color/appbar"
-                android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
+                android:theme="@style/Theme.ToolbarWithDisabled"
                 app:popupTheme="@style/Theme.AppCompat.DayNight.NoActionBar"
                 tools:visibility="gone">
 

+ 5 - 1
app/src/main/res/values/styles.xml

@@ -387,7 +387,11 @@
     </style>
 
     <style name="Nextcloud.Widget.PopupMenu" parent="@style/Widget.AppCompat.PopupMenu">
-        <item name="android:textColor">@color/popup_item_text_color</item>
+        <item name="android:textColor">@color/menu_item_text_color</item>
+    </style>
+
+    <style name="Theme.ToolbarWithDisabled" parent="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">
+        <item name="android:textColor">@color/menu_item_text_color</item>
     </style>
 
     <style name="MaterialListItemSingleLine">