1
0
Fork 0

For #1539: Only allow delete when folders multi-selected (#4062)

master
Colin Lee 2019-08-02 12:11:21 -05:00 committed by Sawyer Blatz
parent da59e36c1b
commit 33e881ca8a
6 changed files with 38 additions and 2 deletions

View File

@ -203,7 +203,6 @@ class BookmarkAdapter(val emptyView: View, val interactor: BookmarkViewInteracto
if (!item.inRoots()) {
setupMenu(item)
view.setOnLongClickListener(null)
} else {
view.overflowView.visibility = View.GONE
}

View File

@ -28,6 +28,7 @@ import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import mozilla.appservices.places.BookmarkRoot
import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.concept.storage.BookmarkNodeType
import mozilla.components.concept.sync.AccountObserver
import mozilla.components.concept.sync.OAuthAccount
import mozilla.components.concept.sync.Profile
@ -158,7 +159,11 @@ class BookmarkFragment : LibraryPageFragment<BookmarkNode>(), BackHandler, Accou
inflater.inflate(R.menu.bookmarks_menu, menu)
}
is BookmarkState.Mode.Selecting -> {
inflater.inflate(R.menu.bookmarks_select_multi, menu)
if (mode.selectedItems.any { it.type != BookmarkNodeType.ITEM }) {
inflater.inflate(R.menu.bookmarks_select_multi_not_item, menu)
} else {
inflater.inflate(R.menu.bookmarks_select_multi, menu)
}
menu.findItem(R.id.edit_bookmark_multi_select)?.run {
isVisible = mode.selectedItems.size == 1
icon.colorFilter = PorterDuffColorFilter(

View File

@ -84,6 +84,10 @@ class BookmarkFragmentInteractor(
}
override fun select(node: BookmarkNode) {
if (node.inRoots()) {
snackbarPresenter.present(context.getString(R.string.bookmark_cannot_edit_root))
return
}
bookmarkStore.dispatch(BookmarkAction.Select(node))
}

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/delete_bookmarks_multi_select"
android:icon="@drawable/mozac_ic_delete"
android:iconTint="?primaryText"
android:title="@string/bookmark_menu_delete_button"
app:showAsAction="ifRoom"
tools:targetApi="o" />
</menu>

View File

@ -709,4 +709,6 @@
<string name="sign_out_disconnect">Disconnect</string>
<!-- Option to cancel signing out shown in confirmation dialog to sign out of account -->
<string name="sign_out_cancel">Cancel</string>
<!-- Error message snackbar shown after the user tried to select a default folder which cannot be altered -->
<string name="bookmark_cannot_edit_root">Cant edit default folders</string>
</resources>

View File

@ -10,12 +10,14 @@ import android.content.Context
import androidx.core.content.getSystemService
import androidx.navigation.NavController
import androidx.navigation.NavDestination
import io.mockk.called
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.spyk
import io.mockk.verify
import io.mockk.verifyOrder
import mozilla.appservices.places.BookmarkRoot
import mozilla.components.concept.storage.BookmarkNode
import mozilla.components.concept.storage.BookmarkNodeType
import org.junit.Before
@ -61,6 +63,9 @@ class BookmarkFragmentInteractorTest {
private val tree = BookmarkNode(
BookmarkNodeType.FOLDER, "123", null, 0, "Mobile", null, listOf(item, separator, childItem, subfolder)
)
private val root = BookmarkNode(
BookmarkNodeType.FOLDER, BookmarkRoot.Root.id, null, 0, BookmarkRoot.Root.name, null, null
)
@Before
fun setup() {
@ -164,6 +169,13 @@ class BookmarkFragmentInteractorTest {
}
}
@Test
fun `cannot select bookmark roots`() {
interactor.select(root)
verify { bookmarkStore wasNot called }
}
@Test
fun `copy a bookmark item`() {
val clipboardManager: ClipboardManager = mockk(relaxed = true)