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; 202abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.app.Activity; 21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.app.AlertDialog; 22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.BroadcastReceiver; 23a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescuimport android.content.ComponentName; 24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Context; 25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface; 26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface.OnCancelListener; 27f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.DialogInterface.OnClickListener; 28f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.Intent; 29f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.IntentFilter; 30a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescuimport android.content.ServiceConnection; 318e565703e8d482421714383a8ad40a67929ce2daOwen Linimport android.content.res.Configuration; 32513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroardimport android.net.Uri; 33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.os.Bundle; 34a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescuimport android.os.IBinder; 35391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganovimport android.support.v4.print.PrintHelper; 362abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.Menu; 372abaaf7caa9a83ba1ea759868aabde7f21387184John Reckimport android.view.MenuItem; 384d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Tingimport android.view.Window; 394d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Tingimport android.view.WindowManager; 40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 414bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.R; 42b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Linimport com.android.gallery3d.common.ApiHelper; 434bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.data.DataManager; 44d8fb81f601830385a2343d08ad5dd171e4c7bfe0Owen Linimport com.android.gallery3d.data.MediaItem; 45513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroardimport com.android.gallery3d.filtershow.cache.ImageLoader; 464bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.ui.GLRoot; 474bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Linimport com.android.gallery3d.ui.GLRootView; 48d1763a30cb0191e926467dc529e252b545ec9a9fGeorge Mountimport com.android.gallery3d.util.PanoramaViewHelper; 49a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescuimport com.android.gallery3d.util.ThreadPool; 50ca6f04e27bbcab953bd3f9dcf50476a1c4b70aacBobby Georgescuimport com.android.photos.data.GalleryBitmapPool; 514bb5912e85f6d1bd8a6b78d6d52b4c4da7aeb740Owen Lin 52391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganovimport java.io.FileNotFoundException; 53391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov 542abaaf7caa9a83ba1ea759868aabde7f21387184John Reckpublic class AbstractGalleryActivity extends Activity implements GalleryContext { 55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private static final String TAG = "AbstractGalleryActivity"; 56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private GLRootView mGLRootView; 57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private StateManager mStateManager; 588cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen private GalleryActionBar mActionBar; 59bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang private OrientationManager mOrientationManager; 60616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin private TransitionStore mTransitionStore = new TransitionStore(); 61b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li private boolean mDisableToggleStatusBar; 62e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling private PanoramaViewHelper mPanoramaViewHelper; 63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private AlertDialog mAlertDialog = null; 65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private BroadcastReceiver mMountReceiver = new BroadcastReceiver() { 66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 67f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onReceive(Context context, Intent intent) { 68f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (getExternalCacheDir() != null) onStorageReady(); 69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin private IntentFilter mMountFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); 72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 744d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting protected void onCreate(Bundle savedInstanceState) { 754d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting super.onCreate(savedInstanceState); 76bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager = new OrientationManager(this); 774d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting toggleStatusBarByOrientation(); 787896b2ce915cbd180682e94e2fe3d246ff760763Owen Lin getWindow().setBackgroundDrawable(null); 79e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling mPanoramaViewHelper = new PanoramaViewHelper(this); 80e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling mPanoramaViewHelper.onCreate(); 81a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu doBindBatchService(); 824d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting } 834d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting 844d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting @Override 85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onSaveInstanceState(Bundle outState) { 86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onSaveInstanceState(outState); 89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().saveState(outState); 90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 958e565703e8d482421714383a8ad40a67929ce2daOwen Lin @Override 968e565703e8d482421714383a8ad40a67929ce2daOwen Lin public void onConfigurationChanged(Configuration config) { 978e565703e8d482421714383a8ad40a67929ce2daOwen Lin super.onConfigurationChanged(config); 988e565703e8d482421714383a8ad40a67929ce2daOwen Lin mStateManager.onConfigurationChange(config); 995d4b8fd9fd2e601b780c027ef912c8fabfe3ee1eBobby Georgescu getGalleryActionBar().onConfigurationChanged(); 100108667b88ed4046556e967fcb9541fa9efd7c606Ray Chen invalidateOptionsMenu(); 1014d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting toggleStatusBarByOrientation(); 1028e565703e8d482421714383a8ad40a67929ce2daOwen Lin } 1038e565703e8d482421714383a8ad40a67929ce2daOwen Lin 104b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin @Override 105b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin public boolean onCreateOptionsMenu(Menu menu) { 106b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin super.onCreateOptionsMenu(menu); 107b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin return getStateManager().createOptionsMenu(menu); 108b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin } 109b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin 110b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin @Override 111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public Context getAndroidContext() { 112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return this; 113f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 114f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 115b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin @Override 116f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public DataManager getDataManager() { 117f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return ((GalleryApp) getApplication()).getDataManager(); 118f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 119f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 120b1eb01cd02d1e75e6b9c3e593f6ff34335e2ca8aOwen Lin @Override 121f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public ThreadPool getThreadPool() { 122f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return ((GalleryApp) getApplication()).getThreadPool(); 123f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 124f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 125f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public synchronized StateManager getStateManager() { 126f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mStateManager == null) { 127f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mStateManager = new StateManager(this); 128f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mStateManager; 130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public GLRoot getGLRoot() { 133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin return mGLRootView; 134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 136bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang public OrientationManager getOrientationManager() { 137bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang return mOrientationManager; 138bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang } 139bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang 140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void setContentView(int resId) { 142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.setContentView(resId); 143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView = (GLRootView) findViewById(R.id.gl_root_view); 144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStorageReady() { 147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mAlertDialog != null) { 148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog.dismiss(); 149f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog = null; 150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin unregisterReceiver(mMountReceiver); 151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 155f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStart() { 156f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onStart(); 157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (getExternalCacheDir() == null) { 158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin OnCancelListener onCancel = new OnCancelListener() { 159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onCancel(DialogInterface dialog) { 161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin finish(); 162f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 163f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 164f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin OnClickListener onClick = new OnClickListener() { 165f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public void onClick(DialogInterface dialog, int which) { 167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin dialog.cancel(); 168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin }; 170840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang AlertDialog.Builder builder = new AlertDialog.Builder(this) 171fd3071dfc28b4caad583c77d7a4d9dad8fb86a3aOwen Lin .setTitle(R.string.no_external_storage_title) 172fd3071dfc28b4caad583c77d7a4d9dad8fb86a3aOwen Lin .setMessage(R.string.no_external_storage) 173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin .setNegativeButton(android.R.string.cancel, onClick) 174840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang .setOnCancelListener(onCancel); 175840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang if (ApiHelper.HAS_SET_ICON_ATTRIBUTE) { 176840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang setAlertDialogIconAttribute(builder); 177840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang } else { 178840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang builder.setIcon(android.R.drawable.ic_dialog_alert); 179840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang } 180840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang mAlertDialog = builder.show(); 181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin registerReceiver(mMountReceiver, mMountFilter); 182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 183e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling mPanoramaViewHelper.onStart(); 184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 185f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 186840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang @TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB) 187840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang private static void setAlertDialogIconAttribute( 188840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang AlertDialog.Builder builder) { 189840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang builder.setIconAttribute(android.R.attr.alertDialogIcon); 190840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang } 191840ae396bac4ff8ff34e88c8d2a1773cb112a4b6Chih-Chung Chang 192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onStop() { 194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onStop(); 195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin if (mAlertDialog != null) { 196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin unregisterReceiver(mMountReceiver); 197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog.dismiss(); 198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mAlertDialog = null; 199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 200e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling mPanoramaViewHelper.onStop(); 201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onResume() { 205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onResume(); 206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().resume(); 209f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getDataManager().resume(); 210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.onResume(); 214bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.resume(); 215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onPause() { 219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin super.onPause(); 220bd141b5a51c96f6fcaddfa547f0928ce69cf0755Chih-Chung Chang mOrientationManager.pause(); 221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.onPause(); 222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().pause(); 225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getDataManager().pause(); 226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 227f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 228f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 229f52ceba89962829aa12f5caba131580e8da85880Bobby Georgescu GalleryBitmapPool.getInstance().clear(); 230cafd30f96355ad446943d60cd2595d08423944e2Owen Lin MediaItem.getBytesBufferPool().clear(); 231f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 232f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 233f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 2343957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li protected void onDestroy() { 2353957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li super.onDestroy(); 2363957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li mGLRootView.lockRenderThread(); 2373957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li try { 2383957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li getStateManager().destroy(); 2393957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li } finally { 2403957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li mGLRootView.unlockRenderThread(); 2413957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li } 242a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu doUnbindBatchService(); 2433957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li } 2443957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li 2453957efd020f2e80d79cd3fed019f2883668a1c9eWu-cheng Li @Override 246f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin protected void onActivityResult(int requestCode, int resultCode, Intent data) { 247f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.lockRenderThread(); 248f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin try { 249f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin getStateManager().notifyActivityResult( 250f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin requestCode, resultCode, data); 251f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } finally { 252f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin mGLRootView.unlockRenderThread(); 253f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 254f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 255f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin 256f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin @Override 2572c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang public void onBackPressed() { 2582c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang // send the back event to the top sub-state 2592c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang GLRoot root = getGLRoot(); 2602c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang root.lockRenderThread(); 2612c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang try { 2622c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang getStateManager().onBackPressed(); 2632c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } finally { 2642c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang root.unlockRenderThread(); 2652c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 2662c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang } 2672c6173822a612597c79be41b126367ddfbb5d518Chih-Chung Chang 268f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin public GalleryActionBar getGalleryActionBar() { 2698cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen if (mActionBar == null) { 2708cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen mActionBar = new GalleryActionBar(this); 2718cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen } 2728cab3e872dd95e55ba34fdb94269a0c5069e72aeRay Chen return mActionBar; 273f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin } 2744d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting 275655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen @Override 276655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen public boolean onOptionsItemSelected(MenuItem item) { 277655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen GLRoot root = getGLRoot(); 278655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen root.lockRenderThread(); 279655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen try { 280655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen return getStateManager().itemSelected(item); 281655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen } finally { 282655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen root.unlockRenderThread(); 283655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen } 284655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen } 285655f63f04638dfe31045eab1b6b4c39cc2db10dbRay Chen 286b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li protected void disableToggleStatusBar() { 287b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li mDisableToggleStatusBar = true; 288b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li } 289b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li 2904d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting // Shows status bar in portrait view, hide in landscape view 2914d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting private void toggleStatusBarByOrientation() { 292b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li if (mDisableToggleStatusBar) return; 293b1db75c15ef546fef26ee7e34321f3087562a0f7Wu-cheng Li 294fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen Window win = getWindow(); 295fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 296fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen win.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 297fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen } else { 298fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 299fa011a292ea27fd6a885f980596e959ca83b9a4fRay Chen } 3004d50f7373a6205e197ffc1b73cdc5ffcbeb79fcaPin Ting } 301616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin 302616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin public TransitionStore getTransitionStore() { 303616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin return mTransitionStore; 304616a70fdb4473d2fbd7b70772a3a82b908aeae1eOwen Lin } 305e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling 306e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling public PanoramaViewHelper getPanoramaViewHelper() { 307e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling return mPanoramaViewHelper; 308e3b50f1bfcfa5c8729f31788eac1a6109a88988bSascha Haeberling } 309a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu 310a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu protected boolean isFullscreen() { 311a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu return (getWindow().getAttributes().flags 312a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0; 313a850a543225e9f7a72c5a49bb6099573c7efda13Bobby Georgescu } 314a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu 315a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu private BatchService mBatchService; 316a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu private boolean mBatchServiceIsBound = false; 317a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu private ServiceConnection mBatchServiceConnection = new ServiceConnection() { 318d1763a30cb0191e926467dc529e252b545ec9a9fGeorge Mount @Override 319a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu public void onServiceConnected(ComponentName className, IBinder service) { 320a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mBatchService = ((BatchService.LocalBinder)service).getService(); 321a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 322a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu 323d1763a30cb0191e926467dc529e252b545ec9a9fGeorge Mount @Override 324a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu public void onServiceDisconnected(ComponentName className) { 325a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mBatchService = null; 326a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 327a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu }; 328a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu 329a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu private void doBindBatchService() { 330a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu bindService(new Intent(this, BatchService.class), mBatchServiceConnection, Context.BIND_AUTO_CREATE); 331a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mBatchServiceIsBound = true; 332a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 333a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu 334a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu private void doUnbindBatchService() { 335a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu if (mBatchServiceIsBound) { 336a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu // Detach our existing connection. 337a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu unbindService(mBatchServiceConnection); 338a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu mBatchServiceIsBound = false; 339a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 340a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 341a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu 342a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu public ThreadPool getBatchServiceThreadPoolIfAvailable() { 343a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu if (mBatchServiceIsBound && mBatchService != null) { 344a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu return mBatchService.getThreadPool(); 345a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } else { 346d00f521a3138a8f244c91748b0277290edbf61f6Bobby Georgescu throw new RuntimeException("Batch service unavailable"); 347a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 348a2d0d34a90543ee19ea295e72c112fde18fb3828Bobby Georgescu } 349513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard 350513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard public void printSelectedImage(Uri uri) { 351513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard if (uri == null) { 352513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard return; 353513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard } 354513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard String path = ImageLoader.getLocalPathFromUri(this, uri); 355513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard if (path != null) { 356513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard Uri localUri = Uri.parse(path); 357513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard path = localUri.getLastPathSegment(); 358513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard } else { 359513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard path = uri.getLastPathSegment(); 360513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard } 361391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov PrintHelper printer = new PrintHelper(this); 362391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov try { 363391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov printer.printBitmap(path, uri); 364391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov } catch (FileNotFoundException fnfe) { 365391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov Log.e(TAG, "Error printing an image", fnfe); 366391e4a190d4afcfdf89b8e7892e972cc998cdf41Svetoslav Ganov } 367513eb24fe6b9376ce41bff0abc53d6d14daf8325nicolasroard } 368f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin} 369