OSDN Git Service

Ensure OnScreenHint uses an Activity
[android-x86/packages-apps-Camera2.git] / src / com / android / camera / CameraActivity.java
index c513547..e8ed35d 100644 (file)
@@ -101,12 +101,15 @@ import com.android.camera.data.SessionItem;
 import com.android.camera.data.VideoDataFactory;
 import com.android.camera.data.VideoItemFactory;
 import com.android.camera.debug.Log;
+import com.android.camera.device.ActiveCameraDeviceTracker;
 import com.android.camera.filmstrip.FilmstripContentPanel;
 import com.android.camera.filmstrip.FilmstripController;
 import com.android.camera.module.ModuleController;
 import com.android.camera.module.ModulesInfo;
 import com.android.camera.one.OneCameraException;
 import com.android.camera.one.OneCameraManager;
+import com.android.camera.one.OneCameraModule;
+import com.android.camera.one.OneCameraOpener;
 import com.android.camera.one.config.OneCameraFeatureConfig;
 import com.android.camera.one.config.OneCameraFeatureConfigCreator;
 import com.android.camera.session.CaptureSession;
@@ -115,6 +118,7 @@ import com.android.camera.session.CaptureSessionManager.SessionListener;
 import com.android.camera.settings.AppUpgrader;
 import com.android.camera.settings.CameraSettingsActivity;
 import com.android.camera.settings.Keys;
+import com.android.camera.settings.PictureSizeLoader;
 import com.android.camera.settings.ResolutionSetting;
 import com.android.camera.settings.ResolutionUtil;
 import com.android.camera.settings.SettingsManager;
@@ -131,6 +135,7 @@ import com.android.camera.ui.ModeListView.ModeListVisibilityChangedListener;
 import com.android.camera.ui.PreviewStatusListener;
 import com.android.camera.util.ApiHelper;
 import com.android.camera.util.Callback;
+import com.android.camera.util.CameraSettingsActivityHelper;
 import com.android.camera.util.CameraUtil;
 import com.android.camera.util.GalleryHelper;
 import com.android.camera.util.GcamHelper;
@@ -151,7 +156,6 @@ import com.bumptech.glide.GlideBuilder;
 import com.bumptech.glide.MemoryCategory;
 import com.bumptech.glide.load.DecodeFormat;
 import com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor;
-import com.bumptech.glide.load.engine.prefill.PreFillType;
 import com.google.common.base.Optional;
 import com.google.common.logging.eventprotos;
 import com.google.common.logging.eventprotos.ForegroundEvent.ForegroundSource;
@@ -181,9 +185,6 @@ public class CameraActivity extends QuickActivity
     // panorama. If the extra is not set, it is in the normal camera mode.
     public static final String SECURE_CAMERA_EXTRA = "secure_camera";
 
-    public static final String MODULE_SCOPE_PREFIX = "_preferences_module_";
-    public static final String CAMERA_SCOPE_PREFIX = "_preferences_camera_";
-
     private static final int MSG_CLEAR_SCREEN_ON_FLAG = 2;
     private static final long SCREEN_DELAY_MS = 2 * 60 * 1000; // 2 mins.
     /** Load metadata for 10 items ahead of our current. */
@@ -211,7 +212,9 @@ public class CameraActivity extends QuickActivity
     private PhotoItemFactory mPhotoItemFactory;
     private LocalFilmstripDataAdapter mDataAdapter;
 
-    private OneCameraManager mCameraManager;
+    private ActiveCameraDeviceTracker mActiveCameraDeviceTracker;
+    private OneCameraOpener mOneCameraOpener;
+    private OneCameraManager mOneCameraManager;
     private SettingsManager mSettingsManager;
     private ResolutionSetting mResolutionSetting;
     private ModeListView mModeListView;
@@ -811,24 +814,26 @@ public class CameraActivity extends QuickActivity
         mCameraAppUI.getFilmstripBottomControls().hideProgress();
     }
 
