AbstractGalleryActivity.java revision b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8a
1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.app;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
19b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Linimport android.annotation.TargetApi;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.Activity;
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.AlertDialog;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.BroadcastReceiver;
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context;
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface;
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface.OnCancelListener;
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface.OnClickListener;
27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Intent;
28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.IntentFilter;
298e565703e8d482421714383a8ad40a67929ce2daOwen Linimport android.content.res.Configuration;
30f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.Bundle;
31b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Linimport android.view.Menu;
32655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chenimport android.view.MenuItem;
334d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Tingimport android.view.Window;
344d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Tingimport android.view.WindowManager;
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
364bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.R;
37b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Linimport com.android.gallery3d.common.ApiHelper;
38df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Linimport com.android.gallery3d.data.BitmapPool;
394bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.data.DataManager;
40d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Linimport com.android.gallery3d.data.MediaItem;
414bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.ui.GLRoot;
424bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.ui.GLRootView;
434bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.util.ThreadPool;
444bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AbstractGalleryActivity extends Activity implements GalleryActivity {
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @SuppressWarnings("unused")
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final String TAG = "AbstractGalleryActivity";
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private GLRootView mGLRootView;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private StateManager mStateManager;
508cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen    private GalleryActionBar mActionBar;
51bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    private OrientationManager mOrientationManager;
52616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    private TransitionStore mTransitionStore = new TransitionStore();
53b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li    private boolean mDisableToggleStatusBar;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private AlertDialog mAlertDialog = null;
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private BroadcastReceiver mMountReceiver = new BroadcastReceiver() {
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public void onReceive(Context context, Intent intent) {
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (getExternalCacheDir() != null) onStorageReady();
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private IntentFilter mMountFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
654d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting    protected void onCreate(Bundle savedInstanceState) {
664d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting        super.onCreate(savedInstanceState);
67bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager = new OrientationManager(this);
684d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting        toggleStatusBarByOrientation();
697896b2ce915cbd180682e94e2fe3d246ff760763Owen Lin        getWindow().setBackgroundDrawable(null);
704d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting    }
714d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting
724d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting    @Override
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onSaveInstanceState(Bundle outState) {
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGLRootView.lockRenderThread();
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            super.onSaveInstanceState(outState);
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getStateManager().saveState(outState);
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mGLRootView.unlockRenderThread();
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
838e565703e8d482421714383a8ad40a67929ce2daOwen Lin    @Override
848e565703e8d482421714383a8ad40a67929ce2daOwen Lin    public void onConfigurationChanged(Configuration config) {
858e565703e8d482421714383a8ad40a67929ce2daOwen Lin        super.onConfigurationChanged(config);
868e565703e8d482421714383a8ad40a67929ce2daOwen Lin        mStateManager.onConfigurationChange(config);
87108667b88ed4046556e967fcb9541fa9efd7c606Ray Chen        invalidateOptionsMenu();
884d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting        toggleStatusBarByOrientation();
898e565703e8d482421714383a8ad40a67929ce2daOwen Lin    }
908e565703e8d482421714383a8ad40a67929ce2daOwen Lin
91b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    private Menu mOptionsMenu;
92b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin
93b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
94b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    public boolean onCreateOptionsMenu(Menu menu) {
95b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        mOptionsMenu = menu;
96b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        super.onCreateOptionsMenu(menu);
97b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        return getStateManager().createOptionsMenu(menu);
98b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    }
99b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin
100b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
101b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB)
102b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    public void invalidateOptionsMenu() {
103b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        if (ApiHelper.HAS_ACTIVITY_INVALIDATE_OPTIONS_MENU) {
104b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            super.invalidateOptionsMenu();
105b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        } else if (mOptionsMenu != null) {
106b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            mOptionsMenu.clear();
107b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin            getStateManager().createOptionsMenu(mOptionsMenu);
108b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin        }
109b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    }
110b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin
111b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public Context getAndroidContext() {
113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return this;
114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
116b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public DataManager getDataManager() {
118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return ((GalleryApp) getApplication()).getDataManager();
119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
121b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public ThreadPool getThreadPool() {
123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return ((GalleryApp) getApplication()).getThreadPool();
124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
126b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public synchronized StateManager getStateManager() {
128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mStateManager == null) {
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mStateManager = new StateManager(this);
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mStateManager;
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
134b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public GLRoot getGLRoot() {
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return mGLRootView;
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
139b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin    @Override
140bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    public OrientationManager getOrientationManager() {
141bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        return mOrientationManager;
142bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang    }
143bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void setContentView(int resId) {
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.setContentView(resId);
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGLRootView = (GLRootView) findViewById(R.id.gl_root_view);
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStorageReady() {
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mAlertDialog != null) {
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlertDialog.dismiss();
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlertDialog = null;
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            unregisterReceiver(mMountReceiver);
155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStart() {
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onStart();
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (getExternalCacheDir() == null) {
162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            OnCancelListener onCancel = new OnCancelListener() {
163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onCancel(DialogInterface dialog) {
165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    finish();
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            };
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            OnClickListener onClick = new OnClickListener() {
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                @Override
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                public void onClick(DialogInterface dialog, int which) {
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    dialog.cancel();
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                }
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            };
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlertDialog = new AlertDialog.Builder(this)
17523b602e709f1551acdb7cf2caaf5b7838b567d15Björn Lundén                    .setIconAttribute(android.R.attr.alertDialogIcon)
176fd3071dfc28b4caad583c77d7a4d9dad8fb86a3aOwen Lin                    .setTitle(R.string.no_external_storage_title)
177fd3071dfc28b4caad583c77d7a4d9dad8fb86a3aOwen Lin                    .setMessage(R.string.no_external_storage)
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .setNegativeButton(android.R.string.cancel, onClick)
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .setOnCancelListener(onCancel)
180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    .show();
181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            registerReceiver(mMountReceiver, mMountFilter);
182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onStop() {
187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onStop();
188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (mAlertDialog != null) {
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            unregisterReceiver(mMountReceiver);
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlertDialog.dismiss();
191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mAlertDialog = null;
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onResume() {
197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onResume();
198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGLRootView.lockRenderThread();
199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getStateManager().resume();
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getDataManager().resume();
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mGLRootView.unlockRenderThread();
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGLRootView.onResume();
206bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.resume();
207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onPause() {
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super.onPause();
212bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang        mOrientationManager.pause();
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGLRootView.onPause();
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGLRootView.lockRenderThread();
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getStateManager().pause();
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getDataManager().pause();
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mGLRootView.unlockRenderThread();
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
221df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin        clearBitmapPool(MediaItem.getMicroThumbPool());
222df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin        clearBitmapPool(MediaItem.getThumbPool());
223df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin
224cafd30f96355ad446943d60cd2595d08423944e2Owen Lin        MediaItem.getBytesBufferPool().clear();
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
227df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin    private static void clearBitmapPool(BitmapPool pool) {
228df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin        if (pool != null) pool.clear();
229df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin    }
230df4763cf8752fb1babc7244fc2be33ed87d3b072Owen Lin
231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
2323957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li    protected void onDestroy() {
2333957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li        super.onDestroy();
2343957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li        mGLRootView.lockRenderThread();
2353957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li        try {
2363957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li            getStateManager().destroy();
2373957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li        } finally {
2383957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li            mGLRootView.unlockRenderThread();
2393957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li        }
2403957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li    }
2413957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li
2423957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li    @Override
243f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
244f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mGLRootView.lockRenderThread();
245f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            getStateManager().notifyActivityResult(
247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    requestCode, resultCode, data);
248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mGLRootView.unlockRenderThread();
250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
2542c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    public void onBackPressed() {
2552c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        // send the back event to the top sub-state
2562c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        GLRoot root = getGLRoot();
2572c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        root.lockRenderThread();
2582c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        try {
2592c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang            getStateManager().onBackPressed();
2602c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        } finally {
2612c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang            root.unlockRenderThread();
2622c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang        }
2632c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    }
2642c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang
2652c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang    @Override
266f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public GalleryActionBar getGalleryActionBar() {
2678cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        if (mActionBar == null) {
2688cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen            mActionBar = new GalleryActionBar(this);
2698cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        }
2708cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen        return mActionBar;
271f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
2724d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting
273655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen    @Override
274655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen    public boolean onOptionsItemSelected(MenuItem item) {
275655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen        GLRoot root = getGLRoot();
276655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen        root.lockRenderThread();
277655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen        try {
278655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen            return getStateManager().itemSelected(item);
279655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen        } finally {
280655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen            root.unlockRenderThread();
281655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen        }
282655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen    }
283655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen
284b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li    protected void disableToggleStatusBar() {
285b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li        mDisableToggleStatusBar = true;
286b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li    }
287b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li
2884d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting    // Shows status bar in portrait view, hide in landscape view
2894d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting    private void toggleStatusBarByOrientation() {
290b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li        if (mDisableToggleStatusBar) return;
291b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li
292fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen        Window win = getWindow();
293fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
294fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen            win.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
295fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen        } else {
296fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen            win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
297fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen        }
2984d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting    }
299616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin
300616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    @Override
301616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    public TransitionStore getTransitionStore() {
302616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin        return mTransitionStore;
303616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin    }
304f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
305