import com.android.camera.app.CameraController;
import com.android.camera.app.CameraProvider;
import com.android.camera.app.CameraServices;
+import com.android.camera.app.CameraServicesImpl;
import com.android.camera.app.FirstRunDialog;
import com.android.camera.app.LocationManager;
import com.android.camera.app.MemoryManager;
@Override
public void onCreateTasks(Bundle state) {
CameraPerformanceTracker.onEvent(CameraPerformanceTracker.ACTIVITY_START);
- mAppContext = getApplication().getBaseContext();
+ mAppContext = getApplicationContext();
if (!Glide.isSetup()) {
Context context = getAndroidContext();
@Override
public CameraServices getServices() {
- return (CameraServices) getApplication();
+ return CameraServicesImpl.instance();
}
public List<String> getSupportedModeNames() {
private CaptureSession createCaptureSession() {
long sessionTime = getSessionTime();
Location location = mLocationManager.getCurrentLocation();
- String title = CameraUtil.createJpegName(sessionTime);
+ String title = CameraUtil.instance().createJpegName(sessionTime);
return getServices().getCaptureSessionManager()
.createNewSession(title, sessionTime, location);
}
public void nameNewImage(long date) {
NamedEntity r = new NamedEntity();
- r.title = CameraUtil.createJpegName(date);
+ r.title = CameraUtil.instance().createJpegName(date);
r.date = date;
mQueue.add(r);
}
private void storeImage(final byte[] data, Location loc) {
long dateTaken = System.currentTimeMillis();
- String title = CameraUtil.createJpegName(dateTaken);
+ String title = CameraUtil.instance().createJpegName(dateTaken);
ExifInterface exif = Exif.getExif(data);
int orientation = Exif.getOrientation(exif);
import android.content.Context;
import android.os.Debug;
-import com.android.camera.MediaSaverImpl;
-import com.android.camera.Storage;
-import com.android.camera.processing.ProcessingServiceManager;
-import com.android.camera.remote.RemoteShutterListener;
-import com.android.camera.session.CaptureSessionManager;
-import com.android.camera.session.CaptureSessionManagerImpl;
-import com.android.camera.session.PlaceholderManager;
-import com.android.camera.session.SessionStorageManager;
-import com.android.camera.session.SessionStorageManagerImpl;
-import com.android.camera.session.StackSaverFactory;
-import com.android.camera.settings.SettingsManager;
-import com.android.camera.stats.SessionStatsCollector;
import com.android.camera.stats.UsageStatistics;
import com.android.camera.util.AndroidContext;
import com.android.camera.util.AndroidServices;
-import com.android.camera.util.CameraUtil;
-import com.android.camera.util.RemoteShutterHelper;
/**
* The Camera application class containing important services and functionality
* to be used across modules.
*/
-public class CameraApp extends Application implements CameraServices {
+public class CameraApp extends Application {
/**
* This is for debugging only: If set to true, application will not start
* until a debugger is attached.
*/
private static final boolean WAIT_FOR_DEBUGGER_ON_START = false;
- private MediaSaver mMediaSaver;
- private CaptureSessionManager mSessionManager;
- private MemoryManagerImpl mMemoryManager;
- private RemoteShutterListener mRemoteShutterListener;
- private MotionManager mMotionManager;
- private SettingsManager mSettingsManager;
@Override
public void onCreate() {
FirstRunDetector.instance().initializeTimeOfFirstRun(context);
UsageStatistics.instance().initialize(this);
- SessionStatsCollector.instance().initialize(this);
- CameraUtil.initialize(this);
-
- ProcessingServiceManager.initSingleton(context);
-
- mMediaSaver = new MediaSaverImpl();
- PlaceholderManager mPlaceHolderManager = new PlaceholderManager(context);
- SessionStorageManager mSessionStorageManager = SessionStorageManagerImpl.create(this);
-
- StackSaverFactory mStackSaverFactory = new StackSaverFactory(Storage.DIRECTORY,
- getContentResolver());
- mSessionManager = new CaptureSessionManagerImpl(mMediaSaver, getContentResolver(),
- mPlaceHolderManager, mSessionStorageManager, mStackSaverFactory);
- mMemoryManager = MemoryManagerImpl.create(getApplicationContext(), mMediaSaver);
- mRemoteShutterListener = RemoteShutterHelper.create(this);
- mSettingsManager = new SettingsManager(this);
clearNotifications();
-
- mMotionManager = new MotionManager(context);
- }
-
- @Override
- public CaptureSessionManager getCaptureSessionManager() {
- return mSessionManager;
- }
-
- @Override
- public MemoryManager getMemoryManager() {
- return mMemoryManager;
- }
-
- @Override
- public MotionManager getMotionManager() {
- return mMotionManager;
- }
-
- @Override
- @Deprecated
- public MediaSaver getMediaSaver() {
- return mMediaSaver;
- }
-
- @Override
- public RemoteShutterListener getRemoteShutterListener() {
- return mRemoteShutterListener;
- }
-
- @Override
- public SettingsManager getSettingsManager() {
- return mSettingsManager;
}
/**
--- /dev/null
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.camera.app;
+
+import android.content.Context;
+
+import com.android.camera.MediaSaverImpl;
+import com.android.camera.Storage;
+import com.android.camera.remote.RemoteShutterListener;
+import com.android.camera.session.CaptureSessionManager;
+import com.android.camera.session.CaptureSessionManagerImpl;
+import com.android.camera.session.PlaceholderManager;
+import com.android.camera.session.SessionStorageManager;
+import com.android.camera.session.SessionStorageManagerImpl;
+import com.android.camera.session.StackSaverFactory;
+import com.android.camera.settings.SettingsManager;
+import com.android.camera.util.AndroidContext;
+import com.android.camera.util.RemoteShutterHelper;
+
+/**
+ * Functionality available to all modules and services.
+ */
+public class CameraServicesImpl implements CameraServices {
+ /**
+ * Fast, thread safe singleton initialization.
+ */
+ private static class Singleton {
+ private static final CameraServicesImpl INSTANCE = new CameraServicesImpl(
+ AndroidContext.instance().get());
+ }
+
+ /**
+ * @return a single instance of of the global camera services.
+ */
+ public static CameraServicesImpl instance() {
+ return Singleton.INSTANCE;
+ }
+
+ private final MediaSaver mMediaSaver;
+ private final CaptureSessionManager mSessionManager;
+ private final MemoryManagerImpl mMemoryManager;
+ private final RemoteShutterListener mRemoteShutterListener;
+ private final MotionManager mMotionManager;
+ private final SettingsManager mSettingsManager;
+
+ private CameraServicesImpl(Context context) {
+ mMediaSaver = new MediaSaverImpl();
+ PlaceholderManager mPlaceHolderManager = new PlaceholderManager(context);
+ SessionStorageManager mSessionStorageManager = SessionStorageManagerImpl.create(context);
+
+ StackSaverFactory mStackSaverFactory = new StackSaverFactory(Storage.DIRECTORY,
+ context.getContentResolver());
+ mSessionManager = new CaptureSessionManagerImpl(mMediaSaver, context.getContentResolver(),
+ mPlaceHolderManager, mSessionStorageManager, mStackSaverFactory);
+ mMemoryManager = MemoryManagerImpl.create(context, mMediaSaver);
+ mRemoteShutterListener = RemoteShutterHelper.create(context);
+ mSettingsManager = new SettingsManager(context);
+
+ mMotionManager = new MotionManager(context);
+ }
+
+ @Override
+ public CaptureSessionManager getCaptureSessionManager() {
+ return mSessionManager;
+ }
+
+ @Override
+ public MemoryManager getMemoryManager() {
+ return mMemoryManager;
+ }
+
+ @Override
+ public MotionManager getMotionManager() {
+ return mMotionManager;
+ }
+
+ @Override
+ @Deprecated
+ public MediaSaver getMediaSaver() {
+ return mMediaSaver;
+ }
+
+ @Override
+ public RemoteShutterListener getRemoteShutterListener() {
+ return mRemoteShutterListener;
+ }
+
+ @Override
+ public SettingsManager getSettingsManager() {
+ return mSettingsManager;
+ }
+}
import android.os.Process;
import android.support.v4.content.LocalBroadcastManager;
-import com.android.camera.app.CameraApp;
import com.android.camera.app.CameraServices;
+import com.android.camera.app.CameraServicesImpl;
import com.android.camera.debug.Log;
import com.android.camera.session.CaptureSession;
import com.android.camera.session.CaptureSession.ProgressListener;
@Override
public void onCreate() {
- mProcessingServiceManager = ProcessingServiceManager.getInstance();
+ mProcessingServiceManager = ProcessingServiceManager.instance();
mSessionManager = getServices().getCaptureSessionManager();
// Keep CPU awake while allowing screen and keyboard to switch off.
* Returns the common camera services.
*/
private CameraServices getServices() {
- return (CameraApp) this.getApplication();
+ return CameraServicesImpl.instance();
}
private void postNotification() {
import com.android.camera.debug.Log;
import com.android.camera.processing.imagebackend.ImageBackend;
+import com.android.camera.util.AndroidContext;
import java.util.LinkedList;
public class ProcessingServiceManager {
private static final Log.Tag TAG = new Log.Tag("ProcessingSvcMgr");
- /** The singleton instance of this manager. */
- private static ProcessingServiceManager sInstance;
+ private static class Singleton {
+ private static final ProcessingServiceManager INSTANCE = new ProcessingServiceManager(
+ AndroidContext.instance().get());
+ }
+
+ public static ProcessingServiceManager instance() {
+ return Singleton.INSTANCE;
+ }
/** The application context. */
private final Context mAppContext;
/** Can be set to prevent tasks from being processed until released.*/
private boolean mHoldProcessing = false;
- private static ImageBackend sImageBackend;
-
- /**
- * Initializes the singleton instances of ProcessingServiceManager
- * and ImageBackend.
- *
- * @param appContext the application context.
- */
- public static void initSingleton(Context appContext) {
- sInstance = new ProcessingServiceManager(appContext);
- sImageBackend = new ImageBackend();
- }
-
- /**
- * Note: Make sure to call {@link #initSingleton(Context)} first.
- *
- * @return the singleton instance of the processing service manager.
- */
- public static ProcessingServiceManager getInstance() {
- if (sInstance == null) {
- throw new IllegalStateException("initSingleton() not yet called.");
- }
- return sInstance;
- }
-
-
- /**
- * Note: Make sure to call {@link #initSingleton(Context)} first.
- *
- * @return the singleton instance of the processing service manager.
- */
- public static ImageBackend getImageBackendInstance() {
- if (sInstance == null) {
- throw new IllegalStateException("initSingleton() not yet called.");
- }
- return sImageBackend;
- }
-
+ private final ImageBackend mImageBackend;
private ProcessingServiceManager(Context context) {
mAppContext = context;
+ mImageBackend = new ImageBackend();
}
/**
}
/**
+ * @return the currently defined image backend for this service.
+ */
+ public ImageBackend getImageBackend() {
+ return mImageBackend;
+ }
+
+ /**
* Starts the service which will then work through the queue. Once the queue
* is empty {@link #popNextSession()} returns null), the task will kill
* itself automatically and call #stitchingFinished().
import android.app.Activity;
import android.app.Application;
import android.content.Context;
-
import android.preference.SwitchPreference;
import android.util.AttributeSet;
import com.android.camera.app.CameraApp;
+import com.android.camera.app.CameraServicesImpl;
/**
* This class allows Settings UIs to display and set boolean values controlled
// preference from XML. In that case return the default value.
return defaultReturnValue;
}
- SettingsManager settingsManager = cameraApp.getSettingsManager();
+ SettingsManager settingsManager = CameraServicesImpl.instance().getSettingsManager();
if (settingsManager != null) {
return settingsManager.getBoolean(SettingsManager.SCOPE_GLOBAL, getKey());
} else {
// be persisted.
return false;
}
- SettingsManager settingsManager = cameraApp.getSettingsManager();
+ SettingsManager settingsManager = CameraServicesImpl.instance().getSettingsManager();
if (settingsManager != null) {
settingsManager.set(SettingsManager.SCOPE_GLOBAL, getKey(), value);
return true;
import com.adobe.xmp.XMPException;
import com.adobe.xmp.XMPMeta;
import com.android.camera.CameraActivity;
-import com.android.camera.app.CameraApp;
+import com.android.camera.app.CameraServicesImpl;
import com.android.camera.app.MediaSaver;
import com.android.camera.app.MediaSaver.OnMediaSavedListener;
import com.android.camera.debug.Log;
protected void onPostExecute(TinyPlanetImage image) {
// Once created, store the new file and add it to the filmstrip.
final CameraActivity activity = (CameraActivity) getActivity();
- MediaSaver mediaSaver = ((CameraApp) activity.getApplication()).getMediaSaver();
+ MediaSaver mediaSaver = CameraServicesImpl.instance().getMediaSaver();
OnMediaSavedListener doneListener =
new OnMediaSavedListener() {
@Override
import android.location.Location;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
-import android.telephony.TelephonyManager;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.OrientationEventListener;
import java.io.Closeable;
import java.io.IOException;
-import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
* Collection of utility functions used in this package.
*/
public class CameraUtil {
- private static final Log.Tag TAG = new Log.Tag("Util");
+ private static final Log.Tag TAG = new Log.Tag("CameraUtil");
+
+ private static class Singleton {
+ private static final CameraUtil INSTANCE = new CameraUtil(
+ AndroidContext.instance().get());
+ }
+
+ /**
+ * Thread safe CameraUtil instance.
+ */
+ public static CameraUtil instance() {
+ return Singleton.INSTANCE;
+ }
// For calculate the best fps range for still image capture.
private final static int MAX_PREVIEW_FPS_TIMES_1000 = 400000;
private static final String EXTRAS_CAMERA_FACING =
"android.intent.extras.CAMERA_FACING";
- private static float sPixelDensity = 1;
- private static ImageFileNamer sImageFileNamer;
-
- private CameraUtil() {
- }
-
- public static void initialize(Context context) {
- DisplayMetrics metrics = new DisplayMetrics();
- WindowManager wm = AndroidServices.instance().provideWindowManager();
- wm.getDefaultDisplay().getMetrics(metrics);
- sPixelDensity = metrics.density;
- sImageFileNamer = new ImageFileNamer(
- context.getString(R.string.image_file_name_format));
- }
+ private final ImageFileNamer mImageFileNamer;
- public static int dpToPixel(int dp) {
- return Math.round(sPixelDensity * dp);
+ private CameraUtil(Context context) {
+ mImageFileNamer = new ImageFileNamer(
+ context.getString(R.string.image_file_name_format));
}
/**
matrix.postTranslate(viewWidth / 2f, viewHeight / 2f);
}
- public static String createJpegName(long dateTaken) {
- synchronized (sImageFileNamer) {
- return sImageFileNamer.generateName(dateTaken);
+ public String createJpegName(long dateTaken) {
+ synchronized (mImageFileNamer) {
+ return mImageFileNamer.generateName(dateTaken);
}
}