124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu/*
224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * Copyright (C) 2015 The Android Open Source Project
324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *
424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * Licensed under the Apache License, Version 2.0 (the "License");
524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * you may not use this file except in compliance with the License.
624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * You may obtain a copy of the License at
724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *
824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *      http://www.apache.org/licenses/LICENSE-2.0
924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu *
1024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * Unless required by applicable law or agreed to in writing, software
1124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * distributed under the License is distributed on an "AS IS" BASIS,
1224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * See the License for the specific language governing permissions and
1424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu * limitations under the License.
1524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu */
1624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
17d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hupackage com.android.camera.captureintent.resource;
1824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
198aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Huimport com.google.common.logging.eventprotos;
208aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu
2124be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.SoundPlayer;
2224be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.async.MainThread;
2324be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.async.RefCountBase;
2424be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.captureintent.CaptureIntentModuleUI;
251b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Huimport com.android.camera.captureintent.CaptureIntentSessionFactory;
2680aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Huimport com.android.camera.debug.Log;
2724be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.hardware.HeadingSensor;
2824be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.one.OneCamera;
2924be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.session.CaptureSession;
3024be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.session.CaptureSessionManager;
311b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Huimport com.android.camera.session.CaptureSessionManagerImpl;
321b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Huimport com.android.camera.session.SessionStorageManagerImpl;
338aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Huimport com.android.camera.settings.Keys;
348aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Huimport com.android.camera.settings.SettingsManager;
3524be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.ui.focus.FocusController;
361b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Huimport com.android.camera.ui.focus.FocusSound;
371b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Huimport com.android.camera.util.AndroidServices;
3824be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport com.android.camera.util.CameraUtil;
391b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Huimport com.android.camera2.R;
4024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
4124be7cc6d138129b4087ef28f114701de54aba3cSenpo Huimport android.media.MediaActionSound;
4224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
43d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hupublic final class ResourceCaptureToolsImpl implements ResourceCaptureTools {
4480aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu    private static final Log.Tag TAG = new Log.Tag("ResCapTools");
4580aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu
4624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceConstructed> mResourceConstructed;
4724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceSurfaceTexture> mResourceSurfaceTexture;
4824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final RefCountBase<ResourceOpenedCamera> mResourceOpenedCamera;
4924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
5024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final CaptureSessionManager mCaptureSessionManager;
5124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final FocusController mFocusController;
5224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final HeadingSensor mHeadingSensor;
5324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final SoundPlayer mSoundPlayer;
5424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    private final MediaActionSound mMediaActionSound;
5524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
5680aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu    /**
57d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu     * Creates a reference counted {@link ResourceCaptureToolsImpl} object.
5880aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu     */
5980aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu    public static RefCountBase<ResourceCaptureTools> create(
6080aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu            RefCountBase<ResourceConstructed> resourceConstructed,
6180aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu            RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
621b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            RefCountBase<ResourceOpenedCamera> resourceOpenedCamera) {
631b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        CaptureSessionManager captureSessionManager = new CaptureSessionManagerImpl(
641b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                new CaptureIntentSessionFactory(),
651b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                SessionStorageManagerImpl.create(resourceConstructed.get().getContext()),
661b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                resourceConstructed.get().getMainThread());
671b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        HeadingSensor headingSensor =
681b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                new HeadingSensor(AndroidServices.instance().provideSensorManager());
691b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        SoundPlayer soundPlayer = new SoundPlayer(resourceConstructed.get().getContext());
701b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        FocusSound focusSound = new FocusSound(soundPlayer, R.raw.material_camera_focus);
711b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        FocusController focusController = new FocusController(
721b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                resourceConstructed.get().getModuleUI().getFocusRing(),
731b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                focusSound,
741b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                resourceConstructed.get().getMainThread());
751b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        MediaActionSound mediaActionSound = new MediaActionSound();
76d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu        ResourceCaptureTools resourceCaptureTools = new ResourceCaptureToolsImpl(
7780aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu                resourceConstructed, resourceSurfaceTexture, resourceOpenedCamera,
781b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                captureSessionManager, focusController, headingSensor, soundPlayer,
791b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                mediaActionSound);
8080aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        return new RefCountBase<>(resourceCaptureTools);
8180aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu    }
8280aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu
83d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    private ResourceCaptureToolsImpl(
8424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceConstructed> resourceConstructed,
8524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture,
8624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            RefCountBase<ResourceOpenedCamera> resourceOpenedCamera,
8724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            CaptureSessionManager captureSessionManager,
8824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            FocusController focusController,
8924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            HeadingSensor headingSensor,
9024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu            SoundPlayer soundPlayer,
911b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            MediaActionSound mediaActionSound) {
9224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceConstructed = resourceConstructed;
9380aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceConstructed.addRef();     // Will be balanced in close().
9424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceSurfaceTexture = resourceSurfaceTexture;
9580aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceSurfaceTexture.addRef();  // Will be balanced in close().
9624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceOpenedCamera = resourceOpenedCamera;
9780aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        mResourceOpenedCamera.addRef();    // Will be balanced in close().
9824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mCaptureSessionManager = captureSessionManager;
9924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mHeadingSensor = headingSensor;
1001b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mHeadingSensor.activate();  // Will be balanced in close().
10124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mSoundPlayer = soundPlayer;
1021b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mSoundPlayer.loadSound(R.raw.timer_final_second);  // Will be balanced in close().
1031b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mSoundPlayer.loadSound(R.raw.timer_increment);     // Will be balanced in close().
10424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mMediaActionSound = mediaActionSound;
10524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mFocusController = focusController;
10624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
10724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
10824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    @Override
10924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public void close() {
11080aed3c513dc6a6670e25ef6e11bc71ab6a2d9fdSenpo Hu        Log.d(TAG, "close");
11124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceConstructed.close();
11224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceSurfaceTexture.close();
11324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        mResourceOpenedCamera.close();
1141b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mHeadingSensor.deactivate();
1151b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mSoundPlayer.unloadSound(R.raw.timer_increment);
1161b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        mSoundPlayer.unloadSound(R.raw.timer_final_second);
11724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
11824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
119d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
12024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public RefCountBase<ResourceConstructed> getResourceConstructed() {
12124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mResourceConstructed;
12224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
12324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
124d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
12524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public RefCountBase<ResourceSurfaceTexture> getResourceSurfaceTexture() {
12624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mResourceSurfaceTexture;
12724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
12824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
129d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
13024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public RefCountBase<ResourceOpenedCamera> getResourceOpenedCamera() {
13124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mResourceOpenedCamera;
13224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
13324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
134d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
1351b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu    public CaptureSessionManager getCaptureSessionManager() {
1361b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        return mCaptureSessionManager;
1371b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu    }
1381b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu
139d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
14024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public FocusController getFocusController() {
14124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mFocusController;
14224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
14324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
144d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
14524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public MediaActionSound getMediaActionSound() {
14624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mMediaActionSound;
14724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
14824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
149d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
1508aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu    public void takePictureNow(
1518aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu            OneCamera.PictureCallback pictureCallback,
1528aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu            CaptureLoggingInfo captureLoggingInfo) {
1538aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        final ResourceConstructed resource = mResourceConstructed.get();
1548aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        final ResourceOpenedCamera openedCamera = mResourceOpenedCamera.get();
1558aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu
1566aca73ead6c02357b517383313cfec202767c651Senpo Hu        /**
1576aca73ead6c02357b517383313cfec202767c651Senpo Hu         * Disable the shutter button immediately. The button will be
1586aca73ead6c02357b517383313cfec202767c651Senpo Hu         * re-enabled when users press re-take button.
1596aca73ead6c02357b517383313cfec202767c651Senpo Hu         */
1606aca73ead6c02357b517383313cfec202767c651Senpo Hu        resource.getMainThread().execute(new Runnable() {
1616aca73ead6c02357b517383313cfec202767c651Senpo Hu            @Override
1626aca73ead6c02357b517383313cfec202767c651Senpo Hu            public void run() {
1636aca73ead6c02357b517383313cfec202767c651Senpo Hu                resource.getModuleUI().setShutterButtonEnabled(false);
1646aca73ead6c02357b517383313cfec202767c651Senpo Hu            }
1656aca73ead6c02357b517383313cfec202767c651Senpo Hu        });
1666aca73ead6c02357b517383313cfec202767c651Senpo Hu
1678aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        /** Create a new capture session. */
16824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        final long timestamp = System.currentTimeMillis();
16924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        final String fileName = CameraUtil.instance().createJpegName(timestamp);
1701b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        final android.location.Location location =
1718aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                resource.getLocationManager().getCurrentLocation();
17224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        final CaptureSession session =
17324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mCaptureSessionManager.createNewSession(fileName, timestamp, location);
174231b1c0679892e431bac9fe4461d5fb235e362b1Paul Rohde        session.startEmpty(null, openedCamera.getPictureSize());
1758aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu
1768aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        /** Logging */
1778aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        final SettingsManager settingsManager = resource.getSettingsManager();
1788aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        boolean isGridLinesOn = Keys.areGridLinesOn(settingsManager);
1798aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        session.getCollector().decorateAtTimeCaptureRequest(
1808aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                eventprotos.NavigationChange.Mode.PHOTO_CAPTURE,
1818aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                session.getTitle() + ".jpg",
1828aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                (openedCamera.getCameraFacing() == OneCamera.Facing.FRONT),
1838aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                false, /** hdrPlusEnabled */
1848aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                openedCamera.getZoomRatio(),
1858aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                openedCamera.getCaptureSetting().getFlashSetting().get().encodeSettingsString(),
1868aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                isGridLinesOn,
1878aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                (float) captureLoggingInfo.getCountDownDuration(),
1888aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                captureLoggingInfo.getTouchPointInsideShutterButton(),
1898aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                null /* TODO: Implement Volume Button Shutter Click Instrumentation */,
1908aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                openedCamera.getCameraCharacteristics().getSensorInfoActiveArraySize()
1918aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        );
19224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
19324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        OneCamera.PhotoCaptureParameters params = new OneCamera.PhotoCaptureParameters(
19424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                session.getTitle(),
1958aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                resource.getOrientationManager().getDeviceOrientation().getDegrees(),
19624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                session.getLocation(),
1978aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                resource.getContext().getExternalCacheDir(),
1981b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                pictureCallback,
19924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mPictureSaverCallback,
20024be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                mHeadingSensor.getCurrentHeading(),
2018aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu                openedCamera.getZoomRatio(),
20224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu                0);
2038aefbc59ce6176f27efd47f4a568117bd4d9ea77Senpo Hu        openedCamera.getCamera().takePicture(params, session);
20424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
20524be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
206d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
2071b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu    public void playCountDownSound(int remainingSeconds) {
2081b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        if (remainingSeconds == 1) {
2091b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            mSoundPlayer.play(R.raw.timer_final_second, 0.6f);
2101b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        } else if (remainingSeconds == 2 || remainingSeconds == 3) {
2111b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            mSoundPlayer.play(R.raw.timer_increment, 0.6f);
2121b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu        }
2131b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu    }
2141b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu
215d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
21624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public MainThread getMainThread() {
21724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mResourceConstructed.get().getMainThread();
21824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
21924be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
220d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
22124be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public CaptureIntentModuleUI getModuleUI() {
22224be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mResourceConstructed.get().getModuleUI();
22324be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
22424be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu
225d2d86155337a7dd9fd285a25c93e27dc05200ed1Senpo Hu    @Override
22624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    public OneCamera getCamera() {
22724be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu        return mResourceOpenedCamera.get().getCamera();
22824be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu    }
2291b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu
2301b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu    private final OneCamera.PictureSaverCallback mPictureSaverCallback =
2311b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            new OneCamera.PictureSaverCallback() {
2321b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                @Override
2331b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                public void onRemoteThumbnailAvailable(byte[] jpegImage) {
2341b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu                }
2351b98e83085e2b0a3066a4bf3cbde2d664b8422eeSenpo Hu            };
23624be7cc6d138129b4087ef28f114701de54aba3cSenpo Hu}
237