PhotoViewController.java revision 5f0775af25a40843a2c68d67d694945d88514555
15f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinpackage com.android.ex.photo;
25f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
35f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinimport android.os.Build;
45f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinimport android.util.Log;
55f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinimport android.view.View;
65f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
75f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinpublic class PhotoViewController implements View.OnSystemUiVisibilityChangeListener {
85f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
95f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    private int mLastFlags;
105f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
115f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public interface PhotoViewControllerCallbacks {
125f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public void showActionBar();
135f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public void hideActionBar();
145f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public boolean isScaleAnimationEnabled();
155f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public View getRootView();
165f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public void setNotFullscreenCallbackDoNotUseThisFunction();
175f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
185f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
195f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    private final PhotoViewControllerCallbacks mCallback;
205f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
215f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public PhotoViewController(PhotoViewControllerCallbacks callback) {
225f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        mCallback = callback;
235f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
245f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
255f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public void setImmersiveMode(boolean enabled) {
265f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        int flags = 0;
275f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        final int version = Build.VERSION.SDK_INT;
285f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        final boolean manuallyUpdateActionBar = version < Build.VERSION_CODES.JELLY_BEAN ||
295f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                mCallback.isScaleAnimationEnabled();
305f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        if (enabled) {
315f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (version >= Build.VERSION_CODES.KITKAT && !mCallback.isScaleAnimationEnabled()) {
325f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
335f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
345f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
355f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
365f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_FULLSCREEN
375f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_IMMERSIVE;
385f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.JELLY_BEAN) {
395f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LOW_PROFILE
405f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
415f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
425f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                if (!mCallback.isScaleAnimationEnabled()) {
435f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // If we are using the scale animation for intro and exit,
445f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // we can't go into fullscreen mode. The issue is that the
455f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // activity that invoked this will not be in fullscreen, so
465f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // as we transition out, the background activity will be
475f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // temporarily rendered without an actionbar, and the shrinking
485f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // photo will not line up properly. After that it redraws
495f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // in the correct location, but it still looks janks.
505f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // FLAG: there may be a better way to fix this, but I don't
515f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // yet know what it is.
525f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    flags |= View.SYSTEM_UI_FLAG_FULLSCREEN;
535f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                }
545f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
555f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
565f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.HONEYCOMB) {
575f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.STATUS_BAR_HIDDEN;
585f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
595f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
605f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (manuallyUpdateActionBar) {
615f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                mCallback.hideActionBar();
625f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
635f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        } else {
645f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (version >= Build.VERSION_CODES.KITKAT) {
655f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
665f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
675f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;;
685f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.JELLY_BEAN) {
695f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
705f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
715f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
725f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_VISIBLE;
735f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.HONEYCOMB) {
745f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.STATUS_BAR_VISIBLE;
755f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
765f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
775f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (manuallyUpdateActionBar) {
785f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                mCallback.showActionBar();
795f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
805f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
815f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
825f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        if (version >= Build.VERSION_CODES.HONEYCOMB) {
835f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mLastFlags = flags;
845f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mCallback.getRootView().setSystemUiVisibility(flags);
855f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
865f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
875f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
885f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    @Override
895f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public void onSystemUiVisibilityChange(int visibility) {
905f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
915f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                visibility == 0 && mLastFlags == 3846) {
925f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mCallback.setNotFullscreenCallbackDoNotUseThisFunction();
935f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
945f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
955f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein}
96