diff --git a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/Icons.kt b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/Icons.kt index b897802b28..71683305a9 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/Icons.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/Icons.kt @@ -67,7 +67,7 @@ fun TreeWidgetObjectIcon( } is ObjectIcon.Basic.Emoji -> { UriImage( - uri = Emojifier.uri(icon.unicode), + uri = Emojifier.safeUri(icon.unicode), modifier = Modifier.padding(start = paddingStart, end = paddingEnd) ) } diff --git a/library-emojifier/build.gradle b/library-emojifier/build.gradle index 804b7a832f..507962558c 100644 --- a/library-emojifier/build.gradle +++ b/library-emojifier/build.gradle @@ -9,6 +9,7 @@ dependencies { implementation project(':core-utils') implementation libs.gson implementation libs.coroutinesAndroid + implementation libs.timber testImplementation libs.junit testImplementation libs.kotlinTest diff --git a/library-emojifier/src/main/java/com/anytypeio/anytype/emojifier/Emojifier.kt b/library-emojifier/src/main/java/com/anytypeio/anytype/emojifier/Emojifier.kt index 2971da0ee2..76a3f9cdb9 100644 --- a/library-emojifier/src/main/java/com/anytypeio/anytype/emojifier/Emojifier.kt +++ b/library-emojifier/src/main/java/com/anytypeio/anytype/emojifier/Emojifier.kt @@ -1,6 +1,7 @@ package com.anytypeio.anytype.emojifier import com.anytypeio.anytype.emojifier.data.Emoji +import timber.log.Timber object Emojifier { @@ -37,6 +38,28 @@ object Emojifier { return uri(page, index) } + fun safeUri(unicode: String): String { + try { + var result = search(unicode) + if (result == null) { + if (unicode.last() == SEPARATOR) { + val sb = StringBuilder() + unicode.forEachIndexed { index, char -> + if (index < unicode.length.dec()) sb.append(char) + } + result = search(sb.toString()) + } + } + checkNotNull(result) { "Could not find emoji for: $unicode" } + val (page, index) = result + return uri(page, index) + } catch (e: Exception) { + return Config.EMPTY_URI.also { + Timber.e(e, "Error while searching for uri") + } + } + } + /** * @param page emoji's page (emoji category) * @param index emoji's index on the [page] @@ -71,6 +94,7 @@ object Emojifier { object Config { const val EMOJI_FILE = "emoji.json" + const val EMPTY_URI = "" } } \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/MDNSDelegate.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/MDNSDelegate.kt index 8b49f2e2f7..f9b77439bf 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/MDNSDelegate.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/MDNSDelegate.kt @@ -5,6 +5,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import service.AndroidDiscoveryProxy import service.DiscoveryObserver +import timber.log.Timber class MDNSDelegate( private val scope: CoroutineScope, @@ -18,18 +19,26 @@ class MDNSDelegate( private var observer: DiscoveryObserver? = null fun start() { - isStarted = true - scope.launch(dispatcher) { - observer?.let { observer -> - resolver.start(observer) + try { + isStarted = true + scope.launch(dispatcher) { + observer?.let { observer -> + resolver.start(observer) + } } + } catch (e: Exception) { + Timber.e(e, "Error while starting MDNS delegate") } } fun stop() { - isStarted = false - scope.launch(dispatcher) { - resolver.stop() + try { + isStarted = false + scope.launch(dispatcher) { + resolver.stop() + } + } catch (e: Exception) { + Timber.e(e, "Error while stopping MDNS delegate") } } diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/NsdDiscoveryListener.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/NsdDiscoveryListener.kt index b3ec01af0f..2018c8ae66 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/NsdDiscoveryListener.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/discovery/NsdDiscoveryListener.kt @@ -21,11 +21,19 @@ class NsdDiscoveryListener( private val resolveSemaphore = Semaphore(1) fun registerObserver(observer: DiscoveryObserver) { - this.observer = observer + try { + this.observer = observer + } catch (e: Exception) { + Timber.e("Error while registering observer") + } } fun unregisterObserver() { - this.observer = null + try { + this.observer = null + } catch (e: Exception) { + Timber.e("Error while unregistering observer") + } } override fun onDiscoveryStarted(regType: String) { @@ -34,9 +42,7 @@ class NsdDiscoveryListener( override fun onServiceFound(service: NsdServiceInfo) { scope.launch(dispatcher) { - val observer = observer ?: return@launch - resolveSemaphore.acquire() nsdManager.resolveService(service, ResolveListener(observer, resolveSemaphore)) } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt index bedb8c419e..7eeaaaf533 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt @@ -347,7 +347,7 @@ class CollectionViewModel( ObjectType.Layout.BOOKMARK -> { commands.emit(Command.LaunchDocument(id = target)) } - ObjectType.Layout.SET -> { + ObjectType.Layout.SET, ObjectType.Layout.COLLECTION -> { commands.emit(Command.LaunchObjectSet(target = target)) } else -> {