-    private void showSessionProgress(CharSequence message) {
+    private void showSessionProgress(int messageId) {
         CameraAppUI.BottomPanel controls = mCameraAppUI.getFilmstripBottomControls();
-        controls.setProgressText(message);
+        controls.setProgressText(messageId > 0 ? getString(messageId) : "");
         controls.hideControls();
         controls.hideProgressError();
         controls.showProgress();
     }
 
-    private void showProcessError(CharSequence message) {
-        mCameraAppUI.getFilmstripBottomControls().showProgressError(message);
+    private void showProcessError(int messageId) {
+        mCameraAppUI.getFilmstripBottomControls().showProgressError(
+                messageId > 0 ? getString(messageId) : "");
     }
 
     private void updateSessionProgress(int progress) {
         mCameraAppUI.getFilmstripBottomControls().setProgress(progress);
     }
 
-    private void updateSessionProgressText(CharSequence message) {
-        mCameraAppUI.getFilmstripBottomControls().setProgressText(message);
+    private void updateSessionProgressText(int messageId) {
+        mCameraAppUI.getFilmstripBottomControls().setProgressText(
+                messageId > 0 ? getString(messageId) : "");
     }
 
     private void setupNfcBeamPush() {
@@ -874,8 +879,10 @@ public class CameraActivity extends QuickActivity
                     if (!Storage.isSessionUri(uri)) {
                         return;
                     }
-                    SessionItem newData = new SessionItem(getApplicationContext(), uri);
-                    mDataAdapter.addOrUpdate(newData);
+                    Optional<SessionItem> newData = SessionItem.create(getApplicationContext(), uri);
+                    if (newData.isPresent()) {
+                        mDataAdapter.addOrUpdate(newData.get());
+                    }
                 }
 
                 @Override
@@ -902,17 +909,22 @@ public class CameraActivity extends QuickActivity
                         return;
                     }
 
-                    // Make the PhotoItem aware of the session placeholder, to
-                    // allow it to make a smooth transition to its content.
-                    newData.setSessionPlaceholderBitmap(
-                            Storage.getPlaceholderForSession(sessionUri));
-
                     final int pos = mDataAdapter.findByContentUri(sessionUri);
                     if (pos == -1) {
                         // We do not have a placeholder for this image, perhaps
                         // due to the activity crashing or being killed.
                         mDataAdapter.addOrUpdate(newData);
                     } else {
+                        // Make the PhotoItem aware of the session placeholder, to
+                        // allow it to make a smooth transition to its content if it
+                        // the session item is currently visible.
+                        FilmstripItem oldSessionData = mDataAdapter.getFilmstripItemAt(pos);
+                        if (mCameraAppUI.getFilmstripVisibility() == View.VISIBLE
+                                && mFilmstripController.isVisible(oldSessionData)) {
+                            Log.v(TAG, "session item visible, setting transition placeholder");
+                            newData.setSessionPlaceholderBitmap(
+                                    Storage.getPlaceholderForSession(sessionUri));
+                        }
                         mDataAdapter.updateItemAt(pos, newData);
                     }
                 }
@@ -934,14 +946,14 @@ public class CameraActivity extends QuickActivity
                 }
 
                 @Override
-                public void onSessionProgressText(final Uri uri, final CharSequence message) {
+                public void onSessionProgressText(final Uri uri, final int messageId) {
                     int currentIndex = mFilmstripController.getCurrentAdapterIndex();
                     if (currentIndex == -1) {
                         return;
                     }
                     if (uri.equals(
                             mDataAdapter.getItemAt(currentIndex).getData().getUri())) {
-                        updateSessionProgressText(message);
+                        updateSessionProgressText(messageId);
                     }
                 }
 
@@ -958,7 +970,8 @@ public class CameraActivity extends QuickActivity
                 }
 
                 @Override
