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