From d80f57e9b641f094fad05a4150548424a6468142 Mon Sep 17 00:00:00 2001 From: Konstantin Ivanov <54908981+konstantiniiv@users.noreply.github.com> Date: Fri, 29 Nov 2024 16:55:06 +0100 Subject: [PATCH] DROID-3110 Release 7.1 | Sentry issues (#1850) --- .../anytype/other/MediaPermissionHelper.kt | 58 ++++++++++++++----- .../anytype/ui/editor/DragAndDropDelegate.kt | 20 ++++--- .../layout/fragment_object_type_change.xml | 1 + .../interactor/MiddlewareProtobufLogger.kt | 2 +- .../editor/editor/ext/BlockViewExt.kt | 2 +- .../editor/editor/styling/StyleToolbarExt.kt | 4 +- .../objects/ObjectWrapperExtensions.kt | 8 ++- .../presentation/sets/ObjectSetExtension.kt | 10 ++-- .../presentation/sets/SetsExtension.kt | 12 ++-- 9 files changed, 78 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/anytypeio/anytype/other/MediaPermissionHelper.kt b/app/src/main/java/com/anytypeio/anytype/other/MediaPermissionHelper.kt index 98838b9558..8119086069 100644 --- a/app/src/main/java/com/anytypeio/anytype/other/MediaPermissionHelper.kt +++ b/app/src/main/java/com/anytypeio/anytype/other/MediaPermissionHelper.kt @@ -8,6 +8,7 @@ import com.anytypeio.anytype.core_utils.ext.FilePickerUtils.hasPermission import com.anytypeio.anytype.core_utils.ext.Mimetype import com.anytypeio.anytype.core_utils.ext.msg import com.anytypeio.anytype.core_utils.ext.toast +import timber.log.Timber class MediaPermissionHelper( private val fragment: Fragment, @@ -16,36 +17,67 @@ class MediaPermissionHelper( ) { private var mimeType: Mimetype? = null private var requestCode: Int? = null + private var isRequestInProgress: Boolean = false private val permissionReadStorage: ActivityResultLauncher> = fragment.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { grantResults -> - grantResults.entries.forEach { - val isGranted = it.value - if (isGranted) { - val type = requireNotNull(mimeType) { - "mimeType should be initialized" - } - onPermissionSuccess(type, requestCode) - } else { - onPermissionDenied() - } + Timber.d("Permission callback: $grantResults") + + if (mimeType == null) { + Timber.e("mimeType is null in permission callback") + onPermissionDenied() + isRequestInProgress = false + return@registerForActivityResult } + + val allGranted = grantResults.values.all { it } + if (allGranted) { + onPermissionSuccess(mimeType!!, requestCode) + } else { + onPermissionDenied() + } + + // Reset state + mimeType = null + requestCode = null + isRequestInProgress = false } fun openFilePicker(mimeType: Mimetype, requestCode: Int?) { + if (isRequestInProgress) { + Timber.w("Permission request already in progress") + return + } + try { this.mimeType = mimeType this.requestCode = requestCode - val context = fragment.context ?: return + isRequestInProgress = true + + val context = fragment.context ?: run { + onPermissionDenied() + isRequestInProgress = false + return + } + val hasPermission = mimeType.hasPermission(context) if (hasPermission) { onPermissionSuccess(mimeType, requestCode) + isRequestInProgress = false } else { - val permission = mimeType.getPermissionToRequestByMime() - permissionReadStorage.launch(permission) + val permissions = mimeType.getPermissionToRequestByMime() + if (permissions.isNotEmpty()) { + permissionReadStorage.launch(permissions) + } else { + // No permissions to request + onPermissionDenied() + isRequestInProgress = false + } } } catch (e: Exception) { fragment.toast(e.msg()) + onPermissionDenied() + isRequestInProgress = false } } } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/editor/DragAndDropDelegate.kt b/app/src/main/java/com/anytypeio/anytype/ui/editor/DragAndDropDelegate.kt index 48c55a9a70..57f02e540a 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/editor/DragAndDropDelegate.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/editor/DragAndDropDelegate.kt @@ -144,14 +144,18 @@ class DragAndDropDelegate { is Code -> TextInputDragShadow(vh.content.id, vh.itemView, event) else -> DefaultEditorDragShadow(vh.itemView, event) } - vh.itemView.startDragAndDrop( - dragData, - shadow, - null, - 0 - ) - blockAdapter.selectDraggedViewHolder(dndTargetPos) - blockAdapter.notifyItemChanged(dndTargetPos) + try { + vh.itemView.startDragAndDrop( + dragData, + shadow, + null, + 0 + ) + blockAdapter.selectDraggedViewHolder(dndTargetPos) + blockAdapter.notifyItemChanged(dndTargetPos) + } catch (e: Exception) { + Timber.e(e, "Failed to start drag and drop") + } } } else { val pos = vh.bindingAdapterPosition diff --git a/app/src/main/res/layout/fragment_object_type_change.xml b/app/src/main/res/layout/fragment_object_type_change.xml index 14c84f95e7..44b32542c4 100644 --- a/app/src/main/res/layout/fragment_object_type_change.xml +++ b/app/src/main/res/layout/fragment_object_type_change.xml @@ -53,6 +53,7 @@ android:gravity="center_vertical" android:hint="@string/search" android:maxLines="1" + android:imeOptions="actionDone" android:singleLine="true" android:textColor="@color/text_primary" android:textColorHint="@color/text_secondary" diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareProtobufLogger.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareProtobufLogger.kt index de4f7e0420..b187898146 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareProtobufLogger.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/MiddlewareProtobufLogger.kt @@ -1,10 +1,10 @@ package com.anytypeio.anytype.middleware.interactor import com.anytypeio.anytype.core_utils.tools.FeatureToggles -import timber.log.Timber import javax.inject.Inject import kotlin.time.Duration import kotlin.time.DurationUnit +import timber.log.Timber interface MiddlewareProtobufLogger { diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/ext/BlockViewExt.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/ext/BlockViewExt.kt index ad4f346667..4f8cb14f91 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/ext/BlockViewExt.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/ext/BlockViewExt.kt @@ -381,7 +381,7 @@ fun List.enterSAM( ) else -> view.also { if(view !is BlockView.Permission) { - Timber.w("Attempts to enter SAM for block which does not support read / write mode") + Timber.w("Attempts to enter SAM for block which does not support read / write mode : ${view.getViewType()}") } } } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/styling/StyleToolbarExt.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/styling/StyleToolbarExt.kt index 25f20ee75a..d38d1e46d5 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/styling/StyleToolbarExt.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/styling/StyleToolbarExt.kt @@ -2,9 +2,9 @@ package com.anytypeio.anytype.presentation.editor.editor.styling import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.presentation.editor.Editor import com.anytypeio.anytype.presentation.editor.editor.Markup -import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.presentation.editor.editor.model.Alignment import timber.log.Timber @@ -13,7 +13,7 @@ fun Editor.Mode.getIds(): List? = when (this) { is Editor.Mode.Styling.Single -> listOf(target) is Editor.Mode.Table -> targets.toList() else -> { - Timber.e("Couldn't get ids of selected blocks, wrong Editor Mode : $this") + Timber.w("Couldn't get ids of selected blocks, wrong Editor Mode : $this") null } } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectWrapperExtensions.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectWrapperExtensions.kt index dca5f73081..cc089c7d5e 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectWrapperExtensions.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectWrapperExtensions.kt @@ -7,13 +7,13 @@ import com.anytypeio.anytype.core_models.ObjectType import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.Relations +import com.anytypeio.anytype.core_models.ext.DateParser import com.anytypeio.anytype.core_utils.const.DateConst import com.anytypeio.anytype.core_utils.ext.typeOf import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.ObjectStore -import com.anytypeio.anytype.presentation.number.NumberParser -import com.anytypeio.anytype.core_models.ext.DateParser import com.anytypeio.anytype.presentation.extension.MAX_SNIPPET_SIZE +import com.anytypeio.anytype.presentation.number.NumberParser import com.anytypeio.anytype.presentation.relations.model.DefaultObjectRelationValueView import com.anytypeio.anytype.presentation.sets.model.FileView import com.anytypeio.anytype.presentation.sets.model.ObjectView @@ -351,7 +351,9 @@ suspend fun ObjectWrapper.Basic.objects( } ids.forEach { id -> val wrapper = storeOfObjects.get(id) ?: return@forEach - result.add(wrapper.toObjectView(urlBuilder)) + if (wrapper.isValid) { + result.add(wrapper.toObjectView(urlBuilder)) + } } return result } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetExtension.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetExtension.kt index 4b65178009..d3b3295cba 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetExtension.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetExtension.kt @@ -42,7 +42,6 @@ import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.presentation.editor.cover.CoverImageHashProvider import com.anytypeio.anytype.presentation.editor.editor.model.BlockView import com.anytypeio.anytype.presentation.mapper.objectIcon -import com.anytypeio.anytype.presentation.objects.ObjectIcon import com.anytypeio.anytype.presentation.objects.getProperName import com.anytypeio.anytype.presentation.relations.BasicObjectCoverWrapper import com.anytypeio.anytype.presentation.relations.ObjectRelationView @@ -168,13 +167,14 @@ private fun ObjectState.DataView.mapFeaturedRelations( val sourceMap = source?.let { details.details[it]?.map } val isSourceMapValid = !sourceMap.isNullOrEmpty() - val wrapper = if (isSourceMapValid) ObjectWrapper.Basic(sourceMap!!) else null + val wrapper = if (isSourceMapValid) ObjectWrapper.Basic(sourceMap) else null + val isValid = wrapper?.isValid == true val isDeleted = wrapper?.isDeleted == true - val isReadOnly = wrapper?.relationReadonlyValue ?: false + val isReadOnly = wrapper?.relationReadonlyValue == true - val sources = if (!isDeleted && isSourceMapValid) { - listOf(wrapper!!.toObjectViewDefault(urlBuilder = urlBuilder)) + val sources = if (isValid && !isDeleted) { + listOf(wrapper.toObjectViewDefault(urlBuilder = urlBuilder)) } else { emptyList() } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt index d98db91a48..ad6159b264 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt @@ -7,14 +7,14 @@ import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.Struct +import com.anytypeio.anytype.core_models.ext.DateParser import com.anytypeio.anytype.core_utils.ext.typeOf import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.presentation.mapper.objectIcon import com.anytypeio.anytype.presentation.number.NumberParser import com.anytypeio.anytype.presentation.objects.ObjectIcon import com.anytypeio.anytype.presentation.objects.getProperName -import com.anytypeio.anytype.core_models.ext.DateParser -import com.anytypeio.anytype.presentation.mapper.objectIcon import com.anytypeio.anytype.presentation.relations.getDateRelationFormat import com.anytypeio.anytype.presentation.sets.model.CellView import com.anytypeio.anytype.presentation.sets.model.ColumnView @@ -292,14 +292,14 @@ fun Struct.buildRelationValueObjectViews( val objects = mutableListOf() val value = this.getOrDefault(relationKey, null) if (value is Id) { - val wrapper = ObjectWrapper.Basic(details[value]?.map ?: emptyMap()) - if (!wrapper.isEmpty()) { + val wrapper = ObjectWrapper.Basic(details[value]?.map.orEmpty()) + if (wrapper.isValid) { objects.add(wrapper.toObjectView(urlBuilder = builder)) } } else if (value is List<*>) { value.typeOf().forEach { id -> - val wrapper = ObjectWrapper.Basic(details[id]?.map ?: emptyMap()) - if (!wrapper.isEmpty()) { + val wrapper = ObjectWrapper.Basic(details[id]?.map.orEmpty()) + if (wrapper.isValid) { objects.add(wrapper.toObjectView(urlBuilder = builder)) } }