OSDN Git Service

Make most app services lazy.
authorPaul Rohde <codelogic@google.com>
Tue, 20 Jan 2015 21:39:16 +0000 (13:39 -0800)
committerPaul Rohde <codelogic@google.com>
Fri, 23 Jan 2015 01:54:29 +0000 (17:54 -0800)
Change-Id: I476914b1ed399f8ad727ac33782229cdf39d378f

src/com/android/camera/CameraActivity.java
src/com/android/camera/CaptureModule.java
src/com/android/camera/PhotoModule.java
src/com/android/camera/VideoModule.java
src/com/android/camera/app/CameraApp.java
src/com/android/camera/app/CameraServicesImpl.java [new file with mode: 0644]
src/com/android/camera/processing/ProcessingService.java
src/com/android/camera/processing/ProcessingServiceManager.java
src/com/android/camera/settings/ManagedSwitchPreference.java
src/com/android/camera/tinyplanet/TinyPlanetFragment.java
src/com/android/camera/util/CameraUtil.java

index d6adbe6..5fc6f8c 100644 (file)
@@ -70,6 +70,7 @@ import com.android.camera.app.CameraAppUI;
 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;
@@ -1388,7 +1389,7 @@ public class CameraActivity extends QuickActivity
     @Override
     public void onCreateTasks(Bundle state) {
         CameraPerformanceTracker.onEvent(CameraPerformanceTracker.ACTIVITY_START);
-        mAppContext = getApplication().getBaseContext();
+        mAppContext = getApplicationContext();
 
         if (!Glide.isSetup()) {
             Context context = getAndroidContext();
@@ -2343,7 +2344,7 @@ public class CameraActivity extends QuickActivity
 
     @Override
     public CameraServices getServices() {
-        return (CameraServices) getApplication();
+        return CameraServicesImpl.instance();
     }
 
     public List<String> getSupportedModeNames() {
index 44428b1..df9429d 100644 (file)
@@ -460,7 +460,7 @@ public class CaptureModule extends CameraModule implements
     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);
     }
index c466045..b025229 100644 (file)
@@ -1040,7 +1040,7 @@ public class PhotoModule
 
         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);
         }
index d1a1003..96e6572 100644 (file)
@@ -1927,7 +1927,7 @@ public class VideoModule extends CameraModule
 
     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);
 
index 255f19e..715c44d 100644 (file)
@@ -21,29 +21,15 @@ import android.app.NotificationManager;
 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.
@@ -53,12 +39,6 @@ public class CameraApp extends Application implements CameraServices {
      */
     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() {
@@ -76,57 +56,8 @@ public class CameraApp extends Application implements CameraServices {
         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;
     }
 
     /**
diff --git a/src/com/android/camera/app/CameraServicesImpl.java b/src/com/android/camera/app/CameraServicesImpl.java
new file mode 100644 (file)
index 0000000..3b213f7
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * 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;
+    }
+}
index 4a91e70..b1e020a 100644 (file)
@@ -29,8 +29,8 @@ import android.os.PowerManager.WakeLock;
 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;
@@ -101,7 +101,7 @@ public class ProcessingService extends Service implements 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.
@@ -245,7 +245,7 @@ public class ProcessingService extends Service implements ProgressListener {
      * Returns the common camera services.
      */
     private CameraServices getServices() {
-        return (CameraApp) this.getApplication();
+        return CameraServicesImpl.instance();
     }
 
     private void postNotification() {
index 2e6a806..731dc50 100644 (file)
@@ -21,6 +21,7 @@ import android.content.Intent;
 
 import com.android.camera.debug.Log;
 import com.android.camera.processing.imagebackend.ImageBackend;
+import com.android.camera.util.AndroidContext;
 
 import java.util.LinkedList;
 
@@ -34,8 +35,14 @@ 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;
@@ -49,47 +56,11 @@ public class ProcessingServiceManager {
     /** 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();
     }
 
     /**
@@ -167,6 +138,13 @@ public class ProcessingServiceManager {
     }
 
     /**
+     * @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().
index 12ae0aa..c7e87c0 100644 (file)
@@ -19,11 +19,11 @@ package com.android.camera.settings;
 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
@@ -53,7 +53,7 @@ public class ManagedSwitchPreference extends SwitchPreference {
             // 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 {
@@ -72,7 +72,7 @@ public class ManagedSwitchPreference extends SwitchPreference {
             // 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;
index 457ff7b..de11db5 100644 (file)
@@ -41,7 +41,7 @@ import android.widget.SeekBar.OnSeekBarChangeListener;
 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;
@@ -304,7 +304,7 @@ public class TinyPlanetFragment extends DialogFragment implements PreviewSizeLis
             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
index f492590..256ed1d 100644 (file)
@@ -38,7 +38,6 @@ import android.hardware.camera2.CameraMetadata;
 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;
@@ -58,7 +57,6 @@ import com.android.ex.camera2.portability.CameraSettings;
 
 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;
@@ -68,7 +66,19 @@ import java.util.Locale;
  * 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;
@@ -116,23 +126,11 @@ public class CameraUtil {
     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));
     }
 
     /**
@@ -725,9 +723,9 @@ public class CameraUtil {
         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);
         }
     }