/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.camera; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.RectF; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import com.android.camera.debug.Log; import com.android.camera.ui.CountDownView; import com.android.camera.ui.PreviewOverlay; import com.android.camera.ui.PreviewOverlay.OnZoomChangedListener; import com.android.camera.ui.PreviewStatusListener; import com.android.camera.ui.ProgressOverlay; import com.android.camera.ui.focus.FocusRing; import com.android.camera2.R; /** * Contains the UI for the CaptureModule. */ public class CaptureModuleUI implements PreviewStatusListener.PreviewAreaChangedListener { public interface CaptureModuleUIListener { public void onZoomRatioChanged(float zoomRatio); } private static final Log.Tag TAG = new Log.Tag("CaptureModuleUI"); private final CameraActivity mActivity; private final CaptureModuleUIListener mListener; private final View mRootView; private final PreviewOverlay mPreviewOverlay; private final ProgressOverlay mProgressOverlay; private final TextureView mPreviewView; private final FocusRing mFocusRing; private final CountDownView mCountdownView; private int mPreviewAreaWidth; private int mPreviewAreaHeight; /** Maximum zoom; intialize to 1.0 (disabled) */ private float mMaxZoom = 1f; /** Set up listener to receive zoom changes from View and send to module. */ private final OnZoomChangedListener mZoomChangedListener = new OnZoomChangedListener() { @Override public void onZoomValueChanged(float ratio) { mListener.onZoomRatioChanged(ratio); } @Override public void onZoomStart() { } @Override public void onZoomEnd() { } }; public CaptureModuleUI(CameraActivity activity, View parent, CaptureModuleUIListener listener) { mActivity = activity; mListener = listener; mRootView = parent; ViewGroup moduleRoot = (ViewGroup) mRootView.findViewById(R.id.module_layout); mActivity.getLayoutInflater().inflate(R.layout.capture_module, moduleRoot, true); mPreviewView = (TextureView) mRootView.findViewById(R.id.preview_content); mPreviewOverlay = (PreviewOverlay) mRootView.findViewById(R.id.preview_overlay); mProgressOverlay = (ProgressOverlay) mRootView.findViewById(R.id.progress_overlay); mFocusRing = (FocusRing) mRootView.findViewById(R.id.focus_ring); mCountdownView = (CountDownView) mRootView.findViewById(R.id.count_down_view); } /** * Getter for the camera activity this UI is drawn into */ public CameraActivity getActivity() { return mActivity; } /** * Getter for the width of the visible area of the preview. */ public int getPreviewAreaWidth() { return mPreviewAreaWidth; } /** * Getter for the height of the visible area of the preview. */ public int getPreviewAreaHeight() { return mPreviewAreaHeight; } public Matrix getPreviewTransform(Matrix m) { return mPreviewView.getTransform(m); } public FocusRing getFocusRing() { return mFocusRing; } public void showDebugMessage(String message) { /* NoOp */ } /** * Starts the countdown timer. * * @param sec seconds to countdown */ public void startCountdown(int sec) { mCountdownView.startCountDown(sec); } /** * Sets a listener that gets notified when the countdown is finished. */ public void setCountdownFinishedListener(CountDownView.OnCountDownStatusListener listener) { mCountdownView.setCountDownStatusListener(listener); } /** * Returns whether the countdown is on-going. */ public boolean isCountingDown() { return mCountdownView.isCountingDown(); } /** * Cancels the on-going countdown, if any. */ public void cancelCountDown() { mCountdownView.cancelCountDown(); } /** * Sets the progress of the gcam picture taking. * * @param percent amount of process done in percent 0-100. */ public void setPictureTakingProgress(int percent) { mProgressOverlay.setProgress(percent); } public Bitmap getBitMapFromPreview() { Matrix m = new Matrix(); m = getPreviewTransform(m); Bitmap src = mPreviewView.getBitmap(); return Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), m, true); } /** * Enables zoom UI, setting maximum zoom. * Called from Module when camera is available. * * @param maxZoom maximum zoom value. */ public void initializeZoom(float maxZoom) { mMaxZoom = maxZoom; mPreviewOverlay.setupZoom(mMaxZoom, 0, mZoomChangedListener); } @Override public void onPreviewAreaChanged(RectF previewArea) { // TODO: mFaceView.onPreviewAreaChanged(previewArea); mCountdownView.onPreviewAreaChanged(previewArea); mProgressOverlay.setBounds(previewArea); } }