-                public void onSessionFailed(Uri uri, CharSequence reason, boolean removeFromFilmstrip) {
+                public void onSessionFailed(Uri uri, int failureMessageId,
+                        boolean removeFromFilmstrip) {
                     Log.v(TAG, "onSessionFailed:" + uri);
 
                     int failedIndex = mDataAdapter.findByContentUri(uri);
@@ -966,7 +979,7 @@ public class CameraActivity extends QuickActivity
 
                     if (currentIndex == failedIndex) {
                         updateSessionProgress(0);
-                        showProcessError(reason);
+                        showProcessError(failureMessageId);
                         mDataAdapter.refresh(uri);
                     }
                     if (removeFromFilmstrip) {
@@ -976,6 +989,13 @@ public class CameraActivity extends QuickActivity
                 }
 
                 @Override
+                public void onSessionCanceled(Uri uri) {
+                    Log.v(TAG, "onSessionCanceled:" + uri);
+                    int failedIndex = mDataAdapter.findByContentUri(uri);
+                    mDataAdapter.removeAt(failedIndex);
+                }
+
+                @Override
                 public void onSessionThumbnailUpdate(Bitmap bitmap) {
                 }
 
@@ -1014,27 +1034,20 @@ public class CameraActivity extends QuickActivity
     }
 
     @Override
-    public int getCurrentCameraId() {
-        return mCameraController.getCurrentCameraId();
-    }
-
-    @Override
     public String getModuleScope() {
         ModuleAgent agent = mModuleManager.getModuleAgent(mCurrentModeIndex);
-        return MODULE_SCOPE_PREFIX + agent.getScopeNamespace();
+        return SettingsManager.getModuleSettingScope(agent.getScopeNamespace());
     }
 
     @Override
     public String getCameraScope() {
-        int currentCameraId = getCurrentCameraId();
-        if (currentCameraId < 0) {
-            // if an unopen camera i.e. negative ID is returned, which we've observed in
-            // some automated scenarios, just return it as a valid separate scope
-            // this could cause user issues, so log a stack trace noting the call path
-            // which resulted in this scenario.
-            Log.w(TAG, "getting camera scope with no open camera, using id: " + currentCameraId);
-        }
-        return CAMERA_SCOPE_PREFIX + Integer.toString(currentCameraId);
+        // if an unopen camera i.e. negative ID is returned, which we've observed in
+        // some automated scenarios, just return it as a valid separate scope
+        // this could cause user issues, so log a stack trace noting the call path
+        // which resulted in this scenario.
+
+        return SettingsManager.getCameraSettingScope(
+                mCameraController.getCurrentCameraId().getValue());
     }
 
     @Override
@@ -1298,8 +1311,8 @@ public class CameraActivity extends QuickActivity
     }
 
     @Override
-    public OneCameraManager getCameraManager() {
-        return mCameraManager;
+    public OneCameraOpener getCameraOpener() {
+        return mOneCameraOpener;
     }
 
     private void removeItemAt(int index) {
@@ -1422,34 +1435,30 @@ public class CameraActivity extends QuickActivity
             // As a camera we will use a large amount of memory
             // for displaying images.
             glide.setMemoryCategory(MemoryCategory.HIGH);
-
-            // Prefill glides bitmap pool to prevent excessive jank
-            // when loading large images.
-            glide.preFillBitmapPool(
-                new PreFillType.Builder(GlideFilmstripManager.MAXIMUM_TEXTURE_SIZE)
-                  .setWeight(5),
-                  // It's more important for jank and GC to have
-                  // A larger weight of max texture size images than
-                  // media store sized images.
-                new PreFillType.Builder(
-                      GlideFilmstripManager.MEDIASTORE_THUMB_WIDTH,
-                      GlideFilmstripManager.MEDIASTORE_THUMB_HEIGHT));
         }
         profile.mark("Glide.setup");
+
+        mActiveCameraDeviceTracker = ActiveCameraDeviceTracker.instance();
         try {
-            mCameraManager = OneCameraManager.get(
-                    mFeatureConfig, mAppContext, ResolutionUtil.getDisplayMetrics(this));
+            mOneCameraOpener = OneCameraModule.provideOneCameraOpener(
+                    mFeatureConfig,
+                    mAppContext,
+                    mActiveCameraDeviceTracker,
+                    ResolutionUtil.getDisplayMetrics(this));
+            mOneCameraManager = OneCameraModule.provideOneCameraManager();
         } catch (OneCameraException e) {
             // Log error and continue start process while showing error dialog..
             Log.e(TAG, "Creating camera manager failed.", e);
             mFatalErrorHandler.onGenericCameraAccessFailure();
         }
         profile.mark("OneCameraManager.get");
+
         mCameraController = new CameraController(mAppContext, this, mMainHandler,
                 CameraAgentFactory.getAndroidCameraAgent(mAppContext,
                         CameraAgentFactory.CameraApi.API_1),
                 CameraAgentFactory.getAndroidCameraAgent(mAppContext,
-                        CameraAgentFactory.CameraApi.AUTO));
+                        CameraAgentFactory.CameraApi.AUTO),
+                mActiveCameraDeviceTracker);
         mCameraController.setCameraExceptionHandler(
                 new CameraExceptionHandler(mCameraExceptionCallback, mMainHandler));
 
