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