1 /* 2 * Copyright (C) 2023 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 17 package com.android.nfc; 18 19 import android.content.Context; 20 import android.os.Handler; 21 import android.os.SystemProperties; 22 import android.provider.DeviceConfig; 23 import android.text.TextUtils; 24 25 import androidx.annotation.VisibleForTesting; 26 27 /** 28 * This class allows getting all configurable flags from DeviceConfig. 29 */ 30 public class DeviceConfigFacade { 31 // TODO: Temporary hack to copy string from DeviceConfig.NAMESPACE_NFC. Use API constant 32 // once build problems are resolved. 33 private static final String DEVICE_CONFIG_NAMESPACE_NFC = "nfc"; 34 35 private final Context mContext; 36 37 // Cached values of fields updated via updateDeviceConfigFlags() 38 private boolean mAntennaBlockedAlertEnabled; 39 40 public static final String KEY_READER_OPTION_DEFAULT = "reader_option_default"; 41 public static final String KEY_ENABLE_NFC_DEFAULT = "enable_nfc_default"; 42 public static final String KEY_ENABLE_READER_OPTION_SUPPORT = "enable_reader_option_support"; 43 public static final String KEY_SECURE_NFC_CAPABLE = "enable_secure_nfc_support"; 44 public static final String KEY_SECURE_NFC_DEFAULT = "secure_nfc_default"; 45 public static final String KEY_SLOW_TAP_THRESHOLD_MILLIS = "slow_tap_threshold_millis"; 46 47 private boolean mNfcDefaultState; 48 private boolean mReaderOptionSupport; 49 private boolean mReaderOptionDefault; 50 private boolean mSecureNfcCapable; 51 private boolean mSecureNfcDefault; 52 private boolean mEnableAutoPlay; 53 private boolean mPollingDisableAllowed; 54 private boolean mNfccAlwaysOnAllowed; 55 private boolean mEnableServiceOther; 56 private boolean mTagIntentAppPrefSupported; 57 private boolean mProprietaryGetcapsSupported; 58 private boolean mEnableOemExtension; 59 private boolean mEnableDeveloperNotification; 60 private boolean mCheckDisplayStateForScreenState; 61 private boolean mIndicateUserActivityForHce; 62 private String mDefaultRoute; 63 private String mDefaultIsoDepRoute; 64 private String mDefaultOffHostRoute; 65 private String mDefaultScRoute; 66 private int mSlowTapThresholdMillis; 67 private int mUnknownTagPollingDelay; 68 private int mUnknownTagPollingDelayMax; 69 private int mUnknownTagPollingDelayLong; 70 private boolean mCeDisableOtherServicesOnManagedProfiles; 71 72 private static DeviceConfigFacade sInstance; getInstance(Context context, Handler handler)73 public static DeviceConfigFacade getInstance(Context context, Handler handler) { 74 if (sInstance == null) { 75 sInstance = new DeviceConfigFacade(context, handler); 76 } 77 return sInstance; 78 } 79 80 @VisibleForTesting DeviceConfigFacade(Context context, Handler handler)81 public DeviceConfigFacade(Context context, Handler handler) { 82 mContext = context; 83 updateDeviceConfigFlags(); 84 DeviceConfig.addOnPropertiesChangedListener( 85 DEVICE_CONFIG_NAMESPACE_NFC, 86 command -> handler.post(command), 87 properties -> { 88 updateDeviceConfigFlags(); 89 }); 90 91 sInstance = this; 92 } 93 updateDeviceConfigFlags()94 private void updateDeviceConfigFlags() { 95 mAntennaBlockedAlertEnabled = DeviceConfig.getBoolean(DEVICE_CONFIG_NAMESPACE_NFC, 96 "enable_antenna_blocked_alert", 97 mContext.getResources().getBoolean(R.bool.enable_antenna_blocked_alert)); 98 99 mNfcDefaultState = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 100 KEY_ENABLE_NFC_DEFAULT, 101 mContext.getResources().getBoolean(R.bool.enable_nfc_default)); 102 103 mReaderOptionSupport = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 104 KEY_ENABLE_READER_OPTION_SUPPORT, 105 mContext.getResources().getBoolean(R.bool.enable_reader_option_support)); 106 107 mReaderOptionDefault = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 108 KEY_READER_OPTION_DEFAULT, 109 mContext.getResources().getBoolean(R.bool.reader_option_default)); 110 111 mSecureNfcCapable = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 112 KEY_SECURE_NFC_CAPABLE, isSecureNfcCapableDefault()); 113 114 mSecureNfcDefault = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 115 KEY_SECURE_NFC_DEFAULT, 116 mContext.getResources().getBoolean(R.bool.secure_nfc_default)); 117 118 mEnableAutoPlay = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 119 "enable_auto_play", 120 mContext.getResources().getBoolean(R.bool.enable_auto_play)); 121 122 mPollingDisableAllowed = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 123 "polling_disable_allowed", 124 mContext.getResources().getBoolean(R.bool.polling_disable_allowed)); 125 126 mNfccAlwaysOnAllowed = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 127 "nfcc_always_on_allowed", 128 mContext.getResources().getBoolean(R.bool.nfcc_always_on_allowed)); 129 130 mEnableServiceOther = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 131 "enable_service_for_category_other", 132 mContext.getResources().getBoolean(R.bool.enable_service_for_category_other)); 133 134 mTagIntentAppPrefSupported = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 135 "tag_intent_app_pref_supported", 136 mContext.getResources().getBoolean(R.bool.tag_intent_app_pref_supported)); 137 138 mProprietaryGetcapsSupported = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 139 "nfc_proprietary_getcaps_supported", 140 mContext.getResources().getBoolean(R.bool.nfc_proprietary_getcaps_supported)); 141 142 mEnableOemExtension = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 143 "enable_oem_extension", 144 mContext.getResources().getBoolean(R.bool.enable_oem_extension)); 145 146 mEnableDeveloperNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 147 "enable_developer_option_notification", 148 mContext.getResources().getBoolean(R.bool.enable_developer_option_notification)); 149 150 mCheckDisplayStateForScreenState = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 151 "check_display_state_for_screen_state", 152 mContext.getResources().getBoolean(R.bool.check_display_state_for_screen_state)); 153 154 mIndicateUserActivityForHce = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 155 "indicate_user_activity_for_hce", 156 mContext.getResources().getBoolean(R.bool.indicate_user_activity_for_hce)); 157 158 mDefaultRoute = DeviceConfig.getString(DEVICE_CONFIG_NAMESPACE_NFC, 159 "nfc_default_route", 160 mContext.getResources().getString(R.string.nfc_default_route)); 161 162 mDefaultIsoDepRoute = DeviceConfig.getString(DEVICE_CONFIG_NAMESPACE_NFC, 163 "nfc_default_isodep_route", 164 mContext.getResources().getString(R.string.nfc_default_isodep_route)); 165 166 mDefaultOffHostRoute = DeviceConfig.getString(DEVICE_CONFIG_NAMESPACE_NFC, 167 "nfc_default_offhost_route", 168 mContext.getResources().getString(R.string.nfc_default_offhost_route)); 169 170 mDefaultScRoute = DeviceConfig.getString(DEVICE_CONFIG_NAMESPACE_NFC, 171 "nfc_default_sc_route", 172 mContext.getResources().getString(R.string.nfc_default_sc_route)); 173 174 mSlowTapThresholdMillis = DeviceConfig.getInt(DEVICE_CONFIG_NAMESPACE_NFC, 175 KEY_SLOW_TAP_THRESHOLD_MILLIS, 176 mContext.getResources().getInteger(R.integer.slow_tap_threshold_millis)); 177 178 mUnknownTagPollingDelay = DeviceConfig.getInt(DEVICE_CONFIG_NAMESPACE_NFC, 179 "unknown_tag_polling_delay", 180 mContext.getResources().getInteger(R.integer.unknown_tag_polling_delay)); 181 182 mUnknownTagPollingDelayMax = DeviceConfig.getInt(DEVICE_CONFIG_NAMESPACE_NFC, 183 "unknown_tag_polling_delay_count_max", 184 mContext.getResources().getInteger(R.integer.unknown_tag_polling_delay_count_max)); 185 186 mUnknownTagPollingDelayLong = DeviceConfig.getInt(DEVICE_CONFIG_NAMESPACE_NFC, 187 "unknown_tag_polling_delay_long", 188 mContext.getResources().getInteger(R.integer.unknown_tag_polling_delay_long)); 189 mCeDisableOtherServicesOnManagedProfiles = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_NFC, 190 "ce_disable_other_services_on_managed_profiles", 191 mContext.getResources().getBoolean(R.bool.ce_disable_other_services_on_managed_profiles)); 192 } 193 isSecureNfcCapableDefault()194 private boolean isSecureNfcCapableDefault() { 195 if (mContext.getResources().getBoolean(R.bool.enable_secure_nfc_support)) { 196 return true; 197 } 198 String[] skuList = mContext.getResources().getStringArray( 199 R.array.config_skuSupportsSecureNfc); 200 String sku = SystemProperties.get("ro.boot.hardware.sku"); 201 if (TextUtils.isEmpty(sku) || !Utils.arrayContains(skuList, sku)) { 202 return false; 203 } 204 return true; 205 } 206 207 208 /** 209 * Get whether antenna blocked alert is enabled or not. 210 */ isAntennaBlockedAlertEnabled()211 public boolean isAntennaBlockedAlertEnabled() { 212 return mAntennaBlockedAlertEnabled; 213 } 214 getNfcDefaultState()215 public boolean getNfcDefaultState() { 216 return mNfcDefaultState; 217 } isReaderOptionCapable()218 public boolean isReaderOptionCapable() { 219 return mReaderOptionSupport; 220 } getDefaultReaderOption()221 public boolean getDefaultReaderOption() { 222 return mReaderOptionDefault; 223 } isSecureNfcCapable()224 public boolean isSecureNfcCapable() { 225 return mSecureNfcCapable; 226 } getDefaultSecureNfcState()227 public boolean getDefaultSecureNfcState() { 228 return mSecureNfcDefault; 229 } getEnableAutoPlay()230 public boolean getEnableAutoPlay() { return mEnableAutoPlay; } getPollingDisableAllowed()231 public boolean getPollingDisableAllowed() { return mPollingDisableAllowed; } getNfccAlwaysOnAllowed()232 public boolean getNfccAlwaysOnAllowed() { return mNfccAlwaysOnAllowed; } getEnableServiceOther()233 public boolean getEnableServiceOther() { return mEnableServiceOther; } getTagIntentAppPrefSupported()234 public boolean getTagIntentAppPrefSupported() { return mTagIntentAppPrefSupported; } getProprietaryGetcapsSupported()235 public boolean getProprietaryGetcapsSupported() { return mProprietaryGetcapsSupported; } getEnableOemExtension()236 public boolean getEnableOemExtension() { return mEnableOemExtension; } getEnableDeveloperNotification()237 public boolean getEnableDeveloperNotification() { return mEnableDeveloperNotification; } getCheckDisplayStateForScreenState()238 public boolean getCheckDisplayStateForScreenState() { return mCheckDisplayStateForScreenState; } getIndicateUserActivityForHce()239 public boolean getIndicateUserActivityForHce() { return mIndicateUserActivityForHce; } getDefaultRoute()240 public String getDefaultRoute() { 241 return mDefaultRoute; 242 } getDefaultIsoDepRoute()243 public String getDefaultIsoDepRoute() { 244 return mDefaultIsoDepRoute; 245 } getDefaultOffHostRoute()246 public String getDefaultOffHostRoute() { 247 return mDefaultOffHostRoute; 248 } getDefaultScRoute()249 public String getDefaultScRoute() { 250 return mDefaultScRoute; 251 } getSlowTapThresholdMillis()252 public int getSlowTapThresholdMillis() { 253 return mSlowTapThresholdMillis; 254 } getUnknownTagPollingDelay()255 public int getUnknownTagPollingDelay() { return mUnknownTagPollingDelay; } getUnknownTagPollingDelayMax()256 public int getUnknownTagPollingDelayMax() { return mUnknownTagPollingDelayMax; } getUnknownTagPollingDelayLong()257 public int getUnknownTagPollingDelayLong() { return mUnknownTagPollingDelayLong; } 258 getCeDisableOtherServicesOnManagedProfiles()259 public boolean getCeDisableOtherServicesOnManagedProfiles() { 260 return mCeDisableOtherServicesOnManagedProfiles; 261 } 262 } 263