com.dimasdanz.kendalipintu.BarcodeOpenDoorActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.dimasdanz.kendalipintu.BarcodeOpenDoorActivity.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Dimas Rullyan Danu.
 * 
 * Kendali Pintu is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Kendali Pintu is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Kendali Pintu. If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
package com.dimasdanz.kendalipintu;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import com.dimasdanz.kendalipintu.opendoor.BarcodePreview;
import com.dimasdanz.kendalipintu.util.JSONParser;
import com.dimasdanz.kendalipintu.util.ServerUtilities;
import com.dimasdanz.kendalipintu.util.SharedPreferencesManager;
import com.dimasdanz.kendalipintu.util.StaticString;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;

import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.Size;

import net.sourceforge.zbar.ImageScanner;
import net.sourceforge.zbar.Image;
import net.sourceforge.zbar.Symbol;
import net.sourceforge.zbar.SymbolSet;
import net.sourceforge.zbar.Config;

public class BarcodeOpenDoorActivity extends Activity {
    private Camera mCamera;
    private BarcodePreview mPreview;
    private Handler autoFocusHandler;

    ImageScanner scanner;

    private boolean previewing = true;

    static {
        System.loadLibrary("iconv");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_barcode_open_door);

        autoFocusHandler = new Handler();
        mCamera = getCameraInstance();

        scanner = new ImageScanner();
        scanner.setConfig(0, Config.X_DENSITY, 3);
        scanner.setConfig(0, Config.Y_DENSITY, 3);

        mPreview = new BarcodePreview(this, mCamera, previewCb, autoFocusCB);
        FrameLayout preview = (FrameLayout) findViewById(R.id.cameraPreview);
        preview.addView(mPreview);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.barcode_open_door, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void onPause() {
        super.onPause();
        releaseCamera();
    }

    public void onResume() {
        super.onResume();
        if (mCamera == null) {
            previewing = true;
            mCamera = getCameraInstance();
            mPreview = new BarcodePreview(this, mCamera, previewCb, autoFocusCB);
        }
    }

    public static Camera getCameraInstance() {
        Camera c = null;
        try {
            c = Camera.open();
        } catch (Exception e) {
        }
        return c;
    }

    private void releaseCamera() {
        if (mCamera != null) {
            previewing = false;
            mPreview.getHolder().removeCallback(mPreview);
            mCamera.setPreviewCallback(null);
            mCamera.release();
            mCamera = null;
        }
    }

    private Runnable doAutoFocus = new Runnable() {
        public void run() {
            if (previewing) {
                mCamera.autoFocus(autoFocusCB);
            }
        }
    };

    PreviewCallback previewCb = new PreviewCallback() {
        public void onPreviewFrame(byte[] data, Camera camera) {
            Camera.Parameters parameters = camera.getParameters();
            Size size = parameters.getPreviewSize();
            Image barcode = new Image(size.width, size.height, "Y800");
            barcode.setData(data);

            int result = scanner.scanImage(barcode);

            if (result != 0) {
                SymbolSet syms = scanner.getResults();
                for (Symbol sym : syms) {
                    if (sym.getData().equals(StaticString.TAG_BARCODE_ENTER)) {
                        Log.d("Result", "Masuk");
                        previewing = false;
                        mCamera.setPreviewCallback(null);
                        mCamera.stopPreview();
                        releaseCamera();
                        new BarcodeSendData().execute(StaticString.TAG_BARCODE_ENTER);
                    } else if (sym.getData().equals(StaticString.TAG_BARCODE_EXIT)) {
                        Log.d("Result", "Keluar");
                        previewing = false;
                        mCamera.setPreviewCallback(null);
                        mCamera.stopPreview();
                        releaseCamera();
                        new BarcodeSendData().execute(StaticString.TAG_BARCODE_EXIT);
                    } else {
                        Toast.makeText(BarcodeOpenDoorActivity.this, R.string.string_barcode_invalid,
                                Toast.LENGTH_SHORT).show();
                        Log.d("Result", "Invalid");
                    }
                }
            }
        }
    };

    AutoFocusCallback autoFocusCB = new AutoFocusCallback() {
        public void onAutoFocus(boolean success, Camera camera) {
            autoFocusHandler.postDelayed(doAutoFocus, 1000);
        }
    };

    class BarcodeSendData extends AsyncTask<String, Void, String> {
        JSONParser jsonParser = new JSONParser();
        JSONObject json = new JSONObject();
        TextView txtInfo = (TextView) findViewById(R.id.txtBarcodeInfo);
        List<NameValuePair> params = new ArrayList<NameValuePair>();

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            findViewById(R.id.layoutCamera).setVisibility(View.GONE);
            findViewById(R.id.layoutResult).setVisibility(View.VISIBLE);
        }

        @Override
        protected String doInBackground(String... args) {
            if (args[0].equals(StaticString.TAG_BARCODE_ENTER)) {
                params.add(new BasicNameValuePair("username_id",
                        SharedPreferencesManager.getUsernameIdPrefs(getApplicationContext())));
                params.add(new BasicNameValuePair("input_source", StaticString.INPUT_SOURCE_OUTSIDE));
                json = jsonParser.makeHttpRequest(ServerUtilities.getOpenDoorUrl(getApplicationContext()), "POST",
                        params);
                if (json != null) {
                    try {
                        if (json.getBoolean("response")) {
                            return StaticString.TAG_BARCODE_ENTER;
                        } else {
                            return StaticString.TAG_ARDUINO_OFFLINE;
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        return StaticString.TAG_SERVER_OFFLINE;
                    }
                } else {
                    return StaticString.TAG_SERVER_OFFLINE;
                }
            } else if (args[0].equals(StaticString.TAG_BARCODE_EXIT)) {
                params.add(new BasicNameValuePair("username_id",
                        SharedPreferencesManager.getUsernameIdPrefs(getApplicationContext())));
                params.add(new BasicNameValuePair("input_source", StaticString.INPUT_SOURCE_INSIDE));
                json = jsonParser.makeHttpRequest(ServerUtilities.getOpenDoorUrl(getApplicationContext()), "POST",
                        params);
                if (json != null) {
                    try {
                        if (json.getBoolean("response")) {
                            return StaticString.TAG_BARCODE_EXIT;
                        } else {
                            return StaticString.TAG_ARDUINO_OFFLINE;
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                        return StaticString.TAG_SERVER_OFFLINE;
                    }
                } else {
                    return StaticString.TAG_SERVER_OFFLINE;
                }
            } else {
                return StaticString.TAG_SERVER_OFFLINE;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            findViewById(R.id.pbBarcode).setVisibility(View.GONE);
            if (result != null) {
                if (result.equals(StaticString.TAG_BARCODE_ENTER)) {
                    txtInfo.setText(R.string.string_barcode_enter);
                } else if (result.equals(StaticString.TAG_BARCODE_EXIT)) {
                    txtInfo.setText(R.string.string_barcode_exit);
                } else if (result.equals(StaticString.TAG_ARDUINO_OFFLINE)) {
                    txtInfo.setText(R.string.string_arduino_offline);
                } else {
                    txtInfo.setText(R.string.string_server_offline);
                }
            }
        }
    }
}