1package org.opencv.samples.puzzle15;
2
3import org.opencv.android.BaseLoaderCallback;
4import org.opencv.android.LoaderCallbackInterface;
5import org.opencv.android.OpenCVLoader;
6import org.opencv.core.Mat;
7import org.opencv.android.CameraBridgeViewBase;
8import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener;
9import org.opencv.android.JavaCameraView;
10
11import android.os.Bundle;
12import android.app.Activity;
13import android.util.Log;
14import android.view.Menu;
15import android.view.MenuItem;
16import android.view.MotionEvent;
17import android.view.View;
18import android.view.WindowManager;
19
20public class Puzzle15Activity extends Activity implements CvCameraViewListener, View.OnTouchListener {
21
22    private static final String  TAG = "Sample::Puzzle15::Activity";
23
24    private CameraBridgeViewBase mOpenCvCameraView;
25    private Puzzle15Processor    mPuzzle15;
26    private MenuItem             mItemHideNumbers;
27    private MenuItem             mItemStartNewGame;
28
29
30    private int                  mGameWidth;
31    private int                  mGameHeight;
32
33    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
34
35        @Override
36        public void onManagerConnected(int status) {
37            switch (status) {
38                case LoaderCallbackInterface.SUCCESS:
39                {
40                    Log.i(TAG, "OpenCV loaded successfully");
41
42                    /* Now enable camera view to start receiving frames */
43                    mOpenCvCameraView.setOnTouchListener(Puzzle15Activity.this);
44                    mOpenCvCameraView.enableView();
45                } break;
46                default:
47                {
48                    super.onManagerConnected(status);
49                } break;
50            }
51        }
52    };
53
54    @Override
55    public void onCreate(Bundle savedInstanceState) {
56        super.onCreate(savedInstanceState);
57        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
58
59        Log.d(TAG, "Creating and setting view");
60        mOpenCvCameraView = (CameraBridgeViewBase) new JavaCameraView(this, -1);
61        setContentView(mOpenCvCameraView);
62        mOpenCvCameraView.setCvCameraViewListener(this);
63        mPuzzle15 = new Puzzle15Processor();
64        mPuzzle15.prepareNewGame();
65    }
66
67    @Override
68    public void onPause()
69    {
70        super.onPause();
71        if (mOpenCvCameraView != null)
72            mOpenCvCameraView.disableView();
73    }
74
75    @Override
76    public void onResume()
77    {
78        super.onResume();
79        if (!OpenCVLoader.initDebug()) {
80            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
81            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
82        } else {
83            Log.d(TAG, "OpenCV library found inside package. Using it!");
84            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
85        }
86    }
87
88    public void onDestroy() {
89        super.onDestroy();
90        if (mOpenCvCameraView != null)
91            mOpenCvCameraView.disableView();
92    }
93
94    @Override
95    public boolean onCreateOptionsMenu(Menu menu) {
96        Log.i(TAG, "called onCreateOptionsMenu");
97        mItemHideNumbers = menu.add("Show/hide tile numbers");
98        mItemStartNewGame = menu.add("Start new game");
99        return true;
100    }
101
102    @Override
103    public boolean onOptionsItemSelected(MenuItem item) {
104        Log.i(TAG, "Menu Item selected " + item);
105        if (item == mItemStartNewGame) {
106            /* We need to start new game */
107            mPuzzle15.prepareNewGame();
108        } else if (item == mItemHideNumbers) {
109            /* We need to enable or disable drawing of the tile numbers */
110            mPuzzle15.toggleTileNumbers();
111        }
112        return true;
113    }
114
115    public void onCameraViewStarted(int width, int height) {
116        mGameWidth = width;
117        mGameHeight = height;
118        mPuzzle15.prepareGameSize(width, height);
119    }
120
121    public void onCameraViewStopped() {
122    }
123
124    public boolean onTouch(View view, MotionEvent event) {
125        int xpos, ypos;
126
127        xpos = (view.getWidth() - mGameWidth) / 2;
128        xpos = (int)event.getX() - xpos;
129
130        ypos = (view.getHeight() - mGameHeight) / 2;
131        ypos = (int)event.getY() - ypos;
132
133        if (xpos >=0 && xpos <= mGameWidth && ypos >=0  && ypos <= mGameHeight) {
134            /* click is inside the picture. Deliver this event to processor */
135            mPuzzle15.deliverTouchEvent(xpos, ypos);
136        }
137
138        return false;
139    }
140
141    public Mat onCameraFrame(Mat inputFrame) {
142        return mPuzzle15.puzzleFrame(inputFrame);
143    }
144}
145