@@ -11,6 +11,8 @@ import {
1111 NativeModules ,
1212 Dimensions ,
1313 ScaledSize ,
14+ AppState ,
15+ AppStateStatus ,
1416} from 'react-native' ;
1517import CheckBox from '@react-native-community/checkbox' ;
1618import Toast from 'react-native-toast-message' ;
@@ -49,6 +51,7 @@ const App: React.FC = () => {
4951 const [ widthStatus , setWidthStatus ] = useState ( '' ) ;
5052 const [ heightStatus , setHeightStatus ] = useState ( '' ) ;
5153
54+ const isEnableCalled = useRef ( false ) ;
5255 const readyLength = useRef ( '' ) ;
5356 const readyWidth = useRef ( '' ) ;
5457 const readyHeight = useRef ( '' ) ;
@@ -57,20 +60,63 @@ const App: React.FC = () => {
5760 setIsLandscape ( window . width > window . height ) ;
5861 } ;
5962
63+ const ignoreOneBackgroundState = useRef ( true ) ;
64+
65+ useEffect ( ( ) => {
66+ const handleFocusChange = ( ) => {
67+ if ( ! isEnableCalled . current ) {
68+ ignoreOneBackgroundState . current = true ;
69+ isEnableCalled . current = true ;
70+ EnableDimension ( { MODULE : ZebraMobileDimensioning . PARCEL_MODULE } ) ;
71+ }
72+ } ;
73+ const handleAppStateChange = ( nextAppState : AppStateStatus ) => {
74+ if ( nextAppState === 'background' ) {
75+ if ( ignoreOneBackgroundState . current )
76+ ignoreOneBackgroundState . current = false ;
77+ else {
78+ ignoreOneBackgroundState . current = true ;
79+ isEnableCalled . current = false ;
80+ setIsDimensionEnabled ( false ) ;
81+ DisableDimension ( { } ) ;
82+ }
83+ }
84+ } ;
85+
86+ const appStateSubscription = AppState . addEventListener (
87+ 'change' ,
88+ handleAppStateChange ,
89+ ) ;
90+ const focusSubscription = AppState . addEventListener (
91+ 'focus' ,
92+ handleFocusChange ,
93+ ) ;
94+
95+ return ( ) => {
96+ appStateSubscription . remove ( ) ;
97+ focusSubscription . remove ( ) ;
98+ } ;
99+ } , [ ] ) ;
100+
60101 useEffect ( ( ) => {
61- const subscription = Dimensions . addEventListener ( 'change' , handleOrientationChange ) ;
102+ const subscription = Dimensions . addEventListener (
103+ 'change' ,
104+ handleOrientationChange ,
105+ ) ;
62106 handleOrientationChange ( { window : Dimensions . get ( 'window' ) } ) ;
63107 return ( ) => {
64108 subscription ?. remove ( ) ;
65109 } ;
66110 } , [ ] ) ;
67111
68112 useEffect ( ( ) => {
113+ ignoreOneBackgroundState . current = true ;
114+ isEnableCalled . current = true ;
69115 EnableDimension ( { MODULE : ZebraMobileDimensioning . PARCEL_MODULE } ) ;
70116
71117 const subscription = eventEmitter . addListener (
72118 ZebraMobileDimensioning . DIMENSIONING_EVENT ,
73- async ( event ) => {
119+ async event => {
74120 const action = event [ ZebraMobileDimensioning . ACTION ] ;
75121 const message = event [ ZebraMobileDimensioning . RESULT_MESSAGE ] ;
76122 const resultCode = event [ ZebraMobileDimensioning . RESULT_CODE ] ;
@@ -82,13 +128,15 @@ const App: React.FC = () => {
82128 // After enabling, call Get Parameters to update the UI
83129 if ( resultCode === ZebraMobileDimensioning . SUCCESS ) {
84130 setIsDimensionEnabled ( true ) ;
131+ ignoreOneBackgroundState . current = true ;
85132 GetDimensionParameters ( { } ) ;
86133 } else {
87134 Toast . show ( {
88135 type : 'error' ,
89136 text1 : 'Enable Dimension Failed' ,
90137 text2 : message ,
91138 } ) ;
139+ isEnableCalled . current = false ;
92140 }
93141 break ;
94142 case ZebraMobileDimensioning . INTENT_ACTION_DISABLE_DIMENSION :
@@ -103,6 +151,7 @@ const App: React.FC = () => {
103151 case ZebraMobileDimensioning . INTENT_ACTION_SET_DIMENSION_PARAMETER :
104152 // After setting parameters, call Get Parameters again to update the ready values
105153 if ( resultCode === ZebraMobileDimensioning . SUCCESS ) {
154+ ignoreOneBackgroundState . current = true ;
106155 GetDimensionParameters ( { } ) ;
107156 } else {
108157 Toast . show ( {
@@ -163,7 +212,9 @@ const App: React.FC = () => {
163212 if ( cacheImagePath ) {
164213 try {
165214 // Save to gallery using CameraRoll
166- const savedToGallery = await CameraRoll . saveAsset ( cacheImagePath ) ;
215+ const savedToGallery = await CameraRoll . saveAsset (
216+ cacheImagePath ,
217+ ) ;
167218 console . log ( 'Image saved to Gallery:' , savedToGallery ) ;
168219 } catch ( error ) {
169220 console . error ( 'Image storage failed' , error ) ;
@@ -184,6 +235,9 @@ const App: React.FC = () => {
184235 ) ;
185236
186237 return ( ) => {
238+ ignoreOneBackgroundState . current = true ;
239+ isEnableCalled . current = false ;
240+ setIsDimensionEnabled ( false ) ;
187241 DisableDimension ( { } ) ;
188242 subscription . remove ( ) ;
189243 } ;
@@ -192,6 +246,7 @@ const App: React.FC = () => {
192246 useEffect ( ( ) => {
193247 if ( ! isInitialSetup ) {
194248 const updateDimensionParameters = async ( ) => {
249+ ignoreOneBackgroundState . current = true ;
195250 await SetDimensionParameters ( {
196251 DIMENSIONING_UNIT : unit ,
197252 REPORT_IMAGE : saveImage ,
@@ -220,6 +275,7 @@ const App: React.FC = () => {
220275 } ;
221276
222277 const handleStartDimensioning = ( ) => {
278+ ignoreOneBackgroundState . current = true ;
223279 GetDimension ( { OBJECT_ID : objectId } ) ;
224280 } ;
225281
@@ -282,7 +338,11 @@ const App: React.FC = () => {
282338 < Text style = { styles . descriptionText } >
283339 Scan or type in your Object ID:
284340 </ Text >
285- < View style = { isLandscape ? styles . landscapeObjectIdRow : styles . objectIdContainer } >
341+ < View
342+ style = {
343+ isLandscape ? styles . landscapeObjectIdRow : styles . objectIdContainer
344+ }
345+ >
286346 < Text style = { styles . objectIdLabel } > Object ID:</ Text >
287347 < TextInput
288348 style = { styles . objectIdInput }
@@ -291,7 +351,10 @@ const App: React.FC = () => {
291351 onChangeText = { setObjectId }
292352 />
293353 { isLandscape && (
294- < TouchableOpacity onPress = { handleScanBarcode } style = { styles . landscapeScanButton } >
354+ < TouchableOpacity
355+ onPress = { handleScanBarcode }
356+ style = { styles . landscapeScanButton }
357+ >
295358 < Text style = { styles . buttonText } > Scan Barcode</ Text >
296359 </ TouchableOpacity >
297360 ) }
0 commit comments