From 383e74fe7a351bf253becd9408699a375a0a1a5c Mon Sep 17 00:00:00 2001
From: vvashchenko <vitaliy.vashchenko@nic.cz>
Date: Mon, 21 Mar 2016 16:55:10 +0100
Subject: [PATCH] Code optimization.

---
 .../camera/AndroidDeviceCameraController.java |  44 +-----
 .../tablexia/screen/camera/CameraScreen.java  | 134 ++++++++++--------
 .../util/camera/DeviceCameraControl.java      |  10 --
 .../tablexia/util/qrcode/QrCodeEncoder.java   |  15 +-
 4 files changed, 84 insertions(+), 119 deletions(-)

diff --git a/android/src/main/java/cz/nic/tablexia/android/camera/AndroidDeviceCameraController.java b/android/src/main/java/cz/nic/tablexia/android/camera/AndroidDeviceCameraController.java
index fccb0a854..ce986b56c 100644
--- a/android/src/main/java/cz/nic/tablexia/android/camera/AndroidDeviceCameraController.java
+++ b/android/src/main/java/cz/nic/tablexia/android/camera/AndroidDeviceCameraController.java
@@ -29,9 +29,7 @@ public class AndroidDeviceCameraController implements DeviceCameraControl, Camer
     private       CameraCallback            cameraCallback;
     private       CameraSurface             cameraSurface;
     private       ScreenOrientationListener screenOrientationListener;
-
-    private String decodedData;
-    private boolean decoded      = false;
+    
     private boolean previewReady = false;
     
     int mWidth, mHeight, mLeft, mTop, mAreaWidth, mAreaHeight;
@@ -109,16 +107,6 @@ public class AndroidDeviceCameraController implements DeviceCameraControl, Camer
         previewReady = false;
     }
 
-    @Override
-    public synchronized void pausePreview() {
-        Log.debug(getClass().getSimpleName(), "pausePreview");
-        if (cameraSurface!=null && cameraSurface.getCamera() != null){
-            cameraSurface.getCamera().setPreviewCallback(null);
-            cameraSurface.getCamera().stopPreview();
-            previewReady = true;
-        }
-    }
-
     @Override
     public int getPreviewWidth() {
         return cameraSurface.getCamera().getParameters().getPreviewSize().width;
@@ -164,23 +152,11 @@ public class AndroidDeviceCameraController implements DeviceCameraControl, Camer
         activity.post(r);
     }
 
-    @Override
-    public void pausePreviewAsync() {
-        Runnable r = new Runnable() {
-            @Override
-            public void run() {
-                pausePreview();
-            }
-        };
-        activity.post(r);
-    }
-
     @Override
     public boolean isPreviewReady() {
         return previewReady;
     }
