From b6101a41501f1f29094e1088ea3987e50f0b4a6a Mon Sep 17 00:00:00 2001 From: svc-devrev Date: Tue, 28 Apr 2026 10:48:24 +0000 Subject: [PATCH 1/2] [skip ci] Release v2.3.0 This PR contains the automated release updates for version 2.3.0. Changes: - Updated sample app - Updated documentation - Updated README, CHANGELOG, and MIGRATION guide --- CHANGELOG.md | 44 +- MIGRATION.md | 21 +- README.md | 602 ++++++++++++++++------ devrev-sdk-cordova-2.3.0.tgz | Bin 0 -> 24762 bytes sample/.npmrc.example | 2 + sample/GoogleService-Info.plist | 16 + sample/config.xml | 25 + sample/google-services.json | 18 + sample/js/app.js | 36 -- sample/package.json | 35 ++ sample/{ => www}/css/index.css | 52 ++ sample/{ => www}/delayedScreen.html | 0 sample/www/gallery.html | 28 + sample/{ => www}/identification.html | 0 sample/{ => www}/index.html | 3 +- sample/www/js/app.js | 173 +++++++ sample/{ => www}/js/feature.js | 17 +- sample/{ => www}/largeScrollableList.html | 0 sample/{ => www}/pushNotifications.html | 0 sample/{ => www}/sessionAnalytics.html | 0 sample/{ => www}/support.html | 0 sample/{ => www}/webView.html | 0 22 files changed, 873 insertions(+), 199 deletions(-) create mode 100644 devrev-sdk-cordova-2.3.0.tgz create mode 100644 sample/.npmrc.example create mode 100644 sample/GoogleService-Info.plist create mode 100644 sample/config.xml create mode 100644 sample/google-services.json delete mode 100644 sample/js/app.js create mode 100644 sample/package.json rename sample/{ => www}/css/index.css (73%) rename sample/{ => www}/delayedScreen.html (100%) create mode 100644 sample/www/gallery.html rename sample/{ => www}/identification.html (100%) rename sample/{ => www}/index.html (76%) create mode 100644 sample/www/js/app.js rename sample/{ => www}/js/feature.js (97%) rename sample/{ => www}/largeScrollableList.html (100%) rename sample/{ => www}/pushNotifications.html (100%) rename sample/{ => www}/sessionAnalytics.html (100%) rename sample/{ => www}/support.html (100%) rename sample/{ => www}/webView.html (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d0837f..b3a2d3b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,52 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.3.0] - 2026-04-28 + +### Changed +- Reduced snapshot size and screen capture cost. +- Optimized masking performance for dynamic webviews. + +### Fixed +- Fixed multiple memory leaks and reduced CPU usage during paused recording. +- Fixed crashes and ANRs related to session recording lifecycle. +- Improved web view masking stability. +- Fixed incorrect session engagement time calculation. + +## [2.2.1] - 2026-01-29 + +### Changed +- Lowered the minimum supported Dart SDK to `3.5.0` across the plugin to match current Flutter stable toolchains. +- Improved session replays stabality and performance. +- Reduced log noise. +- [Android] Removed redundant dependencies for reduced SDK size and enhanced security. + +### Fixed +- Fixed session data not found. + +## [2.2.0] - 2025-12-23 + +### Added +- [Android] Support for session capturing on Android 16 devices. +- Support for tracking hybrid platforms and their versions. +- [iOS] Added automatic restoration of sessions lost when the app is killed. +- Introduced a capture error API so apps can report runtime errors through the SDK. + +### Changed +- Improved rage tap detection to avoid misclassifying double taps as rage taps. +- Improved performance and modularity by decoupling the screen recording functionality from the main tracking flow. +- [Android] Optimized session recording and network request handling to reduce overhead during active sessions. + +### Fixed +- Fixed an issue in the logout flow. +- [iOS] Corrected timer response rounding to return accurate durations. +- [Android] Fixed incorrect engagement time calculation in crash scenarios. +- [Android] Fixed ANRs occurring during SDK initialization. + ## [2.1.1] - 2025-07-25 ### Fixed -- Fixed an issue with manual unmasking of input components. +- Fixed an issue with manual unmasking of input components. - Fixed an issue with session uploads when the app is rapidly killed. ## [2.1.0] - 2025-06-27 diff --git a/MIGRATION.md b/MIGRATION.md index a5931ba..4305084 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,18 +1,19 @@ -# Migration Guide +# Migration guide + This guide and chart should help facilitate the transition from the legacy UserExperior SDK to the new DevRev SDK in your Cordova application, providing insights into feature equivalents and method changes. -## Feature Equivalence Chart +## Feature equivalence chart | Feature | UserExperior SDK | DevRev SDK | |-|-|-| -| Installation | `cordova plugin add userexperior-cordova-plugin@` | `cordova plugin add @devrev/sdk-cordova@` | +| Installation | `cordova plugin add userexperior-cordova-plugin@` | `cordova plugin add @devrev/sdk-cordova` | | Initialization | `UserExperior.startRecording(appID)` | `DevRev.configure(appID, successCallback, errorCallback)` | -| User Identification | `UserExperior.setUserIdentifier(userIdentifier)` | `DevRev.identifyAnonymousUser(userID, successCallback, errorCallback)`
`DevRev.identifyUnverifiedUser(identity, successCallback, errorCallback)`
`DevRev.identifyVerifiedUser(userID, sessionToken, successCallback, errorCallback)`
`DevRev.updateUser(identity, successCallback, errorCallback)`
`DevRev.logout(deviceID, successCallback, errorCallback)` | +| User Identification | `UserExperior.setUserIdentifier(userIdentifier)` | `DevRev.identifyAnonymousUser(userID, successCallback, errorCallback)`
`DevRev.identifyUnverifiedUser(identity, successCallback, errorCallback)`
`DevRev.identifyVerifiedUser(userID, sessionToken, successCallback, errorCallback)`
`DevRev.updateUser(identity, successCallback, errorCallback)`
`DevRev.logout(deviceID, successCallback, errorCallback)` | | Event Tracking | `UserExperior.logEvent(name)` | `DevRev.trackEvent(name, properties, successCallback, errorCallback)` | -| Session Recording | `UserExperior.stopRecording()`
`UserExperior.pauseRecording()`
`UserExperior.resumeRecording()` | `DevRev.startRecording(successCallback, errorCallback)`
`DevRev.stopRecording(successCallback, errorCallback)`
`DevRev.pauseRecording(successCallback, errorCallback)`
`DevRev.resumeRecording(successCallback, errorCallback)`
`DevRev.processAllOnDemandSessions(successCallback, errorCallback)` | -| Opting-in or out | `UserExperior.optOut()`
`UserExperior.optIn()`
`UserExperior.getOptOutStatus()` | `DevRev.stopAllMonitoring(successCallback, errorCallback)`
`DevRev.resumeAllMonitoring(successCallback, errorCallback)` | -| Session Properties | `UserExperior.setUserProperties(userProperties)` | `DevRev.addSessionProperties(properties, successCallback, errorCallback)`
`DevRev.clearSessionProperties()` | +| Session Recording | `UserExperior.stopRecording()`
`UserExperior.pauseRecording()`
`UserExperior.resumeRecording()` | `DevRev.startRecording(successCallback, errorCallback)`
`DevRev.stopRecording(successCallback, errorCallback)`
`DevRev.pauseRecording(successCallback, errorCallback)`
`DevRev.resumeRecording(successCallback, errorCallback)` | +| Opt-in or out | `UserExperior.optOut()`
`UserExperior.optIn()`
`UserExperior.getOptOutStatus()` | `DevRev.stopAllMonitoring(successCallback, errorCallback)`
`DevRev.resumeAllMonitoring(successCallback, errorCallback)` | +| Session Properties | `UserExperior.setUserProperties(userProperties)` | `DevRev.addSessionProperties(properties, successCallback, errorCallback)`
`DevRev.clearSessionProperties(successCallback, errorCallback)` | | Masking Sensitive Data | ``
`` | ``
`` | -| Timers | `UserExperior.startTimer(timerName, properties)`
`UserExperior.endTimer(timerName, properties)` | `DevRev.startTimer(name, properties)`
`DevRev.endTimer(name, properties)` | -| PLuG support chat | Not supported. | `DevRev.showSupport(successCallback, errorCallback)`
`DevRev.createSupportConversation(successCallback, errorCallback)`
`DevRev.setShouldDismissModalsOnOpenLink(value, successCallback, errorCallback)`
`DevRevSDK.setInAppLinkHandler(handler, successCallback, errorCallback)` | -| Push Notifications | Not supported. | `DevRev.registerDeviceToken(deviceToken, deviceID, successCallback, errorCallback)`
`DevRev.unregisterDevice(deviceID, successCallback, errorCallback)`
`DevRev.processPushNotification(payload, successCallback, errorCallback)` | +| Timers | `UserExperior.startTimer(timerName, properties)`
`UserExperior.endTimer(timerName, properties)` | `DevRev.startTimer(name, properties, successCallback, errorCallback)`
`DevRev.endTimer(name, properties, successCallback, errorCallback)` | +| Support chat | Not supported. | `DevRev.showSupport(successCallback, errorCallback)`
`DevRev.createSupportConversation(successCallback, errorCallback)`
`DevRev.setShouldDismissModalsOnOpenLink(value, successCallback, errorCallback)`
`DevRev.setInAppLinkHandler(handler, successCallback, errorCallback)` | +| Push Notifications | Not supported. | `DevRev.registerDeviceToken(deviceToken, deviceID, successCallback, errorCallback)`
`DevRev.unregisterDevice(deviceID, successCallback, errorCallback)`
`DevRev.processPushNotification(payload, successCallback, errorCallback)` | diff --git a/README.md b/README.md index 1f0db5a..cfd2d70 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,75 @@ # DevRev SDK for Cordova DevRev SDK, used for integrating DevRev services into your Cordova app. -## Table of contents - [DevRev SDK for Cordova](#devrev-sdk-for-cordova) - - [Table of contents](#table-of-contents) - [Quickstart guide](#quickstart-guide) - [Requirements](#requirements) - [Installation](#installation) - [Set up the DevRev SDK](#set-up-the-devrev-sdk) + - [Update the feature configuration](#update-the-feature-configuration) + - [Feature configuration reference](#feature-configuration-reference) + - [Support widget theme options](#support-widget-theme-options) - [Features](#features) - [Identification](#identification) - - [Anonymous identification](#anonymous-identification) - - [Unverified identification](#unverified-identification) - - [Verified identification](#verified-identification) + - [Identify an unverified user](#identify-an-unverified-user) + - [Identify a verified user](#identify-a-verified-user) - [Generate an AAT](#generate-an-aat) - [Exchange your AAT for a session token](#exchange-your-aat-for-a-session-token) - - [Identifying the verified user](#identifying-the-verified-user) - - [Updating the user](#updating-the-user) + - [Identify the verified user](#identify-the-verified-user) + - [Update the user](#update-the-user) - [Logout](#logout) - - [PLuG support chat](#plug-support-chat) - - [Creating a new support conversation](#creating-a-new-support-conversation) + - [Identity model](#identity-model) + - [Properties](#properties) + - [User traits](#user-traits) + - [Organization traits](#organization-traits) + - [Account traits](#account-traits) + - [Support chat](#support-chat) + - [Create a new support conversation](#create-a-new-support-conversation) - [In-app link handling](#in-app-link-handling) - - [In-app link callback](#in-app-link-callback) + - [Dynamic theme configuration](#dynamic-theme-configuration) - [Analytics](#analytics) - [Session analytics](#session-analytics) - - [Opting-in or out](#opting-in-or-out) + - [Opt in or out](#opt-in-or-out) - [Session recording](#session-recording) - [Session properties](#session-properties) - - [Masking sensitive data](#masking-sensitive-data) - - [Example (masked element):](#example-masked-element) - - [Example (unmasked element):](#example-unmasked-element) + - [Mask sensitive data](#mask-sensitive-data) - [Timers](#timers) - - [Screen tracking](#screen-tracking) - - [Screen transition tracking (Android only)](#screen-transition-tracking-android-only) + - [User interaction tracking](#user-interaction-tracking) + - [Capture errors](#capture-errors) + - [Track screens](#track-screens) + - [Manage screen transitions (Android only)](#manage-screen-transitions-android-only) - [Push notifications](#push-notifications) - [Configuration](#configuration) - [Register for push notifications](#register-for-push-notifications) - [Unregister from push notifications](#unregister-from-push-notifications) - - [Processing push notification](#processing-push-notification) + - [Handle push notifications](#handle-push-notifications) - [Android](#android) - - [Example](#example) - [iOS](#ios) - - [Example](#example-1) - [Sample app](#sample-app) + - [Firebase configuration](#firebase-configuration) + - [Push notifications](#push-notifications-1) + - [Android](#android-1) + - [iOS](#ios-1) + - [Running the app](#running-the-app) + - [Android](#android-2) + - [iOS](#ios-2) - [Troubleshooting](#troubleshooting) + - [ProGuard (Android only)](#proguard-android-only) - [Migration guide](#migration-guide) ## Quickstart guide + +This guide helps you integrate the DevRev SDK into your Cordova app. + ### Requirements + - Cordova 12.0 or later. -- On Android, the minimum API level should be 24. -- On iOS, the minimum deployment target should be 15.0. +- Android: minimum API level 24. +- iOS: minimum deployment target 15.0. +- Recommended: an SSH key configured locally and registered with [GitHub](https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh). ### Installation + To install the DevRev SDK, run the following command: ```sh @@ -60,69 +77,163 @@ cordova plugin add @devrev/sdk-cordova ``` ### Set up the DevRev SDK + 1. Open the DevRev web app at [https://app.devrev.ai](https://app.devrev.ai) and go to the **Settings** page. -2. Under **PLuG settings** copy the value under **Your unique App ID**. -3. After obtaining the credentials, you can configure the DevRev SDK in your app. +2. Under **PLuG settings**, copy the value under **Your unique App ID**. +3. Configure the DevRev SDK in your app using the obtained credentials. -The SDK will be ready for use once you execute the following configuration method. +> [!WARNING] +> The DevRev SDK must be configured before you can use any of its features. + +The SDK becomes ready for use once the configuration API is executed. ```javascript DevRev.configure(appID, successCallback, errorCallback) ``` +To provide a feature configuration during setup, call the overload that accepts it: + +```javascript +DevRev.configure(appID, featureConfiguration, successCallback, errorCallback) +``` + +For default behavior, call the simpler form: + +```javascript +DevRev.configure(appID, function() { + console.log('DevRev SDK configured successfully.'); +}, function(error) { + console.error('Failed to configure DevRev SDK:', error); +}); +``` + +To customize behavior such as frame capture, auto-start recording, or theme preferences, pass a full `FeatureConfiguration` object: + +```javascript +DevRev.configure(appID, { + enableFrameCapture: false, + autoStartRecording: false, + prefersDialogMode: false, + alwaysUseRemoteConfig: true, + supportWidgetTheme: { + prefersSystemTheme: true, + }, +}, function() { + console.log('DevRev SDK configured with FeatureConfiguration.'); +}, function(error) { + console.error('Failed to configure DevRev SDK:', error); +}); +``` + +#### Update the feature configuration + +You can adjust the feature configuration without reconfiguring the SDK. Pass a **full** `FeatureConfiguration` object (all properties are required): + +```javascript +DevRev.updateFeatureConfiguration({ + enableFrameCapture: true, + autoStartRecording: true, + prefersDialogMode: false, + alwaysUseRemoteConfig: true, + supportWidgetTheme: { + prefersSystemTheme: true, + }, +}, function() { + console.log('Feature configuration updated.'); +}, function(error) { + console.error('Failed to update feature configuration:', error); +}); +``` + +#### Feature configuration reference + +`FeatureConfiguration` controls how the SDK behaves both during initial setup and when calling `DevRev.updateFeatureConfiguration(...)`. All properties are required when providing a feature configuration. + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `enableFrameCapture` | `boolean` | `true` | Enables the screen capture pipeline used by session replay. | +| `autoStartRecording` | `boolean` | `true` | Automatically starts recording after the SDK finishes remote configuration. | +| `prefersDialogMode` | `boolean` | `false` | Prefer dialog mode for the support UI (Android only). | +| `alwaysUseRemoteConfig` | `boolean` | `true` | Always use remote config. | +| `supportWidgetTheme` | `SupportWidgetTheme` | — | Controls the appearance of the in-app support widget, including dynamic theme behavior. | + +##### Support widget theme options + +`SupportWidgetTheme` lets you fine-tune the support UI. Use the `supportWidgetTheme` property inside your feature configuration. + +```javascript +var customTheme = { + prefersSystemTheme: false, + primaryTextColor: '#1F2933', + accentColor: '#F97316', + spacing: { + bottom: '20px', + side: '16px' + } +}; +``` + +| Property | Type | Default | Description | +|----------|------|---------|-------------| +| `prefersSystemTheme` | `boolean` | `true` | Follows the device appearance when `true`; otherwise uses your custom colors. | +| `primaryTextColor` | `string?` | — | Hex color string (e.g. `'#000000'`, `'#1F2933'`) for primary text in the support widget. | +| `accentColor` | `string?` | — | Hex color string (e.g. `'#F97316'`, `'#FF0000'`) applied to buttons and highlights. | +| `spacing` | `{ [key: string]: string }?` | — | CSS-like spacing overrides (`bottom` and `side` keys are recognized). | + ## Features + ### Identification + To access certain features of the DevRev SDK, user identification is required. -The identification function should be placed appropriately in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(appID:)` method. +The identification function should be placed appropriately in your app after the user logs in. If you have the user information available at app launch, call the function after the `DevRev.configure(appID)` method. -> [!IMPORTANT] -> On iOS, if you haven't previously identified the user, the DevRev SDK will automatically create an anonymous user for you immediately after the SDK is configured. +> [!TIP] +> If you haven't previously identified the user, the DevRev SDK will automatically create an anonymous user for you immediately after the SDK is configured. -> [!IMPORTANT] -> The `Identity` structure allows for custom fields in the user, organization, and account traits. These fields must be configured through the DevRev app before they can be used. For more information, refer to [Object customization](https://devrev.ai/docs/product/object-customization). +> [!TIP] +> The `Identity` structure allows for custom fields in the user, organization, and account traits. These fields must be configured through the DevRev app before they can be utilized. For more information, refer to [Object customization](https://devrev.ai/docs/product/object-customization). You can select from the following methods to identify users within your application: -#### Anonymous identification -The anonymous identification method allows you to create an anonymous user with an optional user identifier, ensuring that no other data is stored or associated with the user. - -```javascript -DevRev.identifyAnonymousUser(successCallback, errorCallback) -``` +#### Identify an unverified user -#### Unverified identification The unverified identification method identifies users with a unique identifier, but it does not verify their identity with the DevRev backend. ```javascript DevRev.identifyUnverifiedUser(identity, successCallback, errorCallback) ``` -#### Verified identification +#### Identify a verified user + The verified identification method is used to identify users with an identifier unique to your system within the DevRev platform. The verification is done through a token exchange process between you and the DevRev backend. The steps to identify a verified user are as follows: 1. Generate an AAT for your system (preferably through your backend). 2. Exchange your AAT for a session token for each user of your system. -3. Pass the user identifier and the exchanged session token to the `DevRev.identifyVerifiedUser(userID, sessionToken, successCallback, errorCallback)` method. +3. Pass the user identifier and the exchanged session token to the `DevRev.identifyVerifiedUser(_:sessionToken:)` method. -> [!CAUTION] -> For security reasons we **strongly recommend** that the token exchange is executed on your backend to prevent exposing your application access token (AAT). +> [!WARNING] +> For security reasons, it is **strongly recommended** that the token exchange is executed on your backend to prevent exposing your application access token (AAT). ##### Generate an AAT + 1. Open the DevRev web app at [https://app.devrev.ai](https://app.devrev.ai) and go to the **Settings** page. 2. Open the **PLuG Tokens** page. 3. Under the **Application access tokens** panel, click **New token** and copy the token that's displayed. -> [!IMPORTANT] +> [!WARNING] > Ensure that you copy the generated application access token, as you cannot view it again. ##### Exchange your AAT for a session token -In order to proceed with identifying the user, you need to exchange your AAT for a session token. This step will help you identify a user of your own system within the DevRev platform. + +To proceed with identifying the user, you need to exchange your AAT for a session token. This step helps you identify a user of your own system within the DevRev platform. Here is a simple example of an API request to the DevRev backend to exchange your AAT for a session token: -> [!CAUTION] + +> [!WARNING] > Make sure that you replace the `` and `` with the actual values. + ```bash curl \ --location 'https://api.devrev.ai/auth-tokens.create' \ @@ -130,83 +241,157 @@ curl \ --header 'content-type: application/json' \ --header 'authorization: ' \ --data '{ - "rev_info": { - "user_ref": "" - } + "rev_info": { + "user_ref": "" + } }' ``` -The response of the API call will contain a session token that you can use with the verified identification method in your app. +The response of the API call contains a session token that you can use with the verified identification method in your app. -> [!NOTE] +> [!WARNING] > As a good practice, **your** app should retrieve the exchanged session token from **your** backend at app launch or any relevant app lifecycle event. -##### Identifying the verified user +##### Identify the verified user + Pass the user identifier and the exchanged session token to the verified identification method: ```javascript DevRev.identifyVerifiedUser(userID, sessionToken, successCallback, errorCallback) ``` -#### Updating the user +#### Update the user + You can update the user's information using the following method: ```javascript DevRev.updateUser(identity, successCallback, errorCallback) ``` -> [!IMPORTANT] +> [!WARNING] > The `userID` property cannot be updated. #### Logout -You can logout of the current user by using the following method: + +You can log out the current user by using the following method: ```javascript DevRev.logout(deviceID, successCallback, errorCallback) ``` -The user will be logged out by clearing their credentials, as well as unregistering the device from receiving push notifications, and stopping the session recording. +The user is logged out by clearing their credentials, as well as unregistering the device from receiving push notifications, and stopping the session recording. + +#### Identity model + +The `Identity` interface is used to provide user, organization, and account information when identifying users or updating their details. This class is used primarily with the `identifyUnverifiedUser` and `updateUser` methods. + +##### Properties + +The `Identity` class contains the following properties: + +| Property | Type | Required | Description | +|----------|------|----------|-------------| +| `userRef` | `string` | ✅ | A unique identifier for the user | +| `organizationRef` | `string OR null` | ❌ | An identifier for the user's organization | +| `accountRef` | `string OR null` | ❌ | An identifier for the user's account | +| `userTraits` | `UserTraits OR null` | ❌ | Additional information about the user | +| `organizationTraits` | `OrganizationTraits OR null` | ❌ | Additional information about the organization | +| `accountTraits` | `AccountTraits OR null` | ❌ | Additional information about the account | + +> [!NOTE] +> The custom fields properties defined as part of the user, organization and account traits, must be configured in the DevRev web app **before** they can be used. See [Object customization](https://devrev.ai/docs/product/object-customization) for more information. + +###### User traits + +The `UserTraits` class contains detailed information about the user: + +> [!NOTE] +> All properties in `UserTraits` are optional. + +| Property | Type | Description | +|----------|------|-------------| +| `displayName` | `string OR null` | The displayed name of the user | +| `email` | `string OR null` | The user's email address | +| `fullName` | `string OR null` | The user's full name | +| `description` | `string OR null` | A description of the user | +| `customFields` | `{ [key: string]: any }` | Dictionary of custom fields configured in DevRev | + +###### Organization traits + +The `OrganizationTraits` class contains detailed information about the organization: + +> [!NOTE] +> All properties in `OrganizationTraits` are optional. +| Property | Type | Description | +|----------|------|-------------| +| `displayName` | `string OR null` | The displayed name of the organization | +| `domain` | `string OR null` | The organization's domain | +| `description` | `string OR null` | A description of the organization | +| `phoneNumbers` | `string[] OR null` | Array of the organization's phone numbers | +| `tier` | `string OR null` | The organization's tier or plan level | +| `customFields` | `{ [key: string]: any }` | Dictionary of custom fields configured in DevRev | + +###### Account traits + +The `AccountTraits` class contains detailed information about the account: + +> [!NOTE] +> All properties in `AccountTraits` are optional. + +| Property | Type | Description | +|----------|------|-------------| +| `displayName` | `string OR null` | The displayed name of the account | +| `domains` | `string[] OR null` | Array of domains associated with the account | +| `description` | `string OR null` | A description of the account | +| `phoneNumbers` | `string[] OR null` | Array of the account's phone numbers | +| `websites` | `string[] OR null` | Array of websites associated with the account | +| `tier` | `string OR null` | The account's tier or plan level | +| `customFields` | `{ [key: string]: any }` | Dictionary of custom fields configured in DevRev | + +### Support chat -### PLuG support chat Once user identification is complete, you can start using the chat (conversations) dialog supported by our DevRev SDK. The support chat feature can be shown as a modal screen from the top-most screen. -> [!IMPORTANT] -> This feature requires the SDK to be configured and the user to be identified, whether they are unverified or anonymous. +To show the support chat screen in your app, you can use the following method: ```javascript DevRev.showSupport(successCallback, errorCallback) ``` -#### Creating a new support conversation +#### Create a new support conversation + You can initiate a new support conversation directly from your app. This method displays the support chat screen and simultaneously creates a new conversation. ```javascript -DevRev.createSupportConversation(isAnimated, successCallback, errorCallback) +DevRev.createSupportConversation(successCallback, errorCallback) ``` ### In-app link handling -In certain cases, tapping links in the support chat opens them in the app instead of a browser. You can control whether the chat modal screen is dismissed after the link is opened by calling the following method: + +The DevRev SDK provides a mechanism to handle links opened from within any screen that is part of the DevRev SDK. + +You can fully customize the link handling behavior by setting the specialized in-app link handler. That way you can decide what should happen when a link is opened from within the app. ```javascript -DevRevSDK.setShouldDismissModalsOnOpenLink(value, successCallback, errorCallback) +DevRev.setInAppLinkHandler(handler, successCallback, errorCallback) ``` -Setting this flag to true applies the system's default behavior for opening links, which includes dismissing any DevRev modal screens to facilitate handling your own deep links. +You can further customize the behavior by setting the `setShouldDismissModalsOnOpenLink` boolean flag. This flag controls whether the DevRev SDK should dismiss the top-most modal screen when a link is opened. -#### In-app link callback -> [!NOTE] -> This feature is for Android only. +```javascript +DevRev.setShouldDismissModalsOnOpenLink(value, successCallback, errorCallback) +``` + +### Dynamic theme configuration -For scenarios where custom handling is needed, links from the support chat can be captured with the following method: +The DevRev SDK allows you to configure the theme dynamically based on the system appearance, or use the theme configured on the DevRev portal. By default, the theme is dynamic and follows the system appearance. ```javascript -DevRevSDK.setInAppLinkHandler(handler, successCallback, errorCallback) +DevRev.setPrefersSystemTheme(value, successCallback, errorCallback) ``` ### Analytics -> [!IMPORTANT] -> This feature requires the SDK to be configured and the user to be identified, whether they are unverified or anonymous. The DevRev SDK allows you to send custom analytic events by using a properties map. You can track these events using the following function: @@ -215,9 +400,11 @@ DevRev.trackEvent(name, properties, successCallback, errorCallback) ``` ### Session analytics + The DevRev SDK offers session analytics features to help you understand how users interact with your app. -#### Opting-in or out +#### Opt in or out + Session analytics features are opted-in by default, enabling them from the start. However, you can opt-out using the following method: ```javascript @@ -231,20 +418,24 @@ DevRev.resumeAllMonitoring(successCallback, errorCallback) ``` #### Session recording -You can enable session recording to record user interactions with your app. -> [!CAUTION] +You can enable session recording to capture user interactions with your app. + +> [!NOTE] > The session recording feature is opt-out and is enabled by default. The session recording feature includes the following methods to control the recording: -- `DevRev.startRecording(successCallback, errorCallback)`: Starts the session recording. -- `DevRev.stopRecording(successCallback, errorCallback)`: Stops the session recording and upload it to the portal. -- `DevRev.pauseRecording(successCallback, errorCallback)`: Pauses the ongoing session recording. -- `DevRev.resumeRecording(successCallback, errorCallback)`: Resumes a paused session recording. -- `DevRev.processAllOnDemandSessions(successCallback, errorCallback)`: Stops the ongoing session recording and upload all offline sessions on demand, including the current one. +| Method | Action | +|--------------------------------------------------------------------|-----------------------------------------------------------| +|`DevRev.startRecording(successCallback, errorCallback)` | Starts the session recording. | +|`DevRev.stopRecording(successCallback, errorCallback)` | Ends the session recording and uploads it to the portal. | +|`DevRev.pauseRecording(successCallback, errorCallback)` | Pauses the ongoing session recording. | +|`DevRev.resumeRecording(successCallback, errorCallback)` | Resumes a paused session recording. | +|`DevRev.processAllOnDemandSessions(successCallback, errorCallback)` | Stops the ongoing user recording and sends all on-demand sessions along with the current recording. | #### Session properties + You can add custom properties to the session recording to help you understand the context of the session. The properties are defined as a map of string values. ```javascript @@ -257,27 +448,28 @@ To clear the session properties in scenarios such as user logout or when the ses DevRev.clearSessionProperties(successCallback, errorCallback) ``` -#### Masking sensitive data -To protect sensitive data, the DevRev SDK provides an auto-masking feature that masks data before sending to the server. Input views such as text fields, text views, and web views are automatically masked. +#### Mask sensitive data -While the auto-masking mechanism might be sufficient for most cases, to explicitly mask any WebView element on a webpage, use the CSS class `devrev-mask`. This ensures that sensitive elements, such as confidential text, remain hidden. +To protect sensitive data, the DevRev SDK provides an auto-masking feature that masks data before sending to the server. Input views such as password text fields are automatically masked. -##### Example (masked element): -```html - -``` +While the auto-masking feature is sufficient for most situations, you can manually mark/unmark additional views as sensitive. -If any previously masked views need to be unmasked, you can use the following method: +To mark elements as sensitive inside a web view (`WebView`), apply the `devrev-mask` CSS class. To unmark them, use `devrev-unmask`. -##### Example (unmasked element): -```html - -``` +- Mark an element as masked: + ```html + + ``` +- Mark an element as unmasked: + ```html + + ``` #### Timers + The DevRev SDK offers a timer mechanism to measure the time spent on specific tasks, allowing you to track events such as response time, loading time, or any other duration-based metrics. -The mechanism uses balanced start and stop methods, both of which accept a timer name and an optional dictionary of properties. +The mechanism works using balanced start and stop methods that both accept a timer name and an optional dictionary of properties. To start a timer, use the following method: @@ -291,39 +483,92 @@ To stop a timer, use the following method: DevRev.endTimer(name, properties, successCallback, errorCallback) ``` -#### Screen tracking -The DevRev SDK offers automatic screen tracking to help you understand how users navigate through your app. Although view controllers are automatically tracked, you can manually track screens using the following method: +#### User interaction tracking + +The DevRev SDK automatically tracks user interactions such as taps, swipes, and scrolls. However, in some cases you may want to disable this tracking to prevent sensitive user actions from being recorded. + +To **temporarily disable** user interaction tracking, use the following method: + +```javascript +DevRev.pauseUserInteractionTracking(successCallback, errorCallback) +``` + +To **resume** user interaction tracking, use the following method: + +```javascript +DevRev.resumeUserInteractionTracking(successCallback, errorCallback) +``` + +#### Capture errors + +You can report a handled error from a catch block using the `captureError` function. + +This ensures that even if the error is handled in your app, it will still be logged for diagnostics. ```javascript -DevRev.trackScreenName(screenName, successCallback, errorCallback) +DevRev.captureError( + error, + tag +) ``` -#### Screen transition tracking (Android only) -On Android, the DevRev SDK provides methods to manually track the screen transitions. +**Example:** -When a screen transition begins, you must call the following method: +```javascript +try { +} catch (e) { + DevRev.captureError( + e, + 'network-failure' + ); +} +``` + +**Example with Error:** ```javascript -DevRev.setInScreenTransitioning(true, successCallback, errorCallback) +try { + throw new Error('Something went wrong'); +} catch (e) { + DevRev.captureError(e, 'custom-error'); +} +``` + +#### Track screens + +The DevRev SDK offers automatic screen tracking to help you understand how users navigate through your app. Although screens are automatically tracked, you can manually track screens using the following method: + +```javascript +DevRev.trackScreenName(name, successCallback, errorCallback) ``` -When a screen transition ends, you must call the following method: +#### Manage screen transitions (Android only) + +The DevRev SDK allows tracking of screen transitions to understand the user navigation within your app. +You can manually update the state using the following methods: ```javascript +// Mark the transition as started. +DevRev.setInScreenTransitioning(true, successCallback, errorCallback) + +// Mark the transition as ended. DevRev.setInScreenTransitioning(false, successCallback, errorCallback) ``` ### Push notifications -You can configure your app to receive push notifications from the DevRev SDK. The SDK is able to handle push notifications and execute actions based on the notification's content. -The DevRev backend sends push notifications to your app to notify users about new messages in the PLuG support chat. +You can configure your app to receive push notifications from the DevRev SDK. The SDK is designed to handle push notifications and execute actions based on the notification's content. + +The DevRev backend sends push notifications to your app to alert users about new messages in the support chat. #### Configuration -To receive push notifications, you need to configure your DevRev organization by following the instructions in the [push notifications](https://developer.devrev.ai/public/sdks/mobile/push-notification) section. + +To receive push notifications, you need to configure your DevRev organization by following the instructions in the [push notifications](https://developer.devrev.ai/sdks/mobile/push-notifications) section. #### Register for push notifications -> [!IMPORTANT] -> To ensure delivery to the correct user, push notifications require that the SDK has been configured and the user has been identified. + +> [!NOTE] +> Push notifications require SDK configuration and user identification, whether unverified or verified, to ensure delivery to the correct user. The DevRev SDK offers a method to register your device for receiving push notifications. You can register for push notifications using the following method: @@ -331,9 +576,10 @@ The DevRev SDK offers a method to register your device for receiving push notifi DevRev.registerDeviceToken(deviceToken, deviceID, successCallback, errorCallback) ``` -On Android devices, the `deviceToken` must be the Firebase Cloud Messaging (FCM) token value. On iOS devices, it must be the Apple Push Notification Service (APNs) token. +On Android devices, the `deviceToken` should be the Firebase Cloud Messaging (FCM) token value, while on iOS devices, it should be the Apple Push Notification service (APNs) token. #### Unregister from push notifications + If your app no longer needs to receive push notifications, you can unregister the device. Use the following method to unregister the device: @@ -342,10 +588,10 @@ Use the following method to unregister the device: DevRev.unregisterDevice(deviceID, successCallback, errorCallback) ``` -The method requires the device identifier, which should be the same as the one used when registering the device. +#### Handle push notifications -#### Processing push notification ##### Android + On Android, notifications are implemented as data messages to offer flexibility. However, this means that automatic click processing isn't available. To handle notification clicks, developers need to intercept the click event, extract the payload, and pass it to a designated method for processing. This custom approach enables tailored notification handling in Android applications. To process the notification, use the following method: @@ -353,63 +599,65 @@ To process the notification, use the following method: ```javascript DevRev.processPushNotification(payload, successCallback, errorCallback) ``` -Here, the `message` object from the notification payload needs to be passed to this function. -###### Example +Here, the `message` object from the notification payload should be passed to this function. + +For example: ```javascript const notificationPayload = { - "message": { - "title": "New Message", - "body": "You have received a new message.", - "data": { - "messageId": "12345", - "sender": "John Doe" - } - } + "message": { + "title": "New Message", + "body": "You have received a new message.", + "data": { + "messageId": "12345", + "sender": "John Doe" + } + } }; const messageJson = notificationPayload["message"]; DevRev.processPushNotification(messageJson, function() { - console.log("Push notification processed successfully."); + console.log("Push notification processed successfully."); }, function(error) { - console.error("Failed to process push notification:", error); + console.error("Failed to process push notification:", error); }); ``` ##### iOS -On iOS devices, you must pass the received push notification payload to the DevRev SDK for processing. The SDK will then handle the notification and execute the necessary actions. + +On iOS devices, you must pass the received push notification payload to the DevRev SDK for processing. The SDK handles the notification and executes the necessary actions. ```javascript DevRev.processPushNotification(payload, successCallback, errorCallback) ``` -###### Example +For example: ```javascript const notificationPayload = { - "message": { - "title": "New Message", - "body": "You have received a new message.", - "data": { - "messageId": "12345", - "sender": "John Doe" - } - } + "message": { + "title": "New Message", + "body": "You have received a new message.", + "data": { + "messageId": "12345", + "sender": "John Doe" + } + } }; const messageJson = notificationPayload["message"]; DevRev.processPushNotification(messageJson, function() { - console.log("Push notification processed successfully."); + console.log("Push notification processed successfully."); }, function(error) { - console.error("Failed to process push notification:", error); + console.error("Failed to process push notification:", error); }); ``` ## Sample app -A sample app with use cases for the DevRev Cordova plugin has been provided as a part of our [public repository](https://github.com/devrev/devrev-sdk-cordova). To set up and run the sample app: +A sample app with use cases for the DevRev Cordova plugin is provided as part of our [public repository](https://github.com/devrev/devrev-sdk-cordova). To set up and run the sample app: ```sh cd sample @@ -418,34 +666,90 @@ cordova platform add android cordova platform add ios ``` -- **On Android:** - ```sh - cordova run android - ``` - OR open `platforms/android` in Android Studio and run the app. +### Firebase configuration +To enable push notifications in the sample app, you need to set up your Firebase project and replace the provided dummy configuration files for both Android and iOS. + +#### Push notifications + +##### Android + +1. Go to the [Firebase Console](https://console.firebase.google.com/). +2. Create a new project or select an existing one. +3. Add an Android app (if not already added). Ensure the **Package Name** matches your Cordova app ID. +4. Go to **Project Settings** and download the `google-services.json` file. +5. Replace the `samples/google-services.json` file with the downloaded file. + +##### iOS + +1. Go to the [Firebase Console](https://console.firebase.google.com/). +2. Create a new project or select an existing one. +3. Add an iOS app (if not already added). Ensure the **Bundle ID** matches your Cordova app ID. +4. Go to **Project Settings** and download the `GoogleService-Info.plist` file. +5. Replace the `samples/GoogleService-Info.plist` file with the downloaded file. + +> [!WARNING] +> The provided configuration files contain dummy placeholder values and must be replaced with your actual Firebase project configuration files to ensure proper push notifications functionality. + +#### Running the app + +##### Android + +```sh +cordova run android +``` +OR open `platforms/android` in Android Studio and run the app. + +##### iOS -- **On iOS:** 1. Open `platforms/ios/Podfile` and ensure it contains: - ```ruby - platform :ios, '15.0' - ``` +```ruby +platform :ios, '15.0' +``` 2. Install dependencies: - ```sh - cd platforms/ios - pod install - ``` +```sh +cd platforms/ios +pod install +``` 3. Run the app: - ```sh - cordova run ios - ``` - OR open `DevRevSDKSample.xcworkspace` in Xcode and run the app. +```sh +cordova run ios +``` +OR open `DevRevSDKSample.xcworkspace` in Xcode and run the app. ## Troubleshooting -- **Issue**: Support chat won't show. - **Solution**: Ensure you have correctly called one of the identification methods: `DevRev.identifyUnverifiedUser(...)`, `DevRev.identifyVerifiedUser(...)`, or `DevRev.identifyAnonymousUser(...)`. + +- **Issue**: Support chat doesn't show. + **Solution**: Ensure you have correctly called one of the identification methods: `DevRev.identifyUnverifiedUser(...)` or `DevRev.identifyVerifiedUser(...)`. - **Issue**: Not receiving push notifications. **Solution**: Ensure that your app is configured to receive push notifications and that your device is registered with the DevRev SDK. +### ProGuard (Android only) + +When trying to build your app for Android with ProGuard enabled, refer to these common issues and their solutions. + +> [!NOTE] +> You can always refer to the [Android ProGuard documentation](https://developer.android.com/topic/performance/app-optimization/enable-app-optimization#proguard) for more information. + +- **Issue**: Missing class `com.google.android.play.core.splitcompat.SplitCompatApplication`. + **Solution**: Add the following line to your `proguard-rules.pro` file: + ```proguard + -dontwarn com.google.android.play.core.** + ``` + +- **Issue**: Missing class issue due to transitive Flutter dependencies. + **Solution**: Add the following lines to your `proguard-rules.pro` file: + ```proguard + -keep class io.flutter.** { *; } + -keep class io.flutter.plugins.** { *; } + -keep class GeneratedPluginRegistrant { *; } + ``` + +- **Issue**: Missing class `org.s1f4j.impl.StaticLoggerBinder`. + **Solution**: Add the following line to your `proguard-rules.pro` file: + ```proguard + -dontwarn org.slf4j.impl.StaticLoggerBinder + ``` + ## Migration guide If you are migrating from the legacy UserExperior SDK to the new DevRev SDK, please refer to the [Migration Guide](./MIGRATION.md) for detailed instructions and feature equivalence. diff --git a/devrev-sdk-cordova-2.3.0.tgz b/devrev-sdk-cordova-2.3.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..380530500e9fc71c1be86d47eaa087a14137bf27 GIT binary patch literal 24762 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 + + + + API_KEY + DUMMY_API_KEY + CLIENT_ID + DUMMY_CLIENT_ID + GOOGLE_APP_ID + 1:1234567890:ios:abcdef123456 + PROJECT_ID + dummy-project + BUNDLE_ID + com.example.dummy + + diff --git a/sample/config.xml b/sample/config.xml new file mode 100644 index 0000000..696b6db --- /dev/null +++ b/sample/config.xml @@ -0,0 +1,25 @@ + + + DevRevSDK (Cordova) + DevRev SDK for Cordova sample app. + + DevRev + + + + + + + + + This app needs camera access to take photos for testing session replay + + + This app needs photo library access to select images for testing session replay + + + + + + + diff --git a/sample/google-services.json b/sample/google-services.json new file mode 100644 index 0000000..29a90b1 --- /dev/null +++ b/sample/google-services.json @@ -0,0 +1,18 @@ +{ + "project_info": { + "project_number": "1234567890", + "project_id": "dummy-project" + }, + "client": [{ + "client_info": { + "mobilesdk_app_id": "1:1234567890:android:abcdef123456", + "android_client_info": { + "package_name": "ai.devrev.sdk.bridge.cordova.sample" + } + }, + "api_key": [{ + "current_key": "DUMMY_API_KEY" + }] + }], + "configuration_version": "1" +} diff --git a/sample/js/app.js b/sample/js/app.js deleted file mode 100644 index b9736ce..0000000 --- a/sample/js/app.js +++ /dev/null @@ -1,36 +0,0 @@ -document.addEventListener('DOMContentLoaded', function() { - const backButton = document.getElementById('backButton'); - if (backButton) { - backButton.addEventListener('click', function() { - window.history.back(); - }); - } -}); - -// Cordova Device Ready Event -document.addEventListener('deviceready', function() { - const deviceReadyElement = document.getElementById('deviceready'); - deviceReadyElement?.classList.add('ready'); - - deviceReadyElement?.classList.add('configuring'); - DevRev.configure('', function() { - console.log('DevRev SDK configured successfully.'); - deviceReadyElement?.classList.remove('configuring'); - deviceReadyElement?.classList.add('configured'); - }, function(error) { - console.error('Failed to configure DevRev SDK:', error); - deviceReadyElement?.classList.remove('configuring'); - deviceReadyElement?.classList.add('error'); - }); - - cordova.plugins.firebase.messaging.requestPermission(); - - cordova.plugins.firebase.messaging.getToken().then(function(token) { - console.log('Got device token: ', token); - }); - cordova.plugins.firebase.messaging.onTokenRefresh(function(refreshedToken) { - console.log('Refreshed FCM token:', refreshedToken); - }); - - console.log('Running cordova-' + cordova.platformId + '@' + cordova.version); -}, false); diff --git a/sample/package.json b/sample/package.json new file mode 100644 index 0000000..dde73f5 --- /dev/null +++ b/sample/package.json @@ -0,0 +1,35 @@ +{ + "name": "ai.devrev.sdk.bridge.cordova.sample", + "displayName": "DevRevSDK (Cordova)", + "version": "2.3.0", + "description": "DevRev SDK for Cordova sample app.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [ + "ecosystem:cordova" + ], + "author": { + "name": "DevRev", + "email": "support@devrev.ai", + "url": "https://devrev.ai" + }, + "license": "Apache-2.0", + "cordova": { + "plugins": { + "cordova-plugin-device": {}, + "cordova-plugin-firebase-messaging": { + "ANDROID_FIREBASE_BOM_VERSION": "32.5.0" + }, + "@devrev/sdk-cordova": {} + }, + "platforms": [] + }, + "devDependencies": { + "@devrev/sdk-cordova": "2.3.0", + "cordova-plugin-device": "^3.0.0", + "cordova-plugin-firebase-messaging": "^8.0.1", + "cordova-support-android-plugin": "~2.0.4" + } +} diff --git a/sample/css/index.css b/sample/www/css/index.css similarity index 73% rename from sample/css/index.css rename to sample/www/css/index.css index 2e4898b..3f683d7 100644 --- a/sample/css/index.css +++ b/sample/www/css/index.css @@ -140,3 +140,55 @@ li:active { margin-bottom: 10px; padding: 15px; } + +/* Image Gallery */ +.image-preview { + display: none; + padding: 20px; + background: #fff; + margin: 20px 0; + border-radius: 10px; +} + +.image-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); + gap: 15px; + margin-top: 15px; +} + +.gallery-item { + position: relative; + width: 100%; + padding-top: 100%; + overflow: hidden; + border-radius: 8px; +} + +.gallery-item img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; +} + +.gallery-item-remove { + position: absolute; + top: 5px; + right: 5px; + width: 30px; + height: 30px; + border-radius: 50%; + background: rgba(255, 0, 0, 0.8); + color: white; + border: none; + font-size: 20px; + font-weight: bold; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + line-height: 1; +} diff --git a/sample/delayedScreen.html b/sample/www/delayedScreen.html similarity index 100% rename from sample/delayedScreen.html rename to sample/www/delayedScreen.html diff --git a/sample/www/gallery.html b/sample/www/gallery.html new file mode 100644 index 0000000..f018f3a --- /dev/null +++ b/sample/www/gallery.html @@ -0,0 +1,28 @@ + + + + + + + Gallery + + +
+ +

