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 
17 package com.android.camera.app;
18 
19 import android.app.Activity;
20 import android.app.Dialog;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.graphics.Bitmap;
24 import android.graphics.Matrix;
25 import android.graphics.RectF;
26 import android.graphics.SurfaceTexture;
27 import android.net.Uri;
28 import android.view.View;
29 import android.widget.FrameLayout;
30 
31 import com.android.camera.ButtonManager;
32 import com.android.camera.FatalErrorHandler;
33 import com.android.camera.SoundPlayer;
34 import com.android.camera.module.ModuleController;
35 import com.android.camera.one.OneCameraOpener;
36 import com.android.camera.one.config.OneCameraFeatureConfig;
37 import com.android.camera.settings.ResolutionSetting;
38 import com.android.camera.settings.SettingsManager;
39 import com.android.camera.ui.AbstractTutorialOverlay;
40 import com.android.camera.ui.PreviewStatusListener;
41 
42 /**
43  * The controller at app level.
44  */
45 public interface AppController {
46 
47     /**
48      * An interface which defines the shutter events listener.
49      */
50     public interface ShutterEventsListener {
51         /**
52          * Called when the shutter state is changed to pressed.
53          */
onShutterPressed()54         public void onShutterPressed();
55 
56         /**
57          * Called when the shutter state is changed to released.
58          */
onShutterReleased()59         public void onShutterReleased();
60 
61         /**
62          * Called when the shutter is clicked.
63          */
onShutterClicked()64         public void onShutterClicked();
65 
66         /**
67          * Called when the shutter is long pressed.
68          */
onShutterLongPressed()69         public void onShutterLongPressed();
70     }
71 
72     /**
73      * @return the {@link android.content.Context} being used.
74      */
getAndroidContext()75     public Context getAndroidContext();
76 
77     /** @return the camera feature configuration for the device. */
getCameraFeatureConfig()78     public OneCameraFeatureConfig getCameraFeatureConfig();
79 
80     /**
81      * Creates a new dialog which can be shown in the app.
82      *
83      * @return  {@link android.app.Dialog} of the app.
84      */
createDialog()85     public Dialog createDialog();
86 
87     /**
88      * @return a String scope uniquely identifing the current module.
89      */
getModuleScope()90     public String getModuleScope();
91 
92     /**
93      * @return a String scope uniquely identifing the current camera id.
94      */
getCameraScope()95     public String getCameraScope();
96 
97     /**
98      * Starts an activity.
99      *
100      * @param intent Used to start the activity.
101      */
launchActivityByIntent(Intent intent)102     public void launchActivityByIntent(Intent intent);
103 
104     /**
105      * See {@link Activity#openContextMenu(View)}
106      */
openContextMenu(View view)107     public void openContextMenu(View view);
108 
109     /**
110      * See {@link Activity#registerForContextMenu(View)}
111      */
registerForContextMenu(View view)112     public void registerForContextMenu(View view);
113 
114     /**
115      * Returns whether the app is currently paused.
116      */
isPaused()117     public boolean isPaused();
118 
119     /**
120      * Returns the current module controller.
121      */
getCurrentModuleController()122     public ModuleController getCurrentModuleController();
123 
124     /**
125      * Returns the currently active module index.
126      */
getCurrentModuleIndex()127     public int getCurrentModuleIndex();
128 
129     /**
130      * Returns the module ID for a specific mode.
131      */
getModuleId(int modeIndex)132     public int getModuleId(int modeIndex);
133 
134     /**
135      * Gets the mode that can be switched to from the given mode id through
136      * quick switch.
137      *
138      * @param currentModuleIndex index of the current mode
139      * @return mode id to quick switch to if index is valid, otherwise returns
140      *         the given mode id itself
141      */
getQuickSwitchToModuleId(int currentModuleIndex)142     public int getQuickSwitchToModuleId(int currentModuleIndex);
143 
144     /**
145      * Based on a mode switcher index, choose the correct module index.
146      *
147      * @param modeIndex mode switcher index.
148      * @return module index.
149      */
getPreferredChildModeIndex(int modeIndex)150     public int getPreferredChildModeIndex(int modeIndex);
151 
152     /**
153      * This gets called when mode is changed.
154      *
155      * @param moduleIndex index of the new module to switch to
156      */
onModeSelected(int moduleIndex)157     public void onModeSelected(int moduleIndex);
158 
159     /**
160      * This gets called when settings is selected and settings dialog needs to open.
161      */
onSettingsSelected()162     public void onSettingsSelected();
163 
164     /********************** UI / Camera preview **********************/
165 
166 
167     /**
168      * Freeze what is currently shown on screen until the next preview frame comes
169      * in. This can be used for camera switch to hide the UI changes underneath
170      * until preview is ready.
171      */
freezeScreenUntilPreviewReady()172     public void freezeScreenUntilPreviewReady();
173 
174     /**
175      * Returns the {@link android.graphics.SurfaceTexture} used by the preview
176      * UI.
177      */
getPreviewBuffer()178     public SurfaceTexture getPreviewBuffer();
179 
180     /**
181      * Gets called from module when preview is ready to start.
182      */
onPreviewReadyToStart()183     public void onPreviewReadyToStart();
184 
185     /**
186      * Gets called from module when preview is started.
187      */
onPreviewStarted()188     public void onPreviewStarted();
189 
190     /**
191      * Adds a listener to receive callbacks when preview area changes.
192      */
addPreviewAreaSizeChangedListener( PreviewStatusListener.PreviewAreaChangedListener listener)193     public void addPreviewAreaSizeChangedListener(
194             PreviewStatusListener.PreviewAreaChangedListener listener);
195 
196     /**
197      * Removes a listener that receives callbacks when preview area changes.
198      */
removePreviewAreaSizeChangedListener( PreviewStatusListener.PreviewAreaChangedListener listener)199     public void removePreviewAreaSizeChangedListener(
200             PreviewStatusListener.PreviewAreaChangedListener listener);
201 
202     /**
203      * Sets up one shot preview callback in order to notify UI when the next
204      * preview frame comes in.
205      */
setupOneShotPreviewListener()206     public void setupOneShotPreviewListener();
207 
208     /**
209      * Gets called from module when preview aspect ratio has changed.
210      *
211      * @param aspectRatio aspect ratio of preview stream
212      */
updatePreviewAspectRatio(float aspectRatio)213     public void updatePreviewAspectRatio(float aspectRatio);
214 
215     /**
216      * Gets called from module when the module needs to change the transform
217      * matrix of the preview TextureView. It does not modify the matrix before
218      * applying it.
219      *
220      * @param matrix transform matrix to be set on preview TextureView
221      * @param aspectRatio the desired aspect ratio of the preview
222      */
updatePreviewTransformFullscreen(Matrix matrix, float aspectRatio)223     public void updatePreviewTransformFullscreen(Matrix matrix, float aspectRatio);
224 
225     /**
226      * Call this to find the full rect available for a full screen preview
227      *
228      * @return the rect of the full screen minus any decor.
229      */
getFullscreenRect()230     public RectF getFullscreenRect();
231 
232     /**
233      * Gets called from module when the module needs to change the transform
234      * matrix of the preview TextureView. It is encouraged to use
235      * {@link #updatePreviewAspectRatio(float)} over this function, unless the
236      * module needs to rotate the surface texture using transform matrix.
237      *
238      * @param matrix transform matrix to be set on preview TextureView
239      */
updatePreviewTransform(Matrix matrix)240     public void updatePreviewTransform(Matrix matrix);
241 
242     /**
243      * Sets the preview status listener, which will get notified when TextureView
244      * surface has changed
245      *
246      * @param previewStatusListener the listener to get callbacks
247      */
setPreviewStatusListener(PreviewStatusListener previewStatusListener)248     public void setPreviewStatusListener(PreviewStatusListener previewStatusListener);
249 
250     /**
251      * Returns the {@link android.widget.FrameLayout} as the root of the module
252      * layout.
253      */
getModuleLayoutRoot()254     public FrameLayout getModuleLayoutRoot();
255 
256     /**
257      * Locks the system orientation.
258      */
lockOrientation()259     public void lockOrientation();
260 
261     /**
262      * Unlocks the system orientation.
263      */
unlockOrientation()264     public void unlockOrientation();
265 
266     /********************** Shutter button  **********************/
267 
268     /**
269      * Sets the shutter events listener.
270      *
271      * @param listener The listener.
272      */
setShutterEventsListener(ShutterEventsListener listener)273     public void setShutterEventsListener(ShutterEventsListener listener);
274 
275     /**
276      * Enables/Disables the shutter.
277      */
setShutterEnabled(boolean enabled)278     public void setShutterEnabled(boolean enabled);
279 
280     /**
281      * Checks whether the shutter is enabled.
282      */
isShutterEnabled()283     public boolean isShutterEnabled();
284 
285     /********************** Capture animation **********************/
286 
287     /**
288      * Starts flash animation with optional shorter flash.
289      *
290      * @param shortFlash true for shorter flash (faster cameras).
291      */
startFlashAnimation(boolean shortFlash)292     public void startFlashAnimation(boolean shortFlash);
293 
294     /**
295      * Starts normal pre-capture animation.
296      */
startPreCaptureAnimation()297     public void startPreCaptureAnimation();
298 
299     /**
300      * Cancels the pre-capture animation.
301      */
cancelPreCaptureAnimation()302     public void cancelPreCaptureAnimation();
303 
304     /**
305      * Starts the post-capture animation with the current preview image.
306      */
startPostCaptureAnimation()307     public void startPostCaptureAnimation();
308 
309     /**
310      * Starts the post-capture animation with the given thumbnail.
311      *
312      * @param thumbnail The thumbnail for the animation.
313      */
startPostCaptureAnimation(Bitmap thumbnail)314     public void startPostCaptureAnimation(Bitmap thumbnail);
315 
316     /**
317      * Cancels the post-capture animation.
318      */
cancelPostCaptureAnimation()319     public void cancelPostCaptureAnimation();
320 
321     /********************** Media saving **********************/
322 
323     /**
324      * Notifies the app of the newly captured media.
325      */
notifyNewMedia(Uri uri)326     public void notifyNewMedia(Uri uri);
327 
328     /********************** App-level resources **********************/
329 
330     /**
331      * Keeps the screen turned on.
332      *
333      * @param enabled Whether to keep the screen on.
334      */
enableKeepScreenOn(boolean enabled)335     public void enableKeepScreenOn(boolean enabled);
336 
337     /**
338      * Returns the {@link com.android.camera.app.CameraProvider}.
339      */
getCameraProvider()340     public CameraProvider getCameraProvider();
341 
342     /**
343      * Returns the new camera API manager.
344      */
getCameraOpener()345     public OneCameraOpener getCameraOpener();
346 
347     /**
348      * Returns the {@link OrientationManagerImpl}.
349      *
350      * @return {@code null} if not available yet.
351      */
getOrientationManager()352     public OrientationManager getOrientationManager();
353 
354     /**
355      * Returns the {@link LocationManager}.
356      *
357      * @return {@code null} if not available yet.
358      */
getLocationManager()359     public LocationManager getLocationManager();
360 
361     /**
362      * Returns the {@link SettingsManager}.
363      */
getSettingsManager()364     public SettingsManager getSettingsManager();
365 
366     /**
367      * Returns the {@link com.android.camera.settings.ResolutionSetting}.
368      *
369      * @return the current resolution setting.
370      */
getResolutionSetting()371     public ResolutionSetting getResolutionSetting();
372 
373     /**
374      * @return Common services and functionality to be shared.
375      */
getServices()376     public CameraServices getServices();
377 
378     /**
379      * @return The error handler to invoke for errors.
380      */
getFatalErrorHandler()381     public FatalErrorHandler getFatalErrorHandler();
382 
383     /**
384      * Returns the {@link com.android.camera.app.CameraAppUI}.
385      *
386      * @return {@code null} if not available yet.
387      */
getCameraAppUI()388     public CameraAppUI getCameraAppUI();
389 
390     /**
391      * Returns the {@link com.android.camera.app.ModuleManager}.
392      *
393      * @return {@code null} if not available yet.
394      */
getModuleManager()395     public ModuleManager getModuleManager();
396 
397     /**
398      * Returns the {@link com.android.camera.ButtonManager}.
399      */
getButtonManager()400     public ButtonManager getButtonManager();
401 
402     /** Returns a sound player that can be used to play custom sounds. */
getSoundPlayer()403     public SoundPlayer getSoundPlayer();
404 
405     /** Whether auto-rotate is enabled.*/
isAutoRotateScreen()406     public boolean isAutoRotateScreen();
407 
408     /**
409      * Shows the given tutorial overlay.
410      */
showTutorial(AbstractTutorialOverlay tutorial)411     public void showTutorial(AbstractTutorialOverlay tutorial);
412 
413     /**
414      * Finishes the activity since the intent is completed successfully.
415      *
416      * @param resultIntent The intent that carries the result.
417      */
finishActivityWithIntentCompleted(Intent resultIntent)418     public void finishActivityWithIntentCompleted(Intent resultIntent);
419 
420     /**
421      * Finishes the activity since the intent got canceled.
422      */
finishActivityWithIntentCanceled()423     public void finishActivityWithIntentCanceled();
424 }
425