Index: chrome/android/java/src/org/chromium/chrome/browser/media/remote/ChromeMediaRouteDialogFactory.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/ChromeMediaRouteDialogFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/ChromeMediaRouteDialogFactory.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8ed805d7ca60d85125644761ed638aa91b2c4c4a |
--- /dev/null |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/ChromeMediaRouteDialogFactory.java |
@@ -0,0 +1,96 @@ |
+// 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.annotation.TargetApi; |
+import android.app.Activity; |
+import android.app.Dialog; |
+import android.content.Context; |
+import android.os.Build; |
+import android.os.Bundle; |
+import android.support.v7.app.MediaRouteChooserDialog; |
+import android.support.v7.app.MediaRouteChooserDialogFragment; |
+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 ChromeMediaRouteDialogFactory extends MediaRouteDialogFactory { |
+ |
+ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) |
+ private static class SystemVisibilitySaver { |
+ private int mSystemVisibility; |
+ private boolean mRestoreSystemVisibility; |
+ |
+ void saveSystemVisibility(Activity activity) { |
+ // The Android APIs don't exist on old versions. |
+ // TODO(aberent) this can go once the minSdkVersion has been updated in the manifests. |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) return; |
+ // 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); |
+ } |
+ } |
+ } |
+ } |
+ |
+ @Override |
+ public MediaRouteControllerDialogFragment onCreateControllerDialogFragment() { |
+ return new MediaRouteControllerDialogFragment() { |
+ final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); |
+ |
+ @Override |
+ public Dialog onCreateDialog(Bundle saved) { |
+ mVisibilitySaver.saveSystemVisibility(getActivity()); |
+ return new MediaRouteControllerDialog(getActivity()); |
+ } |
+ |
+ @Override |
+ public void onStop() { |
+ super.onStop(); |
+ mVisibilitySaver.restoreSystemVisibility(getActivity()); |
+ } |
+ }; |
+ } |
+ |
+ @Override |
+ public MediaRouteChooserDialogFragment onCreateChooserDialogFragment() { |
+ return new MediaRouteChooserDialogFragment() { |
+ final SystemVisibilitySaver mVisibilitySaver = new SystemVisibilitySaver(); |
+ |
+ @Override |
+ public MediaRouteChooserDialog onCreateChooserDialog( |
+ Context context, Bundle savedInstanceState) { |
+ mVisibilitySaver.saveSystemVisibility(getActivity()); |
+ return new MediaRouteChooserDialog(context); |
+ } |
+ |
+ @Override |
+ public void onStop() { |
+ super.onStop(); |
+ mVisibilitySaver.restoreSystemVisibility(getActivity()); |
+ } |
+ }; |
+ } |
+} |