replate-camera 0.14.2 → 0.14.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,8 @@ import android.os.Build
10
10
  import android.os.Environment
11
11
  import android.os.Handler
12
12
  import android.os.Looper
13
+ import android.os.PowerManager
14
+ import android.os.SystemClock
13
15
  import android.util.AttributeSet
14
16
  import android.util.Log
15
17
  import android.view.GestureDetector
@@ -22,7 +24,11 @@ import androidx.core.app.ActivityCompat
22
24
  import androidx.core.content.ContextCompat
23
25
  import androidx.exifinterface.media.ExifInterface
24
26
  import androidx.fragment.app.FragmentActivity
27
+ import androidx.lifecycle.DefaultLifecycleObserver
28
+ import androidx.lifecycle.LifecycleOwner
29
+ import androidx.lifecycle.ProcessLifecycleOwner
25
30
  import com.google.ar.core.Anchor
31
+ import com.google.ar.core.Session
26
32
  import com.google.ar.core.HitResult
27
33
  import com.google.ar.core.Plane
28
34
  import com.google.ar.core.TrackingState
@@ -63,7 +69,7 @@ class ReplateCameraView @JvmOverloads constructor(
63
69
  attrs: AttributeSet? = null,
64
70
  defStyleAttr: Int = 0
65
71
  ) : FrameLayout(context, attrs, defStyleAttr), Scene.OnUpdateListener,
