diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 6787aed2..ce962ec6 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,73 +1,72 @@
-# Contributor Covenant Code of Conduct
+# Contributor Code of Conduct
## Our Pledge
-We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity and
+orientation.
## Our Standards
-Examples of behavior that contributes to a positive environment for our community include:
-
-* Demonstrating empathy and kindness toward other people
-* Being respectful of differing opinions, viewpoints, and experiences
-* Giving and gracefully accepting constructive feedback
-* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
-* Focusing on what is best not just for us as individuals, but for the overall community
-
-Examples of unacceptable behavior include:
-
-* The use of sexualized language or imagery, and sexual attention or advances of any kind
-* Trolling, insulting or derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or email address, without their explicit permission
-* Other conduct which could reasonably be considered inappropriate in a professional setting
+Examples of behavior that contributes to creating a positive environment
+include:
+
+- Demonstrating empathy and kindness toward other people
+- Being respectful of differing opinions, viewpoints, and experiences
+- Giving and gracefully accepting feedback
+- Accepting responsibility and apologizing when our actions affect others
+- Focusing on what is best not just for us as individuals, but for the
+ overall community
+- Examples of unacceptable behavior include:
+- The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+- Trolling, insulting or derogatory comments, and personal or political
+ harassment
+- Public or private harassment
+- Publishing others' private information, such as a home address or
+ financial history without their explicit permission
+- Other conduct which could reasonably be considered harmful to a
+ reasonable person
## Enforcement Responsibilities
-Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
-Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
+Community leaders have the right to remove, edit, or reject comments,
+commits, code, wiki edits, issues, and other contributions that are not
+aligned to this Code of Conduct, and will communicate reasons for enforcement
+decisions when appropriate.
## Scope
-This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
+This Code of Conduct applies within all community spaces, and also applies
+when any individual officially represents the community in public spaces.
+Examples of representing the community in public spaces include using an
+official community email address, posting to an official community forum, or
+entering an official community event, while representing the community in
+public spaces.
## Enforcement
-Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at [INSERT CONTACT EMAIL]. All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+[CONTACT_EMAIL]. All complaints will be reviewed and investigated promptly
+and fairly.
-**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-**Community Impact**: A violation through a single incident or series of actions.
-
-**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
-
-### 3. Temporary Ban
-**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within the community.
+All community leaders are obligated to respect the privacy and security of
+the reporter of any incident. Response templates are available on adapting
+the Code of Conduct to different contexts.
## Attribution
-This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
-
-Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
+This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org), version 2.0,
+available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
-For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
\ No newline at end of file
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md
index fb080888..1e1669cb 100644
--- a/PRIVACY_POLICY.md
+++ b/PRIVACY_POLICY.md
@@ -1,72 +1,158 @@
-# Privacy Policy
+# Privacy Policy for CardSnap
-**Last updated:** April 5, 2026
+**Last Updated: March 2026**
## Overview
-CardSnap ("we", "our", or "us") is committed to protecting your privacy. This Privacy Policy explains how we handle information when you use our CardSnap mobile application ("App").
+CardSnap is designed with privacy as a core principle. This document explains how we handle your data.
-## Information We Collect
+## Data Collection and Processing
-### Information You Provide
-- **Scanned Contact Data**: When you scan a business card, the extracted contact information is stored locally on your device.
-- **Account Information**: If you choose to sync contacts, we may collect minimal account data.
+### Camera Access
-### Information Collected Automatically
-- **Device Information**: We collect basic device information (Android version, device model) for crash reporting.
-- **Usage Data**: We may collect anonymous usage statistics to improve the app.
+CardSnap requires camera access to scan business cards. When you use the scan feature:
-### Camera Access
-- CardSnap requires camera access to scan business cards.
-- Camera images are processed locally on your device and are not uploaded to any server.
-- OCR processing happens entirely on-device using Google ML Kit.
+- The camera captures an image of the business card
+- OCR (Optical Character Recognition) processes the image **on your device**
+- The image is processed and then discarded immediately
+- **No images are uploaded to any server**
+
+### OCR Processing
-## How We Use Your Information
+We use Google ML Kit for on-device OCR. This means:
-We use the information we collect to:
-- Provide, maintain, and improve the CardSnap app
-- Process and save scanned business card data to your device
-- Respond to your comments and questions
+- All text recognition happens locally on your device
+- No internet connection is required for scanning
+- Your business card images never leave your device
-## Data Storage
+### Data Storage
-- **All scanned data is stored locally on your device** using Room Database.
-- **No data is sent to our servers** during normal app operation.
-- **Settings are stored locally** using Android DataStore Preferences.
-- You can delete all stored data at any time through the app's Settings > Reset All Data.
+All data is stored **locally on your device** using secure storage:
-## Data Sharing
+- Contact information you save (names, emails, phone numbers, etc.)
+- App settings and preferences
+- No data is stored on cloud servers
-We do not sell, trade, or otherwise transfer your personal information to outside parties.
+### What We DON'T Collect
+
+- We do not collect any personally identifiable information
+- We do not track your location
+- We do not analyze usage patterns
+- We do not share any data with third parties
+- We do not display advertisements
## Third-Party Services
-CardSnap uses the following third-party services:
+### Google ML Kit OCR
+
+- **Purpose**: Text recognition from business card images
+- **Data Processed**: Camera images of business cards
+- **Processing Location**: On-device (your phone/tablet)
+- **Data Retention**: Images are processed and discarded immediately
+- **Privacy Policy**: [Google ML Kit Privacy](https://policies.google.com/privacy)
+
+### React Native Libraries
+
+- react-native-vision-camera: Camera access
+- rn-mlkit-ocr: On-device OCR processing
+- @react-native-async-storage/async-storage: Local encrypted storage
+
+## Data Security
+
+Your data is protected by:
-| Service | Purpose | Privacy Policy |
-|---------|---------|----------------|
-| Google ML Kit | On-device OCR text recognition | [Google Privacy](https://policies.google.com/privacy) |
-| Google Play Services | App functionality | [Google Privacy](https://policies.google.com/privacy) |
+- Device-level encryption
+- Secure storage mechanisms provided by iOS and Android
+- On-device processing (no network transmission)
-## Your Rights
+## User Rights
-You have the right to:
-- Access your stored data (all data is stored locally on your device)
-- Delete your stored data (Settings > Reset All Data)
-- Revoke camera or contacts permissions at any time through device settings
+### Data Access
+
+You can view all saved contacts within the app at any time.
+
+### Data Deletion
+
+- **Delete Individual Contacts**: Use the delete option in the app
+- **Delete All Data**: Use "Reset App" in Settings to delete all saved data
+- Uninstalling the app will remove all app data from your device
+
+### Data Portability
+
+Export your contacts in standard formats:
+
+- vCard (.vcf) format - compatible with all major contact apps
+- CSV format - for spreadsheet applications
## Children's Privacy
-CardSnap does not knowingly collect personal information from children under 13.
+CardSnap is not intended for use by children under the age of 13. We do not knowingly collect information from children under 13.
+
+## International Compliance
+
+### GDPR (European Union)
+
+If you are in the EU:
-## Changes to This Policy
+- You have the right to access your data
+- You have the right to delete your data
+- You have the right to data portability
+- You have the right to object to processing
-We may update this Privacy Policy from time to time. We will notify you of any changes by posting the new policy on this page.
+### CCPA (California)
+
+California residents have the right to:
+
+- Know what personal information is collected
+- Know whether personal information is sold or disclosed
+- Say no to the sale of personal information
+- Access their personal information
+- Request deletion of personal information
## Contact Us
-If you have questions about this Privacy Policy, please contact us:
+For privacy-related questions or concerns:
+
+**Email**: privacy@cardsnap.com
+
+**Response Time**: We aim to respond within 48 hours
+
+## Policy Updates
+
+We may update this privacy policy periodically. Any changes will be reflected in the "Last Updated" date at the top of this document.
+
+## App Store Compliance
+
+### Apple App Store
+
+This app complies with Apple's App Store Review Guidelines regarding privacy. Camera access is only used for the business card scanning feature and all processing occurs on-device.
+
+### Google Play Store
+
+This app complies with Google Play's Data Safety requirements:
+
+- **Data Collection**: Camera images are processed on-device and not uploaded
+- **Data Storage**: All data stored locally on device
+- **Data Sharing**: No data is shared with third parties
+
+## Permissions Required
+
+### iOS
+
+- **Camera**: Used to capture business card images for OCR scanning
+
+### Android
+
+- **Camera**: Used to capture business card images for OCR scanning
+- **Internet**: Required for downloading OCR language packs (optional)
+
+## Summary
-**Email**: privacy@cardsnap.app
+CardSnap is a privacy-focused application:
-**GitHub**: https://github.com/Sensible-Analytics/CardSnap
+- ✅ All processing happens on your device
+- ✅ No data is sent to servers
+- ✅ No user accounts required
+- ✅ No advertising or analytics
+- ✅ Easy data deletion
+- ✅ Export your data anytime
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 23f8dddb..1ef7dbe6 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -1,119 +1,133 @@
-plugins {
- id("com.android.application")
- id("org.jetbrains.kotlin.android")
- id("com.google.devtools.ksp")
+apply plugin: "com.android.application"
+apply plugin: "org.jetbrains.kotlin.android"
+apply plugin: "com.facebook.react"
+
+/**
+ * This is the configuration block to customize your React Native Android app.
+ * By default you don't need to apply any configuration, just uncomment the lines you need.
+ */
+react {
+ /* Folders */
+ // The root of your project, i.e. where "package.json" lives. Default is '..'
+ // root = file("../")
+ // The folder where the react-native NPM package is. Default is ../node_modules/react-native
+ // reactNativeDir = file("../node_modules/react-native")
+ // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen
+ // codegenDir = file("../node_modules/@react-native/codegen")
+ // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
+ // cliFile = file("../node_modules/react-native/cli.js")
+
+ /* Variants */
+ // The list of variants to that are debuggable. For those we're going to
+ // skip the bundling of the JS bundle and the assets. By default is just 'debug'.
+ // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
+ // debuggableVariants = ["liteDebug", "prodDebug"]
+
+ /* Bundling */
+ // A list containing the node command and its flags. Default is just 'node'.
+ // nodeExecutableAndArgs = ["node"]
+ //
+ // The command to run when bundling. By default is 'bundle'
+ // bundleCommand = "ram-bundle"
+ //
+ // The path to the CLI configuration file. Default is empty.
+ // bundleConfig = file(../rn-cli.config.js)
+ //
+ // The name of the generated asset file containing your JS bundle
+ // bundleAssetName = "MyApplication.android.bundle"
+ //
+ // The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
+ // entryFile = file("../js/MyApplication.android.js")
+ //
+ // A list of extra flags to pass to the 'bundle' commands.
+ // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
+ // extraPackagerArgs = []
+
+ /* Hermes Commands */
+ // The hermes compiler command to run. By default it is 'hermesc'
+ // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
+ //
+ // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
+ // hermesFlags = ["-O", "-output-source-map"]
}
+/**
+ * Set this to true to Run Proguard on Release builds to minify the Java bytecode.
+ */
+def enableProguardInReleaseBuilds = false
+
+/**
+ * The preferred build flavor of JavaScriptCore (JSC)
+ *
+ * For example, to use the international variant, you can use:
+ * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
+ *
+ * The international variant includes ICU i18n library and necessary data
+ * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
+ * give correct results when using with locales other than en-US. Note that
+ * this variant is about 6MiB larger per architecture than default.
+ */
+def jscFlavor = 'org.webkit:android-jsc:+'
+
android {
- namespace = "com.cardsnap"
- compileSdk = 35
+ ndkVersion rootProject.ext.ndkVersion
+ buildToolsVersion rootProject.ext.buildToolsVersion
+ compileSdk rootProject.ext.compileSdkVersion
+ namespace "com.cardsnap"
defaultConfig {
- applicationId = "com.cardsnap"
- minSdk = 26
- targetSdk = 34
- versionCode = 1
- versionName = "1.0"
-
- testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
-
- ndk {
- abiFilters += listOf("arm64-v8a")
+ applicationId "com.cardsnap"
+ minSdkVersion rootProject.ext.minSdkVersion
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode 1
+ versionName "1.0"
+ testBuildType System.getProperty("testBuildType", "debug")
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+ signingConfigs {
+ debug {
+ storeFile file('debug.keystore')
+ storePassword 'android'
+ keyAlias 'androiddebugkey'
+ keyPassword 'android'
}
}
-
buildTypes {
+ debug {
+ signingConfig signingConfigs.debug
+ }
release {
- isMinifyEnabled = false
- proguardFiles(
- getDefaultProguardFile("proguard-android-optimize.txt"),
- "proguard-rules.pro"
- )
+ // Caution! In production, you need to generate your own keystore file.
+ // see https://reactnative.dev/docs/signed-apk-android.
+ signingConfig signingConfigs.debug
+ minifyEnabled enableProguardInReleaseBuilds
+ proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
+}
- compileOptions {
- sourceCompatibility = JavaVersion.VERSION_17
- targetCompatibility = JavaVersion.VERSION_17
- }
-
- kotlinOptions {
- jvmTarget = "17"
- }
-
- buildFeatures {
- compose = true
- }
-
- composeOptions {
- kotlinCompilerExtensionVersion = "1.5.8"
+dependencies {
+ // The version of react-native is set by the React Native Gradle Plugin
+ implementation("com.facebook.react:react-android")
+ implementation("androidx.appcompat:appcompat:1.1.0")
+ androidTestImplementation("com.wix:detox:+")
+
+ if (hermesEnabled.toBoolean()) {
+ implementation("com.facebook.react:hermes-android")
+ } else {
+ implementation jscFlavor
}
+}
- packaging {
- resources {
- excludes += "/META-INF/{AL2.0,LGPL2.1}"
- }
+configurations.all {
+ resolutionStrategy {
+ force 'androidx.core:core:1.12.0'
+ force 'androidx.core:core-ktx:1.12.0'
+ force 'androidx.activity:activity:1.8.0'
+ force 'androidx.activity:activity-ktx:1.8.0'
+ force 'androidx.fragment:fragment:1.6.2'
+ force 'androidx.transition:transition:1.5.0'
}
}
-dependencies {
- // Compose
- implementation(platform("androidx.compose:compose-bom:2024.12.01"))
- implementation("androidx.compose.ui:ui")
- implementation("androidx.compose.ui:ui-graphics")
- implementation("androidx.compose.ui:ui-tooling-preview")
- implementation("androidx.compose.material3:material3")
- implementation("androidx.compose.material:material-icons-extended")
- debugImplementation("androidx.compose.ui:ui-tooling")
-
- // Navigation Compose
- implementation("androidx.navigation:navigation-compose:2.8.5")
-
- // Lifecycle
- implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7")
- implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7")
- implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7")
-
- // CameraX
- implementation("androidx.camera:camera-camera2:1.4.1")
- implementation("androidx.camera:camera-lifecycle:1.4.1")
- implementation("androidx.camera:camera-view:1.4.1")
-
- // ML Kit Text Recognition
- implementation("com.google.mlkit:text-recognition:16.0.1")
-
- // Room
- implementation("androidx.room:room-runtime:2.6.1")
- implementation("androidx.room:room-ktx:2.6.1")
- ksp("androidx.room:room-compiler:2.6.1")
-
- // DataStore
- implementation("androidx.datastore:datastore-preferences:1.1.1")
-
- // Coil
- implementation("io.coil-kt:coil-compose:2.7.0")
-
- // VCard
- implementation("com.googlecode.ez-vcard:ez-vcard:0.12.1")
-
- // Coroutines
- implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")
- implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.8.1")
-
- // Activity Compose
- implementation("androidx.activity:activity-compose:1.9.3")
-
- // Core KTX
- implementation("androidx.core:core-ktx:1.15.0")
-
- // Testing
- androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
- androidTestImplementation("androidx.test.espresso:espresso-intents:3.6.1")
- androidTestImplementation("androidx.test.ext:junit:1.2.1")
- androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
- androidTestImplementation("androidx.compose.ui:ui-test-junit4:1.7.6")
- debugImplementation("androidx.compose.ui:ui-test-manifest")
- testImplementation("junit:junit:4.13.2")
- testImplementation("org.mockito:mockito-core:5.14.2")
- testImplementation("org.mockito.kotlin:mockito-kotlin:5.4.0")
-}
+apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 2df6a8a9..c2f8e27d 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -10,7 +10,7 @@
-
+
diff --git a/android/app/src/main/java/com/cardsnap/MainActivity.kt b/android/app/src/main/java/com/cardsnap/MainActivity.kt
index 8ed507ca..e959a36e 100644
--- a/android/app/src/main/java/com/cardsnap/MainActivity.kt
+++ b/android/app/src/main/java/com/cardsnap/MainActivity.kt
@@ -25,7 +25,7 @@ class MainActivity : ComponentActivity() {
private fun handleDeepLink(intent: Intent?) {
val data: Uri? = intent?.data
- if (data != null && data.scheme == "cardsnap" && data.host == "inject") {
+ if (data != null && data.scheme == "cardscanner" && data.host == "inject") {
pendingDeepLinkUri = data.getQueryParameter("imageUri")
}
}
diff --git a/android/app/src/main/java/com/cardsnap/ui/navigation/AppNavigation.kt b/android/app/src/main/java/com/cardsnap/ui/navigation/AppNavigation.kt
index ccf72f88..9c2c18ca 100644
--- a/android/app/src/main/java/com/cardsnap/ui/navigation/AppNavigation.kt
+++ b/android/app/src/main/java/com/cardsnap/ui/navigation/AppNavigation.kt
@@ -20,7 +20,7 @@ fun AppNavigation() {
NavHost(navController = navController, startDestination = "scan") {
composable(
route = "scan",
- deepLinks = listOf(navDeepLink { uriPattern = "cardsnap://inject?imageUri={imageUri}" }),
+ deepLinks = listOf(navDeepLink { uriPattern = "cardscanner://inject?imageUri={imageUri}" }),
arguments = listOf(navArgument("imageUri") { type = NavType.StringType; nullable = true; defaultValue = null })
) { backStackEntry ->
val imageUri = backStackEntry.arguments?.getString("imageUri") ?: MainActivity.pendingDeepLinkUri
diff --git a/android/build.gradle b/android/build.gradle
index 283c61be..6745c500 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,13 +1,32 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
-plugins {
- id("com.android.application") version "8.6.0" apply false
- id("org.jetbrains.kotlin.android") version "1.9.22" apply false
- id("com.google.devtools.ksp") version "1.9.22-1.0.17" apply false
+buildscript {
+ ext {
+ buildToolsVersion = "34.0.0"
+ minSdkVersion = 23
+ compileSdkVersion = 34
+ targetSdkVersion = 34
+ ndkVersion = "25.1.8937393"
+ kotlinVersion = "1.9.22"
+ }
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath("com.android.tools.build:gradle")
+ classpath("com.facebook.react:react-native-gradle-plugin")
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin")
+ }
}
+apply plugin: "com.facebook.react.rootproject"
+
allprojects {
repositories {
google()
mavenCentral()
+ maven {
+ url("$rootDir/../node_modules/detox/Detox-android")
+ }
}
}
diff --git a/android/settings.gradle b/android/settings.gradle
index 942462e3..68ba437f 100644
--- a/android/settings.gradle
+++ b/android/settings.gradle
@@ -1,2 +1,4 @@
rootProject.name = 'CardSnap'
+apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings)
include ':app'
+includeBuild('../node_modules/@react-native/gradle-plugin')
diff --git a/docs/images/screenshots/contacts-list.svg b/docs/images/screenshots/contacts-list.svg
new file mode 100644
index 00000000..00667248
--- /dev/null
+++ b/docs/images/screenshots/contacts-list.svg
@@ -0,0 +1,31 @@
+
diff --git a/docs/images/screenshots/review-contact.svg b/docs/images/screenshots/review-contact.svg
new file mode 100644
index 00000000..fa2ee989
--- /dev/null
+++ b/docs/images/screenshots/review-contact.svg
@@ -0,0 +1,24 @@
+
diff --git a/docs/images/screenshots/scan-screen.svg b/docs/images/screenshots/scan-screen.svg
new file mode 100644
index 00000000..cb00fdd9
--- /dev/null
+++ b/docs/images/screenshots/scan-screen.svg
@@ -0,0 +1,23 @@
+
diff --git a/docs/images/screenshots/settings.svg b/docs/images/screenshots/settings.svg
new file mode 100644
index 00000000..29649791
--- /dev/null
+++ b/docs/images/screenshots/settings.svg
@@ -0,0 +1,26 @@
+
diff --git a/package.json b/package.json
index e2ecac2b..8c6d2555 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
"keywords": [
"kotlin",
"android",
- "card-snap",
+ "card-scanner",
"ocr",
"business-card",
"contact-management",