Install the "icons" WebExtension to automatically load icons for every visited website.
parent
c334c77bbe
commit
291df48c4e
|
@ -140,7 +140,7 @@ class TabViewHolder(
|
||||||
checkbox.setOnCheckedChangeListener(checkboxListener)
|
checkbox.setOnCheckedChangeListener(checkboxListener)
|
||||||
|
|
||||||
launch(Dispatchers.IO) {
|
launch(Dispatchers.IO) {
|
||||||
val bitmap = view.favicon_image.context.components.utils.icons
|
val bitmap = view.favicon_image.context.components.core.icons
|
||||||
.loadIcon(IconRequest(tab.url)).await().bitmap
|
.loadIcon(IconRequest(tab.url)).await().bitmap
|
||||||
launch(Dispatchers.Main) {
|
launch(Dispatchers.Main) {
|
||||||
view.favicon_image.setImageBitmap(bitmap)
|
view.favicon_image.setImageBitmap(bitmap)
|
||||||
|
|
|
@ -9,10 +9,11 @@ import android.content.res.Configuration
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
import kotlinx.coroutines.async
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
import mozilla.components.browser.engine.gecko.GeckoEngine
|
import mozilla.components.browser.engine.gecko.GeckoEngine
|
||||||
import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient
|
import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient
|
||||||
|
import mozilla.components.browser.icons.BrowserIcons
|
||||||
import mozilla.components.browser.session.SessionManager
|
import mozilla.components.browser.session.SessionManager
|
||||||
import mozilla.components.browser.session.storage.SessionStorage
|
import mozilla.components.browser.session.storage.SessionStorage
|
||||||
import mozilla.components.browser.storage.sync.PlacesBookmarksStorage
|
import mozilla.components.browser.storage.sync.PlacesBookmarksStorage
|
||||||
|
@ -25,6 +26,7 @@ import mozilla.components.concept.fetch.Client
|
||||||
import mozilla.components.feature.session.HistoryDelegate
|
import mozilla.components.feature.session.HistoryDelegate
|
||||||
import mozilla.components.lib.crash.handler.CrashHandlerService
|
import mozilla.components.lib.crash.handler.CrashHandlerService
|
||||||
import org.mozilla.fenix.AppRequestInterceptor
|
import org.mozilla.fenix.AppRequestInterceptor
|
||||||
|
import org.mozilla.fenix.ext.components
|
||||||
import org.mozilla.fenix.test.Mockable
|
import org.mozilla.fenix.test.Mockable
|
||||||
import org.mozilla.fenix.utils.Settings
|
import org.mozilla.fenix.utils.Settings
|
||||||
import org.mozilla.geckoview.GeckoRuntime
|
import org.mozilla.geckoview.GeckoRuntime
|
||||||
|
@ -97,37 +99,34 @@ class Core(private val context: Context) {
|
||||||
*/
|
*/
|
||||||
val sessionManager by lazy {
|
val sessionManager by lazy {
|
||||||
SessionManager(engine).also { sessionManager ->
|
SessionManager(engine).also { sessionManager ->
|
||||||
// Restore a previous, still active bundle.
|
// Install the "icons" WebExtension to automatically load icons for every visited website.
|
||||||
GlobalScope.launch(Dispatchers.Main) {
|
icons.install(engine, sessionManager)
|
||||||
val snapshot = async(Dispatchers.IO) {
|
|
||||||
sessionStorage.restore()
|
|
||||||
}
|
|
||||||
|
|
||||||
// There's an active bundle with a snapshot: Feed it into the SessionManager.
|
// Restore the previous state.
|
||||||
snapshot.await()?.let {
|
GlobalScope.launch(Dispatchers.Main) {
|
||||||
try {
|
withContext(Dispatchers.IO) {
|
||||||
val selected = sessionManager.selectedSession
|
sessionStorage.restore()
|
||||||
sessionManager.restore(it)
|
}?.let { snapshot ->
|
||||||
selected?.let {
|
sessionManager.restore(snapshot, updateSelection = (sessionManager.selectedSession == null))
|
||||||
sessionManager.select(selected)
|
|
||||||
}
|
|
||||||
} catch (_: IllegalArgumentException) {
|
|
||||||
return@let
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now that we have restored our previous state (if there's one) let's setup auto saving the state while
|
// Now that we have restored our previous state (if there's one) let's setup auto saving the state while
|
||||||
// the app is used.
|
// the app is used.
|
||||||
sessionStorage.apply {
|
sessionStorage.autoSave(sessionManager)
|
||||||
autoSave(sessionManager)
|
.periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS)
|
||||||
.periodicallyInForeground(interval = 30, unit = TimeUnit.SECONDS)
|
.whenGoingToBackground()
|
||||||
.whenGoingToBackground()
|
.whenSessionsChange()
|
||||||
.whenSessionsChange()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Icons component for loading, caching and processing website icons.
|
||||||
|
*/
|
||||||
|
val icons by lazy {
|
||||||
|
BrowserIcons(context, context.components.core.client)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The storage component to persist browsing history (with the exception of
|
* The storage component to persist browsing history (with the exception of
|
||||||
* private sessions).
|
* private sessions).
|
||||||
|
|
|
@ -5,12 +5,10 @@
|
||||||
package org.mozilla.fenix.components
|
package org.mozilla.fenix.components
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import mozilla.components.browser.icons.BrowserIcons
|
|
||||||
import mozilla.components.browser.session.SessionManager
|
import mozilla.components.browser.session.SessionManager
|
||||||
import mozilla.components.feature.intent.IntentProcessor
|
import mozilla.components.feature.intent.IntentProcessor
|
||||||
import mozilla.components.feature.search.SearchUseCases
|
import mozilla.components.feature.search.SearchUseCases
|
||||||
import mozilla.components.feature.session.SessionUseCases
|
import mozilla.components.feature.session.SessionUseCases
|
||||||
import org.mozilla.fenix.ext.components
|
|
||||||
import org.mozilla.fenix.test.Mockable
|
import org.mozilla.fenix.test.Mockable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -34,8 +32,4 @@ class Utilities(
|
||||||
val privateIntentProcessor by lazy {
|
val privateIntentProcessor by lazy {
|
||||||
IntentProcessor(sessionUseCases, sessionManager, searchUseCases, context, isPrivate = true)
|
IntentProcessor(sessionUseCases, sessionManager, searchUseCases, context, isPrivate = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
val icons by lazy {
|
|
||||||
BrowserIcons(context, context.components.core.client)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ class ExceptionsListItemViewHolder(
|
||||||
|
|
||||||
private fun updateFavIcon(url: String) {
|
private fun updateFavIcon(url: String) {
|
||||||
launch(Dispatchers.IO) {
|
launch(Dispatchers.IO) {
|
||||||
val bitmap = favicon.context.components.utils.icons
|
val bitmap = favicon.context.components.core.icons
|
||||||
.loadIcon(IconRequest(url)).await().bitmap
|
.loadIcon(IconRequest(url)).await().bitmap
|
||||||
launch(Dispatchers.Main) {
|
launch(Dispatchers.Main) {
|
||||||
favicon.setImageBitmap(bitmap)
|
favicon.setImageBitmap(bitmap)
|
||||||
|
|
|
@ -78,7 +78,7 @@ class TabInCollectionViewHolder(
|
||||||
collection_tab_hostname.text = tab.url.urlToTrimmedHost()
|
collection_tab_hostname.text = tab.url.urlToTrimmedHost()
|
||||||
collection_tab_title.text = tab.title
|
collection_tab_title.text = tab.title
|
||||||
launch(Dispatchers.IO) {
|
launch(Dispatchers.IO) {
|
||||||
val bitmap = collection_tab_icon.context.components.utils.icons
|
val bitmap = collection_tab_icon.context.components.core.icons
|
||||||
.loadIcon(IconRequest(tab.url)).await().bitmap
|
.loadIcon(IconRequest(tab.url)).await().bitmap
|
||||||
launch(Dispatchers.Main) {
|
launch(Dispatchers.Main) {
|
||||||
collection_tab_icon.setImageBitmap(bitmap)
|
collection_tab_icon.setImageBitmap(bitmap)
|
||||||
|
|
|
@ -92,7 +92,7 @@ class TabViewHolder(
|
||||||
hostname.text = tab.hostname
|
hostname.text = tab.hostname
|
||||||
tab_title.text = tab.title
|
tab_title.text = tab.title
|
||||||
launch(Dispatchers.IO) {
|
launch(Dispatchers.IO) {
|
||||||
val bitmap = favicon_image.context.components.utils.icons
|
val bitmap = favicon_image.context.components.core.icons
|
||||||
.loadIcon(IconRequest(tab.url)).await().bitmap
|
.loadIcon(IconRequest(tab.url)).await().bitmap
|
||||||
launch(Dispatchers.Main) {
|
launch(Dispatchers.Main) {
|
||||||
favicon_image.setImageBitmap(bitmap)
|
favicon_image.setImageBitmap(bitmap)
|
||||||
|
|
|
@ -17,7 +17,6 @@ import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import mozilla.appservices.places.BookmarkRoot
|
import mozilla.appservices.places.BookmarkRoot
|
||||||
import mozilla.components.browser.icons.BrowserIcons
|
|
||||||
import mozilla.components.browser.icons.IconRequest
|
import mozilla.components.browser.icons.IconRequest
|
||||||
import mozilla.components.browser.menu.BrowserMenu
|
import mozilla.components.browser.menu.BrowserMenu
|
||||||
import mozilla.components.concept.storage.BookmarkNode
|
import mozilla.components.concept.storage.BookmarkNode
|
||||||
|
@ -196,7 +195,7 @@ class BookmarkAdapter(val emptyView: View, val actionEmitter: Observer<BookmarkA
|
||||||
|
|
||||||
if (!selected && item.url?.startsWith("http") == true) {
|
if (!selected && item.url?.startsWith("http") == true) {
|
||||||
launch(Dispatchers.IO) {
|
launch(Dispatchers.IO) {
|
||||||
val bitmap = BrowserIcons(bookmark_favicon.context, bookmark_layout.context.components.core.client)
|
val bitmap = bookmark_layout.context.components.core.icons
|
||||||
.loadIcon(IconRequest(item.url!!)).await().bitmap
|
.loadIcon(IconRequest(item.url!!)).await().bitmap
|
||||||
launch(Dispatchers.Main) {
|
launch(Dispatchers.Main) {
|
||||||
bookmark_favicon.setImageBitmap(bitmap)
|
bookmark_favicon.setImageBitmap(bitmap)
|
||||||
|
|
|
@ -125,7 +125,7 @@ class HistoryListItemViewHolder(
|
||||||
|
|
||||||
private fun updateFavIcon(url: String) {
|
private fun updateFavIcon(url: String) {
|
||||||
launch(Dispatchers.IO) {
|
launch(Dispatchers.IO) {
|
||||||
val bitmap = favicon.context.components.utils.icons
|
val bitmap = favicon.context.components.core.icons
|
||||||
.loadIcon(IconRequest(url)).await().bitmap
|
.loadIcon(IconRequest(url)).await().bitmap
|
||||||
launch(Dispatchers.Main) {
|
launch(Dispatchers.Main) {
|
||||||
favicon.setImageBitmap(bitmap)
|
favicon.setImageBitmap(bitmap)
|
||||||
|
|
|
@ -109,21 +109,21 @@ class AwesomeBarUIView(
|
||||||
SessionSuggestionProvider(
|
SessionSuggestionProvider(
|
||||||
components.core.sessionManager,
|
components.core.sessionManager,
|
||||||
components.useCases.tabsUseCases.selectTab,
|
components.useCases.tabsUseCases.selectTab,
|
||||||
components.utils.icons
|
components.core.icons
|
||||||
)
|
)
|
||||||
|
|
||||||
historyStorageProvider =
|
historyStorageProvider =
|
||||||
HistoryStorageSuggestionProvider(
|
HistoryStorageSuggestionProvider(
|
||||||
components.core.historyStorage,
|
components.core.historyStorage,
|
||||||
loadUrlUseCase,
|
loadUrlUseCase,
|
||||||
components.utils.icons
|
components.core.icons
|
||||||
)
|
)
|
||||||
|
|
||||||
bookmarksStorageSuggestionProvider =
|
bookmarksStorageSuggestionProvider =
|
||||||
BookmarksStorageSuggestionProvider(
|
BookmarksStorageSuggestionProvider(
|
||||||
components.core.bookmarksStorage,
|
components.core.bookmarksStorage,
|
||||||
loadUrlUseCase,
|
loadUrlUseCase,
|
||||||
components.utils.icons
|
components.core.icons
|
||||||
)
|
)
|
||||||
|
|
||||||
if (Settings.getInstance(container.context).showSearchSuggestions()) {
|
if (Settings.getInstance(container.context).showSearchSuggestions()) {
|
||||||
|
|
|
@ -28,7 +28,6 @@ import kotlinx.coroutines.Dispatchers.IO
|
||||||
import kotlinx.coroutines.Dispatchers.Main
|
import kotlinx.coroutines.Dispatchers.Main
|
||||||
import kotlinx.coroutines.Job
|
import kotlinx.coroutines.Job
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import mozilla.components.browser.icons.BrowserIcons
|
|
||||||
import mozilla.components.browser.icons.IconRequest
|
import mozilla.components.browser.icons.IconRequest
|
||||||
import mozilla.components.feature.sitepermissions.SitePermissions
|
import mozilla.components.feature.sitepermissions.SitePermissions
|
||||||
import org.jetbrains.anko.alert
|
import org.jetbrains.anko.alert
|
||||||
|
@ -168,10 +167,9 @@ class ExceptionsAdapter(private val clickListener: View.OnClickListener) :
|
||||||
override fun onBindViewHolder(holder: SitePermissionsViewHolder, position: Int) {
|
override fun onBindViewHolder(holder: SitePermissionsViewHolder, position: Int) {
|
||||||
val sitePermissions = requireNotNull(getItem(position))
|
val sitePermissions = requireNotNull(getItem(position))
|
||||||
val context = holder.textView.context
|
val context = holder.textView.context
|
||||||
val client = context.components.core.client
|
|
||||||
|
|
||||||
launch(IO) {
|
launch(IO) {
|
||||||
val bitmap = BrowserIcons(context, client)
|
val bitmap = context.components.core.icons
|
||||||
.loadIcon(IconRequest(sitePermissions.origin)).await().bitmap
|
.loadIcon(IconRequest(sitePermissions.origin)).await().bitmap
|
||||||
launch(Main) {
|
launch(Main) {
|
||||||
val drawable = BitmapDrawable(context.resources, bitmap)
|
val drawable = BitmapDrawable(context.resources, bitmap)
|
||||||
|
|
Loading…
Reference in New Issue