PhotoViewController.java revision f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41e
15f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinpackage com.android.ex.photo;
25f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
35f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinimport android.os.Build;
45f0775af25a40843a2c68d67d694945d88514555Andrew Sappersteinimport android.view.View;
55f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
6e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerianpublic class PhotoViewController {
75f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
85f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    private int mLastFlags;
95f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
105f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public interface PhotoViewControllerCallbacks {
115f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public void showActionBar();
125f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public void hideActionBar();
135f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public boolean isScaleAnimationEnabled();
141b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian        public boolean isEnterAnimationFinished();
155f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public View getRootView();
165f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        public void setNotFullscreenCallbackDoNotUseThisFunction();
175f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
185f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
195f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    private final PhotoViewControllerCallbacks mCallback;
205f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
21e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian    private final View.OnSystemUiVisibilityChangeListener mSystemUiVisibilityChangeListener;
22e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian
235f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public PhotoViewController(PhotoViewControllerCallbacks callback) {
245f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        mCallback = callback;
25e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian
26e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian        // View.OnSystemUiVisibilityChangeListener is an API that was introduced in API level 11.
27e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
28e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian            mSystemUiVisibilityChangeListener = null;
29e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian        } else {
30e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian            mSystemUiVisibilityChangeListener = new View.OnSystemUiVisibilityChangeListener() {
31e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian                @Override
32e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian                public void onSystemUiVisibilityChange(int visibility) {
33e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
34e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian                            visibility == 0 && mLastFlags == 3846) {
35e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian                        mCallback.setNotFullscreenCallbackDoNotUseThisFunction();
36e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian                    }
37e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian                }
38e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian            };
39e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian        }
405f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
415f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
425f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    public void setImmersiveMode(boolean enabled) {
435f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        int flags = 0;
445f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        final int version = Build.VERSION.SDK_INT;
45f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian        final boolean manuallyUpdateActionBar = version < Build.VERSION_CODES.JELLY_BEAN;
461b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian        if (enabled &&
471b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian                (!mCallback.isScaleAnimationEnabled() || mCallback.isEnterAnimationFinished())) {
481b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            // Turning on immersive mode causes an animation. If the scale animation is enabled and
491b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            // the enter animation isn't yet complete, then an immersive mode animation should not
501b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            // occur, since two concurrent animations are very janky.
511b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian
521b641422773c48c8fe4f3b6bc6570f7e098124f2Matt Keoshkerian            if (version >= Build.VERSION_CODES.KITKAT) {
535f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
545f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
555f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
565f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
575f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_FULLSCREEN
585f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_IMMERSIVE;
595f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.JELLY_BEAN) {
60f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                // Clients that use the scale animation should set the following system UI flags to
61f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                // prevent janky animations on exit when the status bar is hidden:
62f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                //     View.SYSTEM_UI_FLAG_VISIBLE | View.SYSTEM_UI_FLAG_STABLE
63f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                // As well, client should ensure `android:fitsSystemWindows` is set on the root
64f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                // content view.
655f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LOW_PROFILE
665f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
67f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
68f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                        | View.SYSTEM_UI_FLAG_FULLSCREEN;
695f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
705f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LOW_PROFILE;
715f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.HONEYCOMB) {
725f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.STATUS_BAR_HIDDEN;
735f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
745f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
755f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (manuallyUpdateActionBar) {
765f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                mCallback.hideActionBar();
775f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
785f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        } else {
795f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (version >= Build.VERSION_CODES.KITKAT) {
805f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
815f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
82f5a30690749a354cbbf8c8d9ad4fd5ed84e7d41eMatt Keoshkerian                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
835f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.JELLY_BEAN) {
845f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
855f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
865f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
875f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.SYSTEM_UI_FLAG_VISIBLE;
885f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            } else if (version >= Build.VERSION_CODES.HONEYCOMB) {
895f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                flags = View.STATUS_BAR_VISIBLE;
905f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
915f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
925f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            if (manuallyUpdateActionBar) {
935f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein                mCallback.showActionBar();
945f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            }
955f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
965f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
975f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        if (version >= Build.VERSION_CODES.HONEYCOMB) {
985f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mLastFlags = flags;
995f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein            mCallback.getRootView().setSystemUiVisibility(flags);
1005f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein        }
1015f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
1025f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein
103e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian    /**
104e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian     * Note: This should only be called when API level is 11 or above.
105e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian     */
106e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian    public View.OnSystemUiVisibilityChangeListener getSystemUiVisibilityChangeListener() {
107e9825b89f8d8a61c747c5dc8aeaac9004a07d755Matt Keoshkerian        return mSystemUiVisibilityChangeListener;
1085f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein    }
1095f0775af25a40843a2c68d67d694945d88514555Andrew Sapperstein}
110