org.gearvrf.ipbsample.SampleViewManager.java Source code

Java tutorial

Introduction

Here is the source code for org.gearvrf.ipbsample.SampleViewManager.java

Source

/* Copyright 2015 Samsung Electronics Co., LTD
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.gearvrf.ipbsample;

import org.gearvrf.GVRTexture;
import org.gearvrf.GVRActivity;
import org.gearvrf.GVRBitmapTexture;
import org.gearvrf.GVRContext;
import org.gearvrf.GVRScene;
import org.gearvrf.GVRSceneObject;
import org.gearvrf.GVRScript;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

import org.gearvrf.ipbsample.util.TouchPadInput;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;

public class SampleViewManager extends GVRScript implements Camera.PreviewCallback {

    private final int TOTAL_VIEWS = 4;

    private boolean showData = false;

    private int viewNum = 1, zoomNum = 0;

    private double imageFps = 0;
    private int imageCount = 0, imageStep = 20;
    private double imageFreq = 0, imageTime = 0;

    private Bitmap bitmap = null;
    private Camera camera = null;

    // private float pressure = 0;
    private double latitude = 0, longitude = 0, altitude = 0;

    private GVRBitmapTexture bitmapTexture;

    // private SensorManager sensorManager = null;
    // private Sensor sensorPressure = null;

    // private LocationManager locationManager;
    // private Location location;

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(SampleActivity.context) {
        @Override
        public void onManagerConnected(int status) {
            if (status == LoaderCallbackInterface.SUCCESS) {
                System.loadLibrary("mixed_sample");
                // System.loadLibrary("ImageProcessing");
            } else {
                super.onManagerConnected(status);
            }
        }
    };

    public SampleViewManager(final SampleActivity activity) {
        bitmap = Bitmap.createBitmap(SampleProcessing.width, SampleProcessing.height, Bitmap.Config.ARGB_8888);
    }

    @Override
    public GVRTexture getSplashTexture(GVRContext gvrContext) {
        Bitmap bitmapSplash = BitmapFactory.decodeResource(gvrContext.getActivity().getResources(),
                R.drawable.ipbgearvr_splash);
        GVRBitmapTexture bitmapSplashTexture = new GVRBitmapTexture(gvrContext, bitmapSplash);
        return (GVRTexture) bitmapSplashTexture;
    }

    @Override
    public void onInit(GVRContext arg0) throws Throwable {
        GVRScene gvrScene = arg0.getNextMainScene(new Runnable() {
            @SuppressWarnings("deprecation")
            @Override
            public void run() {
                initializeCamera();
                // initializeSensors();
                // initializeLocation();

                imageFreq = Core.getTickFrequency();
                imageTime = Core.getTickCount();
            }
        });

        bitmapTexture = new GVRBitmapTexture(arg0, bitmap);

        GVRSceneObject cameraObject = new GVRSceneObject(arg0, arg0.createQuad(5.3333f, 3.0f), bitmapTexture);

        cameraObject.getTransform().setPosition(0.0f, 0.0f, -4.0f);

        gvrScene.getMainCameraRig().addChildObject(cameraObject);
    }

    @Override
    public void onStep() {
    }

    public void onPause() {
        // sensorManager.unregisterListener(this);
    }

    public void onResume() {
        if (!OpenCVLoader.initDebug()) {
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, SampleActivity.context, mLoaderCallback);
        } else {
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }

        // sensorManager.registerListener(this, sensorPressure,
        // SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void onStop() {
        if (camera != null) {
            camera.setPreviewCallback(null);
            camera.stopPreview();
            camera.release();
            camera = null;
        }
    }

    public void onRestart() {
        initializeCamera();
    }

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        setFps();
        getTouchPadInput();

        Mat yuvImage = new Mat(SampleProcessing.height * 3 / 2, SampleProcessing.width, CvType.CV_8UC1);
        yuvImage.put(0, 0, data);

        Mat rgbaImage = new Mat(SampleProcessing.height, SampleProcessing.width, CvType.CV_8UC4);
        Imgproc.cvtColor(yuvImage, rgbaImage, Imgproc.COLOR_YUV420sp2RGBA, 4);

        Mat outputImage = new Mat(SampleProcessing.height, SampleProcessing.width, CvType.CV_8UC4);

        outputImage = SampleProcessing.processImage(rgbaImage, viewNum);

        if (zoomNum > 0) {
            outputImage = SampleProcessing.zoomImage(outputImage, zoomNum);
        }

        if (showData) {
            outputImage = SampleProcessing.dataImage(outputImage, viewNum, zoomNum, imageFps, latitude, longitude,
                    altitude);
        }

        Utils.matToBitmap(outputImage, bitmap);
        bitmapTexture.update(bitmap);
    }

    private void getTouchPadInput() {
        TouchPadInput.process();
        switch (TouchPadInput.getCurrent().swipeDirection) {
        case Up:
            if (showData) {
                showData = false;
            } else {
                showData = true;
            }
            break;
        case Down:
            if (viewNum < TOTAL_VIEWS) {
                viewNum++;
            } else {
                viewNum = 1;
            }
            break;
        case Forward:
            if (zoomNum < 40) {
                zoomNum += 10;
            }
            break;
        case Backward:
            if (zoomNum > 0) {
                zoomNum -= 10;
            }
            break;
        case Ignore:
            break;
        default:
            break;
        }
    }

    private void initializeCamera() {
        camera = Camera.open();
        camera.setPreviewCallback(SampleViewManager.this);

        Parameters params = camera.getParameters();

        params.setPreviewSize(SampleProcessing.width, SampleProcessing.height);

        int[] range = new int[2];
        params.getPreviewFpsRange(range);
        params.setPreviewFrameRate(range[Parameters.PREVIEW_FPS_MAX_INDEX] / 1000);

        params.setFocusMode(Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

        camera.setParameters(params);
        camera.startPreview();
    }

    // private void initializeSensors() {
    // sensorManager = (SensorManager) SampleActivity.context
    // .getSystemService(Context.SENSOR_SERVICE);
    //
    // sensorPressure = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
    // }

    // private void initializeLocation() {
    // locationManager = (LocationManager) SampleActivity.context
    // .getSystemService(Context.LOCATION_SERVICE);
    //
    // locationManager.requestLocationUpdates(
    // LocationManager.NETWORK_PROVIDER, 5, 0, this);
    //
    // location = locationManager
    // .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    //
    // if (location != null) {
    // latitude = location.getLatitude();
    // longitude = location.getLongitude();
    // }
    // }

    private void setFps() {
        ++imageCount;
        if (imageCount % imageStep == 0) {
            long time = Core.getTickCount();
            imageFps = Math.round(imageStep * imageFreq / (time - imageTime) * 100.0) / 100.0;
            imageTime = time;
        }
    }

    // @Override
    // public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // // TODO Auto-generated method stub
    // }
    //
    // @Override
    // public void onSensorChanged(SensorEvent event) {
    // switch (event.sensor.getType()) {
    // case Sensor.TYPE_PRESSURE:
    // pressure = event.values[0];
    // altitude = Math
    // .round(SensorManager.getAltitude(
    // SensorManager.PRESSURE_STANDARD_ATMOSPHERE,
    // pressure) * 10.00) / 10.00;
    // break;
    // }
    // }
    //
    // @Override
    // public void onLocationChanged(Location location) {
    // this.location = location;
    // latitude = this.location.getLatitude();
    // longitude = this.location.getLongitude();
    // }
    //
    // @Override
    // public void onProviderDisabled(String provider) {
    // // TODO Auto-generated method stub
    //
    // }
    //
    // @Override
    // public void onProviderEnabled(String provider) {
    // // TODO Auto-generated method stub
    //
    // }
    //
    // @Override
    // public void onStatusChanged(String provider, int status, Bundle extras) {
    // // TODO Auto-generated method stub
    //
    // }
}