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; 18 19 import android.graphics.Bitmap; 20 import android.graphics.Matrix; 21 import android.graphics.RectF; 22 import android.view.TextureView; 23 import android.view.View; 24 import android.view.ViewGroup; 25 26 import com.android.camera.debug.Log; 27 import com.android.camera.ui.CountDownView; 28 import com.android.camera.ui.PreviewOverlay; 29 import com.android.camera.ui.PreviewOverlay.OnZoomChangedListener; 30 import com.android.camera.ui.PreviewStatusListener; 31 import com.android.camera.ui.ProgressOverlay; 32 import com.android.camera.ui.focus.FocusRing; 33 import com.android.camera2.R; 34 35 /** 36 * Contains the UI for the CaptureModule. 37 */ 38 public class CaptureModuleUI implements PreviewStatusListener.PreviewAreaChangedListener { 39 40 public interface CaptureModuleUIListener { 41 public void onZoomRatioChanged(float zoomRatio); 42 } 43 44 private static final Log.Tag TAG = new Log.Tag("CaptureModuleUI"); 45 46 private final CameraActivity mActivity; 47 private final CaptureModuleUIListener mListener; 48 private final View mRootView; 49 50 private final PreviewOverlay mPreviewOverlay; 51 private final ProgressOverlay mProgressOverlay; 52 private final TextureView mPreviewView; 53 54 private final FocusRing mFocusRing; 55 private final CountDownView mCountdownView; 56 57 private int mPreviewAreaWidth; 58 private int mPreviewAreaHeight; 59 60 /** Maximum zoom; intialize to 1.0 (disabled) */ 61 private float mMaxZoom = 1f; 62 63 /** Set up listener to receive zoom changes from View and send to module. */ 64 private final OnZoomChangedListener mZoomChangedListener = new OnZoomChangedListener() { 65 @Override 66 public void onZoomValueChanged(float ratio) { 67 mListener.onZoomRatioChanged(ratio); 68 } 69 70 @Override 71 public void onZoomStart() { 72 } 73 74 @Override 75 public void onZoomEnd() { 76 } 77 }; 78 79 public CaptureModuleUI(CameraActivity activity, View parent, CaptureModuleUIListener listener) { 80 mActivity = activity; 81 mListener = listener; 82 mRootView = parent; 83 84 ViewGroup moduleRoot = (ViewGroup) mRootView.findViewById(R.id.module_layout); 85 mActivity.getLayoutInflater().inflate(R.layout.capture_module, moduleRoot, true); 86 87 mPreviewView = (TextureView) mRootView.findViewById(R.id.preview_content); 88 89 mPreviewOverlay = (PreviewOverlay) mRootView.findViewById(R.id.preview_overlay); 90 mProgressOverlay = (ProgressOverlay) mRootView.findViewById(R.id.progress_overlay); 91 92 mFocusRing = (FocusRing) mRootView.findViewById(R.id.focus_ring); 93 mCountdownView = (CountDownView) mRootView.findViewById(R.id.count_down_view); 94 } 95 96 /** 97 * Getter for the width of the visible area of the preview. 98 */ 99 public int getPreviewAreaWidth() { 100 return mPreviewAreaWidth; 101 } 102 103 /** 104 * Getter for the height of the visible area of the preview. 105 */ 106 public int getPreviewAreaHeight() { 107 return mPreviewAreaHeight; 108 } 109 110 public Matrix getPreviewTransform(Matrix m) { 111 return mPreviewView.getTransform(m); 112 } 113 114 public FocusRing getFocusRing() { 115 return mFocusRing; 116 } 117 118 public void showDebugMessage(String message) { 119 /* NoOp */ 120 } 121 122 /** 123 * Starts the countdown timer. 124 * 125 * @param sec seconds to countdown 126 */ 127 public void startCountdown(int sec) { 128 mCountdownView.startCountDown(sec); 129 } 130 131 /** 132 * Sets a listener that gets notified when the countdown is finished. 133 */ 134 public void setCountdownFinishedListener(CountDownView.OnCountDownStatusListener listener) { 135 mCountdownView.setCountDownStatusListener(listener); 136 } 137 138 /** 139 * Returns whether the countdown is on-going. 140 */ 141 public boolean isCountingDown() { 142 return mCountdownView.isCountingDown(); 143 } 144 145 /** 146 * Cancels the on-going countdown, if any. 147 */ 148 public void cancelCountDown() { 149 mCountdownView.cancelCountDown(); 150 } 151 152 /** 153 * Sets the progress of the gcam picture taking. 154 * 155 * @param percent amount of process done in percent 0-100. 156 */ 157 public void setPictureTakingProgress(int percent) { 158 mProgressOverlay.setProgress(percent); 159 } 160 161 public Bitmap getBitMapFromPreview() { 162 Matrix m = new Matrix(); 163 m = getPreviewTransform(m); 164 Bitmap src = mPreviewView.getBitmap(); 165 return Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, true); 166 } 167 168 /** 169 * Enables zoom UI, setting maximum zoom. 170 * Called from Module when camera is available. 171 * 172 * @param maxZoom maximum zoom value. 173 */ 174 public void initializeZoom(float maxZoom) { 175 mMaxZoom = maxZoom; 176 mPreviewOverlay.setupZoom(mMaxZoom, 0, mZoomChangedListener); 177 } 178 179 @Override 180 public void onPreviewAreaChanged(RectF previewArea) { 181 // TODO: mFaceView.onPreviewAreaChanged(previewArea); 182 mCountdownView.onPreviewAreaChanged(previewArea); 183 mProgressOverlay.setBounds(previewArea); 184 } 185 } 186