1
0
Fork 0

Install the "icons" WebExtension to automatically load icons for every visited website.

master
Sebastian Kaspari 2019-05-15 10:59:07 -04:00 committed by Jeff Boek
parent c334c77bbe
commit 291df48c4e
10 changed files with 32 additions and 42 deletions

View File

@ -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)

View File

@ -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).

View File

@ -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)
}
} }

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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()) {

View File

@ -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)