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

Side by Side Diff: ui/android/java/src/org/chromium/ui/display/DisplayAndroidManager.java

Issue 2416403002: Reland of Android: support multiple displays on C++ side (Closed)
Patch Set: Ensure primary display. New jni scheme 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.ui.display; 5 package org.chromium.ui.display;
6 6
7 import android.annotation.SuppressLint; 7 import android.annotation.SuppressLint;
8 import android.content.ComponentCallbacks; 8 import android.content.ComponentCallbacks;
9 import android.content.Context; 9 import android.content.Context;
10 import android.content.res.Configuration; 10 import android.content.res.Configuration;
11 import android.hardware.display.DisplayManager; 11 import android.hardware.display.DisplayManager;
12 import android.hardware.display.DisplayManager.DisplayListener; 12 import android.hardware.display.DisplayManager.DisplayListener;
13 import android.os.Build; 13 import android.os.Build;
14 import android.util.SparseArray; 14 import android.util.SparseArray;
15 import android.view.Display; 15 import android.view.Display;
16 import android.view.WindowManager; 16 import android.view.WindowManager;
17 17
18 import org.chromium.base.ContextUtils; 18 import org.chromium.base.ContextUtils;
19 import org.chromium.base.ThreadUtils; 19 import org.chromium.base.ThreadUtils;
20 import org.chromium.base.annotations.JNINamespace;
20 import org.chromium.ui.gfx.DeviceDisplayInfo; 21 import org.chromium.ui.gfx.DeviceDisplayInfo;
21 22
22 /** 23 /**
23 * DisplayAndroidManager is a class that informs its observers Display changes. 24 * DisplayAndroidManager is a class that informs its observers Display changes.
24 */ 25 */
26 @JNINamespace("display")
25 /* package */ class DisplayAndroidManager { 27 /* package */ class DisplayAndroidManager {
26 /** 28 /**
27 * DisplayListenerBackend is an interface that abstract the mechanism used f or the actual 29 * DisplayListenerBackend is an interface that abstract the mechanism used f or the actual
28 * display update listening. The reason being that from Android API Level 17 DisplayListener 30 * display update listening. The reason being that from Android API Level 17 DisplayListener
29 * will be used. Before that, an unreliable solution based on onConfiguratio nChanged has to be 31 * will be used. Before that, an unreliable solution based on onConfiguratio nChanged has to be
30 * used. 32 * used.
31 */ 33 */
32 private interface DisplayListenerBackend { 34 private interface DisplayListenerBackend {
33 35
34 /** 36 /**
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 // DisplayListener implementation: 153 // DisplayListener implementation:
152 154
153 @Override 155 @Override
154 public void onDisplayAdded(int sdkDisplayId) { 156 public void onDisplayAdded(int sdkDisplayId) {
155 // DisplayAndroid is added lazily on first use. This is to workaroun d corner case 157 // DisplayAndroid is added lazily on first use. This is to workaroun d corner case
156 // bug where DisplayManager.getDisplay(sdkDisplayId) returning null here. 158 // bug where DisplayManager.getDisplay(sdkDisplayId) returning null here.
157 } 159 }
158 160
159 @Override 161 @Override
160 public void onDisplayRemoved(int sdkDisplayId) { 162 public void onDisplayRemoved(int sdkDisplayId) {
163 // Never remove the primary display.
164 if (sdkDisplayId == Display.DEFAULT_DISPLAY) return;
165
166 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId);
167 if (displayAndroid == null) return;
168
169 nativeRemoveDisplay(sdkDisplayId);
161 mIdMap.remove(sdkDisplayId); 170 mIdMap.remove(sdkDisplayId);
162 } 171 }
163 172
164 @Override 173 @Override
165 public void onDisplayChanged(int sdkDisplayId) { 174 public void onDisplayChanged(int sdkDisplayId) {
166 updateDeviceDisplayInfo(); 175 updateDeviceDisplayInfo();
167 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); 176 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId);
168 if (displayAndroid != null) { 177 if (displayAndroid != null) {
169 displayAndroid.updateFromDisplay(getDisplayManager().getDisplay( sdkDisplayId)); 178 displayAndroid.updateFromDisplay(getDisplayManager().getDisplay( sdkDisplayId));
170 } 179 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 } 211 }
203 212
204 private static void updateDeviceDisplayInfo() { 213 private static void updateDeviceDisplayInfo() {
205 DeviceDisplayInfo.create(getContext()).updateNativeSharedDisplayInfo(); 214 DeviceDisplayInfo.create(getContext()).updateNativeSharedDisplayInfo();
206 } 215 }
207 216
208 private DisplayAndroidManager() { 217 private DisplayAndroidManager() {
209 mIdMap = new SparseArray<>(); 218 mIdMap = new SparseArray<>();
210 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 219 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
211 mBackend = new DisplayListenerBackendImpl(); 220 mBackend = new DisplayListenerBackendImpl();
221 // Make sure the display map contains the built-in primary display i f it exists.
222 // The primary display is never removed.
223 Display display = getDisplayManager().getDisplay(Display.DEFAULT_DIS PLAY);
224 if (display != null) {
225 addDisplay(display);
226 } else {
227 nativeSetNoPrimaryDisplay();
mthiesse 2016/10/27 14:30:30 This feels scary - should we not just use getDispl
Tima Vaisburd 2016/10/27 17:56:23 Sorry, I did not quite get your idea. Do you sugge
mthiesse 2016/10/27 19:51:51 Yes, that's what I'm suggesting. I'm not sure what
Tima Vaisburd 2016/10/27 20:22:30 I do not know, maybe not possible. Another idea is
mthiesse 2016/10/27 20:29:13 I'll have to defer to Bo here, I don't know enough
boliu 2016/10/27 22:17:49 I don't this that can ever happen. throw an except
Tima Vaisburd 2016/10/31 23:36:15 Got Display from the application context. I had to
228 }
212 } else { 229 } else {
213 Display display = getDisplayFromContext(getContext()); 230 Display display = getDisplayFromContext(getContext());
214 mBackend = new DisplayListenerAPI16(display.getDisplayId()); 231 mBackend = new DisplayListenerAPI16(display.getDisplayId());
215 addDisplay(display); // Note this display is never removed. 232 addDisplay(display); // Note this display is never removed.
216 } 233 }
217 mBackend.startListening(); 234 mBackend.startListening();
218 } 235 }
219 236
220 /* package */ DisplayAndroid getDisplayAndroid(Display display) { 237 /* package */ DisplayAndroid getDisplayAndroid(Display display) {
221 int sdkDisplayId = display.getDisplayId(); 238 int sdkDisplayId = display.getDisplayId();
222 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId); 239 DisplayAndroid displayAndroid = mIdMap.get(sdkDisplayId);
223 if (displayAndroid == null) { 240 if (displayAndroid == null) {
224 displayAndroid = addDisplay(display); 241 displayAndroid = addDisplay(display);
225 } 242 }
226 return displayAndroid; 243 return displayAndroid;
227 } 244 }
228 245
229 /* package */ void startAccurateListening() { 246 /* package */ void startAccurateListening() {
230 mBackend.startAccurateListening(); 247 mBackend.startAccurateListening();
231 } 248 }
232 249
233 /* package */ void stopAccurateListening() { 250 /* package */ void stopAccurateListening() {
234 mBackend.stopAccurateListening(); 251 mBackend.stopAccurateListening();
235 } 252 }
236 253
237 private DisplayAndroid addDisplay(Display display) { 254 private DisplayAndroid addDisplay(Display display) {
238 int sdkDisplayId = display.getDisplayId(); 255 int sdkDisplayId = display.getDisplayId();
239 DisplayAndroid displayAndroid = new DisplayAndroid(display); 256 DisplayAndroid displayAndroid = new DisplayAndroid(display);
240 mIdMap.put(sdkDisplayId, displayAndroid); 257 mIdMap.put(sdkDisplayId, displayAndroid);
258
259 updateDisplayOnNativeSide(displayAndroid);
241 return displayAndroid; 260 return displayAndroid;
242 } 261 }
262
263 /* package */ void updateDisplayOnNativeSide(DisplayAndroid displayAndroid) {
264 nativeUpdateDisplay(displayAndroid.getSdkDisplayId(),
265 displayAndroid.getPhysicalDisplayWidth(), displayAndroid.getPhys icalDisplayHeight(),
266 displayAndroid.getDisplayWidth(), displayAndroid.getDisplayHeigh t(),
267 displayAndroid.getDIPScale(), displayAndroid.getRotationDegrees( ),
268 displayAndroid.getBitsPerPixel(), displayAndroid.getBitsPerCompo nent());
269 }
270
271 private static native void nativeUpdateDisplay(int sdkDisplayId, int physica lWidth,
272 int physicalHeight, int width, int height, float dipScale, int rotat ionDegrees,
273 int bitsPerPixel, int bitsPerComponent);
274 private static native void nativeRemoveDisplay(int sdkDisplayId);
275 private static native void nativeSetNoPrimaryDisplay();
243 } 276 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698