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 17 package com.android.camera.one; 18 19 import java.io.File; 20 import java.text.SimpleDateFormat; 21 import java.util.Date; 22 import java.util.TimeZone; 23 24 /** 25 * A common abstract {@link OneCamera} implementation that contains some utility 26 * functions and plumbing we don't want every sub-class of {@link OneCamera} to 27 * duplicate. Hence all {@link OneCamera} implementations should sub-class this 28 * class instead. 29 */ 30 public abstract class AbstractOneCamera implements OneCamera { 31 protected FocusStateListener mFocusStateListener; 32 protected ReadyStateChangedListener mReadyStateChangedListener; 33 protected FocusDistanceListener mFocusDistanceListener; 34 35 /** 36 * Number of characters from the end of the device serial number used to 37 * construct folder names for debugging output. 38 */ 39 static final int DEBUG_FOLDER_SERIAL_LENGTH = 4; 40 41 @Override setFocusStateListener(FocusStateListener listener)42 public final void setFocusStateListener(FocusStateListener listener) { 43 mFocusStateListener = listener; 44 } 45 46 @Override setFocusDistanceListener(FocusDistanceListener listener)47 public void setFocusDistanceListener(FocusDistanceListener listener) { 48 mFocusDistanceListener = listener; 49 } 50 51 @Override setReadyStateChangedListener(ReadyStateChangedListener listener)52 public void setReadyStateChangedListener(ReadyStateChangedListener listener) { 53 mReadyStateChangedListener = listener; 54 } 55 56 /** 57 * Create a directory we can use to store debugging information during Gcam 58 * captures. 59 * <br /> 60 * The directory created is [root]/[folderName]/SSSS_YYYYMMDD_HHMMSS_XXX, 61 * where 'SSSS' are the last 'DEBUG_FOLDER_SERIAL_LENGTH' digits of the 62 * devices serial number, and 'XXX' are milliseconds of the timestamp. 63 * 64 * @param root the root into which we put a session-specific sub-directory. 65 * @param folderName the sub-folder within 'root' where the data should be 66 * put. 67 * @return The session-specific directory (absolute path) into which to 68 * store debug information. 69 */ makeDebugDir(File root, String folderName)70 protected static String makeDebugDir(File root, String folderName) { 71 if (root == null) { 72 return null; 73 } 74 if (!root.exists() || !root.isDirectory()) { 75 throw new RuntimeException("Gcam debug directory not valid or doesn't exist: " 76 + root.getAbsolutePath()); 77 } 78 79 String serialSubstring = ""; 80 String serial = android.os.Build.SERIAL; 81 if (serial != null) { 82 int length = serial.length(); 83 84 if (length > DEBUG_FOLDER_SERIAL_LENGTH) { 85 serialSubstring = serial.substring(length - DEBUG_FOLDER_SERIAL_LENGTH, length); 86 } else { 87 serialSubstring = serial; 88 } 89 } 90 91 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss_SSS"); 92 simpleDateFormat.setTimeZone(TimeZone.getDefault()); 93 String currentDateAndTime = simpleDateFormat.format(new Date()); 94 95 String burstFolderName = String.format("%s_%s", serialSubstring, currentDateAndTime); 96 File destFolder = new File(new File(root, folderName), burstFolderName); 97 if (!destFolder.mkdirs()) { 98 throw new RuntimeException("Could not create Gcam debug data folder."); 99 } 100 String destFolderPath = destFolder.getAbsolutePath(); 101 return destFolderPath; 102 } 103 104 /** 105 * If set, tells the ready state changed listener the new state. 106 */ broadcastReadyState(boolean readyForCapture)107 protected void broadcastReadyState(boolean readyForCapture) { 108 if (mReadyStateChangedListener != null) { 109 mReadyStateChangedListener.onReadyStateChanged(readyForCapture); 110 } 111 } 112 113 @Override getMaxZoom()114 public float getMaxZoom() { 115 // If not implemented, return 1.0. 116 return 1f; 117 } 118 119 @Override setZoom(float zoom)120 public void setZoom(float zoom) { 121 // If not implemented, no-op. 122 } 123 } 124