Skip to content

Commit 33647fb

Browse files
committed
Fixed a potential memory leak when showing progress dialogs
1 parent ff2e320 commit 33647fb

File tree

3 files changed

+60
-41
lines changed

3 files changed

+60
-41
lines changed

ui/src/main/java/io/snabble/sdk/ui/cart/ShoppingCartView.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -258,48 +258,54 @@ private void onCartUpdated() {
258258
}
259259
}
260260

261+
public void registerListeners() {
262+
cart.addListener(shoppingCartListener);
263+
checkout.addOnCheckoutStateChangedListener(ShoppingCartView.this);
264+
265+
progressDialog.setOnCancelListener(onCancelListener);
266+
}
267+
268+
public void unregisterListeners() {
269+
cart.removeListener(shoppingCartListener);
270+
checkout.removeOnCheckoutStateChangedListener(ShoppingCartView.this);
271+
272+
progressDialog.setOnCancelListener(null);
273+
progressDialog.dismiss();
274+
}
275+
261276
@Override
262-
protected void onAttachedToWindow() {
277+
public void onAttachedToWindow() {
263278
super.onAttachedToWindow();
264279

265-
cart.addListener(shoppingCartListener);
266-
checkout.addOnCheckoutStateChangedListener(this);
267-
268280
Application application = (Application) getContext().getApplicationContext();
269281
application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
270282

271-
progressDialog.setOnCancelListener(onCancelListener);
283+
registerListeners();
272284
}
273285

274286
@Override
275-
protected void onDetachedFromWindow() {
287+
public void onDetachedFromWindow() {
276288
super.onDetachedFromWindow();
277289

278-
cart.removeListener(shoppingCartListener);
279-
checkout.removeOnCheckoutStateChangedListener(this);
280-
281290
Application application = (Application) getContext().getApplicationContext();
282291
application.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
283292

284-
progressDialog.setOnCancelListener(null);
285-
progressDialog.dismiss();
293+
unregisterListeners();
286294
}
287295

288296
private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks =
289297
new SimpleActivityLifecycleCallbacks() {
290298
@Override
291299
public void onActivityStarted(Activity activity) {
292300
if (UIUtils.getHostActivity(getContext()) == activity) {
293-
cart.addListener(shoppingCartListener);
294-
checkout.addOnCheckoutStateChangedListener(ShoppingCartView.this);
301+
registerListeners();
295302
}
296303
}
297304

298305
@Override
299306
public void onActivityStopped(Activity activity) {
300307
if (UIUtils.getHostActivity(getContext()) == activity) {
301-
cart.removeListener(shoppingCartListener);
302-
checkout.removeOnCheckoutStateChangedListener(ShoppingCartView.this);
308+
unregisterListeners();
303309
}
304310
}
305311
};

ui/src/main/java/io/snabble/sdk/ui/scanner/SelfScanningView.java

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -328,53 +328,64 @@ public void removeBarcodeFormat(BarcodeFormat barcodeFormat) {
328328
barcodeScanner.removeBarcodeFormat(barcodeFormat);
329329
}
330330

331-
@Override
332-
public void onAttachedToWindow() {
333-
super.onAttachedToWindow();
331+
public void registerListeners() {
332+
isRunning = true;
334333

335334
progressDialog.setOnCancelListener(progressDialogCancelListener);
336-
checkout.addOnCheckoutStateChangedListener(this);
335+
checkout.addOnCheckoutStateChangedListener(SelfScanningView.this);
337336

338337
startBarcodeScanner();
338+
}
339+
340+
public void unregisterListeners() {
341+
isRunning = false;
342+
343+
stopBarcodeScanner();
344+
checkout.removeOnCheckoutStateChangedListener(SelfScanningView.this);
345+
346+
progressDialog.setOnCancelListener(null);
347+
progressDialog.dismiss();
348+
productDialog.dismiss();
349+
}
350+
351+
@Override
352+
public void onAttachedToWindow() {
353+
super.onAttachedToWindow();
339354

340355
Application application = (Application) getContext().getApplicationContext();
341356
application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
357+
358+
registerListeners();
342359
}
343360

344361
@Override
345362
public void onDetachedFromWindow() {
346363
super.onDetachedFromWindow();
347364

348-
stopBarcodeScanner();
349-
checkout.removeOnCheckoutStateChangedListener(this);
350-
351365
Application application = (Application) getContext().getApplicationContext();
352366
application.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
353367

354-
progressDialog.setOnCancelListener(null);
355-
progressDialog.dismiss();
356-
productDialog.dismiss();
368+
unregisterListeners();
357369
}
358370

359371
private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks =
360372
new SimpleActivityLifecycleCallbacks() {
361373
@Override
362-
public void onActivityResumed(Activity activity) {
374+
public void onActivityStarted(Activity activity) {
363375
if (UIUtils.getHostActivity(getContext()) == activity) {
364-
isRunning = true;
365-
startBarcodeScanner();
376+
registerListeners();
366377
}
367378
}
368379

369380
@Override
370-
public void onActivityPaused(Activity activity) {
381+
public void onActivityStopped(Activity activity) {
371382
if (UIUtils.getHostActivity(getContext()) == activity) {
372-
isRunning = false;
373-
stopBarcodeScanner();
383+
unregisterListeners();
374384
}
375385
}
376386
};
377387

388+
378389
@Override
379390
public void onStateChanged(Checkout.State state) {
380391
if (!isShown()) {

ui/src/main/java/io/snabble/sdk/ui/utils/DelayedProgressDialog.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,26 @@
77

88
public class DelayedProgressDialog extends ProgressDialog {
99
private Handler handler = new Handler(Looper.getMainLooper());
10-
private Runnable runnable;
10+
11+
private Runnable showRunnable = new Runnable() {
12+
public void run() {
13+
if(!isDismissed) {
14+
show();
15+
}
16+
}
17+
};
18+
1119
private boolean isDismissed = false;
1220

1321
public DelayedProgressDialog(Context context) {
1422
super(context);
1523
}
1624

1725
public void showAfterDelay(long afterDelayMs) {
18-
runnable = new Runnable() {
19-
public void run() {
20-
if(!isDismissed) {
21-
show();
22-
}
23-
}
24-
};
26+
stopCallbacks();
2527

2628
isDismissed = false;
27-
handler.postDelayed(runnable, afterDelayMs);
29+
handler.postDelayed(showRunnable, afterDelayMs);
2830
}
2931

3032
@Override
@@ -41,7 +43,7 @@ public void cancel() {
4143

4244
private void stopCallbacks() {
4345
isDismissed = true;
44-
handler.removeCallbacks(runnable);
46+
handler.removeCallbacks(showRunnable);
4547
setOnCancelListener(null);
4648
}
4749

0 commit comments

Comments
 (0)