PhotoViewController.java revision 1b641422773c48c8fe4f3b6bc6570f7e098124f2
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();
151b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian        public boolean isEnterAnimationFinished();
165f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public View getRootView();
175f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public void setNotFullscreenCallbackDoNotUseThisFunction();
185f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
195f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
205f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    private final PhotoViewControllerCallbacks mCallback;
215f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
225f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public PhotoViewController(PhotoViewControllerCallbacks callback) {
235f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        mCallback = callback;
245f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
255f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
265f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public void setImmersiveMode(boolean enabled) {
275f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        int flags = 0;
285f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        final int version = Build.VERSION.SDK_INT;
295f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        final boolean manuallyUpdateActionBar = version < Build.VERSION_CODES.JELLY_BEAN ||
301b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian                (version < Build.VERSION_CODES.KITKAT && mCallback.isScaleAnimationEnabled());
311b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian        if (enabled &&
321b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian                (!mCallback.isScaleAnimationEnabled() || mCallback.isEnterAnimationFinished())) {
331b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            // Turning on immersive mode causes an animation. If the scale animation is enabled and
341b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            // the enter animation isn't yet complete, then an immersive mode animation should not
351b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            // occur, since two concurrent animations are very janky.
361b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian
371b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            if (version >= Build.VERSION_CODES.KITKAT) {
385f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
395f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
405f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
415f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
425f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_FULLSCREEN
435f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_IMMERSIVE;
445f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.JELLY_BEAN) {
455f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LOW_PROFILE
465f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
475f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
485f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                if (!mCallback.isScaleAnimationEnabled()) {
495f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // If we are using the scale animation for intro and exit,
505f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // we can't go into fullscreen mode. The issue is that the
515f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // activity that invoked this will not be in fullscreen, so
525f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // as we transition out, the background activity will be
535f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // temporarily rendered without an actionbar, and the shrinking
545f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // photo will not line up properly. After that it redraws
555f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // in the correct location, but it still looks janks.
565f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // FLAG: there may be a better way to fix this, but I don't
575f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    // yet know what it is.
585f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                    flags |= View.SYSTEM_UI_FLAG_FULLSCREEN;
595f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                }
605f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
615f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
625f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.HONEYCOMB) {
635f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.STATUS_BAR_HIDDEN;
645f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
655f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
665f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (manuallyUpdateActionBar) {
675f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                mCallback.hideActionBar();
685f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
695f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        } else {
705f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (version >= Build.VERSION_CODES.KITKAT) {
715f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
725f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
735f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;;
745f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.JELLY_BEAN) {
755f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
765f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
775f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
785f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_VISIBLE;
795f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.HONEYCOMB) {
805f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.STATUS_BAR_VISIBLE;
815f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
825f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
835f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (manuallyUpdateActionBar) {
845f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                mCallback.showActionBar();
855f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
865f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
875f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
885f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        if (version >= Build.VERSION_CODES.HONEYCOMB) {
895f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mLastFlags = flags;
905f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mCallback.getRootView().setSystemUiVisibility(flags);
915f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
925f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
935f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
945f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    @Override
955f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public void onSystemUiVisibilityChange(int visibility) {
965f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
975f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                visibility == 0 && mLastFlags == 3846) {
985f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mCallback.setNotFullscreenCallbackDoNotUseThisFunction();
995f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
1005f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
1015f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein}
102