diff --git a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt index 0920c8dee..05f756936 100644 --- a/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt +++ b/app/src/androidTest/java/org/mozilla/fenix/ui/robots/BookmarksRobot.kt @@ -101,7 +101,7 @@ private fun folderTitle() = onView(withId(R.id.title)) private fun addFolderButton() = onView(withId(R.id.add_bookmark_folder)) -private fun addFolderTitleField() = onView(withId(R.id.bookmarkAddFolderTitleEdit)) +private fun addFolderTitleField() = onView(withId(R.id.bookmarkNameEdit)) private fun saveFolderButton() = onView(withId(R.id.confirm_add_folder_button)) @@ -151,7 +151,7 @@ private fun assertBookmarkNameEditBox() = .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) private fun assertBookmarkFolderSelector() = - onView(withId(R.id.bookmarkFolderSelector)) + onView(withId(R.id.bookmarkParentFolderSelector)) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))) private fun assertBookmarkURLEditBox() = diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt index 8670ab028..7fb73f2e7 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/addfolder/AddBookmarkFolderFragment.kt @@ -8,16 +8,19 @@ import android.os.Bundle import android.view.Menu import android.view.MenuInflater import android.view.MenuItem +import android.view.View +import android.view.View.GONE import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.Navigation -import kotlinx.android.synthetic.main.fragment_add_bookmark_folder.* +import kotlinx.android.synthetic.main.fragment_edit_bookmark.* import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import mozilla.appservices.places.BookmarkRoot import org.mozilla.fenix.R import org.mozilla.fenix.components.metrics.Event @@ -28,7 +31,7 @@ import org.mozilla.fenix.library.bookmarks.BookmarksSharedViewModel /** * Menu to create a new bookmark folder. */ -class AddBookmarkFolderFragment : Fragment(R.layout.fragment_add_bookmark_folder) { +class AddBookmarkFolderFragment : Fragment(R.layout.fragment_edit_bookmark) { private val sharedViewModel: BookmarksSharedViewModel by activityViewModels { ViewModelProvider.NewInstanceFactory() // this is a workaround for #4652 @@ -39,27 +42,36 @@ class AddBookmarkFolderFragment : Fragment(R.layout.fragment_add_bookmark_folder setHasOptionsMenu(true) } + /** + * Hides fields for bookmark items present in the shared layout file. + */ + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + bookmarkUrlLabel.visibility = GONE + bookmarkUrlEdit.visibility = GONE + } + override fun onResume() { super.onResume() (activity as AppCompatActivity).title = getString(R.string.bookmark_add_folder_fragment_label) (activity as AppCompatActivity).supportActionBar?.show() - lifecycleScope.launch(IO) { - sharedViewModel.selectedFolder = sharedViewModel.selectedFolder - ?: requireComponents.core.bookmarksStorage.getTree(BookmarkRoot.Mobile.id) - launch(Main) { - bookmarkAddFolderParentSelector.text = sharedViewModel.selectedFolder!!.title - bookmarkAddFolderParentSelector.setOnClickListener { - nav( - R.id.bookmarkAddFolderFragment, - AddBookmarkFolderFragmentDirections - .actionBookmarkAddFolderFragmentToBookmarkSelectFolderFragment( - BookmarkRoot.Root.id, - true - ) - ) - } + lifecycleScope.launch(Main) { + sharedViewModel.selectedFolder = withContext(IO) { + sharedViewModel.selectedFolder + ?: requireComponents.core.bookmarksStorage.getTree(BookmarkRoot.Mobile.id) + } + + bookmarkParentFolderSelector.text = sharedViewModel.selectedFolder!!.title + bookmarkParentFolderSelector.setOnClickListener { + nav( + R.id.bookmarkAddFolderFragment, + AddBookmarkFolderFragmentDirections + .actionBookmarkAddFolderFragmentToBookmarkSelectFolderFragment( + BookmarkRoot.Root.id, + true + ) + ) } } } @@ -71,18 +83,18 @@ class AddBookmarkFolderFragment : Fragment(R.layout.fragment_add_bookmark_folder override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.confirm_add_folder_button -> { - if (bookmarkAddFolderTitleEdit.text.isNullOrBlank()) { - bookmarkAddFolderTitleEdit.error = + if (bookmarkNameEdit.text.isNullOrBlank()) { + bookmarkNameEdit.error = getString(R.string.bookmark_empty_title_error) return true } lifecycleScope.launch(IO) { val newGuid = requireComponents.core.bookmarksStorage.addFolder( - sharedViewModel.selectedFolder!!.guid, bookmarkAddFolderTitleEdit.text.toString(), null + sharedViewModel.selectedFolder!!.guid, bookmarkNameEdit.text.toString(), null ) sharedViewModel.selectedFolder = requireComponents.core.bookmarksStorage.getTree(newGuid) requireComponents.analytics.metrics.track(Event.AddBookmarkFolder) - launch(Main) { + withContext(Main) { Navigation.findNavController(requireActivity(), R.id.container).popBackStack() } } diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt index 78c138ddc..16380564e 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/edit/EditBookmarkFragment.kt @@ -99,13 +99,13 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { bookmarkUrlEdit.setText(bookmarkNode.url) if (sharedViewModel.selectedFolder != null && bookmarkNode.title != null) { - updateBookmarkNode(bookmarkNode.title to bookmarkNode.url) + updateBookmarkNode(bookmarkNode.title, bookmarkNode.url) } } bookmarkParent?.let { node -> - bookmarkFolderSelector.text = node.title - bookmarkFolderSelector.setOnClickListener { + bookmarkParentFolderSelector.text = node.title + bookmarkParentFolderSelector.setOnClickListener { sharedViewModel.selectedFolder = null nav( R.id.bookmarkEditFragment, @@ -132,13 +132,13 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { BiFunction { name: CharSequence, url: CharSequence -> Pair(name.toString(), url.toString()) }) - .filter { it.first.isNotBlank() } + .filter { (name) -> name.isNotBlank() } .debounce(debouncePeriodInMs, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .`as`(AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(this@EditBookmarkFragment))) - .subscribe { - updateBookmarkNode(it) + .subscribe { (name, url) -> + updateBookmarkNode(name, url) } } @@ -190,28 +190,28 @@ class EditBookmarkFragment : Fragment(R.layout.fragment_edit_bookmark) { } } - private fun updateBookmarkNode(pair: Pair) { + private fun updateBookmarkNode(title: String?, url: String?) { lifecycleScope.launch(IO) { try { - requireComponents.let { - if (pair != Pair(bookmarkNode?.title, bookmarkNode?.url)) { - it.analytics.metrics.track(Event.EditedBookmark) + requireComponents.let { components -> + if (title != bookmarkNode?.title || url != bookmarkNode?.url) { + components.analytics.metrics.track(Event.EditedBookmark) } if (sharedViewModel.selectedFolder != null) { - it.analytics.metrics.track(Event.MovedBookmark) + components.analytics.metrics.track(Event.MovedBookmark) } - it.core.bookmarksStorage.updateNode( + components.core.bookmarksStorage.updateNode( guidToEdit, BookmarkInfo( sharedViewModel.selectedFolder?.guid ?: bookmarkNode!!.parentGuid, bookmarkNode?.position, - pair.first, - if (bookmarkNode?.type == BookmarkNodeType.ITEM) pair.second else null + title, + if (bookmarkNode?.type == BookmarkNodeType.ITEM) url else null ) ) } } catch (e: UrlParseFailed) { - launch(Main) { + withContext(Main) { bookmarkUrlEdit.error = getString(R.string.bookmark_invalid_url_error) } } diff --git a/app/src/main/res/layout/fragment_add_bookmark_folder.xml b/app/src/main/res/layout/fragment_add_bookmark_folder.xml deleted file mode 100644 index f55dbe8c4..000000000 --- a/app/src/main/res/layout/fragment_add_bookmark_folder.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_edit_bookmark.xml b/app/src/main/res/layout/fragment_edit_bookmark.xml index b2d07eefc..305d87669 100644 --- a/app/src/main/res/layout/fragment_edit_bookmark.xml +++ b/app/src/main/res/layout/fragment_edit_bookmark.xml @@ -3,11 +3,12 @@ - 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/. --> + android:layout_margin="16dp" + android:orientation="vertical"> + android:labelFor="@id/bookmarkParentFolderSelector" /> + app:drawableTint="?primaryText" + android:textColor="?secondaryText" + android:textSize="16sp" + tools:text="Mobile Bookmarks" />