• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.android.nfc;
2 
3 import android.content.Context;
4 import android.hardware.display.DisplayManager;
5 import android.os.PowerManager;
6 import android.view.Display;
7 
8 import androidx.annotation.VisibleForTesting;
9 
10 import com.android.server.display.feature.flags.Flags;
11 
12 /**
13  * Helper class for determining the current screen state for NFC activities.
14  */
15 class ScreenStateHelper {
16 
17     static final int SCREEN_STATE_UNKNOWN = 0x00;
18     static final int SCREEN_STATE_OFF_UNLOCKED = 0x01;
19     static final int SCREEN_STATE_OFF_LOCKED = 0x02;
20     static final int SCREEN_STATE_ON_LOCKED = 0x04;
21     static final int SCREEN_STATE_ON_UNLOCKED = 0x08;
22 
23     // Display category built-in displays before the AOSP API is ready.
24     // TODO (b/321309554): Get the correct value from OEM.
25     private static final int DISPLAY_BUILT_IN_DISPLAY_OEM = 1;
26 
27     //Polling mask
28     static final int SCREEN_POLLING_TAG_MASK = 0x10;
29     static final int SCREEN_POLLING_READER_MASK = 0x40;
30 
31     private final PowerManager mPowerManager;
32     private final DisplayManager mDisplayManager;
33 
ScreenStateHelper(Context context)34     ScreenStateHelper(Context context) {
35         this(context.getSystemService(PowerManager.class),
36                 context.getSystemService(DisplayManager.class));
37     }
38 
isDisplayOn()39     private boolean isDisplayOn() {
40         Display display = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
41         Display displayBuiltIn = null;
42         if (Flags.displayCategoryBuiltIn()) {
43             Display[] displaysBuiltIn =
44                     mDisplayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_BUILT_IN_DISPLAYS);
45             if (displaysBuiltIn.length > 0) {
46                 displayBuiltIn = displaysBuiltIn[0];
47             }
48         } else {
49             displayBuiltIn = mDisplayManager.getDisplay(DISPLAY_BUILT_IN_DISPLAY_OEM);
50         }
51         return display.getState() == Display.STATE_ON
52                 || (displayBuiltIn != null && displayBuiltIn.getState() == Display.STATE_ON);
53     }
54 
checkScreenState(boolean checkDisplayState)55     int checkScreenState(boolean checkDisplayState) {
56         if (!mPowerManager.isInteractive() || (checkDisplayState && !isDisplayOn())) {
57             if (NfcInjector.getInstance().isDeviceLocked()) {
58                 return SCREEN_STATE_OFF_LOCKED;
59             } else {
60                 return SCREEN_STATE_OFF_UNLOCKED;
61             }
62         } else if (NfcInjector.getInstance().isDeviceLocked()) {
63             return SCREEN_STATE_ON_LOCKED;
64         } else {
65             return SCREEN_STATE_ON_UNLOCKED;
66         }
67     }
68 
checkScreenStateProvisionMode()69     int checkScreenStateProvisionMode() {
70         if (!mPowerManager.isInteractive()) {
71             if (NfcInjector.getInstance().isDeviceLocked()) {
72                 return SCREEN_STATE_OFF_LOCKED;
73             } else {
74                 return SCREEN_STATE_OFF_UNLOCKED;
75             }
76         } else if (NfcInjector.getInstance().isDeviceLocked()) {
77             return SCREEN_STATE_ON_LOCKED;
78         } else {
79             return SCREEN_STATE_ON_UNLOCKED;
80         }
81     }
82 
83     /**
84      * For debugging only - no i18n
85      */
screenStateToString(int screenState)86     static String screenStateToString(int screenState) {
87         switch (screenState) {
88             case SCREEN_STATE_OFF_LOCKED:
89                 return "OFF_LOCKED";
90             case SCREEN_STATE_ON_LOCKED:
91                 return "ON_LOCKED";
92             case SCREEN_STATE_ON_UNLOCKED:
93                 return "ON_UNLOCKED";
94             case SCREEN_STATE_OFF_UNLOCKED:
95                 return "OFF_UNLOCKED";
96             default:
97                 return "UNKNOWN";
98         }
99     }
100 
screenStateToProtoEnum(int screenState)101     static int screenStateToProtoEnum(int screenState) {
102         switch (screenState) {
103             case SCREEN_STATE_OFF_LOCKED:
104                 return NfcServiceDumpProto.SCREEN_STATE_OFF_LOCKED;
105             case SCREEN_STATE_ON_LOCKED:
106                 return NfcServiceDumpProto.SCREEN_STATE_ON_LOCKED;
107             case SCREEN_STATE_ON_UNLOCKED:
108                 return NfcServiceDumpProto.SCREEN_STATE_ON_UNLOCKED;
109             case SCREEN_STATE_OFF_UNLOCKED:
110                 return NfcServiceDumpProto.SCREEN_STATE_OFF_UNLOCKED;
111             default:
112                 return NfcServiceDumpProto.SCREEN_STATE_UNKNOWN;
113         }
114     }
115 
116     @VisibleForTesting
ScreenStateHelper(PowerManager powerManager, DisplayManager displayManager)117     ScreenStateHelper(PowerManager powerManager, DisplayManager displayManager) {
118         mPowerManager = powerManager;
119         mDisplayManager = displayManager;
120     }
121 }
122