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