AbstractGalleryActivity.java revision 4bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740
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 19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.Activity; 20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.AlertDialog; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.BroadcastReceiver; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context; 23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface.OnCancelListener; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface.OnClickListener; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Intent; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.IntentFilter; 288e565703e8d482421714383a8ad40a67929ce2daOwen Linimport android.content.res.Configuration; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.Bundle; 304d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Tingimport android.view.Window; 314d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Tingimport android.view.WindowManager; 32f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 334bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.R; 344bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.data.DataManager; 354bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.ui.BitmapPool; 364bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.ui.GLRoot; 374bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.ui.GLRootView; 384bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.util.ThreadPool; 394bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class AbstractGalleryActivity extends Activity implements GalleryActivity { 41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @SuppressWarnings("unused") 42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "AbstractGalleryActivity"; 43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GLRootView mGLRootView; 44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private StateManager mStateManager; 45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private AlertDialog mAlertDialog = null; 47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private BroadcastReceiver mMountReceiver = new BroadcastReceiver() { 48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onReceive(Context context, Intent intent) { 50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (getExternalCacheDir() != null) onStorageReady(); 51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 52f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 53f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private IntentFilter mMountFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); 54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 564d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting protected void onCreate(Bundle savedInstanceState) { 574d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting super.onCreate(savedInstanceState); 584d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting toggleStatusBarByOrientation(); 594d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting } 604d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting 614d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting @Override 62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onSaveInstanceState(Bundle outState) { 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onSaveInstanceState(outState); 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().saveState(outState); 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 728e565703e8d482421714383a8ad40a67929ce2daOwen Lin @Override 738e565703e8d482421714383a8ad40a67929ce2daOwen Lin public void onConfigurationChanged(Configuration config) { 748e565703e8d482421714383a8ad40a67929ce2daOwen Lin super.onConfigurationChanged(config); 758e565703e8d482421714383a8ad40a67929ce2daOwen Lin mStateManager.onConfigurationChange(config); 76108667b88ed4046556e967fcb9541fa9efd7c606Ray Chen invalidateOptionsMenu(); 774d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting toggleStatusBarByOrientation(); 788e565703e8d482421714383a8ad40a67929ce2daOwen Lin } 798e565703e8d482421714383a8ad40a67929ce2daOwen Lin 80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Context getAndroidContext() { 81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return this; 82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public DataManager getDataManager() { 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return ((GalleryApp) getApplication()).getDataManager(); 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ThreadPool getThreadPool() { 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return ((GalleryApp) getApplication()).getThreadPool(); 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public synchronized StateManager getStateManager() { 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mStateManager == null) { 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mStateManager = new StateManager(this); 95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mStateManager; 97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public GLRoot getGLRoot() { 100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mGLRootView; 101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setContentView(int resId) { 105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.setContentView(resId); 106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView = (GLRootView) findViewById(R.id.gl_root_view); 107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 108f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 109f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStorageReady() { 110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mAlertDialog != null) { 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog.dismiss(); 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog = null; 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin unregisterReceiver(mMountReceiver); 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 115f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStart() { 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onStart(); 120f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (getExternalCacheDir() == null) { 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin OnCancelListener onCancel = new OnCancelListener() { 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCancel(DialogInterface dialog) { 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin finish(); 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin OnClickListener onClick = new OnClickListener() { 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClick(DialogInterface dialog, int which) { 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin dialog.cancel(); 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog = new AlertDialog.Builder(this) 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setIcon(android.R.drawable.ic_dialog_alert) 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setTitle("No Storage") 136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setMessage("No external storage available.") 137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setNegativeButton(android.R.string.cancel, onClick) 138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setOnCancelListener(onCancel) 139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .show(); 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin registerReceiver(mMountReceiver, mMountFilter); 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStop() { 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onStop(); 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mAlertDialog != null) { 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin unregisterReceiver(mMountReceiver); 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog.dismiss(); 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog = null; 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().resume(); 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getDataManager().resume(); 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.onResume(); 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onPause() { 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.onPause(); 171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().pause(); 174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getDataManager().pause(); 175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1784bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin BitmapPool.clear(); 179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onActivityResult(int requestCode, int resultCode, Intent data) { 183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().notifyActivityResult( 186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestCode, resultCode, data); 187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public GalleryActionBar getGalleryActionBar() { 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return null; 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 1964d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting 1974d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting // Shows status bar in portrait view, hide in landscape view 1984d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting private void toggleStatusBarByOrientation() { 199fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen Window win = getWindow(); 200fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 201fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen win.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 202fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen } else { 203fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 204fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen } 2054d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting } 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 207