OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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.gfx; | 5 package org.chromium.ui.gfx; |
6 | 6 |
7 import android.annotation.TargetApi; | 7 import android.annotation.TargetApi; |
8 import android.content.Context; | 8 import android.content.Context; |
9 import android.graphics.PixelFormat; | 9 import android.graphics.PixelFormat; |
10 import android.graphics.Point; | 10 import android.graphics.Point; |
11 import android.os.Build; | 11 import android.os.Build; |
12 import android.util.DisplayMetrics; | 12 import android.util.DisplayMetrics; |
13 import android.view.Display; | 13 import android.view.Display; |
14 import android.view.Surface; | 14 import android.view.Surface; |
15 import android.view.WindowManager; | 15 import android.view.WindowManager; |
16 | 16 |
17 import org.chromium.base.CalledByNative; | 17 import org.chromium.base.CalledByNative; |
18 import org.chromium.base.JNINamespace; | 18 import org.chromium.base.JNINamespace; |
19 | 19 |
20 import java.lang.ref.WeakReference; | |
21 | |
20 /** | 22 /** |
21 * This class facilitates access to android information typically only | 23 * This class facilitates access to android information typically only |
22 * available using the Java SDK, including {@link Display} properties. | 24 * available using the Java SDK, including {@link Display} properties. |
23 * | 25 * |
24 * Currently the information consists of very raw display information (height, w idth, DPI scale) | 26 * Currently the information consists of very raw display information (height, w idth, DPI scale) |
25 * regarding the main display. | 27 * regarding the main display. |
26 */ | 28 */ |
27 @JNINamespace("gfx") | 29 @JNINamespace("gfx") |
28 public class DeviceDisplayInfo { | 30 public class DeviceDisplayInfo { |
29 | 31 private final WeakReference<Context> mContextRef; |
30 private final Context mAppContext; | |
31 private final WindowManager mWinManager; | 32 private final WindowManager mWinManager; |
32 private Point mTempPoint = new Point(); | 33 private Point mTempPoint = new Point(); |
33 private DisplayMetrics mTempMetrics = new DisplayMetrics(); | 34 private DisplayMetrics mTempMetrics = new DisplayMetrics(); |
34 | 35 |
35 private DeviceDisplayInfo(Context context) { | 36 private DeviceDisplayInfo(WeakReference<Context> contextRef) { |
36 mAppContext = context.getApplicationContext(); | 37 mContextRef = contextRef; |
37 mWinManager = (WindowManager) mAppContext.getSystemService(Context.WINDO W_SERVICE); | 38 Context context = mContextRef.get(); |
39 if (context == null) | |
boliu
2015/07/15 06:38:47
Pass a strong ref in constructor, then this can't
gsennton
2015/07/15 19:26:21
Unless the incoming context is null because we ret
boliu
2015/07/16 14:36:56
You can check for null before passing it into Devi
gsennton
2015/10/20 13:27:12
Right, will check this in WindowAndroid::UpdateDev
boliu
2015/10/20 15:07:22
"use the default DeviceDisplayInfo" sounds wrong,
| |
40 throw new RuntimeException("got null Context in DeviceDisplayInfo co nstructor"); | |
41 mWinManager = (WindowManager) context.getSystemService(Context.WINDOW_SE RVICE); | |
38 } | 42 } |
39 | 43 |
40 /** | 44 /** |
41 * @return Display height in physical pixels. | 45 * @return Display height in physical pixels. |
42 */ | 46 */ |
43 @CalledByNative | 47 @CalledByNative |
44 public int getDisplayHeight() { | 48 public int getDisplayHeight() { |
45 getDisplay().getSize(mTempPoint); | 49 getDisplay().getSize(mTempPoint); |
46 return mTempPoint.y; | 50 return mTempPoint.y; |
47 } | 51 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
147 getDisplay().getMetrics(mTempMetrics); | 151 getDisplay().getMetrics(mTempMetrics); |
148 return mTempMetrics.density; | 152 return mTempMetrics.density; |
149 } | 153 } |
150 | 154 |
151 /** | 155 /** |
152 * @return Smallest screen size in density-independent pixels that the | 156 * @return Smallest screen size in density-independent pixels that the |
153 * application will see, regardless of orientation. | 157 * application will see, regardless of orientation. |
154 */ | 158 */ |
155 @CalledByNative | 159 @CalledByNative |
156 private int getSmallestDIPWidth() { | 160 private int getSmallestDIPWidth() { |
157 return mAppContext.getResources().getConfiguration().smallestScreenWidth Dp; | 161 Context context = mContextRef.get(); |
162 if (context == null) throw new RuntimeException("null context in getSmal lestDIPWidth!!!"); | |
163 return context.getResources().getConfiguration().smallestScreenWidthDp; | |
boliu
2015/07/15 06:38:47
I wonder if this can ever change. Maybe it's ok to
jdduke (slow)
2015/07/15 16:03:07
+1. It might also be worth investigating why this
gsennton
2015/07/15 19:26:21
Right, going ahead and storing the value in the co
boliu
2015/07/16 14:36:56
You no longer need to keep mContextRef in this cla
gsennton
2015/10/20 13:27:12
will remove mContextRef
Regarding getSmallestDIPW
| |
158 } | 164 } |
159 | 165 |
160 /** | 166 /** |
161 * @return the screen's rotation angle from its 'natural' orientation. | 167 * @return the screen's rotation angle from its 'natural' orientation. |
162 * Expected values are one of { 0, 90, 180, 270 }. | 168 * Expected values are one of { 0, 90, 180, 270 }. |
163 * See http://developer.android.com/reference/android/view/Display.html#getR otation() | 169 * See http://developer.android.com/reference/android/view/Display.html#getR otation() |
164 * for more information about Display.getRotation() behavior. | 170 * for more information about Display.getRotation() behavior. |
165 */ | 171 */ |
166 @CalledByNative | 172 @CalledByNative |
167 public int getRotationDegrees() { | 173 public int getRotationDegrees() { |
168 switch (getDisplay().getRotation()) { | 174 switch (getDisplay().getRotation()) { |
169 case Surface.ROTATION_0: | 175 case Surface.ROTATION_0: |
170 return 0; | 176 return 0; |
171 case Surface.ROTATION_90: | 177 case Surface.ROTATION_90: |
172 return 90; | 178 return 90; |
173 case Surface.ROTATION_180: | 179 case Surface.ROTATION_180: |
174 return 180; | 180 return 180; |
175 case Surface.ROTATION_270: | 181 case Surface.ROTATION_270: |
176 return 270; | 182 return 270; |
177 } | 183 } |
178 | 184 |
179 // This should not happen. | 185 // This should not happen. |
180 assert false; | 186 assert false; |
181 return 0; | 187 return 0; |
182 } | 188 } |
183 | 189 |
184 /** | |
185 * Inform the native implementation to update its cached representation of | |
186 * the DeviceDisplayInfo values. | |
187 */ | |
188 public void updateNativeSharedDisplayInfo() { | |
189 nativeUpdateSharedDeviceDisplayInfo( | |
190 getDisplayHeight(), getDisplayWidth(), | |
191 getPhysicalDisplayHeight(), getPhysicalDisplayWidth(), | |
192 getBitsPerPixel(), getBitsPerComponent(), | |
193 getDIPScale(), getSmallestDIPWidth(), getRotationDegrees()); | |
194 } | |
195 | |
196 private Display getDisplay() { | 190 private Display getDisplay() { |
197 return mWinManager.getDefaultDisplay(); | 191 return mWinManager.getDefaultDisplay(); |
198 } | 192 } |
199 | 193 |
200 /** | 194 /** |
201 * Creates DeviceDisplayInfo for a given Context. | 195 * Creates DeviceDisplayInfo for a given Context. |
202 * | 196 * |
203 * @param context A context to use. | 197 * @param context A context to use. |
204 * @return DeviceDisplayInfo associated with a given Context. | 198 * @return DeviceDisplayInfo associated with a given Context. |
205 */ | 199 */ |
206 @CalledByNative | 200 @CalledByNative |
207 public static DeviceDisplayInfo create(Context context) { | 201 public static DeviceDisplayInfo create(Context context) { |
208 return new DeviceDisplayInfo(context); | 202 return new DeviceDisplayInfo(new WeakReference<Context>(context)); |
209 } | 203 } |
210 | |
211 private native void nativeUpdateSharedDeviceDisplayInfo( | |
212 int displayHeight, int displayWidth, | |
213 int physicalDisplayHeight, int physicalDisplayWidth, | |
214 int bitsPerPixel, int bitsPerComponent, double dipScale, | |
215 int smallestDIPWidth, int rotationDegrees); | |
216 | |
217 } | 204 } |
OLD | NEW |