Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(703)

Unified Diff: chrome/android/java/src/org/chromium/chrome/browser/media/remote/OverlayDialog.java

Issue 928643003: Upstream Chrome for Android Cast. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/android/java/src/org/chromium/chrome/browser/media/remote/OverlayDialog.java
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/remote/OverlayDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/OverlayDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..fde79143acc1e8b7d4d4dc552d186887a7280d21
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/remote/OverlayDialog.java
@@ -0,0 +1,89 @@
+// Copyright 2013 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.graphics.drawable.ColorDrawable;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+
+/**
+ * In order to have a true overlay onto the full screen activity, we need to create a separate
+ * {@link android.view.Window}. By using normal view hierarchy of the activity, we cannot put
+ * the button on top of the video (if they intersect, as in landscape mode) because the video
+ * is shown with {@link android.view.SurfaceView}, and it is set to be on top. Since it is a
+ * special kind of view, it doesn't respect normal views' Z hierarchy.
+ *
+ * One way to create a new window is through creating a dialog. The more preferred ways of
+ * creating a dialog are {@link android.app.Activity#showDialog(int)} or {@link
+ * android.app.DialogFragment}. We don't use the former because it requires changes to upstream
+ * full screen activity code. The latter can be used, but requires quite more additional work.
+ *
+ * TODO(cimamoglu): Use {@link android.app.DialogFragment}.
+ * Relevant Android chatty discussion:
+ * https://groups.google.com/a/google.com/d/topic/android-chatty-eng/9JKrya_20m0/discussion
+ */
+public class OverlayDialog extends Dialog {
+ private View.OnTouchListener mOutsideTouchHandler;
+ private ViewGroup mRootView;
+
+ public OverlayDialog(Activity activity, View.OnTouchListener outsideTouchHandler) {
+ super(activity, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);
+ mOutsideTouchHandler = outsideTouchHandler;
+
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
+ Window dialogWindow = getWindow();
+ WindowManager.LayoutParams dialogLayoutParams = dialogWindow.getAttributes();
+ dialogLayoutParams.x = 0;
+ dialogLayoutParams.y = 0;
+ dialogLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
+ dialogLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
+ dialogLayoutParams.gravity = Gravity.TOP | Gravity.START;
+ dialogWindow.setAttributes(dialogLayoutParams);
+ dialogWindow.setBackgroundDrawable(
+ new ColorDrawable(android.graphics.Color.TRANSPARENT));
+
+ // We would like to intercept touch events of the dialog's content, but want to be
+ // able to pass down the ones that are outside.
+ dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
+
+ // This flag makes sure that soft key events are not handled by the dialog window.
+ dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
+
+ // We want to intercept ACTION_OUTSIDE events so we can pass them down to the relevant
+ // handler.
+ dialogWindow.addFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
+
+ // We don't want to cancel, we just want to hide/show.
+ setCancelable(false);
+ setCanceledOnTouchOutside(false);
+
+ // Create a container/root view for the dialog.
+ LinearLayout layout = new LinearLayout(activity);
+ WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ layout.setLayoutParams(layoutParams);
+ layout.setOrientation(LinearLayout.VERTICAL);
+ mRootView = layout;
+ setContentView(mRootView);
+ }
+
+ public ViewGroup getRootView() {
+ return mRootView;
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent event) {
+ if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
+ mOutsideTouchHandler.onTouch(null, event);
+ }
+ return super.dispatchTouchEvent(event);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698