|
| 1 | +package com.pspdfkit.flutter.pspdfkit.annotations |
| 2 | + |
| 3 | +import com.pspdfkit.ui.special_mode.controller.AnnotationTool |
| 4 | +import com.pspdfkit.ui.special_mode.controller.AnnotationToolVariant |
| 5 | +import com.pspdfkit.flutter.pspdfkit.api.AnnotationTool as FlutterAnnotationTool |
| 6 | +import com.pspdfkit.ui.special_mode.controller.AnnotationTool as AndroidAnnotationTool |
| 7 | + |
| 8 | +/** |
| 9 | + * Data class representing an Android annotation tool with its optional variant. |
| 10 | + * Some annotation tools are represented by a combination of annotationTool and AnnotationToolVariant on Android. |
| 11 | + */ |
| 12 | +data class AnnotationToolWithVariant(val annotationTool: AndroidAnnotationTool, val variant: AnnotationToolVariant? = null) |
| 13 | + |
| 14 | +/** |
| 15 | + * Utility class for annotation-related operations, including mapping between Flutter and Android annotation tools. |
| 16 | + */ |
| 17 | +object AnnotationUtils { |
| 18 | + |
| 19 | + /** |
| 20 | + * Maps a Flutter AnnotationTool name to the corresponding Android AnnotationToolWithVariant. |
| 21 | + * |
| 22 | + * @param flutterToolName The name of the Flutter AnnotationTool enum value. |
| 23 | + * @return The corresponding Android AnnotationToolWithVariant, or null if no mapping exists. |
| 24 | + */ |
| 25 | + fun getAndroidAnnotationToolWithVariantFromFlutterName(flutterToolName: String?): AnnotationToolWithVariant? { |
| 26 | + if (flutterToolName == null) return null |
| 27 | + |
| 28 | + // Try to find the matching Flutter enum value |
| 29 | + val flutterTool = FlutterAnnotationTool.values().find { |
| 30 | + it.name.equals(flutterToolName, ignoreCase = true) || |
| 31 | + it.name.replace("_", "").equals(flutterToolName, ignoreCase = true) |
| 32 | + } |
| 33 | + return mapFlutterToolToAndroidToolWithVariant(flutterTool) |
| 34 | + } |
| 35 | + |
| 36 | + /** |
| 37 | + * Maps a Flutter AnnotationTool to the corresponding Android AnnotationToolWithVariant. |
| 38 | + * |
| 39 | + * @param flutterTool The Flutter AnnotationTool enum value. |
| 40 | + * @return The corresponding Android AnnotationToolWithVariant, or null if no mapping exists. |
| 41 | + */ |
| 42 | + fun getAndroidAnnotationToolWithVariantFromFlutterTool(flutterTool: FlutterAnnotationTool?): AnnotationToolWithVariant? { |
| 43 | + return mapFlutterToolToAndroidToolWithVariant(flutterTool) |
| 44 | + } |
| 45 | + |
| 46 | + /** |
| 47 | + * For backward compatibility - returns just the AnnotationTool without variant. |
| 48 | + */ |
| 49 | + fun getAndroidAnnotationToolFromFlutterName(flutterToolName: String?): AndroidAnnotationTool? { |
| 50 | + return getAndroidAnnotationToolWithVariantFromFlutterName(flutterToolName)?.annotationTool |
| 51 | + } |
| 52 | + |
| 53 | + /** |
| 54 | + * For backward compatibility - returns just the AnnotationTool without variant. |
| 55 | + */ |
| 56 | + fun getAndroidAnnotationToolFromFlutterTool(flutterTool: FlutterAnnotationTool?): AndroidAnnotationTool? { |
| 57 | + return getAndroidAnnotationToolWithVariantFromFlutterTool(flutterTool)?.annotationTool |
| 58 | + } |
| 59 | + |
| 60 | + /** |
| 61 | + * Maps a Flutter AnnotationTool to the corresponding Android AnnotationToolWithVariant. |
| 62 | + * |
| 63 | + * @param flutterTool The Flutter AnnotationTool enum value. |
| 64 | + * @return The corresponding Android AnnotationToolWithVariant, or null if no mapping exists. |
| 65 | + */ |
| 66 | + private fun mapFlutterToolToAndroidToolWithVariant(flutterTool: FlutterAnnotationTool?): AnnotationToolWithVariant? { |
| 67 | + return when (flutterTool) { |
| 68 | + // Ink tools with variants |
| 69 | + FlutterAnnotationTool.INK_PEN -> AnnotationToolWithVariant(AndroidAnnotationTool.INK, AnnotationToolVariant.fromPreset(AnnotationToolVariant.Preset.PEN)) |
| 70 | + FlutterAnnotationTool.INK_MAGIC -> AnnotationToolWithVariant(AndroidAnnotationTool.MAGIC_INK) |
| 71 | + FlutterAnnotationTool.INK_HIGHLIGHTER -> AnnotationToolWithVariant(AndroidAnnotationTool.INK, AnnotationToolVariant.fromPreset(AnnotationToolVariant.Preset.HIGHLIGHTER)) |
| 72 | + |
| 73 | + // Free text tools with variants |
| 74 | + FlutterAnnotationTool.FREE_TEXT -> AnnotationToolWithVariant(AndroidAnnotationTool.FREETEXT) |
| 75 | + FlutterAnnotationTool.FREE_TEXT_CALL_OUT -> AnnotationToolWithVariant(AndroidAnnotationTool.FREETEXT_CALLOUT) |
| 76 | + |
| 77 | + // Shape tools |
| 78 | + FlutterAnnotationTool.STAMP -> AnnotationToolWithVariant(AndroidAnnotationTool.STAMP) |
| 79 | + FlutterAnnotationTool.IMAGE -> AnnotationToolWithVariant(AndroidAnnotationTool.IMAGE) |
| 80 | + |
| 81 | + // Text markup tools |
| 82 | + FlutterAnnotationTool.HIGHLIGHT -> AnnotationToolWithVariant(AndroidAnnotationTool.HIGHLIGHT) |
| 83 | + FlutterAnnotationTool.UNDERLINE -> AnnotationToolWithVariant(AndroidAnnotationTool.UNDERLINE) |
| 84 | + FlutterAnnotationTool.SQUIGGLY -> AnnotationToolWithVariant(AndroidAnnotationTool.SQUIGGLY) |
| 85 | + FlutterAnnotationTool.STRIKE_OUT -> AnnotationToolWithVariant(AndroidAnnotationTool.STRIKEOUT) |
| 86 | + |
| 87 | + // Line tools |
| 88 | + FlutterAnnotationTool.LINE -> AnnotationToolWithVariant(AndroidAnnotationTool.LINE) |
| 89 | + FlutterAnnotationTool.ARROW -> AnnotationToolWithVariant(AndroidAnnotationTool.LINE, AnnotationToolVariant.fromPreset(AnnotationToolVariant.Preset.ARROW)) |
| 90 | + |
| 91 | + // Shape tools |
| 92 | + FlutterAnnotationTool.SQUARE -> AnnotationToolWithVariant(AndroidAnnotationTool.SQUARE) |
| 93 | + FlutterAnnotationTool.CIRCLE -> AnnotationToolWithVariant(AndroidAnnotationTool.CIRCLE) |
| 94 | + FlutterAnnotationTool.POLYGON -> AnnotationToolWithVariant(AndroidAnnotationTool.POLYGON) |
| 95 | + FlutterAnnotationTool.POLYLINE -> AnnotationToolWithVariant(AndroidAnnotationTool.POLYLINE) |
| 96 | + |
| 97 | + // Other tools |
| 98 | + FlutterAnnotationTool.ERASER -> AnnotationToolWithVariant(AndroidAnnotationTool.ERASER) |
| 99 | + FlutterAnnotationTool.CLOUDY -> AnnotationToolWithVariant(AndroidAnnotationTool.SQUARE, AnnotationToolVariant.fromPreset(AnnotationToolVariant.Preset.CLOUDY)) |
| 100 | + FlutterAnnotationTool.NOTE -> AnnotationToolWithVariant(AndroidAnnotationTool.NOTE) |
| 101 | + FlutterAnnotationTool.SOUND -> AnnotationToolWithVariant(AndroidAnnotationTool.SOUND) |
| 102 | + FlutterAnnotationTool.SIGNATURE -> AnnotationToolWithVariant(AndroidAnnotationTool.SIGNATURE) |
| 103 | + FlutterAnnotationTool.REDACTION -> AnnotationToolWithVariant(AndroidAnnotationTool.REDACTION) |
| 104 | + |
| 105 | + // Measurement tools |
| 106 | + FlutterAnnotationTool.MEASUREMENT_AREA_RECT -> AnnotationToolWithVariant(AndroidAnnotationTool.MEASUREMENT_AREA_RECT) |
| 107 | + FlutterAnnotationTool.MEASUREMENT_AREA_POLYGON -> AnnotationToolWithVariant(AndroidAnnotationTool.MEASUREMENT_AREA_POLYGON) |
| 108 | + FlutterAnnotationTool.MEASUREMENT_AREA_ELLIPSE -> AnnotationToolWithVariant(AndroidAnnotationTool.MEASUREMENT_AREA_ELLIPSE) |
| 109 | + FlutterAnnotationTool.MEASUREMENT_PERIMETER -> AnnotationToolWithVariant(AndroidAnnotationTool.MEASUREMENT_PERIMETER) |
| 110 | + FlutterAnnotationTool.MEASUREMENT_DISTANCE -> AnnotationToolWithVariant(AndroidAnnotationTool.MEASUREMENT_DISTANCE) |
| 111 | + |
| 112 | + // Some Flutter tools don't have direct Android equivalents |
| 113 | + FlutterAnnotationTool.CARET, |
| 114 | + FlutterAnnotationTool.RICH_MEDIA, |
| 115 | + FlutterAnnotationTool.SCREEN, |
| 116 | + FlutterAnnotationTool.FILE, |
| 117 | + FlutterAnnotationTool.WIDGET, |
| 118 | + FlutterAnnotationTool.STAMP_IMAGE, |
| 119 | + FlutterAnnotationTool.LINK, |
| 120 | + null -> null |
| 121 | + } |
| 122 | + } |
| 123 | + |
| 124 | + /** |
| 125 | + * Maps an Android AnnotationTool to the corresponding Flutter AnnotationTool. |
| 126 | + * |
| 127 | + * @param androidTool The Android AnnotationTool. |
| 128 | + * @return The corresponding Flutter AnnotationTool, or null if no mapping exists. |
| 129 | + */ |
| 130 | + fun mapAndroidToolToFlutterTool(androidTool: AndroidAnnotationTool?): FlutterAnnotationTool? { |
| 131 | + return when (androidTool) { |
| 132 | + AndroidAnnotationTool.INK -> FlutterAnnotationTool.INK_PEN |
| 133 | + AndroidAnnotationTool.MAGIC_INK -> FlutterAnnotationTool.INK_MAGIC |
| 134 | + AndroidAnnotationTool.FREETEXT -> FlutterAnnotationTool.FREE_TEXT |
| 135 | + AndroidAnnotationTool.FREETEXT_CALLOUT -> FlutterAnnotationTool.FREE_TEXT_CALL_OUT |
| 136 | + AndroidAnnotationTool.STAMP -> FlutterAnnotationTool.STAMP |
| 137 | + AndroidAnnotationTool.IMAGE -> FlutterAnnotationTool.IMAGE |
| 138 | + AndroidAnnotationTool.HIGHLIGHT -> FlutterAnnotationTool.HIGHLIGHT |
| 139 | + AndroidAnnotationTool.UNDERLINE -> FlutterAnnotationTool.UNDERLINE |
| 140 | + AndroidAnnotationTool.SQUIGGLY -> FlutterAnnotationTool.SQUIGGLY |
| 141 | + AndroidAnnotationTool.STRIKEOUT -> FlutterAnnotationTool.STRIKE_OUT |
| 142 | + AndroidAnnotationTool.LINE -> FlutterAnnotationTool.LINE |
| 143 | + AndroidAnnotationTool.SQUARE -> FlutterAnnotationTool.SQUARE |
| 144 | + AndroidAnnotationTool.CIRCLE -> FlutterAnnotationTool.CIRCLE |
| 145 | + AndroidAnnotationTool.POLYGON -> FlutterAnnotationTool.POLYGON |
| 146 | + AndroidAnnotationTool.POLYLINE -> FlutterAnnotationTool.POLYLINE |
| 147 | + AndroidAnnotationTool.ERASER -> FlutterAnnotationTool.ERASER |
| 148 | + AndroidAnnotationTool.NOTE -> FlutterAnnotationTool.NOTE |
| 149 | + AndroidAnnotationTool.SOUND -> FlutterAnnotationTool.SOUND |
| 150 | + AndroidAnnotationTool.SIGNATURE -> FlutterAnnotationTool.SIGNATURE |
| 151 | + AndroidAnnotationTool.REDACTION -> FlutterAnnotationTool.REDACTION |
| 152 | + AndroidAnnotationTool.MEASUREMENT_AREA_RECT -> FlutterAnnotationTool.MEASUREMENT_AREA_RECT |
| 153 | + AndroidAnnotationTool.MEASUREMENT_AREA_POLYGON -> FlutterAnnotationTool.MEASUREMENT_AREA_POLYGON |
| 154 | + AndroidAnnotationTool.MEASUREMENT_AREA_ELLIPSE -> FlutterAnnotationTool.MEASUREMENT_AREA_ELLIPSE |
| 155 | + AndroidAnnotationTool.MEASUREMENT_PERIMETER -> FlutterAnnotationTool.MEASUREMENT_PERIMETER |
| 156 | + AndroidAnnotationTool.MEASUREMENT_DISTANCE -> FlutterAnnotationTool.MEASUREMENT_DISTANCE |
| 157 | + AnnotationTool.NONE, |
| 158 | + AnnotationTool.MEASUREMENT_SCALE_CALIBRATION, |
| 159 | + AnnotationTool.CAMERA, |
| 160 | + AnnotationTool.INSTANT_COMMENT_MARKER, |
| 161 | + AnnotationTool.INSTANT_HIGHLIGHT_COMMENT, |
| 162 | + AnnotationTool.ANNOTATION_MULTI_SELECTION, |
| 163 | + null -> null |
| 164 | + } |
| 165 | + } |
| 166 | + |
| 167 | + /** |
| 168 | + * Maps an Android AnnotationToolWithVariant to the corresponding Flutter AnnotationTool. |
| 169 | + * |
| 170 | + * @param toolWithVariant The Android AnnotationToolWithVariant. |
| 171 | + * @return The corresponding Flutter AnnotationTool, or null if no mapping exists. |
| 172 | + */ |
| 173 | + fun mapAndroidToolWithVariantToFlutterTool(toolWithVariant: AnnotationToolWithVariant?): FlutterAnnotationTool? { |
| 174 | + if (toolWithVariant == null) return null |
| 175 | + |
| 176 | + val tool = toolWithVariant.annotationTool |
| 177 | + val variant = toolWithVariant.variant |
| 178 | + |
| 179 | + // Special cases for tools with variants |
| 180 | + if (tool == AndroidAnnotationTool.INK && variant != null) { |
| 181 | + return when (variant.name) { |
| 182 | + AnnotationToolVariant.Preset.PEN.name -> FlutterAnnotationTool.INK_PEN |
| 183 | + AnnotationToolVariant.Preset.HIGHLIGHTER.name -> FlutterAnnotationTool.INK_HIGHLIGHTER |
| 184 | + else -> FlutterAnnotationTool.INK_PEN // Default to pen if variant not recognized |
| 185 | + } |
| 186 | + } |
| 187 | + |
| 188 | + if (tool == AndroidAnnotationTool.LINE && variant != null) { |
| 189 | + return when { |
| 190 | + variant.name == AnnotationToolVariant.Preset.ARROW.name -> FlutterAnnotationTool.ARROW |
| 191 | + else -> FlutterAnnotationTool.LINE |
| 192 | + } |
| 193 | + } |
| 194 | + |
| 195 | + if (tool == AndroidAnnotationTool.SQUARE && variant != null) { |
| 196 | + return when { |
| 197 | + variant.name == AnnotationToolVariant.Preset.CLOUDY.name -> FlutterAnnotationTool.CLOUDY |
| 198 | + else -> FlutterAnnotationTool.SQUARE |
| 199 | + } |
| 200 | + } |
| 201 | + |
| 202 | + // For all other cases, use the standard mapping |
| 203 | + return mapAndroidToolToFlutterTool(tool) |
| 204 | + } |
| 205 | +} |
0 commit comments