1 /* 2 * Copyright (C) 2015 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.captureintent.state; 18 19 import com.google.common.annotations.VisibleForTesting; 20 import com.google.common.base.Optional; 21 22 import com.android.camera.async.RefCountBase; 23 import com.android.camera.captureintent.resource.ResourceConstructed; 24 import com.android.camera.captureintent.resource.ResourceSurfaceTexture; 25 import com.android.camera.captureintent.stateful.EventHandler; 26 import com.android.camera.captureintent.event.EventOnSurfaceTextureDestroyed; 27 import com.android.camera.captureintent.event.EventResume; 28 import com.android.camera.captureintent.stateful.State; 29 import com.android.camera.captureintent.stateful.StateImpl; 30 31 /** 32 * Represents a state that module is inactive in background but surface texture 33 * is available. 34 * <p> 35 * Module is in this state when first run dialog is still presented. The module 36 * will be resumed after people finish first run dialog (b/19531554). 37 */ 38 public class StateBackgroundWithSurfaceTexture extends StateImpl { 39 private final RefCountBase<ResourceConstructed> mResourceConstructed; 40 private final RefCountBase<ResourceSurfaceTexture> mResourceSurfaceTexture; 41 42 /** 43 * Used to transition from StateOpeningCamera, StateStartingPreview and 44 * StateReadyForCapture on module got paused. 45 */ from( State previousState, RefCountBase<ResourceConstructed> resourceConstructed, RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture)46 public static StateBackgroundWithSurfaceTexture from( 47 State previousState, 48 RefCountBase<ResourceConstructed> resourceConstructed, 49 RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture) { 50 return new StateBackgroundWithSurfaceTexture( 51 previousState, resourceConstructed, resourceSurfaceTexture); 52 } 53 StateBackgroundWithSurfaceTexture( State previousState, RefCountBase<ResourceConstructed> resourceConstructed, RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture)54 private StateBackgroundWithSurfaceTexture( 55 State previousState, 56 RefCountBase<ResourceConstructed> resourceConstructed, 57 RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture) { 58 super(previousState); 59 mResourceConstructed = resourceConstructed; 60 mResourceConstructed.addRef(); // Will be balanced in onLeave(). 61 mResourceSurfaceTexture = resourceSurfaceTexture; 62 mResourceSurfaceTexture.addRef(); // Will be balanced in onLeave(). 63 registerEventHandlers(); 64 } 65 registerEventHandlers()66 private void registerEventHandlers() { 67 /** Handles EventResume. */ 68 EventHandler<EventResume> resumeHandler = new EventHandler<EventResume>() { 69 @Override 70 public Optional<State> processEvent(EventResume eventResume) { 71 return Optional.of((State) StateForegroundWithSurfaceTexture.from( 72 StateBackgroundWithSurfaceTexture.this, 73 mResourceConstructed, 74 mResourceSurfaceTexture)); 75 } 76 }; 77 setEventHandler(EventResume.class, resumeHandler); 78 79 /** Handles EventOnSurfaceTextureDestroyed. */ 80 EventHandler<EventOnSurfaceTextureDestroyed> surfaceTextureDestroyedHandler = 81 new EventHandler<EventOnSurfaceTextureDestroyed>() { 82 @Override 83 public Optional<State> processEvent(EventOnSurfaceTextureDestroyed event) { 84 return Optional.of((State) StateBackground.from( 85 StateBackgroundWithSurfaceTexture.this, mResourceConstructed)); 86 } 87 }; 88 setEventHandler( 89 EventOnSurfaceTextureDestroyed.class, surfaceTextureDestroyedHandler); 90 } 91 92 @Override onEnter()93 public Optional<State> onEnter() { 94 // Do nothing unless the module is resumed. 95 return Optional.absent(); 96 } 97 98 @Override onLeave()99 public void onLeave() { 100 mResourceConstructed.close(); 101 mResourceSurfaceTexture.close(); 102 } 103 104 @VisibleForTesting getResourceSurfaceTexture()105 public RefCountBase<ResourceSurfaceTexture> getResourceSurfaceTexture() { 106 return mResourceSurfaceTexture; 107 } 108 } 109