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 |