// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.chrome.browser.media.remote; import android.app.Activity; import android.app.Dialog; import android.os.Bundle; import android.support.v7.app.MediaRouteControllerDialog; import android.support.v7.app.MediaRouteControllerDialogFragment; import android.support.v7.app.MediaRouteDialogFactory; import android.view.View; import android.widget.FrameLayout; /** * The Chrome implementation of the dialog factory so custom behavior can * be injected for the disconnect button. */ public class MediaRouteControllerDialogFactory extends MediaRouteDialogFactory { private static class SystemVisibilitySaver { private int mSystemVisibility; private boolean mRestoreSystemVisibility; void saveSystemVisibility(Activity activity) { // If we are in fullscreen we may have also have hidden the system UI. This // is overridden when we display the dialog. Save the system UI visibility // state so we can restore it. FrameLayout decor = (FrameLayout) activity.getWindow().getDecorView(); mSystemVisibility = decor.getSystemUiVisibility(); mRestoreSystemVisibility = ( (mSystemVisibility & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) != 0); } void restoreSystemVisibility(Activity activity) { if (mRestoreSystemVisibility) { FrameLayout decor = (FrameLayout) activity.getWindow().getDecorView(); // In some cases we come out of fullscreen before closing this dialog. In these // cases we don't want to restore the system UI visibility state. int systemVisibility = decor.getSystemUiVisibility(); if ((systemVisibility & View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN) != 0) { decor.setSystemUiVisibility(mSystemVisibility); } } } } /** * A dialog fragment for controlling a media route that saves system visibility for * handling fullscreen state of Chrome correctly. Needs to be a named public static class, * see https://crbug.com/618993. */ public static final class Fragment extends MediaRouteControllerDialogFragment { final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); public Fragment() {} @Override public Dialog onCreateDialog(Bundle saved) { mVisibilitySaver.saveSystemVisibility(getActivity()); return new MediaRouteControllerDialog(getActivity()); } @Override public void onStop() { super.onStop(); mVisibilitySaver.restoreSystemVisibility(getActivity()); } } @Override public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() { return new MediaRouteControllerDialogFragment(); } }