1/*
2 * Copyright (C) 2013 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
17package com.android.camera.module;
18
19import android.content.Context;
20import android.content.Intent;
21import android.content.res.Resources;
22
23import com.android.camera.CaptureModule;
24import com.android.camera.PhotoModule;
25import com.android.camera.VideoModule;
26import com.android.camera.app.AppController;
27import com.android.camera.app.ModuleManager;
28import com.android.camera.captureintent.CaptureIntentModule;
29import com.android.camera.debug.Log;
30import com.android.camera.one.OneCamera;
31import com.android.camera.one.OneCameraException;
32import com.android.camera.one.config.OneCameraFeatureConfig;
33import com.android.camera.one.config.OneCameraFeatureConfig.HdrPlusSupportLevel;
34import com.android.camera.settings.SettingsScopeNamespaces;
35import com.android.camera.util.GcamHelper;
36import com.android.camera.util.PhotoSphereHelper;
37import com.android.camera.util.RefocusHelper;
38import com.android.camera2.R;
39
40/**
41 * A class holding the module information and registers them to
42 * {@link com.android.camera.app.ModuleManager}.
43 */
44public class ModulesInfo {
45    private static final Log.Tag TAG = new Log.Tag("ModulesInfo");
46
47    public static void setupModules(Context context, ModuleManager moduleManager,
48            OneCameraFeatureConfig config) {
49        Resources res = context.getResources();
50        int photoModuleId = context.getResources().getInteger(R.integer.camera_mode_photo);
51        registerPhotoModule(moduleManager, photoModuleId, SettingsScopeNamespaces.PHOTO,
52                config.isUsingCaptureModule());
53        moduleManager.setDefaultModuleIndex(photoModuleId);
54        registerVideoModule(moduleManager, res.getInteger(R.integer.camera_mode_video),
55                SettingsScopeNamespaces.VIDEO);
56        if (PhotoSphereHelper.hasLightCycleCapture(context)) {
57            registerWideAngleModule(moduleManager, res.getInteger(R.integer.camera_mode_panorama),
58                    SettingsScopeNamespaces.PANORAMA);
59            registerPhotoSphereModule(moduleManager,
60                    res.getInteger(R.integer.camera_mode_photosphere),
61                    SettingsScopeNamespaces.PANORAMA);
62        }
63        if (RefocusHelper.hasRefocusCapture(context)) {
64            registerRefocusModule(moduleManager, res.getInteger(R.integer.camera_mode_refocus),
65                    SettingsScopeNamespaces.REFOCUS);
66        }
67        if (GcamHelper.hasGcamAsSeparateModule(config)) {
68            registerGcamModule(moduleManager, res.getInteger(R.integer.camera_mode_gcam),
69                    SettingsScopeNamespaces.PHOTO,
70                    config.getHdrPlusSupportLevel(OneCamera.Facing.BACK));
71        }
72        int imageCaptureIntentModuleId = res.getInteger(R.integer.camera_mode_capture_intent);
73        registerCaptureIntentModule(moduleManager, imageCaptureIntentModuleId,
74                SettingsScopeNamespaces.PHOTO, config.isUsingCaptureModule());
75    }
76
77    private static void registerPhotoModule(ModuleManager moduleManager, final int moduleId,
78            final String namespace, final boolean enableCaptureModule) {
79        moduleManager.registerModule(new ModuleManager.ModuleAgent() {
80
81            @Override
82            public int getModuleId() {
83                return moduleId;
84            }
85
86            @Override
87            public boolean requestAppForCamera() {
88                // The PhotoModule requests the old app camere, while the new
89                // capture module is using OneCamera. At some point we'll
90                // refactor all modules to use OneCamera, then the new module
91                // doesn't have to manage it itself.
92                return !enableCaptureModule;
93            }
94
95            @Override
96            public String getScopeNamespace() {
97                return namespace;
98            }
99
100            @Override
101            public ModuleController createModule(AppController app, Intent intent) {
102                Log.v(TAG, "EnableCaptureModule = " + enableCaptureModule);
103                return enableCaptureModule ? new CaptureModule(app) : new PhotoModule(app);
104            }
105        });
106    }
107
108    private static void registerVideoModule(ModuleManager moduleManager, final int moduleId,
109            final String namespace) {
110        moduleManager.registerModule(new ModuleManager.ModuleAgent() {
111            @Override
112            public int getModuleId() {
113                return moduleId;
114            }
115
116            @Override
117            public boolean requestAppForCamera() {
118                return true;
119            }
120
121            @Override
122            public String getScopeNamespace() {
123                return namespace;
124            }
125
126            @Override
127            public ModuleController createModule(AppController app, Intent intent) {
128                return new VideoModule(app);
129            }
130        });
131    }
132
133    private static void registerWideAngleModule(ModuleManager moduleManager, final int moduleId,
134            final String namespace) {
135        moduleManager.registerModule(new ModuleManager.ModuleAgent() {
136            @Override
137            public int getModuleId() {
138                return moduleId;
139            }
140
141            @Override
142            public boolean requestAppForCamera() {
143                return true;
144            }
145
146            @Override
147            public String getScopeNamespace() {
148                return namespace;
149            }
150
151            @Override
152            public ModuleController createModule(AppController app, Intent intent) {
153                return PhotoSphereHelper.createWideAnglePanoramaModule(app);
154            }
155        });
156    }
157
158    private static void registerPhotoSphereModule(ModuleManager moduleManager, final int moduleId,
159            final String namespace) {
160        moduleManager.registerModule(new ModuleManager.ModuleAgent() {
161            @Override
162            public int getModuleId() {
163                return moduleId;
164            }
165
166            @Override
167            public boolean requestAppForCamera() {
168                return true;
169            }
170
171            @Override
172            public String getScopeNamespace() {
173                return namespace;
174            }
175
176            @Override
177            public ModuleController createModule(AppController app, Intent intent) {
178                return PhotoSphereHelper.createPanoramaModule(app);
179            }
180        });
181    }
182
183    private static void registerRefocusModule(ModuleManager moduleManager, final int moduleId,
184            final String namespace) {
185        moduleManager.registerModule(new ModuleManager.ModuleAgent() {
186            @Override
187            public int getModuleId() {
188                return moduleId;
189            }
190
191            @Override
192            public boolean requestAppForCamera() {
193                return true;
194            }
195
196            @Override
197            public String getScopeNamespace() {
198                return namespace;
199            }
200
201            @Override
202            public ModuleController createModule(AppController app, Intent intent) {
203                return RefocusHelper.createRefocusModule(app);
204            }
205        });
206    }
207
208    private static void registerGcamModule(ModuleManager moduleManager, final int moduleId,
209            final String namespace, final HdrPlusSupportLevel hdrPlusSupportLevel) {
210        moduleManager.registerModule(new ModuleManager.ModuleAgent() {
211            @Override
212            public int getModuleId() {
213                return moduleId;
214            }
215
216            @Override
217            public boolean requestAppForCamera() {
218                return false;
219            }
220
221            @Override
222            public String getScopeNamespace() {
223                return namespace;
224            }
225
226            @Override
227            public ModuleController createModule(AppController app, Intent intent) {
228                return GcamHelper.createGcamModule(app, hdrPlusSupportLevel);
229            }
230        });
231    }
232
233    private static void registerCaptureIntentModule(ModuleManager moduleManager, final int moduleId,
234            final String namespace, final boolean enableCaptureModule) {
235        moduleManager.registerModule(new ModuleManager.ModuleAgent() {
236            @Override
237            public int getModuleId() {
238                return moduleId;
239            }
240
241            @Override
242            public boolean requestAppForCamera() {
243                return !enableCaptureModule;
244            }
245
246            @Override
247            public String getScopeNamespace() {
248                return namespace;
249            }
250
251            @Override
252            public ModuleController createModule(AppController app, Intent intent) {
253                if(enableCaptureModule) {
254                    try {
255                        return new CaptureIntentModule(app, intent, namespace);
256                    } catch (OneCameraException ignored) {
257                    }
258                }
259                return new PhotoModule(app);
260            }
261        });
262    }
263}
264