diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt index 58efa474e9a8..6bd5eb48ab0b 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksActivity.kt @@ -18,7 +18,11 @@ package com.duckduckgo.app.bookmarks.ui import android.content.Context import android.content.Intent +import android.graphics.Typeface import android.os.Bundle +import android.text.Spannable +import android.text.SpannableString +import android.text.style.StyleSpan import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AlertDialog @@ -33,10 +37,10 @@ import com.duckduckgo.app.bookmarks.service.ImportSavedSitesResult import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.AddBookmarkFolderDialogFragment import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.BookmarkFoldersActivity.Companion.KEY_BOOKMARK_FOLDER_ID import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.BookmarkFoldersAdapter -import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.DeleteBookmarkFolderConfirmationFragment import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.EditBookmarkFolderDialogFragment import com.duckduckgo.app.browser.BrowserActivity import com.duckduckgo.app.browser.R +import com.duckduckgo.app.browser.R.plurals import com.duckduckgo.app.browser.databinding.ActivityBookmarksBinding import com.duckduckgo.app.browser.databinding.ContentBookmarksBinding import com.duckduckgo.app.browser.favicon.FaviconManager @@ -46,14 +50,14 @@ import com.duckduckgo.app.global.extensions.html import com.duckduckgo.app.global.view.DividerAdapter import com.duckduckgo.di.scopes.ActivityScope import com.duckduckgo.mobile.android.ui.view.SearchBar +import com.duckduckgo.mobile.android.ui.view.dialog.TextAlertDialogBuilder +import com.duckduckgo.mobile.android.ui.view.dialog.TextAlertDialogBuilder.EventListener import com.duckduckgo.mobile.android.ui.view.gone import com.duckduckgo.mobile.android.ui.view.show import com.duckduckgo.mobile.android.ui.viewbinding.viewBinding import com.google.android.material.snackbar.Snackbar import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.TimeZone +import java.util.* import javax.inject.Inject @InjectWith(ActivityScope::class) @@ -275,7 +279,9 @@ class BookmarksActivity : DuckDuckGoActivity() { searchBar.onAction { when (it) { is SearchBar.Action.PerformUpAction -> hideSearchBar() - is SearchBar.Action.PerformSearch -> if (this::searchListener.isInitialized) { searchListener.onQueryTextChange(it.searchText) } + is SearchBar.Action.PerformSearch -> if (this::searchListener.isInitialized) { + searchListener.onQueryTextChange(it.searchText) + } } } } @@ -353,9 +359,35 @@ class BookmarksActivity : DuckDuckGoActivity() { } private fun deleteBookmarkFolder(bookmarkFolder: BookmarkFolder) { - val dialog = DeleteBookmarkFolderConfirmationFragment.instance(bookmarkFolder) - dialog.show(supportFragmentManager, DELETE_BOOKMARK_FOLDER_FRAGMENT_TAG) - dialog.listener = viewModel + TextAlertDialogBuilder(this) + .setTitle(R.string.delete) + .setMessage(getMessageString(bookmarkFolder)) + .setPositiveButton(R.string.yes) + .setNegativeButton(R.string.no) + .addEventListener( + object : EventListener() { + override fun onPositiveButtonClicked() { + viewModel.onBookmarkFolderDeleted(bookmarkFolder) + } + }, + ) + .show() + } + + fun getMessageString(bookmarkFolder: BookmarkFolder): SpannableString { + val totalItems = bookmarkFolder.numBookmarks + bookmarkFolder.numFolders + val message = getString(R.string.bookmarkFolderDeleteDialogMessage) + val string = SpannableString( + resources.getQuantityString( + plurals.bookmarkFolderDeleteDialogMessage, + totalItems, + message, + bookmarkFolder.name, + totalItems, + ), + ) + string.setSpan(StyleSpan(Typeface.BOLD), message.length, message.length + bookmarkFolder.name.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) + return string } override fun onRestoreInstanceState(savedInstanceState: Bundle) { @@ -401,7 +433,6 @@ class BookmarksActivity : DuckDuckGoActivity() { private const val ADD_BOOKMARK_FOLDER_FRAGMENT_TAG = "ADD_BOOKMARK_FOLDER" private const val EDIT_BOOKMARK_FOLDER_FRAGMENT_TAG = "EDIT_BOOKMARK_FOLDER" - private const val DELETE_BOOKMARK_FOLDER_FRAGMENT_TAG = "DELETE_BOOKMARK_FOLDER" private const val KEY_BOOKMARK_FOLDER_NAME = "KEY_BOOKMARK_FOLDER_NAME" private const val ROOT_FOLDER_ID = 0L diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksAdapter.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksAdapter.kt index bedac5482fcf..82c0b008758e 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksAdapter.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksAdapter.kt @@ -29,10 +29,10 @@ import androidx.recyclerview.widget.RecyclerView import com.duckduckgo.app.bookmarks.model.SavedSite import com.duckduckgo.app.browser.R import com.duckduckgo.app.browser.databinding.ViewSavedSiteEmptyHintBinding -import com.duckduckgo.app.browser.databinding.ViewSavedSiteEntryBinding import com.duckduckgo.app.browser.favicon.FaviconManager import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.baseHost +import com.duckduckgo.mobile.android.databinding.RowTwoLineItemBinding import com.duckduckgo.mobile.android.ui.menu.PopupMenu import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.launch @@ -108,7 +108,7 @@ class BookmarksAdapter( val inflater = LayoutInflater.from(parent.context) return when (viewType) { BOOKMARK_TYPE -> { - val binding = ViewSavedSiteEntryBinding.inflate(inflater, parent, false) + val binding = RowTwoLineItemBinding.inflate(inflater, parent, false) return BookmarkScreenViewHolders.BookmarksViewHolder( layoutInflater, binding, @@ -183,7 +183,7 @@ sealed class BookmarkScreenViewHolders(itemView: View) : RecyclerView.ViewHolder class BookmarksViewHolder( private val layoutInflater: LayoutInflater, - private val binding: ViewSavedSiteEntryBinding, + private val binding: RowTwoLineItemBinding, private val viewModel: BookmarksViewModel, private val lifecycleOwner: LifecycleOwner, private val faviconManager: FaviconManager, diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt index 65c0a6c75345..a61fc25a45eb 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt @@ -28,7 +28,6 @@ import com.duckduckgo.app.bookmarks.service.SavedSitesManager import com.duckduckgo.app.bookmarks.ui.BookmarksViewModel.Command.* import com.duckduckgo.app.bookmarks.ui.EditSavedSiteDialogFragment.EditSavedSiteListener import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.AddBookmarkFolderDialogFragment.AddBookmarkFolderListener -import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.DeleteBookmarkFolderConfirmationFragment.DeleteBookmarkFolderListener import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.EditBookmarkFolderDialogFragment.EditBookmarkFolderListener import com.duckduckgo.app.browser.favicon.FaviconManager import com.duckduckgo.app.global.DispatcherProvider @@ -49,7 +48,7 @@ class BookmarksViewModel @Inject constructor( private val savedSitesManager: SavedSitesManager, private val pixel: Pixel, private val dispatcherProvider: DispatcherProvider, -) : EditSavedSiteListener, AddBookmarkFolderListener, EditBookmarkFolderListener, DeleteBookmarkFolderListener, ViewModel() { +) : EditSavedSiteListener, AddBookmarkFolderListener, EditBookmarkFolderListener, ViewModel() { data class ViewState( val enableSearch: Boolean = false, @@ -214,7 +213,7 @@ class BookmarksViewModel @Inject constructor( } } - override fun onBookmarkFolderDeleted(bookmarkFolder: BookmarkFolder) { + fun onBookmarkFolderDeleted(bookmarkFolder: BookmarkFolder) { viewModelScope.launch(dispatcherProvider.io() + NonCancellable) { val folderBranch = bookmarksRepository.deleteFolderBranch(bookmarkFolder) command.postValue(ConfirmDeleteBookmarkFolder(bookmarkFolder, folderBranch)) diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/EditSavedSiteDialogFragment.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/EditSavedSiteDialogFragment.kt index a2d845a8f177..48e707b18596 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/EditSavedSiteDialogFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/EditSavedSiteDialogFragment.kt @@ -19,11 +19,12 @@ package com.duckduckgo.app.bookmarks.ui import android.os.Bundle import android.text.Editable import android.view.View -import android.widget.EditText import com.duckduckgo.app.bookmarks.model.SavedSite import com.duckduckgo.app.bookmarks.ui.bookmarkfolders.AddBookmarkFolderDialogFragment import com.duckduckgo.app.browser.R import com.duckduckgo.app.global.view.TextChangedWatcher +import com.duckduckgo.mobile.android.ui.view.text.DaxTextInput +import com.duckduckgo.mobile.android.ui.view.text.DaxTextView class EditSavedSiteDialogFragment : SavedSiteDialogFragment() { @@ -56,22 +57,22 @@ class EditSavedSiteDialogFragment : SavedSiteDialogFragment() { if (newValue.isNotBlank()) newValue else existingValue private fun populateFields( - titleInput: EditText, - urlInput: EditText, - savedLocation: EditText, + titleInput: DaxTextInput, + urlInput: DaxTextInput, + savedLocation: DaxTextView, ) { - titleInput.setText(getExistingTitle()) - urlInput.setText(getExistingUrl()) + titleInput.text = getExistingTitle() + urlInput.text = getExistingUrl() getExistingBookmarkFolderName()?.let { - if (it.isNotEmpty()) savedLocation.setText(it) + if (it.isNotEmpty()) savedLocation.text = it } } override fun onConfirmation() { val savedSite = getSavedSite() - val updatedTitle = validateInput(binding.titleInput.text.toString(), savedSite.title) - val updatedUrl = validateInput(binding.urlInput.text.toString(), savedSite.url) + val updatedTitle = validateInput(binding.titleInput.text, savedSite.title) + val updatedUrl = validateInput(binding.urlInput.text, savedSite.url) when (savedSite) { is SavedSite.Bookmark -> { diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/FavoritesAdapter.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/FavoritesAdapter.kt index 39d0d7ee5ee4..9403f6c4726d 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/FavoritesAdapter.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/FavoritesAdapter.kt @@ -29,10 +29,10 @@ import androidx.recyclerview.widget.RecyclerView import com.duckduckgo.app.bookmarks.model.SavedSite.Favorite import com.duckduckgo.app.browser.R import com.duckduckgo.app.browser.databinding.ViewSavedSiteEmptyHintBinding -import com.duckduckgo.app.browser.databinding.ViewSavedSiteEntryBinding import com.duckduckgo.app.browser.favicon.FaviconManager import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.baseHost +import com.duckduckgo.mobile.android.databinding.RowTwoLineItemBinding import com.duckduckgo.mobile.android.databinding.ViewSectionHeaderBinding import com.duckduckgo.mobile.android.ui.menu.PopupMenu import kotlinx.coroutines.channels.Channel @@ -103,7 +103,7 @@ class FavoritesAdapter( val inflater = LayoutInflater.from(parent.context) return when (viewType) { FAVORITE_TYPE -> { - val binding = ViewSavedSiteEntryBinding.inflate(inflater, parent, false) + val binding = RowTwoLineItemBinding.inflate(inflater, parent, false) return FavoritesScreenViewHolders.FavoriteViewHolder( layoutInflater, binding, @@ -198,7 +198,7 @@ sealed class FavoritesScreenViewHolders(itemView: View) : RecyclerView.ViewHolde class FavoriteViewHolder( private val layoutInflater: LayoutInflater, - private val binding: ViewSavedSiteEntryBinding, + private val binding: RowTwoLineItemBinding, private val viewModel: BookmarksViewModel, private val lifecycleOwner: LifecycleOwner, private val faviconManager: FaviconManager, diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/SavedSiteDialogFragment.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/SavedSiteDialogFragment.kt index 52b0d98ecd8a..86f59fb61cc5 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/SavedSiteDialogFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/SavedSiteDialogFragment.kt @@ -24,7 +24,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.WindowManager -import android.widget.EditText import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult import androidx.appcompat.widget.Toolbar import androidx.fragment.app.DialogFragment @@ -39,7 +38,7 @@ import com.duckduckgo.app.browser.databinding.DialogFragmentSavedSiteBinding import com.duckduckgo.app.global.view.TextChangedWatcher import com.duckduckgo.mobile.android.R as CommonR import com.duckduckgo.mobile.android.ui.view.showKeyboard -import kotlinx.android.synthetic.main.include_find_in_page.* +import com.duckduckgo.mobile.android.ui.view.text.DaxTextInput abstract class SavedSiteDialogFragment : DialogFragment() { @@ -66,7 +65,7 @@ abstract class SavedSiteDialogFragment : DialogFragment() { private fun populateFolderNameFromIntent(data: Intent) { data.getStringExtra(KEY_BOOKMARK_FOLDER_NAME)?.let { name -> - binding.savedSiteLocation.setText(name) + binding.savedSiteLocation.text = name } } @@ -79,7 +78,7 @@ abstract class SavedSiteDialogFragment : DialogFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setStyle(STYLE_NO_TITLE, R.style.SavedSiteFullScreenDialog) + setStyle(STYLE_NO_TITLE, CommonR.style.Widget_DuckDuckGo_DialogFullScreen) } override fun onCreateView( @@ -90,7 +89,7 @@ abstract class SavedSiteDialogFragment : DialogFragment() { _binding = DialogFragmentSavedSiteBinding.inflate(inflater, container, false) configureClickListeners() arguments?.getString(KEY_BOOKMARK_FOLDER_NAME)?.let { name -> - binding.savedSiteLocation.setText(name) + binding.savedSiteLocation.text = name } configureToolbar(binding.savedSiteAppBar.toolbar) configureUI() @@ -166,8 +165,7 @@ abstract class SavedSiteDialogFragment : DialogFragment() { } } - private fun showKeyboard(inputEditText: EditText) { - inputEditText.setSelection(inputEditText.text.length) + private fun showKeyboard(inputEditText: DaxTextInput) { inputEditText.showKeyboard() dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) } diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/AddBookmarkFolderDialogFragment.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/AddBookmarkFolderDialogFragment.kt index 3aa566dd414b..05e5f6769b87 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/AddBookmarkFolderDialogFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/AddBookmarkFolderDialogFragment.kt @@ -37,12 +37,12 @@ class AddBookmarkFolderDialogFragment : SavedSiteDialogFragment() { private fun configureFieldVisibility() { binding.savedSiteLocationContainer.visibility = View.VISIBLE - binding.savedSiteUrlInputContainer.visibility = View.GONE + binding.urlInput.visibility = View.GONE } override fun onConfirmation() { arguments?.getLong(KEY_PARENT_FOLDER_ID)?.let { - val name = binding.titleInput.text.toString() + val name = binding.titleInput.text if (name.isNotBlank()) { listener?.onBookmarkFolderAdded(BookmarkFolder(name = name, parentId = it)) } diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFolderStructureAdapter.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFolderStructureAdapter.kt index dd1c9da0aa7f..3020255bf4f5 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFolderStructureAdapter.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFolderStructureAdapter.kt @@ -17,14 +17,13 @@ package com.duckduckgo.app.bookmarks.ui.bookmarkfolders import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.duckduckgo.app.bookmarks.model.BookmarkFolderItem -import com.duckduckgo.app.browser.R import com.duckduckgo.app.browser.databinding.ItemBookmarkFolderBinding -import com.duckduckgo.mobile.android.R as CommonR import com.duckduckgo.mobile.android.ui.view.toPx class BookmarkFolderStructureAdapter( @@ -33,12 +32,10 @@ class BookmarkFolderStructureAdapter( ) : ListAdapter(BookmarkFolderStructureDiffCallback()) { companion object { - const val VERTICAL_PADDING_DP = 8 const val PADDING_INCREMENT_DP = 16 const val WIDTH_FACTOR = 0.5 } - private val verticalPaddingPx = VERTICAL_PADDING_DP.toPx() private val paddingIncrementPx = PADDING_INCREMENT_DP.toPx() private val maxWidth = viewWidth * WIDTH_FACTOR @@ -49,7 +46,7 @@ class BookmarkFolderStructureAdapter( viewType: Int, ): FolderViewHolder { val binding = ItemBookmarkFolderBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return FolderViewHolder(binding, viewModel, paddingIncrementPx, maxPadding, verticalPaddingPx) + return FolderViewHolder(binding, viewModel, paddingIncrementPx, maxPadding) } override fun onBindViewHolder( @@ -65,20 +62,13 @@ class FolderViewHolder( private val viewModel: BookmarkFoldersViewModel, private val paddingIncrement: Int, private val maxPadding: Int, - private val verticalPadding: Int, ) : RecyclerView.ViewHolder(binding.root) { fun bind(item: BookmarkFolderItem) { - binding.name.text = item.bookmarkFolder.name + binding.bookmarkFolderItem.setPrimaryText(item.bookmarkFolder.name) setPadding(item.depth) - if (item.isSelected) { - binding.icon.setImageResource(com.duckduckgo.mobile.android.R.drawable.ic_check_action) - binding.iconContainer.setBackgroundResource(R.drawable.selected_icon_background) - } else { - binding.icon.setImageResource(R.drawable.ic_folder) - binding.iconContainer.setBackgroundResource(CommonR.drawable.list_item_image_circular_background) - } + binding.selectedFolderContainer.visibility = if (item.isSelected) View.VISIBLE else View.GONE itemView.setOnClickListener { viewModel.onItemSelected(item.bookmarkFolder) @@ -90,7 +80,7 @@ class FolderViewHolder( if (leftPadding > maxPadding) { leftPadding = maxPadding } - binding.root.setPadding(leftPadding, verticalPadding, paddingIncrement, verticalPadding) + binding.root.setPadding(leftPadding, 0, paddingIncrement, 0) } } diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersActivity.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersActivity.kt index d61e14463819..9045111a2797 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersActivity.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersActivity.kt @@ -63,22 +63,20 @@ class BookmarkFoldersActivity : DuckDuckGoActivity() { private fun observeViewModel() { viewModel.viewState.observe( this, - { viewState -> - viewState?.let { - adapter.submitList(it.folderStructure) - } - }, - ) + ) { viewState -> + viewState?.let { + adapter.submitList(it.folderStructure) + } + } viewModel.command.observe( this, - { - when (it) { - is BookmarkFoldersViewModel.Command.SelectFolder -> setSelectedFolderResult(it.selectedBookmarkFolder) - is BookmarkFoldersViewModel.Command.NewFolderCreatedUpdateTheStructure -> setNewlyCreatedSelectedFolderResult() - } - }, - ) + ) { + when (it) { + is BookmarkFoldersViewModel.Command.SelectFolder -> setSelectedFolderResult(it.selectedBookmarkFolder) + is BookmarkFoldersViewModel.Command.NewFolderCreatedUpdateTheStructure -> setNewlyCreatedSelectedFolderResult() + } + } } override fun onCreateOptionsMenu(menu: Menu): Boolean { diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersAdapter.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersAdapter.kt index 5c2bdd93b1b4..5ced3b7c98b7 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersAdapter.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersAdapter.kt @@ -20,14 +20,13 @@ import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ImageView import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.duckduckgo.app.bookmarks.model.BookmarkFolder import com.duckduckgo.app.bookmarks.ui.BookmarksViewModel import com.duckduckgo.app.browser.R -import com.duckduckgo.app.browser.databinding.ViewBookmarkFolderEntryBinding +import com.duckduckgo.mobile.android.databinding.RowTwoLineItemBinding import com.duckduckgo.mobile.android.databinding.ViewSectionHeaderBinding import com.duckduckgo.mobile.android.ui.menu.PopupMenu import timber.log.Timber @@ -69,7 +68,7 @@ class BookmarkFoldersAdapter( val inflater = LayoutInflater.from(parent.context) return when (viewType) { BOOKMARK_FOLDER_TYPE -> { - val binding = ViewBookmarkFolderEntryBinding.inflate(inflater, parent, false) + val binding = RowTwoLineItemBinding.inflate(inflater, parent, false) BookmarkFolderScreenViewHolders.BookmarkFoldersViewHolder(layoutInflater, binding, viewModel) } BOOKMARK_FOLDERS_SECTION_TITLE_TYPE -> { @@ -113,41 +112,44 @@ sealed class BookmarkFolderScreenViewHolders(itemView: View) : RecyclerView.View class BookmarkFoldersViewHolder( private val layoutInflater: LayoutInflater, - private val binding: ViewBookmarkFolderEntryBinding, + private val binding: RowTwoLineItemBinding, private val viewModel: BookmarksViewModel, ) : BookmarkFolderScreenViewHolders(binding.root) { private val context: Context = binding.root.context fun update(bookmarkFolder: BookmarkFolder) { - binding.overflowMenu.contentDescription = context.getString( - R.string.bookmarkOverflowContentDescription, - bookmarkFolder.name, - ) + val listItem = binding.root + // fixme: After migration this contentDescription will be lost + // binding.overflowMenu.contentDescription = context.getString( + // R.string.bookmarkOverflowContentDescription, + // bookmarkFolder.name, + // ) - binding.title.text = bookmarkFolder.name + listItem.setPrimaryText(bookmarkFolder.name) val totalItems = bookmarkFolder.numBookmarks + bookmarkFolder.numFolders if (totalItems == 0) { - binding.subtitle.text = context.getString(R.string.bookmarkFolderEmpty) + listItem.setSecondaryText(context.getString(R.string.bookmarkFolderEmpty)) } else { - binding.subtitle.text = context.resources.getQuantityString(R.plurals.bookmarkFolderItems, totalItems, totalItems) + listItem.setSecondaryText(context.resources.getQuantityString(R.plurals.bookmarkFolderItems, totalItems, totalItems)) } - binding.icon.setImageResource(R.drawable.ic_folder) + listItem.setLeadingIcon(R.drawable.ic_folder_24) - binding.overflowMenu.setOnClickListener { - showOverFlowMenu(binding.overflowMenu, bookmarkFolder) + listItem.showTrailingIcon() + listItem.setTrailingIconClickListener { + showOverFlowMenu(listItem, bookmarkFolder) } - binding.root.setOnClickListener { + listItem.setOnClickListener { viewModel.onBookmarkFolderSelected(bookmarkFolder) } } private fun showOverFlowMenu( - anchor: ImageView, + anchor: View, bookmarkFolder: BookmarkFolder, ) { val popupMenu = PopupMenu(layoutInflater, R.layout.popup_window_edit_delete_menu) diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersViewModel.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersViewModel.kt index 38cb0766caf9..b73a49ab476e 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/BookmarkFoldersViewModel.kt @@ -43,8 +43,8 @@ class BookmarkFoldersViewModel @Inject constructor( ) sealed class Command { - class SelectFolder(val selectedBookmarkFolder: BookmarkFolder) : BookmarkFoldersViewModel.Command() - object NewFolderCreatedUpdateTheStructure : BookmarkFoldersViewModel.Command() + class SelectFolder(val selectedBookmarkFolder: BookmarkFolder) : Command() + object NewFolderCreatedUpdateTheStructure : Command() } val viewState: MutableLiveData = MutableLiveData() diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/DeleteBookmarkFolderConfirmationFragment.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/DeleteBookmarkFolderConfirmationFragment.kt deleted file mode 100644 index d104c826a408..000000000000 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/DeleteBookmarkFolderConfirmationFragment.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2021 DuckDuckGo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.duckduckgo.app.bookmarks.ui.bookmarkfolders - -import android.app.Dialog -import android.graphics.Typeface -import android.os.Bundle -import android.text.Spannable -import android.text.SpannableString -import android.text.style.StyleSpan -import androidx.appcompat.app.AlertDialog -import androidx.fragment.app.DialogFragment -import com.duckduckgo.app.bookmarks.model.BookmarkFolder -import com.duckduckgo.app.browser.R - -class DeleteBookmarkFolderConfirmationFragment : DialogFragment() { - - interface DeleteBookmarkFolderListener { - fun onBookmarkFolderDeleted(bookmarkFolder: BookmarkFolder) - } - - var listener: DeleteBookmarkFolderListener? = null - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = - AlertDialog.Builder(requireContext()) - .setMessage(getMessageString()) - .setTitle(R.string.delete) - .setPositiveButton(R.string.delete) { _, _ -> - listener?.onBookmarkFolderDeleted(arguments?.getSerializable(BOOKMARK_FOLDER_KEY) as BookmarkFolder) - } - .setNegativeButton(R.string.cancel) { _, _ -> } - .create() - - fun getMessageString(): SpannableString { - val bookmarkFolder = arguments?.getSerializable(BOOKMARK_FOLDER_KEY) as BookmarkFolder - val totalItems = bookmarkFolder.numBookmarks + bookmarkFolder.numFolders - val message = getString(R.string.bookmarkFolderDeleteDialogMessage) - val string = SpannableString( - resources.getQuantityString( - R.plurals.bookmarkFolderDeleteDialogMessage, - totalItems, - message, - bookmarkFolder.name, - totalItems, - ), - ) - string.setSpan(StyleSpan(Typeface.BOLD), message.length, message.length + bookmarkFolder.name.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) - return string - } - - companion object { - - private const val BOOKMARK_FOLDER_KEY = "BOOKMARK_FOLDER_KEY" - - fun instance(bookmarkFolder: BookmarkFolder): DeleteBookmarkFolderConfirmationFragment { - val fragment = DeleteBookmarkFolderConfirmationFragment() - val bundle = Bundle() - bundle.putSerializable(BOOKMARK_FOLDER_KEY, bookmarkFolder) - fragment.arguments = bundle - return fragment - } - } -} diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/EditBookmarkFolderDialogFragment.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/EditBookmarkFolderDialogFragment.kt index 23629bff5859..a02a16f1d9d8 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/EditBookmarkFolderDialogFragment.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/bookmarkfolders/EditBookmarkFolderDialogFragment.kt @@ -34,19 +34,19 @@ class EditBookmarkFolderDialogFragment : SavedSiteDialogFragment() { setToolbarTitle(getString(R.string.editFolder)) showAddFolderMenu = true arguments?.getSerializable(BookmarkFoldersActivity.KEY_CURRENT_FOLDER)?.let { - binding.titleInput.setText((it as BookmarkFolder).name) + binding.titleInput.text = (it as BookmarkFolder).name } configureFieldVisibility() } private fun configureFieldVisibility() { binding.savedSiteLocationContainer.visibility = View.VISIBLE - binding.savedSiteUrlInputContainer.visibility = View.GONE + binding.urlInput.visibility = View.GONE } override fun onConfirmation() { arguments?.getLong(KEY_PARENT_FOLDER_ID)?.let { - val name = binding.titleInput.text.toString() + val name = binding.titleInput.text if (name.isNotBlank()) { val bookmarkFolder = arguments?.getSerializable(BookmarkFoldersActivity.KEY_CURRENT_FOLDER) as BookmarkFolder listener?.onBookmarkFolderUpdated(bookmarkFolder.copy(name = name, parentId = it)) diff --git a/app/src/main/res/drawable/ic_add_folder.xml b/app/src/main/res/drawable/ic_add_folder.xml deleted file mode 100644 index 810820ca395f..000000000000 --- a/app/src/main/res/drawable/ic_add_folder.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - diff --git a/app/src/main/res/drawable/ic_loupe_24dp_dark.xml b/app/src/main/res/drawable/ic_find_search_24.xml similarity index 50% rename from app/src/main/res/drawable/ic_loupe_24dp_dark.xml rename to app/src/main/res/drawable/ic_find_search_24.xml index 2cc6416956e1..f1a677d184b8 100644 --- a/app/src/main/res/drawable/ic_loupe_24dp_dark.xml +++ b/app/src/main/res/drawable/ic_find_search_24.xml @@ -1,5 +1,5 @@ - + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + diff --git a/app/src/main/res/drawable/ic_folder.xml b/app/src/main/res/drawable/ic_folder.xml deleted file mode 100644 index f3e05f8969a6..000000000000 --- a/app/src/main/res/drawable/ic_folder.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_loupe_24dp_daynight.xml b/app/src/main/res/drawable/ic_folder_24.xml similarity index 63% rename from app/src/main/res/drawable/ic_loupe_24dp_daynight.xml rename to app/src/main/res/drawable/ic_folder_24.xml index e6ac6344da9a..4ade00bcb443 100644 --- a/app/src/main/res/drawable/ic_loupe_24dp_daynight.xml +++ b/app/src/main/res/drawable/ic_folder_24.xml @@ -1,5 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_loupe_24dp.xml b/app/src/main/res/drawable/ic_loupe_24dp.xml deleted file mode 100644 index c2fe4971c897..000000000000 --- a/app/src/main/res/drawable/ic_loupe_24dp.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ic_loupe_24dp_light.xml b/app/src/main/res/drawable/ic_loupe_24dp_light.xml deleted file mode 100644 index bb7c7d370cf9..000000000000 --- a/app/src/main/res/drawable/ic_loupe_24dp_light.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/activity_bookmark_folders.xml b/app/src/main/res/layout/activity_bookmark_folders.xml index 3b98bf12209e..293a432b174a 100644 --- a/app/src/main/res/layout/activity_bookmark_folders.xml +++ b/app/src/main/res/layout/activity_bookmark_folders.xml @@ -16,11 +16,12 @@ ~ limitations under the License. --> - + android:paddingTop="@dimen/keyline_2" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> - + diff --git a/app/src/main/res/layout/dialog_fragment_saved_site.xml b/app/src/main/res/layout/dialog_fragment_saved_site.xml index 46061ce22a08..514f1c3c1ed1 100644 --- a/app/src/main/res/layout/dialog_fragment_saved_site.xml +++ b/app/src/main/res/layout/dialog_fragment_saved_site.xml @@ -17,87 +17,60 @@ + android:layout_height="match_parent"> + layout="@layout/include_default_toolbar" /> - + android:layout_height="wrap_content" + android:layout_margin="@dimen/keyline_4" + android:hint="@string/savedSiteDialogTitleHint" + android:inputType="text|textCapWords" + app:layout_constraintTop_toBottomOf="@id/savedSiteAppBar" /> - - - - - + android:layout_height="wrap_content" + android:layout_margin="@dimen/keyline_4" + android:hint="@string/savedSiteDialogUrlHint" + android:inputType="textUri" + app:layout_constraintTop_toBottomOf="@id/titleInput" /> - + - + - - - - - + app:constraint_referenced_ids="savedSiteLocationLabel,savedSiteLocation" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_bookmark_folder.xml b/app/src/main/res/layout/item_bookmark_folder.xml index 719f10352293..a240bdbceebc 100644 --- a/app/src/main/res/layout/item_bookmark_folder.xml +++ b/app/src/main/res/layout/item_bookmark_folder.xml @@ -16,47 +16,36 @@ + android:layout_height="wrap_content"> + + + android:src="@drawable/ic_check_24" + app:tint="@color/white" /> - - \ No newline at end of file diff --git a/app/src/main/res/layout/search_favorites_widget_search_bar_dark.xml b/app/src/main/res/layout/search_favorites_widget_search_bar_dark.xml index 331c324e07f6..35d1e7c3400e 100644 --- a/app/src/main/res/layout/search_favorites_widget_search_bar_dark.xml +++ b/app/src/main/res/layout/search_favorites_widget_search_bar_dark.xml @@ -15,6 +15,7 @@ --> @@ -41,5 +42,6 @@ + android:src="@drawable/ic_find_search_24" + app:tint="@color/white84" /> \ No newline at end of file diff --git a/app/src/main/res/layout/search_favorites_widget_search_bar_daynight.xml b/app/src/main/res/layout/search_favorites_widget_search_bar_daynight.xml index 60fa65585882..8ce4d33b6534 100644 --- a/app/src/main/res/layout/search_favorites_widget_search_bar_daynight.xml +++ b/app/src/main/res/layout/search_favorites_widget_search_bar_daynight.xml @@ -41,5 +41,5 @@ + android:src="@drawable/ic_find_search_24" /> \ No newline at end of file diff --git a/app/src/main/res/layout/search_favorites_widget_search_bar_light.xml b/app/src/main/res/layout/search_favorites_widget_search_bar_light.xml index 069d67865de7..4626ea0a4a1e 100644 --- a/app/src/main/res/layout/search_favorites_widget_search_bar_light.xml +++ b/app/src/main/res/layout/search_favorites_widget_search_bar_light.xml @@ -17,7 +17,8 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:src="@drawable/ic_find_search_24" + app:tint="?attr/daxColorBlack"/> \ No newline at end of file diff --git a/app/src/main/res/layout/search_widget.xml b/app/src/main/res/layout/search_widget.xml index 317e4862817e..28d74cbdb469 100644 --- a/app/src/main/res/layout/search_widget.xml +++ b/app/src/main/res/layout/search_widget.xml @@ -16,6 +16,7 @@ @@ -42,6 +43,7 @@ + android:src="@drawable/ic_find_search_24" + app:tint="@color/white84" /> \ No newline at end of file diff --git a/app/src/main/res/layout/search_widget_light.xml b/app/src/main/res/layout/search_widget_light.xml index cb2ac4fd1393..68f25746d46a 100644 --- a/app/src/main/res/layout/search_widget_light.xml +++ b/app/src/main/res/layout/search_widget_light.xml @@ -16,6 +16,7 @@ @@ -42,6 +43,7 @@ + android:src="@drawable/ic_find_search_24" + app:tint="@color/black84" /> \ No newline at end of file diff --git a/app/src/main/res/layout/view_bookmark_folder_entry.xml b/app/src/main/res/layout/view_bookmark_folder_entry.xml deleted file mode 100644 index 2c03524403fd..000000000000 --- a/app/src/main/res/layout/view_bookmark_folder_entry.xml +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/view_saved_site_empty_hint.xml b/app/src/main/res/layout/view_saved_site_empty_hint.xml index f71aad83fffc..629d1fb53ae0 100644 --- a/app/src/main/res/layout/view_saved_site_empty_hint.xml +++ b/app/src/main/res/layout/view_saved_site_empty_hint.xml @@ -1,5 +1,5 @@ - \ No newline at end of file + xmlns:tools="http://schemas.android.com/tools" + android:padding="@dimen/keyline_4"> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/view_saved_site_entry.xml b/app/src/main/res/layout/view_saved_site_entry.xml deleted file mode 100644 index bd3e84f74f4c..000000000000 --- a/app/src/main/res/layout/view_saved_site_entry.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/menu/bookmark_activity_menu.xml b/app/src/main/res/menu/bookmark_activity_menu.xml index 4b9d8cf35bdb..ec5837cfd62b 100644 --- a/app/src/main/res/menu/bookmark_activity_menu.xml +++ b/app/src/main/res/menu/bookmark_activity_menu.xml @@ -24,12 +24,12 @@ android:title="@string/exportBookmarksMenu" /> \ No newline at end of file diff --git a/app/src/main/res/menu/bookmark_folders_activity_menu.xml b/app/src/main/res/menu/bookmark_folders_activity_menu.xml index 6192dedf0e31..ee88ba66a9d3 100644 --- a/app/src/main/res/menu/bookmark_folders_activity_menu.xml +++ b/app/src/main/res/menu/bookmark_folders_activity_menu.xml @@ -18,7 +18,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> \ No newline at end of file diff --git a/app/src/main/res/menu/downloads_activity_menu.xml b/app/src/main/res/menu/downloads_activity_menu.xml index 632b33fad8be..62520ae504ec 100644 --- a/app/src/main/res/menu/downloads_activity_menu.xml +++ b/app/src/main/res/menu/downloads_activity_menu.xml @@ -19,7 +19,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/autofill/autofill-impl/src/main/res/menu/autofill_view_mode_menu.xml b/autofill/autofill-impl/src/main/res/menu/autofill_view_mode_menu.xml index 932f4673cc5e..59c0db5554be 100644 --- a/autofill/autofill-impl/src/main/res/menu/autofill_view_mode_menu.xml +++ b/autofill/autofill-impl/src/main/res/menu/autofill_view_mode_menu.xml @@ -29,7 +29,7 @@ \ No newline at end of file diff --git a/common-ui/src/main/res/drawable/ic_check_action.xml b/common-ui/src/main/res/drawable/ic_check_24.xml similarity index 65% rename from common-ui/src/main/res/drawable/ic_check_action.xml rename to common-ui/src/main/res/drawable/ic_check_24.xml index a709436ca75b..2253c98d65ac 100644 --- a/common-ui/src/main/res/drawable/ic_check_action.xml +++ b/common-ui/src/main/res/drawable/ic_check_24.xml @@ -1,4 +1,4 @@ - - - + + \ No newline at end of file diff --git a/common-ui/src/main/res/values/styles.xml b/common-ui/src/main/res/values/styles.xml index 109c60089973..f1de847c3af4 100644 --- a/common-ui/src/main/res/values/styles.xml +++ b/common-ui/src/main/res/values/styles.xml @@ -491,16 +491,6 @@ @color/cornflowerBlue - - - - + +