Gallery

+
+ +
+
    +
    + +
    +

    Selected Images

    +
    +
    + + + + + + diff --git a/sample/identification.html b/sample/www/identification.html similarity index 100% rename from sample/identification.html rename to sample/www/identification.html diff --git a/sample/index.html b/sample/www/index.html similarity index 76% rename from sample/index.html rename to sample/www/index.html index 6e1704a..c33314f 100644 --- a/sample/index.html +++ b/sample/www/index.html @@ -2,10 +2,9 @@ - + - DevRevSDK Sample diff --git a/sample/www/js/app.js b/sample/www/js/app.js new file mode 100644 index 0000000..ab24b38 --- /dev/null +++ b/sample/www/js/app.js @@ -0,0 +1,173 @@ +var capturedImages = []; +var capturedImageSources = new Set(); + +document.addEventListener('DOMContentLoaded', function() { + const backButton = document.getElementById('backButton'); + if (backButton) { + backButton.addEventListener('click', function() { + window.history.back(); + }); + } +}); + +// Cordova Device Ready Event +document.addEventListener('deviceready', function() { + const deviceReadyElement = document.getElementById('deviceready'); + deviceReadyElement?.classList.add('ready'); + + deviceReadyElement?.classList.add('configuring'); + DevRev.configure('', function() { + console.log('DevRev SDK configured successfully.'); + deviceReadyElement?.classList.remove('configuring'); + deviceReadyElement?.classList.add('configured'); + }, function(error) { + console.error('Failed to configure DevRev SDK:', error); + deviceReadyElement?.classList.remove('configuring'); + deviceReadyElement?.classList.add('error'); + }); + + cordova.plugins.firebase.messaging.requestPermission(); + + cordova.plugins.firebase.messaging.getToken().then(function(token) { + console.log('Got device token: ', token); + }); + cordova.plugins.firebase.messaging.onTokenRefresh(function(refreshedToken) { + console.log('Refreshed FCM token:', refreshedToken); + }); + + console.log('Running cordova-' + cordova.platformId + '@' + cordova.version); +}, false); + +function takePicture() { + if(!navigator.camera) { + console.log('Camera Plugin not available'); + return; + } + navigator.camera.getPicture(onCameraSuccess, onPhotoError, { + quality: 50, + destinationType: Camera.DestinationType.DATA_URL, + sourceType: Camera.PictureSourceType.CAMERA, + encodingType: Camera.EncodingType.JPEG, + mediaType: Camera.MediaType.PICTURE, + correctOrientation: true, + saveToPhotoAlbum: false, + targetWidth: 800, + targetHeight: 800 + }); +} + +function selectFromGallery() { + var galleryStartTime = performance.now(); + if(navigator.camera) { + navigator.camera.getPicture(function(imageData) { + onGallerySuccess(imageData); + console.log('[Gallery] Time to load: ' + Math.round(performance.now() - galleryStartTime) + 'ms (1 image)'); + }, onPhotoError, { + quality: 50, + destinationType: Camera.DestinationType.DATA_URL, + sourceType: Camera.PictureSourceType.PHOTOLIBRARY, + encodingType: Camera.EncodingType.JPEG, + mediaType: Camera.MediaType.PICTURE, + correctOrientation: true, + targetWidth: 800, + targetHeight: 800 + }); + } else { + console.log('No gallery plugin available'); + } +} + +function onCameraSuccess() { + console.log('onCameraSuccess called'); +} + +function onGallerySuccess(imageData) { + console.log('onGallerySuccess called'); + var dataUrl = imageData.startsWith('data:') ? imageData : 'data:image/jpeg;base64,' + imageData; + if(capturedImageSources.has(dataUrl)) { + console.log('Skipping duplicate image'); + return; + } + capturedImageSources.add(dataUrl); + capturedImages.push(dataUrl); + appendImageToGrid(dataUrl); +} + +function appendImageToGrid(imageData) { + var imagePreview = document.getElementById('imagePreview'); + var imageGrid = document.getElementById('imageGrid'); + + if(!imagePreview || !imageGrid) { + console.error('Image display elements not found'); + return; + } + + imagePreview.style.display = 'block'; + imageGrid.appendChild(createGalleryItem(imageData, capturedImages.length - 1)); +} + +function displayImages() { + var imagePreview = document.getElementById('imagePreview'); + var imageGrid = document.getElementById('imageGrid'); + if(!imagePreview || !imageGrid) return; + + imageGrid.innerHTML = ''; + if(capturedImages.length === 0) { + imagePreview.style.display = 'none'; + return; + } + imagePreview.style.display = 'block'; + capturedImages.forEach(function(imageData, index) { + imageGrid.appendChild(createGalleryItem(imageData, index)); + }); +} + +function createGalleryItem(imageData, index) { + var imageContainer = document.createElement('div'); + imageContainer.className = 'gallery-item'; + + var img = document.createElement('img'); + img.src = imageData; + img.classList.add('devrev-mask'); + + var removeBtn = document.createElement('button'); + removeBtn.innerHTML = '×'; + removeBtn.className = 'gallery-item-remove'; + removeBtn.onclick = function() { removeImage(index); }; + + imageContainer.appendChild(img); + imageContainer.appendChild(removeBtn); + return imageContainer; +} + +function clearAllImages() { + capturedImages.length = 0; + capturedImageSources.clear(); + var imagePreview = document.getElementById('imagePreview'); + var imageGrid = document.getElementById('imageGrid'); + if(imageGrid) imageGrid.innerHTML = ''; + if(imagePreview) imagePreview.style.display = 'none'; +} + +function removeImage(index) { + capturedImages.splice(index, 1); + capturedImageSources.clear(); + capturedImages.forEach(function(dataUrl) { capturedImageSources.add(dataUrl); }); + displayImages(); + console.log('Image removed at index:', index); +} + +function onPhotoError(message) { + var msg = String(message || ''); + if(msg && (msg.toLowerCase().includes('cancel') || + msg.toLowerCase().includes('no image') || + msg === 'Camera cancelled.' || + msg === 'Selection cancelled.')) { + console.log('Image selection cancelled by user'); + return; + } + if(msg) { + alert('Failed to load image: ' + msg); + console.error('Camera error: ' + msg); + } +} diff --git a/sample/js/feature.js b/sample/www/js/feature.js similarity index 97% rename from sample/js/feature.js rename to sample/www/js/feature.js index 81be218..3860342 100644 --- a/sample/js/feature.js +++ b/sample/www/js/feature.js @@ -1,3 +1,5 @@ +/* global takePicture, selectFromGallery */ + // Feature list for different screens const featureData = { 'index.html': [ @@ -180,7 +182,13 @@ const featureData = { ] } ], - + 'gallery.html': [ + { title: 'Gallery', + list: [ + { text: 'Pick from Gallery', action: () => selectFromGallery() } + ] + } + ], 'sessionAnalytics.html': [ { title: 'Session Monitoring', list: [ @@ -258,6 +266,13 @@ const featureData = { }} ] }, + { + title: 'Gallery', + list: [ + { text: 'Camera', action: () => takePicture() }, + { text: 'Gallery', link: 'gallery.html' } + ] + }, { title: 'Manual Masking / Unmasking', list: [ diff --git a/sample/largeScrollableList.html b/sample/www/largeScrollableList.html similarity index 100% rename from sample/largeScrollableList.html rename to sample/www/largeScrollableList.html diff --git a/sample/pushNotifications.html b/sample/www/pushNotifications.html similarity index 100% rename from sample/pushNotifications.html rename to sample/www/pushNotifications.html diff --git a/sample/sessionAnalytics.html b/sample/www/sessionAnalytics.html similarity index 100% rename from sample/sessionAnalytics.html rename to sample/www/sessionAnalytics.html diff --git a/sample/support.html b/sample/www/support.html similarity index 100% rename from sample/support.html rename to sample/www/support.html diff --git a/sample/webView.html b/sample/www/webView.html similarity index 100% rename from sample/webView.html rename to sample/www/webView.html From ba6b35b6b66dd2e8854ac204aaf63d51ed8c92a8 Mon Sep 17 00:00:00 2001 From: Rohan Gupta Date: Wed, 29 Apr 2026 14:53:01 +0000 Subject: [PATCH 2/2] Remove zip files --- devrev-sdk-cordova-2.0.0.tgz | Bin 17645 -> 0 bytes devrev-sdk-cordova-2.1.0.tgz | Bin 17511 -> 0 bytes devrev-sdk-cordova-2.1.1.tgz | Bin 18370 -> 0 bytes devrev-sdk-cordova-2.3.0.tgz | Bin 24762 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 devrev-sdk-cordova-2.0.0.tgz delete mode 100644 devrev-sdk-cordova-2.1.0.tgz delete mode 100644 devrev-sdk-cordova-2.1.1.tgz delete mode 100644 devrev-sdk-cordova-2.3.0.tgz diff --git a/devrev-sdk-cordova-2.0.0.tgz b/devrev-sdk-cordova-2.0.0.tgz deleted file mode 100644 index e35dde5280121f6d381dc7ca93436c6e0548e013..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17645 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

    ^_fMT{XmCrbYM{i+1$6jWRG^WofMp-4 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 diff --git a/devrev-sdk-cordova-2.1.0.tgz b/devrev-sdk-cordova-2.1.0.tgz deleted file mode 100644 index e269ad61fb9b60ea6575528a5651b929e91c7b97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17511 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 CA^ijZ diff --git a/devrev-sdk-cordova-2.1.1.tgz b/devrev-sdk-cordova-2.1.1.tgz deleted file mode 100644 index 7a1dc121724b67e5da7c16e33acc71527506f558..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18370 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