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 android.service.media; 18 19 import android.app.Service; 20 import android.content.Intent; 21 import android.os.Handler; 22 import android.os.IBinder; 23 import android.os.Message; 24 import android.os.Messenger; 25 26 /** 27 * Extend this class to implement a camera prewarm service. See 28 * {@link android.provider.MediaStore#META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE}. 29 */ 30 public abstract class CameraPrewarmService extends Service { 31 32 /** 33 * Intent action to bind the service as a prewarm service. 34 * @hide 35 */ 36 public static final String ACTION_PREWARM = 37 "android.service.media.CameraPrewarmService.ACTION_PREWARM"; 38 39 /** 40 * Message sent by the client indicating that the camera intent has been fired. 41 * @hide 42 */ 43 public static final int MSG_CAMERA_FIRED = 1; 44 45 private final Handler mHandler = new Handler() { 46 47 @Override 48 public void handleMessage(Message msg) { 49 switch (msg.what) { 50 case MSG_CAMERA_FIRED: 51 mCameraIntentFired = true; 52 break; 53 default: 54 super.handleMessage(msg); 55 } 56 } 57 }; 58 private boolean mCameraIntentFired; 59 60 @Override onBind(Intent intent)61 public IBinder onBind(Intent intent) { 62 if (ACTION_PREWARM.equals(intent.getAction())) { 63 onPrewarm(); 64 return new Messenger(mHandler).getBinder(); 65 } else { 66 return null; 67 } 68 } 69 70 @Override onUnbind(Intent intent)71 public boolean onUnbind(Intent intent) { 72 if (ACTION_PREWARM.equals(intent.getAction())) { 73 onCooldown(mCameraIntentFired); 74 } 75 return false; 76 } 77 78 /** 79 * Called when the camera should be prewarmed. 80 */ onPrewarm()81 public abstract void onPrewarm(); 82 83 /** 84 * Called when prewarm phase is done, either because the camera launch intent has been fired 85 * at this point or prewarm is no longer needed. A client should close the camera 86 * immediately in the latter case. 87 * <p> 88 * In case the camera launch intent has been fired, there is no guarantee about the ordering 89 * of these two events. Cooldown might happen either before or after the activity has been 90 * created that handles the camera intent. 91 * 92 * @param cameraIntentFired Indicates whether the intent to launch the camera has been 93 * fired. 94 */ onCooldown(boolean cameraIntentFired)95 public abstract void onCooldown(boolean cameraIntentFired); 96 } 97