1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/*
2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project
3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License");
5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License.
6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at
7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *      http://www.apache.org/licenses/LICENSE-2.0
9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software
11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS,
12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and
14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License.
15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.mediapicker;
18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.hardware.Camera;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Parcelable;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.SurfaceHolder;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.SurfaceView;
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.View;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.io.IOException;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/**
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * A software rendered preview surface for the camera.  This renders slower and causes more jank, so
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * HardwareCameraPreview is preferred if possible.
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd *
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * There is a significant amount of duplication between HardwareCameraPreview and
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * SoftwareCameraPreview which we can't easily share due to a lack of multiple inheritance, The
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * implementations of the shared methods are delegated to CameraPreview
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class SoftwareCameraPreview extends SurfaceView implements CameraPreview.CameraPreviewHost {
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final CameraPreview mPreview;
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public SoftwareCameraPreview(final Context context) {
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super(context);
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreview = new CameraPreview(this);
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        getHolder().addCallback(new SurfaceHolder.Callback() {
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            @Override
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            public void surfaceCreated(final SurfaceHolder surfaceHolder) {
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CameraManager.get().setSurface(mPreview);
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            @Override
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            public void surfaceChanged(final SurfaceHolder surfaceHolder, final int format, final int width,
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                                       final int height) {
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CameraManager.get().setSurface(mPreview);
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            @Override
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            public void surfaceDestroyed(final SurfaceHolder surfaceHolder) {
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                CameraManager.get().setSurface(null);
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        });
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected void onVisibilityChanged(final View changedView, final int visibility) {
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super.onVisibilityChanged(changedView, visibility);
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreview.onVisibilityChanged(visibility);
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected void onDetachedFromWindow() {
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super.onDetachedFromWindow();
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreview.onDetachedFromWindow();
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected void onAttachedToWindow() {
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super.onAttachedToWindow();
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreview.onAttachedToWindow();
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected void onRestoreInstanceState(final Parcelable state) {
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super.onRestoreInstanceState(state);
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreview.onRestoreInstanceState();
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        widthMeasureSpec = mPreview.getWidthMeasureSpec(widthMeasureSpec, heightMeasureSpec);
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        heightMeasureSpec = mPreview.getHeightMeasureSpec(widthMeasureSpec, heightMeasureSpec);
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public View getView() {
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return this;
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean isValid() {
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return getHolder() != null;
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void startPreview(final Camera camera) throws IOException {
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        camera.setPreviewDisplay(getHolder());
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void onCameraPermissionGranted() {
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mPreview.onCameraPermissionGranted();
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
115