1227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks/*
2227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Copyright (C) 2013 The Android Open Source Project
3227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
4227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Licensed under the Apache License, Version 2.0 (the "License");
5227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * you may not use this file except in compliance with the License.
6227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * You may obtain a copy of the License at
7227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
8227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *      http://www.apache.org/licenses/LICENSE-2.0
9227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks *
10227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * Unless required by applicable law or agreed to in writing, software
11227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * distributed under the License is distributed on an "AS IS" BASIS,
12227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * See the License for the specific language governing permissions and
14227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks * limitations under the License.
15227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks */
16227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
17227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspackage androidx.media.filterfw.samples.simplecamera;
18227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
19227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.app.Activity;
20227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.content.Intent;
21227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.graphics.Bitmap;
22227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.graphics.drawable.BitmapDrawable;
23227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.graphics.drawable.Drawable;
24227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.os.Bundle;
25227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.os.Handler;
26227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.provider.MediaStore;
27227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.util.Log;
28227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.view.LayoutInflater;
29227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.view.SurfaceView;
30227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.view.View;
31227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.view.View.OnClickListener;
32227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.widget.AdapterView;
33227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.widget.Button;
34227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.widget.ImageView;
35227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.widget.LinearLayout;
36227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.widget.Spinner;
37227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport android.widget.TextView;
38227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.FilterGraph;
39227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.GraphReader;
40227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.GraphRunner;
41227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport androidx.media.filterfw.MffContext;
42227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
43227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.io.IOException;
44227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.text.SimpleDateFormat;
45227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.ArrayList;
46227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricksimport java.util.Calendar;
47227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
48227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
49227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendrickspublic class SmartCamera extends Activity {
50227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
51227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private SurfaceView mCameraView;
52227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private TextView mGoodBadTextView;
53227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private TextView mFPSTextView;
54227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private TextView mEyesTextView;
55227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private TextView mSmilesTextView;
56227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private TextView mScoreTextView;
57227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static ImageView mImageView1;
58227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static ImageView mImageView2;
59227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static ImageView mImageView3;
60227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static ImageView mImageView4;
61227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static ImageView mImageView5;
62227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Button mStartStopButton;
63227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private TextView mImagesSavedTextView;
64227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Spinner mSpinner;
65227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private LinearLayout mLinearLayout;
66227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
67227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private MffContext mContext;
68227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private FilterGraph mGraph;
69227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private GraphRunner mRunner;
70227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private Handler mHandler = new Handler();
71227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
72227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static final String TAG = "SmartCamera";
73227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static final boolean sUseFacialExpression = false;
74227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private boolean isPendingRunGraph = false;
75227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
76227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static ArrayList<ImageView> mImages;
77227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static int count = -1;
78227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static boolean countHasReachedMax = false;
79227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private static int numImages = 0;
80227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
81227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // Function to return the correct image view to display the current bitmap
82227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public static ImageView getImageView() {
83227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (count == numImages-1) countHasReachedMax = true;
84227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        count = (count+1) % numImages;
85227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        return mImages.get(count);
86227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
87227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
88227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // Function used to run images through the graph, mainly for CSV data generation
89227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void runGraphOnImage(String filePath, String fileName) {
90227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if(fileName.endsWith(".jpg") == false) {
91227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            return;
92227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
93227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mGraph.getVariable("gallerySource").setValue(filePath + "/" + fileName);
94227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "runGraphOnImage : : " + filePath + " name: " + fileName);
95227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mGraph.getVariable("imageName").setValue(fileName);
96227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mGraph.getVariable("filePath").setValue(filePath); // wrong
97227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
98227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            Thread.sleep(400);
99227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (InterruptedException e) {
100227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // TODO Auto-generated catch block
101227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
102227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
103227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
104227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
105227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // Function to clear the "Images Saved" text off the screen
106227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private void clearImagesSavedTextView() {
107227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mImagesSavedTextView.setText("");
108227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
109227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
110227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // Function to capture the images in the current imageviews and save them to the gallery
111227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private void captureImages() {
112227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        ((WaveTriggerFilter) mGraph.getFilter("snapEffect")).trigger();
113227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mGraph.getVariable("startCapture").setValue(false);
114227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Bitmap bitmap = null;
115227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Drawable res = getResources().getDrawable(R.drawable.black_screen);
116227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Calendar cal = Calendar.getInstance();
117227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
118227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
119227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.v(TAG, "numImages: " + numImages + " count: " + count +
120227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                " hasReachedMax: " + countHasReachedMax);
121227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        int maxI = countHasReachedMax ? numImages : count+1;
122227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if(maxI != 0) {
123227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (maxI == 1) mImagesSavedTextView.setText("Image Saved");
124227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            else {
125227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mImagesSavedTextView.setText("" + maxI + " Images Saved");
126227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
127227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
128227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        for (int i = 0; i < maxI; i++) {
129227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            bitmap = ((BitmapDrawable)mImages.get(i).getDrawable()).getBitmap();
130227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mImages.get(i).setImageDrawable(res);
131227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            MediaStore.Images.Media.insertImage(getContentResolver(), bitmap,
132227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    sdf.format(cal.getTime()) + "_image" + i + ".jpg", "image " + i);
133227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
134227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mStartStopButton.setText("Start");
135227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        count = -1;
136227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        countHasReachedMax = false;
137227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mSpinner.setEnabled(true);
138227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mHandler.postDelayed(new Runnable() {
139227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            public void run() {
140227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                clearImagesSavedTextView();
141227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
142227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }, 5000);
143227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
144227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
145227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
146227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void onCreate(Bundle savedInstanceState) {
147227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super.onCreate(savedInstanceState);
148227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        setContentView(R.layout.simplecamera);
149227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        setTitle("Smart Camera");
150227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
151227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mContext = new MffContext(this);
152227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
153227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mCameraView = (SurfaceView) findViewById(R.id.cameraView);
154227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mGoodBadTextView = (TextView) findViewById(R.id.goodOrBadTextView);
155227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mFPSTextView = (TextView) findViewById(R.id.fpsTextView);
156227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mScoreTextView = (TextView) findViewById(R.id.scoreTextView);
157227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mStartStopButton = (Button) findViewById(R.id.startButton);
158227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mImagesSavedTextView = (TextView) findViewById(R.id.imagesSavedTextView);
159227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mImagesSavedTextView.setText("");
160227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mSpinner = (Spinner) findViewById(R.id.spinner);
161227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mLinearLayout = (LinearLayout) findViewById(R.id.scrollViewLinearLayout);
162227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mImages = new ArrayList<ImageView>();
163227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
164227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        // Spinner is used to determine how many image views are displayed at the bottom
165227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        // of the screen. Based on the item position that is selected, we inflate that
166227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        // many imageviews into the bottom linear layout.
167227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
168227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            @Override
169227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            public void onItemSelected(AdapterView<?> parentView, View selectedItemView,
170227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    int position, long id) {
171227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mLinearLayout.removeViews(0,numImages);
172227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                numImages = position+1;
173227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mImages.clear();
174227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                LayoutInflater inflater = getLayoutInflater();
175227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                for (int i = 0; i < numImages; i++) {
176227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    ImageView tmp = (ImageView) inflater.inflate(R.layout.imageview, null);
177227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mImages.add(tmp);
178227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mLinearLayout.addView(tmp);
179227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                }
180227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
181227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
182227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            @Override
183227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            public void onNothingSelected(AdapterView<?> parentView) {
184227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
185227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        });
186227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
187227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        numImages = mSpinner.getSelectedItemPosition()+1;
188227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mImages.clear();
189227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        LayoutInflater inflater = getLayoutInflater();
190227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        for (int i = 0; i < numImages; i++) {
191227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            ImageView tmp = (ImageView) inflater.inflate(R.layout.imageview, null);
192227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mImages.add(tmp);
193227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mLinearLayout.addView(tmp);
194227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
195227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
196227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
197227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        // Button used to start and stop the capture of images when they are deemed great
198227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mStartStopButton.setOnClickListener(new OnClickListener() {
199227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            @Override
200227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            public void onClick(View v) {
201227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                if (mStartStopButton.getText().equals("Start")) {
202227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mGraph.getVariable("startCapture").setValue(true);
203227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mStartStopButton.setText("Stop");
204227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    mSpinner.setEnabled(false);
205227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                } else {
206227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    boolean tmp = (Boolean) mGraph.getVariable("startCapture").getValue();
207227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    if (tmp == false) {
208227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                        return;
209227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    }
210227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    if (count == numImages-1) countHasReachedMax = true;
211227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                    captureImages();
212227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                }
213227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
214227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        });
215227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
216227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        // Button to open the gallery to show the images in there
217227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Button galleryOpen = (Button) findViewById(R.id.galleryOpenButton);
218227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        galleryOpen.setOnClickListener(new OnClickListener() {
219227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks           @Override
220227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks           public void onClick(View v) {
221227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks               Intent openGalleryIntent = new Intent(Intent.ACTION_MAIN);
222227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks               openGalleryIntent.addCategory(Intent.CATEGORY_APP_GALLERY);
223227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks               startActivity(openGalleryIntent);
224227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks           }
225227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        });
226227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
227227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        loadGraph();
228227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mGraph.getVariable("startCapture").setValue(false);
229227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        runGraph();
230227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
231227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
232227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
233227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void onPause() {
234227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super.onPause();
235227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.i(TAG, "onPause");
236227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (mContext != null) {
237227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mContext.onPause();
238227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
239227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
240227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
241227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
242227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void onResume() {
243227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super.onResume();
244227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.i(TAG, "onResume");
245227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (mContext != null) {
246227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mContext.onResume();
247227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
248227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        if (isPendingRunGraph) {
249227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            isPendingRunGraph = false;
250227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            runGraph();
251227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
252227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
253227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
254227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    @Override
255227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    public void onStop() {
256227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        super.onStop();
257227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        Log.i(TAG, "onStop");
258227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
259227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
260227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // Build the Filtergraph for Camera
261227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private void loadGraph() {
262227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        try {
263227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mGraph = GraphReader.readXmlGraphResource(mContext, R.raw.camera_graph);
264227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mRunner = mGraph.getRunner();
265227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
266227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // Connect views
267227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mGraph.bindFilterToView("camViewTarget", mCameraView);
268227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mGraph.bindFilterToView("goodOrBadTextView", mGoodBadTextView);
269227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mGraph.bindFilterToView("fpsTextView", mFPSTextView);
270227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            mGraph.bindFilterToView("scoreTextView", mScoreTextView);
271227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
272227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            // Used for Facial Expressions
273227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            if (sUseFacialExpression) {
274227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mGraph.bindFilterToView("eyesTextView", mEyesTextView);
275227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks                mGraph.bindFilterToView("smilesTextView", mSmilesTextView);
276227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            }
277227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
278227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        } catch (IOException e) {
279227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks            e.printStackTrace();
280227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        }
281227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
282227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks
283227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    // Asynchronously run the filtergraph
284227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    private void runGraph() {
285227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mRunner.setIsVerbose(true);
286227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks        mRunner.start(mGraph);
287227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks    }
288227b47625d7482b5b47ad0e4c70ce0a246236adeBenjamin Hendricks}
289