Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,6 @@
[submodule "vendor/nim-unicodedb"]
path = vendor/nim-unicodedb
url = https://github.com/nitely/nim-unicodedb
[submodule "vendor/status-keycard-qt"]
path = vendor/status-keycard-qt
url = https://github.com/status-im/status-keycard-qt
20 changes: 20 additions & 0 deletions BUILDING.md
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,26 @@ make run
```
🎉

### Build Configuration Options

The following environment variables can be used to customize the build:

- INCLUDE_DEBUG_SYMBOLS (0,1) - Configure nim to include the debug symbols for desktop platforms.
- KDF_ITERATIONS (number) - Configure the KDF_ITERATIONS to use for the DB encryption
- KEYCARD_QT_SOURCE_DIR (path) - Point the build system to a local keycard-qt folder. Defaults to a new clone of the latest master in the `status-keycard-qt` build folder.
- MONITORING (true,false) - Enable/disable qml monitoring tools. The monitoring tools provide a suite of qml introspection tools to debug data transformations. Defaults to `false`
- NIM_SDS_SOURCE_DIR (path) - Point the build system to a local nim-sds folder. Defaults to `$(GIT_ROOT)/../nim-sds`
- PRODUCTION_PARAMETERS (string) - Configure the production arguments for nim compilation. Defaults to `-d:production`
- QMAKE (path to executable) - Point the build system to a different qt installation. Defaults to env configuration
- QML_DEBUG (true,false) - Enable qml debugger and profiler. Needs DOtherSide recompilation. Defaults to `false`
- QML_DEBUG_PORT (number) - Configure the qml debugger port. Defaults to `49152`
- QT_ARCH (string) - Configure the Qt architecture for macOS cross-compilation. Can be used to compile Intel builds on ARM64 OS. Defaults to `$(shell uname -m)`
- REBUILD_NIM (true,false) - Force nim recompilation
- REBUILD_UI (true,false) - Force qrc recompilation
- STATUS_KEYCARD_QT_SOURCE_DIR (path) - Point the build system to a local status-keycard-qt folder. Defaults to `vendor/status-keycard-qt`
- USE_STATUS_KEYCARD_QT (0,1) - Toggle to switch between `status-keycard-go` and `status-keycard-qt`. Defaults to `0`
- VCINSTALLDIR (path) - Visual Studio compiler installation path. Defaults to `C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\`


## 🐞 Troubleshooting

Expand Down
85 changes: 74 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ GIT_ROOT ?= $(shell git rev-parse --show-toplevel 2>/dev/null || echo .)
tests-nim-linux \
status-go \
status-keycard-go \
status-keycard-qt \
statusq-sanity-checker \
run-statusq-sanity-checker \
statusq-tests \
Expand Down Expand Up @@ -248,6 +249,9 @@ NIMSDS_LIBDIR := $(NIM_SDS_SOURCE_DIR)/build
NIMSDS_LIBFILE := $(NIMSDS_LIBDIR)/libsds.$(LIB_EXT)
NIM_EXTRA_PARAMS += --passL:"-L$(NIMSDS_LIBDIR)" --passL:"-lsds"
STATUSGO_MAKE_PARAMS += NIM_SDS_SOURCE_DIR="$(NIM_SDS_SOURCE_DIR)"
# Keycard library selection: set to 1 to use status-keycard-qt (Qt/C++), 0 for status-keycard-go (Go)
# Default: use status-keycard-go for now (stable), switch to 1 to test status-keycard-qt
USE_STATUS_KEYCARD_QT ?= 0

INCLUDE_DEBUG_SYMBOLS ?= false
ifeq ($(INCLUDE_DEBUG_SYMBOLS),true)
Expand Down Expand Up @@ -501,6 +505,59 @@ $(STATUSKEYCARDGO): | deps
$(if $(filter 1 true,$(USE_MOCKED_KEYCARD_LIB)), build-mocked-lib, build-lib) \
$(STATUSKEYCARDGO_MAKE_PARAMS) $(HANDLE_OUTPUT)

##
## status-keycard-qt (Qt/C++ based keycard library)
##

# Allow using local status-keycard-qt for development
STATUS_KEYCARD_QT_SOURCE_DIR ?= vendor/status-keycard-qt
KEYCARD_QT_SOURCE_DIR ?= ""

# Determine build directory based on platform
ifeq ($(mkspecs),macx)
STATUS_KEYCARD_QT_BUILD_DIR := $(STATUS_KEYCARD_QT_SOURCE_DIR)/build/macos
else ifeq ($(mkspecs),win32)
STATUS_KEYCARD_QT_BUILD_DIR := $(STATUS_KEYCARD_QT_SOURCE_DIR)/build/windows
else
STATUS_KEYCARD_QT_BUILD_DIR := $(STATUS_KEYCARD_QT_SOURCE_DIR)/build/linux
endif

export STATUSKEYCARD_QT_LIB := $(STATUS_KEYCARD_QT_BUILD_DIR)/libstatus-keycard-qt.$(LIB_EXT)
export STATUSKEYCARD_QT_LIBDIR := $(STATUS_KEYCARD_QT_BUILD_DIR)

status-keycard-qt: $(STATUSKEYCARD_QT_LIB)
$(STATUSKEYCARD_QT_LIB): | deps check-qt-dir
echo -e $(BUILD_MSG) "status-keycard-qt"
cmake -S "${STATUS_KEYCARD_QT_SOURCE_DIR}" -B "${STATUS_KEYCARD_QT_BUILD_DIR}" \
$(COMMON_CMAKE_CONFIG_PARAMS) \
-DBUILD_TESTING=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_SHARED_LIBS=ON \
-DKEYCARD_QT_SOURCE_DIR=${KEYCARD_QT_SOURCE_DIR} \
$(HANDLE_OUTPUT)
cmake --build $(STATUS_KEYCARD_QT_BUILD_DIR) --target status-keycard-qt $(HANDLE_OUTPUT)

status-keycard-qt-clean:
echo -e "\033[92mCleaning:\033[39m status-keycard-qt"
rm -rf $(STATUS_KEYCARD_QT_BUILD_DIR)

##
## Keycard library selection
##

# Set the keycard library and paths based on USE_STATUS_KEYCARD_QT
ifeq ($(USE_STATUS_KEYCARD_QT),1)
KEYCARD_LIB := $(STATUSKEYCARD_QT_LIB)
KEYCARD_LIBDIR := $(STATUSKEYCARD_QT_LIBDIR)
KEYCARD_LINKNAME := status-keycard-qt
KEYCARD_DYLIB_NAME := libstatus-keycard-qt.dylib
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That looks like a macOS specific libname

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Linux will look like "libstatus-keycard-qt.so"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should use a variant of STATUSKEYCARD_QT_LIB?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Still a valid question imo :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahh, lol! Just pushed the fix to the next PR that sits on top of this. 6352ad8

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, up to you and how you want to deal with merging the whole chain :)

else
KEYCARD_LIB := $(STATUSKEYCARDGO)
KEYCARD_LIBDIR := $(STATUSKEYCARDGO_LIBDIR)
KEYCARD_LINKNAME := keycard
KEYCARD_DYLIB_NAME := libkeycard.$(LIB_EXT)
endif

QRCODEGEN := vendor/QR-Code-generator/c/libqrcodegen.a

$(QRCODEGEN): | deps
Expand Down Expand Up @@ -611,16 +668,16 @@ $(NIM_STATUS_CLIENT): update-qmake-previous
endif

$(NIM_STATUS_CLIENT): NIM_PARAMS += $(RESOURCES_LAYOUT)
$(NIM_STATUS_CLIENT): $(NIM_SOURCES) | statusq dotherside check-qt-dir $(STATUSGO) $(STATUSKEYCARDGO) $(QRCODEGEN) rcc deps
$(NIM_STATUS_CLIENT): $(NIM_SOURCES) | statusq dotherside check-qt-dir $(STATUSGO) $(KEYCARD_LIB) $(QRCODEGEN) rcc deps
echo -e $(BUILD_MSG) "$@"
$(ENV_SCRIPT) nim c $(NIM_PARAMS) \
--mm:refc \
--passL:"-L$(STATUSGO_LIBDIR)" \
--passL:"-lstatus" \
--passL:"-L$(STATUSQ_INSTALL_PATH)/StatusQ" \
--passL:"-lStatusQ" \
--passL:"-L$(STATUSKEYCARDGO_LIBDIR)" \
--passL:"-lkeycard" \
--passL:"-L$(KEYCARD_LIBDIR)" \
--passL:"-l$(KEYCARD_LINKNAME)" \
--passL:"$(QRCODEGEN)" \
--passL:"-lm" \
--parallelBuild:0 \
Expand All @@ -631,8 +688,8 @@ ifeq ($(mkspecs),macx)
@rpath/libstatus.dylib \
bin/nim_status_client
install_name_tool -change \
libkeycard.dylib \
@rpath/libkeycard.dylib \
$(KEYCARD_DYLIB_NAME) \
@rpath/$(KEYCARD_DYLIB_NAME) \
bin/nim_status_client
endif

Expand Down Expand Up @@ -850,7 +907,7 @@ zip-windows: check-pkg-target-windows $(STATUS_CLIENT_7Z)
clean-destdir:
rm -rf bin/*

clean: | clean-common clean-destdir statusq-clean status-go-clean dotherside-clean storybook-clean clean-translations
clean: | clean-common clean-destdir statusq-clean status-go-clean status-keycard-qt-clean dotherside-clean storybook-clean clean-translations
rm -rf bottles/* pkg/* tmp/* $(STATUSKEYCARDGO)
+ $(MAKE) -C vendor/QR-Code-generator/c/ --no-print-directory clean

Expand All @@ -868,12 +925,12 @@ run: $(RUN_TARGET)

run-linux: nim_status_client
echo -e "\033[92mRunning:\033[39m bin/nim_status_client"
LD_LIBRARY_PATH="$(QT_LIBDIR)":"$(LIBWAKU_LIBDIR)":"$(NIMSDS_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(STATUSKEYCARDGO_LIBDIR)":"$(STATUSQ_INSTALL_PATH)/StatusQ":"$(LD_LIBRARY_PATH)" \
LD_LIBRARY_PATH="$(QT_LIBDIR)":"$(LIBWAKU_LIBDIR)":"$(NIMSDS_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(KEYCARD_LIBDIR)":"$(STATUSQ_INSTALL_PATH)/StatusQ":"$(LD_LIBRARY_PATH)" \
./bin/nim_status_client $(ARGS)

run-linux-gdb: nim_status_client
echo -e "\033[92mRunning:\033[39m bin/nim_status_client"
LD_LIBRARY_PATH="$(QT_LIBDIR)":"$(LIBWAKU_LIBDIR)":"$(NIMSDS_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(STATUSKEYCARDGO_LIBDIR)":"$(STATUSQ_INSTALL_PATH)/StatusQ":"$(LD_LIBRARY_PATH)" \
LD_LIBRARY_PATH="$(QT_LIBDIR)":"$(LIBWAKU_LIBDIR)":"$(NIMSDS_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(KEYCARD_LIBDIR)":"$(STATUSQ_INSTALL_PATH)/StatusQ":"$(LD_LIBRARY_PATH)" \
gdb -ex=r ./bin/nim_status_client $(ARGS)

run-macos: nim_status_client
Expand All @@ -884,12 +941,13 @@ run-macos: nim_status_client
ln -fs ../../../nim_status_client ./
fileicon set bin/nim_status_client status-dev.icns
echo -e "\033[92mRunning:\033[39m bin/StatusDev.app/Contents/MacOS/nim_status_client"
DYLD_LIBRARY_PATH="$(STATUSGO_LIBDIR)":"$(KEYCARD_LIBDIR)":"$(STATUSQ_INSTALL_PATH)/StatusQ":"$(DYLD_LIBRARY_PATH)" \
./bin/StatusDev.app/Contents/MacOS/nim_status_client $(ARGS)

run-windows: STATUS_RC_FILE = status-dev.rc
run-windows: compile_windows_resources nim_status_client
echo -e "\033[92mRunning:\033[39m bin/nim_status_client.exe"
PATH="$(DOTHERSIDE_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(STATUSKEYCARDGO_LIBDIR)":"$(STATUSQ_INSTALL_PATH)/StatusQ":"$(PATH)" \
PATH="$(DOTHERSIDE_LIBDIR)":"$(STATUSGO_LIBDIR)":"$(KEYCARD_LIBDIR)":"$(STATUSQ_INSTALL_PATH)/StatusQ":"$(PATH)" \
./bin/nim_status_client.exe $(ARGS)

NIM_TEST_FILES := $(wildcard test/nim/*.nim)
Expand All @@ -908,11 +966,16 @@ endef
export PATH := $(call qmkq,QT_INSTALL_BINS):$(call qmkq,QT_HOST_BINS):$(call qmkq,QT_HOST_LIBEXECS):$(PATH)
export QTDIR := $(call qmkq,QT_INSTALL_PREFIX)

#Force keycard support for mobile builds
ifeq ($(USE_STATUS_KEYCARD_QT),1)
MOBILE_FLAGS += "FLAG_KEYCARD_ENABLED=1"
endif

mobile-run: deps-common
echo -e "\033[92mRunning:\033[39m mobile app"
$(MAKE) -C mobile run
$(MAKE) -C mobile run DEBUG=1 $(MOBILE_FLAGS)

mobile-build: USE_SYSTEM_NIM=1
mobile-build: USE_SYSTEM_NIM=1 $(MOBILE_FLAGS)
mobile-build: | deps-common
echo -e "\033[92mBuilding:\033[39m mobile app ($(or $(PACKAGE_TYPE),default))"
ifeq ($(PACKAGE_TYPE),aab)
Expand Down
16 changes: 16 additions & 0 deletions mobile/DEV_SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,22 @@ export QTDIR=$HOME/qt/6.9.2/ios
make mobile-run
```