-
-
+    
     @Override
     public boolean isReady() {
         if (cameraSurface != null && cameraSurface.getCamera() != null) {
@@ -189,22 +165,6 @@ public class AndroidDeviceCameraController implements DeviceCameraControl, Camer
         return false;
     }
 
-    @Override
-    public boolean isDecoded() {
-        return decoded;
-    }
-
-    @Override
-    public void resetDecoded() {
-        decoded = false;
-        decodedData = null;
-    }
-
-    @Override
-    public String getDecodedData() {
-        return decodedData;
-    }
-
     @Override
     public void onPreviewFrame(byte[] bytes, Camera camera) {
         if (cameraCallback != null && !cameraCallback.hasDataToProceed()) {
diff --git a/core/src/cz/nic/tablexia/screen/camera/CameraScreen.java b/core/src/cz/nic/tablexia/screen/camera/CameraScreen.java
index a55f5cd61..d5025bf04 100644
--- a/core/src/cz/nic/tablexia/screen/camera/CameraScreen.java
+++ b/core/src/cz/nic/tablexia/screen/camera/CameraScreen.java
@@ -30,6 +30,7 @@ import cz.nic.tablexia.sync.work.SyncWork;
 import cz.nic.tablexia.util.Log;
 import cz.nic.tablexia.util.camera.CameraCallback;
 import cz.nic.tablexia.util.camera.DeviceCameraControl;
+import cz.nic.tablexia.util.ui.dialog.TablexiaComponentDialog;
 import cz.nic.tablexia.util.ui.dialog.TablexiaComponentDialogFactory;
 import cz.nic.tablexia.util.ui.dialog.components.BackButtonHideComponent;
 import cz.nic.tablexia.util.ui.dialog.components.CenterPositionDialogComponent;
@@ -46,18 +47,26 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
     private        Mode                mode;
     private static DeviceCameraControl deviceCameraControl;
     private int     DIALOG_WIDTH  = 450;
-    private int     DIALOG_HEIGHT = 400;
+    private int     DIALOG_HEIGHT = 300;
     private boolean sizeIsSet     = false;
     private int left, top, height, width, innerWidth, innerHeight;
     private String  decodedData;
     private boolean decoded;
     private boolean hasData;
+    private TablexiaComponentDialog dialog;
 
     ShapeRenderer shapeRenderer;
 
+    public enum Mode {
+        prepare,
+        preview,
+        done;
+    }
+
     @Override
     public void scanPreviewData(byte[] data) {
         hasData = true;
+        setArea();
         LuminanceSource source = new PlanarYUVLuminanceSource(data, width, height, left, top, innerWidth, innerHeight, false);
         BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
         Result result;
@@ -68,14 +77,15 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
             Log.debug(getClass().getSimpleName(), decodedData);
             decoded = true;
             mode = Mode.done;
+            Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1f);
+            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
+            deviceCameraControl.stopPreviewAsync();
             Gdx.app.postRunnable(new Runnable() {
                 @Override
                 public void run() {
                     showConfirmDialog();
                 }
             });
-
-
         } catch (NotFoundException e) {
             e.printStackTrace();
             hasData = false;
@@ -92,21 +102,13 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
         return hasData;
     }
 
-    public enum Mode {
-        prepare,
-        preview,
-        done;
-    }
-
     @Override
     protected void screenLoaded(Map<String, String> screenState) {
         deviceCameraControl = Tablexia.getDeviceCameraControl();
         deviceCameraControl.setCameraCallback(this);
         deviceCameraControl.resetDecoded();
         if (deviceCameraControl != null) {
-            deviceCameraControl.prepareCameraAsync();
-            mode = Mode.prepare;
-            hasData = false;
+            resetState();
         }
         shapeRenderer = new ShapeRenderer();
 
@@ -114,15 +116,18 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
 
     @Override
     protected void screenPaused(Map<String, String> screenState) {
-        deviceCameraControl.stopPreviewAsync();
+        if (!decoded) {
+            deviceCameraControl.stopPreviewAsync();
+        }
         Log.debug(getClass(), "screenPaused");
-//        super.pause();
     }
 
     @Override
     protected void screenResumed() {
         Log.debug(getClass(), "screenResumed");
-        deviceCameraControl.startPreviewAsync();
+        if (!decoded) {
+            deviceCameraControl.startPreviewAsync();
+        }
     }
 
     @Override
@@ -134,11 +139,12 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
     @Override
     protected void screenRender(float delta) {
         Mode prev = mode;
-        Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
-        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
+
         switch (mode) {
             case preview:
                 if (deviceCameraControl.isPreviewReady()) {
+                    Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
+                    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
                     drawRectangle();
                 }
                 break;
@@ -150,7 +156,6 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
                     mode = Mode.preview;
                 }
                 break;
-            case done:
             default:
                 break;
         }
@@ -164,7 +169,7 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
     // TODO: 15.3.16 add proper dialog text 
     private void showConfirmDialog() {
         Log.debug(getClass(), "Showing dialog with " + decodedData);
-        TablexiaComponentDialogFactory.getInstance().createYesNoDialog(
+        dialog = TablexiaComponentDialogFactory.getInstance().createYesNoDialog(
                 ApplicationTextManager.getInstance().getText(ApplicationTextManager.ApplicationTextsAssets.SYNC_QR_REQUEST_ON_DECODED_DIALOG_TEXT) + decodedData,
                 new ClickListener() {
                     @Override
@@ -172,52 +177,19 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
                         super.clicked(event, x, y);
                         Log.debug(getClass(), "your user sync can be here");
                         backToMenu();
-//                        syncUser(deviceCameraControl.getDecodedData());
+                        // TODO: 21.3.16 sync work  
                     }
                 },
                 new ClickListener() {
                     @Override
                     public void clicked(InputEvent event, float x, float y) {
                         super.clicked(event, x, y);
-//                        deviceCameraControl.resetDecoded();
-                        hasData = false;
-                        decodedData = null;
-                        if (!deviceCameraControl.isPreviewReady()) {
-                            deviceCameraControl.startPreviewAsync();
-                        }
-                        mode = Mode.preview;
-
+                        resetState();
                     }
-                }).show(DIALOG_WIDTH, DIALOG_WIDTH);
-    }
-
-    private void drawRectangle() {
-        setArea();
-        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
-        shapeRenderer.setColor(Color.RED);
-        shapeRenderer.rect(left, top, innerWidth, innerHeight);
-        shapeRenderer.end();
-    }
-
-    private void setArea() {
-        if (!sizeIsSet) {
-            width = Gdx.graphics.getWidth();
-            height = Gdx.graphics.getHeight();
-            innerWidth = width / 2;
-            innerHeight = height / 2;
-            left = width / 4;
-            top = height / 4;
-            sizeIsSet = true;
-        }
-    }
-
-    private void backToMenu() {
-        Log.debug(getClass(), "backToMenu");
-        ApplicationBus.getInstance().post(new UserMenu.RefreshUserMenu()).asynchronously();
-        ApplicationBus.getInstance().post(new Tablexia.ChangeScreenEvent(TablexiaSettings.LOADER_SCREEN, TablexiaApplication.ScreenTransaction.FADE)).asynchronously();
+                });
+        dialog.show(DIALOG_WIDTH, DIALOG_HEIGHT);
     }
 
-    // TODO: 11.3.16 Call user sync 
     private void syncUser(String userId) {
         DownloadUser syncWork = new DownloadUser(userId);
         syncWork.registerListener(new SyncWork.RestSyncListener() {
@@ -245,6 +217,40 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
         });
         RestSynchronizationService.doSyncWork(syncWork);
     }
+
+    private void drawRectangle() {
+        setArea();
+        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
+        shapeRenderer.setColor(Color.RED);
+        shapeRenderer.rect(left, top, innerWidth, innerHeight);
+        shapeRenderer.end();
+    }
+    
+    private void resetState(){
+        hasData = false;
+        decodedData = null;
+        decoded = false;
+        deviceCameraControl.prepareCameraAsync();
+        mode = Mode.prepare;
+    }
+
+    private void setArea() {
+        if (!sizeIsSet) {
+            width = Gdx.graphics.getWidth();
+            height = Gdx.graphics.getHeight();
+            innerWidth = width / 2;
+            innerHeight = height / 2;
+            left = width / 4;
+            top = height / 4;
+            sizeIsSet = true;
+        }
+    }
+
+    private void backToMenu() {
+        Log.debug(getClass(), "backToMenu");
+        ApplicationBus.getInstance().post(new UserMenu.RefreshUserMenu()).asynchronously();
+        ApplicationBus.getInstance().post(new Tablexia.ChangeScreenEvent(TablexiaSettings.LOADER_SCREEN, TablexiaApplication.ScreenTransaction.FADE)).asynchronously();
+    }
     
     
     @Override
@@ -253,12 +259,14 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
         if (deviceCameraControl == null) {
             deviceCameraControl = Tablexia.getDeviceCameraControl();
         }
-        if (deviceCameraControl.isPreviewReady()) {
-            mode = Mode.preview;
-        } else {
-            deviceCameraControl.prepareCameraAsync();
-            mode = Mode.prepare;
+        if (!decoded) {
+            if (deviceCameraControl.isPreviewReady()) {
+                mode = Mode.preview;
+            } else {
+                deviceCameraControl.prepareCameraAsync();
+                mode = Mode.prepare;
 
+            }
         }
         sizeIsSet = false;
     }
@@ -274,7 +282,9 @@ public class CameraScreen extends AbstractTablexiaScreen<Void> implements Camera
     @Override
     public void backButtonPressed() {
         Log.debug(getClass(), "backButtonPressed");
-
+        if (dialog != null) {
+            dialog.hide();
+        }
         ApplicationBus.getInstance().post(new Tablexia.ChangeScreenEvent(TablexiaSettings.LOADER_SCREEN, TablexiaApplication.ScreenTransaction.FADE)).asynchronously();
     }
 }
