1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.wallpaper.util;
17 
18 import android.content.res.Configuration;
19 import android.content.res.Resources;
20 import android.graphics.Point;
21 import android.os.Build.VERSION;
22 import android.os.Build.VERSION_CODES;
23 import android.util.Log;
24 import android.view.Display;
25 
26 /**
27  * Calculates the size of the device's screen.
28  */
29 public class ScreenSizeCalculator {
30 
31     private static final String TAG = "ScreenSizeCalculator";
32 
33     private static ScreenSizeCalculator sInstance;
34 
35     private Point mPortraitScreenSize;
36     private Point mLandscapeScreenSize;
37 
getInstance()38     public static ScreenSizeCalculator getInstance() {
39         if (sInstance == null) {
40             sInstance = new ScreenSizeCalculator();
41         }
42         return sInstance;
43     }
44 
45     /**
46      * Clears the static instance of ScreenSizeCalculator. Used in test when display metrics are
47      * manipulated between test cases.
48      */
clearInstance()49     static void clearInstance() {
50         sInstance = null;
51     }
52 
53     /**
54      * Calculates the device's screen size, in physical pixels.
55      *
56      * @return Screen size unadjusted for window decor or compatibility scale factors if API level is
57      * 17+, otherwise return adjusted screen size. In both cases, returns size in units of
58      * physical pixels.
59      */
getScreenSize(Display display)60     public Point getScreenSize(Display display) {
61         switch (Resources.getSystem().getConfiguration().orientation) {
62             case Configuration.ORIENTATION_PORTRAIT:
63                 return getPortraitScreenSize(display);
64             case Configuration.ORIENTATION_LANDSCAPE:
65                 return getLandscapeScreenSize(display);
66             default:
67                 Log.e(TAG, "Unknown device orientation: "
68                         + Resources.getSystem().getConfiguration().orientation);
69                 return getPortraitScreenSize(display);
70         }
71     }
72 
getPortraitScreenSize(Display display)73     private Point getPortraitScreenSize(Display display) {
74         if (mPortraitScreenSize == null) {
75             mPortraitScreenSize = new Point();
76         }
77         writeDisplaySizeToPoint(display, mPortraitScreenSize);
78         return mPortraitScreenSize;
79     }
80 
getLandscapeScreenSize(Display display)81     private Point getLandscapeScreenSize(Display display) {
82         if (mLandscapeScreenSize == null) {
83             mLandscapeScreenSize = new Point();
84         }
85         writeDisplaySizeToPoint(display, mLandscapeScreenSize);
86         return mLandscapeScreenSize;
87     }
88 
89     /**
90      * Writes the screen size of the provided display object to the provided Point object.
91      */
writeDisplaySizeToPoint(Display display, Point outPoint)92     private void writeDisplaySizeToPoint(Display display, Point outPoint) {
93         if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
94             display.getRealSize(outPoint);
95         } else {
96             display.getSize(outPoint);
97         }
98     }
99 }
100