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