diff --git a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt index 64283cf12..98fee05bb 100644 --- a/app/src/main/java/org/mozilla/fenix/HomeActivity.kt +++ b/app/src/main/java/org/mozilla/fenix/HomeActivity.kt @@ -57,6 +57,8 @@ open class HomeActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + components.publicSuffixList.prefetch() browsingModeManager = createBrowsingModeManager() themeManager = createThemeManager( when (browsingModeManager.isPrivate) { diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index cf55836e4..28688c3a2 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -747,22 +747,20 @@ class BrowserFragment : Fragment(), BackHandler, CoroutineScope { private fun showSaveToCollection() { val context = context ?: return getSessionById()?.let { - launch(Dispatchers.Main) { - val tabs = Tab(it.id, it.url, it.url.urlToTrimmedHost(context), it.title) - val viewModel = activity?.run { - ViewModelProviders.of(this).get(CreateCollectionViewModel::class.java) - } - viewModel?.tabs = listOf(tabs) - val selectedSet = mutableSetOf(tabs) - viewModel?.selectedTabs = selectedSet - viewModel?.tabCollections = requireComponents.core.tabCollectionStorage.cachedTabCollections.reversed() - viewModel?.saveCollectionStep = - viewModel?.tabCollections?.getStepForCollectionsSize() ?: SaveCollectionStep.SelectCollection - viewModel?.snackbarAnchorView = nestedScrollQuickAction - view?.let { - val directions = BrowserFragmentDirections.actionBrowserFragmentToCreateCollectionFragment() - nav(R.id.browserFragment, directions) - } + val tabs = Tab(it.id, it.url, it.url.urlToTrimmedHost(context), it.title) + val viewModel = activity?.run { + ViewModelProviders.of(this).get(CreateCollectionViewModel::class.java) + } + viewModel?.tabs = listOf(tabs) + val selectedSet = mutableSetOf(tabs) + viewModel?.selectedTabs = selectedSet + viewModel?.tabCollections = requireComponents.core.tabCollectionStorage.cachedTabCollections.reversed() + viewModel?.saveCollectionStep = + viewModel?.tabCollections?.getStepForCollectionsSize() ?: SaveCollectionStep.SelectCollection + viewModel?.snackbarAnchorView = nestedScrollQuickAction + view?.let { + val directions = BrowserFragmentDirections.actionBrowserFragmentToCreateCollectionFragment() + nav(R.id.browserFragment, directions) } } } diff --git a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationUIView.kt b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationUIView.kt index f3656b04d..9af63d701 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationUIView.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/CollectionCreationUIView.kt @@ -25,7 +25,6 @@ import kotlinx.android.synthetic.main.component_collection_creation.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.launch import mozilla.components.support.ktx.android.view.hideKeyboard import mozilla.components.support.ktx.android.view.showKeyboard import org.mozilla.fenix.R @@ -268,18 +267,16 @@ class CollectionCreationUIView( is SaveCollectionStep.RenameCollection -> { view.tab_list.isClickable = false - launch(Dispatchers.Main) { - it.selectedTabCollection?.let { tabCollection -> - tabCollection.tabs.map { tab -> - Tab( - tab.id.toString(), - tab.url, - tab.url.urlToTrimmedHost(view.context), - tab.title - ) - }.let { tabs -> - collectionCreationTabListAdapter.updateData(tabs, tabs.toSet(), true) - } + it.selectedTabCollection?.let { tabCollection -> + tabCollection.tabs.map { tab -> + Tab( + tab.id.toString(), + tab.url, + tab.url.urlToTrimmedHost(view.context), + tab.title + ) + }.let { tabs -> + collectionCreationTabListAdapter.updateData(tabs, tabs.toSet(), true) } } diff --git a/app/src/main/java/org/mozilla/fenix/collections/SaveCollectionListAdapter.kt b/app/src/main/java/org/mozilla/fenix/collections/SaveCollectionListAdapter.kt index cab965612..8c4f0b3ee 100644 --- a/app/src/main/java/org/mozilla/fenix/collections/SaveCollectionListAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/collections/SaveCollectionListAdapter.kt @@ -16,7 +16,6 @@ import kotlinx.android.synthetic.main.collections_list_item.view.collection_icon import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.launch import org.mozilla.fenix.R import org.mozilla.fenix.components.description import org.mozilla.fenix.home.sessioncontrol.Tab @@ -82,18 +81,16 @@ class CollectionViewHolder( fun bind(collection: TabCollection) { this.collection = collection - launch(Dispatchers.Main) { - view.collection_item.text = collection.title - view.collection_description.text = collection.description(view.context) + view.collection_item.text = collection.title + view.collection_description.text = collection.description(view.context) - view.collection_icon.setColorFilter( - ContextCompat.getColor( - view.context, - getIconColor(collection.id) - ), - android.graphics.PorterDuff.Mode.SRC_IN - ) - } + view.collection_icon.setColorFilter( + ContextCompat.getColor( + view.context, + getIconColor(collection.id) + ), + android.graphics.PorterDuff.Mode.SRC_IN + ) } @Suppress("ComplexMethod", "MagicNumber") diff --git a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt index 2a4b72c2e..10019a6b1 100644 --- a/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt +++ b/app/src/main/java/org/mozilla/fenix/components/TabCollectionStorage.kt @@ -91,7 +91,7 @@ class TabCollectionStorage( } } -suspend fun TabCollection.description(context: Context): String { +fun TabCollection.description(context: Context): String { return this.tabs .map { it.url.urlToTrimmedHost(context).capitalize() } .map { diff --git a/app/src/main/java/org/mozilla/fenix/ext/String.kt b/app/src/main/java/org/mozilla/fenix/ext/String.kt index 7dbaabbb9..b63cf0a04 100644 --- a/app/src/main/java/org/mozilla/fenix/ext/String.kt +++ b/app/src/main/java/org/mozilla/fenix/ext/String.kt @@ -8,6 +8,7 @@ package org.mozilla.fenix.ext import android.content.Context import androidx.core.net.toUri +import kotlinx.coroutines.runBlocking import java.net.MalformedURLException import java.net.URL import mozilla.components.support.ktx.android.net.hostWithoutCommonPrefixes @@ -34,10 +35,12 @@ fun String?.getHostFromUrl(): String? = try { /** * Trim a host's prefix and suffix */ -suspend fun String.urlToTrimmedHost(context: Context): String { +fun String.urlToTrimmedHost(context: Context): String { return try { val host = toUri().hostWithoutCommonPrefixes ?: return this - context.components.publicSuffixList.stripPublicSuffix(host).await() + runBlocking { + context.components.publicSuffixList.stripPublicSuffix(host).await() + } } catch (e: MalformedURLException) { this } diff --git a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt index f1776d33a..4380a71da 100644 --- a/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt @@ -283,15 +283,13 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver { } } - launch(Dispatchers.Main) { - getManagedEmitter().onNext( - SessionControlChange.Change( - tabs = getListOfTabs(sessionManager = requireComponents.core.sessionManager), - mode = currentMode(), - collections = requireComponents.core.tabCollectionStorage.cachedTabCollections - ) + getManagedEmitter().onNext( + SessionControlChange.Change( + tabs = getListOfTabs(sessionManager = requireComponents.core.sessionManager), + mode = currentMode(), + collections = requireComponents.core.tabCollectionStorage.cachedTabCollections ) - } + ) requireComponents.core.tabCollectionStorage.register(collectionStorageObserver, this) sessionObserver.onStart() @@ -566,63 +564,59 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver { } private fun removeTabWithUndo(sessionId: String) { - launch(Dispatchers.Main) { - val sessionManager = requireComponents.core.sessionManager + val sessionManager = requireComponents.core.sessionManager - // Update the UI with the tab removed, but don't remove it from storage yet - getManagedEmitter().onNext( + // Update the UI with the tab removed, but don't remove it from storage yet + getManagedEmitter().onNext( - SessionControlChange.TabsChange( - sessionManager.sessions - .filter { (activity as HomeActivity).browsingModeManager.isPrivate == it.private } - .filter { it.id != sessionId } - .map { - val selected = it == sessionManager.selectedSession - Tab( - it.id, - it.url, - it.url.urlToTrimmedHost(context!!), - it.title, - selected, - it.thumbnail - ) - } - ) - ) - - val deleteOperation: (suspend () -> Unit) = { - sessionManager.findSessionById(sessionId) - ?.let { session -> - sessionManager.remove(session) + SessionControlChange.TabsChange( + sessionManager.sessions + .filter { (activity as HomeActivity).browsingModeManager.isPrivate == it.private } + .filter { it.id != sessionId } + .map { + val selected = it == sessionManager.selectedSession + Tab( + it.id, + it.url, + it.url.urlToTrimmedHost(context!!), + it.title, + selected, + it.thumbnail + ) } - } - - deleteSessionJob = deleteOperation - - allowUndo( - view!!, getString(R.string.snackbar_tab_deleted), - getString(R.string.snackbar_deleted_undo), { - deleteSessionJob = null - emitSessionChanges() - }, - operation = deleteOperation ) + ) + + val deleteOperation: (suspend () -> Unit) = { + sessionManager.findSessionById(sessionId) + ?.let { session -> + sessionManager.remove(session) + } } + + deleteSessionJob = deleteOperation + + allowUndo( + view!!, getString(R.string.snackbar_tab_deleted), + getString(R.string.snackbar_deleted_undo), { + deleteSessionJob = null + emitSessionChanges() + }, + operation = deleteOperation + ) } private fun emitSessionChanges() { val sessionManager = context?.components?.core?.sessionManager ?: return - launch(Dispatchers.Main) { - getManagedEmitter().onNext( - SessionControlChange.TabsChange( - getListOfTabs(sessionManager) - ) + getManagedEmitter().onNext( + SessionControlChange.TabsChange( + getListOfTabs(sessionManager) ) - } + ) } - private suspend fun getListOfTabs(sessionManager: SessionManager): List { + private fun getListOfTabs(sessionManager: SessionManager): List { val context = context ?: return listOf() return sessionManager.sessions .filter { (activity as HomeActivity).browsingModeManager.isPrivate == it.private } @@ -653,27 +647,25 @@ class HomeFragment : Fragment(), CoroutineScope, AccountObserver { val context = context?.let { it } ?: return - launch(Dispatchers.Main) { - val tabs = requireComponents.core.sessionManager.sessions.filter { !it.private } - .map { Tab(it.id, it.url, it.url.urlToTrimmedHost(context), it.title) } + val tabs = requireComponents.core.sessionManager.sessions.filter { !it.private } + .map { Tab(it.id, it.url, it.url.urlToTrimmedHost(context), it.title) } - val viewModel = activity?.run { - ViewModelProviders.of(this).get(CreateCollectionViewModel::class.java) - } - viewModel?.tabs = tabs - val selectedTabs = - tabs.find { tab -> tab.sessionId == selectedTabId } ?: if (tabs.size == 1) tabs[0] else null - val selectedSet = if (selectedTabs == null) mutableSetOf() else mutableSetOf(selectedTabs) - viewModel?.selectedTabs = selectedSet - viewModel?.tabCollections = requireComponents.core.tabCollectionStorage.cachedTabCollections.reversed() - viewModel?.selectedTabCollection = selectedTabCollection - viewModel?.saveCollectionStep = - step ?: viewModel?.getStepForTabsAndCollectionSize() ?: SaveCollectionStep.SelectTabs + val viewModel = activity?.run { + ViewModelProviders.of(this).get(CreateCollectionViewModel::class.java) + } + viewModel?.tabs = tabs + val selectedTabs = + tabs.find { tab -> tab.sessionId == selectedTabId } ?: if (tabs.size == 1) tabs[0] else null + val selectedSet = if (selectedTabs == null) mutableSetOf() else mutableSetOf(selectedTabs) + viewModel?.selectedTabs = selectedSet + viewModel?.tabCollections = requireComponents.core.tabCollectionStorage.cachedTabCollections.reversed() + viewModel?.selectedTabCollection = selectedTabCollection + viewModel?.saveCollectionStep = + step ?: viewModel?.getStepForTabsAndCollectionSize() ?: SaveCollectionStep.SelectTabs - view?.let { - val directions = HomeFragmentDirections.actionHomeFragmentToCreateCollectionFragment() - nav(R.id.homeFragment, directions) - } + view?.let { + val directions = HomeFragmentDirections.actionHomeFragmentToCreateCollectionFragment() + nav(R.id.homeFragment, directions) } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt index 4c3153ff6..c2f147c00 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/CollectionViewHolder.kt @@ -16,7 +16,6 @@ import kotlinx.android.synthetic.main.collection_home_list_row.view.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.launch import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.SimpleBrowserMenuItem import org.mozilla.fenix.R @@ -82,33 +81,31 @@ class CollectionViewHolder( } private fun updateCollectionUI() { - launch(Dispatchers.Main) { - view.collection_title.text = collection.title - view.collection_description.text = collection.description(view.context) + view.collection_title.text = collection.title + view.collection_description.text = collection.description(view.context) - if (expanded) { - (view.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = 0 - collection_title.setPadding(0, 0, 0, EXPANDED_PADDING) - view.background = ContextCompat.getDrawable(view.context, R.drawable.rounded_top_corners) - view.collection_description.visibility = View.GONE + if (expanded) { + (view.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = 0 + collection_title.setPadding(0, 0, 0, EXPANDED_PADDING) + view.background = ContextCompat.getDrawable(view.context, R.drawable.rounded_top_corners) + view.collection_description.visibility = View.GONE - view.chevron.setBackgroundResource(R.drawable.ic_chevron_up) - } else { - (view.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = COLLAPSED_MARGIN - view.background = ContextCompat.getDrawable(view.context, R.drawable.rounded_all_corners) - view.collection_description.visibility = View.VISIBLE + view.chevron.setBackgroundResource(R.drawable.ic_chevron_up) + } else { + (view.layoutParams as ViewGroup.MarginLayoutParams).bottomMargin = COLLAPSED_MARGIN + view.background = ContextCompat.getDrawable(view.context, R.drawable.rounded_all_corners) + view.collection_description.visibility = View.VISIBLE - view.chevron.setBackgroundResource(R.drawable.ic_chevron_down) - } - - view.collection_icon.setColorFilter( - ContextCompat.getColor( - view.context, - getIconColor(collection.id) - ), - android.graphics.PorterDuff.Mode.SRC_IN - ) + view.chevron.setBackgroundResource(R.drawable.ic_chevron_down) } + + view.collection_icon.setColorFilter( + ContextCompat.getColor( + view.context, + getIconColor(collection.id) + ), + android.graphics.PorterDuff.Mode.SRC_IN + ) } private fun handleExpansion(isExpanded: Boolean) { diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt index 0a955432e..97e672ba6 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TabInCollectionViewHolder.kt @@ -79,9 +79,8 @@ class TabInCollectionViewHolder( } private fun updateTabUI() { - launch(Dispatchers.Main) { - collection_tab_hostname.text = tab.url.urlToTrimmedHost(view.context) - } + collection_tab_hostname.text = tab.url.urlToTrimmedHost(view.context) + collection_tab_title.text = tab.title launch(Dispatchers.IO) { val bitmap = collection_tab_icon.context.components.core.icons diff --git a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt index 150eab209..f89204626 100644 --- a/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/library/bookmarks/BookmarkFragment.kt @@ -25,7 +25,6 @@ import androidx.navigation.NavController import androidx.navigation.Navigation import kotlinx.android.synthetic.main.fragment_bookmark.view.* import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Job @@ -268,17 +267,15 @@ class BookmarkFragment : Fragment(), CoroutineScope, BackHandler, AccountObserve getManagedEmitter() .onNext(BookmarkChange.Change(currentRoot - it.item.guid)) - launch(Dispatchers.Main) { - allowUndo( - view!!, - getString(R.string.bookmark_deletion_snackbar_message, - it.item.url?.urlToTrimmedHost(context)), - getString(R.string.bookmark_undo_deletion), { refreshBookmarks() } - ) { - bookmarkStorage()?.deleteNode(it.item.guid) - metrics()?.track(Event.RemoveBookmark) - refreshBookmarks() - } + allowUndo( + view!!, + getString(R.string.bookmark_deletion_snackbar_message, + it.item.url?.urlToTrimmedHost(context)), + getString(R.string.bookmark_undo_deletion), { refreshBookmarks() } + ) { + bookmarkStorage()?.deleteNode(it.item.guid) + metrics()?.track(Event.RemoveBookmark) + refreshBookmarks() } } }