diff --git a/core/src/cz/nic/tablexia/util/camera/DeviceCameraControl.java b/core/src/cz/nic/tablexia/util/camera/DeviceCameraControl.java
index d84c487ed..6eaff4674 100644
--- a/core/src/cz/nic/tablexia/util/camera/DeviceCameraControl.java
+++ b/core/src/cz/nic/tablexia/util/camera/DeviceCameraControl.java
@@ -22,8 +22,6 @@ public interface DeviceCameraControl {
 
     void startPreview();
     
-    void pausePreview();
-
     void stopPreview();
 
     int getPreviewWidth();
@@ -32,12 +30,6 @@ public interface DeviceCameraControl {
     
     boolean cameraAccessible();
     
-    boolean isDecoded();
-    
-    void resetDecoded();
-    
-    String getDecodedData();
-    
     boolean isPreviewReady();
 
     // Asynchronous interface - need when called from a non platform thread (GDX OpenGl thread)
@@ -45,8 +37,6 @@ public interface DeviceCameraControl {
 
     void stopPreviewAsync();
     
-    void pausePreviewAsync();
-    
     void setCameraCallback(CameraCallback cameraCallback);
 
     boolean isReady();
diff --git a/core/src/cz/nic/tablexia/util/qrcode/QrCodeEncoder.java b/core/src/cz/nic/tablexia/util/qrcode/QrCodeEncoder.java
index 0de8ae497..a7b7203e5 100644
--- a/core/src/cz/nic/tablexia/util/qrcode/QrCodeEncoder.java
+++ b/core/src/cz/nic/tablexia/util/qrcode/QrCodeEncoder.java
@@ -21,14 +21,16 @@ public class QrCodeEncoder {
     public static final int HEIGHT = 250;
 
 
-    public static Image createQrCode(String data) throws  WriterException{
+    public static Image createQrCode(String data){
         Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
         hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
         QRCodeWriter writer = new QRCodeWriter();
-            BitMatrix matrix = writer.encode(data, BarcodeFormat.QR_CODE,WIDTH,HEIGHT);
+        BitMatrix matrix;
+        Image image = null;
+        try {
+            matrix = writer.encode(data, BarcodeFormat.QR_CODE,WIDTH,HEIGHT);
             Pixmap pixmap = new Pixmap(WIDTH,HEIGHT, Pixmap.Format.RGB888);
             pixmap.setColor(Color.WHITE);
-//            pixmap.fillRectangle(0,0,matrix.getWidth(),matrix.getHeight());
             pixmap.fill();
             pixmap.setColor(Color.BLACK);
             for(int i = 0; i < matrix.getWidth(); i++){
@@ -39,8 +41,11 @@ public class QrCodeEncoder {
                 }
             }
 
-        Image image = new Image(new Texture(pixmap));
-
+            image = new Image(new Texture(pixmap));
+        } catch (WriterException e) {
+            e.printStackTrace();
+        }
+        
         return image;
     }
 }
-- 
GitLab