@@ -1461,9 +1470,15 @@ public class CameraActivity extends QuickActivity
 
         AppUpgrader appUpgrader = new AppUpgrader(this);
         appUpgrader.upgrade(mSettingsManager);
+
+        // Make sure the picture sizes are correctly cached for the current OS
+        // version.
+        profile.mark();
+        (new PictureSizeLoader(mAppContext)).computePictureSizes();
+        profile.mark("computePictureSizes");
         Keys.setDefaults(mSettingsManager, mAppContext);
 
-        mResolutionSetting = new ResolutionSetting(mSettingsManager, mCameraManager,
+        mResolutionSetting = new ResolutionSetting(mSettingsManager, mOneCameraManager,
                 getContentResolver());
 
         getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
@@ -1650,9 +1665,18 @@ public class CameraActivity extends QuickActivity
 
         mMotionManager = getServices().getMotionManager();
 
-        mFirstRunDialog = new FirstRunDialog(this, new FirstRunDialog.FirstRunDialogListener() {
+        mFirstRunDialog = new FirstRunDialog(this,
+              getAndroidContext(),
+              mResolutionSetting,
+              mSettingsManager,
+              mOneCameraManager,
+              new FirstRunDialog.FirstRunDialogListener() {
             @Override
             public void onFirstRunStateReady() {
+                // Make sure additional preferences have the correct resolution selected
+                CameraSettingsActivityHelper.verifyDefaults(getSettingsManager(),
+                        getAndroidContext());
+
                 // Run normal resume tasks.
                 resume();
             }
@@ -2251,7 +2275,7 @@ public class CameraActivity extends QuickActivity
         if (message != null) {
             Log.w(TAG, "Storage warning: " + message);
             if (mStorageHint == null) {
-                mStorageHint = OnScreenHint.makeText(message);
+                mStorageHint = OnScreenHint.makeText(CameraActivity.this, message);
             } else {
                 mStorageHint.setText(message);
             }
@@ -2801,7 +2825,7 @@ public class CameraActivity extends QuickActivity
                 .getCaptureSessionManager();
 
         if (sessionManager.hasErrorMessage(contentUri)) {
-            showProcessError(sessionManager.getErrorMessage(contentUri));
+            showProcessError(sessionManager.getErrorMessageId(contentUri));
         } else {
             filmstripBottomPanel.hideProgressError();
             CaptureSession session = sessionManager.getSession(contentUri);
@@ -2812,8 +2836,8 @@ public class CameraActivity extends QuickActivity
                 if (sessionProgress < 0) {
                     hideSessionProgress();
                 } else {
-                    CharSequence progressMessage = session.getProgressMessage();
-                    showSessionProgress(progressMessage);
+                    int progressMessageId = session.getProgressMessageId();
+                    showSessionProgress(progressMessageId);
                     updateSessionProgress(sessionProgress);
                 }
             } else {