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