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 */ 54 public void onShutterPressed(); 55 56 /** 57 * Called when the shutter state is changed to released. 58 */ 59 public void onShutterReleased(); 60 61 /** 62 * Called when the shutter is clicked. 63 */ 64 public void onShutterClicked(); 65 66 /** 67 * Called when the shutter is long pressed. 68 */ 69 public void onShutterLongPressed(); 70 } 71 72 /** 73 * @return the {@link android.content.Context} being used. 74 */ 75 public Context getAndroidContext(); 76 77 /** @return the camera feature configuration for the device. */ 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 */ 85 public Dialog createDialog(); 86 87 /** 88 * @return a String scope uniquely identifing the current module. 89 */ 90 public String getModuleScope(); 91 92 /** 93 * @return a String scope uniquely identifing the current camera id. 94 */ 95 public String getCameraScope(); 96 97 /** 98 * Starts an activity. 99 * 100 * @param intent Used to start the activity. 101 */ 102 public void launchActivityByIntent(Intent intent); 103 104 /** 105 * See {@link Activity#openContextMenu(View)} 106 */ 107 public void openContextMenu(View view); 108 109 /** 110 * See {@link Activity#registerForContextMenu(View)} 111 */ 112 public void registerForContextMenu(View view); 113 114 /** 115 * Returns whether the app is currently paused. 116 */ 117 public boolean isPaused(); 118 119 /** 120 * Returns the current module controller. 121 */ 122 public ModuleController getCurrentModuleController(); 123 124 /** 125 * Returns the currently active module index. 126 */ 127 public int getCurrentModuleIndex(); 128 129 /** 130 * Returns the module ID for a specific mode. 131 */ 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 */ 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 */ 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 */ 157 public void onModeSelected(int moduleIndex); 158 159 /** 160 * This gets called when settings is selected and settings dialog needs to open. 161 */ 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 */ 172 public void freezeScreenUntilPreviewReady(); 173 174 /** 175 * Returns the {@link android.graphics.SurfaceTexture} used by the preview 176 * UI. 177 */ 178 public SurfaceTexture getPreviewBuffer(); 179 180 /** 181 * Gets called from module when preview is ready to start. 182 */ 183 public void onPreviewReadyToStart(); 184 185 /** 186 * Gets called from module when preview is started. 187 */ 188 public void onPreviewStarted(); 189 190 /** 191 * Adds a listener to receive callbacks when preview area changes. 192 */ 193 public void addPreviewAreaSizeChangedListener( 194 PreviewStatusListener.PreviewAreaChangedListener listener); 195 196 /** 197 * Removes a listener that receives callbacks when preview area changes. 198 */ 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 */ 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 */ 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 */ 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 */ 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 */ 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 */ 248 public void setPreviewStatusListener(PreviewStatusListener previewStatusListener); 249 250 /** 251 * Returns the {@link android.widget.FrameLayout} as the root of the module 252 * layout. 253 */ 254 public FrameLayout getModuleLayoutRoot(); 255 256 /** 257 * Locks the system orientation. 258 */ 259 public void lockOrientation(); 260 261 /** 262 * Unlocks the system orientation. 263 */ 264 public void unlockOrientation(); 265 266 /********************** Shutter button **********************/ 267 268 /** 269 * Sets the shutter events listener. 270 * 271 * @param listener The listener. 272 */ 273 public void setShutterEventsListener(ShutterEventsListener listener); 274 275 /** 276 * Enables/Disables the shutter. 277 */ 278 public void setShutterEnabled(boolean enabled); 279 280 /** 281 * Checks whether the shutter is enabled. 282 */ 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 */ 292 public void startFlashAnimation(boolean shortFlash); 293 294 /** 295 * Starts normal pre-capture animation. 296 */ 297 public void startPreCaptureAnimation(); 298 299 /** 300 * Cancels the pre-capture animation. 301 */ 302 public void cancelPreCaptureAnimation(); 303 304 /** 305 * Starts the post-capture animation with the current preview image. 306 */ 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 */ 314 public void startPostCaptureAnimation(Bitmap thumbnail); 315 316 /** 317 * Cancels the post-capture animation. 318 */ 319 public void cancelPostCaptureAnimation(); 320 321 /********************** Media saving **********************/ 322 323 /** 324 * Notifies the app of the newly captured media. 325 */ 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 */ 335 public void enableKeepScreenOn(boolean enabled); 336 337 /** 338 * Returns the {@link com.android.camera.app.CameraProvider}. 339 */ 340 public CameraProvider getCameraProvider(); 341 342 /** 343 * Returns the new camera API manager. 344 */ 345 public OneCameraOpener getCameraOpener(); 346 347 /** 348 * Returns the {@link OrientationManagerImpl}. 349 * 350 * @return {@code null} if not available yet. 351 */ 352 public OrientationManager getOrientationManager(); 353 354 /** 355 * Returns the {@link LocationManager}. 356 * 357 * @return {@code null} if not available yet. 358 */ 359 public LocationManager getLocationManager(); 360 361 /** 362 * Returns the {@link SettingsManager}. 363 */ 364 public SettingsManager getSettingsManager(); 365 366 /** 367 * Returns the {@link com.android.camera.settings.ResolutionSetting}. 368 * 369 * @return the current resolution setting. 370 */ 371 public ResolutionSetting getResolutionSetting(); 372 373 /** 374 * @return Common services and functionality to be shared. 375 */ 376 public CameraServices getServices(); 377 378 /** 379 * @return The error handler to invoke for errors. 380 */ 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 */ 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 */ 395 public ModuleManager getModuleManager(); 396 397 /** 398 * Returns the {@link com.android.camera.ButtonManager}. 399 */ 400 public ButtonManager getButtonManager(); 401 402 /** Returns a sound player that can be used to play custom sounds. */ 403 public SoundPlayer getSoundPlayer(); 404 405 /** Whether auto-rotate is enabled.*/ 406 public boolean isAutoRotateScreen(); 407 408 /** 409 * Shows the given tutorial overlay. 410 */ 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 */ 418 public void finishActivityWithIntentCompleted(Intent resultIntent); 419 420 /** 421 * Finishes the activity since the intent got canceled. 422 */ 423 public void finishActivityWithIntentCanceled(); 424 } 425