• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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