17c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala/*
27c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * Copyright (C) 2014 The Android Open Source Project
37c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
47c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
57c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * you may not use this file except in compliance with the License.
67c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * You may obtain a copy of the License at
77c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
87c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
97c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
107c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
117c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
127c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * See the License for the specific language governing permissions and
147c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * limitations under the License.
157c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala */
167c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
177c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalapackage com.android.testingcamera2;
187c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
197c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.content.Context;
207c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.hardware.camera2.CameraDevice;
217c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.hardware.camera2.CaptureRequest;
227c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.util.AttributeSet;
237c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.view.LayoutInflater;
247c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.view.Surface;
257c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.view.View;
267c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.widget.ArrayAdapter;
277c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.widget.Button;
283e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunkimport android.widget.ListView;
297c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.widget.Spinner;
307c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
317c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport org.xmlpull.v1.XmlPullParser;
327c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport org.xmlpull.v1.XmlPullParserException;
337c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
347c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.io.IOException;
357c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.ArrayList;
367c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.List;
377c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.Locale;
387c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
397c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalapublic class RequestControlPane extends ControlPane {
407c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    // XML attributes
417c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
427c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    /** Name of pane tag */
437c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private static final String PANE_NAME = "request_pane";
447c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
457c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    /** Attribute: ID for pane (integer) */
467c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private static final String PANE_ID = "id";
477c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
487c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    // End XML attributes
497c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
507c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private enum TemplateType {
517c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        MANUAL(CameraDevice.TEMPLATE_MANUAL),
527c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        PREVIEW(CameraDevice.TEMPLATE_PREVIEW),
537c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        RECORD(CameraDevice.TEMPLATE_RECORD),
547c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        STILL_CAPTURE(CameraDevice.TEMPLATE_STILL_CAPTURE),
557c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        VIDEO_SNAPSHOT(CameraDevice.TEMPLATE_VIDEO_SNAPSHOT),
567c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        ZERO_SHUTTER_LAG(CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG);
577c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
587c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        private int mTemplateVal;
597c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
607c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        TemplateType(int templateVal) {
617c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            mTemplateVal = templateVal;
627c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
637c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
647c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        int getTemplateValue() {
657c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            return mTemplateVal;
667c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
677c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
687c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
697c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private static int mRequestPaneIdCounter = 0;
707c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
717c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private final int mPaneId;
727c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
737c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private List<CameraControlPane> mCameraPanes;
747c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private final List<TargetControlPane> mTargetPanes = new ArrayList<TargetControlPane>();
757c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
767c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private Spinner mCameraSpinner;
777c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private Spinner mTemplateSpinner;
783e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk    private ListView mOutputListView;
793e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk
803e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk    private CheckableListAdapter mOutputAdapter;
817c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
827c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    /**
837c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * Constructor for tooling only
847c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     */
857c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public RequestControlPane(Context context, AttributeSet attrs) {
867c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        super(context, attrs, null, null);
877c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
887c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mPaneId = 0;
897c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        setUpUI(context);
907c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
917c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
927c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public RequestControlPane(TestingCamera21 tc, AttributeSet attrs, StatusListener listener) {
937c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        super(tc, attrs, listener, tc.getPaneTracker());
947c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
957c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mPaneId = mRequestPaneIdCounter++;
967c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        setUpUI(tc);
977c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
987c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
997c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public RequestControlPane(TestingCamera21 tc, XmlPullParser configParser,
1007c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            StatusListener listener) throws XmlPullParserException, IOException {
1017c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        super(tc, null, listener, tc.getPaneTracker());
1027c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1037c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        this.setName(tc.getResources().getString(R.string.request_pane_title));
1047c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1057c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        configParser.require(XmlPullParser.START_TAG, XmlPullParser.NO_NAMESPACE, PANE_NAME);
1067c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1077c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        int paneId = getAttributeInt(configParser, PANE_ID, -1);
1087c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        if (paneId == -1) {
1097c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            mPaneId = mRequestPaneIdCounter++;
1107c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        } else {
1117c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            mPaneId = paneId;
1127c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (mPaneId >= mRequestPaneIdCounter) {
1137c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                mRequestPaneIdCounter = mPaneId + 1;
1147c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
1157c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1167c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1177c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        configParser.next();
1187c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        configParser.require(XmlPullParser.END_TAG, XmlPullParser.NO_NAMESPACE, PANE_NAME);
1197c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1207c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        setUpUI(tc);
1217c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1227c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1237c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public void notifyPaneEvent(ControlPane sourcePane, PaneTracker.PaneEvent event) {
1247c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        switch (event) {
1257c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            case NEW_CAMERA_SELECTED:
1267c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                if (mCameraPanes.size() > 0
1277c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                        && sourcePane == mCameraPanes.get(mCameraSpinner.getSelectedItemPosition())) {
1287c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    updateOutputList();
1297c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                }
1307c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                break;
1317c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            case CAMERA_CONFIGURED:
1327c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                if (mCameraPanes.size() > 0
1337c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                        && sourcePane == mCameraPanes.get(mCameraSpinner.getSelectedItemPosition())) {
1347c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    updateOutputList();
1357c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                }
1367c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                break;
1377c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            default:
1387c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                super.notifyPaneEvent(sourcePane, event);
1397c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1407c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1417c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1427c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private void setUpUI(Context context) {
1437c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        String paneName =
1447c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                String.format(Locale.US, "%s %d",
1457c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                        context.getResources().getString(R.string.request_pane_title), mPaneId);
1467c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        this.setName(paneName);
1477c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1487c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        LayoutInflater inflater =
1497c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
1507c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1517c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        inflater.inflate(R.layout.request_pane, this);
1527c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1537c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        Button captureButton = (Button) findViewById(R.id.request_pane_capture_button);
1547c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        captureButton.setOnClickListener(mCaptureButtonListener);
1557c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        Button repeatButton = (Button) findViewById(R.id.request_pane_repeat_button);
1567c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        repeatButton.setOnClickListener(mRepeatButtonListener);
1577c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1587c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mCameraSpinner = (Spinner) findViewById(R.id.request_pane_camera_spinner);
1597c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mTemplateSpinner = (Spinner) findViewById(R.id.request_pane_template_spinner);
1603e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk        mOutputListView = (ListView) findViewById(R.id.request_pane_output_listview);
1613e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk
1623e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk        mOutputAdapter = new CheckableListAdapter(context, R.layout.checkable_list_item,
1633e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk                new ArrayList<CheckableListAdapter.CheckableItem>());
1643e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk        mOutputListView.setAdapter(mOutputAdapter);
1657c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1667c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        String[] templateNames = new String[TemplateType.values().length];
1677c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        for (int i = 0; i < templateNames.length; i++) {
1687c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            templateNames[i] = TemplateType.values()[i].toString();
1697c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1707c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mTemplateSpinner.setAdapter(new ArrayAdapter<String>(getContext(), R.layout.spinner_item,
1717c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                templateNames));
1727c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1737c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mPaneTracker.addPaneListener(new CameraPanesListener());
1747c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mCameraPanes = mPaneTracker.getPanes(CameraControlPane.class);
1757c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        updateCameraPaneList();
1767c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1777c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1787c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private class CameraPanesListener extends PaneTracker.PaneSetChangedListener<CameraControlPane> {
1797c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public CameraPanesListener() {
1807c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            super(CameraControlPane.class);
1817c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1827c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1837c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        @Override
1847c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public void onPaneAdded(ControlPane pane) {
1857c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            mCameraPanes.add((CameraControlPane) pane);
1867c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            updateCameraPaneList();
1877c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1887c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1897c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        @Override
1907c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public void onPaneRemoved(ControlPane pane) {
1917c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            mCameraPanes.remove((CameraControlPane) pane);
1927c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            updateCameraPaneList();
1937c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1947c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1957c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1967c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private OnClickListener mCaptureButtonListener = new OnClickListener() {
1977c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        @Override
1987c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public void onClick(View v) {
1997c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (mCameraPanes.size() == 0) {
2007c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                TLog.e("No camera selected for request");
2017c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                return;
2027c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
2037c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            CameraControlPane camera = mCameraPanes.get(mCameraSpinner.getSelectedItemPosition());
2047c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2057c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            CaptureRequest request = createRequest(camera);
2067c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (request != null) {
2077c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                camera.capture(request);
2087c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
2097c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
2107c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    };
2117c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2127c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private OnClickListener mRepeatButtonListener = new OnClickListener() {
2137c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        @Override
2147c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        public void onClick(View v) {
2157c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (mCameraPanes.size() == 0) {
2167c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                TLog.e("No camera selected for request");
2177c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                return;
2187c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
2197c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            CameraControlPane camera = mCameraPanes.get(mCameraSpinner.getSelectedItemPosition());
2207c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2217c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            CaptureRequest request = createRequest(camera);
2227c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (request != null) {
2237c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                camera.repeat(request);
2247c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
2257c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
2267c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    };
2277c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2287c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private CaptureRequest createRequest(CameraControlPane camera) {
2297c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        if (mTargetPanes.size() == 0) {
2307c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            TLog.e("No target(s) selected for request");
2317c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            return null;
2327c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
2337c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2347c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2357c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        TemplateType template = TemplateType.valueOf((String) mTemplateSpinner.getSelectedItem());
2367c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        CaptureRequest.Builder builder = camera.getRequestBuilder(template.getTemplateValue());
2377c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        // TODO: Add setting overrides
2383e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk
2393e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk        List<Integer> targetPostions = mOutputAdapter.getCheckedPositions();
2403e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk        for (int i : targetPostions) {
2413e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk            TargetControlPane target = mTargetPanes.get(i);
2423e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk            Surface targetSurface = target.getTargetSurfaceForCameraPane(camera.getPaneName());
2433e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk            if (targetSurface == null) {
2443e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk                TLog.e("Target not configured for camera");
2453e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk                return null;
2463e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk            }
2473e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk            builder.addTarget(targetSurface);
2483e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk        }
2493e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk
2507c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        CaptureRequest request = builder.build();
2517c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        return request;
2527c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
2537c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2547c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private void updateCameraPaneList() {
2557c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        String currentSelection = (String) mCameraSpinner.getSelectedItem();
2567c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        int newSelectionIndex = 0;
2577c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        String[] cameraSpinnerItems = new String[mCameraPanes.size()];
2587c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        for (int i = 0; i < cameraSpinnerItems.length; i++) {
2597c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            cameraSpinnerItems[i] = mCameraPanes.get(i).getPaneName();
2607c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (cameraSpinnerItems[i].equals(currentSelection)) {
2617c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                newSelectionIndex = i;
2627c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
2637c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
2647c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mCameraSpinner.setAdapter(new ArrayAdapter<String>(getContext(), R.layout.spinner_item,
2657c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                cameraSpinnerItems));
2667c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mCameraSpinner.setSelection(newSelectionIndex);
2677c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2687c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        updateOutputList();
2697c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
2707c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2717c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private void updateOutputList() {
2727c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        if (mCameraPanes.size() > 0) {
2737c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            CameraControlPane currentCamera =
2747c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    mCameraPanes.get(mCameraSpinner.getSelectedItemPosition());
2757c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            mTargetPanes.clear();
2767c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            List<TargetControlPane> newPanes = currentCamera.getCurrentConfiguredTargets();
2777c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            if (newPanes != null) {
2787c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                mTargetPanes.addAll(currentCamera.getCurrentConfiguredTargets());
2797c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
2807c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2817c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            String[] outputSpinnerItems = new String[mTargetPanes.size()];
2827c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            for (int i = 0; i < outputSpinnerItems.length; i++) {
2837c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                outputSpinnerItems[i] = mTargetPanes.get(i).getPaneName();
2847c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
2853e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk
2863e2b3ad76d90a3fb663c7b04794afe534a1f9066Ruben Brunk            mOutputAdapter.updateItems(outputSpinnerItems);
2877c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2887c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
2897c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
2907c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
2917c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala}
292