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 Talvalapackage com.android.testingcamera2;
177c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
187c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.lang.reflect.Array;
197c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport java.util.Locale;
207c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
217c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.app.AlertDialog;
227c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.app.Dialog;
237c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.app.DialogFragment;
247c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.content.Context;
257c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.content.DialogInterface;
267c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.hardware.camera2.CameraAccessException;
277c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.hardware.camera2.CameraCharacteristics;
287c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.hardware.camera2.CameraManager;
297c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.hardware.camera2.CameraMetadata;
307c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalaimport android.os.Bundle;
317c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
327c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala/**
337c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * A simple dialog that writes out a given camera's camera characteristics into its message.
347c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
357c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala * <p>Does not depend on the rest of TestingCamera for operation.</p>
367c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala *
377c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala */
387c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvalapublic class CameraInfoDialogFragment extends DialogFragment {
397c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
407c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private String mCameraId;
417c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
427c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public CameraInfoDialogFragment() {
437c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        super();
447c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mCameraId = null;
457c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
467c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
477c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    /**
487c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * Set the camera ID for which to display the information.
497c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     *
507c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * <p>Only effective if called before showing the dialog.</p>
517c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     */
527c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public void setCameraId(String cameraId) {
537c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        mCameraId = cameraId;
547c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
557c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
567c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    @Override
577c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    public Dialog onCreateDialog(Bundle savedInstanceState) {
587c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
597c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
607c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        String title = String.format("Info: Camera %s", mCameraId);
617c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
627c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        CameraCharacteristics info = null;
637c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        if (mCameraId != null) {
647c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            try {
657c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                info = ((CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE)).
667c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                        getCameraCharacteristics(mCameraId);
677c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            } catch (CameraAccessException e) {
687c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                TLog.e(String.format("Can't get characteristics for camera %s: %s", mCameraId, e));
697c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
707c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
717c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
727c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        String infoText = formatCameraCharacteristics(info);
737c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
747c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        builder.setTitle(title)
757c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala               .setMessage(infoText)
767c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala               .setPositiveButton(R.string.camera_info_dialog_ok_button,
777c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                       new DialogInterface.OnClickListener() {
780cba9f728f67e2b04e5356829dbb2e9b97ea0edeIgor Murashkin                @Override
790cba9f728f67e2b04e5356829dbb2e9b97ea0edeIgor Murashkin                public void onClick(DialogInterface dialog, int id) {
807c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                       // do nothing, dialog fragment will hide itself
817c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                   }
827c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala               });
837c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
847c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        return builder.create();
857c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
867c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
877c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    /**
887c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * Convert camera characteristics into a key = values list for display
897c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * @param info camera characteristics to format
907c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     * @return a multi-line string containing the list of key = value pairs
917c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala     */
927c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    // Assumes every value type has a reasonable toString()
937c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    private String formatCameraCharacteristics(CameraCharacteristics info) {
947c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        String infoText;
957c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        if (info != null) {
967c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            StringBuilder infoBuilder = new StringBuilder("Camera characteristics:\n\n");
977c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
980cba9f728f67e2b04e5356829dbb2e9b97ea0edeIgor Murashkin            for (CameraCharacteristics.Key<?> key : info.getKeys()) {
997c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                infoBuilder.append(String.format(Locale.US, "%s:  ", key.getName()));
1007c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1017c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                Object val = info.get(key);
1027c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                if (val.getClass().isArray()) {
1037c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    // Iterate an array-type value
1047c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    // Assumes camera characteristics won't have arrays of arrays as values
1057c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    int len = Array.getLength(val);
1067c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    infoBuilder.append("[ ");
1077c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    for (int i = 0; i < len; i++) {
1087c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                        infoBuilder.append(String.format(Locale.US,
1097c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                                "%s%s",
1107c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                                Array.get(val, i),
1117c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                                (i + 1 == len ) ? "" : ", "));
1127c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    }
1137c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    infoBuilder.append(" ]\n\n");
1147c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                } else {
1157c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    // Single value
1167c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                    infoBuilder.append(String.format(Locale.US, "%s\n\n", val.toString()));
1177c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala                }
1187c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            }
1197c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            infoText = infoBuilder.toString();
1207c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        } else {
1217c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala            infoText = "No info";
1227c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        }
1237c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala        return infoText;
1247c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala    }
1257c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala
1267c5f2935442e974ce30158e35d142f7e2c3ee1a2Eino-Ville Talvala}
127