Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3957efd0 authored by Wu-cheng Li's avatar Wu-cheng Li
Browse files

Fix OOM when switching between camera and camcorder.

- Camera activities extend AbstractGalleryActivity. So
  onDestroy is moved from Gallery to AbstractGalleryActivity.
- Use WeakReference for values in the WeakHashMap of
  SpinnerVisibilitySetter.

bug:5954389
Change-Id: Ib15f269bd4c54a4621bdff58e7ea16b44f8fb3e3
parent 98c2490a
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -180,6 +180,17 @@ public class AbstractGalleryActivity extends Activity implements GalleryActivity
        BitmapPool.clear();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mGLRootView.lockRenderThread();
        try {
            getStateManager().destroy();
        } finally {
            mGLRootView.unlockRenderThread();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mGLRootView.lockRenderThread();
+0 −12
Original line number Diff line number Diff line
@@ -244,18 +244,6 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        GLRoot root = getGLRoot();
        root.lockRenderThread();
        try {
            getStateManager().destroy();
        } finally {
            root.unlockRenderThread();
        }
    }

    @Override
    protected void onResume() {
        Utils.assertTrue(getStateManager().getStateCount() > 0);
+10 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;

import java.lang.ref.WeakReference;
import java.util.WeakHashMap;

/**
@@ -47,25 +48,29 @@ public class SpinnerVisibilitySetter {
            new WeakHashMap<Activity, SpinnerVisibilitySetter>();

    private long mSpinnerVisibilityStartTime = -1;
    private Activity mActivity;
    private WeakReference<Activity> mActivityRef;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Activity activity = mActivityRef.get();

            switch(msg.what) {
                case MSG_SHOW_SPINNER:
                    removeMessages(MSG_SHOW_SPINNER);
                    if (activity == null) break;
                    if (mSpinnerVisibilityStartTime >= 0) break;
                    mSpinnerVisibilityStartTime = SystemClock.elapsedRealtime();
                    mActivity.setProgressBarIndeterminateVisibility(true);
                    activity.setProgressBarIndeterminateVisibility(true);
                    break;
                case MSG_HIDE_SPINNER:
                    removeMessages(MSG_HIDE_SPINNER);
                    if (activity == null) break;
                    if (mSpinnerVisibilityStartTime < 0) break;
                    long t = SystemClock.elapsedRealtime() - mSpinnerVisibilityStartTime;
                    if (t >= MIN_SPINNER_DISPLAY_TIME) {
                        mSpinnerVisibilityStartTime = -1;
                        mActivity.setProgressBarIndeterminateVisibility(false);
                        activity.setProgressBarIndeterminateVisibility(false);
                    } else {
                        sendEmptyMessageDelayed(MSG_HIDE_SPINNER, MIN_SPINNER_DISPLAY_TIME - t);
                    }
@@ -91,7 +96,8 @@ public class SpinnerVisibilitySetter {
    }

    private SpinnerVisibilitySetter(Activity activity) {
        mActivity = activity;
        // Activity are keys. Value objects should not strongly refer to keys.
        mActivityRef = new WeakReference<Activity>(activity);
    }

    public void setSpinnerVisibility(boolean visible) {