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