/* * Copyright (C) 2015 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.captureintent.state; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.android.camera.async.RefCountBase; import com.android.camera.captureintent.resource.ResourceConstructed; import com.android.camera.captureintent.resource.ResourceSurfaceTexture; import com.android.camera.captureintent.stateful.EventHandler; import com.android.camera.captureintent.event.EventOnSurfaceTextureDestroyed; import com.android.camera.captureintent.event.EventResume; import com.android.camera.captureintent.stateful.State; import com.android.camera.captureintent.stateful.StateImpl; /** * Represents a state that module is inactive in background but surface texture * is available. *

* Module is in this state when first run dialog is still presented. The module * will be resumed after people finish first run dialog (b/19531554). */ public class StateBackgroundWithSurfaceTexture extends StateImpl { private final RefCountBase mResourceConstructed; private final RefCountBase mResourceSurfaceTexture; /** * Used to transition from StateOpeningCamera, StateStartingPreview and * StateReadyForCapture on module got paused. */ public static StateBackgroundWithSurfaceTexture from( State previousState, RefCountBase resourceConstructed, RefCountBase resourceSurfaceTexture) { return new StateBackgroundWithSurfaceTexture( previousState, resourceConstructed, resourceSurfaceTexture); } private StateBackgroundWithSurfaceTexture( State previousState, RefCountBase resourceConstructed, RefCountBase resourceSurfaceTexture) { super(previousState); mResourceConstructed = resourceConstructed; mResourceConstructed.addRef(); // Will be balanced in onLeave(). mResourceSurfaceTexture = resourceSurfaceTexture; mResourceSurfaceTexture.addRef(); // Will be balanced in onLeave(). registerEventHandlers(); } private void registerEventHandlers() { /** Handles EventResume. */ EventHandler resumeHandler = new EventHandler() { @Override public Optional processEvent(EventResume eventResume) { return Optional.of((State) StateForegroundWithSurfaceTexture.from( StateBackgroundWithSurfaceTexture.this, mResourceConstructed, mResourceSurfaceTexture)); } }; setEventHandler(EventResume.class, resumeHandler); /** Handles EventOnSurfaceTextureDestroyed. */ EventHandler surfaceTextureDestroyedHandler = new EventHandler() { @Override public Optional processEvent(EventOnSurfaceTextureDestroyed event) { return Optional.of((State) StateBackground.from( StateBackgroundWithSurfaceTexture.this, mResourceConstructed)); } }; setEventHandler( EventOnSurfaceTextureDestroyed.class, surfaceTextureDestroyedHandler); } @Override public Optional onEnter() { // Do nothing unless the module is resumed. return Optional.absent(); } @Override public void onLeave() { mResourceConstructed.close(); mResourceSurfaceTexture.close(); } @VisibleForTesting public RefCountBase getResourceSurfaceTexture() { return mResourceSurfaceTexture; } }