• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.gallery3d.app;
18 
19 import android.app.ActionBar;
20 import android.app.Activity;
21 import android.content.BroadcastReceiver;
22 import android.content.ContentResolver;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.content.IntentFilter;
26 import android.content.res.Configuration;
27 import android.os.BatteryManager;
28 import android.os.Bundle;
29 import android.provider.Settings;
30 import android.provider.Settings.SettingNotFoundException;
31 import android.view.Menu;
32 import android.view.MenuInflater;
33 import android.view.MenuItem;
34 import android.view.Window;
35 import android.view.WindowManager;
36 
37 import com.android.gallery3d.R;
38 import com.android.gallery3d.anim.StateTransitionAnimation;
39 import com.android.gallery3d.ui.GLView;
40 import com.android.gallery3d.ui.PreparePageFadeoutTexture;
41 import com.android.gallery3d.ui.RawTexture;
42 import com.android.gallery3d.util.GalleryUtils;
43 
44 abstract public class ActivityState {
45     protected static final int FLAG_HIDE_ACTION_BAR = 1;
46     protected static final int FLAG_HIDE_STATUS_BAR = 2;
47     protected static final int FLAG_SCREEN_ON_WHEN_PLUGGED = 4;
48     protected static final int FLAG_SCREEN_ON_ALWAYS = 8;
49     protected static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 16;
50     protected static final int FLAG_SHOW_WHEN_LOCKED = 32;
51 
52     protected AbstractGalleryActivity mActivity;
53     protected Bundle mData;
54     protected int mFlags;
55 
56     protected ResultEntry mReceivedResults;
57     protected ResultEntry mResult;
58 
59     protected static class ResultEntry {
60         public int requestCode;
61         public int resultCode = Activity.RESULT_CANCELED;
62         public Intent resultData;
63     }
64 
65     protected boolean mHapticsEnabled;
66     private ContentResolver mContentResolver;
67 
68     private boolean mDestroyed = false;
69     private boolean mPlugged = false;
70     boolean mIsFinishing = false;
71 
72     private static final String KEY_TRANSITION_IN = "transition-in";
73 
74     private StateTransitionAnimation.Transition mNextTransition =
75             StateTransitionAnimation.Transition.None;
76     private StateTransitionAnimation mIntroAnimation;
77     private GLView mContentPane;
78 
ActivityState()79     protected ActivityState() {
80     }
81 
setContentPane(GLView content)82     protected void setContentPane(GLView content) {
83         mContentPane = content;
84         if (mIntroAnimation != null) {
85             mContentPane.setIntroAnimation(mIntroAnimation);
86             mIntroAnimation = null;
87         }
88         mContentPane.setBackgroundColor(getBackgroundColor());
89         mActivity.getGLRoot().setContentPane(mContentPane);
90     }
91 
initialize(AbstractGalleryActivity activity, Bundle data)92     void initialize(AbstractGalleryActivity activity, Bundle data) {
93         mActivity = activity;
94         mData = data;
95         mContentResolver = activity.getAndroidContext().getContentResolver();
96     }
97 
getData()98     public Bundle getData() {
99         return mData;
100     }
101 
onBackPressed()102     protected void onBackPressed() {
103         mActivity.getStateManager().finishState(this);
104     }
105 
setStateResult(int resultCode, Intent data)106     protected void setStateResult(int resultCode, Intent data) {
107         if (mResult == null) return;
108         mResult.resultCode = resultCode;
109         mResult.resultData = data;
110     }
111 
onConfigurationChanged(Configuration config)112     protected void onConfigurationChanged(Configuration config) {
113     }
114 
onSaveState(Bundle outState)115     protected void onSaveState(Bundle outState) {
116     }
117 
onStateResult(int requestCode, int resultCode, Intent data)118     protected void onStateResult(int requestCode, int resultCode, Intent data) {
119     }
120 
121     protected float[] mBackgroundColor;
122 
getBackgroundColorId()123     protected int getBackgroundColorId() {
124         return R.color.default_background;
125     }
126 
getBackgroundColor()127     protected float[] getBackgroundColor() {
128         return mBackgroundColor;
129     }
130 
onCreate(Bundle data, Bundle storedState)131     protected void onCreate(Bundle data, Bundle storedState) {
132         mBackgroundColor = GalleryUtils.intColorToFloatARGBArray(
133                 mActivity.getResources().getColor(getBackgroundColorId()));
134     }
135 
clearStateResult()136     protected void clearStateResult() {
137     }
138 
139     BroadcastReceiver mPowerIntentReceiver = new BroadcastReceiver() {
140         @Override
141         public void onReceive(Context context, Intent intent) {
142             final String action = intent.getAction();
143             if (Intent.ACTION_BATTERY_CHANGED.equals(action)) {
144                 boolean plugged = (0 != intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0));
145 
146                 if (plugged != mPlugged) {
147                     mPlugged = plugged;
148                     setScreenFlags();
149                 }
150             }
151         }
152     };
153 
setScreenFlags()154     private void setScreenFlags() {
155         final Window win = mActivity.getWindow();
156         final WindowManager.LayoutParams params = win.getAttributes();
157         if ((0 != (mFlags & FLAG_SCREEN_ON_ALWAYS)) ||
158                 (mPlugged && 0 != (mFlags & FLAG_SCREEN_ON_WHEN_PLUGGED))) {
159             params.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
160         } else {
161             params.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
162         }
163         if (0 != (mFlags & FLAG_ALLOW_LOCK_WHILE_SCREEN_ON)) {
164             params.flags |= WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
165         } else {
166             params.flags &= ~WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON;
167         }
168         if (0 != (mFlags & FLAG_SHOW_WHEN_LOCKED)) {
169             params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
170         } else {
171             params.flags &= ~WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
172         }
173         win.setAttributes(params);
174     }
175 
transitionOnNextPause(Class<? extends ActivityState> outgoing, Class<? extends ActivityState> incoming, StateTransitionAnimation.Transition hint)176     protected void transitionOnNextPause(Class<? extends ActivityState> outgoing,
177             Class<? extends ActivityState> incoming, StateTransitionAnimation.Transition hint) {
178         if (outgoing == PhotoPage.class && incoming == AlbumPage.class) {
179             mNextTransition = StateTransitionAnimation.Transition.Outgoing;
180         } else if (outgoing == AlbumPage.class && incoming == PhotoPage.class) {
181             mNextTransition = StateTransitionAnimation.Transition.PhotoIncoming;
182         } else {
183             mNextTransition = hint;
184         }
185     }
186 
onPause()187     protected void onPause() {
188         if (0 != (mFlags & FLAG_SCREEN_ON_WHEN_PLUGGED)) {
189             ((Activity) mActivity).unregisterReceiver(mPowerIntentReceiver);
190         }
191         if (mNextTransition != StateTransitionAnimation.Transition.None) {
192             mActivity.getTransitionStore().put(KEY_TRANSITION_IN, mNextTransition);
193             PreparePageFadeoutTexture.prepareFadeOutTexture(mActivity, mContentPane);
194             mNextTransition = StateTransitionAnimation.Transition.None;
195         }
196     }
197 
198     // should only be called by StateManager
resume()199     void resume() {
200         AbstractGalleryActivity activity = mActivity;
201         ActionBar actionBar = activity.getActionBar();
202         if (actionBar != null) {
203             if ((mFlags & FLAG_HIDE_ACTION_BAR) != 0) {
204                 actionBar.hide();
205             } else {
206                 actionBar.show();
207             }
208             int stateCount = mActivity.getStateManager().getStateCount();
209             mActivity.getGalleryActionBar().setDisplayOptions(stateCount > 1, true);
210             // Default behavior, this can be overridden in ActivityState's onResume.
211             actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
212         }
213 
214         activity.invalidateOptionsMenu();
215 
216         setScreenFlags();
217 
218         boolean lightsOut = ((mFlags & FLAG_HIDE_STATUS_BAR) != 0);
219         mActivity.getGLRoot().setLightsOutMode(lightsOut);
220 
221         ResultEntry entry = mReceivedResults;
222         if (entry != null) {
223             mReceivedResults = null;
224             onStateResult(entry.requestCode, entry.resultCode, entry.resultData);
225         }
226 
227         if (0 != (mFlags & FLAG_SCREEN_ON_WHEN_PLUGGED)) {
228             // we need to know whether the device is plugged in to do this correctly
229             final IntentFilter filter = new IntentFilter();
230             filter.addAction(Intent.ACTION_BATTERY_CHANGED);
231             activity.registerReceiver(mPowerIntentReceiver, filter);
232         }
233 
234         try {
235             mHapticsEnabled = Settings.System.getInt(mContentResolver,
236                     Settings.System.HAPTIC_FEEDBACK_ENABLED) != 0;
237         } catch (SettingNotFoundException e) {
238             mHapticsEnabled = false;
239         }
240 
241         onResume();
242 
243         // the transition store should be cleared after resume;
244         mActivity.getTransitionStore().clear();
245     }
246 
247     // a subclass of ActivityState should override the method to resume itself
onResume()248     protected void onResume() {
249         RawTexture fade = mActivity.getTransitionStore().get(
250                 PreparePageFadeoutTexture.KEY_FADE_TEXTURE);
251         mNextTransition = mActivity.getTransitionStore().get(
252                 KEY_TRANSITION_IN, StateTransitionAnimation.Transition.None);
253         if (mNextTransition != StateTransitionAnimation.Transition.None) {
254             mIntroAnimation = new StateTransitionAnimation(mNextTransition, fade);
255             mNextTransition = StateTransitionAnimation.Transition.None;
256         }
257     }
258 
onCreateActionBar(Menu menu)259     protected boolean onCreateActionBar(Menu menu) {
260         // TODO: we should return false if there is no menu to show
261         //       this is a workaround for a bug in system
262         return true;
263     }
264 
onItemSelected(MenuItem item)265     protected boolean onItemSelected(MenuItem item) {
266         return false;
267     }
268 
onDestroy()269     protected void onDestroy() {
270         mDestroyed = true;
271     }
272 
isDestroyed()273     boolean isDestroyed() {
274         return mDestroyed;
275     }
276 
isFinishing()277     public boolean isFinishing() {
278         return mIsFinishing;
279     }
280 
getSupportMenuInflater()281     protected MenuInflater getSupportMenuInflater() {
282         return mActivity.getMenuInflater();
283     }
284 }
285