1d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi/* 2d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Copyright (C) 2015 The Android Open Source Project 3d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * 4d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 5d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * you may not use this file except in compliance with the License. 6d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * You may obtain a copy of the License at 7d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * 8d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 9d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * 10d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Unless required by applicable law or agreed to in writing, software 11d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 12d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * See the License for the specific language governing permissions and 14d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * limitations under the License 15d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi */ 16d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 17d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggipackage android.service.media; 18d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 19d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggiimport android.app.Service; 20d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggiimport android.content.Intent; 21d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggiimport android.os.Handler; 22d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggiimport android.os.IBinder; 23d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggiimport android.os.Message; 24d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggiimport android.os.Messenger; 25d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 26d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi/** 27d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Extend this class to implement a camera prewarm service. See 28d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * {@link android.provider.MediaStore#META_DATA_STILL_IMAGE_CAMERA_PREWARM_SERVICE}. 29d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi */ 30d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggipublic abstract class CameraPrewarmService extends Service { 31d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 32d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi /** 33d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Intent action to bind the service as a prewarm service. 34d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * @hide 35d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi */ 36d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi public static final String ACTION_PREWARM = 37d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi "android.service.media.CameraPrewarmService.ACTION_PREWARM"; 38d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 39d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi /** 40d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Message sent by the client indicating that the camera intent has been fired. 41d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * @hide 42d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi */ 43d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi public static final int MSG_CAMERA_FIRED = 1; 44d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 45d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi private final Handler mHandler = new Handler() { 46d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 47d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi @Override 48d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi public void handleMessage(Message msg) { 49d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi switch (msg.what) { 50d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi case MSG_CAMERA_FIRED: 51d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi mCameraIntentFired = true; 52d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi break; 53d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi default: 54d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi super.handleMessage(msg); 55d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi } 56d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi } 57d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi }; 58d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi private boolean mCameraIntentFired; 59d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 60d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi @Override 61d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi public IBinder onBind(Intent intent) { 62d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi if (ACTION_PREWARM.equals(intent.getAction())) { 63d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi onPrewarm(); 64d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi return new Messenger(mHandler).getBinder(); 65d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi } else { 66d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi return null; 67d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi } 68d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi } 69d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 70d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi @Override 71d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi public boolean onUnbind(Intent intent) { 72d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi if (ACTION_PREWARM.equals(intent.getAction())) { 73d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi onCooldown(mCameraIntentFired); 74d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi } 75d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi return false; 76d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi } 77d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 78d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi /** 79d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Called when the camera should be prewarmed. 80d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi */ 81d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi public abstract void onPrewarm(); 82d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi 83d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi /** 84d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * Called when prewarm phase is done, either because the camera launch intent has been fired 85d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * at this point or prewarm is no longer needed. A client should close the camera 86d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * immediately in the latter case. 87d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * <p> 88d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * In case the camera launch intent has been fired, there is no guarantee about the ordering 89d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * of these two events. Cooldown might happen either before or after the activity has been 90d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * created that handles the camera intent. 91d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * 92d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * @param cameraIntentFired Indicates whether the intent to launch the camera has been 93d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi * fired. 94d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi */ 95d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi public abstract void onCooldown(boolean cameraIntentFired); 96d944986fbdb3d45fab9ae4120af76ca4f6b0909cJorim Jaggi} 97