Skip to content

Commit

Permalink
ADS: Bookmarks migration (#2629)
Browse files Browse the repository at this point in the history
  • Loading branch information
nalcalag authored and malmstein committed Jan 12, 2023
1 parent 0a7bc5f commit 2312070
Show file tree
Hide file tree
Showing 40 changed files with 264 additions and 552 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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)
}
}
}
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {

Expand Down Expand Up @@ -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 -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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() {

Expand All @@ -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
}
}

Expand All @@ -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(
Expand All @@ -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()
Expand Down Expand Up @@ -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)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -33,12 +32,10 @@ class BookmarkFolderStructureAdapter(
) : ListAdapter<BookmarkFolderItem, FolderViewHolder>(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
Expand All @@ -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(
Expand All @@ -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)
Expand All @@ -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)
}
}

Expand Down

0 comments on commit 2312070

Please sign in to comment.