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