Home | History | Annotate | Download | only in state
      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.android.camera.async.RefCountBase;
     20 import com.android.camera.captureintent.resource.ResourceConstructed;
     21 import com.android.camera.captureintent.resource.ResourceSurfaceTexture;
     22 import com.android.camera.captureintent.stateful.State;
     23 import com.android.camera.captureintent.stateful.StateImpl;
     24 import com.android.camera.device.CameraId;
     25 import com.android.camera.one.OneCamera;
     26 import com.android.camera.one.OneCameraAccessException;
     27 import com.android.camera.one.OneCameraCharacteristics;
     28 import com.google.common.annotations.VisibleForTesting;
     29 import com.google.common.base.Optional;
     30 
     31 /**
     32  * Represents a state that the surface texture is available to the module.
     33  */
     34 public final class StateForegroundWithSurfaceTexture extends StateImpl {
     35     private final RefCountBase<ResourceConstructed> mResourceConstructed;
     36     private final RefCountBase<ResourceSurfaceTexture> mResourceSurfaceTexture;
     37 
     38     // Used to transition from BackgroundWithSurfaceTexture on module is resumed.
     39     public static StateForegroundWithSurfaceTexture from(
     40             State previousState,
     41             RefCountBase<ResourceConstructed> resourceConstructed,
     42             RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture) {
     43         return new StateForegroundWithSurfaceTexture(
     44                 previousState,
     45                 resourceConstructed,
     46                 resourceSurfaceTexture);
     47     }
     48 
     49     private StateForegroundWithSurfaceTexture(
     50             State previousState,
     51             RefCountBase<ResourceConstructed> resourceConstructed,
     52             RefCountBase<ResourceSurfaceTexture> resourceSurfaceTexture) {
     53         super(previousState);
     54         mResourceConstructed = resourceConstructed;
     55         mResourceConstructed.addRef();     // Will be balanced in onLeave().
     56         mResourceSurfaceTexture = resourceSurfaceTexture;
     57         mResourceSurfaceTexture.addRef();
     58     }
     59 
     60     @Override
     61     public Optional<State> onEnter() {
     62         try {
     63             // Pick a preview size with the right aspect ratio.
     64             final OneCamera.Facing cameraFacing =
     65                     mResourceConstructed.get().getCameraFacingSetting().getCameraFacing();
     66 
     67             CameraId key = mResourceConstructed.get().getOneCameraManager()
     68                   .findFirstCameraFacing(cameraFacing);
     69 
     70             final OneCameraCharacteristics characteristics =
     71                     mResourceConstructed.get().getOneCameraManager().getOneCameraCharacteristics(
     72                           key);
     73             return Optional.of((State) StateOpeningCamera.from(this, mResourceConstructed,
     74                     mResourceSurfaceTexture, cameraFacing, key, characteristics));
     75         } catch (OneCameraAccessException ex) {
     76             return Optional.of((State) StateFatal.from(this, mResourceConstructed));
     77         }
     78     }
     79 
     80     @Override
     81     public void onLeave() {
     82         mResourceConstructed.close();
     83         mResourceSurfaceTexture.close();
     84     }
     85 
     86     @VisibleForTesting
     87     public RefCountBase<ResourceSurfaceTexture> getResourceSurfaceTexture() {
     88         return mResourceSurfaceTexture;
     89     }
     90 }
     91