1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.testingcamera2; 17 18 import java.lang.reflect.Array; 19 import java.util.Locale; 20 21 import android.app.AlertDialog; 22 import android.app.Dialog; 23 import android.app.DialogFragment; 24 import android.content.Context; 25 import android.content.DialogInterface; 26 import android.hardware.camera2.CameraAccessException; 27 import android.hardware.camera2.CameraCharacteristics; 28 import android.hardware.camera2.CameraManager; 29 import android.hardware.camera2.CameraMetadata; 30 import android.os.Bundle; 31 32 /** 33 * A simple dialog that writes out a given camera's camera characteristics into its message. 34 * 35 * <p>Does not depend on the rest of TestingCamera for operation.</p> 36 * 37 */ 38 public class CameraInfoDialogFragment extends DialogFragment { 39 40 private String mCameraId; 41 CameraInfoDialogFragment()42 public CameraInfoDialogFragment() { 43 super(); 44 mCameraId = null; 45 } 46 47 /** 48 * Set the camera ID for which to display the information. 49 * 50 * <p>Only effective if called before showing the dialog.</p> 51 */ setCameraId(String cameraId)52 public void setCameraId(String cameraId) { 53 mCameraId = cameraId; 54 } 55 56 @Override onCreateDialog(Bundle savedInstanceState)57 public Dialog onCreateDialog(Bundle savedInstanceState) { 58 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 59 60 String title = String.format("Info: Camera %s", mCameraId); 61 62 CameraCharacteristics info = null; 63 if (mCameraId != null) { 64 try { 65 info = ((CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE)). 66 getCameraCharacteristics(mCameraId); 67 } catch (CameraAccessException e) { 68 TLog.e(String.format("Can't get characteristics for camera %s: %s", mCameraId, e)); 69 } 70 } 71 72 String infoText = formatCameraCharacteristics(info); 73 74 builder.setTitle(title) 75 .setMessage(infoText) 76 .setPositiveButton(R.string.camera_info_dialog_ok_button, 77 new DialogInterface.OnClickListener() { 78 @Override 79 public void onClick(DialogInterface dialog, int id) { 80 // do nothing, dialog fragment will hide itself 81 } 82 }); 83 84 return builder.create(); 85 } 86 87 /** 88 * Convert camera characteristics into a key = values list for display 89 * @param info camera characteristics to format 90 * @return a multi-line string containing the list of key = value pairs 91 */ 92 // Assumes every value type has a reasonable toString() formatCameraCharacteristics(CameraCharacteristics info)93 private String formatCameraCharacteristics(CameraCharacteristics info) { 94 String infoText; 95 if (info != null) { 96 StringBuilder infoBuilder = new StringBuilder("Camera characteristics:\n\n"); 97 98 for (CameraCharacteristics.Key<?> key : info.getKeys()) { 99 infoBuilder.append(String.format(Locale.US, "%s: ", key.getName())); 100 101 Object val = info.get(key); 102 if (val.getClass().isArray()) { 103 // Iterate an array-type value 104 // Assumes camera characteristics won't have arrays of arrays as values 105 int len = Array.getLength(val); 106 infoBuilder.append("[ "); 107 for (int i = 0; i < len; i++) { 108 infoBuilder.append(String.format(Locale.US, 109 "%s%s", 110 Array.get(val, i), 111 (i + 1 == len ) ? "" : ", ")); 112 } 113 infoBuilder.append(" ]\n\n"); 114 } else { 115 // Single value 116 infoBuilder.append(String.format(Locale.US, "%s\n\n", val.toString())); 117 } 118 } 119 infoText = infoBuilder.toString(); 120 } else { 121 infoText = "No info"; 122 } 123 return infoText; 124 } 125 126 } 127