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