Running the app requires a code sign identity. See [Signing](#signing)

#### Keycard

The keycard support is disabled by default in the mobile makefile for IOS. It requires a paid apple developer account to run the app with NFC enabled.

To enable keycard use the `USE_STATUS_KEYCARD_QT=1` flag for the main Makefile and use a paid account by updating the `DEVELOPMENT_TEAM` flag and the bundle if (if the development team isn't Status).

#### Signing

By default the app isn't signed.

To sign the app the `DEVELOPMENT_TEAM` flag needs to be provided. If the development team is not Status development team, then the app bundle id needs to be updated to a unique bundle id.

####

### Android Development Setup

#### Prerequisites - can be installed using the Android Studio
Expand Down
58 changes: 53 additions & 5 deletions mobile/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@

STATUS_GO_LIB := $(LIB_PATH)/libstatus$(LIB_EXT)

# FLAG_KEYCARD_ENABLED: Controls NFC/Keycard support
# - iOS: Default 0 (disabled) - Build without NFC, works with free Apple Developer account
# - Android: Default 1 (enabled) - NFC support doesn't require paid account on Android
# - Set to 1: Build with NFC support (iOS requires paid Apple Developer account)
# - Set to 0: Build without NFC support
# Usage: make build-ios FLAG_KEYCARD_ENABLED=1
ifeq ($(OS),android)
FLAG_KEYCARD_ENABLED ?= 1
else
FLAG_KEYCARD_ENABLED ?= 0
endif

$(info Configuring build system for $(OS) $(ARCH) with QT $(QT_MAJOR))

# default rule
Expand All @@ -16,6 +28,7 @@ statusq: clean-statusq $(STATUS_Q_LIB)
dotherside: clean-dotherside $(DOTHERSIDE_LIB)
openssl: clean-openssl $(OPENSSL_LIB)
qrcodegen: clean-qrcodegen $(QRCODEGEN_LIB)
status-keycard-qt: clean-status-keycard-qt $(STATUS_KEYCARD_QT_LIB)
nim-status-client: clean-nim-status-client $(NIM_STATUS_CLIENT_LIB)
status-desktop-rcc: clean-status-desktop-rcc $(STATUS_DESKTOP_RCC)

Expand Down Expand Up @@ -62,23 +75,51 @@ $(QRCODEGEN_LIB): $(QRCODEGEN_FILES)
@QRCODEGEN=$(QRCODEGEN) $(QRCODEGEN_SCRIPT) $(HANDLE_OUTPUT)
@echo "QRCodeGen built $(QRCODEGEN_LIB)"

$(STATUS_KEYCARD_QT_LIB): $(STATUS_KEYCARD_QT_FILES) $(STATUS_KEYCARD_QT_SCRIPT) $(OPENSSL_LIB)
@echo "Building status-keycard-qt"
@STATUS_KEYCARD_QT=$(STATUS_KEYCARD_QT) KEYCARD_QT=$(KEYCARD_QT) BUILD_DIR=$(BUILD_PATH) $(STATUS_KEYCARD_QT_SCRIPT) $(HANDLE_OUTPUT)
@echo "status-keycard-qt built $(STATUS_KEYCARD_QT_LIB)"

$(STATUS_DESKTOP_RCC): $(STATUS_DESKTOP_UI_FILES) compile-translations
@echo "Building Status Desktop rcc"
@make -C $(STATUS_DESKTOP) rcc $(HANDLE_OUTPUT)
@echo "Status Desktop rcc built"

$(NIM_STATUS_CLIENT_LIB): $(STATUS_DESKTOP_NIM_FILES) $(NIM_STATUS_CLIENT_SCRIPT) $(STATUS_DESKTOP_RCC) $(DOTHERSIDE_LIB) $(OPENSSL_LIB) $(STATUS_Q_LIB) $(STATUS_GO_LIB) $(QRCODEGEN_LIB)
@echo "Building Status Desktop Lib"
@STATUS_DESKTOP=$(STATUS_DESKTOP) LIB_SUFFIX=$(LIB_SUFFIX) LIB_EXT=$(LIB_EXT) USE_QML_SERVER=$(USE_QML_SERVER) $(NIM_STATUS_CLIENT_SCRIPT) $(HANDLE_OUTPUT)
@STATUS_DESKTOP=$(STATUS_DESKTOP) \
LIB_SUFFIX=$(LIB_SUFFIX) \
LIB_EXT=$(LIB_EXT) \
USE_QML_SERVER=$(USE_QML_SERVER) \
BUNDLE_IDENTIFIER="$(BUNDLE_IDENTIFIER)" \
DEBUG=$(DEBUG) \
FLAG_DAPPS_ENABLED=$(FLAG_DAPPS_ENABLED) \
FLAG_CONNECTOR_ENABLED=$(FLAG_CONNECTOR_ENABLED) \
FLAG_KEYCARD_ENABLED=$(FLAG_KEYCARD_ENABLED) \
FLAG_SINGLE_STATUS_INSTANCE_ENABLED=$(FLAG_SINGLE_STATUS_INSTANCE_ENABLED) \
FLAG_BROWSER_ENABLED=$(FLAG_BROWSER_ENABLED) \
$(NIM_STATUS_CLIENT_SCRIPT) $(HANDLE_OUTPUT)
@echo "Status Desktop Lib built $(NIM_STATUS_CLIENT_LIB)"

# non-phony targets
$(TARGET): $(APP_SCRIPT) $(STATUS_GO_LIB) $(STATUS_Q_LIB) $(DOTHERSIDE_LIB) $(OPENSSL_LIB) $(QRCODEGEN_LIB) $(NIM_STATUS_CLIENT_LIB) $(STATUS_DESKTOP_RCC) $(WRAPPER_APP_FILES)
$(TARGET): $(APP_SCRIPT) $(STATUS_GO_LIB) $(STATUS_Q_LIB) $(DOTHERSIDE_LIB) $(OPENSSL_LIB) $(QRCODEGEN_LIB) $(STATUS_KEYCARD_QT_LIB) $(NIM_STATUS_CLIENT_LIB) $(STATUS_DESKTOP_RCC) $(WRAPPER_APP_FILES)
@echo "Building app"
ifeq ($(OS),android)
@STATUS_DESKTOP=$(STATUS_DESKTOP) BUILD_TYPE=$(PACKAGE_TYPE) BIN_DIR=$(BIN_PATH) BUILD_DIR=$(BUILD_PATH) QT_MAJOR=$(QT_MAJOR) $(APP_SCRIPT) $(HANDLE_OUTPUT)
@STATUS_DESKTOP=$(STATUS_DESKTOP) \
BUILD_TYPE=$(PACKAGE_TYPE) \
BIN_DIR=$(BIN_PATH) \
BUILD_DIR=$(BUILD_PATH) \
QT_MAJOR=$(QT_MAJOR) \
FLAG_KEYCARD_ENABLED=$(FLAG_KEYCARD_ENABLED) \
$(APP_SCRIPT) $(HANDLE_OUTPUT)
else
@STATUS_DESKTOP=$(STATUS_DESKTOP) BIN_DIR=$(BIN_PATH) BUILD_DIR=$(BUILD_PATH) QT_MAJOR=$(QT_MAJOR) $(APP_SCRIPT) $(HANDLE_OUTPUT)
@STATUS_DESKTOP=$(STATUS_DESKTOP) \
BIN_DIR=$(BIN_PATH) \
BUILD_DIR=$(BUILD_PATH) \
QT_MAJOR=$(QT_MAJOR) \
DEVELOPMENT_TEAM="$(DEVELOPMENT_TEAM)" \
FLAG_KEYCARD_ENABLED=$(FLAG_KEYCARD_ENABLED) \
$(APP_SCRIPT) $(HANDLE_OUTPUT)
endif
@echo "Built $(TARGET)"

Expand Down Expand Up @@ -128,7 +169,7 @@ endif
all: $(TARGET)

.PHONY: clean
clean: clean-statusq clean-dotherside clean-openssl clean-qrcodegen clean-nim-status-client clean-status-desktop-rcc
clean: clean-statusq clean-dotherside clean-openssl clean-qrcodegen clean-status-keycard-qt clean-nim-status-client clean-status-desktop-rcc
@echo "Cleaning"
@rm -rf $(ROOT_DIR)/bin $(ROOT_DIR)/build $(ROOT_DIR)/lib

Expand Down Expand Up @@ -158,6 +199,13 @@ clean-qrcodegen:
@rm -f $(QRCODEGEN_LIB)
@cd $(QRCODEGEN) && make clean

# keycard-qt is now automatically built by status-keycard-qt via CMake FetchContent
# Its build artifacts are cleaned as part of status-keycard-qt's build directory
.PHONY: clean-status-keycard-qt
clean-status-keycard-qt:
@rm -f $(STATUS_KEYCARD_QT_LIB)
@rm -rf $(STATUS_KEYCARD_QT)/build/$(OS)

.PHONY: clean-nim-status-client
clean-nim-status-client:
@rm -f $(NIM_STATUS_CLIENT_LIB)
Expand Down
1 change: 1 addition & 0 deletions mobile/android/qt6/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.fingerprint" android:required="false" />
<uses-feature android:name="android.hardware.nfc" android:required="false" />

<!-- dangerous permissions -->
<uses-permission android:name="android.permission.CAMERA"/>
Expand Down
Loading
Loading