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

Unified Diff: ui/android/display_android_manager.cc

Issue 2416403002: Reland of Android: support multiple displays on C++ side (Closed)
Patch Set: Rebased and fixed webkit_tests Created 4 years, 1 month 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
« no previous file with comments | « ui/android/display_android_manager.h ('k') | ui/android/dummy_screen_android.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/android/display_android_manager.cc
diff --git a/ui/android/display_android_manager.cc b/ui/android/display_android_manager.cc
new file mode 100644
index 0000000000000000000000000000000000000000..50e5552f3b98e3db54ffb058197d496c51b3e216
--- /dev/null
+++ b/ui/android/display_android_manager.cc
@@ -0,0 +1,120 @@
+// Copyright 2012 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.
+
+#include "ui/android/display_android_manager.h"
+
+#include <jni.h>
+#include <map>
+
+#include "base/android/jni_android.h"
+#include "base/stl_util.h"
+#include "jni/DisplayAndroidManager_jni.h"
+#include "ui/android/screen_android.h"
+#include "ui/android/window_android.h"
+#include "ui/display/display.h"
+
+namespace ui {
+
+using base::android::AttachCurrentThread;
+using display::Display;
+using display::DisplayList;
+
+void SetScreenAndroid() {
+ // Do not override existing Screen.
+ DCHECK_EQ(display::Screen::GetScreen(), nullptr);
+
+ DisplayAndroidManager* manager = new DisplayAndroidManager();
+ display::Screen::SetScreenInstance(manager);
+
+ JNIEnv* env = AttachCurrentThread();
+ Java_DisplayAndroidManager_onNativeSideCreated(env, (jlong)manager);
+}
+
+bool RegisterScreenAndroid(JNIEnv* env) {
+ return RegisterNativesImpl(env);
+}
+
+DisplayAndroidManager::DisplayAndroidManager() {}
+
+DisplayAndroidManager::~DisplayAndroidManager() {}
+
+// Screen interface.
+
+Display DisplayAndroidManager::GetDisplayNearestWindow(
+ gfx::NativeView view) const {
+ ui::WindowAndroid* window = view ? view->GetWindowAndroid() : nullptr;
+ if (window) {
+ DisplayList::Displays::const_iterator it =
+ display_list().FindDisplayById(window->display_id());
+ if (it != display_list().displays().end()) {
+ return *it;
+ }
+ }
+ return GetPrimaryDisplay();
+}
+
+// There is no notion of relative display positions on Android.
+Display DisplayAndroidManager::GetDisplayNearestPoint(
+ const gfx::Point& point) const {
+ NOTIMPLEMENTED();
+ return GetPrimaryDisplay();
+}
+
+// There is no notion of relative display positions on Android.
+Display DisplayAndroidManager::GetDisplayMatching(
+ const gfx::Rect& match_rect) const {
+ NOTIMPLEMENTED();
+ return GetPrimaryDisplay();
+}
+
+// Methods called from Java
+
+void DisplayAndroidManager::UpdateDisplay(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jobject,
+ jint sdkDisplayId,
+ jint physicalWidth,
+ jint physicalHeight,
+ jint width,
+ jint height,
+ jfloat dipScale,
+ jint rotationDegrees,
+ jint bitsPerPixel,
+ jint bitsPerComponent) {
+ gfx::Rect bounds_in_pixels = gfx::Rect(physicalWidth, physicalHeight);
+
+ // Physical width and height might be not supported.
+ if (bounds_in_pixels.IsEmpty())
+ bounds_in_pixels = gfx::Rect(width, height);
+
+ const gfx::Rect bounds_in_dip = gfx::Rect(
+ gfx::ScaleToCeiledSize(bounds_in_pixels.size(), 1.0f / dipScale));
+
+ display::Display display(sdkDisplayId, bounds_in_dip);
+ if (!Display::HasForceDeviceScaleFactor())
+ display.set_device_scale_factor(dipScale);
+
+ display.SetRotationAsDegree(rotationDegrees);
+ display.set_color_depth(bitsPerPixel);
+ display.set_depth_per_component(bitsPerComponent);
+ display.set_is_monochrome(bitsPerComponent == 0);
+
+ ProcessDisplayChanged(display, sdkDisplayId == primary_display_id_);
+}
+
+void DisplayAndroidManager::RemoveDisplay(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jobject,
+ jint sdkDisplayId) {
+ display_list().RemoveDisplay(sdkDisplayId);
+}
+
+void DisplayAndroidManager::SetPrimaryDisplayId(
+ JNIEnv* env,
+ const base::android::JavaParamRef<jobject>& jobject,
+ jint sdkDisplayId) {
+ primary_display_id_ = sdkDisplayId;
+}
+
+} // namespace ui
« no previous file with comments | « ui/android/display_android_manager.h ('k') | ui/android/dummy_screen_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698