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