66
- android.hardware.SensorEventListener {
72
+ android.hardware.SensorEventListener, DefaultLifecycleObserver {
67
73
 
68
74
  companion object {
69
75
  private const val TAG = "ReplateCameraView"
@@ -95,6 +101,20 @@ class ReplateCameraView @JvmOverloads constructor(
95
101
  // AR Sceneform stuff
96
102
  private lateinit var arFragment: ArFragment
97
103
  private var anchorNode: AnchorNode? = null
104
+ private var isSessionPaused = false
105
+ private var isViewAttached = false
106
+ private var sensorManager: android.hardware.SensorManager? = null
107
+ private var gravitySensor: android.hardware.Sensor? = null
108
+ private var powerManager: PowerManager? = null
109
+ private var lastSessionStartTime = 0L
110
+ private var sessionTimeoutHandler: Handler? = null
111
+ private var sessionTimeoutRunnable: Runnable? = null
112
+
113
+ // Overheating prevention constants
114
+ private companion object {
115
+ const val MAX_CONTINUOUS_SESSION_TIME = 30 * 60 * 1000L // 30 minutes
116
+ const val THERMAL_BREAK_DURATION = 5 * 60 * 1000L // 5 minutes
117
+ }
98
118
 
99
119
  // Spheres and a "focus node"
100
120
  private val spheresModels = mutableListOf<TransformableNode>()
@@ -127,11 +147,28 @@ class ReplateCameraView @JvmOverloads constructor(
127
147
  scaleDetector = ScaleGestureDetector(context, ScaleListener())
128
148
 
129
149
  // Register a gravity sensor to replicate iOS's CMMotionManager
130
- val sensorManager = context.getSystemService(Context.SENSOR_SERVICE)
150
+ sensorManager = context.getSystemService(Context.SENSOR_SERVICE)
131
151
  as? android.hardware.SensorManager
132
- sensorManager?.getDefaultSensor(android.hardware.Sensor.TYPE_GRAVITY)?.also { gravitySensor ->
133
- sensorManager.registerListener(this, gravitySensor, android.hardware.SensorManager.SENSOR_DELAY_GAME)
134
- }
152
+ gravitySensor = sensorManager?.getDefaultSensor(android.hardware.Sensor.TYPE_GRAVITY)
153
+
154
+ // Register for lifecycle events
155
+ ProcessLifecycleOwner.get().lifecycle.addObserver(this)
156
+
157
+ // Initialize power manager for thermal monitoring
158
+ powerManager = context.getSystemService(Context.POWER_SERVICE) as? PowerManager
159
+
160
+ // Initialize session timeout handler
161
+ sessionTimeoutHandler = Handler(Looper.getMainLooper())
162
+
163
+ // Register sensor when view is ready
164
+ registerSensorListener()
165
+ isViewAttached = true
166
+
167
+ // Record session start time
168
+ lastSessionStartTime = SystemClock.elapsedRealtime()
169
+
170
+ // Start session timeout monitoring
171
+ startSessionTimeoutMonitoring()
135
172
  }
136
173
 
137
174
  /**
@@ -189,6 +226,9 @@ class ReplateCameraView @JvmOverloads constructor(
189
226
  val frame = arFragment.arSceneView.arFrame ?: return
190
227
  if (frame.camera.trackingState != TrackingState.TRACKING) return
191
228
 
229
+ // Check thermal state periodically to prevent overheating
230
+ checkThermalState()
231
+
192
232
  // If you need per-frame logic, do it here.
193
233
  // Example: check lighting, or do real-time distance checks, etc.
194
234
  }
@@ -428,6 +468,213 @@ class ReplateCameraView @JvmOverloads constructor(
428
468
  // Not used
429
469
  }
430
470
 
471
+ // ------------------------------------------------------------------------
472
+ // Lifecycle Management
473
+ // ------------------------------------------------------------------------
474
+
475
+ override fun onAttachedToWindow() {
476
+ super.onAttachedToWindow()
477
+ isViewAttached = true
478
+ if (isSessionPaused) {
479
+ resumeSession()
480
+ }
481
+ }
482
+
483
+ override fun onDetachedFromWindow() {
484
+ super.onDetachedFromWindow()
485
+ isViewAttached = false
486
+ pauseSession()
487
+ cleanupResources()
488
+ }
489
+
490
+ override fun onStart(owner: LifecycleOwner) {
491
+ super.onStart(owner)
492
+ if (isViewAttached) {
493
+ resumeSession()
494
+ }
495
+ }
496
+
497
+ override fun onStop(owner: LifecycleOwner) {
498
+ super.onStop(owner)
499
+ pauseSession()
500
+ }
501
+
502
+ override fun onDestroy(owner: LifecycleOwner) {
503
+ super.onDestroy(owner)
504
+ cleanupResources()
505
+ ProcessLifecycleOwner.get().lifecycle.removeObserver(this)
506
+ }
507
+
508
+ /**
509
+ * Pauses the AR session and unregisters sensors to prevent overheating
510
+ */
511
+ private fun pauseSession() {
512
+ if (isSessionPaused) return
513
+
514
+ try {
515
+ // Pause AR session
516
+ arFragment.arSceneView.session?.pause()
517
+
518
+ // Unregister sensor listener
519
+ unregisterSensorListener()
520
+
521
+ // Remove scene update listener
522
+ arFragment.arSceneView.scene.removeOnUpdateListener(this)
523
+
524
+ isSessionPaused = true
525
+ Log.d(TAG, "AR session paused")
526
+ } catch (e: Exception) {
527
+ Log.e(TAG, "Error pausing AR session: ${e.message}")
528
+ }
529
+ }
530
+
531
+ /**
532
+ * Resumes the AR session and re-registers sensors
533
+ */
534
+ private fun resumeSession() {
535
+ if (!isSessionPaused) return
536
+
537
+ try {
538
+ // Resume AR session
539
+ arFragment.arSceneView.session?.resume()
540
+
541
+ // Re-register sensor listener
542
+ registerSensorListener()
543
+
544
+ // Re-add scene update listener
545
+ arFragment.arSceneView.scene.addOnUpdateListener(this)
546
+
547
+ isSessionPaused = false
548
+ Log.d(TAG, "AR session resumed")
549
+ } catch (e: Exception) {
550
+ Log.e(TAG, "Error resuming AR session: ${e.message}")
551
+ }
552
+ }
553
+
554
+ /**
555
+ * Registers the gravity sensor listener
556
+ */
557
+ private fun registerSensorListener() {
558
+ try {
559
+ gravitySensor?.let { sensor ->
560
+ sensorManager?.registerListener(
561
+ this,
562
+ sensor,
563
+ android.hardware.SensorManager.SENSOR_DELAY_GAME
564
+ )
565
+ }
566
+ } catch (e: Exception) {
567
+ Log.e(TAG, "Error registering sensor listener: ${e.message}")
568
+ }
569
+ }
570
+
571
+ /**
572
+ * Unregisters the gravity sensor listener
573
+ */
574
+ private fun unregisterSensorListener() {
575
+ try {
576
+ sensorManager?.unregisterListener(this)
577
+ } catch (e: Exception) {
578
+ Log.e(TAG, "Error unregistering sensor listener: ${e.message}")
579
+ }
580
+ }
581
+
582
+ /**
583
+ * Cleans up all resources including AR session, sensors, and nodes
584
+ */
585
+ private fun cleanupResources() {
586
+ try {
587
+ // Stop session timeout monitoring
588
+ stopSessionTimeoutMonitoring()
589
+
590
+ // Clean up AR session
591
+ arFragment.arSceneView.session?.close()
592
+
593
+ // Unregister sensor listener
594
+ unregisterSensorListener()
595
+
596
+ // Remove scene listener
597
+ arFragment.arSceneView.scene.removeOnUpdateListener(this)
598
+
599
+ // Clean up nodes
600
+ anchorNode?.let { node ->
601
+ node.children.forEach { child ->
602
+ node.removeChild(child)
603
+ }
604
+ arFragment.arSceneView.scene.removeChild(node)
605
+ }
606
+
607
+ // Clear references
608
+ anchorNode = null
609
+ spheresModels.clear()
610
+ focusNode = null
611
+
612
+ Log.d(TAG, "Resources cleaned up")
613
+ } catch (e: Exception) {
614
+ Log.e(TAG, "Error cleaning up resources: ${e.message}")
615
+ }
616
+ }
617
+
618
+ /**
619
+ * Starts monitoring session timeout to prevent overheating
620
+ */
621
+ private fun startSessionTimeoutMonitoring() {
622
+ sessionTimeoutRunnable = Runnable {
623
+ Log.w(TAG, "Session timeout reached, pausing to prevent overheating")
624
+ pauseSession()
625
+
626
+ // Schedule resume after thermal break
627
+ sessionTimeoutHandler?.postDelayed({
628
+ Log.i(TAG, "Thermal break complete, resuming session")
629
+ lastSessionStartTime = SystemClock.elapsedRealtime()
630
+ resumeSession()
631
+ startSessionTimeoutMonitoring()
632
+ }, THERMAL_BREAK_DURATION)
633
+ }
634
+
635
+ sessionTimeoutHandler?.postDelayed(
636
+ sessionTimeoutRunnable!!,
637
+ MAX_CONTINUOUS_SESSION_TIME
638
+ )
639
+ }
640
+
641
+ /**
642
+ * Stops session timeout monitoring
643
+ */
644
+ private fun stopSessionTimeoutMonitoring() {
645
+ sessionTimeoutRunnable?.let { runnable ->
646
+ sessionTimeoutHandler?.removeCallbacks(runnable)
647
+ }
648
+ sessionTimeoutRunnable = null
649
+ }
650
+
651
+ /**
652
+ * Checks if device is in thermal state and pauses session if needed
653
+ */
654
+ private fun checkThermalState() {
655
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
656
+ powerManager?.let { pm ->
657
+ val thermalStatus = pm.thermalStatus
658
+ when (thermalStatus) {
659
+ PowerManager.THERMAL_STATUS_MODERATE,
660
+ PowerManager.THERMAL_STATUS_SEVERE,
661
+ PowerManager.THERMAL_STATUS_CRITICAL,
662
+ PowerManager.THERMAL_STATUS_EMERGENCY,
663
+ PowerManager.THERMAL_STATUS_SHUTDOWN -> {
664
+ Log.w(TAG, "Device thermal status: $thermalStatus, pausing AR session")
665
+ pauseSession()
666
+ }
667
+ else -> {
668
+ // Device is cool, safe to continue
669
+ if (isSessionPaused && isViewAttached) {
670
+ resumeSession()
671
+ }
672
+ }
673
+ }
674
+ }
675
+ }
676
+ }
677
+
431
678
  // ------------------------------------------------------------------------
432
679
  // Reset Logic
433
680
  // ------------------------------------------------------------------------
@@ -435,36 +682,46 @@ class ReplateCameraView @JvmOverloads constructor(
435
682
  * Resets the AR session, removing anchors and restoring default geometry.
436
683
  */
437
684
  fun resetSession() {
438
- anchorNode?.let { node ->
439
- node.children.forEach { child ->
440
- node.removeChild(child)
685
+ try {
686
+ // Clean up existing nodes
687
+ anchorNode?.let { node ->
688
+ node.children.forEach { child ->
689
+ node.removeChild(child)
690
+ }
691
+ arFragment.arSceneView.scene.removeChild(node)
441
692
  }
442
- arFragment.arSceneView.scene.removeChild(node)
443
- }
444
- anchorNode = null
445
- spheresModels.clear()
446
- focusNode = null
447
-
448
- // Reset booleans
449
- for (i in upperSpheresSet.indices) {
450
- upperSpheresSet[i] = false
451
- lowerSpheresSet[i] = false
693
+ anchorNode = null
694
+ spheresModels.clear()
695
+ focusNode = null
696
+
697
+ // Reset booleans
698
+ for (i in upperSpheresSet.indices) {
699
+ upperSpheresSet[i] = false
700
+ lowerSpheresSet[i] = false
701
+ }
702
+ totalPhotosTaken = 0
703
+ photosFromDifferentAnglesTaken = 0
704
+
705
+ // Reset geometry
706
+ sphereRadius = DEFAULT_SPHERE_RADIUS
707
+ spheresRadius = DEFAULT_SPHERES_RADIUS
708
+ sphereAngle = ANGLE_INCREMENT_DEGREES
709
+ spheresHeight = DEFAULT_SPHERES_HEIGHT
710
+ distanceBetweenCircles = DEFAULT_DISTANCE_BETWEEN_CIRCLES
711
+ circleInFocus = 0
712
+ dragSpeed = DEFAULT_DRAG_SPEED
713
+
714
+ // Properly reset AR session
715
+ arFragment.arSceneView.session?.close()
716
+ setupArFragment()
717
+
718
+ // Restart session timeout monitoring after reset
719
+ lastSessionStartTime = SystemClock.elapsedRealtime()
720
+ startSessionTimeoutMonitoring()
721
+
722
+ Log.d(TAG, "AR session reset successfully")
723
+ } catch (e: Exception) {
724
+ Log.e(TAG, "Error resetting AR session: ${e.message}")
452
725
  }
453
- totalPhotosTaken = 0
454
- photosFromDifferentAnglesTaken = 0
455
-
456
- // Reset geometry
457
- sphereRadius = DEFAULT_SPHERE_RADIUS
458
- spheresRadius = DEFAULT_SPHERES_RADIUS
459
- sphereAngle = ANGLE_INCREMENT_DEGREES
460
- spheresHeight = DEFAULT_SPHERES_HEIGHT
461
- distanceBetweenCircles = DEFAULT_DISTANCE_BETWEEN_CIRCLES
462
- circleInFocus = 0
463
- dragSpeed = DEFAULT_DRAG_SPEED
464
-
465
- // If you want to fully re-init the AR session, you could do:
466
- // arFragment.arSceneView.session?.close()
467
- // setupArFragment()
468
- // But that may require re-attaching the fragment, so it depends on your usage.
469
726
  }
470
727
  }
@@ -46,6 +46,12 @@ RCT_EXTERN_METHOD(getMemoryUsage:(RCTPromiseResolveBlock*)resolve
46
46
 
47
47
  RCT_EXTERN_METHOD(reset)
48
48
 
49
+ RCT_EXTERN_METHOD(pauseSession)
50
+
51
+ RCT_EXTERN_METHOD(resumeSession)
52
+
53
+ RCT_EXTERN_METHOD(stopSession)
54
+
49
55
  + (BOOL)requiresMainQueueSetup
50
56
  {
51
57
  return NO;
@@ -70,6 +70,11 @@ class ReplateCameraView: UIView, ARSessionDelegate {
70
70
  static var sessionId: UUID!
71
71
  static var motionManager: CMMotionManager!
72
72
  static var gravityVector: [String : Double] = [:]
73
+
74
+ // Tap handling state
75
+ private static var isProcessingTap = false
76
+ private static var lastTapTime: TimeInterval = 0
77
+ private static let tapDebounceInterval: TimeInterval = 0.5
73
78
  /// Core Image context for rendering CIImages
74
79
  static let ciContext = CIContext()
75
80
  /// AR focus indicator
@@ -104,6 +109,7 @@ class ReplateCameraView: UIView, ARSessionDelegate {
104
109
 
105
110
  // Thread Safety
106
111
  private static var isResetting = false
112
+ private static var isSessionActive = false
107
113
 
108
114
  // MARK: - Initialization
109
115
  override init(frame: CGRect) {
@@ -119,6 +125,7 @@ class ReplateCameraView: UIView, ARSessionDelegate {
119
125
  private func setupInitialState() {
120
126
  requestCameraPermissions()
121
127
  ReplateCameraView.INSTANCE = self
128
+ setupAppStateObservers()
122
129
  }
123
130
 
124
131
  // MARK: - Layout
@@ -130,6 +137,12 @@ class ReplateCameraView: UIView, ARSessionDelegate {
130
137
  ReplateCameraView.width = frame.width
131
138
  ReplateCameraView.height = frame.height
132
139
  }
140
+
141
+ override func removeFromSuperview() {
142
+ print("[ReplateCameraView] View being removed from superview - cleaning up AR session")
143
+ pauseSession()
144
+ super.removeFromSuperview()
145
+ }
133
146
 
134
147
  // MARK: - AR Setup and Configuration
135
148
  static func setupAR() {
@@ -143,6 +156,8 @@ class ReplateCameraView: UIView, ARSessionDelegate {
143
156
  DispatchQueue.main.async {
144
157
  configureARView(configuration)
145
158
  addRecognizers()
159
+ isSessionActive = true
160
+ print("[ReplateCameraView] AR session started")
146
161
  }
147
162
  }
148
163
  }
@@ -202,26 +217,67 @@ class ReplateCameraView: UIView, ARSessionDelegate {
202
217
 
203
218
  @objc func viewTapped(_ recognizer: UITapGestureRecognizer) {
204
219
  print("VIEW TAPPED")
220
+
221
+ // Thread-safe tap handling with debouncing
222
+ Self.lock.lock()
223
+ defer { Self.lock.unlock() }
224
+
225
+ // Check if we're already processing a tap
226
+ if ReplateCameraView.isProcessingTap {
227
+ print("Tap ignored - already processing")
228
+ return
229
+ }
230
+
231
+ // Debounce rapid taps
232
+ let currentTime = Date().timeIntervalSince1970
233
+ if currentTime - ReplateCameraView.lastTapTime < ReplateCameraView.tapDebounceInterval {
234
+ print("Tap ignored - too soon after last tap")
235
+ return
236
+ }
237
+
238
+ // Check if anchor already exists (simplified condition)
239
+ if ReplateCameraView.anchorEntity != nil {
240
+ print("Tap ignored - anchor already set")
241
+ return
242
+ }
243
+
244
+ // Set processing flags
245
+ ReplateCameraView.isProcessingTap = true
246
+ ReplateCameraView.lastTapTime = currentTime
247
+
205
248
  // Place anchor at the focus entity's current transform
206
- guard let focus = ReplateCameraView.focusEntity else { return }
249
+ guard let focus = ReplateCameraView.focusEntity else {
250
+ ReplateCameraView.isProcessingTap = false
251
+ return
252
+ }
253
+
207
254
  let focusTransform = focus.transformMatrix(relativeTo: nil)
208
255
  let anchor = AnchorEntity(world: focusTransform)
209
256
  print("ANCHOR FOUND\n", anchor.transform)
257
+
258
+ // Fire callback
210
259
  let callback = ReplateCameraController.anchorSetCallback
211
260
  if (callback != nil) {
212
261
  callback!([])
213
262
  ReplateCameraController.anchorSetCallback = nil
214
263
  }
215
- if (ReplateCameraView.model == nil && ReplateCameraView.anchorEntity == nil) {
216
- ReplateCameraView.anchorEntity = anchor
217
- createSpheres(y: ReplateCameraView.spheresHeight)
218
- createSpheres(y: ReplateCameraView.distanceBetweenCircles + ReplateCameraView.spheresHeight)
219
- createFocusSphere()
220
- guard let anchorEntity = ReplateCameraView.anchorEntity else { return }
221
- ReplateCameraView.arView.scene.anchors.append(anchorEntity)
222
- // Hide the focus reticle once an anchor is set
223
- ReplateCameraView.focusEntity?.isEnabled = false
264
+
265
+ // Set the anchor
266
+ ReplateCameraView.anchorEntity = anchor
267
+ createSpheres(y: ReplateCameraView.spheresHeight)
268
+ createSpheres(y: ReplateCameraView.distanceBetweenCircles + ReplateCameraView.spheresHeight)
269
+ createFocusSphere()
270
+ guard let anchorEntity = ReplateCameraView.anchorEntity else {
271
+ ReplateCameraView.isProcessingTap = false
272
+ return
224
273
  }
274
+ ReplateCameraView.arView.scene.anchors.append(anchorEntity)
275
+
276
+ // Hide the focus reticle once an anchor is set
277
+ ReplateCameraView.focusEntity?.isEnabled = false
278
+
279
+ // Reset processing flag
280
+ ReplateCameraView.isProcessingTap = false
225
281
  }
226
282
 
227
283
  @objc private func handlePan(_ gestureRecognizer: UIPanGestureRecognizer) {
@@ -406,11 +462,28 @@ class ReplateCameraView: UIView, ARSessionDelegate {
406
462
  }
407
463
 
408
464
  private static func tearDownARSession() {
465
+ guard isSessionActive else { return }
466
+
409
467
  arView?.session.pause()
410
468
  arView?.session.delegate = nil
411
469
  arView?.scene.anchors.removeAll()
412
470
  arView?.removeFromSuperview()
413
471
  arView?.window?.resignKey()
472
+
473
+ // Properly terminate the session
474
+ if let session = arView?.session {
475
+ session.pause()
476
+ // Clear all session data
477
+ arView?.session.delegate = nil
478
+ }
479
+
480
+ // Stop motion manager
481
+ motionManager?.stopDeviceMotionUpdates()
482
+
483
+ // Mark session as inactive
484
+ isSessionActive = false
485
+
486
+ print("[ReplateCameraView] AR session properly terminated")
414
487
  }
415
488
 
416
489
  private static func resetProperties() {
@@ -429,6 +502,13 @@ class ReplateCameraView: UIView, ARSessionDelegate {
429
502
  gravityVector = [:]
430
503
  ReplateCameraView.spherePrototype = nil
431
504
  ReplateCameraController.wasOutOfRange = false
505
+
506
+ // Reset tap handling state
507
+ isProcessingTap = false
508
+ lastTapTime = 0
509
+
510
+ // Reset session state
511
+ isSessionActive = false
432
512
 
433
513
  // Clean up temporary files to free disk space
434
514
  cleanupTemporaryFiles()
@@ -537,11 +617,22 @@ class ReplateCameraView: UIView, ARSessionDelegate {
537
617
  func sessionWasInterrupted(_ session: ARSession) {
538
618
  print("SESSION INTERRUPTED")
539
619
  ReplateCameraView.motionManager.stopDeviceMotionUpdates()
620
+
621
+ // Properly pause the session to save resources
622
+ session.pause()
623
+ ReplateCameraView.isSessionActive = false
624
+ print("[ReplateCameraView] AR session paused due to interruption")
540
625
  }
541
626
 
542
627
  func sessionInterruptionEnded(_ session: ARSession) {
543
628
  print("SESSION RESUMED")
544
- ReplateCameraView.INSTANCE.startDeviceMotionUpdates()
629
+
630
+ // Only resume if we should still be active
631
+ if !ReplateCameraView.isResetting && ReplateCameraView.INSTANCE != nil {
632
+ ReplateCameraView.INSTANCE.startDeviceMotionUpdates()
633
+ ReplateCameraView.isSessionActive = true
634
+ print("[ReplateCameraView] AR session resumed after interruption")
635
+ }
545
636
  }
546
637
 
547
638
  func generateImpactFeedback(strength: UIImpactFeedbackGenerator.FeedbackStyle) {
@@ -568,6 +659,62 @@ class ReplateCameraView: UIView, ARSessionDelegate {
568
659
  }
569
660
  }
570
661
  }
662
+
663
+ // MARK: - Lifecycle Management
664
+ private func setupAppStateObservers() {
665
+ NotificationCenter.default.addObserver(
666
+ self,
667
+ selector: #selector(appDidEnterBackground),
668
+ name: UIApplication.didEnterBackgroundNotification,
669
+ object: nil
670
+ )
671
+
672
+ NotificationCenter.default.addObserver(
673
+ self,
674
+ selector: #selector(appWillEnterForeground),
675
+ name: UIApplication.willEnterForegroundNotification,
676
+ object: nil
677
+ )
678
+ }
679
+
680
+ @objc private func appDidEnterBackground() {
681
+ print("[ReplateCameraView] App entered background - pausing AR session")
682
+ pauseSession()
683
+ }
684
+
685
+ @objc private func appWillEnterForeground() {
686
+ print("[ReplateCameraView] App entering foreground - resuming AR session")
687
+ resumeSession()
688
+ }
689
+
690
+ private func pauseSession() {
691
+ guard ReplateCameraView.isSessionActive else { return }
692
+
693
+ ReplateCameraView.arView?.session.pause()
694
+ ReplateCameraView.motionManager?.stopDeviceMotionUpdates()
695
+ ReplateCameraView.isSessionActive = false
696
+ print("[ReplateCameraView] AR session paused")
697
+ }
698
+
699
+ private func resumeSession() {
700
+ guard !ReplateCameraView.isSessionActive && !ReplateCameraView.isResetting else { return }
701
+ guard ReplateCameraView.arView != nil else { return }
702
+
703
+ let configuration = ARWorldTrackingConfiguration()
704
+ configuration.isLightEstimationEnabled = true
705
+ configuration.planeDetection = .horizontal
706
+
707
+ ReplateCameraView.arView?.session.run(configuration)
708
+ startDeviceMotionUpdates()
709
+ ReplateCameraView.isSessionActive = true
710
+ print("[ReplateCameraView] AR session resumed")
711
+ }
712
+
713
+ deinit {
714
+ NotificationCenter.default.removeObserver(self)
715
+ pauseSession()
716
+ print("[ReplateCameraView] Component deinit - AR session cleaned up")
717
+ }
571
718
 
572
719
  }
573
720
 
@@ -771,6 +918,27 @@ class ReplateCameraController: NSObject {
771
918
  ReplateCameraView.reset()
772
919
  }
773
920
  }
921
+
922
+ @objc
923
+ func pauseSession() {
924
+ DispatchQueue.main.async {
925
+ ReplateCameraView.INSTANCE?.pauseSession()
926
+ }
927
+ }
928
+
929
+ @objc
930
+ func resumeSession() {
931
+ DispatchQueue.main.async {
932
+ ReplateCameraView.INSTANCE?.resumeSession()
933
+ }
934
+ }
935
+
936
+ @objc
937
+ func stopSession() {
938
+ DispatchQueue.main.async {
939
+ ReplateCameraView.tearDownARSession()
940
+ }
941
+ }
774
942
 
775
943
  @objc(getMemoryUsage:rejecter:)
776
944
  func getMemoryUsage(_ resolver: RCTPromiseResolveBlock, rejecter: RCTPromiseRejectBlock) {
@@ -8,6 +8,7 @@ exports.getMemoryUsage = getMemoryUsage;
8
8
  exports.getPhotosCount = getPhotosCount;
9
9
  exports.getRemainingAnglesToScan = getRemainingAnglesToScan;
10
10
  exports.isScanComplete = isScanComplete;
11
+ exports.pauseSession = pauseSession;
11
12
  exports.registerAnchorSetCallback = registerAnchorSetCallback;
12
13
  exports.registerBackInRangeCallback = registerBackInRangeCallback;
13
14
  exports.registerCompletedLowerSpheresCallback = registerCompletedLowerSpheresCallback;
@@ -17,6 +18,8 @@ exports.registerOpenedTutorialCallback = registerOpenedTutorialCallback;
17
18
  exports.registerTooCloseCallback = registerTooCloseCallback;
18
19
  exports.registerTooFarCallback = registerTooFarCallback;
19
20
  exports.reset = reset;
21
+ exports.resumeSession = resumeSession;
22
+ exports.stopSession = stopSession;
20
23
  exports.takePhoto = takePhoto;
21
24
  var _reactNative = require("react-native");
22
25
  const LINKING_ERROR = `The package 'replate-camera' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
@@ -74,4 +77,13 @@ function getMemoryUsage() {
74
77
  function reset() {
75
78
  ReplateCameraModule.reset();
76
79
  }
80
+ function pauseSession() {
81
+ ReplateCameraModule.pauseSession();
82
+ }
83
+ function resumeSession() {
84
+ ReplateCameraModule.resumeSession();
85
+ }
86
+ function stopSession() {
87
+ ReplateCameraModule.stopSession();
88
+ }
77
89
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","ComponentName","ReplateCameraView","exports","UIManager","getViewManagerConfig","requireNativeComponent","Error","ReplateCameraModule","NativeModules","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAQA,MAAMC,aAAa,GAChB,yEAAwE,GACzEC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAQjC,MAAMC,aAAa,GAAG,mBAAmB;AAElC,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAC5BE,sBAAS,CAACC,oBAAoB,CAACJ,aAAa,CAAC,IAAI,IAAI,GACjD,IAAAK,mCAAsB,EAAqBL,aAAa,CAAC,GACzD,MAAM;EACJ,MAAM,IAAIM,KAAK,CAACX,aAAa,CAAC;AAChC,CAAC;AAEA,MAAMY,mBAAmB,GAAAL,OAAA,CAAAK,mBAAA,GAAGC,0BAAa,CAACC,uBAAuB,GACpED,0BAAa,CAACC,uBAAuB,GACrC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIL,KAAK,CAACX,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEE,SAASiB,SAASA,CAACC,SAAkB,EAAmB;EAC7D,OAAON,mBAAmB,CAACK,SAAS,CAACC,SAAS,CAAC;AACjD;AAEO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAOP,mBAAmB,CAACO,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,wBAAwBA,CAAA,EAAoB;EAC1D,OAAOR,mBAAmB,CAACQ,wBAAwB,CAAC,CAAC;AACvD;AAEO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOT,mBAAmB,CAACS,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,iCAAiCA,CAACC,QAAoB,EAAE;EACtEX,mBAAmB,CAACU,iCAAiC,CAACC,QAAQ,CAAC;AACjE;AAEO,SAASC,yBAAyBA,CAACD,QAAoB,EAAE;EAC9DX,mBAAmB,CAACY,yBAAyB,CAACD,QAAQ,CAAC;AACzD;AAEO,SAASE,qCAAqCA,CAACF,QAAoB,EAAE;EAC1EX,mBAAmB,CAACa,qCAAqC,CAACF,QAAQ,CAAC;AACrE;AAEO,SAASG,qCAAqCA,CAACH,QAAoB,EAAE;EAC1EX,mBAAmB,CAACc,qCAAqC,CAACH,QAAQ,CAAC;AACrE;AAEO,SAASI,8BAA8BA,CAACJ,QAAoB,EAAE;EACnEX,mBAAmB,CAACe,8BAA8B,CAACJ,QAAQ,CAAC;AAC9D;AAEO,SAASK,sBAAsBA,CAACL,QAAoB,EAAE;EAC3DX,mBAAmB,CAACgB,sBAAsB,CAACL,QAAQ,CAAC;AACtD;AAEO,SAASM,wBAAwBA,CAACN,QAAoB,EAAE;EAC7DX,mBAAmB,CAACiB,wBAAwB,CAACN,QAAQ,CAAC;AACxD;AAEO,SAASO,2BAA2BA,CAACP,QAAoB,EAAE;EAChEX,mBAAmB,CAACkB,2BAA2B,CAACP,QAAQ,CAAC;AAC3D;AAEO,SAASQ,cAAcA,CAAA,EAAqC;EACjE,OAAOnB,mBAAmB,CAACmB,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,KAAKA,CAAA,EAAG;EACtBpB,mBAAmB,CAACoB,KAAK,CAAC,CAAC;AAC7B","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","ComponentName","ReplateCameraView","exports","UIManager","getViewManagerConfig","requireNativeComponent","Error","ReplateCameraModule","NativeModules","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset","pauseSession","resumeSession","stopSession"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAQA,MAAMC,aAAa,GAChB,yEAAwE,GACzEC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAQjC,MAAMC,aAAa,GAAG,mBAAmB;AAElC,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAC5BE,sBAAS,CAACC,oBAAoB,CAACJ,aAAa,CAAC,IAAI,IAAI,GACjD,IAAAK,mCAAsB,EAAqBL,aAAa,CAAC,GACzD,MAAM;EACJ,MAAM,IAAIM,KAAK,CAACX,aAAa,CAAC;AAChC,CAAC;AAEA,MAAMY,mBAAmB,GAAAL,OAAA,CAAAK,mBAAA,GAAGC,0BAAa,CAACC,uBAAuB,GACpED,0BAAa,CAACC,uBAAuB,GACrC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIL,KAAK,CAACX,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEE,SAASiB,SAASA,CAACC,SAAkB,EAAmB;EAC7D,OAAON,mBAAmB,CAACK,SAAS,CAACC,SAAS,CAAC;AACjD;AAEO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAOP,mBAAmB,CAACO,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,wBAAwBA,CAAA,EAAoB;EAC1D,OAAOR,mBAAmB,CAACQ,wBAAwB,CAAC,CAAC;AACvD;AAEO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOT,mBAAmB,CAACS,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,iCAAiCA,CAACC,QAAoB,EAAE;EACtEX,mBAAmB,CAACU,iCAAiC,CAACC,QAAQ,CAAC;AACjE;AAEO,SAASC,yBAAyBA,CAACD,QAAoB,EAAE;EAC9DX,mBAAmB,CAACY,yBAAyB,CAACD,QAAQ,CAAC;AACzD;AAEO,SAASE,qCAAqCA,CAACF,QAAoB,EAAE;EAC1EX,mBAAmB,CAACa,qCAAqC,CAACF,QAAQ,CAAC;AACrE;AAEO,SAASG,qCAAqCA,CAACH,QAAoB,EAAE;EAC1EX,mBAAmB,CAACc,qCAAqC,CAACH,QAAQ,CAAC;AACrE;AAEO,SAASI,8BAA8BA,CAACJ,QAAoB,EAAE;EACnEX,mBAAmB,CAACe,8BAA8B,CAACJ,QAAQ,CAAC;AAC9D;AAEO,SAASK,sBAAsBA,CAACL,QAAoB,EAAE;EAC3DX,mBAAmB,CAACgB,sBAAsB,CAACL,QAAQ,CAAC;AACtD;AAEO,SAASM,wBAAwBA,CAACN,QAAoB,EAAE;EAC7DX,mBAAmB,CAACiB,wBAAwB,CAACN,QAAQ,CAAC;AACxD;AAEO,SAASO,2BAA2BA,CAACP,QAAoB,EAAE;EAChEX,mBAAmB,CAACkB,2BAA2B,CAACP,QAAQ,CAAC;AAC3D;AAEO,SAASQ,cAAcA,CAAA,EAAqC;EACjE,OAAOnB,mBAAmB,CAACmB,cAAc,CAAC,CAAC;AAC7C;AAEO,SAASC,KAAKA,CAAA,EAAG;EACtBpB,mBAAmB,CAACoB,KAAK,CAAC,CAAC;AAC7B;AAEO,SAASC,YAAYA,CAAA,EAAG;EAC7BrB,mBAAmB,CAACqB,YAAY,CAAC,CAAC;AACpC;AAEO,SAASC,aAAaA,CAAA,EAAG;EAC9BtB,mBAAmB,CAACsB,aAAa,CAAC,CAAC;AACrC;AAEO,SAASC,WAAWA,CAAA,EAAG;EAC5BvB,mBAAmB,CAACuB,WAAW,CAAC,CAAC;AACnC","ignoreList":[]}
@@ -54,4 +54,13 @@ export function getMemoryUsage() {
54
54
  export function reset() {
55
55
  ReplateCameraModule.reset();
56
56
  }
57
+ export function pauseSession() {
58
+ ReplateCameraModule.pauseSession();
59
+ }
60
+ export function resumeSession() {
61
+ ReplateCameraModule.resumeSession();
62
+ }
63
+ export function stopSession() {
64
+ ReplateCameraModule.stopSession();
65
+ }
57
66
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["requireNativeComponent","UIManager","Platform","NativeModules","LINKING_ERROR","select","ios","default","ComponentName","ReplateCameraView","getViewManagerConfig","Error","ReplateCameraModule","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SACEA,sBAAsB,EACtBC,SAAS,EACTC,QAAQ,EAERC,aAAa,QACR,cAAc;AAErB,MAAMC,aAAa,GAChB,yEAAwE,GACzEF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAQjC,MAAMC,aAAa,GAAG,mBAAmB;AAEzC,OAAO,MAAMC,iBAAiB,GAC5BR,SAAS,CAACS,oBAAoB,CAACF,aAAa,CAAC,IAAI,IAAI,GACjDR,sBAAsB,CAAqBQ,aAAa,CAAC,GACzD,MAAM;EACJ,MAAM,IAAIG,KAAK,CAACP,aAAa,CAAC;AAChC,CAAC;AAEP,OAAO,MAAMQ,mBAAmB,GAAGT,aAAa,CAACU,uBAAuB,GACpEV,aAAa,CAACU,uBAAuB,GACrC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIJ,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,OAAO,SAASY,SAASA,CAACC,SAAkB,EAAmB;EAC7D,OAAOL,mBAAmB,CAACI,SAAS,CAACC,SAAS,CAAC;AACjD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAON,mBAAmB,CAACM,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,wBAAwBA,CAAA,EAAoB;EAC1D,OAAOP,mBAAmB,CAACO,wBAAwB,CAAC,CAAC;AACvD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOR,mBAAmB,CAACQ,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,iCAAiCA,CAACC,QAAoB,EAAE;EACtEV,mBAAmB,CAACS,iCAAiC,CAACC,QAAQ,CAAC;AACjE;AAEA,OAAO,SAASC,yBAAyBA,CAACD,QAAoB,EAAE;EAC9DV,mBAAmB,CAACW,yBAAyB,CAACD,QAAQ,CAAC;AACzD;AAEA,OAAO,SAASE,qCAAqCA,CAACF,QAAoB,EAAE;EAC1EV,mBAAmB,CAACY,qCAAqC,CAACF,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASG,qCAAqCA,CAACH,QAAoB,EAAE;EAC1EV,mBAAmB,CAACa,qCAAqC,CAACH,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASI,8BAA8BA,CAACJ,QAAoB,EAAE;EACnEV,mBAAmB,CAACc,8BAA8B,CAACJ,QAAQ,CAAC;AAC9D;AAEA,OAAO,SAASK,sBAAsBA,CAACL,QAAoB,EAAE;EAC3DV,mBAAmB,CAACe,sBAAsB,CAACL,QAAQ,CAAC;AACtD;AAEA,OAAO,SAASM,wBAAwBA,CAACN,QAAoB,EAAE;EAC7DV,mBAAmB,CAACgB,wBAAwB,CAACN,QAAQ,CAAC;AACxD;AAEA,OAAO,SAASO,2BAA2BA,CAACP,QAAoB,EAAE;EAChEV,mBAAmB,CAACiB,2BAA2B,CAACP,QAAQ,CAAC;AAC3D;AAEA,OAAO,SAASQ,cAAcA,CAAA,EAAqC;EACjE,OAAOlB,mBAAmB,CAACkB,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,KAAKA,CAAA,EAAG;EACtBnB,mBAAmB,CAACmB,KAAK,CAAC,CAAC;AAC7B","ignoreList":[]}
1
+ {"version":3,"names":["requireNativeComponent","UIManager","Platform","NativeModules","LINKING_ERROR","select","ios","default","ComponentName","ReplateCameraView","getViewManagerConfig","Error","ReplateCameraModule","ReplateCameraController","Proxy","get","takePhoto","unlimited","getPhotosCount","getRemainingAnglesToScan","isScanComplete","registerCompletedTutorialCallback","callback","registerAnchorSetCallback","registerCompletedUpperSpheresCallback","registerCompletedLowerSpheresCallback","registerOpenedTutorialCallback","registerTooFarCallback","registerTooCloseCallback","registerBackInRangeCallback","getMemoryUsage","reset","pauseSession","resumeSession","stopSession"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"AAAA,SACEA,sBAAsB,EACtBC,SAAS,EACTC,QAAQ,EAERC,aAAa,QACR,cAAc;AAErB,MAAMC,aAAa,GAChB,yEAAwE,GACzEF,QAAQ,CAACG,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAQjC,MAAMC,aAAa,GAAG,mBAAmB;AAEzC,OAAO,MAAMC,iBAAiB,GAC5BR,SAAS,CAACS,oBAAoB,CAACF,aAAa,CAAC,IAAI,IAAI,GACjDR,sBAAsB,CAAqBQ,aAAa,CAAC,GACzD,MAAM;EACJ,MAAM,IAAIG,KAAK,CAACP,aAAa,CAAC;AAChC,CAAC;AAEP,OAAO,MAAMQ,mBAAmB,GAAGT,aAAa,CAACU,uBAAuB,GACpEV,aAAa,CAACU,uBAAuB,GACrC,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIJ,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEL,OAAO,SAASY,SAASA,CAACC,SAAkB,EAAmB;EAC7D,OAAOL,mBAAmB,CAACI,SAAS,CAACC,SAAS,CAAC;AACjD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAoB;EAChD,OAAON,mBAAmB,CAACM,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,wBAAwBA,CAAA,EAAoB;EAC1D,OAAOP,mBAAmB,CAACO,wBAAwB,CAAC,CAAC;AACvD;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAqB;EACjD,OAAOR,mBAAmB,CAACQ,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,iCAAiCA,CAACC,QAAoB,EAAE;EACtEV,mBAAmB,CAACS,iCAAiC,CAACC,QAAQ,CAAC;AACjE;AAEA,OAAO,SAASC,yBAAyBA,CAACD,QAAoB,EAAE;EAC9DV,mBAAmB,CAACW,yBAAyB,CAACD,QAAQ,CAAC;AACzD;AAEA,OAAO,SAASE,qCAAqCA,CAACF,QAAoB,EAAE;EAC1EV,mBAAmB,CAACY,qCAAqC,CAACF,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASG,qCAAqCA,CAACH,QAAoB,EAAE;EAC1EV,mBAAmB,CAACa,qCAAqC,CAACH,QAAQ,CAAC;AACrE;AAEA,OAAO,SAASI,8BAA8BA,CAACJ,QAAoB,EAAE;EACnEV,mBAAmB,CAACc,8BAA8B,CAACJ,QAAQ,CAAC;AAC9D;AAEA,OAAO,SAASK,sBAAsBA,CAACL,QAAoB,EAAE;EAC3DV,mBAAmB,CAACe,sBAAsB,CAACL,QAAQ,CAAC;AACtD;AAEA,OAAO,SAASM,wBAAwBA,CAACN,QAAoB,EAAE;EAC7DV,mBAAmB,CAACgB,wBAAwB,CAACN,QAAQ,CAAC;AACxD;AAEA,OAAO,SAASO,2BAA2BA,CAACP,QAAoB,EAAE;EAChEV,mBAAmB,CAACiB,2BAA2B,CAACP,QAAQ,CAAC;AAC3D;AAEA,OAAO,SAASQ,cAAcA,CAAA,EAAqC;EACjE,OAAOlB,mBAAmB,CAACkB,cAAc,CAAC,CAAC;AAC7C;AAEA,OAAO,SAASC,KAAKA,CAAA,EAAG;EACtBnB,mBAAmB,CAACmB,KAAK,CAAC,CAAC;AAC7B;AAEA,OAAO,SAASC,YAAYA,CAAA,EAAG;EAC7BpB,mBAAmB,CAACoB,YAAY,CAAC,CAAC;AACpC;AAEA,OAAO,SAASC,aAAaA,CAAA,EAAG;EAC9BrB,mBAAmB,CAACqB,aAAa,CAAC,CAAC;AACrC;AAEA,OAAO,SAASC,WAAWA,CAAA,EAAG;EAC5BtB,mBAAmB,CAACsB,WAAW,CAAC,CAAC;AACnC","ignoreList":[]}
@@ -21,5 +21,8 @@ export declare function getMemoryUsage(): Promise<{
21
21
  memoryUsageMB: number;
22
22
  }>;
23
23
  export declare function reset(): void;
24
+ export declare function pauseSession(): void;
25
+ export declare function resumeSession(): void;
26
+ export declare function stopSession(): void;
24
27
  export {};
25
28
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,cAAc,CAAC;AAQtB,KAAK,kBAAkB,GAAG;IAExB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,iBAAiB,0EAKvB,CAAC;AAER,eAAO,MAAM,mBAAmB,KAS3B,CAAC;AAEN,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjD;AAED,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAErE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE7D;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAElE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE1D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE5D;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE/D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC,CAAC,CAEjE;AAED,wBAAgB,KAAK,SAEpB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,SAAS,EAEf,MAAM,cAAc,CAAC;AAQtB,KAAK,kBAAkB,GAAG;IAExB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;CAClB,CAAC;AAIF,eAAO,MAAM,iBAAiB,0EAKvB,CAAC;AAER,eAAO,MAAM,mBAAmB,KAS3B,CAAC;AAEN,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAEjD;AAED,wBAAgB,iCAAiC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAErE;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE7D;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,qCAAqC,CAAC,QAAQ,EAAE,MAAM,IAAI,QAEzE;AAED,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAElE;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE1D;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE5D;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,IAAI,QAE/D;AAED,wBAAgB,cAAc,IAAI,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAC,CAAC,CAEjE;AAED,wBAAgB,KAAK,SAEpB;AAED,wBAAgB,YAAY,SAE3B;AAED,wBAAgB,aAAa,SAE5B;AAED,wBAAgB,WAAW,SAE1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replate-camera",
3
- "version": "0.14.2",
3
+ "version": "0.14.3",
4
4
  "description": "Camera component for Replate Manager",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
package/src/index.tsx CHANGED
@@ -93,3 +93,15 @@ export function getMemoryUsage(): Promise<{memoryUsageMB: number}> {
93
93
  export function reset() {
94
94
  ReplateCameraModule.reset();
95
95
  }
96
+
97
+ export function pauseSession() {
98
+ ReplateCameraModule.pauseSession();
99
+ }
100
+
101
+ export function resumeSession() {
102
+ ReplateCameraModule.resumeSession();
103
+ }
104
+
105
+ export function stopSession() {
106
+ ReplateCameraModule.stopSession();
107
+ }
@@ -1,383 +0,0 @@
1
- // !$*UTF8*$!
2
- {
3
- archiveVersion = 1;
4
- classes = {
5
- };
6
- objectVersion = 52;
7
- objects = {
8
-
9
- /* Begin PBXBuildFile section */
10
- F301E0D1231462A90028AAF1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F301E0D0231462A90028AAF1 /* AppDelegate.swift */; };
11
- F301E0D3231462A90028AAF1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F301E0D2231462A90028AAF1 /* ContentView.swift */; };
12
- F301E0D7231462AB0028AAF1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F301E0D6231462AB0028AAF1 /* Assets.xcassets */; };
13
- F301E0DA231462AB0028AAF1 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F301E0D9231462AB0028AAF1 /* Preview Assets.xcassets */; };
14
- F301E0DD231462AB0028AAF1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F301E0DB231462AB0028AAF1 /* LaunchScreen.storyboard */; };
15
- F301E0E5231462D90028AAF1 /* FocusARView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F301E0E4231462D90028AAF1 /* FocusARView.swift */; };
16
- F339DB65275013C700D9A2B2 /* FocusEntity in Frameworks */ = {isa = PBXBuildFile; productRef = F339DB64275013C700D9A2B2 /* FocusEntity */; };
17
- F385E0D229E74E97007CF478 /* BasicARView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F385E0D129E74E97007CF478 /* BasicARView.swift */; };
18
- /* End PBXBuildFile section */
19
-
20
- /* Begin PBXFileReference section */
21
- F301E0CD231462A90028AAF1 /* FocusEntity-Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "FocusEntity-Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
22
- F301E0D0231462A90028AAF1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
23
- F301E0D2231462A90028AAF1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
24
- F301E0D6231462AB0028AAF1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
25
- F301E0D9231462AB0028AAF1 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
26
- F301E0DC231462AB0028AAF1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
27
- F301E0DE231462AB0028AAF1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
28
- F301E0E4231462D90028AAF1 /* FocusARView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusARView.swift; sourceTree = "<group>"; };
29
- F339DB622750138A00D9A2B2 /* FocusEntity */ = {isa = PBXFileReference; lastKnownFileType = folder; name = FocusEntity; path = ..; sourceTree = "<group>"; };
30
- F385E0D129E74E97007CF478 /* BasicARView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicARView.swift; sourceTree = "<group>"; };
31
- /* End PBXFileReference section */
32
-
33
- /* Begin PBXFrameworksBuildPhase section */
34
- F301E0CA231462A90028AAF1 /* Frameworks */ = {
35
- isa = PBXFrameworksBuildPhase;
36
- buildActionMask = 2147483647;
37
- files = (
38
- F339DB65275013C700D9A2B2 /* FocusEntity in Frameworks */,
39
- );
40
- runOnlyForDeploymentPostprocessing = 0;
41
- };
42
- /* End PBXFrameworksBuildPhase section */
43
-
44
- /* Begin PBXGroup section */
45
- F301E0C4231462A90028AAF1 = {
46
- isa = PBXGroup;
47
- children = (
48
- F339DB612750138A00D9A2B2 /* Packages */,
49
- F301E0CF231462A90028AAF1 /* FocusEntity-Example */,
50
- F301E0CE231462A90028AAF1 /* Products */,
51
- F339DB63275013C700D9A2B2 /* Frameworks */,
52
- );
53
- sourceTree = "<group>";
54
- };
55
- F301E0CE231462A90028AAF1 /* Products */ = {
56
- isa = PBXGroup;
57
- children = (
58
- F301E0CD231462A90028AAF1 /* FocusEntity-Example.app */,
59
- );
60
- name = Products;
61
- sourceTree = "<group>";
62
- };
63
- F301E0CF231462A90028AAF1 /* FocusEntity-Example */ = {
64
- isa = PBXGroup;
65
- children = (
66
- F301E0D0231462A90028AAF1 /* AppDelegate.swift */,
67
- F301E0D2231462A90028AAF1 /* ContentView.swift */,
68
- F385E0D129E74E97007CF478 /* BasicARView.swift */,
69
- F301E0E4231462D90028AAF1 /* FocusARView.swift */,
70
- F301E0D6231462AB0028AAF1 /* Assets.xcassets */,
71
- F301E0DB231462AB0028AAF1 /* LaunchScreen.storyboard */,
72
- F301E0DE231462AB0028AAF1 /* Info.plist */,
73
- F301E0D8231462AB0028AAF1 /* Preview Content */,
74
- );
75
- path = "FocusEntity-Example";
76
- sourceTree = "<group>";
77
- };
78
- F301E0D8231462AB0028AAF1 /* Preview Content */ = {
79
- isa = PBXGroup;
80
- children = (
81
- F301E0D9231462AB0028AAF1 /* Preview Assets.xcassets */,
82
- );
83
- path = "Preview Content";
84
- sourceTree = "<group>";
85
- };
86
- F339DB612750138A00D9A2B2 /* Packages */ = {
87
- isa = PBXGroup;
88
- children = (
89
- F339DB622750138A00D9A2B2 /* FocusEntity */,
90
- );
91
- name = Packages;
92
- sourceTree = "<group>";
93
- };
94
- F339DB63275013C700D9A2B2 /* Frameworks */ = {
95
- isa = PBXGroup;
96
- children = (
97
- );
98
- name = Frameworks;
99
- sourceTree = "<group>";
100
- };
101
- /* End PBXGroup section */
102
-
103
- /* Begin PBXNativeTarget section */
104
- F301E0CC231462A90028AAF1 /* FocusEntity-Example */ = {
105
- isa = PBXNativeTarget;
106
- buildConfigurationList = F301E0E1231462AB0028AAF1 /* Build configuration list for PBXNativeTarget "FocusEntity-Example" */;
107
- buildPhases = (
108
- F301E0C9231462A90028AAF1 /* Sources */,
109
- F301E0CA231462A90028AAF1 /* Frameworks */,
110
- F301E0CB231462A90028AAF1 /* Resources */,
111
- );
112
- buildRules = (
113
- );
114
- dependencies = (
115
- );
116
- name = "FocusEntity-Example";
117
- packageProductDependencies = (
118
- F339DB64275013C700D9A2B2 /* FocusEntity */,
119
- );
120
- productName = "FocusEntity-Example";
121
- productReference = F301E0CD231462A90028AAF1 /* FocusEntity-Example.app */;
122
- productType = "com.apple.product-type.application";
123
- };
124
- /* End PBXNativeTarget section */
125
-
126
- /* Begin PBXProject section */
127
- F301E0C5231462A90028AAF1 /* Project object */ = {
128
- isa = PBXProject;
129
- attributes = {
130
- LastSwiftUpdateCheck = 1100;
131
- LastUpgradeCheck = 1100;
132
- ORGANIZATIONNAME = "Max Cobb";
133
- TargetAttributes = {
134
- F301E0CC231462A90028AAF1 = {
135
- CreatedOnToolsVersion = 11.0;
136
- };
137
- };
138
- };
139
- buildConfigurationList = F301E0C8231462A90028AAF1 /* Build configuration list for PBXProject "FocusEntity-Example" */;
140
- compatibilityVersion = "Xcode 9.3";
141
- developmentRegion = en;
142
- hasScannedForEncodings = 0;
143
- knownRegions = (
144
- en,
145
- Base,
146
- );
147
- mainGroup = F301E0C4231462A90028AAF1;
148
- packageReferences = (
149
- );
150
- productRefGroup = F301E0CE231462A90028AAF1 /* Products */;
151
- projectDirPath = "";
152
- projectRoot = "";
153
- targets = (
154
- F301E0CC231462A90028AAF1 /* FocusEntity-Example */,
155
- );
156
- };
157
- /* End PBXProject section */
158
-
159
- /* Begin PBXResourcesBuildPhase section */
160
- F301E0CB231462A90028AAF1 /* Resources */ = {
161
- isa = PBXResourcesBuildPhase;
162
- buildActionMask = 2147483647;
163
- files = (
164
- F301E0DD231462AB0028AAF1 /* LaunchScreen.storyboard in Resources */,
165
- F301E0DA231462AB0028AAF1 /* Preview Assets.xcassets in Resources */,
166
- F301E0D7231462AB0028AAF1 /* Assets.xcassets in Resources */,
167
- );
168
- runOnlyForDeploymentPostprocessing = 0;
169
- };
170
- /* End PBXResourcesBuildPhase section */
171
-
172
- /* Begin PBXSourcesBuildPhase section */
173
- F301E0C9231462A90028AAF1 /* Sources */ = {
174
- isa = PBXSourcesBuildPhase;
175
- buildActionMask = 2147483647;
176
- files = (
177
- F385E0D229E74E97007CF478 /* BasicARView.swift in Sources */,
178
- F301E0D3231462A90028AAF1 /* ContentView.swift in Sources */,
179
- F301E0D1231462A90028AAF1 /* AppDelegate.swift in Sources */,
180
- F301E0E5231462D90028AAF1 /* FocusARView.swift in Sources */,
181
- );
182
- runOnlyForDeploymentPostprocessing = 0;
183
- };
184
- /* End PBXSourcesBuildPhase section */
185
-
186
- /* Begin PBXVariantGroup section */
187
- F301E0DB231462AB0028AAF1 /* LaunchScreen.storyboard */ = {
188
- isa = PBXVariantGroup;
189
- children = (
190
- F301E0DC231462AB0028AAF1 /* Base */,
191
- );
192
- name = LaunchScreen.storyboard;
193
- sourceTree = "<group>";
194
- };
195
- /* End PBXVariantGroup section */
196
-
197
- /* Begin XCBuildConfiguration section */
198
- F301E0DF231462AB0028AAF1 /* Debug */ = {
199
- isa = XCBuildConfiguration;
200
- buildSettings = {
201
- ALWAYS_SEARCH_USER_PATHS = NO;
202
- CLANG_ANALYZER_NONNULL = YES;
203
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
204
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
205
- CLANG_CXX_LIBRARY = "libc++";
206
- CLANG_ENABLE_MODULES = YES;
207
- CLANG_ENABLE_OBJC_ARC = YES;
208
- CLANG_ENABLE_OBJC_WEAK = YES;
209
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
210
- CLANG_WARN_BOOL_CONVERSION = YES;
211
- CLANG_WARN_COMMA = YES;
212
- CLANG_WARN_CONSTANT_CONVERSION = YES;
213
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
214
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
215
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
216
- CLANG_WARN_EMPTY_BODY = YES;
217
- CLANG_WARN_ENUM_CONVERSION = YES;
218
- CLANG_WARN_INFINITE_RECURSION = YES;
219
- CLANG_WARN_INT_CONVERSION = YES;
220
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
221
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
222
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
223
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
224
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
225
- CLANG_WARN_STRICT_PROTOTYPES = YES;
226
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
227
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
228
- CLANG_WARN_UNREACHABLE_CODE = YES;
229
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
230
- COPY_PHASE_STRIP = NO;
231
- DEBUG_INFORMATION_FORMAT = dwarf;
232
- ENABLE_STRICT_OBJC_MSGSEND = YES;
233
- ENABLE_TESTABILITY = YES;
234
- GCC_C_LANGUAGE_STANDARD = gnu11;
235
- GCC_DYNAMIC_NO_PIC = NO;
236
- GCC_NO_COMMON_BLOCKS = YES;
237
- GCC_OPTIMIZATION_LEVEL = 0;
238
- GCC_PREPROCESSOR_DEFINITIONS = (
239
- "DEBUG=1",
240
- "$(inherited)",
241
- );
242
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
243
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
244
- GCC_WARN_UNDECLARED_SELECTOR = YES;
245
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
246
- GCC_WARN_UNUSED_FUNCTION = YES;
247
- GCC_WARN_UNUSED_VARIABLE = YES;
248
- IPHONEOS_DEPLOYMENT_TARGET = 13.0;
249
- MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
250
- MTL_FAST_MATH = YES;
251
- ONLY_ACTIVE_ARCH = YES;
252
- SDKROOT = iphoneos;
253
- SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
254
- SWIFT_OPTIMIZATION_LEVEL = "-Onone";
255
- };
256
- name = Debug;
257
- };
258
- F301E0E0231462AB0028AAF1 /* Release */ = {
259
- isa = XCBuildConfiguration;
260
- buildSettings = {
261
- ALWAYS_SEARCH_USER_PATHS = NO;
262
- CLANG_ANALYZER_NONNULL = YES;
263
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
264
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
265
- CLANG_CXX_LIBRARY = "libc++";
266
- CLANG_ENABLE_MODULES = YES;
267
- CLANG_ENABLE_OBJC_ARC = YES;
268
- CLANG_ENABLE_OBJC_WEAK = YES;
269
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
270
- CLANG_WARN_BOOL_CONVERSION = YES;
271
- CLANG_WARN_COMMA = YES;
272
- CLANG_WARN_CONSTANT_CONVERSION = YES;
273
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
274
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
275
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
276
- CLANG_WARN_EMPTY_BODY = YES;
277
- CLANG_WARN_ENUM_CONVERSION = YES;
278
- CLANG_WARN_INFINITE_RECURSION = YES;
279
- CLANG_WARN_INT_CONVERSION = YES;
280
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
281
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
282
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
283
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
284
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
285
- CLANG_WARN_STRICT_PROTOTYPES = YES;
286
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
287
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
288
- CLANG_WARN_UNREACHABLE_CODE = YES;
289
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
290
- COPY_PHASE_STRIP = NO;
291
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
292
- ENABLE_NS_ASSERTIONS = NO;
293
- ENABLE_STRICT_OBJC_MSGSEND = YES;
294
- GCC_C_LANGUAGE_STANDARD = gnu11;
295
- GCC_NO_COMMON_BLOCKS = YES;
296
- GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
297
- GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
298
- GCC_WARN_UNDECLARED_SELECTOR = YES;
299
- GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
300
- GCC_WARN_UNUSED_FUNCTION = YES;
301
- GCC_WARN_UNUSED_VARIABLE = YES;
302
- IPHONEOS_DEPLOYMENT_TARGET = 13.0;
303
- MTL_ENABLE_DEBUG_INFO = NO;
304
- MTL_FAST_MATH = YES;
305
- SDKROOT = iphoneos;
306
- SWIFT_COMPILATION_MODE = wholemodule;
307
- SWIFT_OPTIMIZATION_LEVEL = "-O";
308
- VALIDATE_PRODUCT = YES;
309
- };
310
- name = Release;
311
- };
312
- F301E0E2231462AB0028AAF1 /* Debug */ = {
313
- isa = XCBuildConfiguration;
314
- buildSettings = {
315
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
316
- CODE_SIGN_STYLE = Automatic;
317
- DEVELOPMENT_ASSET_PATHS = "\"FocusEntity-Example/Preview Content\"";
318
- DEVELOPMENT_TEAM = 278494H572;
319
- ENABLE_PREVIEWS = YES;
320
- INFOPLIST_FILE = "FocusEntity-Example/Info.plist";
321
- LD_RUNPATH_SEARCH_PATHS = (
322
- "$(inherited)",
323
- "@executable_path/Frameworks",
324
- );
325
- PRODUCT_BUNDLE_IDENTIFIER = uk.rocketar.focusentity.example;
326
- PRODUCT_NAME = "$(TARGET_NAME)";
327
- SWIFT_VERSION = 5.0;
328
- TARGETED_DEVICE_FAMILY = "1,2";
329
- };
330
- name = Debug;
331
- };
332
- F301E0E3231462AB0028AAF1 /* Release */ = {
333
- isa = XCBuildConfiguration;
334
- buildSettings = {
335
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
336
- CODE_SIGN_STYLE = Automatic;
337
- DEVELOPMENT_ASSET_PATHS = "\"FocusEntity-Example/Preview Content\"";
338
- DEVELOPMENT_TEAM = 278494H572;
339
- ENABLE_PREVIEWS = YES;
340
- INFOPLIST_FILE = "FocusEntity-Example/Info.plist";
341
- LD_RUNPATH_SEARCH_PATHS = (
342
- "$(inherited)",
343
- "@executable_path/Frameworks",
344
- );
345
- PRODUCT_BUNDLE_IDENTIFIER = uk.rocketar.focusentity.example;
346
- PRODUCT_NAME = "$(TARGET_NAME)";
347
- SWIFT_VERSION = 5.0;
348
- TARGETED_DEVICE_FAMILY = "1,2";
349
- };
350
- name = Release;
351
- };
352
- /* End XCBuildConfiguration section */
353
-
354
- /* Begin XCConfigurationList section */
355
- F301E0C8231462A90028AAF1 /* Build configuration list for PBXProject "FocusEntity-Example" */ = {
356
- isa = XCConfigurationList;
357
- buildConfigurations = (
358
- F301E0DF231462AB0028AAF1 /* Debug */,
359
- F301E0E0231462AB0028AAF1 /* Release */,
360
- );
361
- defaultConfigurationIsVisible = 0;
362
- defaultConfigurationName = Release;
363
- };
364
- F301E0E1231462AB0028AAF1 /* Build configuration list for PBXNativeTarget "FocusEntity-Example" */ = {
365
- isa = XCConfigurationList;
366
- buildConfigurations = (
367
- F301E0E2231462AB0028AAF1 /* Debug */,
368
- F301E0E3231462AB0028AAF1 /* Release */,
369
- );
370
- defaultConfigurationIsVisible = 0;
371
- defaultConfigurationName = Release;
372
- };
373
- /* End XCConfigurationList section */
374
-
375
- /* Begin XCSwiftPackageProductDependency section */
376
- F339DB64275013C700D9A2B2 /* FocusEntity */ = {
377
- isa = XCSwiftPackageProductDependency;
378
- productName = FocusEntity;
379
- };
380
- /* End XCSwiftPackageProductDependency section */
381
- };
382
- rootObject = F301E0C5231462A90028AAF1 /* Project object */;
383
- }